是的,我是想到什麼知識點就說什麼,沒有固定的主題,我的標題都是在寫完博客再給的。本篇博文說說列表進階話題。其實列表應該是比較熟悉的了,而毫不誇張的說,在實際的開發中,列表也是使用的最多的,以後你會體會到我說的這句話的。 列表解析 1.什麼是列表解析: 根據已有列表,高效生成新列表的方式,還有另一個叫 ...
是的,我是想到什麼知識點就說什麼,沒有固定的主題,我的標題都是在寫完博客再給的。本篇博文說說列表進階話題。其實列表應該是比較熟悉的了,而毫不誇張的說,在實際的開發中,列表也是使用的最多的,以後你會體會到我說的這句話的。
列表解析
1.什麼是列表解析:
根據已有列表,高效生成新列表的方式,還有另一個叫法是叫列表推導式
2.作用:
列表解析是python迭代機制的一種應用,它常用於實現創建新的列表,因此要放置在列表中
3.格式:
[expr for iter in iterable]
4.實際運用:
例題:返回1到10的所有數的平方:
註意:我使用的的是python2,如果你是用的是python3,需要加括弧的,還有,列表解析是用的使用中括弧,不是小括弧
是不是很簡單的就生成了我們想要的結果?
這裡用到一個內置函數range(),前面提到沒有我也忘了(是的,我也有任性的時候/滑稽),在這裡詳細講解一下:
range([start,] stop[,step=1]):中括弧表示這兩參數可選,Step=1表示第三個參數的值預設值是1
range這bif(內置函數)的作用是生成一個從start參數的值開始到stop參數的值結束的數字序列
例:
由這個例子得到一個知識點,註意:range函數,第二個參數不包括其中,預設從0開始(是不是有點像索引)
也可以和切片一樣添加步長來返回:
好,我想你已經對列表解析有個大概瞭解了,再看一個列子:
返回1到10的所有偶數:
註意:列表解析,整個過程中,每一小段代碼不用冒號或者逗號隔開,直接是空格隔開
再看幾個綜合練習題:
1).用列表解析生成100內的大於20的偶數(請用兩種寫法)
2).用列表解析生成100內的大於20的偶數的平方
3).用列表解析輸出結果:[1 love python,2 love python,3 love python,.... 10 love python]
4).用列表解析的方法返回某一磁碟路徑下相同尾碼名文件組成的列表
這裡使用了os模塊和字元串的endswith方法,os模塊後面會解析
好,列表解析完了,其實很簡單對不對?
列表生成器
1.什麼是列表生成器:
概念和列表解析差不多,根據已有列表,以生成器的方式生成一個列表。生成器是迭代器的一種實現
2.作用:
返回一個生成器對象,並不真正創建列表
3.格式:
(expr for iter in iterable)
4.實際運用:
例題:返回1到10的所有數的平方:
是的,我想你應該看出列表生成器和列表解析的不同了
註意:
1.列表生成器使用的是小括弧,列表解析是用的是中括弧哦
2.列表生成器不能直接輸出,換句話生成器對象不能直接輸出
3.如果要輸出,則必須使用生成器對象的next()方法一一返回
4.當生成器對象返回完則會報錯
說到列表生成器,那不得不提到生成器關鍵詞—yield
yield:是為在函數內使用的生成器語法,一旦程式里有yield,則被定義為生成器
例:
這裡使用了自定義函數的語法,姑且不管,後面會詳解。因為知識都是相連的,所以避免不了穿插後面的知識。
發現沒?使用yield關鍵詞就會把函數變為一個生成器對象
其實說道生成器和列表解析,就和range()函數與xrange()函數一樣
range()函數前面說了,不再解釋。xrange每次返回一個數值,和range不同
例:
綜合實例:
有沒有發現,哎,這啥情況對吧?怎麼next方法不頂用了,老師返回1啊,其實不是,是因為:
列表生成器一次知返回一個值,由於不能多次調用生成器,一位內每調用一次,記憶體ID就會變化一次,所以,一般賦值給另一變數來進行一一返回
列表解析和列表生成器綜合使用
1.列表解析功能強大,但很占用資源,列表生成器只返回一個值,但占用小,所以酌情選擇
2.例:用生成器和解析結合實現1到10的平方數除以2的結果:
註意:在這裡外層和內層的i的引用,其實並不衝突的,但儘量少用,有些地方是有衝突的
3.生成器也可以轉換為列表:
4.例
好,列表進階話題完結,留下幾個課後練習自己練習
課後作業:
1.使用列表解析輸出結果:[(0,0),(0,2),(2,0),(2,2)]
2.使用列表生成器列印斐波那契數列
3.使用列表解析生成列表[1x2,3x4,5x6,7x8,…,99x100]
4.利用3層for迴圈的列表生成式,找出對稱的3位數,例如:121等從左到右從又到左還是原來的對稱數
5.編寫一個函數,它接受一個list,然後把list中的所有字元串變成大寫後返回,非字元串元素將被忽略