列表推导式----生成器表达式

列表推导式:

  基本形式: [表达式  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)

     

原文地址:https://www.cnblogs.com/guodengjian/p/8708621.html