迭代器和生成器

1、什麼是迭代器app

迭代指的是一個重複的過程,每一次重複都是基於上一次的結果而來的ide

# 這裏的循環也是一個迭代,每次基於上一次的結果而取值
li = 'hello' i = 0 while i < len(li): print(li[i]) i += 1

迭代器指的是迭代取值的工具,該工具的特色是能夠不依賴於索引取值函數

2、爲什麼要用迭代器工具

  爲了找出一種通用的、能夠不依賴於索引的迭代取值方式spa

3、如何使用迭代器code

可迭代的對象:但凡內置有 __iter__ 方法的對象都稱之爲可迭代的對象對象

  如:str、list、tuple、dict、set、文件對象blog

迭代器對象:既內置有 __iter__方法,又內置有 __next__ 方法索引

  如:文件對象it

關於 __iter__ 方法:

  調用可迭代對象的 __iter__ 會的到一個迭代器對象

  調用迭代器對象的 __iter__ 會的到迭代器自己

可迭代對象能夠轉化爲迭代器對象:調用可迭代對象內置的 __iter__ 方法會有一個返回值,該返回值就是對應的迭代器對象

dic = {'x':1, 'y':2, 'z':3} iter_dic = dic.__iter__() print(iter_dic) res1 = iter_dic.__next__() print(res1) res2 = iter_dic.__next__() print(res2) res3 = iter_dic.__next__() print(res3) # 每次取一個值, 取完了沒有就會報錯
res4 = iter_dic.__next__() print(res4)
使用迭代器
dic = {'x':1, 'y':2, 'z':3} # 注意:這樣每次只會取到x,由於每次取值都是從dic去取,不是基於上一次的結果
print(dic.__iter__().__next__()) print(dic.__iter__().__next__()) print(dic.__iter__().__next__())
注意

4、for循環的本質

for循環的本質就是一個迭代器,原理以下:

  一、先調用for語句中in後面的值的 __iter__ 方法,獲得迭代器對象

  二、執行迭代器 __next__ 方法獲得一個返回值,而後賦值給一個變量,運行循環體代碼

  三、循環往復,直到迭代器取值完畢拋出異常,而後捕捉異常自動結束循環

 5、生成器

常規定義函數,可是,使用yield語句而不是return語句返回結果。yield語句執行一次返回一個結果

yield關鍵字:只能用在函數內

在函數內但凡包含有yield關鍵字,再去執行函數,就不會馬上運行函數體代碼,會獲得一個返回值,該返回值成之爲生成器對象,生成器本質就是迭代器

總結 yield:

  一、提供一種自定義迭代器的解決方案

  二、yield可用於返回值,和return相比,相同點是均可以用於返回值,不一樣點是yield能夠暫停函數,能夠返回屢次值,而return只能返回值一次值函數就馬上終止

def func():  # 這是一個簡單的函數
    a = 1
    return a print(func()) def func(): print('aaaaaaaaaaa') a = 1
    yield a  # 返回第一個值
    print('bbbbbb') yield 12  # 返回第二個值
 ret = func()        # 得拿到一個生成器 # print(ret) # 返回的是一個地址
print(next(ret))    # 取第一個值
print(next(ret))    # 取第二個值
print(next(ret))    # 取第三個值,會報錯,由於沒有yield第三個值
初始生成器

 

練習:寫一個功能,在Python3中實現Python2使用range函數的效果

Python2中使用 range 會將結果打印出來,Python3則不會

def my_range(start, stop, step=1): while start < stop: yield start start += step res = my_range(1, 5, 2)  # 1 3
 next(res) next(res)
View Code

 

補充:

三元表達式:將簡單的 if--else 語句用一條語句完成

x = 10 y = 20
if x > y: res = x else: res = y print(res) # ========================================================================================
 x = 10 y = 20 res = x if x > y else y print(res)
三元表達式

列表生成式

names = ['qiu', 'xi', 'qiuxi', 'zhi', 'fei'] l = [] for name in names: if name != 'qiu': res = '%s_1024' %name l.append(res) print(l) # ========================================================================================
 l = ['%s_1024' %name for name in names if name != 'qiuxi'] print(l)
列表生成式

字典生成式

items = [('name', 'qiuxi'), ('age', 22), ('sex', 'male')] dic = {} for k, v in items: dic[k] = v print(dic) # ========================================================================================
 res = {k: v for k, v in items if k != 'sex'} print(res)
字典生成式

生成器表達式

res=(i**2 for i in range(3)) print(res) print(next(res)) print(next(res)) print(next(res)) print(next(res))
生成器表達式
相關文章
相關標籤/搜索