列表推导式:
基本形式: [表达式 for 参数 in 可迭代对象] 或者 [表达式 for 参数 in 可迭代对象 if 条件]
实例:
1 l = [] 2 for i in range(100): 3 l.append('egg%s' %i) 4 print i 5 6 #不带if条件 7 l = ['agg%s' %i for i in range(100) ] 8 9 #带if条件 10 l = ['agg%s' %i for i in range(100) if i>10]
生成器表达式
将列表推导式的中括号改为小括号即可
l = ('egg%s' %i for i in range(100) if i>10)
print(next(l))
注意:得到的结果为迭代器
1 # 1、将names=['egon','alex_sb','wupeiqi','yuanhao']中的名字全部变大写 2 # names=['egon','alex_sb','wupeiqi','yuanhao'] 3 # names = [name.upper() for name in names] 4 # print(names) 5 6 7 # 8 # 2、将names=['egon','alex_sb','wupeiqi','yuanhao']中以sb结尾的名字过滤掉,然后保存剩下的名字长度 9 # res=[len(i) for i in names if not i.endswith('sb')] 10 # print(list(res)) 11 # 3、求文件a.txt中最长的行的长度(长度按字符个数算,需要使用max函数) 12 # with open('a.txt','r',encoding='utf-8') as f: 13 # res = max([len(line) for line in f]) 14 # print(res) 15 16 #如果数据量过大,使用生成器表达式更为恰当 17 # with open('a.txt', 'r', encoding='utf-8') as f: 18 # res = max(len(line) for line in f) #生成器表达式的小括号与max的小括号可以和为一个 19 # print(res) 20 21 # 4、求文件a.txt中总共包含的字符个数?思考为何在第一次之后的n次sum求和得到的结果为0?(需要使用sum函数) 22 # with open('a.txt','r',encoding='utf-8') as f: 23 # res = sum(len(line) for line in f) 24 # print(res) 25 # 第一次求和之后,文件光标已经移到末尾,再次求和没有内容可以循环出来
with open('a.txt') as f: g=(len(line) for line in f) print(sum(g)) #为何报错? #g是一个生成器对象,不知直接求和,必须取值之后才能求和
6、文件shopping.txt内容如下
mac,20000,3 lenovo,3000,10 tesla,1000000,10 chicken,200,1
求总共花了多少钱?
打印出所有商品的信息,格式为[{'name':'xxx','price':333,'count':3},...]
求单价大于10000的商品信息,格式同上
# with open('a.txt','r',encoding='utf-8') as f: # info = [line.split(',') for line in f] # cost=sum(int(price) * int(count) for *_,price,count in info) # print(cost) # with open('a.txt','r',encoding='utf-8') as f: # info=[{'name':line.split(',')[0], # 'price':int(line.split(',')[1]), # 'count':int(line.split(',')[2])} # for line in f] # print(info) # with open('a.txt',encoding='utf-8') as f: # info=[{ # 'name': line.split()[0], # 'price': float(line.split()[1]), # 'count': int(line.split()[2]), # } for line in f if float(line.split()[1]) > 10000] # print(info)