自學python 10 函式04

2021-10-04 19:28:40 字數 4085 閱讀 3933

裝飾器:

閉包的公升級,在開發上的應用例如判斷使用者的登入狀態。修改豐富已經寫好的函式。

回顧:以函式作為引數(也是裝飾器的基礎):

def

test()

:print

("test"

)t = testt()

# test

print

(f)#

print

(test)

#

下面介紹裝飾器:

特點:1.函式a是作為引數出現的。

2.有閉包的特點出現。

具體使用情景:當乙個函式已經定義完成,但是想豐富它的內容時。

但是問題來了,我們怎麼做才能實現這些功能呢?

我們可以嘗試:

1.直接修改原來的函式。

2.重新定義乙個函式呼叫原來的函式,並且加上新的內容。

比如下列**:

def

house()

:print

("毛坯房"

)def

house1()

: house(

)print

("刷漆"

)print

("鋪地板"

)house(

)

這兩種方法都不是可行的,因為在修改的時候,會改變呼叫這個函式位置的**,如果那裡的**已經完成,修改會很耗費時間。

這時候我們就要引出裝飾器了,它可以在不改變函式名的情況下對函式進行裝飾豐富。

定義乙個裝飾器:

def

decorate

(func)

: a =

100print()

def():

func(

)print

("1111"

)print

("2222"

)print()

# 使用裝飾器

# @後加裝飾器函式表示使用這個函式作為裝飾函式。

@decorate

defhouse()

:print

("毛坯房"

)

注意:這裡並沒有呼叫house函式,但是卻執行了decorate裡的一些步驟。

def

decorate

(func)

: a =

100print()

def():

func(

)print

("1111"

)print

("2222"

)print()

@decorate

defhouse()

:print

("毛坯房"

)print

(house)

帶引數的裝飾器:

def

decorate

(func)

: a =

100print()

def():

func(x)

print

(x)print

("1111"

)print

("2222"

)@decorate

defhouse

(n):

print

("毛坯房"

)house(

5)

def

decorate

(func)

: a =

100def

(*x)

: func(

*x)@decorate

defhouse

(x):

print

("house函式"

)for i in x:

print

(i)print

("house函式end"

)num =[1

,2,3

]house(num)

# house函式

# 1# 2

# 3# house函式end

在這裡func裡的變數也要加 * ,因為不加 * 表示的是乙個列表,列表不拆包的時候只能作為乙個形參傳遞進去。

注意當有多個裝飾器的時候先裝飾離函式最近的。

裝飾器的乙個應用:付款(非常簡陋):

import time

users =

dict()

# 定義乙個字典。

# 定義初始的使用者名稱密碼。

users[

"1234"]=

"123456"

users[

"12345"]=

"1234567"

islogin =

false

# 判斷是否登入,預設是沒有登入的。

# 登入頁面。

deflogin()

: username =

input

("輸入使用者名稱:"

) password =

input

("輸入密碼:"

)if users.get(username)

== password:

return

true

else

:return

false

# 定義乙個裝飾器,進行付款驗證。

deflogin_required

(func)

:def

(*args,

**kwargs)

:global islogin

while islogin ==

false

:# 跳轉登入頁面。

print

("未登入無法付款!"

) islogin = login(

) func(

*args,

**kwargs)

# 付款函式。

@login_required

defpay

(money)

:print

("正在付款中,付款金額是:{}元"

.format

(money)

)print

("付款中...."

) time.sleep(2)

print

("付款成功!"

)pay(

100000000

)# 未登入無法付款!

# 輸入使用者名稱:>? 1234

# 輸入密碼:>? 123456

# 正在付款中,付款金額是:100000000元

# 付款中....

# 付款成功!

pay(

8000

)# 正在付款中,付款金額是:8000元

# 付款中....

# 付款成功!

這裡可以很好地體現出裝飾器的作用,**一定要多實踐,寫完之後我就明白了為什麼要設定裝飾器這個東西了。裝飾函式的時候可以用在很多地方,比如說這個登入頁面,如果只是單純地在pay等使用它的函式上增加**,會造成**的重複,使程式就會變得非常複雜。比如說當我們要修改登陸驗證**的時候。會在各個地方修改,非常不好找。

作用域搜尋順序:legb

l:local本地,區域性變數。

e:encloseing巢狀。

g:global全域性變數。

b:built-in內建的。

b =

4deff(

):a =

1deff1(

):a =

3print

(a)print

(b)print

(max

) f1()f(

)# 3

# 4#

不知不覺已經學了123集了,希望能堅持下去,做自己熱愛的事業是人生最幸福的事情。

Python 10 操作檔案

開啟檔案,得到檔案的物件 控制代碼 通過檔案物件 控制代碼 操作檔案 儲存並關閉檔案 在 python中使用open 函式來操作檔案。開啟檔案,得到檔案控制代碼,並把乙個變數名分配給這個檔案控制代碼 變數名 open 檔案路徑 開啟模式 encoding 字元編碼 f obj open a.txt ...

python10 動態傳參

動態傳參 def chi food 可以傳入任意的位置引數,是任意,food就是形參的名字 print 我要吃 food 動態引數接收到的是tuple型別的資料 chi 蓋澆飯 辣條 麵條 列印的結果是我要吃 蓋澆飯 辣條 麵條 順序 先寫位置引數,再寫動態引數 最後是預設值引數,如果想修改預設值引...

python100例單詞 Python100例分享

摘要 下文通過示例的方式講述python中字串的判斷,如下所示 下文通過示例的方式講述,借助內建函式對字串是否為數字 字母 大寫 小寫 空白 首字母大寫等模式進行判斷 例 maomao365.com python 字串判斷的示例分享 測試例項一 print 例1 str maomao365.com ...