1. 列表推导式
列表推导式是一种简洁地构建列表的方法。它的一般形式是:
[表达式 for 变量 in 可迭代对象 if 条件]
python
**练习题:**
给定一个数字10列表,生成一个新列表,其中包含所有大于5的数字。
dict1 = [x for x in range(10) if x > 5]
print(dict1)
2. 字典推导式
字典推导式用于创建字典,其基本形式是:
{键: 值 for 变量 in 可迭代对象 if 条件}
python
**练习题:**
给定一个数字列表,生成一个新字典,其中包含每个数字及其平方。
dict1 = {x: x * x for x in range(5)}
print(dict1)
3.混合数据类型练习
python
print(
"""1、 card_type = ["♣", "♦", "♥", "♠"] 生成一副扑克牌52张,要求把52张牌放到一个集合输出,同时加一个元组输出(("红桃A","♥A"),(...))")""")
card_type = ["♣", "♦", "♥", "♠"]
tuple1 = []
for i in card_type:
for x in ("A", 2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K"):
tuple2 = []
if i == "♣":
tuple2.append(f"梅花{x},{i}{x}")
elif i == "♦":
tuple2.append(f"方块{x},{i}{x}")
elif i == "♥":
tuple2.append(f"红桃{x},{i}{x}")
else:
tuple2.append(f"黑桃{x},{i}{x}")
tuple1.append(tuple(tuple2))
print(tuple1)
print("""2、假设我们有两个长度相同的列表,分别为fruits和prices , 两个列表中的元素分别如下:
fruits = ["apple", "orange", "pear"]
prices = [4,5,6]
我们希望用代码实现列表生成式用以对上述两个列表进行合并,即列表中的元素为 (fruit, price) 形式。即样例的输出如下:
[("apple",4), ("orange",5), ("pear",6)]""")
fruits = ["apple", "orange", "pear"]
prices = [4, 5, 6]
pri = [(x, y) for x, y in zip(fruits, prices)]
print(pri)
print("""3、将第2题的两个列表转化成字典形式输出{'apple':4,'orange':5,'pear':6},不少于2种做法""")
print("方法1:")
pri = dict(pri)
print(pri)
print("方法2:")
pri2 = {}
for i in fruits:
n = fruits.index(i)
pri2[i] = prices[n]
print(pri2)
print("""4、用一行Python代码从给定列表中取出所有的奇数和偶数,如这个列表""")
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
o, j = [x for x in a if x % 2 == 1], [y for y in a if y % 2 != 1]
print("奇数", o)
print("偶数", j)
print("""5、用Python编写程序检查一序列中所有数字是否唯一,比如让用户输入一个序列,以空格分隔每个数字,然后检测数字是否唯一
""")
li = list(input().split(" "))
print(li)
if len(li) == len(set(li)):
print("没有重复")
else:
print("重复")
print("""6、编写一个程序来组合两个不同的词典。组合时,如果找到相同的键,则可以将这些相同键的值相加, 输出新字典。""")
d1 = {'key1': 50, 'key2': 100, 'key3': 200}
d2 = {'key1': 200, 'key2': 100, 'key4': 300}
d3 = {}
for i in d1.keys():
if i in d2.keys():
d3[i] = d1[i] + d2[i]
else:
d3[i] = d1[i]
for i in d2.keys():
if i not in d1.keys():
d3[i] = d2[i]
print(d3)
print("7、一行代码展开列表,比如list1 = [[1,2],[3,4],[5,6]]转成[1,2,3,4,5,6]")
list1 = [[1, 2], [3, 4], [5, 6]]
li1 = [y for x in list1 for y in x]
print(li1)
print("8、统计字符串中大写字母的数量str2 = 'werrQWSDdiWuW'")
str2 = 'werrQWSDdiWuW'
count = 0
for i in str2:
if i.isupper():
count += 1
print(count)
print("""9、统计字符串中每个字符出现次数,并输出一个字典,如这样str1 = "nihsasehndciswemeotpxc"的字符串
""")
str1 = "nihsasehndciswemeotpxc"
dc = {}
for i in str1:
num = str1.count(i)
dc[i] = num
dc = dict(dc)
print(dc)
print("""10、现有一堆快递地址信息,需对其进行按省分拣,以方便后续投递""")
dc1 = [
['王*龙', '北京市海淀区苏州街大恒科技大厦南座4层'],
['庞*飞', '北京市昌平区汇德商厦四楼403'],
['顾*锐', '江苏省扬州市三垛镇工业集中区扬州市立华畜禽有限公司'],
['王*飞', '上海市徐汇区上海市徐汇区H88越虹广场B座5E'],
['华*升', '北京市海淀区杰睿大厦'],
['朱*锴', '上海市浦东新区川沙新镇华川家园33号楼503'],
]
dc2 = {}
dc3 = []
for i in dc1:
address = i[1][:3]
if address not in dc2:
dc2[address] = []
dc2[address].append(i)
print(dc2)
4.文件操作
在 Python 中,文件操作是一项基本而重要的任务,允许你读取、写入、修改和删除文件。Python 提供了一套简单的函数和方法来处理文件,这些操作通常包括以下几个步骤:
-
打开文件 :使用
open()
函数打开一个文件,可以指定不同的模式,如只读 ('r'
)、写入 ('w'
)、追加 ('a'
) 等。 -
读取文件:可以逐行读取,也可以一次性读取整个文件的内容。
-
写入文件:可以将字符串写入文件,写入模式下如果文件存在则覆盖原有内容,追加模式下则在文件末尾添加内容。
-
关闭文件 :使用文件对象的
close()
方法关闭文件,释放系统资源。 -
文件指针:文件打开时,都有一个指针指向文件的开头。读取或写入文件时,指针会移动。
-
文件缓冲 :Python 对文件写入操作通常有缓冲,可以通过
flush()
方法立即将缓冲区内容写入文件。 -
二进制文件:可以以二进制模式打开文件,这样可以读取或写入非文本文件,如图片、视频等。
-
文件编码 :在处理文本文件时,可以指定编码方式,如
'utf-8'
,确保正确读取和写入字符。 -
错误处理 :使用
try...except
语句来捕获和处理文件操作中可能出现的错误。 -
文件迭代:可以迭代文件对象,Python 会自动逐行读取。、、
open的使用:
"""
open(file, mode='r', buffering=-1, encoding=None)
file: 必需,文件路径(相对或者绝对路径)。 例如: F:\new\code .但是这样输入路径肯能会发生转义,\n会换行,为了避免我们有两种方法。
1. 用\\代替\ : "F:\\new\\code"
2.在最前面加上 r ,表示原生路径,改为 r"F:\new\code"
mode: 可选,文件打开模式
1. r 表示只读,如果不存在会报错,指向文件开头
2. w 表示先清空再写入,如果不存在就创建,指向文件开头
3. b 表示二进制形式
5. t 表示文本形式打开
6. a表示追加,指向文件结尾
buffering: 设置缓冲
encoding: 一般使用utf8
"""
4.1 读文件
4.1.1 读文本文件
python
file = open(r"info.txt",mode='rt',encoding='utf-8') # 打开文件
data = file.read() # 读取文件赋值给data
print(data) # 打印内容
file.close()
写入文本文件
python
file = open(r"info1.txt",mode='wt',encoding='utf-8')
file.writelines("你好!\t\t世界!")
file.close()
4.1.2读取二进制文件
python
file = open(r"info.txt",mode='rb')
data = file.read()
print(data)
file.close()
写入二进制文件
python
file = open(r"dc.jpg",mode='rb')
data = file.read()
file.close()
file = open(r"dc_copy.jpg",mode="wb")
file.write(data)
file.close()
4.2基础案例
python
# 多用户注册
file = open(r"info2.txt",mode='wt',encoding='utf-8')
while True:
n = input("按Q/q退出")
if n.lower() == "q":
break
name = input("请输入用户名: ")
pwd = input("请输入密码:")
file.write("\n{}-{}".format(name,pwd))
file.close()
# # 下载网上图片
import requests
res = requests.get(
url= "https://huaban.com/pins/5489840188?modalImg=https%3A%2F%2Fgd-hbimg.huaban.com%2F08d47b524dee3591eb429ea93684b39d7d31701a4bf5c-QyirlJ" ,
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
}
)
res.content
file = open(r"dc3.jpg", mode="wb")
file.write(data)
file.close()
r+案例: 先读再后面写没有问题,因为读之后光标会移动。如果先写,需要转移光标位置。
w+同理
nfo_r+.txt ---> 你好啊世界!
python
file = open(r"info_r+.txt",mode='rt+',encoding='utf-8')
data = file.read()
file.write("你好,dc")
file.close()
# 结果: 你好啊世界!你好,dc
file = open(r"info_r+.txt",mode='rt+',encoding='gbk')
file.write("你好,dc")
data = file.read()
print(data)
file.close()
# 结果: 界!
原因就是打开时,光标再开头,所以再开头就开始了替换,可以加入光标进行改进恢复
4.3 光标
在a模式下没用,a模式下光标永远在结尾
移动光标
file.seek(0) # 将光标移到指定字节位置,0代表开始,utf-8编码一个汉字占3个字节
file.seek(3) # 将光标移动到第3个字节位置
# 获取光标位置
pos = file.tell()
4.4 flush
从缓冲区刷到硬盘,一般用在循环写入
file.flush()
# 4.5 with上下文管理用法,会自动close
python
# 打开单个文件
with open(r"xxxx",mode="XX",encoding="xxx") as alias:
# pass
# # 打开多个文件
with open(r"xxxx",mode="XX",encoding="xxx") as f1 , open(r"xxxx",mode="XX",encoding="xxx") as f2:
pass
# 4.6 读操作
# 读所有readlines()
python
file = open(r"info1.txt",mode='rt',encoding='utf-8')
a = file.readlines()
print(a)
file.close()
# 按行读取readline(),如果再print打印出来的话,会出现多个空行,是因为每行后面都有换行符,然后print里面也有一个换行符
python
file = open(r"info1.txt",mode='rt',encoding='utf-8')
a = file.readline()
print(a,end="")
a = file.readline()
print(a.strip())
file.close()
4.7 写操作
python
# write()可以再里面添加转移字符
file = open(r"info1.txt",mode='wt',encoding='utf-8')
a = file.write("nh\ndad")
file.close()
4.8 练习
4.8.1. 下载视频
python
import requests
res = requests.get(
url="视频网站",
headers={
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
}
)
res.content
with open("text.mp4",mode="wb") as f1:
f1.write(res.content)
4.8.2
计算nginx的uv(统计指定用户的访问量access.log文件)
access.log
python
192.168.1.10 - - [10/Oct/2024:12:00:00 +0000] "GET /index.html HTTP/1.1" 200 1546 "http://www.example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
192.168.1.11 - - [10/Oct/2024:12:01:23 +0000] "POST /submit_form HTTP/1.1" 303 0 "http://www.example.com/form" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15"
192.168.1.12 - - [10/Oct/2024:12:02:45 +0000] "GET /images/logo.png HTTP/1.1" 404 0 "http://www.example.com/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0"
192.168.1.10 - - [10/Oct/2024:12:04:10 +0000] "GET /about.html HTTP/2.0" 200 231 "http://www.example.com/" "Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/34.0 Mobile/15E148 Safari/605.1.15"
192.168.1.11 - - [10/Oct/2024:12:05:32 +0000] "PUT /update_profile HTTP/1.1" 403 178 "http://www.example.com/profile" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0"
192.168.1.15 - - [10/Oct/2024:12:06:54 +0000] "DELETE /api/resource HTTP/1.1" 204 0 "http://www.example.com/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36"
192.168.1.11 - - [10/Oct/2024:12:08:16 +0000] "GET /contact.html HTTP/1.1" 200 1300 "http://www.example.com/" "Mozilla/5.0 (iPad; CPU OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/88.0.4324.124 Mobile/15E148 Safari/604.1"
192.168.1.10 - - [10/Oct/2024:12:09:38 +0000] "GET /js/app.js HTTP/1.1" 200 8204 "http://www.example.com/" "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36 Edge/88.0.710.61"
192.168.1.12 - - [10/Oct/2024:12:11:00 +0000] "GET /favicon.ico HTTP/1.1" 200 52 "http://www.example.com/" "Mozilla/5.0 (X11; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0"
192.168.1.11 - - [10/Oct/2024:12:12:22 +0000] "GET /robots.txt HTTP/1.1" 404 0 "http://www.example.com/" "Googlebot-Image/1.0"
python
ip = "192.168.1.11" # 指定统计192.168.1.11的访问次数
totol = 0 # 统计次数初始为0
with open("access.log", mode="rt", encoding="utf-8") as fa:
for i in fa:
if ip in i:
totol += 1
print(ip,totol) # 192.168.1.11 4
4.8.3 计算nginx的pv(统计所有用户的访问量access.log文件)
python
num = {}
with open("access.log", mode="rt", encoding="utf-8") as fa1:
for i in fa1:
if i.split()[0] not in num:
num[i.split()[0]] = 1
else:
num[i.split()[0]] += 1
print(num)
4.8.4 筛选出股票 当前价大于 20 的所有股票数据
python
股票代码,股票名称,当前价,涨跌额,涨跌幅,年初至今,成交量,成交额,换手率,市盈率(TTM),股息率,市值
SH601778,N晶科,6.29,+1.92,+43.94%,+43.94%,259.66万,1625.52万,0.44%,22.32,-,173.95亿
SH688566,吉贝尔,52.66,+6.96,+15.23%,+122.29%,1626.58万,8.09亿,42.29%,89.34,-,98.44亿
SH688268,华特气体,88.80,+11.72,+15.20%,+102.51%,622.60万,5.13亿,22.87%,150.47,-,106.56亿
SH600734,实达集团,2.60,+0.24,+10.17%,-61.71%,1340.27万,3391.14万,2.58%,亏损,0.00%,16.18亿
SH900957,凌云B股,0.36,+0.033,+10.09%,-35.25%,119.15万,42.10万,0.65%,44.65,0.00%,1.26亿
SZ000584,哈工智能,6.01,+0.55,+10.07%,-4.15%,2610.86万,1.53亿,4.36%,199.33,0.26%,36.86亿
SH600599,熊猫金控,6.78,+0.62,+10.06%,-35.55%,599.64万,3900.23万,3.61%,亏损,0.00%,11.25亿
SH600520,文一科技,8.21,+0.75,+10.05%,-24.05%,552.34万,4464.69万,3.49%,亏损,0.00%,13.01亿
SH603682,锦和商业,11.73,+1.07,+10.04%,+48.29%,2746.63万,3.15亿,29.06%,29.62,-,55.42亿
SZ300831,派瑞股份,12.27,+1.12,+10.04%,+208.29%,25.38万,311.41万,0.32%,60.59,-,39.26亿
with open(r"above_20.txt",mode="r",encoding="utf-8") as ab:
ab.readline() # 跳过第一行字段
for i in ab:
a = i.split(",")[2]
if float(a) >= 20:
print(i)
4.8.5 .根据要求修改文件的内容,请将文件中的 nebula1 修改为 nebula_tech
python
#replace方法
with open(r"edit",mode="r+",encoding='utf-8') as fa:
content = fa.read()
a = content.replace("nebula1","nebula_tech")
fa.write(a)
fa.seek(0)
print(content)
#打开两个文件,一个读一个写,然后用shutil的move方法改名字
with open(r"edit",mode="r",encoding='utf-8') as fa, open(r"edit_1",mode="w",encoding="utf-8") as fa2:
for i in fa:
new_line = i.replace("nebula1","nebula_tech")
fa2.write(new_line)
import shutil
shutil.move("edit_1","edit") # 将edit_1改名为edit,如果文件存在则覆盖