函數進階-03迭代器

迭代器

迭代: 迭代是更新換代,如你爺爺生了你爹,你爹生了你,迭代也能夠說成是重複,而且但每一次的重複都是基於上一次的結果來的。如計算機中的迭代開發,就是基於軟件的上一個版本更新。如下代碼就不是迭代,它只是單純的重複
迭代器:迭代的工具。
其餘解釋-->
迭代是Python最強大的功能之一,是訪問集合元素的一種方式。
迭代器是一個能夠記住遍歷的位置的對象。python

while True:
    print('*'*10)

一丶可迭代對象

python中一切皆對象,如工具

x = 1
name = 'nick'
lis = [1, 2]
tup = (1, 2)
dic = {'name': 'nick'}
s1 = {'a', 'b'}

def func():
    pass

f = open('49w.txt', 'w', encoding='utf-8)

對於這一切的對象中,但凡是有__iter__方法的對象,都是可迭代對象。code

# x = 1.__iter__  # SyntaxError: invalid syntax

# 如下都是可迭代的對象

name = 'nick'.__iter__
lis = [1, 2].__iter__
tup = (1, 2).__iter__
dic = {'name': 'nick'}.__iter__
s1 = {'a', 'b'}.__iter__
f = open('49w.txt', 'w', encoding='utf-8')
f.__iter__
f.close()

總結

可迭代的對象:Python內置str、list、tuple、dict、set、file都是可迭代對象。
特色:
 1.內置有__iter__方法的都叫可迭代的對象。對象


二丶迭代器對象

只有字符串和列表都是依賴索引取值的,而其餘的可迭代對象都是沒法依賴索引取值的。所以咱們得找到一個方法能讓其餘的可迭代對象不依賴索引取值。索引

在找到該方法前,首先咱們給出迭代器對象的概念:可迭代的對象執行__iter__方法獲得的返回值。而且可迭代對象會有一個__next__方法。內存

# 不依賴索引的數據類型迭代取值
dic = {'a': 1, 'b': 2, 'c': 3}
iter_dic = dic.__iter__()
print(iter_dic.__next__())
print(iter_dic.__next__())
print(iter_dic.__next__())
# print(iter_dic.__next__())  # StopIteration:

a b cutf-8

# 依賴索引的數據類型迭代取值
lis = [1, 2, 3]
iter_lis = lis.__iter__()
print(iter_lis.__next__())
print(iter_lis.__next__())
print(iter_lis.__next__())
# print(iter_lis.__next__())  # StopIteration:

1 2 3
上述的方法是很是繁瑣的,咱們可使用while循環精簡下。其中使用的try...except...爲異常處理模塊,之後會詳細講解。開發

s = 'hello'
iter_s = s.__iter__()

while True:
    try:
        print(iter_s.__next__())
    except StopIteration:
        break

h e l l o字符串

總結

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

特色:

 1.內置__next__方法,執行該方法會拿到迭代器對象中的一個值
 2.內置有__iter__方法,執行該方法會拿到迭代器自己
 3.文件自己就是迭代器對象。
缺點:

 1.取值麻煩,只能一個一個取,而且只能日後取,值取了就沒了
 2.沒法使用len()方法獲取長度

三丶for循環原理

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

lis = [1, 2, 3]
for i in lis:
    print(i)

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

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

print(range(10))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Python3中

print(range(10))  # range(0, 10)
相關文章
相關標籤/搜索