系統函數使用,自定義函數,函數的參數。html
1、系統函數python
Python內置不少函數供開發這調用,如abs()求絕對值。help()查看某個函數的使用等。函數
調用系統函數以下:網站
>>> help(abs) Help on built-in function abs in module builtins: abs(x, /) Return the absolute value of the argument. >>> >>> abs(-1) 1 >>>
以下是摘自官方網站一張系統函數表格:https://docs.python.org/3/library/functions.html#absui
2、自定義函數spa
在Python中定義一個函數須要用到Python中的關鍵字def定義語句。流程以下命令行
def 方法名(參數):code
方法體orm
return 返回值.htm
1 >>> def myMax(x, y): 2 ... if x > y: 3 ... return x 4 ... else: 5 ... return y 6 ... 7 >>> myMax(1,2) 8 2 9 >>>
第二行特別注意要縮進,而後不然會報錯,縮進規則第二行比第一行隨進一個單位或者更多<最好是一個,由於同級別的代碼塊須要保持一致,例如第四行>,對於第三行須要在第二行的基礎上再次縮進一個單位。這裏結束一個方法的編寫須要回車兩次。
而後直接在命令行調用聲明過的方法,驗證結果是否正確。函數這裏聲明的時候並未聲明返回值類型,因此這裏能夠任意,若是你不提供返回值也無所謂,系統本身會默認返回None。
1 >>> def myMax(x, y): 2 ... if x > y: 3 ... pass 4 ... 5 >>> myMax(1,2) 6 >>>
類導入
導入格式以下 from module_class_name
調用導入類中的方法
module_class_name.method_name().
方法導入
導入格式以下 from module_class_name import method_name
空函數<關鍵字pass>
空函數定義以下
>>> def empty():
... pass
...
>>>
pass做用僅僅是編譯不報錯,pass做爲方法體的一部分,若是不存在則程序語法就不完整編譯會失敗。
形參傳入非法類型
1 >>> def myMax(x, y): 2 ... if x > y: 3 ... return x 4 ... else : 5 ... return y 6 ... 7 >>> myMax('a', 'b') 8 'b' 9 >>> myMax('a', 2) 10 Traceback (most recent call last): 11 File "<stdin>", line 1, in <module> 12 File "<stdin>", line 2, in myMax 13 TypeError: '>' not supported between instances of 'str' and 'int' 14 >>>
聲明方法求最大值的方法,形參類型是整形,可是編譯器並不會爲咱們判斷出入的參數是否合法。第七行很我直接傳入的兩個不一樣的字符,很顯然在進行比較的時候轉換成對應的ASCII進行了比較,因此沒有任何問題。可是對於不一樣類型整形和字符則直接拋出類型錯誤。
一個方法返回多個值
>>> def multi(): ... return 1, 2, 3 ... >>> multi() (1, 2, 3) >>>
如上定義一個方法返回多個參數。其實本身觀察返回值會發現,返回的數據實際上是一個Tuple元組。那麼代碼是否是能夠這麼寫那?
>>> def multi(): ... return (1, 2, 3) ... >>> multi() (1, 2, 3) >>> >>> def multi(): ... return [1, 2, 3] ... >>> multi() [1, 2, 3] >>>
既然返回的結果仍是一個元組,那麼根據元組定義給返回值增長括號也是合理的,經驗證確實我們的猜測是合理的。
既然返回值能夠是元組,咱們猜測能夠是列表麼List,固然上邊代碼的執行結果告訴了咱們也是能夠的。對於數據而已方式包含了元組,列表,字典,集合。至於其餘的能夠本身動手驗證下。
3、函數參數
注:如上已經驗證了一個問題,編譯器並不會對形參類型進行編譯檢查,只有在執行的時候纔會觸發,直接拋出類型錯誤.
方法參數<形參>種類:
位置參數,默認參數,可變參數,命名關鍵字參數,關鍵字參數<形參排列順序>
位置參數:
位置參數就是方法使用過程當中正常聲明的形參,如empty(x),這裏x就是位置參數。
默認參數:
默認參數能夠當作是對位置參數的一種擴展,其目的是爲了傳入參數的簡化。
以下代碼:
1 >>> def enroll(name, age, sex='man'): 2 ... print('name:', name, " age:", age, ' sex:', sex) 3 ... 4 >>> enroll('ArMn', 25) 5 name: ArMn age: 25 sex: man 6 >>> enroll('Alice', 21, 'woman') 7 name: Alice age: 21 sex: woman 8 >>>
聲明方法學生登記方法,默認性別爲男性,在執行方法enroll的時候,能夠不傳入改字段,也能夠傳入該字段。
這裏有個問題,若是是多個默認參數的時候處理,假若有性別和民族,我想給民族傳入參數而且同時須要性別使用默認值怎麼辦???
1 >>> def enroll(name, age, sex='man', nation='han'): 2 ... print('name:', name, " age:", age, ' sex:', sex, ' nation:', nation) 3 ... 4 >>> enroll('ArMn', 25, nation='min') 5 name: ArMn age: 25 sex: man nation: min 6 >>>
這裏能夠經過默認參數傳值的另外一種方式形參名=形參值。這裏仍是簡單的兩種傳值方式。
可變參數
可變參數是能夠不指定具體傳入的參數類型和數量。例如需求求一組數據的和,這時候你並不知道傳入的參數的有多少。那麼可變參數就迎來了屬於他的春天。
1 >>> def sum(*array): 2 ... sum = 0 3 ... for single in array: 4 ... sum = sum + single 5 ... return sum 6 ... 7 >>> sum(1,2,3) 8 6 9 >>> sum(*[1,2]) 10 3 11 >>>
可變參數用標記*來表示。調用方式兩種直接傳入多個值,另外一中方式傳入一個列表,可是必須用標記*來標記,不然解析會失敗提示類型錯誤。
>>> def sum(*array): ... sum = 0 ... for single in array: ... sum = sum + single ... return sum ... >>> sum([1,2,3]) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 4, in sum TypeError: unsupported operand type(s) for +: 'int' and 'list'
關鍵字參數
關鍵字參數容許你傳入多個對應的key-value的值
關鍵字參數聲明**args,對比可變參數多了一個標記*。關鍵字參數會內部實現組裝該參數爲了一個字典dict<關鍵字參數容許傳入相似可變參數的多個形參>。具體看入下示例;
>>> def stu(name, age, **city): ... print('name:', name, ' age:', age,'city:', city) ... >>> stu('ArMn', 25, city='河南') name: ArMn age: 25 city: {'city': '河南'} >>>
定義方法學生,錄入學生姓名,年齡,以及所在城市<這裏採用的關鍵字參數代替>,能夠看大輸出的city中對應是一個字典dict,也就驗證瞭如上說到的內容。
>>> stu('ArMn', 25, city='河南', area='洛陽') name: ArMn age: 25 city: {'city': '河南', 'area': '洛陽'} >>>
如上是爲了驗證關鍵字參數是否支持傳入多個參數,輸出結果驗證了確實關鍵字參數用於可變參數的特性。那麼是否是擁有了關鍵字參數就不須要了可變參數了?固然不是,可變參數擦傳入的參數和關鍵字參數傳入的參數就格式上來講仍是存在很大差別。
命名關鍵字參數
命名關鍵字參數是對關鍵字參數的進一步的約束,能夠簡單理解爲讓關鍵字參數失去可變參數的特性。
聲明關鍵字*,格式method(args,*,args1,args2...);
1 >>> def stu(name, age, *,city,job): 2 ... print('name:',name, 'age:',age, 'city:',city,'job:',job) 3 ... 4 >>> stu('ArMn', 25, city='henan', job='dev') 5 name: ArMn age: 25 city: henan job: dev 6 >>> 7 >>> stu('ArMn', 25, city='henan', jo='dev') 8 Traceback (most recent call last): 9 File "<stdin>", line 1, in <module> 10 TypeError: stu() got an unexpected keyword argument 'jo' 11 >>>
第一行聲明一個包含了命名關鍵字的方法,從方法調用傳值上來看相似關鍵字參數,可是不一樣點是關鍵字參數最終會被封裝成字典dict,對於命名關鍵字而已最終顯示的結果等同於位置參數,而且命名關鍵字參數傳入的值正確的時候(第七行,job=>jo),則直接報類型錯誤。因此命名關鍵字有着key-value的嚴格要求。同時命名關鍵字不具有傳入多個可變參數的特性。
命名關鍵字參數的嚴格和可變參數特性的丟失。
1 >>> stu('ArMn', 25, city='henan', job='dev',other='') 2 Traceback (most recent call last): 3 File "<stdin>", line 1, in <module> 4 TypeError: stu() got an unexpected keyword argument 'other' 5 >>> 6 >>> stu('ArMn', 25, 'henan', dev') 7 File "<stdin>", line 1 8 stu('ArMn', 25, 'henan', dev') 9 ^ 10 SyntaxError: EOL while scanning string literal 11 >>>
可變參數和命名關鍵字
命名關鍵字前若是存在參數而且是可變參數其*能夠省略。
1 >>> def stu(name, age, *args,city,job): 2 ... print('name:',name,'age:',age,'args:',args,'city:',city,'job:',job) 3 ... 4 >>> 5 >>> 6 >>> stu('ArMn',25,*[1,2,4],city='henan',job='dev') 7 name: ArMn age: 25 args: (1, 2, 4) city: henan job: dev 8 >>>
最後重申下方法參數排列順序
位置參數->默認參數->可變參數->命名關鍵字參數->關鍵字參數