函数的应用
一、匿名函数
语法:
lambda 参数列表:返回值
函数别名=lambda 参数列表:返回值
sum1= lambda x,y,z:x+y+z
print(sum1(1,2,3))
sum2_0=lambda n:sum(range(n+1)) #返回值只能是一个语句,不能写循环
print(sum2_0(5))
sum2_1= lambda *n:sum(n)
print(sum2_1(1,2,3,4,5))
string_print_0=lambda x,y,z:print("zhe shi yi ge han shu ") #print函数的返回值为None
print(string_print_0(1,2,3))
string_print_1=lambda x,y,z:print(x,y,z) #print函数的返回值为None
print(string_print_1(1,2,3))
sum3=lambda x=1,y=1,z=1:sum1 #将sum1函数作为返回值
print(sum3())
sum4=lambda x=1,y=1,z=1:sum1(1,2,3) #在sum4中调用sum1
print(sum4())
sum5=lambda x=1,y=1,z=1:sum1
print(sum5()(1,2,3)) #在sum5的返回值为sum1,再调用sum1
col=[]
for item in range(1,5):
col.append(lambda x:x*item)
print(col[0](2)) #打印的值是多少?
print(col[1](2)) #打印的值是多少?
#注意:函数在调用的时候才执行函数体
'''
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]
col[0](2)=x*item=2*4=8
col[1](2)=x*item=2*4=8
'''
二、变量作用域
变量的作用域是指变量能够使用的范围
作用域链:变量会由内到外找,先去自己作用域去找,自己没有再去上级去找,直到找不到报错
1、全局变量:
申明在函数或类外面的变量都是全局变量,作用域从申明开始到整个py文件结束
(与C和Java都有区别,Python没有块级作用域)
for x in range(1,5):
for y in range(1,5):
z=100
print(x,y,z) #x,y,z 都是全局变量
2、局部变量
申明在函数或类里面的变量都是局部变量,作用域从申明开始到整个函数或者类结束
def func1():
name = "Band"
print(name)
func1()
**3、global关键字 **
注意:只能用于函数中
作用:在局部域中定义全局变量
name="James"
def func2():
print(name)
def func3():
global name #在函数中申明一个name全局变量
global age #在函数中申明一个age全局变量
name = "James Band"
age = 30
print(name)
func2() #调用函数,打印局部变量
func3() #全局变量指向的地址被func3修改
print(name,age)#打印在func3中申明的全局变量
**4、nonlocal关键字 **
只能用于函数中
作用:在局部域的局部域中修改变量的值
name="James" #全局变量
def func4():
name="James Band" #局部变量(func4作用域)
def func5():
name="James Band 007" #局部变量(func5作用域)
print(name)
func5()
print(name)
func4() #James Band 007 James Band
print(name) #James
name="James"
def func6():
name="James Band"
def func7():
nonlocal name #在func7中申明了一个在func6作用域的变量,在作用域链中扩大了一个层级
name="James Band 007"
print(name)
func7()
print(name)
func6() #James Band 007 James Band 007(局部参数被重新申明)
print(name) #James
三、函数作为变量使用
申明函数就是申明一个function类型的变量,函数名就是变量名
1、函数作为变量赋值给其他变量
func1=lambda x,y:x*y
a=func1#函数作为变量赋值给a
b=func1(2,3)#返回值赋值给b
2、函数作为序列的元素
def func2():
print('调用了func2函数')
return 10
list1=[1,func2,func2()]
print(list1[1]())
print(list1[2])
3、将函数作为参数
def func11(n):
n()
def func12():
print("调用func12函数")
func11(func12)
re=func11(func12)
print(re)
4、将函数作为返回值
将函数的申明写在函数里面,可以隐藏函数的实现
#根据操作符进行相关的数字计算
def opration(oprater:str):
if oprater=="+":
def func1(*param1,**param2):
sums=0
for x in param1:
sums+=x
for x in param2:
sums+=param2[x]
return sums
return func1
if oprater=="*":
def func2(*param1,**param2):
sums=1
for x in param1:
sums*=x
for x in param2:
sums*=param2[x]
return sums
return func2
f1=opration("+")
re=f1(1,2,3,4,a=5,b=6)
print(re)
print(opration("*")(3,4,a=5))
函数可以将自己作为返回值
def func21(n):
print("调用func21函数")
n()
return func21
def func22():
print("调用func22函数")
return func22
func21(func22()) #调用func22函数、调用func21函数、调用func22函数
func21(func22) #调用func21函数、调用func22函数
分析:func21(func22())-->func22()对func22函数进行调用,就打印了一次"调用func22函数",同时将func22的返回值(函数自身)作为函数func21的变量,调用func22函数,打印了一次"调用func21函数",然后n()相当于func21()又调用了一次,打印了一次"调用func22函数"
关于sort()的应用
sort(key=None,reverse=False):可以给key赋值一个函数变量,指定元素的排序规则
要求:
(1)函数变量要求有一个参数和返回值;
(2)参数代表列表中的元素,返回值代表排序规则
list2=[{'name':"James","age":25,"city":"guangzhou"},
{'name': "James Band", "age": 22, "city": "chengdu"},
{'name': "James Band 007", "age": 33, "city": "chongqing"}]
def get_age(items):
return items['age']
list2.sort(key=get_age)
print(list2)
#[{'name': 'James Band', 'age': 22, 'city': 'chengdu'}, {'name': 'James', 'age': 25, 'city': 'guangzhou'}, {'name': 'James Band 007', 'age': 33, 'city': 'chongqing'}]
四、函数的调用
注意:函数的调用过程是一个压栈的过程
每次调用函数系统都会在内存中(栈)开辟空间存储执行过程中产生的数据(函数中申明的变量);当函数调用结束后,该内存空间会自动销毁
1、函数可以有多个返回值
def sum_and_average(*param):
"""返回数组的和以及平均值"""
sums=sum(param)
average=sums/len(param)
return sums,average
result=sum_and_average(1,2,3,4,5,6,7,8,9)
print(result)
2、函数递归调用
怎么写递归函数:
1、确定临界值(循环结束的条件),让函数结束
2、找关系,假设函数的功能已经实现,找f(n)和f(n)的关系
3、根据关系,用f(n-1)实现f(n)的功能
def My_sums(n):
if n==1:return 1
return My_sums(n-1)+n
print(My_sums(5))
注意:不推荐使用递归调用,运行时消耗内存