1. 程式人生 > >列表推導式----生成器表達式

列表推導式----生成器表達式

odin 使用 結果 with open append split() spl eno enc

列表推導式:

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

    

列表推導式----生成器表達式