一、函數(shù)
1.函數(shù)的概念
函數(shù)是實(shí)現(xiàn)某一特定功能的代碼段的封裝
2.函數(shù)的聲明/定義
def 函數(shù)名(形參列表):
函數(shù)體
形參: 可以看成是聲明在函數(shù)中的變量; 作用是將函數(shù)外部的數(shù)據(jù)傳遞到函數(shù)內(nèi)部
函數(shù)體: 函數(shù)說明文檔, 實(shí)現(xiàn)函數(shù)功能的代碼段, return 語(yǔ)句
(重點(diǎn)!)聲明函數(shù)的時(shí)候不會(huì)執(zhí)行函數(shù)體
3.函數(shù)的調(diào)用
函數(shù)名(實(shí)參列表)
(重點(diǎn)!)函數(shù)調(diào)用過程:
回到函數(shù)聲明的位置
傳參(用實(shí)參給形參賦值) - 保證每個(gè)參數(shù)都值
執(zhí)行函數(shù)體
結(jié)束后,確定返回值 - 自然死亡/遇到return
返回函數(shù)調(diào)用的位置 - 這個(gè)時(shí)候函數(shù)調(diào)用表達(dá)式的值才是之前確定返回值
4.函數(shù)的參數(shù)
位置參數(shù)和關(guān)鍵字參數(shù)
參數(shù)默認(rèn)值
參數(shù)類型說明
不定長(zhǎng)參數(shù): 形參前加* -> 將形參變成元組, 形參前加** -> 將形參變成字典
5.函數(shù)的返回值 - 將函數(shù)內(nèi)部傳遞到函數(shù)的外面
a.怎么確定函數(shù)的返回值
看執(zhí)行函數(shù)的時(shí)候會(huì)不會(huì)遇到return, 遇到了return 后面的值就是返回值。沒有遇到返回值就是None
b.怎么獲取函數(shù)的返回值
通過獲取函數(shù)調(diào)用表達(dá)式的值來獲取返回值
普通數(shù)據(jù)能做的事情返回值都可以做
注意:每次調(diào)用函數(shù),都會(huì)重新獲取返回值
二、匿名函數(shù)
1.什么是匿名函數(shù)
匿名函數(shù)還是函數(shù),只是聲明的格式和普通函數(shù)不一樣。只適用于函數(shù)功能比較簡(jiǎn)單的函數(shù)
2.匿名函數(shù)的聲明
a.語(yǔ)法
變量名 = lambda 形參列表:返回值
b.說明
變量名 - 相當(dāng)于函數(shù)名
lambda - 聲明匿名函數(shù)的關(guān)鍵字
形參列表 - 和普通函數(shù)的形參列表一樣
: - 固定寫法
返回值 - 就相當(dāng)于普通函數(shù)中只有一條return語(yǔ)句的函數(shù)體
3. 匿名函數(shù)的調(diào)用
和普通函數(shù)一樣
三、變量作用域
1.什么是變量的作用域
就是變量能夠使用的范圍
2.全局變量和局部變量
a. 全局變量 - 沒有聲明在函數(shù)或者類中的變量都是全局變量
全局變量的作用域是從聲明開始,到整個(gè)文件結(jié)束
b. 局部變量 - 聲明在函數(shù)或者類中的變量就是局部變量
局部變量的作用域是從聲明開始,到函數(shù)結(jié)束
c. global - 在函數(shù)中聲明一個(gè)全局變量(只能在函數(shù)中使用)
global 變量名
變量名 = 值
d. nonlocal - 想要在局部的局部中去修改布局變量的值,就使用nonlocal對(duì)變量進(jìn)行說明
nonlocal 局部變量
局部變量 = 值
總結(jié):當(dāng)我們調(diào)用函數(shù)的時(shí)候,系統(tǒng)會(huì)自動(dòng)在棧區(qū)間專門為這個(gè)函數(shù)開辟一塊獨(dú)立的內(nèi)容空間,
用來保存在函數(shù)中聲明的變量(形參也是屬于聲明在函數(shù)中的變量)。當(dāng)函數(shù)調(diào)用結(jié)束后,
這個(gè)函數(shù)對(duì)應(yīng)的棧區(qū)間會(huì)自動(dòng)銷毀 --- (函數(shù)調(diào)用過程是一個(gè)壓棧的過程)
四、函數(shù)的使用
python中聲明函數(shù)其實(shí)就是聲明一個(gè)類型是function的變量, 函數(shù)名就是變量名
函數(shù)名 -- 類型是function的變量
函數(shù)名() -- 調(diào)用函數(shù)并且獲取函數(shù)的返回值
普通變量能做的事情函數(shù)變量都能做!
1.給別的變量賦值
2.變量作為容器類數(shù)據(jù)的元素
3.變量作為函數(shù)的實(shí)參
函數(shù)1作為函數(shù)2的實(shí)參 -- 函數(shù)2就是一個(gè)高階函數(shù)
函數(shù)作為參數(shù)的應(yīng)用: sort函數(shù)
列表.sort(key=None, reverse=False)
參數(shù)key - 要求是一個(gè)帶有一個(gè)參數(shù),并且返回值是布爾的函數(shù)。這兒的參數(shù)指向的是列表中元素。
確定按照元素的什么值進(jìn)行排序
示例:
all_student = [
{'name': '張三', 'age': 19, 'score': 90},
{'name': 'stu1', 'age': 30, 'score': 79},
{'name': 'xiaoming', 'age': 12, 'score': 87},
{'name': 'stu22', 'age': 29, 'score': 99}
]
# 這兒的item是需要排序的列表的元素
# def func(item):
# return item['score']
# all_student.sort(key=func, reverse=True)
all_student.sort(key=lambda item: item['score']) # 按成績(jī)從小到大排序
all_student.sort(key=lambda item: item['age'], reverse=True) # 按年齡從大到小排序
print(all_student)
補(bǔ)充:排序原理
# =============排序原理(了解)=============
def yt_sorted(iterable, key=None, reverse=False):
list1 = list(iterable)
if key:
for x in range(len(iterable) - 1):
for y in range(x + 1, len(iterable)):
item1 = list1[x]
item2 = list1[y]
if key(item1) > key(item2):
list1[x], list1[y] = list1[y], list1[x]
else:
# 快速排序
for x in range(len(iterable) - 1):
for y in range(x + 1, len(iterable)):
if list1[y] < list1[x]:
list1[x], list1[y] = list1[y], list1[x]
if not reverse:
# 從小到大
return list1
else:
# 從大到小
return list1[::-1]
print(yt_sorted([1, 20, 9, 10]))
# print(sorted(all_student, key=lambda x: x['age']))
print(yt_sorted(all_student, key=lambda x: x['age'], reverse=True))
4.變量作為函數(shù)的返回值
函數(shù)1作為函數(shù)2的返回值 - 函數(shù)2是返回值高階函數(shù)
示例:
def operation(char):
# char = '-'
if char == '+':
def func1(*nums):
return sum(nums)
# 將函數(shù)作為函數(shù)的返回值
return func1
elif char == '-':
def func2(*nums):
# (10, 3, 4)
# 如果沒有傳參
if not nums:
return 0
sum1 = nums[0]
for index in range(1, len(nums)):
sum1 -= nums[index]
return sum1
return func2
print(operation('+')(1, 2, 3, 4))
print(operation('-')(10, 3, 4))