高阶函数与匿名函数
- return 的作用:
- 将数据作为函数的返回值返回
- 结束函数
变量的作用域
-
作用域指的是变量定义完成后可以使用的有效范围
-
全局变量:python中没有定义在函数中 OR 类中的变量都是全局变量
- 作用域:从定义开始到程序结束
-
局部变量:定义在函数中的变量就是局部变量
- 作用域:从定义开始到函数结束
#全局变量
a=100
#x 和 b 都是全局变量
for x in range(5):
b=200
#m 和 n 是局部变量
def func2(m):
n=1000
print(f'函数m:{m}')
print(f'{n}')
func2(100)
-
全局变量默认保存在全局栈区间,全局栈区间会在程序结束后自动释放
-
局部变量默认保存在临时栈区间,临时栈区见函数调用完后自动释放
- 函数中修改全局变量用 global
#
def function3():
global num
num = 10
function3()
print(num)
匿名函数
-
没有名字的函数
-
函数名 = lambda 形参列表:返回值
-
注意:
- 匿名函数的形参至少一个
- 匿名函数的调用和普通一样
-
无默认值的数据类型说明,函数不能用
- 类型说明1: 形参:str 或者 形参:list…
- 类型说明2: 形参=1,形参=2,…
#类型说名
sum_2 = lambda num1=1,num2=1:num1+num2
#求和
sum_2 = lambda num1,num2:num1+num2
print(sum_2(1,3))
print(sum_2(num2=30,num1=6))
#判断指定年是否闰年
result=lambda num1: num1 % 400==0 or (num1 % 4==0 and num1 %100 !=0) #判断条件结果是bool值
print(result(2000)) #True
实参高阶函数
-
函数的参数是函数的函数 就是实参高阶函数
-
常见的实参高阶函数:max 、min 、sorted、列表.sort、 map 、reduce
-
max(序列,key=函数) -按照函数指定的规则比较序列中元素的大小
-
函数的要求:
-
有且只有一个参数(这个参数代表序列中的每个元素)
-
有一个返回值(返回值就是比较对象)
-
nums = [23, 524, 2, 141, 52, 9]
print(max(nums, key=lambda item: item % 10))
# 练习1:求list1中长度最长的字符串
list1 = ['你好', 'hello', 'how are you', 'thank you! and you?', '好好学习,天天向上']
result=max(list1,key=lambda item:len(item))
print(result)
# 练习2:求nums中十位数最小的元素
nums = [92, 129, 37, 99, 150, 501]
print(min(nums,key=lambda item:item//10%10))
# 案例:求个位数最大的元素
nums = [83, 67, 19, 22, 80, 77, 93]
print(max(nums,key=lambda item:item%10))
# 案例:求nums中绝对值最大的元素
nums = [8, -283, 89, 100, 82, -34]
# 练习3:将所有的学生按照年龄值从小到大排序
students = [
{'name': 'stu1', 'age': 18, 'score': 90},
{'name': 'stu2', 'age': 22, 'score': 98},
{'name': 'stu3', 'age': 25, 'score': 78},
{'name': 'stu4', 'age': 19, 'score': 81},
{'name': 'stu5', 'age': 20, 'score': 92}
]
print(sorted(students,key=lambda item:item['age']))
#求students中分数最高的学生
print(max(students,key=lambda item:item['score']))
# 练习4:求nums中各个位之和最大的元素
nums1 = [123, 78, 90, 201, 192, 330]
print(max(nums1,key=lambda item: sum(eval(x) for x in str(item))))
- map(函数,序列) -通过函数描述的规则基于序列中的元素创建一个新的序列
- 有且只有一个参数(代表后面序列的每个元素)
- 有一个返回值(返回值就是新序列中元素)
#将所有元素乘以10
nums=[12,423,123,32,2]
print(list(map(lambda item:item*10,nums)))
#两个序列相乘
nums1=[12,423,123,32,2]
nums2=[12,23,12,32,2]
result=map(lambda i1 ,i2:i1*i2, nums1,nums2)
print(list(result)) #[144, 9729, 1476, 1024, 4]
# 练习1:获取names中每个人的姓
names = ['何晓东', '张三', '李四', '王五', '王二', '赵六']
result=map(lambda n1:n1[0],names)
print(list(result))
# 练习2:
students = [
{'name': 'stu1', 'age': 18, 'score': 90},
{'name': 'stu2', 'age': 22, 'score': 98},
{'name': 'stu3', 'age': 25, 'score': 78},
{'name': 'stu4', 'age': 19, 'score': 81},
{'name': 'stu5', 'age': 20, 'score': 92}
]
subjects = ['电子信息', '金融数学', '园林设计', '经济', '计算机软件']
# ['电子信息-stu1', '金融数学-stu2',....]
print(list(map(lambda i1,i2:i2+'-'+i1['name'], students,subjects)))
-
reduce(函数,序列,初始值) -按照函数指定的规则将序列的元素合并
-
有且只有两个参数(第一个参数指向初始值,第二个参数代表序列中的每一个元素)
-
有且只有一个返回值(返回值就是合并规则)
-
-
初始值:
- 累积求和:初始 0
- 累积乘积:初始 1
- 字符合并:初始 空串
from functools import reduce
nums=[12,301,40,55,112]
#案列:123014055112
print(reduce(lambda x,item:x+str(item),nums,''))
#练习:2+1+0+5+2
print(reduce(lambda x,item:item%10+x, nums,0))
迭代器(iter)
- next(迭代器) -获取迭代器最前面的元素
- 对空迭代器 -报错
- 注意:转换成列表,会将数据,从迭代器中拿出来,加入到新列表中
#获取
print(next(i1)) #a
print(list(i2)) #
# print(next(i2)) #报错
#遍历
for x in i1:
print(x)
print(list(i1)) #[]