字面意思分析:能夠重複的迭代的實實在在的東西。python
list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定)app
專業角度: 內部含有'__iter__'
方法的對象,就是可迭代對象。函數
內置函數:dir() print(dir(str))工具
判斷一個對象是不是可迭代對象: print('iter' in dir(str))code
優勢:對象
缺點:索引
字面意思:能夠重複迭代的工具。內存
專業角度: 內部含有'__iter__'
而且含有"__next__"
方法的對象,就是迭代器字符串
可迭代對象轉化成迭代器:generator
l1 = [1, 2, 3, 4, 5] # 內置函數iter() obj = iter(l1)
# 迭代器能夠迭代取值。利用next()進行取值 l1 = [1, 2, 3, 4, 5] # 內置函數iter() obj = iter(l1) # print(obj) print(next(obj)) print(next(obj)) print(next(obj)) print(next(obj)) print(next(obj)) print(next(obj))
迭代器優勢:
迭代器缺點:
特性:
l1 = [22, 33, 44, 55, 66, 77] obj = iter(l1) for i in range(3): print(next(obj)) for i in range(2): print(next(obj))
利用while循環,模擬for循環內部循環可迭代對象的機制。
先要將可迭代對象轉化成迭代器。
利用next對迭代器進行取值。
利用異常處理try一下防止報錯。
可迭代對象與迭代器的對比
可迭代對象:可迭代對象是一個操做比較靈活,直觀,效率相對高,可是比較佔用內存的數據集。
迭代器:迭代器是一個很是節省內存,知足惰性機制,可是效率相對低,操做不靈活的數據集。
生成器函數。
以前接觸的函數:
# def func(): # print(111) # return 2 # ret = func() # print(ret) # 執行此函數,遇到return結束函數。 # 將數字2返回給ret。
生成器函數: 只要函數中出現了yield那麼他就不是函數,它是生成器函數
def func(): # print(111) # print(111) # print(111) # print(111) # print(111) # print(111) yield 2,4,5 yield 3 yield 4 yield 5 ret = func() # 生成器對象 # print(ret) # <generator object func at 0x0000000001E10F68> ''' # 類比 l1 = [2,] [2,3,4,5] obj = iter(l1) ''' # 只要函數中出現了yield那麼他就不是函數,它是生成器函數。 # 一個next對應一個yield. # print(next(ret)) # print(next(ret)) # print(next(ret)) # print(next(ret)) # print(next(ret)) # print(next(ret))
# return 結束函數,給函數的執行者返回值(多個值經過元組的形式返回)。 # yield 不結束函數,對應着給next返回值(多個值經過元組的形式返回)。
send(瞭解)
pass
生成器的舉例
# def eat_baozi(): # list1 = [] # for i in range(1,2001): # list1.append(f'{i}號包子') # return list1 # # print(eat_baozi()) def eat_baozi_gen(): for i in range(1,2001): # print(11) yield f'{i}號包子' ''' # ret1 = eat_baozi_gen() # ret2 = eat_baozi_gen() # # print(ret1) # # print(ret2) # print(next(ret1)) # print(next(ret1)) # print(next(ret1)) # # print(next(ret2)) # print(next(ret2)) # print(next(ret2)) # print(next(ret)) # print(next(ret)) ''' # ret = eat_baozi_gen() # # for i in range(200): # print(next(ret)) # # for i in range(200): # print(next(ret))
# yield from # def func(): # l1 = [1, 2, 3] # yield l1 # ret = func() # print(next(ret)) # print(next(ret)) # print(next(ret)) # def func(): # l1 = [1, 2, 3] # yield from l1 # # ''' # yield 1 # yield 2 # yield 3 # ''' # ret = func() # print(next(ret)) # print(next(ret)) # print(next(ret)) # yield : 對應next給next返回值 # yield from 將一個可迭代對象的每個元素返回給next # yield from 節省代碼,提高效率(代替了for循環)
# l1 = [1,2,3......100] # l1 = [] # for i in range(1,101): # l1.append(i) # print(l1) # 列表推導式 l1 = [i for i in range(1, 101)] # print(l1)
兩種構建方式:
1.循環模式: [變量(加工後的變量) for 變量 in iterable]
2.篩選模式: [變量(加工後的變量) for 變量 in iterable if 條件]
循環模式:
# 循環模式: # 將10之內全部整數的平方寫入列表。 # print([i**2 for i in range(1, 11)]) # 100之內全部的偶數寫入列表. # print([i for i in range(2, 101, 2)]) # 從python1期到python100期寫入列表list # print([f'python{i}期' for i in range(1, 101)])
篩選模式:
# print([i for i in range(1, 101) if i > 49]) # 三十之內能夠被三整除的數。 # print([i for i in range(1, 31) if i % 3 == 0]) # 過濾掉長度小於3的字符串列表,並將剩下的轉換成大寫字母 # l1 = ['barry', 'fdsaf', 'alex', 'sb', 'ab'] # print([i.upper() for i in l1 if len(i) > 3]) # 找到嵌套列表中名字含有兩個‘e’的全部名字(有難度) names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] # l1 = [] # for i in names: # for j in i: # if j.count('e') > 1: # l1.append(j) # print(l1) print([j for i in names for j in i if j.count('e') > 1])
列表推導式的優缺點:
# 列表推導式的優缺點: # 優勢: # 1, 簡單,快捷,裝b。 # 缺點: # 2. 可讀性不高,很差排錯。 # 慎用,不要入迷。
與列表推導式幾乎如出一轍。
循環模式,篩選模式。
# obj = (i for i in range(1, 11)) # # print(obj) # # print(next(obj)) # # print(next(obj)) # # print(next(obj)) # # print(next(obj)) # # print(next(obj)) # # print(next(obj)) # # print(next(obj)) # # print(next(obj)) # # print(next(obj)) # # print(next(obj)) # # print(next(obj))
# # 1. next(obj) # # 2. for 循環 # # for i in obj: # # print(i) # # 3. 數據轉化 # print(list(obj)) # 生成器表達式:生成器 節省內存。
# 字典推導式,集合推導式: 兩種模式: 循環模式,篩選模式 l1 = ['小潘', '懟懟哥','西門大官人', '小澤ml亞'] # {0: '小潘', 1: '懟懟哥', 2: '西門大官人'} # dic = {} # for index in range(len(l1)): # dic[index] = l1[index] # print(dic) # print({i:l1[i] for i in range(len(l1))}) # 1~100 # print({i for i in range(1, 101)})