當然是函數式那一套黑魔法啦,且聽我細細道來。 lambda表達式也就是匿名函數。用法:lambda 參數列表 : 返回值例: +1函數 f=lambda x:x+1 max函數(條件語句的寫法如下) f_max=lambda x,y:x if xy else y 上述定義的函數與用def定義的函數沒有區別,而且左邊的f=在某些情況下并不是必要的。 filter,map,reduce filter函數接受兩個參數,第一個是過濾函數,第二個是可遍歷的對象,用于選擇出所有滿足過濾條件的元素,不同版本的filter的返回值稍有區別,我用的是python3.5,filter返回的是經過過濾的可遍歷對象。例:去除小寫字母 s=filter(lambda x:not str(x).islower(),"asdasfAsfBsdfC") for ch in s: print(ch) map函數接受的參數類型與filter類似,它用于把函數作用于可遍歷對象的每一個元素。類似于數學中映射的概念。例:求y=2x+1(偷偷用了一下range函數生成定義域) s=map(lambda x:2*x+1,range(6)) for x in s: print(x) reduce函數對每個元素作累計操作,它接受的第一個參數必須是有兩個參數的函數。例:求和 from functools import reduce s=reduce(lambda x,y:x+y,range(1,6)) print(s) 求乘積(第三個可選參數表示累計變量的初值) from functools import reduce s=reduce(lambda x,y:x*y,range(1,6),1) print(s) 柯里化(curry)函數如果一個函數需要2個參數,而你只傳入一個參數,那么你就可以得到一個柯里化的函數,這是函數式編程語言的重要特性之一,遺憾的是,python并不能在語法層面支持柯里化調用,但它在庫中提供了接口。例: *3函數 f_mul=lambda x,y:x*y from functools import partial mul3=partial(f_mul,3) print(mul3(1)) print(mul3(6)) 打包與解包有點類似于函數式中的模式匹配,略牽強。 t=(1,2,3) x,y,z=t 列表生成式這個也有點牽強,不知道嚴格意義上講屬不屬于函數式風格。例:生成奇數序列 l=[2*x+1 for x in range(10)] for i in l: print(i) 最后來一個彩蛋(以前某答主提到的用調分函數來美顏的算法,忘了出處了,侵刪) 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")
創新互聯建站專注于利通網站建設服務及定制,我們擁有豐富的企業做網站經驗。 熱誠為您提供利通營銷型網站建設,利通網站制作、利通網頁設計、利通網站官網定制、成都小程序開發服務,打造利通網絡公司原創品牌,更為您提供利通網站排名全網營銷落地服務。
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'
運行輸出:
in enter
in with
in exit
也就是說在print 'in with'前自動執行了A()構造的實例的__enter__方法
with塊中的程序執行完后,自動執行了A()構造的實例的__exit__方法
這里as a可以省略,因為with塊中沒有用到a
with app.test_request_context():
print(url_for('index'))
直接翻譯的話就是
context =?app.test_request_context()
context.__enter__()
print(url_for('index'))
context.__exit__(參數1,參數2,參數3)
這里可以理解為 為print(url_for('index'))創造一個環境,執行完后清理環境
什么是語法糖?
很多人在Python語法糖相關的問題,但是估計其中有不少同學甚至都不知道語法糖是什么概念。
其實,它并沒有那么高大上,如果你跟著正常的學習鏈路把一門編程語言的語法學會,可能你日常開發過程中已經用到了很多語法糖。
在正式回答問題之前,我覺得有必要先解釋一下什么是語法糖。
語法糖(Syntactic sugar),由英國計算機科學家Peter J. Landin于1964年提出,簡單來說,語法糖是指計算機語言中添加的某種語法,這種語法對語言的功能沒有影響,但是更方便程序員使用。語法糖讓程序更加簡潔,有更高的可讀性。
引用維基百科上的一個例子:
舉一個比較常見的for循環的例子:
滿足同樣的功能和效果,我們可以通過while來實現:
這就是一個簡單的語法糖。
由此可見,語法糖并不是什么高大上的東西,可能我們現在開發中已經用了很多Python語法糖。
除此之外,語法糖還派生出一些詞匯。例如,語法鹽(syntactic salt),指的是不容易寫出壞代碼的語法特性。語法糖精(syntactic saccharine),或者說語法糖漿(syntactic syrup),指的是未能讓編程更加方便的附加語法。
花了很大功夫來解釋什么是語法糖,為的就是讓大家更加容易理解、循序漸進,而不是上來就羅列一堆語法糖,很多基礎薄弱的同學不明所以。
講完語法糖的概念,接下來就介紹一些Python中那些好玩的語法糖。
魔法方法(Magic methods),有時也被稱為特殊方法,是一種具有預定義名稱的方法,其特征是在開頭和結尾處有雙下劃線,例如, init 。
它們之所以是 "魔法",是因為這些方法是間接調用的,你不需要直接調用它們,一切都在背后完成。
例如,當你實例化一個類 x = MyClass() 時,Python 將調用 new 和 init 進行構造或者初始化。
舉一個簡單的打印字符串的例子:
其實它間接的調用了背后的魔法方法,我們可以來試一下:
可以看出, repr 其實就是綁定到知名的print()方法上了。
除此之外,還有很多常用的魔法方法和我們常用的操作效果相同的:
裝飾器是典型的Python語法糖,通過裝飾器的使用,可以讓Python語法格外簡潔,而且可讀性也很高。
比如,我現在寫了3個函數,并且要統計3個函數的執行時間。
按常規的需要這樣寫:
這樣不僅麻煩,而且有很多冗余代碼。
這時候,我們就可以實現一個計時的裝飾器,并且在每個函數上通過@裝飾器名來調用:
除此之外,裝飾器還有很多妙用,感興趣的同學可以看看我的另外一篇文章:
如果對裝飾器的基本概念和用法不清楚,我之前也寫過一篇非常受歡迎的回答,需要的也可以看一下:
開發過程中經常會用到比較運算符,比如,要判斷一個變量是否在一個區間內,很多語言需要這樣寫:
在Python中,可以這樣寫:
這樣更符合我們日常使用習慣,也更容易理解。
如果有一個列表或者字典,該如何遍歷?
很多同學估計都會這樣做:
在Python中,可以用更簡潔的方法實現,一行代碼就夠了:
假如有這么一個數字:
這是多少?
估計很多人開始逐個數零了。
如果接觸過財務或者會計的同學應該知道,有一種千位數字分割樣式,這樣更便于讀取和理解。
在Python中,它提供了一種語法糖可以這樣表示
這種效果和上面這種一樣,但是更加容易理解和讀取。
可以驗證一下:
除了上面這些,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()
函數use_logging就是裝飾器,它把執行真正業務方法的func包裹在函數里面,看起來像bar被use_logging裝飾了。在這個例子中,函數進入和退出時 ,被稱為一個橫切面(Aspect),這種編程方式被稱為面向切面的編程(Aspect-Oriented Programming)。
分享名稱:python函數類語法糖 python中的語法糖
分享路徑:http://m.newbst.com/article48/dosjghp.html
成都網站建設公司_創新互聯,為您提供網站設計、定制開發、網站策劃、Google、做網站、響應式網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