11.1、函數:
函數即變量
函數的作用域只跟函數聲明時定義的作用域有關,跟函數的調用位置無任何關系
1、函數格式:
def test(x):
'''
2*x+1
:param x:整形數字
:return: 返回計算結果
'''
y = 2 * x + 1
return y
a = test()
#調用函數
print(a)
11.2、函數返回:
1、規則:
(1)函數的返回值可以是任何數據類型
(2)函數如果有多個返回值用逗號隔開
(3)函數只用一個返回值時,返回值的數據類型不發生改變
(4)函數有多個返回值時,返回值以元組的形式返回
(5)函數遇到return時函數結束
2、用法:
def test01():
msg = 'test01'
return msg
#函數返回一個值
def test02():
msg = 'test02'
return 1, 2, 3, 4, 'a', ['alex'], {'name': 'alex'}, None
#函數返回多個值
t1 = test01()
t2 = test02()
print(t1)
print(t2)
11.3、函數普通傳參:
1、規則:
(1)函數分為形參和實參,形參在函數被調用后釋放
(2)位置參數,必須一一對應,缺一不行多一也不行
(3)關鍵字參數,無須一一對應,缺一不行多一也不行
(4)兩者混用時,位置參數必須在關鍵字參數左邊
(5)默認參數在不傳入實參時使用默認值,在傳入實參時默認參數值被覆蓋
(6)一個參數不能傳多個值
2、用法:
(1)位置參數:
def test(x, y, z):
print(x)
print(y)
print(z)
test(1, 2, 3)
(2)關鍵字參數:
def test(x, y, z):
print(x)
print(y)
print(z)
test(y=1, x=3, z=4)
(3)位置參數和關鍵字參數混用:
def test(x, y, z):
print(x)
print(y)
print(z)
test(1, y=2, 3)
#報錯
test(1, 3, y=2)
#報錯
test(1, 3, z=2, y=4)
#報錯
test(z=2, 1, 3)
#報錯
test(1, 3, z=2)
(4)默認參數:
def handle(x, type='mysql'):
print(x)
print(type)
handle('hello')
handle('hello', type='sqlite')
11.4、參數組:
1、規則:
(1)列表參數:
實參的數據類型除字典外都可以
可以傳入多個實參
實參可以重復
傳入的實參以元組的形式存儲,不傳入實參是空元組
傳入的列表格式為*[1,2,3,4],傳入元組的格式為*(5,6,7,8)
(2)字典參數:
實參的數據類型只能是字典
可以傳入多個實參
實參的key值不可以重復
傳入的實參以字典的形式存儲,不傳入實參是空字典
傳入字典的格式為**{1:2,3:4}(key必須是字符串型)或 y=2, z=3;
(3)列表參數和字典參數在一起使用:
可以傳遞任何的參數
2、用法:
(1)參數組之列表參數(*args):
def test(x, *args):
print(x)
print(args)
test(1)
test(1, *['x', 'y', 'z'],*('x', 'y', 'z'),1,2,3,3,4,5)
(2)參數組之字典參數(**kwargs):
def test(x, **kwargs):
print(x)
print(kwargs)
test(1)
test(1,**{"a":5,"b":6},y=2, z=3)
(3)列表參數和字典參數混用:
def test(x, *args, **kwargs):
print(x)
print(args, args[-1])
print(kwargs, kwargs.get('y'))
test(1, *['x', 'y', 'z'],*('x', 'y', 'z'),1,2,3,3,4,5,**{"a":5,"b":6},y=2, z=3)
#輸出結果:
#1
#('x', 'y', 'z', 'x', 'y', 'z', 1, 2, 3, 3, 4, 5) 5
#{'a': 5, 'b': 6, 'y': 2, 'z': 3} 2
11.5、函數局部變量和全局變量:
1、規則:
(1)函數的內容無global關鍵字:
1)有聲明局部變量:
優先讀取局部變量,能讀取全局變量,無法對全局變量重新賦值
2)無聲明局部變量:
能讀取全局變量,無法對全局變量重新賦值
(2)函數的內容有global關鍵字:
1)有聲明局部變量:
局部變量本質上就是全局的那個變量,全局變量可讀取可賦值
2)無聲明局部變量:
全局變量可讀取可賦值
(3)nonlocal:
nonlocal代表指定上一級變量,如果沒有就繼續往上直到找到為止,上一級只能是局部變量,
如果是全局變量會報錯;
(4)變量書寫規范:
全局變量的變量名大寫,局部變量的變量名小寫
global和nonlocal聲明必須寫在函數的最上面
2、用法:
name = "test01"
def lc():
global name
name = "test02"
name1 = "test04"
def lc1():
nonlocal name1
name1 = "test03"
lc1()
print(name1)
print(name)
lc()
print(name)
# 輸出值為:test01、test03、test02
11.6、函數的向前引進:
1、規則:
(1)函數即變量,調用時生效,不調用不生效
(2)python是按照順序依次從上往下執行的,函數都是加載到內存當中的,
只要在所有的函數之后調用函數都能夠調用到;
2、用法:
(1)
def bar():
print('from bar')
def foo():
print('from foo')
bar()
foo()
(2)
def foo():
print('from foo')
bar()
def bar():
print('from bar')
foo()
11.7、函數的遞歸:
1、規則:
(1)遞歸函數意在減小問題的規模
(2)遞歸函數是一層一層的調用自己,在得到結果后再一層層的將結果進行返回
(3)遞歸函數效率不高
2、用法:
def calc(n):
if int(n / 2) == 0:
return n
res = calc(int(n / 2))
return res
print(calc(5))
#示意圖:
11.8、匿名函數:
1、匿名函數的格式:
func=lambda x:x+1
# x表示輸入的變量,x+1表示return x+1
print(func(10))
上面的匿名函數等價於如下函數:
def func(x):
return x+1
print(func(10))
2、說明:
(1)匿名函數只能用於簡單的邏輯計算;
(2)匿名函數常與其他函數一同使用;
11.9、高階函數:
1、高階函數定義:
(1)函數接收的參數是一個函數名
(2)函數的返回值是一個函數名
(3)滿足上述條件任意一個,都可稱之為高階函數
2、示例:
(1)把函數當作參數傳給另外一個函數:
def foo(n):
print(n)
def bar(name):
print('my name is %s' %name)
foo(bar('lc'))
"""
輸出結果:
my name is lc
None #因為函數沒有返回值,所以print(n)時打印出了None
"""
(2)返回值中包含函數:
def bar():
print('from bar')
def foo():
print('from foo')
return bar
foo()()
"""
輸出結果:
from foo
from bar
"""
