迭代器,生成器

可迭代對象和迭代器對象

迭代器指的是迭代取值的工具,迭代是指一個重複的過程,每一次重複都是基於上一次結果而來函數

迭代提供了一種通用的不依賴索引的迭代取值方式工具

一.可迭代對象code

#如下都是可迭代對象
str1 = 'hello tank!'
str1.__iter__()
list1 = [1, 2, 3]  # list([1, 2, 3])
list1.__iter__()
set.__iter__()
dict.__iter__()
tuple.__iter__()
open('a.txt').__iter__()

但凡內置有__iter__方法的對象,都稱爲可迭代對象,可迭代的對象: str ,list,tuple,dict,set,文件對象對象

二.迭代器對象索引

# 不依賴索引的取值方式
# tuple1 = ('tank', 'jason雞哥', 'sean', '餅哥')

# # 獲取迭代器對象: iter_list1
# iter_tuple1 = tuple1.__iter__()
# while True:
#     try:
#         print(iter_tuple1.__next__())  # 報錯
#     # 當即觸發此處代碼 StopIteration
#     except StopIteration:
#         break

1既內置又__next__方法的對象,執行該方法能夠不依賴索引取值內存

2.又內置有__iter__方法的對象,執行迭代器的__iter__方法獲得的依然是迭代器自己it

迭代器對象必定是可迭代對象,可迭代對象不必定是迭代器對象,文件對象自己就是一個迭代器對象io

例如:執行可迭代對象下的__iter__方法,返回一個迭代器對象,在經過迭代器對象的__next__方法取值,若是取值次數超過源值的數量就會報錯for循環

for循環本質爲迭代器循環

工做原理:

1.先調用可迭代對象的__iter__方法,將其變成一個迭代器對象

2.調用next(迭代器),將獲得的返回值賦值給變量名

3.while循環往復直到next(迭代器)拋出異常,for會自動捕捉異常而後結束循環

迭代器優勢:

1.提供了一種通用不依賴索引的迭代取值方式

2.同一時刻在內存中只存在一個值,更節省內存

迭代器缺點:

1.取值不如按照索引的方式靈活,不能取指定的某一個值,只能日後取,不能往前去

2.沒法預測迭代器的長度

生成器

  • 什麼是生成器

生成器就是一種自定義的迭代器,本質爲迭代器

  • 如何實現生成器

但凡函數內包含yield關鍵字,調用函數不會執行函數體代碼,會獲得一個返回值,該返回值就是生成器對象

yield與return

相同點:返回值的個數都是無線的

不一樣點:return只能返回一次只值,

yield每一次都會往生成器對象中添加一個值

yield只能在函數內部定義

yield能夠保存函數的暫停狀態

def func():
    print('1')
    yield 11
    print('2')
    yield 22

res = func()
print(res.__next__())
print(res.__next__())
1
11
2
22

當咱們經過__next__取值時,纔會執行函數體代碼

#range()

python2: range(1,5) ---> [1,2,3,4,5]
python3: range(1,5) ---> range對象 ---> 生成器 --- >迭代器

自定義range()功能,建立一個自定義的生成器
start-->1,end-->5,move=2
def my_range(start,end,nove=1):
    while start < end:
        yield start
        start += move
        
for i in my_range(1,10):
    print(i)
相關文章
相關標籤/搜索