1. 程式人生 > >Python學習筆記__12.7章 itertools

Python學習筆記__12.7章 itertools

編程語言 Python

# 這是學習廖雪峰老師python教程的學習筆記

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