Python列表解析
l = ["egg%s" %i for i in range(100) if i > 50]print(l)
l= [1,2,3,4]s = 'hello'l1 = [(num,s1) for num in l for s1 in s]print(l1)
l1 =[]for num in l: for s1 in s: t = (num,s1) l1.append(t)print(l1)
import osg = os.walk('D:\\test')l1 = [for i in g for j in i]file_path =[]for i in g: for j in i[-1]: file_path.append('%s\\%s' % (i[0],j))print(file_path)
l1 = ['%s\\%s' % (i[0],j) for i in g for j in i[-1]]print(l1)
Python生成器表达式
用列表解析,生成的是列表,但是如果用列表会把整个列表全部读取到内存中,如果列表过大,内存会爆。
生成器表达式是把[]换成(),这就是生成器的形式,每次只读入内存一个值。
l1 = ('egg%s'%i for i in range(10))print(l1) # 此时是生成器print(next(l1)) #生成器通过next执行一次
结果:
generator object at 0x000000000282C048用for进行迭代
for i in l1: print(i)
模拟读取一个大文件:
这是for循环的方式:
l = []f = open("a")for line in f: line = line.strip() l.append(line)print(l)
列表解析:
l = [line.strip() for line in f] # line.strip()这就是直接 添加到了l列表中print(l)
用列表的方式占用内存太大:
生成器表达式:
g = (l.append(line.strip()) for line in f ) # 直接换成()就是生成器的方式for i in g: print(i)
练习 1
sum list中的都是可迭代对象
money_list=[]with open("b.txt") as f: for line in f: # goods = line.strip() goods=line.split() # 对文件的内容进行分割 res = float(goods[-1])*float(goods[-2]) money_list.append(res)print(money_list)
用sum求和的方式
f = open("b.txt")g =(float(line.split()[-1])*float(line.split()[-2]) for line in f) #生成器print(sum(g)) # sum中的是可迭代对象
练习2
从文件中读取的是字符串,想要进行处理必须是有格式的数据
res = []with open("b.txt") as f: for line in f: l=line.split() d = {} d["name"] = l[0] d["price"] = l[1] d["count"] = l[2] res.append(d)print(res)
用声明式的编程
文件是迭代器,res此时也是,但是res来自于文件,所以在with中操作,文件关闭后res不能得到,放外面会报错,IO错误
with open("b.txt") as f: # 文件是迭代器 res =(line.split() for line in f) # 此时res是生成器 # print(res) dict=({"name":i[0],"price":i[1],"count":i[2]} for i in res) for j in dict: print(j)
结果:
{'name': 'apple', 'price': '10', 'count': '3'} {'name': 'tesla', 'price': '1000000', 'count': '1'} {'name': 'mac', 'price': '3000', 'count': '2'} {'name': 'lenovo', 'price': '30000', 'count': '3'} {'name': 'chicken', 'price': '10', 'count': '3'}对文件中的进行过滤
with open("b.txt") as f: # 文件是迭代器 res =(line.split() for line in f) # 此时res是生成器 # print(res) dict_g=({"name":i[0],"price":i[1],"count":i[2]} for i in res if float(i[1])>10000) print(dict_g) # for i in dict_g: # print(i) print(list(dict_g)) # 这是一种查看的额方式
结果:
{'name': 'tesla', 'price': '1000000', 'count': '1'} {'name': 'lenovo', 'price': '30000', 'count': '3'} 或者 [{'name': 'tesla', 'price': '1000000', 'count': '1'}, {'name': 'lenovo', 'price': '30000', 'count': '3'}]