python函數(shù)類語法糖 python中的語法糖

Python中幾個有趣的語法糖

當(dāng)然是函數(shù)式那一套黑魔法啦,且聽我細(xì)細(xì)道來。 lambda表達(dá)式也就是匿名函數(shù)。用法:lambda 參數(shù)列表 : 返回值例: +1函數(shù) f=lambda x:x+1 max函數(shù)(條件語句的寫法如下) f_max=lambda x,y:x if xy else y 上述定義的函數(shù)與用def定義的函數(shù)沒有區(qū)別,而且左邊的f=在某些情況下并不是必要的。 filter,map,reduce filter函數(shù)接受兩個參數(shù),第一個是過濾函數(shù),第二個是可遍歷的對象,用于選擇出所有滿足過濾條件的元素,不同版本的filter的返回值稍有區(qū)別,我用的是python3.5,filter返回的是經(jīng)過過濾的可遍歷對象。例:去除小寫字母 s=filter(lambda x:not str(x).islower(),"asdasfAsfBsdfC") for ch in s: print(ch) map函數(shù)接受的參數(shù)類型與filter類似,它用于把函數(shù)作用于可遍歷對象的每一個元素。類似于數(shù)學(xué)中映射的概念。例:求y=2x+1(偷偷用了一下range函數(shù)生成定義域) s=map(lambda x:2*x+1,range(6)) for x in s: print(x) reduce函數(shù)對每個元素作累計(jì)操作,它接受的第一個參數(shù)必須是有兩個參數(shù)的函數(shù)。例:求和 from functools import reduce s=reduce(lambda x,y:x+y,range(1,6)) print(s) 求乘積(第三個可選參數(shù)表示累計(jì)變量的初值) from functools import reduce s=reduce(lambda x,y:x*y,range(1,6),1) print(s) 柯里化(curry)函數(shù)如果一個函數(shù)需要2個參數(shù),而你只傳入一個參數(shù),那么你就可以得到一個柯里化的函數(shù),這是函數(shù)式編程語言的重要特性之一,遺憾的是,python并不能在語法層面支持柯里化調(diào)用,但它在庫中提供了接口。例: *3函數(shù) f_mul=lambda x,y:x*y from functools import partial mul3=partial(f_mul,3) print(mul3(1)) print(mul3(6)) 打包與解包有點(diǎn)類似于函數(shù)式中的模式匹配,略牽強(qiáng)。 t=(1,2,3) x,y,z=t 列表生成式這個也有點(diǎn)牽強(qiáng),不知道嚴(yán)格意義上講屬不屬于函數(shù)式風(fēng)格。例:生成奇數(shù)序列 l=[2*x+1 for x in range(10)] for i in l: print(i) 最后來一個彩蛋(以前某答主提到的用調(diào)分函數(shù)來美顏的算法,忘了出處了,侵刪) from PIL import Image from math import sqrt im = Image.open("a.jpg") ret= im.convert(mode="RGB") ret = ret.point(lambda x:sqrt(x)*sqrt(255)) ret.save("b.jpg")

創(chuàng)新互聯(lián)建站專注于利通網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供利通營銷型網(wǎng)站建設(shè),利通網(wǎng)站制作、利通網(wǎng)頁設(shè)計(jì)、利通網(wǎng)站官網(wǎng)定制、成都小程序開發(fā)服務(wù),打造利通網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供利通網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

關(guān)于 python 的語法糖

with的用法:

class?A:??

def?__enter__(self):??

print?'in?enter'??

def?__exit__(self,?e_t,?e_v,?t_b):??

print?'in?exit'??

with?A()?as?a:??

print?'in?with'

運(yùn)行輸出:

in enter

in with

in exit

也就是說在print 'in with'前自動執(zhí)行了A()構(gòu)造的實(shí)例的__enter__方法

with塊中的程序執(zhí)行完后,自動執(zhí)行了A()構(gòu)造的實(shí)例的__exit__方法

這里as a可以省略,因?yàn)閣ith塊中沒有用到a

with app.test_request_context():

print(url_for('index'))

直接翻譯的話就是

context =?app.test_request_context()

context.__enter__()

print(url_for('index'))

context.__exit__(參數(shù)1,參數(shù)2,參數(shù)3)

這里可以理解為 為print(url_for('index'))創(chuàng)造一個環(huán)境,執(zhí)行完后清理環(huán)境

Python 有哪些好玩的語法糖?

什么是語法糖?

很多人在Python語法糖相關(guān)的問題,但是估計(jì)其中有不少同學(xué)甚至都不知道語法糖是什么概念。

其實(shí),它并沒有那么高大上,如果你跟著正常的學(xué)習(xí)鏈路把一門編程語言的語法學(xué)會,可能你日常開發(fā)過程中已經(jīng)用到了很多語法糖。

在正式回答問題之前,我覺得有必要先解釋一下什么是語法糖。

語法糖(Syntactic sugar),由英國計(jì)算機(jī)科學(xué)家Peter J. Landin于1964年提出,簡單來說,語法糖是指計(jì)算機(jī)語言中添加的某種語法,這種語法對語言的功能沒有影響,但是更方便程序員使用。語法糖讓程序更加簡潔,有更高的可讀性。

