天天看點

【Python入門】28.常用内置子產品之 操作疊代對象itertools常用内置子產品itertools

摘要:itertools子產品介紹;常用的操作疊代對象函數:count(),cycle(),repeat(),takewhile(),chain(),groupby();計算圓周率

寫在前面:為了更好的學習python,部落客記錄下自己的學習路程。本學習筆記基于廖雪峰的Python教程,如有侵權,請告知删除。歡迎與部落客一起學習Pythonヽ( ̄▽ ̄)ノ

目錄

  • 常用内置子產品
  • itertools
    • count( )
    • cycle( )
    • repeat( )
    • takewhile()
    • chain( )
    • groupby( )
    • 【練習】計算圓周率pi

常用内置子產品

itertools

itertools子產品提供了常用的操作疊代對象的函數。

count( )

count( )函數可建立一個無限疊代器,輸入參數是start,從哪開始;step,每隔幾個輸出一個,預設為0。

>>> import itertools
>>> natuals = itertools.count()
>>> for n in natuals:
...     print(n)
...



...
           

cycle( )

cycle( )函數也是建立一個無限疊代器,把傳入的序列無限循環輸出。

>>> import itertools
>>> cs = itertools.cycle('AB')                    # 注意字元串也是序列的一種
>>> for c in cs:
...     print(c)
...
'A'
'B'
'A'
'B'
'A'
'B'
...
           

repeat( )

repeat( )函數同樣建立一個無限疊代器,把一個元素重複指定次數

>>> ns = itertools.repeat('A', )
>>> for n in ns:
...     print(n)
...
A
A
A
A
A
           

takewhile()

如果一個無限序列在無限地疊代輸出,我們隻能用ctrl+c強制退出運作。

是以通過會借助takewhile( )函數添加條件,拿取有限序列。

>>> natuals = itertools.count()
>>> ns = itertools.takewhile(lambda x: x <= , natuals)
>>> list(ns)
[, , , , , , , , , , , , , , ] 
           

需要注意的是,takewhile的第一個參數函數傳回值一旦為False,則停止拿取。

chain( )

chain( )函數把一組疊代對象組合成更大的疊代器。

>>>import itertools
>>>for c in itertools.chain('AB','12'):
...    print(c)
...
A 
B 
 
 
           

groupby( )

groupby( )函數将疊代器中的元素進行分組,如果相同的相鄰元素會分成一組。

>>>import itertools
>>>for key, group in itertools.groupby('AA2222BBAA'):
...    print(key, list(group))
...
A ['A', 'A'] 
 ['2', '2', '2', '2'] 
B ['B', 'B'] 
A ['A', 'A']
           

我們還可以在添加一個函數作為參數,groupby就會根據函數的傳回值是否相等來進行分組。比如忽略字母大小寫進行分組:

>>>import itertools
>>>for key, group in itertools.groupby('AaAa222BbAA', lambda c: c.upper()):
...    print(key, list(group))
...
A ['A', 'a', 'A', 'a'] 
 ['2', '2', '2'] 
B ['B', 'b'] 
A ['A', 'A'] 
           

【練習】計算圓周率pi

(練習源自廖雪峰官網)

計算圓周率可以根據公式:π=(4/1)-(4/3)+(4/5)-(4/7)+…+(-1)n-1(2n-1)

利用Python提供的itertools子產品,我們來計算這個序列的前N項和:

# -*- coding: utf-8 -*-
import itertools

def pi(N):
    ' 計算pi的值 '
    # step 1: 建立一個奇數序列: 1, 3, 5, 7, 9, ...
    ns = itertools.count(, )
    # step 2: 取該序列的前N項: 1, 3, 5, 7, 9, ..., 2*N-1.
    ns = itertools.takewhile(lambda x: x <= *N-, ns)
    # step 3: 添加正負符号并用4除: 4/1, -4/3, 4/5, -4/7, 4/9, ...
    sum = 
    for i in ns:
        sum = sum + (-)**((i+)/-)*/i       # (-1)**((i+1)/2-1)表示-1的n-1次方
    # step 4: 求和:
    return sum

# 測試:
print(pi())
print(pi())
print(pi())
print(pi())
assert  < pi() < 
assert  < pi() < 
assert  < pi() < 
assert  < pi() < 
print('ok')
           

運作結果:

以上就是本節的全部内容,感謝你的閱讀。

下一節内容:常用内置子產品之 contextlib

有任何問題與想法,歡迎評論與吐槽。

和部落客一起學習Python吧( ̄▽ ̄)~*