摘要:迭代器可以直接作用于循環的對象統稱為可迭代對象。可以被函數調用并不斷返回下一個值的對象稱為迭代器。這個高階函數,關鍵在于正確實現一個篩選函數。
又是日常嘮嗑的一小段
真的是非常話嘮的在下,日常給自己打點雞血吧。
昨晚和老媽聊了一整晚,所以昨天并沒有更新。
然后因為很快要開始算個稅減免的部分,對于溫飽線的在下而言,其實減免的可能就只是奶茶錢吧。
工作的本質是賺錢,我也很想在30歲之前完成財務自由。
所以要更加努力的賺錢錢,想變成自由職業者(我媽最看不上的那種),然后盡可能的獨立吧。無論是財務還是心理,還是有點太軟弱了。
當你覺得辛苦的時候,那就是你在變好的時候!
列表生成式上一次學到Python的高級特性,迭代不同于其他語言的for循環中的下標循環。雖然python也提供了相應的方式,但是精簡才是python的精髓。
列表生成式即List Comprehensions,是Python內置的非常簡單卻強大的可以用來創建list的生成式。
列表生成式-->將生成式放在for循環前,然后for循環之后還可以加入if判斷(真的是相當的簡單粗暴了,是一個用方括號的朋友,畢竟是可以從一個list到另一個list。
原來需要用循環處理的問題,現在用一句簡單的生成式代碼解決。
看廖大神的例子,還可以雙重循環,可以生成全排列。
[m + n for m in "ABC" for n in "XYZ"] ["AX", "AY", "AZ", "BX", "BY", "BZ", "CX", "CY", "CZ"]
for循環其實可以同時使用兩個甚至多個變量,比如dict的items()可以同時迭代key和value
列表生成式也可以使用兩個變量來生成list
做個作業
生成器在Python中,這種一邊循環一邊計算的機制,稱為生成器:generator。
這樣就不必創建完整的list,從而節省大量的空間。
創建生成器的辦法有很多。
把列表生成的[]改成(),就創建了一個generator。
如果要打印g的內容,只能用next()函數,獲得下一次的返回值。
generator保存的是算法,每次調用next(g),就計算出g的下一個元素的值,直到計算到最后一個元素,沒有更多的元素時,拋出StopIteration的錯誤。
但是正常來說,我們還是使用for循環來進行打印,這樣不需要調用next()函數,也不需要關心StopInteration的錯誤。
generator非常強大。如果推算的算法比較復雜,用類似列表生成式的for循環無法實現的時候,還可以用函數來實現。
比如,斐波那契數列(我還挺喜歡這個名字的,蜜汁...)
def fib(max): n, a, b = 0, 0, 1 while n < max: print(b) a, b = b, a + b n = n + 1 return "done" #用函數進行打印
此處的賦值語句要注意。
a, b = b, a + b
相當于
t = (b, a + b) # t是一個tuple a = t[0] b = t[1]
不必顯式寫出臨時變量t就可以賦值。
此處的fib()函數邏輯非常類似generator,此時將print(b)改成yield b就可以把函數變成生成器。
yield關鍵詞很重要,是變成generator的關鍵。
generator和函數的執行流程不一樣。函數是順序執行,遇到return語句或者最后一行函數語句就返回。而變成generator的函數,在每次調用next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。
楊輝三角的作業后面補上,算法真的是硬傷。
迭代器可以直接作用于for循環的對象統稱為可迭代對象:Iterable。
一類是集合數據類型,如list、tuple、dict、set、str等;
一類是generator,包括生成器和帶yield的generator function。
可以使用isinstance()判斷一個對象是否是Iterable對象。
生成器不但可以作用于for循環,還可以被next()函數不斷調用并返回下一個值,直到最后拋出StopIteration錯誤表示無法繼續返回下一個值了。
可以被next()函數調用并不斷返回下一個值的對象稱為迭代器:Iterator。
生成器都是Iterator對象,但list、dict、str雖然是Iterable,卻不是Iterator。
把list、dict、str等Iterable變成Iterator可以使用iter()函數。
這一章節,emmm,很多概念性的東西。但是還是很厲害的,Iterator的數據流是有序的,但是可能是無限的。對于list而言,不太可能存儲無限的數據。
函數式編程又開始新的大章節啦,因為落后了好幾天的進度,所以一定要抓緊學習啦~
高階函數Higher-order function變量可以指向函數
一般而言,abs()是函數,abs(1)是函數調用。
我們常常使用 b = abs(1) 將函數結果賦給變量,但是如下
b = abs
則是將函數賦給變量,這個是可行的。
且變量指向了函數之后,可以使用變量來調用函數。
函數名也是變量
所以在設定變量賦值的時候,要注意不要覆蓋了函數名
傳入函數
函數可以接收另一個函數做為參數,這種函數稱為高階函數
【十分的抽象了!】
map()和reduce()是倆Python的內建函數。
map()
map()接收兩個參數,一個是函數,一個是Iterable,map()將傳入的函數一次作用到序列的每個元素,并將結果做為Iterator 返回。
**雖然循環也可以完成map()的操作,但是map()可以方便看清運算的需求。
map()僅僅用一行代碼,就完成了復雜的運算。
reduce()
reduce()把一個函數作用在一個序列上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算
計算效果就是
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)fliter
Python內建的filter()函數用于過濾序列。
filter()這個高階函數,關鍵在于正確實現一個“篩選”函數。
下面是廖大神的關于素數的示范
其中輸出結果是無序數列,所以要有一定限制條件。
輸出的Iterator是惰性計算的數列,所以可以簡潔的輸出全體素數,自然數等。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42886.html
摘要:給定的字符串只含有小寫英文字母,并且長度不超過。其他這題了,要重做看了其他的人的題解,使用的是無限逼近中位值的辦法,理論基礎應該是泰勒公式。萬萬沒想到居然用到了泰勒公式手工執行了下算法,反而理解的更快,但是泰勒公式還得再復習下。 寫在前面的話 今天持續做題ing,python有意思~今天的題有點虐心...興許是我太笨了...會努力學習的!動態規劃我來啦~ 開始做題 第一題 459. 重...
摘要:好久不見最近都在忙年底的年會,還沉迷于學習統計學,教程還停留在基礎語法。做題做題無論如何,數據結構還是很重要的,所以準備每天刷的題目啦。第一題移除元素給定一個數組和一個值,你需要原地移除所有數值等于的元素,返回移除后數組的新長度。 好久不見 最近都在忙年底的年會,還沉迷于學習統計學,python教程還停留在基礎語法。但是仔細規劃了下,還是要好好的瞄準目標前行。所以準備呢,實戰走起來。 ...
摘要:新年快樂年終于來了,突然覺得有點如釋重負。大概年實在是太沉重了吧。年應該是要充滿拼勁的一年希望可以成功轉型自己喜歡的職業。開始認真學習了雞血一波。建議類的屬性名和實例屬性名不要重復,否則類的屬性名會覆蓋。 新年快樂 2019年終于來了,突然覺得有點如釋重負。大概2018年實在是太沉重了吧。2019年應該是要充滿拼勁的一年!!!!希望可以成功轉型自己喜歡的職業。 開始認真學習了 雞血一波...
摘要:屬性,可以函數的名字在代碼運行期間動態增加功能的方式,稱之為裝飾器。本質上,就是一個返回函數的高階函數。比如,定義一個能打印日志的。接受函數作為參數,要放置在函數定義處。一個完整的的代碼如下記錄的是傳入的的值,位置在嵌套內或者帶參數的如下。 又是一段叨叨 如果總是擔心能不能做到的話,那就干脆不要做了。想做的事情還是一往無前的好,什么都不想,就努力沖沖沖吧! 裝飾器 因為函數是一個對象。...
摘要:例如做累加,函數生成整數序列,函數轉換成。因為不能重復,所以中沒有重復的。創建,需要提供一個作為輸入合集。重復元素在中自動被過濾。添加元素,重復添加無效果刪除元素 寫在前面的一點羅里吧嗦小嘮叨昨晚的python看到了快12點吧,然后進度相對來說還算滿意,只能說一點點推進,慶幸自己的大學還是一個比較認真的小碼農,現在撿起來還算比較得心應手(pia飛自己,算法什么的還沒到好嗎!)好好學習唄...
閱讀 1882·2021-09-24 09:48
閱讀 3228·2021-08-26 14:14
閱讀 1684·2021-08-20 09:36
閱讀 1471·2019-08-30 15:55
閱讀 3633·2019-08-26 17:15
閱讀 1431·2019-08-26 12:09
閱讀 610·2019-08-26 11:59
閱讀 3329·2019-08-26 11:57