python中所謂的語法糖其實就是指裝飾器
裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的**前提下給函式增加新的功能
閉包:其實就是函式b函式巢狀中,內部函式a使用了外部函式b的變數,則稱內部函式a為閉包
樣例**:
def
foo():
m =1def
bar():
print
(m)
foo(
)
發生了什麼?
在上面的**中,函式bar被巢狀在了函式foo中,bar函式呼叫了foo函式的乙個變數m,使得函式bar成為閉包。
閉包不會改變外部作用域變數的值
以下這段**是在python中使用閉包時一段經典的錯誤**
def
foo():
a =1def
bar():
a = a +
1return a
return bar
這段程式的本意是要通過在每次呼叫閉包函式時都對變數a進行遞增的操作
但在實際使用時是會報錯的
報錯資訊為:「unboundlocalerror: local variable 『a』 referenced before assignment」
如果你希望函式的每次執行結果,都是基於外部函式的執行結果
我們可以修改外部的變數,使閉包可以根據這個變數展現出不同的功能。
第一步,製作乙個閉包
第二步,用@+外部函式名製作語法糖
第三步,將語法糖放在準備使用的自定義函式的上一行以使用語法糖
第四步,呼叫自定義函式
例如:
# 製作乙個閉包
deffoo
(func)
:def
(*args,
**kw)
:print
(func.__name__+
' is running.'
)@foo # 製作語法糖並呼叫
deff1()
:pass
f1()
結果就是列印出來乙個「f1 is running.」
從結果上面我們可以發現這個修飾器已經能夠成功執行了。
js 攻堅克難
new 官方解釋 如果在乙個函式前面帶上new來呼叫,那麼背地裡將會建立乙個連線到該函式的prototype的成員的新物件,同時this會被繫結到哪個新物件上 new 是用來建立物件的 當在自定義的function型別前使用new時,只有當函式無返回時才有區別 當無返回值時 使用new可以獲得物件,...
python 語法糖太多 python 語法糖
匿名函式 lamda表示式 def add x,y return x y 等價於f lamda x,y x y f 1,2 三元表示式 wefx 1 y 2 c x if x map對映關係 def square x return x x list x 1,3,10 list r map squar...
Python 的 with 語法糖
python 內建了 sqlite3 模組,可以方便地呼叫 sqlite 資料庫。import sqlite3 conn sqlite3.connect test.db cur conn.cursor cur.execute create table students id bigint prima...