匿名函数
匿名函数的本质还是函数,他们除了定义的语法不同,其他的东西都一样
注意:匿名函数只能用来实现功能简单的函数
语法:
函数名 = lambda 形参列表:返回值
转换成普通函数:
def (形参列表):
return 返回值
sum2 = lambda num1,num2:num1 + num2
sum2(20,30)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zKWftujD-1646616502429)(E:\QFstudy\image\nmhanshu.png)]
练习1:写一个匿名函数判断指定的数是否是偶数
is_even_number = lambda num:num % 2 == 0
print(is_even_number(6))
练习2:写一个匿名函数判断指定的年是否是闰年
is_leap_year = lambda year:year % 4 == 0 and year % 100 != 0 or year % 400 == 0
print(is_leap_year(2020))
变量的作用域
1.变量的作用域
变量的作用域:变量定义以后可以使用的范围
根据变量作用域的不同我们将变量分为全局变量和局部变量两种
2.全局变量和局部变量
1)全局变量
没有定义在函数和类里面的变量都是全局变量;
全局变量的作用域是从定义开始到程序结束;
全局变量保存在全局的栈区间,全局栈区间在程序结束或才会自动释放。
2)局部变量
定义在函数的变量是局部变量,其中包括形参;
居局变量的作用域是从定义开始到函数结束;
调用函数的时候系统会自动给这个函数创建一个临时的栈区间用来保存函数中产生的数据(包括局部变量),当函数调用结束这个临时栈区间会自动释放。
3.global关键字
作用1:在函数里面去修改一个全局变量的值,修改之前先用global对变量进行说明
作用2:在函数中定义一个全局变量
4.实参高阶函数
1)在python中定义函数其实就是定义类型是function的变量,函数名就是变量名
变量能干的事情函数都可以做
2)高阶函数:实参高阶函数、返回值高阶函数
实参高阶函数 - 有一个参数是函数
返回值高阶函数 - 返回值是函数
实参高阶函数
常用的实参高阶函数:max、min、sorted(sort)、map、reduce
1.如果函数的参数是函数提供实参的方式:a.用普通的函数的函数名、b.使用匿名函数
def func1(x):
print(x(10) + 2)
#x的要求:是一个函数;函数有一个参数;函数返回值是数字
def t(x):
return x*2
func1(t)
fun1(lambda a:a*2)
2.常用实参高阶函数
1)max、min、sorted、列表.sort
max(序列) - 求序列中值最大的元素
max(序列,key=函数) - 根据函数指定的规则获取序列中最大的元素
min(序列,key=函数) - 根据函数指定的规则获取序列中最小的元素
sorted(序列,key=函数) - 根据函数指定的规则获取序列中的元素进行从小到大排序
函数的要求:1)有且只有一个参数(这个参数代表序列中的元素)、2)有一个返回值(比较对象
nums = [29,73,64,31,55,76]
#获取nums中值最大的元素
print(max(nums))
print(max(nums,key=lambda item:item))
#练习1:获取nums中个位数最大的元素
print(max(nums,key=lamdba item:item % 10))
#练习2:获取nums中各个位数之和最大的元素
print(max(nums,key=lambda item:sum([int(x) for x in str(item)])))
# 练习3:获取nums中绝对值最大的元素
nums = [29, 73, 64, -31, 68, 55, -76]
print(max(nums,key = lambda item:item if item >= 0 else -item))
def func1(item):
if item < 0:
return -item
return item
print(max(nums,key=func1))
# 练习4:获取points中y坐标最大的元素
points = [(19, 2), (0, 18), (3, 4)]
points = [(19, 2), (0, 18), (3, 4)]
print(max(points,key=lambda item:item[-1]))
# 练习5:获取年龄最大的学生;获取成绩最高的学生
students = [
{'name': 'stu1', 'age': 19, 'score': 72},
{'name': 'stu2', 'age': 22, 'score': 89},
{'name': 'stu3', 'age': 30, 'score': 60},
{'name': 'stu4', 'age': 17, 'score': 77}
]
print(max(students,key=lambda item:item['age']))
print(max(students,key=lambda item:item['score']))
2)map
将序列中的元素按照函数指定的规则进行变换得到一个新的序列
map(函数,序列)
函数的要求:1.有且只有1个参数(代表序列中的元素)2.有一个返回值(新序列中的元素 - 在这儿只需要描述清楚新序列中的元素与序列元素的关系)
map(函数,序列1,序列2)
函数的要求:1.有且只有2个参数(代表序列中的元素)2.有一个返回值(新序列中的元素 - 在这儿只需要描述清楚新序列中的元素与序列元素的关系)
map(函数,序列1,序列2,序列3)
函数的要求:1.有且只有3个参数(代表序列中的元素)2.有一个返回值(新序列中的元素 - 在这儿只需要描述清楚新序列中的元素与序列元素的关系)
map(函数,序列1,序列2,序列3,。。。)
函数的要求:1.有n个参数(代表序列中的元素)2.有一个返回值(新序列中的元素 - 在这儿只需要描述清楚新序列中的元素与序列元素的关系)
# 练习2:将nums中所有的元素乘以2
nums = [29, 73, 64, 301, 68, 55, 76]
# [58, 146, 128, 602, 136, 110, 152]
result = list(map(lambda item:item * 2,nums))
print(result)
# 练习4:
nums1 = [238, 89, 78, 23]
nums2 = [92, 78, 61, 44]
# [82, 98, 81, 34]
nums1 = [238, 89, 78, 23]
nums2 = [92, 78, 61, 44]
result = list(map(lambda item1,item2:item1 % 10 *10 + item2 % 10,nums1,nums2))
print(result)
# 练习5
list1 = ['python', 'java', 'h5']
list2 = [22, 21, 19]
list3 = [2, 9, 18]
# ['python2202', 'java2109', 'h51918']
list1 = ['python', 'java', 'h5']
list2 = [22, 21, 19]
list3 = [2, 9, 18]
result = list(map(lambda item1,item2,item3:item1+str(item2)+str(item3).zfill(2),list1,list2,list3))
result = list(map(lambda item1,item2,item3:f'{item1}{item2}{item3:0>2}',list1,list2,list3))
print(result)
3)reduce
将序列中的元素安装指定的规则合并成一个数据
reduce(函数,序列,初始值)
初始值:一般是0、1或者空串
函数的要求:1.有且仅有两个参数(第一个参数执行初始值;第二个参数指向序列中的每个元素)2.有一个返回值(决定合并式)
注意:使用reduce之前必须先从functools模块中导入
from functools import reduce
nums = [10, 23, 4, 8]
# 求所有元素的乘积: 10x23x4x8
from functools import reduce
result = reduce(lambda x,item:x * item,nums,1)
print(result)
students = [
{'name': 'stu1', 'age': 19, 'score': 72},
{'name': 'stu2', 'age': 22, 'score': 89},
{'name': 'stu3', 'age': 30, 'score': 60},
{'name': 'stu4', 'age': 17, 'score': 77}
]
# 求总分数
result = reduce(lambda x,item:x + item['score'],students,0)
print(result)
print(result)
students = [
{‘name’: ‘stu1’, ‘age’: 19, ‘score’: 72},
{‘name’: ‘stu2’, ‘age’: 22, ‘score’: 89},
{‘name’: ‘stu3’, ‘age’: 30, ‘score’: 60},
{‘name’: ‘stu4’, ‘age’: 17, ‘score’: 77}
]
求总分数
result = reduce(lambda x,item:x + item[‘score’],students,0)
print(result)