day12-高阶函数与匿名函数

高阶函数与匿名函数

  • 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)) #[]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值