引用維基百科上的一個例子:

舉一個比較常見的for循環(huán)的例子:

滿足同樣的功能和效果,我們可以通過while來實(shí)現(xiàn):

這就是一個簡單的語法糖。

由此可見,語法糖并不是什么高大上的東西,可能我們現(xiàn)在開發(fā)中已經(jīng)用了很多Python語法糖。

除此之外,語法糖還派生出一些詞匯。例如,語法鹽(syntactic salt),指的是不容易寫出壞代碼的語法特性。語法糖精(syntactic saccharine),或者說語法糖漿(syntactic syrup),指的是未能讓編程更加方便的附加語法。

花了很大功夫來解釋什么是語法糖,為的就是讓大家更加容易理解、循序漸進(jìn),而不是上來就羅列一堆語法糖,很多基礎(chǔ)薄弱的同學(xué)不明所以。

講完語法糖的概念,接下來就介紹一些Python中那些好玩的語法糖。

魔法方法(Magic methods),有時也被稱為特殊方法,是一種具有預(yù)定義名稱的方法,其特征是在開頭和結(jié)尾處有雙下劃線,例如, init 。

它們之所以是 "魔法",是因?yàn)檫@些方法是間接調(diào)用的,你不需要直接調(diào)用它們,一切都在背后完成。

例如,當(dāng)你實(shí)例化一個類 x = MyClass() 時,Python 將調(diào)用 new 和 init 進(jìn)行構(gòu)造或者初始化。

舉一個簡單的打印字符串的例子:

其實(shí)它間接的調(diào)用了背后的魔法方法,我們可以來試一下:

可以看出, repr 其實(shí)就是綁定到知名的print()方法上了。

除此之外,還有很多常用的魔法方法和我們常用的操作效果相同的:

裝飾器是典型的Python語法糖,通過裝飾器的使用,可以讓Python語法格外簡潔,而且可讀性也很高。

比如,我現(xiàn)在寫了3個函數(shù),并且要統(tǒng)計(jì)3個函數(shù)的執(zhí)行時間。

按常規(guī)的需要這樣寫:

這樣不僅麻煩,而且有很多冗余代碼。

這時候,我們就可以實(shí)現(xiàn)一個計(jì)時的裝飾器,并且在每個函數(shù)上通過@裝飾器名來調(diào)用:

除此之外,裝飾器還有很多妙用,感興趣的同學(xué)可以看看我的另外一篇文章:

如果對裝飾器的基本概念和用法不清楚,我之前也寫過一篇非常受歡迎的回答,需要的也可以看一下:

開發(fā)過程中經(jīng)常會用到比較運(yùn)算符,比如,要判斷一個變量是否在一個區(qū)間內(nèi),很多語言需要這樣寫:

在Python中,可以這樣寫:

這樣更符合我們?nèi)粘J褂昧?xí)慣,也更容易理解。

如果有一個列表或者字典,該如何遍歷?

很多同學(xué)估計(jì)都會這樣做:

在Python中,可以用更簡潔的方法實(shí)現(xiàn),一行代碼就夠了:

假如有這么一個數(shù)字:

這是多少?

估計(jì)很多人開始逐個數(shù)零了。

如果接觸過財務(wù)或者會計(jì)的同學(xué)應(yīng)該知道,有一種千位數(shù)字分割樣式,這樣更便于讀取和理解。

在Python中,它提供了一種語法糖可以這樣表示

這種效果和上面這種一樣,但是更加容易理解和讀取。

可以驗(yàn)證一下:

除了上面這些,Python在字符串、列表、函數(shù)等方面還有很多語法糖。

總之,語法糖的目的就是讓程序更加簡潔,有更高的可讀性。這和我們編程過程中一直堅(jiān)持的思想是一直的,實(shí)現(xiàn)一項(xiàng)功能的方法有很多,但是,我們一直在努力讓代碼具有更優(yōu)秀的擴(kuò)展性、閱讀性、簡潔性。除了語法糖,我們也可以通過養(yǎng)成良好的編程習(xí)慣、學(xué)習(xí)設(shè)計(jì)模式等方式來優(yōu)化我們的代碼。

Python 有哪些好玩的語法糖

def use_logging(func):

def wrapper(*args, **kwargs):

logging.warn("%s is running" % func.__name__)

return func(*args, **kwargs)

return wrapper

def bar():

print('i am bar')

bar = use_logging(bar)

bar()

函數(shù)use_logging就是裝飾器,它把執(zhí)行真正業(yè)務(wù)方法的func包裹在函數(shù)里面,看起來像bar被use_logging裝飾了。在這個例子中,函數(shù)進(jìn)入和退出時 ,被稱為一個橫切面(Aspect),這種編程方式被稱為面向切面的編程(Aspect-Oriented Programming)。

分享名稱:python函數(shù)類語法糖 python中的語法糖
分享路徑:http://muchs.cn/article48/dosjghp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、定制開發(fā)、網(wǎng)站策劃、Google做網(wǎng)站、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)