迭代器與生成器

迭代器

迭代的對象express

可迭代的對象

凡是有_iter_方法的對象,都是可迭代對象app

可迭代對象:python內置str,list.,tuple,dict,set,file函數

可迭代對象

可迭代對象執行__iter__方法獲得返回值,而且可迭代對象會有一個__next__方法。code

s='hello'
iter_s = s._iter_()
while true:
    try:
        print(iter_s__next__())
    except stoplteration:
        break

h
e
l
l
o

迭代器對象:執行可迭代對象__iter__方法,拿到返回值就是迭代器對象。對象

特色:ip

1,內置__next__方法,執行該方法會拿到迭代器對象中的一個值內存

2,內置__iter__方法,執行該方法會拿到迭代器自己generator

3,文件自己就是迭代器本iey身it

缺點:

1,取指麻煩只能一個一個取,值取了就沒了

2,沒法使用len()方法獲取長度

for循環原理

for循環稱爲迭代器循環,in後必須是可迭代對象

由於迭代器使用__iter__後仍是迭代器自己,所以for循環不用考慮in後的對象是可迭代對象仍是迭代器對象。

因爲對可迭代對象使用__iter__方法後變成一個迭代器對象,這個迭代器對象只是佔用了一小塊內存空間,他只有使用__next__後纔會吐出一個一個值。如lis = [1,2,3,4,5,...]至關於一個一個雞蛋,而lis = [1,2,3,4,5,...].__iter__至關於一隻老母雞,若是你須要蛋,只須要__next__便可。

三元表達式與列表推導式

條件成立的返回值if條件else不成立時的返回值

x = 10
y = 20
print(f'x if x>y else y:{x if x>y else y}')
x if x>y else y:20

列表推導式

[expression for item1 in iterable1 if condition1
for item2 in iterable2 if condition2
...
for itemN in iterableN if conditionN
]
相似於
res=[]
for item1 in iterable1:
    if condition1:
        for item2 in iterable2:
            if condition2
                ...
                for itemN in iterableN:
                    if conditionN:
                        res.append(expression)
print(F"[i for i in range(10)]: {[i for i in range(10)]}")
[i for i in range(10)]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(F"[i**2 for i in range(10)]: {[i**2 for i in range(10)]}")
[i**2 for i in range(10)]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

字典生成式

print({i:i**2 for i in range(10)})
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

zip()方法

keys = ['name', 'age', 'gender']
values = ['nick', 19, 'male']

res = zip(keys, values)
print(F"zip(keys,values): {zip(keys,values)}")

info_dict = {k: v for k, v in res}
print(f"info_dict: {info_dict}")
zip(keys,values): <zip object at 0x11074c088>
info_dict: {'name': 'nick', 'age': 19, 'sex': 'male'}

生成器

yield關鍵字

yield的英文單詞意思是生產,在函數中但凡出現yield關鍵字,再調用函數,就不會繼續執行函數體代碼,而是會返回一個值。

def func():
    print(1)
    yield
    print(2)
g = func()
print(g)
<generator object func at 0x10ddb6b48>

總結

yield:

  1. 提供一種自定義迭代器的方式
  2. yield能夠暫停住函數,並提供當前的返回值

yield和return:

  1. 相同點:二者都是在函數內部使用,均可以返回值,而且返回值沒有類型和個數的限制
  2. 不一樣點:return只能返回一次之;yield能夠返回屢次值

生成式表達式與列表推導式

  • 列表推導式[]換成()就是生成器表達式
  • 有點:省內存,一次只產生一個值在內存中
  • 列表推導式至關於給你一筐雞蛋, 生成器表達式至關於給你一隻老母雞
# 列表推導式
with open('52.txt', 'r', encoding='utf8') as f:
    nums = [len(line) for line in f]

print(max(nums))
# 生成器表達式
with open('52.txt','r',encoding='utf8') as f:
    nums = (len(line) for line in f)

print(max(nums)) # ValueError: I/O operation on closed file.
相關文章
相關標籤/搜索