python學習筆記2
學習廖雪峰的官方網站https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
6 函數
函數名其實就是指向一個函數對象的引用,完全可以把函數名賦給一個變量,相當於給這個函數起了一個“別名”。
函數名其實就是指向函數的變量,也可把函數作為參數傳入,這樣的函數稱為高階函數。
在Python中,定義一個函數要使用def語句,依次寫出函數名、括號、括號中的參數和冒號:,然後,在縮進塊中編寫函數體,函數的返回值用return語句返回。
pass可以用來作為占位符,比如現在還沒想好怎麽寫函數的代碼,就可以先放一個pass,讓代碼能運行起來。
Python的函數返回多值其實就是返回一個tuple, 而多個變量可以同時接收一個tuple,按位置賦給對應的值。
def mine(x,y):
if not isinstance(x, (int, float)): #數據類型檢查
print(‘ERROR‘)
else:
n=str(x)
m=y*2
return m,n
7 函數的參數
(1) 位置參數:傳入的值按照位置順序傳入
(2) 默認參數:默認參數必須指向不變對象
(3) 可變參數:傳入的參數個數是可變的 def calc(*numbers):
numbers可以把多個參數,作為tuple
calc(*a)
(4) 關鍵字參數:而關鍵字參數允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝為一個dict。
def person(name, age, **kw):
person(‘Bob‘, 35, city=‘Beijing‘)
也可以先組裝出一個dict,然後,把該dict轉換為關鍵字參數傳進去: extra = {‘city‘: ‘B‘, ‘job‘: ‘E‘}
person(‘Jack‘, 24, **extra)
(5) 命名關鍵字參數:如果要限制關鍵字參數的名字,就可以用命名關鍵字參數,例如,只接收city和job作為關鍵字參數。
def person(name, age, *, city, job):
和關鍵字參數**kw不同,命名關鍵字參數需要一個特殊分隔符*
,*
後面的參數被視為命名關鍵字參數。
命名關鍵字參數可以有缺省值,從而簡化調用。 如果函數定義中已經有了一個可變參數,後面跟著的命名關鍵字參數就不再需要一個特殊分隔符*了。
參數定義的順序必須是:必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。
8 高級特性
(1) 切片,L[a:b:c],包含a但不包含b, c是間隔。
(2) 列表生成式,把要生成的元素x * x放到前面,後面跟for循環, 可以加上if判斷, 還可以使用兩層循環 [x*x for x in range(1,10) if x%2==0]
(3) generator,循環的過程中不斷推算出後續的元素 g = (x * x for x in range(10))
通過next()函數獲得generator的下一個返回值generator也是可叠代對象,可以用for循環。
如果一個函數定義中包含yield關鍵字,那麽這個函數就不再是一個普通函數,而是一個generator。
函數是順序執行,遇到return語句或者最後一行函數語句就返回。
而變成generator的函數,在每次調用next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。
直到最後拋出StopIteration
錯誤表示無法繼續返回下一個值了。
(4) Iterator, 可以被next()函數調用並不斷返回下一個值的對象稱為叠代器 可以使用isinstance()判斷一個對象是否是Iterator
from collections import Iterator
isinstance((x for x in range(10)), Iterator)
凡是可作用於for循環的對象都是Iterable類型; 凡是可作用於next()函數的對象都是Iterator類型,它們表示一個惰性計算的序列;
集合數據類型如list、dict、str等是Iterable但不是Iterator,不過可以通過iter()函數獲得一個Iterator對象。
python學習筆記2