七、函式
def printName(name):
print('my name is ' + name)
1、引數
(1) 形參、實參
略
(2) 關鍵字引數
在引數比較多時,如果實參的順序與形參不同,沒有一一對應,那么函式就會發生錯誤,所以我們就可以用關鍵字引數來避免這個問題
def makeSentence(sub, pre, obj):
'''
sub為主語
pre為謂語
obj為賓語
函式的作用是把主謂賓連成一句話
'''
print(sub + ' ' + pre + ' ' + obj)
makeSentence('I', 'eat', 'food')
輸出結果:I eat food
=========================================
makeSentence('eat', 'food', 'I') #如果實參順序錯誤
輸出結果:eat food I #結果出錯
=========================================
makeSentence(pre='eat', obj='food', sub='I') #使用關鍵字引數
輸出結果:I eat food #結果正確
(3) 默認引數
在定義函式形參時,可以定義一個默認的引數,如果呼叫引數且沒有對應形參,則自動使用默認引數
def makeSentence(sub = 'August', pre = 'has', obj = 'phones'):
'''
sub為主語
pre為謂語
obj為賓語
函式的作用是把主謂賓連成一句話
'''
print(sub + ' ' + pre + ' ' + obj)
makeSentence() #沒有引數
輸出結果:August have phones
? 注意,有默認值的引數必須要放在沒有默認值的引數的后面
? 例如
def makeSentence(sub = 'August', pre, obj):
'''
sub為主語
pre為謂語
obj為賓語
函式的作用是把主謂賓連成一句話
'''
print(sub + ' ' + pre + ' ' + obj)
makeSentence('eats', 'food')
運行結果:SyntaxError: non-default argument follows default argument
===============================================
所以正確寫法應為:
def makeSentence(pre, obj, sub = 'August'): #將有默認值的引數放到所有無默認值的引數后面
'''
sub為主語
pre為謂語
obj為賓語
函式的作用是把主謂賓連成一句話
'''
print(sub + ' ' + pre + ' ' + obj)
makeSentence(pre='eats', obj='food')
輸出結果:August eats food
(4) 收集引數
定義函式的時候,在引數前加一個 * 號,函式可以接收零個或多個值作為引數,回傳結果是一個元組,
傳遞零個引數時函式并不報錯,而是回傳一個空元組,
以上這種方法有局限性,它不能收集關鍵字引數,
def func1(*parameters_1):
print('引數為:', parameters_1)
print('引數長度為:', len(parameters_1))
print('第二個引數為:', parameters_1[1])
func1('August', 'Tsugua', 3, 4, 5)
輸出結果:引數為: ('August', 'Tsugua', 3, 4, 5)
引數長度為: 5
第二個引數為: Tsugua
? 對關鍵字引數進行收集則使用另一種收集引數機制:使用兩個星號 ( ** ) ,用法同上,最后回傳一個以引數名為鍵、引數值為鍵值的字典,
def func2(**parameters_2):
print(parameters_2)
func2(a = 1, b = 2, c = 'FWTY')
輸出結果:{'a': 1, 'b': 2, 'c': 'FWTY'}
2、函式檔案
? 在函式內部的第1行開始,使用三引號作為幫助檔案的標記字符
? 函式在執行時并不會列印檔案的內容
def funADD(num1, num2):
'''函式的作用是回傳兩個引數的和'''
return num1 + num2
print(funADD(1,2))
輸出結果:3
? 可以使用函式的__doc__屬性或者help()方法查看檔案內容
print(funADD.__doc__)
輸出結果:函式的作用是回傳兩個引數的和
==================================
help(funADD)
輸出結果:
Help on function funADD in module __main__:
funADD(num1, num2)
函式的作用是回傳兩個引數的和
3、內嵌函式(內部函式)和閉包
(1) 內嵌函式(內部函式)
? 內嵌函式(內部函式)就是指在函式的內部再定義一個函式
def fun1():
print('呼叫fun1')
def fun2(): #在fun1內部再定義一個fun2
print('呼叫fun2')
fun2()
fun1()
輸出結果:呼叫fun1
呼叫fun2
? 注意,上面fun2函式的作用域是在fun1函式之內的,也就是說,無法在fun1函式之外直接呼叫fun2
def fun1():
print('呼叫fun1')
def fun2(): #在fun1內部再定義一個fun2
print('呼叫fun2')
fun2()
fun2()
輸出結果:NameError: name 'fun2' is not defined
(2) 閉包
在一個外部函式中定義了一個內部函式,內部函式里運用了外部函式的臨時變數,并且外部函式的回傳值是內部函式的參考,這樣就構成了一個閉包,稱這個內部函式為閉包函式
也就是說:
- 閉包函式必須是外部函式的回傳物件
- 閉包函式必須參考外部變數(一般不能是全域變數)
def funX(x):
def funY(y): #閉包函式
return x*y #內部函式參考了外部函式的臨時變數
return funY #回傳內部函式
==================================
#閉包函式的呼叫1
i = funX(8) #此時i是一個函式,輸出i:<function funX.<locals>.funY at 0x00000268DDE2A048>
print(i(5))
輸出結果:40
==================================
#閉包函式呼叫2
print(funX(8)(5))
輸出結果:40
4、Lambda運算式(匿名函式)
? lambda運算式,通常是在需要一個函式,但是又不想費神去命名一個函式的場合下使用,也就是指匿名函式, lambda所表示的匿名函式的內容應該是簡單的,如果復雜的話,干脆就重新定義一個函式了,
lambda [arg1 [,arg2,.....argn]]:expression
#例如:
def add(x, y):
return x + y
#上面的函式就等于
lambda x, y: x + y
==============================
g = lambda x, y: x + y
print(g(3,4))
輸出結果:7
lambda運算式常用于:
- 寫一些執行腳本時,省略定義函式的程序,使代碼更精簡
- 代替一些比較抽象且呼叫次數較少的函式
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/177296.html
標籤:Python
上一篇:Python中的命名空間是什么?
