1.函數(shù)Function
- 函數(shù)就是對(duì)實(shí)現(xiàn)某一特定功能的代碼段的封裝
1.函數(shù)的分類
- 內(nèi)置函數(shù)(系統(tǒng)函數(shù)): python已經(jīng)實(shí)現(xiàn)的函數(shù),程序員直接用,例如: print()、input()、max()、len()等。相當(dāng)于系統(tǒng)造好的機(jī)器
- 自定義函數(shù): 程序員自己定的函數(shù),相當(dāng)于自己造機(jī)器
2.函數(shù)的定義(聲明) - 造機(jī)器
1)語法:
def 函數(shù)名(參數(shù)列表):
函數(shù)體
2)說明:
- def - 聲明函數(shù)的關(guān)鍵字,固定寫法
- 函數(shù)名 - 要求: 標(biāo)識(shí)符、不能是關(guān)鍵字
規(guī)范: 見名知義(看到函數(shù)名大概知道函數(shù)的功能)、所有字母都小寫,多個(gè)單詞用_隔開、不能和系統(tǒng)的函數(shù)名類名重名 - () - 固定寫法
參數(shù)列表 - 形參1,形參2,形參3,... --> 變量名1,變量名2,變量名3,... ; 這兒的參數(shù)叫形參,形參可以沒有也可以有多個(gè)
形參的功能是將函數(shù)外面的數(shù)據(jù)傳遞到函數(shù)里面 - : - 固定寫法
函數(shù)體 - 和def保持一個(gè)縮進(jìn)的代碼段;
函數(shù)體分為函數(shù)說明文檔和實(shí)現(xiàn)函數(shù)功能的代碼段兩個(gè)部分
3)初學(xué)者聲明函數(shù)的步驟:
- 第一步: 確定函數(shù)的功能
- 第二步: 根據(jù)功能確定函數(shù)的名字
- 第三步: 確定參數(shù)(就是確定需要不需要參數(shù),需要幾個(gè)參數(shù))
看實(shí)現(xiàn)函數(shù)的功能需不需要從函數(shù)外面給函數(shù)傳值,如果需要需要幾個(gè)? - 第四步: 實(shí)現(xiàn)函數(shù)的功能
- 第五步: 確定返回值 (暫時(shí)不管)
3.函數(shù)體在函數(shù)聲明的時(shí)候不會(huì)執(zhí)行, 調(diào)用函數(shù)的時(shí)候才會(huì)執(zhí)行函數(shù)體(重要!)
4.函數(shù)調(diào)用 - 使用機(jī)器
- 語法:
函數(shù)名(參數(shù)列表/實(shí)參列表) - 說明:
- 函數(shù)名 - 函數(shù)名對(duì)應(yīng)的函數(shù)必須是已經(jīng)聲明過的函數(shù)
- () - 固定寫法
- 參數(shù)列表 - 這兒的參數(shù)叫實(shí)參; 實(shí)參是用來給形參賦值的
值1,值2,值3
# 寫一個(gè)函數(shù),功能是計(jì)算兩個(gè)數(shù)的和
def yt_sum(num1, num2):
"""
函數(shù)功能的說明: 求兩個(gè)數(shù)的和
:param num1: 參數(shù)說明: int, 數(shù)字
:param num2: 數(shù)字
:return: 返回值說明: None
"""
print('========')
print(num1, num2)
print(num1 + num2)
yt_sum(11, 222)
yt_sum(2, 8)
# 寫一個(gè)函數(shù),功能是求1*2*3*...*n
def yt_mul(n):
"""求1*2*3*...*n"""
sum1 = 1
for num in range(1, n+1):
sum1 *= num
print('乘積:', sum1)
yt_mul(4)
# 寫一個(gè)函數(shù),功能是打印10個(gè)*
def print_star():
print('*'*10)
print_star()
5.函數(shù)的調(diào)用過程 (重要?。?!)
函數(shù)在聲明的時(shí)候不執(zhí)行函數(shù)體,調(diào)用的函數(shù)的時(shí)候才會(huì)執(zhí)行函數(shù)體
- 函數(shù)的調(diào)用過程:
- 先回到函數(shù)聲明的位置
- 用實(shí)參給形參賦值 - 傳參 (保證每個(gè)參數(shù)都有值)
- 執(zhí)行函數(shù)體
- 執(zhí)行完函數(shù)體,確定返回值
(執(zhí)行完函數(shù)體中所有的語句沒有遇到return,函數(shù)的返回值是None;
執(zhí)行過程中遇到return,函數(shù)的返回值就是return后面的值) - 回到函數(shù)調(diào)用的位置,接著往后執(zhí)行。(此時(shí)函數(shù)調(diào)用表達(dá)式的值才是函數(shù)的返回值)
def yt_sum(num1, num2):
# num1, num2 = 1, 2 --> num1 = 1, num2 = 2
# num1 = 20, num2 = 30
print(num1+num2) # print(1+2) print(3)
yt_sum(1, 2)
print('~~~~~')
yt_sum(20, 30)
6.函數(shù)的參數(shù)
1)根據(jù)實(shí)參的寫法將參數(shù)分為 位置參數(shù) 和 關(guān)鍵字參數(shù)
- a.位置參數(shù): 調(diào)用函數(shù)的時(shí)候?qū)崊⒌奈恢煤托螀⒁灰粚?duì)應(yīng),然后保證每個(gè)形參都有值
- b.關(guān)鍵字參數(shù): 實(shí)參列表以'形參名1=值1,形參名2=值2...'的方式來調(diào)用函數(shù),在這兒形參的順序可以和聲明的時(shí)候形參的順序不同
- 注意: 位置參數(shù)和關(guān)鍵字參數(shù)可以混合使用,但是使用的時(shí)候一定要保證位置參數(shù)在關(guān)鍵字參數(shù)的前面
def func1(a, b, c):
print(a, b, c)
# 位置參數(shù)
func1(10, 20, 30)
# 關(guān)鍵字參數(shù)
func1(a=10, b=20, c=30)
func1(c=30, b=20, a=10)
# 位置參數(shù)和關(guān)鍵字參數(shù)混合
func1(5, c=25, b=15)
# func1(b=10, a=0, 20) SyntaxError: positional argument follows keyword argument
2)參數(shù)默認(rèn)值
- 聲明函數(shù)的時(shí)候,函數(shù)的形參可以設(shè)置默認(rèn)值。
- 注意:
a.如果設(shè)置默認(rèn)值的時(shí)候,是一部分參數(shù)有默認(rèn)值,一部分沒有默認(rèn)值,那么沒有默認(rèn)值的參數(shù)一定要寫在有默認(rèn)值的參數(shù)的前面
b.有默認(rèn)值的參數(shù),調(diào)用的時(shí)候可以不用傳參;沒有默認(rèn)值的參數(shù),調(diào)用的時(shí)候必須傳參
c.當(dāng)我們傳參的時(shí)候想要跳過某個(gè)或者某幾個(gè)有默認(rèn)值的參數(shù),直接后面的參數(shù)傳參的時(shí)候,后面的參數(shù)必須使用關(guān)鍵字參數(shù)傳參
def func2(a, b=20, c=30):
# a ;b = 20 ;c = 30
# a = 100; b=200; c=300
# a ;b = 20 ;c = 30
# a=100
print(a, b, c)
func2(100, 200, 300)
func2(100)
func2(100, 200)
func2(a=100, c=300)
func2(100, c=300)
- 參數(shù)類型說明
- a.給參數(shù)設(shè)置默認(rèn)值,默認(rèn)是什么類型,參數(shù)就是什么類型
- b.以'參數(shù)名: 類型名'的方式說明參數(shù)類型
def func3(nums: list, a: int, b=0):
nums.append('abc')
print(a+b, nums)
func3([], 10, 0)
# 練習(xí): 寫一個(gè)函數(shù),函數(shù)的功能是統(tǒng)計(jì)一個(gè)列表中指定元素的個(gè)數(shù)(類似count()方法的功能)
def yt_count(list1: list, item):
"""統(tǒng)計(jì)一個(gè)list1中item的個(gè)數(shù)"""
count = 0
for item1 in list1:
if item1 == item:
count += 1
print(count)
yt_count([1, 34, 56, 778, 1], 1)
yt_count([1, 34, 56, 778, 1], 0)
nums = [1, 23, 4, 2, 2, 4, 1, 4]
yt_count(nums, 2)
4)不定長(zhǎng)參數(shù)
- a. 聲明函數(shù)的時(shí)候,在形參前加一個(gè)*, 可以將這個(gè)形參變成元祖,然后同時(shí)接受多個(gè)位置參數(shù)的值
- b. 聲明函數(shù)的時(shí)候,在形參前加**,可將這個(gè)形參變成字典,然后可以同時(shí)接受多個(gè)關(guān)鍵字參數(shù)的值(這兒的關(guān)鍵字自己隨便命名)
注意: 原則上一個(gè)函數(shù)的參數(shù)中既可以有定長(zhǎng)的,也可以有待一個(gè)的不定長(zhǎng)和帶兩個(gè)的不定長(zhǎng);如果同時(shí)存在帶一個(gè)參數(shù)和帶兩個(gè)*的參數(shù),帶一個(gè)的要放在帶兩個(gè)的前面
# *和**混合
def func(*args, **kwargs):
print(args, kwargs)
func(1, 2, 3, 4)
func(a=1, b=2, c=3)
func(1, 2, 3, a=10, b=20, c=30)
# **
def func(a, **num):
print('不定長(zhǎng)參數(shù)2:')
print(a, num)
func(10, name=10, age=23, tel=90)
# *
# 寫一個(gè)函數(shù),功能是求多個(gè)數(shù)的和
# 假設(shè)你實(shí)現(xiàn)的函數(shù)是yt_sum, yt_sum(10) == 10 yt_sum(1, 2) == 3 yt_sum(1, 2, 3, 4) == 10
def yt_sum1(*num):
print(sum(num))
yt_sum1()
yt_sum1(1)
yt_sum1(1, 2)
yt_sum1(1, 2, 3, 4)
注意: 一個(gè)函數(shù)中可以同時(shí)又不定長(zhǎng)參數(shù)和定長(zhǎng)參數(shù),一般情況下不定長(zhǎng)參數(shù)要放在后面;
如果出現(xiàn)定長(zhǎng)參數(shù)放在不定長(zhǎng)參數(shù)的后面,那么在不定長(zhǎng)參數(shù)后面的定長(zhǎng)參數(shù)調(diào)用的時(shí)候需要使用關(guān)鍵字參數(shù)傳參
def func1(a, *nums, b='abc'):
print(nums, a, b)
func1(1, 2, 3, 4, 5, b='hello')
def func2(a, *b, c):
print(a, b, c)
func2(1, 23, 34, 56, 67, c=200)
# 練習(xí): 寫一個(gè)函數(shù)求多個(gè)數(shù)的和,要求調(diào)用函數(shù)的時(shí)候既可以使用位置參數(shù)傳參,也可以用關(guān)鍵字參數(shù)傳參。
# yt_sum2(1, 2, 3) == 6 yt_sum2(num1=10, num2=20) == 30
# yt_sum2(1, 2, num3=100, num4=200) == 303
def yt_sum2(*nums1, **nums2):
sum1 = 0
for num in nums1:
sum1 += num
for key in nums2:
sum1 += nums2[key]
print(sum1)
yt_sum2(1, 2, 3)
yt_sum2(num1=10, num2=20)
yt_sum2(1, 2, num3=100, num4=200)
7.什么是返回值
- 返回值的作用是將函數(shù)體中產(chǎn)生的數(shù)據(jù)傳遞到函數(shù)外面
- 返回值就是函數(shù)調(diào)用表達(dá)式的值,就是return關(guān)鍵字后面的值
- 注意: 函數(shù)調(diào)用表達(dá)式 - 調(diào)用函數(shù)的語句; 它的結(jié)果就是這個(gè)的函數(shù)的返回值;
- 可以通過函數(shù)調(diào)用表達(dá)式獲取函數(shù)的返回值
8.return關(guān)鍵字
return只能出現(xiàn)在函數(shù)體中;
當(dāng)執(zhí)行函數(shù)體的時(shí)候遇到return,函數(shù)直接結(jié)束;并且會(huì)將return后面的值作為函數(shù)的返回值返回;
如果在執(zhí)行函數(shù)體的時(shí)候沒有遇到return,函數(shù)的返回值是None9.函數(shù)的調(diào)用過程(完整版) 記?。。。。?!
- 先回到函數(shù)聲明的位置
- 用實(shí)參給形參賦值 - 傳參 (保證每個(gè)參數(shù)都有值)
- 執(zhí)行函數(shù)體
- 執(zhí)行完函數(shù)體,確定返回值
(執(zhí)行完函數(shù)體中所有的語句沒有遇到return,函數(shù)的返回值是None;
執(zhí)行過程中遇到return,函數(shù)的返回值就是return后面的值) - 回到函數(shù)調(diào)用的位置,接著往后執(zhí)行。(此時(shí)函數(shù)調(diào)用表達(dá)式的值才是函數(shù)的返回值)
def func1(n):
# n = 10
# n = 100
# n = 100
print(n)
return n*2 # return 20; return 200; return 200
print(10)
print(func1(10)) # print(20)
a = 10
a = func1(100) # a = 200
print('a:', a)
list1 = [10, func1(100)] # list1 = [10, 200]
print(list1)
"""
10
10
20
100
a: 200
100
[10, 200]
"""
# 4.什么時(shí)候函數(shù)需要有返回值
# 給初學(xué)者的建議: 只要實(shí)現(xiàn)函數(shù)的功能產(chǎn)生了新的數(shù)據(jù),就可以把這個(gè)數(shù)據(jù)用返回值返回
# 寫一個(gè)函數(shù),求兩個(gè)數(shù)的和:
def yt_sum(n1, n2):
return n1+n2
score1 = 10
score2 = 20
print(yt_sum(score1, score2))
total = yt_sum(score1, score2)
person = {'name': '小明', 'scores': total}
print([1, 2, 3].count(1))
list1 = [1, 2, 3]
print('===:', list1.append(4))
# python中一個(gè)函數(shù)可以有多個(gè)返回值;return后給多個(gè)值,用逗號(hào)隔開
def func2():
return 10, 20
x, y = func2() # x, y = 10, 20
print(x)