2019 5 3 學不進去,該睡覺了? 高階函式

2021-09-24 08:23:40 字數 2933 閱讀 8648

舒巨佬去河南浪去啦,真羨慕呀,趴在自習室一上午了,困困困。。。。。。但願今兒個能完成任務吧

分享自《流暢的python》

接受函式為引數,或者把函式作為結果返回的函式是高階函式(high-order function)。map函式就是一例,此外,內建函式sorted()也是: 可選的key引數用於提供乙個函式,它會應用到各個元素上排序。

例如,若想根據單詞的長度排序,只需把len函式傳給key引數,例項如下:

>>> sorted(fruits, key=len)

複製**

任何單引數函式都能作為key的引數的值。例如,為了建立押韻詞典,可以把各個單詞反過來拼寫,然後排序。注意,以下例項中列表裡的單詞沒有變,我們只是把反向拼寫當作排序條件,因而,各種漿果(berry)都排在一起。

>>> 

defreverse

(word):

...

return word[::-1]

>>> reverse('testing')

'gnitset'

>>> sorted(fruits,key=reverse)

>>>

# 這個例子很令我吃驚呀,我一直以為key=reverse是它的可選引數之一呢,原來是傳遞了函式物件

複製**

mapfilterreduce這三個高階函式還能看到,不過多數使用場景下都有更好的替代品。

函式式語言通常會提供mapfilterreduce三個高階函式(有時使用不同名稱)。在python3mapfilter內建函式,但由於引入列表推導生成器表示式他們便沒那麼重要了。列表推導或是生成器表示式具有mapfilter兩個函式的功能,而且更易於閱讀,示例如下:

(這是接下來用到的函式fact,我的上篇日記中有寫)

>>> 

deffactorial

(n):

# 這是乙個控制台會話,因此在「執行時」建立乙個函式

...

'''return n!'''

...

return

1if n<2

else n * factorial(n-1)

>>> fact = factorial

複製**

>>> list(map(fact, range(6)))               # 構建0!到 5!的乙個階乘列表

[1, 1, 2, 6, 24, 120]

>>> [fact(n) for n in range(6)] # 使用列表推導執行相同的操作

[1, 1, 2, 6, 24, 120]

>>>

# 使用map和filter計算知道5!的奇數階乘列表

>>> list(map(fctorial, filter(lambda n:n%2, range(6))))

[1, 6, 120]

>>>

# 使用列表推導做相同的工作,換掉map和filter,避免使用lambda表示式

>>> [factorial(n) for n in range(6) if n % 2]

複製**

python3中,mapfilter返回生成器(一種迭代器),因而現在它們的直接替代品是生成器表示式(python2中,這兩個函式返回列表,因此最接近的替代品是列表推導)。

python2中,reduce是內建函式,但在python2.3開始,最好使用內建的sum函式,在可讀性和效能方面,這是一項重大改善!示例如下:

>>> 致敬高斯,哈哈!

>>>

from functools import reduce # python3起,reduce不再是內建函式了

>>>

from operator import add # 匯入add,以免建立乙個用來求兩數之和的函式

>>> reduce(add, range(100)) # 計算0到99之和

4950

>>> sum(range(100)) # 使用sum做相同的求和;無需匯入或建立求和函式

4950

複製**

sumreduce的通用思想是把某個操作連續應用到序列的元素上,累計之前的結果,把一系列值歸約成乙個值

allany也是內建的歸約函式。

>>> all(iterable)

>>>

# 如果iterable的每個元素都是真值,返回true;但是all()返回true

>>> any(iterable)

>>>

# 只要iterable中有元素是真值,就返回true;但是any()返回false

複製**

為了使用高階函式,有時建立一次性的小型函式更加便利,這邊是匿名函式存在的原因——明兒的日記!

Scanner輸入不進去

system.out.println 輸入年齡 int a sc.nextint system.out.println 姓名 string b sc.nextline system.out.println 性別 string c sc.nextline 上面這樣寫會出錯,年齡之後的無法輸入 解決辦法...

vsftpd安裝好後用root登入不進去

在虛擬機器上裝了vsftpd並開啟了服務後,嘗試從本上上面ftp上去,用root賬戶和密碼登入提示錯誤 name 192.168.211.100 answer root 331 please specify the password.password 530 login incorrect.ftp ...

多執行緒Spring注入注不進去問題

在用多執行緒的時候,裡面要用到spring注入服務層,或者是邏輯層的時候,一般是注入不進去的。具體原因應該是執行緒啟動時沒有用到spring例項不池。所以注入的變數值都為null。沒有乙個技術是完美的,不要為了spring而spring。不要為了注入而注入.像下面這樣,問題就解決了。private ...