Python - Day6

廖雪峰

1.關(guān)鍵字參數(shù)

①可變參數(shù)允許你傳入0個或任意個參數(shù),這些可變參數(shù)在函數(shù)調(diào)用時自動組裝成一個tuple;而關(guān)鍵字參數(shù)允許你傳入0個或任意個含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動組裝成一個dict

key_parameter.png
2.命名關(guān)鍵字參數(shù)

①有什么用?

  • 限制關(guān)鍵字參數(shù)的名字。
沒加參數(shù)名.png
  • 注:調(diào)用時缺少參數(shù)名cityjob,Python解釋器把這4個參數(shù)均視為位置參數(shù),但person()函數(shù)僅能接收2個位置參數(shù)。
正確的命名關(guān)鍵字參數(shù).png
關(guān)鍵字不能是表達(dá)式.png

②命名關(guān)鍵字參數(shù)可以有缺省值(默認(rèn)值),從而簡化調(diào)用:

命名關(guān)鍵字參數(shù)可以設(shè)置默認(rèn)值從而簡化調(diào)用.png

③如果函數(shù)定義中已經(jīng)有了一個可變參數(shù),后面跟著的命名關(guān)鍵字參數(shù)就不需要一個特殊分隔符*(asterisk)

可選參數(shù)和關(guān)鍵字參數(shù)的組合可以省略一個asterisk.png
3.參數(shù)組合

①有哪幾種參數(shù)?

  • 必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù)

②參數(shù)定義的順序?

  • 必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、命名關(guān)鍵字參數(shù)和關(guān)鍵字參數(shù)。
必選參數(shù)默認(rèn)參數(shù).png

③神奇的tupledict

神奇的tuple和dict會自動補充.png
4.小結(jié)

①默認(rèn)參數(shù)一定要用不可變對象!

②注意可變參數(shù)和關(guān)鍵字參數(shù)的語句:

*args是可變參數(shù),args接收的是一個tuple;
**kw是關(guān)鍵字canshu,kw接收的是一個dict。

③調(diào)用函數(shù)時,如何傳入可變參數(shù)和關(guān)鍵字參數(shù)的語法?

  • 可變參數(shù)既可以直接傳入:func(1,2,3),又可以先組裝listtuple,再通過*args傳入:func(*(1,2,3))

  • 關(guān)鍵字參數(shù)既可以直接傳入:func(a=1,b=2),又可以先組裝dict,再通過**kw傳入:func(**{'a':1,'b':2})

5.遞歸函數(shù)

①是什么?

  • 一個函數(shù)在內(nèi)部調(diào)用自身。

②如何解決棧溢出?

  • 尾遞歸優(yōu)化。

③什么是尾遞歸優(yōu)化?

尾遞歸.png
6.Hanoi
hanoi.png
7.切片

① 存在的原因?

  • 因為我們經(jīng)常需要獲取一個listtuple的部分元素。

[]for ... in + rangeslice

slice.png

③支持倒數(shù)切片

slice中可為負(fù)值.png

④slice各種操作

slice一波操作.png

tuple也是一種list,唯一區(qū)別是tuple不可變。因此tuple也可以進(jìn)行切片操作,操作的結(jié)果仍是tuple。

對tuple進(jìn)行切片.png

⑥字符串也可以看成是一種list,每個元素就是一個字符。因此,字符串也可以使用切片操作,操作結(jié)果仍是字符串。

字符串也可以進(jìn)行切片操作.png
8.迭代

①是什么?

  • 當(dāng)使用for循環(huán)來遍歷整個listtuplestr時,這種遍歷我們叫做迭代。
迭代list.png

②只要是可迭代對象,無論有無下標(biāo),都可以迭代,比如dictset。

使用forIn迭代字典.png
  • 注意喔,這里還體現(xiàn)了代碼塊的執(zhí)行順序,hanoi
set可是可迭代對象.png
  • 兩種獲得dictvalue的方式
兩種獲得dict中value的方式.png

③如果我要同時迭代keyvalue怎么辦?

同時輸出dict中的key和value.png
  • 注意print()中的,逗號,就相當(dāng)于一個空格

④由于字符串也是可迭代對象,因此,也可作用域for循環(huán)

迭代字符串.png

⑤如何判斷一個對象是可迭代對象?

  • 通過collections模塊的Iterable類型判斷:
如何判斷一個對象是可迭代對象.png

Python內(nèi)置的enumerate()函數(shù)可以把一個list變成索引-元素對。

list的索引元素對.png
9.列表生成式(list comprehensions)

①是什么?

  • Python內(nèi)置的創(chuàng)建list的生成式。

②如果你要生成一個list[1,2,3,4,5]

range生成list.png

③如何生成[1,4,9,16,25]?

將list內(nèi)部的每個元素求平方.png

④簡潔的方法:

使用列表生成式.png

⑤還可以對輸出的數(shù)據(jù)進(jìn)行篩選,比如獲取偶數(shù)

篩選出偶數(shù).png
  • 注意:奇數(shù)的平方還是奇數(shù)

⑥還是使用兩層循環(huán),生成全排列

兩個for循環(huán)的組合成全排列.png

for循環(huán)可以同時使用兩個甚至更多變量。

for循環(huán)可以同時使用兩個甚至更多個變量.png

⑧使用列表生成式簡化

列表生成式使用兩個變量.png

⑨把一個list中所有字符變成大/小寫

把一個list中的所有字符串都變成大小寫.png

⑩如果一個list中既有字符串,也包含整數(shù),如何將其中的字符串全部轉(zhuǎn)換成小寫格式。

  • 解法1:
解法1.png
  • 解法2:
解法2.png
10.生成器(Generator)

①存在的原因?

  • 假如我們需要一個包含100萬個元素的列表,這會占據(jù)很大的內(nèi)存空間,如果我們僅僅需要訪問前面的幾個元素,那么后面絕大多數(shù)元素占用的空間都白白浪費了。

②如何創(chuàng)建一個生成器?

list和generator的區(qū)別.png
  • 創(chuàng)建lg的區(qū)別僅在于最外層的[]()。l是一個list,而g是一個generator

③如何打印generator中的數(shù)據(jù)。

打印生成器中的數(shù)據(jù).png

④如果沒有更多的元素時,拋出StopIteration的錯誤。

stopIteration.png

⑤注意generator也是可迭代對象喔:

generate對象是可迭代對象.png

⑥既然是可迭代對象,也就可以用for循環(huán)

既然是可迭代對象就可以使用for循環(huán).png
11.fib
fib.png

①用for循環(huán)遍歷generator函數(shù)存在一個問題:

  • 獲取不到return語句的返回值。
獲取generator中的return數(shù)據(jù).png
12.生成器之楊輝三角形 range(len(L)) + 列表生成式 的強大力量
楊輝三角形.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容