這是裝飾器的簡單用法。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了武宣免費建站歡迎大家使用!
第10行的作用就是相當(dāng)于插入了一條語句:
hello=simple_ decorator(hello)
那現(xiàn)在的hello就是調(diào)用simple_ decorator函數(shù)并傳遞第10行下面的hello函數(shù)作為參數(shù)的返回值,即現(xiàn)在的hello成了simple_ decorator函數(shù)中定義的wrapper了,而真正的hello成了wrapper可以訪問的外部函數(shù)simple_ decorator的參數(shù)f。
所以,調(diào)用hello就是調(diào)用的wrapper,而wrapper函數(shù)中對f()的訪問是訪問的原來的hello函數(shù)。
所以輸出就是那樣了。
1、map
map()函數(shù)接受兩個參數(shù),一個是函數(shù),一個是Iterable,map將傳入的函數(shù)依次作用到序列的每一個元素上,并把結(jié)果作為新的Iterator返回。
舉例,比如我們有一個函數(shù)f(x)=x*2,要把這個函數(shù)作用在一個list[1, 2, 3, 4, 5, 6, 7, 8,
9]上,就可以用map()實現(xiàn)。
def f(x):
... return x*2
...
r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
list(r)
[2, 4, 6, 8, 10, 12, 14, 16, 18]
所以,map()作為高階函數(shù),事實上它把運算規(guī)則抽象了,因此,我們不但可以計算簡單的f(x)=x*2,還可以計算任意復(fù)雜的函數(shù),比如把這個list所有的數(shù)字轉(zhuǎn)為字符串:
list(map(str,[1, 2, 3, 4, 5, 6, 7, 8, 9]))
["1", "2", "3", "4", "5", "6", "7", "8", "9"]
2、reduce
reduce是把一個函數(shù)作用在一個序列[x1, x2,
x3……]上,這個函數(shù)必須接收兩個參數(shù),reduce把結(jié)果繼續(xù)和序列的下一個元素做累計計算。簡單來說,就是先計算x1和x2的結(jié)果,再拿結(jié)果與x3計算,依次類推。比如說一個序列求和,就可以用reduce實現(xiàn)。
from functools import reduce
def add(x, y):
... return x + y
...
reduce(add, [1, 3, 5, 7, 9])
25
也就是說,假設(shè)python沒有提供int()函數(shù),你完全可以自己寫一個把字符串轉(zhuǎn)化為整數(shù)的函數(shù),而且只需要幾行代碼。
3、filter
用于過濾序列,和map函數(shù)類似,filter也接收一個函數(shù)和一個序列,不同于map的是,filter把傳入的函數(shù)依次作用于每一個元素,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素,例如,在一個list中,刪掉偶數(shù),只保留奇數(shù),可以這么寫:
def is_odd(n):
return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 結(jié)果: [1, 5, 9, 15]
把一個序列中的空字符串刪掉,可以這么寫:
def not_empty(s):
return s and s.strip()
list(filter(not_empty, ["A", "", "B", None, "C", " "]))
# 結(jié)果: ["A", "B", "C"]
可見用filter()這個高階函數(shù),關(guān)鍵在于正確實現(xiàn)一個篩選函數(shù)。
4、sorted
無論冒泡排序還是快速排序,排序的核心是比較兩個元素的大小。如果是數(shù)字,我們可以直接比較,但如果是字符串或者兩個dict呢?直接比較數(shù)學(xué)上的大小是沒有意義的,因此,比較的過程必須通過函數(shù)抽象出來,Python內(nèi)置的sorted()函數(shù)就可以對list進行排序:
sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]
此外,sorted()函數(shù)也是一個高階函數(shù),它還可以接收一個key函數(shù)來實現(xiàn)自定義的排序,例如按絕對值大小排序:
sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
python中的函數(shù)可以返回值,也可不返回值,如果不返回值,則默認會返回None
def f(j) 里面的j實際上是個形參,調(diào)用的時候可以被任何實參給賦值,r = f(i)其實就是在這個循環(huán)里調(diào)用f()這個函數(shù),其實等價與for i in range(1,4): r = i*i,而函數(shù) f(1)返回的就是1*1。
def?cmp(num):
return?int(abs(num))?==?num?
while(1):
print(cmp(input("num:???")))
def f(n):
if n 2 or n == 4:
? return False
elif n == 2 or n == 3 or n == 5:
? return True
for i in range(2, int(n/2)+1):
? if n % i == 0:
? ? ? return False
return True
n = int(input('請輸入一個數(shù)字:'))
if f(n):
print('是質(zhì)數(shù)')
else:
print('不是質(zhì)數(shù)')