11-Python3從入門到實戰—基礎之生成器和迭代器

Python從入門到實戰系列——目錄

切片

Python提供切片(Slice)操做符用來獲取列表、元組等數據中的部分元素;如,讀取列表python

list[m:n]:表示獲取m-n區間的元素
list[m:n:o]:表示以條件o獲取m-n之間的元素git

num = list(range(100))  # 建立0-99的列表num
  • 獲取num中前三個元素
>>> num[0:3]
['0', '1', '2']
>>> num[:3]    # 索引從0開始時,0能夠省略
['0', '1', '2']
  • 獲取num中後三個元素
>>> num[-3:]
['97', '98', '99']]
  • 每隔10個數獲取全部元素
>>> num[::5]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
  • 複製一個列表
>>> num[:]
[0, 1, 2, 3, 4, 5, 6...98,97]

迭代

Python 中經過for循環來遍歷list或tuple,這種遍歷稱爲迭代(Iteration);github

  • 迭代的使用
>>> user={'0':'張三','1':'李四','2':'王五','3':'趙六',}
>>> for key in user:
...     print(key)
>>> print('---------分割線-----------')
>>> for value in user.values():
...     print(value)

輸出結果:app

0
1
2
3
---------分割線-----------
張三
李四
王五
趙六函數

  • 判斷對象是否可迭代
>>> user={'0':'張三','1':'李四','2':'王五','3':'趙六',}
>>> print(isinstance(1,Iterable))
>>> print(isinstance(user,Iterable))

輸出結果:code

False
True對象

  • 遍歷輸出對象的下標和值
>>> user={'0':'張三','1':'李四','2':'王五','3':'趙六',}
>>> for key,value in enumerate(user.values()):
...     print(key,value)

輸出結果:索引

0 張三
1 李四
2 王五
3 趙六內存

迭代器

迭代器是一個能夠記住遍歷的位置的對象;迭代器對象從集合的第一個元素開始訪問,直到全部的元素被訪問完結束;迭代器只能往前不會後退;get

迭代器有兩個基本的方法:建立迭代器對象的 iter() 和 輸出迭代器對象的下一元素的 next();

  • 基本使用
>>> nums = [1,2,3,4]
>>> num = iter(nums)
>>> print(next(num))
>>> print(next(num))
>>> print(next(num))

輸出

1
2
3

  • 迭代器結合 for 循環使用
>>> nums = [1,2,3,4]
>>> num = iter(nums)
>>> for n in num:
...     print(n)

輸出結果:

1
2
3
4

  • 迭代器結合 while 循環使用
>>> while True:
...     try:
...         print(next(num))
...     except StopIteration:
...         print("迭代完畢")
...         sys.exit()

輸出:

1
2
3
4
迭代完畢

列表生成式

  • 生成列表的方法
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 原始生成[11,22,...,10*10]方法
>>> for x in range(1,11):
...     l.append(x*x)
...
>>> l
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>>
  • 使用Python內置強大的生成[11,22,...,10*10]列表的方法
>>> [x * x for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>>
  • 生成[11,22,...,10*10]元素爲偶數的列表
>>> [x * x for x in range(1,11) if x % 2 ==0]
[4, 16, 36, 64, 100]
  • 雙重循環生成列表
>>> [x + y for x in 'ABC' for y in 'abc']
['Aa', 'Ab', 'Ac', 'Ba', 'Bb', 'Bc', 'Ca', 'Cb', 'Cc']
  • 使用兩個變量生成列表
>>> str = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [key + '=' + value for key, value in str.items()]
['x=A', 'y=B', 'z=C']

生成器

經過列表生成式能夠生成一個列表,可是列表受內存限制,容量是有限的,而且,若是建立一個包含幾百萬元素的列表,而只須要使用其中元素時便形成了空間浪費;
這時候就應該使用生成器(generator);生成器表達式能作的事情列表解析基本都能處理,只不過在須要處理的序列比較大時,列表解析比較費內存。

  • 建立一個生成器
>>> gen = (x * x for x in range(10))
>>> gen
<generator object <genexpr> at 0x0000000002742E08>
>>>
  • 讀取生成器中的元素
>>> for x in gen:
...     print(x)
...
0
1
4
9
16
25
36
49
64
81
>>>

生成器函數

生成器函數:在函數中若是出現了yield關鍵字,那麼該函數就再也不是普通函數,而是生成器函數;

  • 使用函數實現斐波拉契數列
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b)
        a, b = b, a + b
        n = n + 1
    return 'done'
>>> fib(6)
1
1
2
3
5
8
'done'
  • 使用生成器函數實現斐波拉契數列
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'
>>> for n in fib(6):
...     print(n)
...
1
1
2
3
5
8
  • generator和函數的執行流程不同。函數是順序執行,遇到return語句或者最後一行函數語句就返回。而變成generator的函數,在每次調用next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。
相關文章
相關標籤/搜索