目錄
三元運算符
裝飾器
一切皆對象
在函數中定義函數
三元運算符通常在Python裡被稱為條件表達式,這些表達式基於真(true)/假(not)的條件判斷,在Python 2.4以上才有了三元操作。
下面是一個偽代碼和例子:
偽代碼:
#如果條件為真,返回真 否則返回假
condition_is_true if condition else condition_is_false
例子:
is_fat = True
state = "fat" if is_fat else "not fat"
它允許用簡單的一行快速判斷,而不是使用復雜的多行if語句。 這在大多數時候非常有用,而且可以使代碼簡單可維護。
另一個晦澀一點的用法比較少見,它使用了元組,請繼續看:
偽代碼:
#(返回假,返回真)[真或假]
(if_test_is_false, if_test_is_true)[test]
例子:
fat = True
fitness = ("skinny", "fat")[fat]
print("Ali is ", fitness)
#輸出: Ali is fat
這之所以能正常工作,是因為在Python中,True等於1,而False等於0,這就相當於在元組中使用0和1來選取數據。
上面的例子沒有被廣泛使用,而且Python玩家一般不喜歡那樣,因為沒有Python味兒(Pythonic)。這樣的用法很容易把真正的數據與true/false弄混。
另外一個不使用元組條件表達式的緣故是因為在元組中會把兩個條件都執行,而if-else的條件表達式不會這樣。
例如:
condition = True
print(2 if condition else 1/0)
#輸出: 2
print((1/0, 2)[condition])
#輸出ZeroDivisionError異常
這是因為在元組中是先建數據,然後用True(1)/False(0)來索引到數據。 而if-else條件表達式遵循普通的if-else邏輯樹, 因此,如果邏輯中的條件異常,或者是重計算型(計算較久)的情況下,最好盡量避免使用元組條件表達式。
裝飾器(Decorators)是Python的一個重要部分。簡單地說:他們是修改其他函數的功能的函數。他們有助於讓我們的代碼更簡短,也更Pythonic(Python范兒)。大多數初學者不知道在哪兒使用它們,所以我將要分享下,哪些區域裡裝飾器可以讓你的代碼更簡潔。
首先,讓我們討論下如何寫你自己的裝飾器。
這可能是最難掌握的概念之一。我們每次只討論一個步驟,這樣你能完全理解它。
首先我們來理解下Python中的函數
def hi(name="yasoob"):
return "hi " + name
print(hi())
# output: 'hi yasoob'
# 我們甚至可以將一個函數賦值給一個變量,比如
greet = hi
# 我們這裡沒有在使用小括號,因為我們並不是在調用hi函數
# 而是在將它放在greet變量裡頭。我們嘗試運行下這個
print(greet())
# output: 'hi yasoob'
# 如果我們刪掉舊的hi函數,看看會發生什麼!
del hi
print(hi())
#outputs: NameError
print(greet())
#outputs: 'hi yasoob'
剛才那些就是函數的基本知識了。我們來讓你的知識更進一步。在Python中我們可以在一個函數中定義另一個函數:
def hi(name="yasoob"):
print("now you are inside the hi() function")
def greet():
return "now you are in the greet() function"
def welcome():
return "now you are in the welcome() function"
print(greet())
print(welcome())
print("now you are back in the hi() function")
hi()
#output:now you are inside the hi() function
# now you are in the greet() function
# now you are in the welcome() function
# now you are back in the hi() function
# 上面展示了無論何時你調用hi(), greet()和welcome()將會同時被調用。
# 然後greet()和welcome()函數在hi()函數之外是不能訪問的,比如:
greet()
#outputs: NameError: name 'greet' is not defined
那現在我們知道了可以在函數中定義另外的函數。也就是說:我們可以創建嵌套的函數。
現在你需要再多學一點,就是函數也能返回函數。