摘要: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吧( ̄▽ ̄)~*