国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python一等函數(shù)簡析

鄒立鵬 / 3536人閱讀

摘要:本文重點了解函數(shù)在中是一等對象了解中的可調(diào)用對象掌握正確定義函數(shù)參數(shù)的方法了解和中支持函數(shù)式編程的方法。歸約函數(shù)定義能夠接受一個可迭代對象并返回單個結(jié)果的函數(shù)是歸約函數(shù)。

本文章記錄了本人在學習Python基礎(chǔ)之函數(shù)篇的重點知識及個人心得,歡迎打算入門Python的朋友與我一起學習交流。。

本文重點:

1、了解函數(shù)在Python中是一等對象;
2、了解Python中的可調(diào)用對象;
3、掌握正確定義函數(shù)參數(shù)的方法;
4、了解operator和functools中支持函數(shù)式編程的方法。
一、函數(shù)是一等對象 1、一等對象

定義:一等對象是滿足如下條件的程序?qū)嶓w:

在運行時創(chuàng)建;

能賦值給變量或數(shù)據(jù)結(jié)構(gòu)中的元素;

能作為參數(shù)傳給函數(shù);

能作為函數(shù)的返回結(jié)果。

在Python中,所有函數(shù)都是一等對象。

2、高階函數(shù)

定義:接受函數(shù)為參數(shù),或者把函數(shù)作為結(jié)果返回的函數(shù)是高階函數(shù)。
在Python中傳統(tǒng)的高階函數(shù)有map,filter,reduce;常用的高階函數(shù)有內(nèi)置函數(shù)sorted、min、max和functools.partial。

map(function, iterable, ...):
map返回一個迭代器,迭代器是通過function處理可迭代對象中的每個元素產(chǎn)生的返回值的集合。

filter(function, iterable):
filter相當于一個過濾器,以函數(shù)返回值為判定條件,篩選出True的元素并放入迭代器中返回。

functools.reduce(function, iterable[, initializer])
reduce對可迭代對象中從左開始元素選出兩個進行函數(shù)運算,將返回的運算值作為一個參數(shù)繼續(xù)與第三個元素進行函數(shù)運算,直至迭代完成返回運算值。

3、歸約函數(shù):

定義:能夠接受一個可迭代對象并返回單個結(jié)果的函數(shù)是歸約函數(shù)。
reduce就是歸約函數(shù)的一種,sum也是一種歸約函數(shù)。本章額外介紹兩個內(nèi)置的歸約函數(shù)。

all(iterable):
可迭代對象中每一個元素都是真值則返回True,否則False。
any(iterable)
可迭代對象中存在一個元素是真值則返回True,否則False。
歸約函數(shù)會在第14章中討論可迭代對象時重點講解。

4、匿名函數(shù):

匿名函數(shù):使用lambda表達式創(chuàng)建的函數(shù),函數(shù)本身沒有名字來辨識,因而叫做匿名函數(shù)。
句法特點:lambda函數(shù)只能使用純表達式,不能賦值,也不能使用while和try等語句。
語法:lambda [arg1 [,arg2,.....argn]]:expression。
優(yōu)點:創(chuàng)建方便,簡化代碼工作量。
缺點:代碼可讀性降低。

5、函數(shù)內(nèi)省

在計算機編程中,自省是指這種能力:檢查某些事物以確定它是什么、它知道什么以及它能做什么。自省向程序員提供了極大的靈活性和控制力。

二、函數(shù)參數(shù)與注解 1、函數(shù)參數(shù)

在函數(shù)的定義過程可能需要傳入?yún)?shù),對于函數(shù)涉及到的參數(shù)分為以下四種:

必填參數(shù)
調(diào)用函數(shù)必須填寫的參數(shù)。在參數(shù)中居于靠前位置。

默認參數(shù)
當必填參數(shù)設(shè)置默認值時可選填。注意默認值是不可變對象,否則有邏輯錯誤。

可變參數(shù)
用單星號*args表示,即傳入的參數(shù)是不定的。*args把參數(shù)收到元組中接受。
傳入方式既可以是直接傳入,如func(1, 2, 3);也可以用列表或元組傳入,如func(*(1,2,3))。

強制關(guān)鍵字參數(shù)
此類參數(shù)只能捕獲通過指定關(guān)鍵字傳入的參數(shù),無法按照位置順序讀參。定義時前面需放一個*。

