11、函數(def)



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

"""














免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM