1.匿名函式
普通函式:
def 函式名(引數列表):
函式體
匿名函式
函式名= lambada 引數列表:返回值
說明
函式名 -> 變數名
lambda -> 關鍵字
引數列表 -> 引數名1,引數名2......
返回值 -> 相當於只有一個return語句的函式體
匿名函式的呼叫和普通函式一樣:函式名(實參列表)
也支援位置引數、關鍵字引數、引數設定預設值、不定長引數
程式碼示例
# 寫一個匿名函式,功能是求兩個數的和
sum1 = lambda num1, num2: num1+num2
print(sum1(10, 20))
# 相當於上面的匿名函式
# def sum1(num1, num2)
# return num1+num2
執行結果
30
練習:讀程式
程式碼如下
sum2 = lambda n: sum(range(1, n+1))
print(sum2(100))
執行結果
5050
練習:讀程式
程式碼示例
funcs = []
for item in range(1, 5):
funcs.append(lambda x: x*item)
print(funcs[0](2))
print(funcs[1](2))
執行結果
8
8
2.變數的作用域
1.變數的作用域
變數的作用域指的是變數能夠使用的範圍
2.全域性變數和區域性變數
全域性變數:宣告在函式和類的外面的變數都是全域性變數;作用域是從宣告開始到整個py檔案結束
都可以使用
程式碼示例
# 全域性變數
a = 10
print('=====')
for x in range(5):
print(a)
print(x)
def fun1():
print(a)
fun1()
# x, y, c都是全域性變數
for x in range(5):
for y in range(2):
c = 100
執行結果
10
0
10
1
10
2
10
3
10
4
10
3.區域性變數
宣告在函式和類中的變數。作用域是從宣告開始到整個函式結束
程式碼示例
ef fun1():
# 區域性變數
aa = 100
print(aa)
4.global關鍵字
在函式中說明一個變數是全域性變數
程式碼示例
name = 'abc'
def func2():
global name # 說明當前函式中使用的name是全域性變數name
global age # 宣告一個全域性變數
age = 18
name = 'aaa'
print(name)
func2()
print(name)
print(age)
執行結果
aaa
aaa
18
5.nonlocal關鍵字
想要在區域性的區域性中修改區域性變數的值
程式碼示例
def func3():
abc = 100
def func4():
nonlocal abc
abc = 200
print('f4', abc)
func4()
print('f3', abc)
func3()
執行結果
f4 200
f3 200
3.函式作為變數
宣告函式就是宣告一個型別是function的變數,函式名實質就是變數名
程式碼示例
def func1():
print('=====')
print(type(func1))
執行結果
<class 'function'>
程式碼示例
a = 10
b = a
print(b*10)
list1 = [1, 2]
list2 = list1
list2.append(100)
print(list1)
# 宣告一個變數func2,型別為function
def func2():
print('我是函式')
func1 = lambda x: print(x)
func3 = func1
func3(10)
a = func2
a()
# 將函式func2的返回值給b
b = func2()
print(b)
執行結果
100
[1, 2, 100]
10
我是函式
我是函式
None
程式碼示例
a = 10
list1 = [1, a]
print(list1, list1[1] + 100)
def func22():
print('我又是函式')
return 10
list2 = [1, func22, func22()]
print(list2)
# list2[1]取到一個函式,通過後面加()呼叫函式
print(list2[1]())
執行結果
[1, 10] 110
我又是函式
[1, <function func22 at 0x00000285157D4AE8>, 10]
我又是函式
10
程式碼示例
a = 10
def func1(n):
print(n)
func1(a)
def func11(n):
print('aaa')
n()
def func12():
print('hello world!')
func11(func12)
執行結果
10
aaa
hello world!
應用:sort的使用
列表.sort(key=None, reverse=False)
使用sort的時候,可以通過給key賦一個函式變數,來規定列表中的元素按照什麼標準來排序
這兒的函式變數要求要有一個引數和一個返回值。引數代表列表中的元素,返回值代表按照那個
標準排序
程式碼示例
list1 = [1, 45, 8, 89]
list1.sort()
print(list1)
list2 = [
{'name': '張三', 'age': 20, 'score': 90},
{'name': '李四', 'age': 28, 'score': 100},
{'name': '王五', 'age': 18, 'score': 89}
]
def get_score(item): # 根據成績排序
return item['score']
list2.sort(key=get_score)
print(list2)
list3 = [
('a', 20),
(10, 3),
('c', 90)
]
def get_2(item):
return item[1]
list3.sort(key=get_2, reverse=True)
print(list3)
list3.sort(key=lambda item: item[1])
print(list3)
執行結果
[1, 8, 45, 89]
[{'name': '王五', 'age': 18, 'score': 89}, {'name': '張三', 'age': 20, 'score': 90}, {'name': '李四', 'age': 28, 'score': 100}]
[('c', 90), ('a', 20), (10, 3)]
[(10, 3), ('a', 20), ('c', 90)]
程式碼示例
def operation(operator: str): # 根據運算子號,返回對應的功能
if operator == "+":
def func111(*args, **kwargs):
sum1 = 0
for item in args:
sum1 += item
for key in kwargs:
sum1 += kwargs[key]
return sum1
return func111
elif operator == "*":
def func222(*args, **kwargs):
sum1 = 1
for item in args:
sum1 *= item
for key in kwargs:
sum1 *= kwargs[key]
return sum1
return func222
print(operation('+')(90, 98))
print(operation('+')(90, 98, a=2))
print(operation('*')(10, 30, a=2))
print(operation('*')(10, 30, 30, 10))
執行結果
188
190
600
90000
4.函式的呼叫
1.補充:python中的函式可以有多個返回值
程式碼示例
# 求多個數的和以及平均值
def yt_sum(*nums):
sum1 = sum(nums)
average = sum1 / len(nums)
return sum1, average
a, b = yt_sum(2, 56, 78, 65, 6)
num = yt_sum(2, 56, 78, 65, 6)
print(a, b)
print(num[0], num[1])
執行結果
207 41.4
207 41.4
2.函式的呼叫是一個壓棧的過程
每次呼叫函式的時候,系統都會在記憶體中(棧)開闢空間來儲存函式執行過程中產生的資料
(函式中宣告的變數)。
當函式呼叫完成後,這塊記憶體會自動銷燬
5.遞迴函式(瞭解)
遞迴函式:函式中呼叫函式本身,這樣的函式就是遞迴函式(自己呼叫自己)
迴圈能做的事情遞迴都可以做,但是實際迴圈能解決的問題絕對不選遞迴
程式碼示例
def func1():
print('=====')
func1()
怎麼些遞迴函式
第一步:確定臨界值(迴圈結束的條件),讓函式結束
第一步:找關係,假設函式的功能已經實現,找f(n)和f(n-1)的關係
第三部:根據關係,用f(n-1)實現f(n)的功能
程式碼示例
# 寫一個遞迴函式,實現:1+2+3+.....n
def yt_sun(n):
# 1.找臨界值
if n == 1:
return 1
# 2.找關係
"""
yt_sum(n) = 1+2+3+...+n
yt_sum(n-1) = 1+2+3+...+n-1
yt_sum(n) = yt_sum(n-1)+n
"""
return yt_sun(n-1) + n
print(yt_sun(100))
# 用遞迴實現一下功能
"""
n = 3
***
**
*
n = 4
****
***
**
*
......
"""
def print_star(n):
if n == 1:
print('*')
return
print('*'*n)
print_star(n-1)
print_star(5)
"""
n = 3
*
**
***
.....
"""
def print_star(n):
if n == 1:
print('*')
return
print_star(n - 1)
print('*' * n)
print_star(3)
執行結果
5050
*****
****
***
**
*
*
**
***
總結:能不用就不用