首頁  >  文章  >  後端開發  >  python中函數賦值給變數時的問題注意詳解

python中函數賦值給變數時的問題注意詳解

黄舟
黄舟原創
2017-08-20 10:50:572176瀏覽

變數賦值是我們在日常開發中經常會遇到的一個問題,以下這篇文章主要給大家介紹了關於python中將函數賦值給變數時需要注意的一些問題,文中透過範例程式碼介紹的非常詳細,對大家有一定的參考學習價值,需要的朋友們下面來一起看看吧。

前言

本文主要給大家介紹的是python將函數賦值給變數時需要注意的一些問題,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹:

看過兩種函數賦值給變數的形式,一種是


##

a=f

另一種是


a=f()

這兩種形式是有區別的,分別總結一下。

1.a=f型別屬於將變數指向函數。

用程式碼驗證一下:


>>> f = abs
>>> f(-10)
10

說明變數f現在已經指向了abs函數本身。直接呼叫

abs()函數和呼叫變數f()完全相同。這是廖雪峰老師python教程上的例子,現在呼叫f()和呼叫abs()是一樣的了。

再舉一個工廠函數的例子:


def maker(N):

  def action(X):

    return X**N

  return action

這個巢狀函數的外層回傳值為內層函數的函數名,注意沒有括號,這裡有無括號是有很大的差別。此時呼叫外部函數:


f=maker(2)

那麼如上所述,f便指向了action函數,且限制條件為N=2,可以理解為f為N等於2時的action函數。我們來呼叫它:


>>> f(3)
9

證明f和action函式是一樣的。

2.a=f()型屬於將f()的回傳值賦值給a的過程

這裡的a僅僅接收

f()的回傳值,如果f()沒有回傳值,那麼a即被賦值為None。這裡值得注意的一點是,在a=f()的執行過程中,f()會運行一次,這也是我剛剛搞懂的,如:


>>> def add(x,y):
    z=x+y
    print(z)
>>>a=add(3,4)
7

這裡雖然只有一個賦值語句執行了,但是卻輸出了結果7,說明賦值過程函數add執行了,然而a的值為None,且只能透過print語句才可以顯示。不只是賦值過程函數會執行,寫在return語句中也會如此。


>>>def log(func):
   def wrapper(*args, **kw):
     print('call %s():' % func.__name__)
     return func(*args, **kw)
   return wrapper
>>>@log
>>>def now():
    print('2015-3-25')

這是廖雪峰老師python教程裝飾器一節的例程,剛開始我以為

return func(*args,**kw)這個語句是傳回了now()函數(即func函數)的回傳值,後來發現now函數沒有回傳值,也就是為None,所以其實是這個語句在賦值過程,

 func(*args,**kw)執行了,也就是函數now的print語句執行了。

下面的習題中,一個變形是要求在函數呼叫的前後印出'begin call'和'end call',下面一位網友的程式是這麼寫的:


def wrapper(*args,**kw):
   print(t+'begin call')
   result=func(*args,**kw)
   print(t+'end call')
   return result

開始不太理解為什麼使用

result=func(*args,**kw)這句,後來理解後才明白其實賦值本身並沒有意義,只是這句話同時使得func函數運行了,所以寫成


def wrapper(*args,**kw):
   print(t+'begin call')
   func(*args,**kw)
   print(t+'end call')

結果也是一樣的。

總結#

以上是python中函數賦值給變數時的問題注意詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn