Python學習筆記__12.7章 itertools
1、概覽
Python的內建模塊itertools提供了非常有用的用於操作叠代對象的函數。
1.1、itertools提供的幾個“無限”叠代器
0)count()
>>> import itertools
>>> natuals = itertools.count(1)
>>> for n in natuals:
... print(n)
count()會創建一個無限的叠代器,所以上述代碼會打印出自然數序列,根本停不下來,只能按Ctrl+C退出。
1)cycle()
cycle()會把傳入的一個序列無限重復下去
>>> import itertools
>>> cs = itertools.cycle('ABC') # 註意字符串也是序列的一種
>>> for c in cs:
... print(c)
2)repeat()
repeat()負責把一個元素無限重復下去,不過如果提供第二個參數就可以限定重復次數
>>> ns = itertools.repeat('A', 3)
>>> for n in ns:
... print(n)
3)takewhile()
可以通過takewhile()等函數根據條件判斷來對無限循環截取出一個有限的序列
>>> natuals = itertools.count(1)
>>> ns = itertools.takewhile(lambda x: x <= 10, natuals)
>>> list(ns)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
1.2、itertools提供的幾個叠代器操作函數
1)chain()
chain()可以把一組叠代對象串聯起來,形成一個更大的叠代器
>>> for c in itertools.chain('ABC', 'XYZ'):
... print(c)
# 叠代效果:'A' 'B' 'C' 'X' 'Y' 'Z'
2)groupby()
groupby()把叠代器中相鄰的重復元素挑出來放在一起:
>>> for key, group in itertools.groupby('AAABBBCCAAA'):
... print(key, list(group))
...
A ['A', 'A', 'A']
B ['B', 'B', 'B']
C ['C', 'C']
A ['A', 'A', 'A']
挑選規則是通過函數完成的,只要作用於函數的兩個元素返回的值相等,這兩個元素就被認為是在一組的,而函數返回值作為組的key。
>>> for key, group in itertools.groupby('AaaBBbcCAAa', lambda c: c.upper()): # 忽略大小寫
... print(key, list(group))
...
A ['A', 'a', 'a']
B ['B', 'B', 'b']
C ['c', 'C']
A ['A', 'A', 'a']
註意:itertools模塊提供的全部是處理叠代功能的函數,它們的返回值不是list,而是Iterator,只有用for循環叠代的時候才真正計算。
2、例題
計算圓周率可以根據公式:
利用Python提供的itertools模塊,我們來計算這個序列的前N項和:
# -*- coding: utf-8 -*-
import itertools
方法一:
def pi(N):
n=itertools.count(1,2) # 取出奇數序列,從1開始,步長為2
ns=itertools.takewhile(lambda x:x<=2*N,n) #取出前N個數
num=list(ns) #將Iterator 序列化
sum=0
for n in num: # 循環,if判斷取值
if n%4==1:
n=4/n
else:
n=-4/n
sum+=n
return sum
方法二(網友寫):
def pi(N):
' 計算pi的值 '
# step 1: 創建一個奇數序列: 1, 3, 5, 7, 9, ...
list1 = itertools.count(1, 2)
# step 2: 取該序列的前N項: 1, 3, 5, 7, 9, ..., 2*N-1.
list2 = list(itertools.takewhile(lambda x: x < 2 * N, list1))
# step 3: 添加正負符號並用4除: 4/1, -4/3, 4/5, -4/7, 4/9, ...
list3 = [4 / (-i) for i in list2[1::2]] + [4 / i for i in list2[::2]]
# step 4: 求和:
return sum(list3) #這裏求和得用sum()函數,sum函數將list3中的所有值相加
Python學習筆記__12.7章 itertools