關(guān)鍵字參數(shù)
此參數(shù)可填可不填。傳入方式分兩種,一是”傳遞參數(shù)名=傳遞參數(shù)值”形式的參數(shù),這種方式傳入對位置無要求;二是不寫參數(shù)名,按照位置順序傳入?yún)?shù)值。
當關(guān)鍵字參數(shù)不定時用雙星號**kw表示。**kw把關(guān)鍵字參數(shù)收到字典中接受。關(guān)鍵字參數(shù)既可以直接傳入:func(a=1, b=2),又可以先組裝dict,再通過**kw傳入:func(**{"a": 1, "b": 2})。

參數(shù)組合:當函數(shù)涉及到使用多種參數(shù)時,定義和傳入的參數(shù)需按照的順序:
必填參數(shù)、默認參數(shù)、可變參數(shù)、強制關(guān)鍵字參數(shù)、關(guān)鍵字參數(shù).

def func(name,country="China",*,age,**rest):
    print("name :",name," country :",country," age :",age," rest :",rest)
func("Jack","US",age=20)
func("Hoya",age=15,male="Boy",height="178",grade="excellent",country="UK")

#output:
name : Jack  country : US  age : 20  rest : {}
name : Hoya  country : UK  age : 15  rest : {"male": "Boy", "height": "178", "grade": "excellent"}
#強制關(guān)鍵字參數(shù)錯誤傳參
 func("Hoya",country="UK",20)

SyntaxError: positional argument follows keyword argument
#強制關(guān)鍵字參數(shù)只能利用關(guān)鍵字傳入?yún)?shù)

注:函數(shù)參數(shù)知識引自
作者:東皇Amrzs

2、獲取參數(shù):inspect模塊

可以通過A=inspect.signature(object)提取關(guān)于函數(shù)參數(shù)的信息;
signature支持signature.parameter方法返回關(guān)于參數(shù)的有序映射。
signature支持signature.bind(args, *kwargs)方法,此方法可將多個實參綁定到簽名的形參來接受。

3、函數(shù)注解:

注解(annotation)從Python3開始存在,用于為函數(shù)聲明中的參數(shù)和返回值附加元數(shù)據(jù)。只有inspect.signature()可以提取注解。
本人目前把注解簡單理解為一種標簽。

三、可調(diào)用對象

定義:支持調(diào)用運算符()的對象叫做可調(diào)用對象。
判斷方法:利用內(nèi)置的callable()函數(shù)判斷。

Python數(shù)據(jù)模型包含7種可調(diào)用對象:

用戶定義的函數(shù)
使用def語句或lambda表達式創(chuàng)建。

內(nèi)置函數(shù)
使用CPython實現(xiàn)的函數(shù),如len。

內(nèi)置方法
使用CPython實現(xiàn)的方法,如list.pop。

方法
在類的定義體中定義的函數(shù)。

類的實例
如果類定義了__call__方法,這個類的實例可以作為函數(shù)調(diào)用。

生成器函數(shù)
使用yield關(guān)鍵字的函數(shù)或方法。調(diào)用生成器函數(shù)返回的對象是生成器。

下面針對類的實例為示范進行調(diào)用操作:

class Text:
    def __init__(self,text):
        self.text=str(text)
    def number_search(self):
        import re
        num_search=re.compile(r"d+")
        return print("number search :",num_search.findall(self.text))
    def __call__(self, *args, **kwargs):
        return self.number_search()
a=Text("asdljlj55fsa56af6af66f598as5asf6af59nf3asf830fa3s")
a.number_search()

#輸出:
number search : ["55", "56", "6", "66", "598", "5", "6", "59", "3", "830", "3"]

從中可以看出,創(chuàng)建函數(shù)類對象的簡便方式是實現(xiàn)__call__方法。

四、支持函數(shù)式編程的包 1. 函數(shù)式編程:

相比較命令式編程,函數(shù)式編程是通過函數(shù)來保存程序的狀態(tài)的?;蛘吒鼫蚀_一點,它是通過函數(shù)創(chuàng)建新的參數(shù)或返回值來保存程序的狀態(tài)的。

認識函數(shù)式編程應掌握的兩個本質(zhì):

高階函數(shù)(higher-order functions)
函數(shù)式編程是通過高階函數(shù)(higher-order functions)的特性來使其具有更豐富多變的表達能力。如map,filter。
高階函數(shù)和一等函數(shù)讓基于函數(shù)演變的函數(shù)式語言表達能力大增,使其能夠用函數(shù)構(gòu)建起更高層更抽象的模塊來解決復雜的問題。

