摘要:但值得注意的是,因為迭代器中的每個值只能使用一次,就會得到同樣語句不同結果的例子見上。生成器模擬考慮一個文件之中出現某個單詞例如的句子個數,采用函數式的方法,顯然,如下模塊模塊提供了大量用于操作迭代器的函數。
常用的函數 currying本篇文章是基于Joel Grus: Learning Data Science Using Functional Python視頻的筆記。
在Python中實現科里化的最佳方案是functools.partial。例如以下例子:
# 一般版本 def add1(x): return add(1, x) # FP的版本 add1_functional = partial(add, 1)reduce、map、filter
這幾個是常見的FP中處理列表的函數,在此不做介紹。
iterators(迭代器)注意:Python這得reduce在functools包中。
以下是個迭代器的例子:
In [4]: a = [1,3,4] In [5]: b = iter(a) In [6]: next(b) Out[6]: 1 In [7]: next(b) Out[7]: 3 In [8]: next(b) Out[8]: 4 In [9]: next(b) --------------------------------------------------------------------------- StopIteration Traceback (most recent call last)in () ----> 1 next(b) StopIteration:
迭代器的特點主要包括:
一次只用一個
只有需要時才會產生數據。
這兩個特點保證了其惰性的特點,而另一個好處是我們可以構造無窮序列。
generator生成器生成器所要生成的結果其實就是迭代器,如下:
def lazy_integers(n = 0): while True: yield n n += 1 xs = lazy_integers() [next(xs) for _ in range(10)] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [next(xs) for _ in range(10)] # [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
上面的例子我們可以看出,生成器在此生成了一個無窮長度的序列,由于其惰性我們可以在有限內存之中儲存這個無窮序列。
但值得注意的是,因為迭代器中的每個值只能使用一次,就會得到同樣語句不同結果的例子(見上)。
squares = (x ** 2 for x in lazy_integers()) doubles = (x * x for x in lazy_integers()) next(squares) #0 next(squares) #1 next(squares) #4
我們發現使用tuple可以直接改變迭代器中的每個元素,這個特性很方便;但值得注意的是,不能寫成列表的形式,不然輸出值就不為惰性迭代器,就會引起內存外溢。
生成器模擬pipeline考慮一個文件之中出現某個單詞(例如“prime”)的句子個數,采用函數式的方法,顯然,如下:
with open("a.txt", "r") as f: lines = (line for line in f) prime_lines = filter(lambda line: "prime" in line.lower(), lines) line_count = len(list(prime_lines))itertools模塊
itertools模塊提供了大量用于操作迭代器的函數。
函數名 | 參數 | 作用 |
---|---|---|
count | [start=0], [step=1] | 輸出無窮序列(start, start + step, start + 2 * step...) |
islice | seq, [start=0], stop, [step=1] | 輸出序列的切片 |
tee | it, [n=2] | 復制序列,輸出為多個相同序列組成的元組 |
repeat | elem, [n=forever] | 重復序列n次,輸出為一個repeat元素 |
cycle | p | 無限重復cycle里的元素 |
chain | p, q, ... | 迭代p里的元素,然后再迭代q的元素,... |
accumulate | p, [func=add] | 返回(p[0], func(p[0], p[1]), func(func(p[0], p[1]), p[2])...) |
def take(n, it): """ 將前n個元素固定轉為列表 """ return [x for x in islice(it, n)] def drop(n, it): """ 剔除前n個元素 """ return islice(it, n, None) # 獲取序列的頭 head = next # 獲取除第一個元素外的尾 tail = partial(drop, 1)
此外,很常見的另一個函數是獲得一個遞推的迭代器函數,即已知x, f,獲得(x, f(x), f(f(x)),...)
def iterate(f, x): yield x yield from iterate(f, f(x))
注意,要防止mutation,就是說到底復制的是指針還是指針代表的數,顯然下面的寫法是有問題的:
def iterate(f, x): while True: yield x x = f(x)
一個簡單的避免方法是:
def iterate(f, x): return accumulate(repeat(x), lambda fx, _:f(fx))使iterate
def lazy_integers(): return iterate(add1, 0) take(10, lazy_integers())一個例子:斐波那契數列 基本寫法
def fib(n): if n == 0: return 1 if n == 1: return 1 return fib(n - 1) + fib(n - 2) [fib(i) for i in range(10)]升級寫法——mutable but functional
def fibs(): a, b = 0, 1 while True: yield b a, b = b, a + b take(10, fibs())Haskell-Like 寫法
def fibs(): yield 1 yield 1 yield from map(add, fibs(), tail(fibs())) take(10, fibs())尾遞歸的haskell-like版本
def fibs(): yield 1 yield 1 fibs1, fibs2 = tee(fibs()) yield from map(add, fibs1, tail(fibs2))
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37811.html
摘要: Awesome JavaScript A collection of awesome browser-side JavaScript libraries, resources and shiny things. Awesome JavaScript Package Managers Loaders Testing Frameworks QA Tools MVC Framew...
Abstract There is an article shows demo code for making XMLSignature by using Java XML Digital Signature API, where it actually uses org.jcp.xml.dsig.internal.dom.XMLDSigRI to do DOM formation, and th...
Abstract: A Star Algorithm has been widely used in motion planning problems. This article will start from a real project to help you understand the A Star programing idea. It is nice because we will u...
摘要: Caching Libraries for caching data. Beaker - A library for caching and sessions for use with web applications and stand-alone Python scripts and applications. dogpile.cache - dogpile.cache...
閱讀 810·2021-11-22 15:25
閱讀 1408·2021-09-08 09:45
閱讀 1685·2021-09-02 09:46
閱讀 1299·2019-08-30 15:56
閱讀 1528·2019-08-29 15:14
閱讀 1159·2019-08-29 13:06
閱讀 2010·2019-08-29 12:34
閱讀 1400·2019-08-26 12:14