1.匿名函數(shù)
"""
1.普通函數(shù):
def 函數(shù)名(參數(shù)列表):
函數(shù)體
2.匿名函數(shù):
函數(shù)名 = lambda 參數(shù)列表:返回值
說明:
函數(shù)名 --> 變量名
lambda --> 關(guān)鍵字
參數(shù)列表 --> 參數(shù)名1肄梨,參數(shù)名2....
: - > 固定的
返回值 --> 相當(dāng)于只有一個(gè)return語(yǔ)句的函數(shù)體
匿名函數(shù)的調(diào)用和普通函數(shù)一樣:函數(shù)名(實(shí)參列表)
# 寫一個(gè)匿名函數(shù),功能是求兩個(gè)數(shù)的和
sum1 = lambda num1,num2:num1 + num2
# sum1 = lambda num1=10,num2=20:num1+num2
print(sum1(1,2))
# print(sum1(num1=100,num2=23))
sum3 = lambda *nums:sum(nums)
print(sum3(1,2,3))
# 相當(dāng)于上面的匿名函數(shù)
# def sum1(num1,num2):
# return num1+num2
# 練習(xí):請(qǐng)1+2+3+...+n的和
sum2 = lambda n:sum(range(n+1))
print(sum2(100))
# 練習(xí):讀程序
funcs = []
for item in range(1,5):
funcs.append(lambda x:x*item)
"""
item = 1~4
item = 1 [lambda x:x*item]
item = 2 [lambda x:x*item,lambda x:x*item]
item = 3 [lambda x:x*item,lambda x:x*item,lambda x:x*item]
item = 4 [lambda x:x*item,lambda x:x*item,lambda x:x*item,lambda x:x*item]
"""
print(funcs[0](2)) # 2*4 8
print(funcs[1](2)) # 2*4 8
2.變量的作用域
"""
1.變量的作用域
變量的作用域指得是變量能夠使用的范圍
2.全局變量和局部變量
全局變量:聲明在函數(shù)和類的外面的變量都是全局變量隐解,作用域是從聲明開始囤锉,到整個(gè)py文件結(jié)束咕晋。任何地方都可以使用
3.局部變量:聲明在函數(shù)和類中的變量都是局部變量赞厕。申明在函數(shù)的局部變量慷暂,作用域是從聲明開始到整個(gè)函數(shù)結(jié)束
"""
# 全局變量
a = 10
for x in range(a):
print(x)
def asd(num):
print(a)
# ----------
# 局部變量
def fun1():
aa = 100 # 局部變量
print(aa)
for x in range(5):
print(aa + "x")
"""
4.global關(guān)鍵字
在函數(shù)中說明一個(gè)變量是全局變量
只能在函數(shù)中使用
"""
name = 'abc'
def func2():
global age
age = 18
global name # 說明當(dāng)前函數(shù)中的name是全局變量name
name = 'aaa'
print(name)
func2()
print(name)
"""
5.nonlocal關(guān)鍵字
想要在局部的局部中修改局部變量的值
"""
def func3():
abc = 100
def func4():
nonlocal abc
abc = 200
print('f4:',abc)
func4()
print('f3: ,abc')
func3()
0
1
2
3
4
5
6
7
8
9
aaa
aaa
f4: 200
f3: ,abc
3.函數(shù)作為變量
"""
聲明函數(shù)就是聲明一個(gè)類型是function的變量蜈项,函數(shù)名實(shí)質(zhì)就是變量名芹关。
"""
def func1():
print('====')
print(type(func1))
"""
1.變量可以給其他變量賦值
"""
a = 10
b = a
print(b*10)
list1 = [1,2]
list2 = list1
list2.append(100)
print(list2)
func1= lambda x:print(x)
func2 =func1
func2(10)
# 聲明一個(gè)變量func11,類型是function
def func11():
print('我是函數(shù)')
# 用一個(gè)函數(shù)給變量a賦值紧卒,a也是一個(gè)函數(shù)
a= func11
a()
# 將函數(shù)func11的返回值給b,b的值是None
b = func11()
print(b)
"""
2.函數(shù)作為列表的元素
"""
a = 10
list1 = [1,a]
print(list1,list1[1]+100)
def func22():
print('我是函數(shù)')
return 10
list2 = [1,func22,func22()]
print(list2)
# list2[1] 取到一個(gè)函數(shù)侥衬,通過后面加()調(diào)用函數(shù)
print(list2[1]())
# list2[2] 取到的是整數(shù)10
print(list2[2]+100)
"""
3.將函數(shù)作為參數(shù)
"""
a = 10
def func1(n):
print(n)
func1(a)
def func11(n):
# n = func12
n() # func12()
def func12():
print('hello world')
re = func11(func12)
func11(func12)
應(yīng)用:
"""
列表.sort(key=None,reverse=False)
使用sort的時(shí)候,可以通過給key賦一個(gè)函數(shù)變量跑芳,來規(guī)定列表中的元素按照什么標(biāo)準(zhǔn)來排序
這兒的函數(shù)變量要求有一個(gè)參數(shù)和一個(gè)返回值轴总,參數(shù)代表列表中的元素,返回值代表按那個(gè)要求排序
"""
list1 = [1, 32, 213, 321]
list1.sort()
print(list1)
list2 = [
{'name': '張三', 'age': 20,'score': 90},
{'name': '李四', 'age': 23,'score': 70},
{'name': '王五', 'age': 12,'score': 80},
]
# 根據(jù)成績(jī)排序
# def get_age(item):
# return item['age']
# list2.sort(key = get_age)
list2.sort(key=lambda item:item['age'])
print(list2)
list3 = [
('a', 20),
(10, 3),
('b', 90)
]
# def get_num(s):
# return s[1]
# list3.sort(key = get_num,reverse=True)
# print(list3)
list3.sort(key=lambda item:item[1])
print(list3)
"""
4.將函數(shù)作為返回值
"""
# 根據(jù)運(yùn)算符號(hào)博个,返回對(duì)應(yīng)的功能
def operation(operator: str):
if operator == '+':
def func1(*args, **kwargs):
# 求和
# args = (10, 20) kwargs = {'a':2, 'b': 3}
sum1 = 0
for item in args:
sum1 += item
for key in kwargs:
sum1 += kwargs[key]
return sum1
return func1
elif operator == '*':
def func2(*args,**kwargs):
sum1 = 1
for item in args:
sum1 *= item
for key in kwargs:
sum1 *= kwargs[key]
return sum1
return func2
f1 = operation('+') # f1就是有兩個(gè)不定長(zhǎng)參數(shù)怀樟,功能是求和的函數(shù)
re = f1(10, 20, a=2, b=3)
print(re)
re = operation('+')(90,98)
print(re)
print(operation('*')(10, 20, a=2, b=3))
print(operation('*')(1, 2, 3, 4))
<class 'function'>
100
[1, 2, 100]
10
我是函數(shù)
我是函數(shù)
None
[1, 10] 110
我是函數(shù)
[1, <function func22 at 0x0282A300>, 10]
我是函數(shù)
10
110
10
hello world
hello world
[1, 32, 213, 321]
[{'name': '王五', 'age': 12, 'score': 80}, {'name': '張三', 'age': 20, 'score': 90}, {'name': '李四', 'age': 23, 'score': 70}]
[(10, 3), ('a', 20), ('b', 90)]
35
188
1200
24
4.函數(shù)的調(diào)用
"""
1.補(bǔ)充:python中的函數(shù)可以有多個(gè)返回值
"""
求多個(gè)數(shù)的和以及平均值
def dx_sum(*nums):
sum1 = sum(nums)
average = sum1/len(nums)
return sum1,average # 同時(shí)返回和、平均值
a, b = dx_sum(123, 43, 123, 43, 23)
num = dx_sum(31, 231, 43, 43, 223)
print(a, b)
print(num[0], num[1])
"""
2.函數(shù)的調(diào)用過程是一個(gè)壓棧的過程
每次調(diào)用函數(shù)的時(shí)候坡倔,系統(tǒng)都會(huì)在內(nèi)存中(棧)開辟空間來存儲(chǔ)函數(shù)執(zhí)行過程中產(chǎn)生的數(shù)據(jù)(函數(shù)聲明中的變量)
當(dāng)函數(shù)調(diào)用完成后漂佩,這塊內(nèi)存會(huì)自動(dòng)銷毀脖含。
"""
355 71.0
571 114.2
5.遞歸函數(shù)
"""
1.什么是遞歸函數(shù)
遞歸函數(shù):函數(shù)中調(diào)用函數(shù)本身,這樣的函數(shù)就是遞歸函數(shù)(自己調(diào)用自己)
循環(huán)能做的事情遞歸都可以做投蝉,但實(shí)際上循環(huán)能解決的問題絕對(duì)不能選遞歸
"""
def func1():
print('====')
func1()
"""
2.怎么寫遞歸函數(shù)
第一步:確定臨界值(循環(huán)結(jié)束的條件)养葵,讓函數(shù)結(jié)束
第二部:找關(guān)系,假設(shè)函數(shù)的功能已經(jīng)時(shí)間瘩缆,找f(n)和f(n-1)的關(guān)系
第三步:根據(jù)關(guān)系关拒,用f(n-1)實(shí)現(xiàn)f(n)的功能
"""
"""
dx_sum(5) n = 5 5!=1 return dx_sum(4)+5
dx_sum(4) n = 4 4!=1 return dx_sum(3)+4
....
dx_sum(1) n =1 1==1 retnrn 1
"""
# 1+2+3+....100
def dx_sum(n):
# 1.找臨界值
if n == 1:
return 1
# 2.找關(guān)系
"""
dx_sum(n) = 1+2+3+...+n
dx_sum(n) = 1+2+3+...+n-1
dx_sum(n) = dx_sum(n-1)+n
"""
# 3.用f(n-1)實(shí)現(xiàn)f(n)的功能
return dx_sum(n-1) + n
print(dx_sum(100))
# 用遞歸實(shí)現(xiàn)以下功能
"""
n = 3
***
**
*
n = 4
****
***
**
*
先打印4課星
f(3)
打印n顆星
f(n-1)
"""
def print_star(n):
if n == 1:
print('*')
return
print('*'*n)
print_star(n-1)
print_star(5)
"""
n = 3
*
**
***
n = 4
*
**
***
****
"""
def print_star(n):
if n == 1:
print('*')
return
print_star(n - 1)
print('*'*n)
print_star(5)
總結(jié):遞歸能不用,就不用S褂椤着绊!
5050
*****
****
***
**
*
*
**
***
****
*****