沒有副作用(no side effect)
函數(shù)所有功能就是返回一個新的值,沒有其他行為,尤其是不得修改外部變量的值。
使得函數(shù)式編程各個獨立的部分的執(zhí)行順序可以隨意打亂。 而這在命令式編程風格的代碼中是不可能的。
執(zhí)行順序的自由使其得以衍生出一大堆非常有用的特性,比如無鎖(lock-free)的并發(fā)操作、惰性求值(lazy evaluation),還有在編譯器級別上的各種性能優(yōu)化技術(shù)。 特別在并行技術(shù)上,Clojure, Haskell, F#, Scala, Erlang這些函數(shù)式語言都無一例外地支持強大的并發(fā)功能。
當然函數(shù)式語言不可能真的就不執(zhí)行I/O,但它通過一些手段來把I/O的影響限制到最小,比如通過Continuations, Monad等技術(shù)。

注:函數(shù)式編程知識引自
作者:Jan Fan

Python的目標不是變成函數(shù)式編程語言,但通過operator和functools等包也可以進行函數(shù)式編程,下面開始介紹這兩個模塊。

2. operator

本節(jié)介紹operator中的mul、itemgetter、attrgetter、methodcaller四種方法。

operator.mul(a,b)
返回數(shù)字a和b的乘積。

import operator
from _functools import reduce
#計算階乘
def fact1():
    list1=filter(lambda x: x%2,range(8))
    return reduce(operator.mul,list1)
print(fact1())#輸出:105

operator.itemgetter(item or *items)
創(chuàng)建一個接受集合的函數(shù),返回指定索引對應的元素。如果指定索引至少為2個,以元組形式返回查詢結(jié)果。
After f = itemgetter(2), the call f(r) returns r[2].
After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3]).

metro_data =[("Tokyo", "JP", 36.933, (35.689722, 139.691667)),
("Delhi NCR", "IN", 21.935, (28.613889, 77.208889)),
("Mexico City", "MX", 20.142, (19.433333, -99.133333)),
("New York-Newark", "US", 20.104, (40.808611, -74.020386)),
("Sao Paulo", "BR", 19.649, (-23.547778, -46.635833))]
a=itemgetter(1,0)
for i in metro_data:
    print(a(i))#注意分清楚a和i誰是參數(shù),被處理的可迭代對象是參數(shù)。

#輸出:
("JP", "Tokyo")
("IN", "Delhi NCR")
("MX", "Mexico City")
("US", "New York-Newark")
("BR", "Sao Paulo")

operator.attrgetter(attr or *attrs)
創(chuàng)建一個函數(shù),根據(jù)名稱訪問對象的屬性,以元組的形式返回。
After f = attrgetter("name"), the call f(b) returns b.name.
After f = attrgetter("name", "date"), the call f(b) returns (b.name, b.date).
After f = attrgetter("name.first", "name.last"), the call f(b) returns (b.name.first, b.name.last).

eg:按照城市經(jīng)度順序輸出城市名和城市經(jīng)度

from collections import namedtuple
from _operator import attrgetter

latlong=namedtuple("latlong","lat long")
citydata=namedtuple("citydata", "city ID pop coord")
city=[citydata(city,ID,pop,latlong(lat,long)) for city, ID,pop,(lat,long) in metro_data]
#拆包+列表推導。拆包注意city,ID,pop,latlong(lat,long)和citydata具名元組的結(jié)構(gòu)對應關(guān)系,至于拆包用的變量名字是什么并不重要,保證可讀性即可。
b=attrgetter("city","coord.lat")

#方法1
for i in sorted(city,key=attrgetter("coord.lat")):
    print(b(i))

#方法2
for i in sorted(city,key=lambda x: x[3][0]):
    print(b(i))

#輸出
("Sao Paulo", -23.547778)
("Mexico City", 19.433333)
("Delhi NCR", 28.613889)
("Tokyo", 35.689722)
("New York-Newark", 40.808611)

operator.methodcaller(name[, args...])
自行創(chuàng)建函數(shù),使用對象中支持的方法。args代表函數(shù)所需傳入的參數(shù)。
After f = methodcaller("name"), the call f(b) returns b.name().
After f = methodcaller("name", "foo", bar=1), the call f(b) returns b.name("foo", bar=1).

from operator import methodcaller
c=methodcaller("upper")
d=methodcaller("islower")
print(c("apple"),d("apple"))
#輸出
APPLE True.
3. functools.partial

