列表推導式----生成器表達式
阿新 • • 發佈:2018-04-03
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)
列表推導式----生成器表達式