舒巨佬去河南浪去啦,真羨慕呀,趴在自習室一上午了,困困困。。。。。。但願今兒個能完成任務吧
分享自《流暢的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是它的可選引數之一呢,原來是傳遞了函式物件
複製**
map
、filter
和reduce
這三個高階函式還能看到,不過多數使用場景下都有更好的替代品。
函式式語言通常會提供map
、filter
和reduce
三個高階函式(有時使用不同名稱)。在python3
中map
和filter
是內建函式,但由於引入列表推導和生成器表示式他們便沒那麼重要了。列表推導或是生成器表示式具有map
和filter
兩個函式的功能,而且更易於閱讀,示例如下:
(這是接下來用到的函式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
中,map
和filter
返回生成器(一種迭代器),因而現在它們的直接替代品是生成器表示式(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
複製**
sum
和reduce
的通用思想是把某個操作連續應用到序列的元素上,累計之前的結果,把一系列值歸約成乙個值。
all
和any
也是內建的歸約函式。
>>> 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 ...