語法:functools.partial(func, *args, **keywords)
functools.partial適用于函數(shù)凍結(jié)參數(shù)的情況。凍結(jié)參數(shù)是指我們欲調(diào)用的函數(shù)中的部分或全部參數(shù)已經(jīng)固定,只需補齊剩下的參數(shù)調(diào)用即可。可以按照word編輯中的格式刷來理解。

from functools import partial
from unicodedata import normalize
clean=partial(normalize,"NFC")#字符串格式化,我覺得很像格式刷啊。
e="café"
f="cafeu0301"
print(e==f) #False
print(clean(e)==clean(f))#True

使用技巧總結(jié):operator中的itemgetter、attrgetter和functools.partial在使用上都需要先構(gòu)建類似正則表達式的compile partern,即構(gòu)建對應的itemgetter,attrgetter和partial,然后在partern基礎(chǔ)上傳入待處理對象。以剛才的partial舉例就是clean(e),而不是e(clean)。

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/41255.html

相關(guān)文章

  • Python一等函數(shù)簡析

    摘要:本文重點了解函數(shù)在中是一等對象了解中的可調(diào)用對象掌握正確定義函數(shù)參數(shù)的方法了解和中支持函數(shù)式編程的方法。歸約函數(shù)定義能夠接受一個可迭代對象并返回單個結(jié)果的函數(shù)是歸約函數(shù)。 導語:本文章記錄了本人在學習Python基礎(chǔ)之函數(shù)篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學習并交流。 本文重點: 1、了解函數(shù)在Python中是一等對象;2、了解Python中的可調(diào)用對象;3...

    shusen 評論0 收藏0
  • 簡析前端學習python3的基礎(chǔ)

    摘要:元組是靜態(tài)數(shù)組,它們不可變,且其內(nèi)部數(shù)據(jù)一旦創(chuàng)建便無法改變。元組緩存于運行時環(huán)境,這意味著我們每次使用元組時無須訪問內(nèi)核去分配內(nèi)存。 以下是整理的JavaScript和python的基礎(chǔ)區(qū)別的整理: 字符串、列表、元組、字典、集合、函數(shù) 字符串 聲明一個字符串 python str = 123 str = 123 Tips: 如果是三個引號的話,那么在py中就是注釋的意思 ...

    summerpxy 評論0 收藏0
  • 簡析前端學習python3的基礎(chǔ)

    摘要:元組是靜態(tài)數(shù)組,它們不可變,且其內(nèi)部數(shù)據(jù)一旦創(chuàng)建便無法改變。元組緩存于運行時環(huán)境,這意味著我們每次使用元組時無須訪問內(nèi)核去分配內(nèi)存。 以下是整理的JavaScript和python的基礎(chǔ)區(qū)別的整理: 字符串、列表、元組、字典、集合、函數(shù) 字符串 聲明一個字符串 python str = 123 str = 123 Tips: 如果是三個引號的話,那么在py中就是注釋的意思 ...

    LiveVideoStack 評論0 收藏0
  • python學習筆記 函數(shù)

    摘要:一等函數(shù)在中,函數(shù)是一等對象。匿名函數(shù)關(guān)鍵字在表達式內(nèi)創(chuàng)建匿名函數(shù)然而,簡單的句法限制了函數(shù)的定義體只能使用純表達式,即函數(shù)的定義體中不能賦值,不能使用等語句。匿名函數(shù)適合用于作為函數(shù)的參數(shù) 一等函數(shù) 在python中,函數(shù)是一等對象。編程語言理論家把一等對象定義為滿足以下條件的程序?qū)嶓w: 在運行時創(chuàng)建 能賦值給變量或數(shù)據(jù)結(jié)構(gòu)中的元素 能作為參數(shù)傳給函數(shù) 能作為函數(shù)的返回結(jié)果 在p...

    Scorpion 評論0 收藏0
  • Python學習之路24-一等函數(shù)

    摘要:函數(shù)內(nèi)省的內(nèi)容到此結(jié)束。函數(shù)式編程并不是一個函數(shù)式編程語言,但通過和等包的支持,也可以寫出函數(shù)式風格的代碼。 《流暢的Python》筆記。本篇主要講述Python中函數(shù)的進階內(nèi)容。包括函數(shù)和對象的關(guān)系,函數(shù)內(nèi)省,Python中的函數(shù)式編程。 1. 前言 本片首先介紹函數(shù)和對象的關(guān)系;隨后介紹函數(shù)和可調(diào)用對象的關(guān)系,以及函數(shù)內(nèi)省。函數(shù)內(nèi)省這部分會涉及很多與IDE和框架相關(guān)的東西,如果平時...

    wind3110991 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<