攻堅克難 Python語法糖

2021-10-06 11:07:58 字數 1178 閱讀 9185

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