成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Making Your Python Codes More Functional

gplane / 1907人閱讀

摘要:但值得注意的是,因?yàn)榈髦械拿總€(gè)值只能使用一次,就會(huì)得到同樣語(yǔ)句不同結(jié)果的例子見(jiàn)上。生成器模擬考慮一個(gè)文件之中出現(xiàn)某個(gè)單詞例如的句子個(gè)數(shù),采用函數(shù)式的方法,顯然,如下模塊模塊提供了大量用于操作迭代器的函數(shù)。

本篇文章是基于Joel Grus: Learning Data Science Using Functional Python視頻的筆記。

常用的函數(shù) currying

在Python中實(shí)現(xiàn)科里化的最佳方案是functools.partial。例如以下例子:

# 一般版本
def add1(x): return add(1, x)

# FP的版本
add1_functional = partial(add, 1)
reduce、map、filter

這幾個(gè)是常見(jiàn)的FP中處理列表的函數(shù),在此不做介紹。

注意:Python這得reducefunctools包中。

iterators(迭代器)

以下是個(gè)迭代器的例子:

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:

迭代器的特點(diǎn)主要包括:

一次只用一個(gè)

只有需要時(shí)才會(huì)產(chǎn)生數(shù)據(jù)。

這兩個(gè)特點(diǎn)保證了其惰性的特點(diǎn),而另一個(gè)好處是我們可以構(gòu)造無(wú)窮序列。

generator生成器

生成器所要生成的結(jié)果其實(shí)就是迭代器,如下:

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]

上面的例子我們可以看出,生成器在此生成了一個(gè)無(wú)窮長(zhǎng)度的序列,由于其惰性我們可以在有限內(nèi)存之中儲(chǔ)存這個(gè)無(wú)窮序列。
但值得注意的是,因?yàn)榈髦械拿總€(gè)值只能使用一次,就會(huì)得到同樣語(yǔ)句不同結(jié)果的例子(見(jiàn)上)。

一個(gè)高階的用法
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

我們發(fā)現(xiàn)使用tuple可以直接改變迭代器中的每個(gè)元素,這個(gè)特性很方便;但值得注意的是,不能寫(xiě)成列表的形式,不然輸出值就不為惰性迭代器,就會(huì)引起內(nèi)存外溢。

生成器模擬pipeline

考慮一個(gè)文件之中出現(xiàn)某個(gè)單詞(例如“prime”)的句子個(gè)數(shù),采用函數(shù)式的方法,顯然,如下:

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模塊提供了大量用于操作迭代器的函數(shù)。

函數(shù)名 參數(shù) 作用
count [start=0], [step=1] 輸出無(wú)窮序列(start, start + step, start + 2 * step...)
islice seq, [start=0], stop, [step=1] 輸出序列的切片
tee it, [n=2] 復(fù)制序列,輸出為多個(gè)相同序列組成的元組
repeat elem, [n=forever] 重復(fù)序列n次,輸出為一個(gè)repeat元素
cycle p 無(wú)限重復(fù)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個(gè)元素固定轉(zhuǎn)為列表
    """
    return [x for x in islice(it, n)]
    
    
def drop(n, it):
    """
    剔除前n個(gè)元素
    """
    return islice(it, n, None)
    

# 獲取序列的頭
head = next

# 獲取除第一個(gè)元素外的尾
tail = partial(drop, 1) 

此外,很常見(jiàn)的另一個(gè)函數(shù)是獲得一個(gè)遞推的迭代器函數(shù),即已知x, f,獲得(x, f(x), f(f(x)),...)

def iterate(f, x):
    yield x
    yield from iterate(f, f(x))

注意,要防止mutation,就是說(shuō)到底復(fù)制的是指針還是指針代表的數(shù),顯然下面的寫(xiě)法是有問(wèn)題的:

def iterate(f, x):
    while True:
        yield x
        x = f(x)

一個(gè)簡(jiǎn)單的避免方法是:

def iterate(f, x):
    return accumulate(repeat(x), lambda fx, _:f(fx))
使iterate
def lazy_integers():
    return iterate(add1, 0)

take(10, lazy_integers())
一個(gè)例子:斐波那契數(shù)列 基本寫(xiě)法
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)]
升級(jí)寫(xiě)法——mutable but functional
def fibs():
    a, b = 0, 1
    while True:
        yield b
        a, b = b, a + b
        
take(10, fibs())
Haskell-Like 寫(xiě)法
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))

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37811.html

相關(guān)文章

  • Awesome JavaScript

    摘要: 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...

    endless_road 評(píng)論0 收藏0
  • 在XMLSignature中使用BouncyCastle做RSA

    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...

    LiangJ 評(píng)論0 收藏0
  • A星(A*)編程指導(dǎo)——用PR2和Python來(lái)尋路 (以后翻譯)

    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...

    mengbo 評(píng)論0 收藏0
  • Awesome Python II

    摘要: 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...

    lx1036 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<