Python函数进阶

本文探讨了Python中的匿名函数、变量作用域,包括全局变量和局部变量,以及`global`关键字的使用。重点讲解了实参高阶函数,如`max`、`min`、`sorted`、`map`和`reduce`,并提供了相关实例和练习,帮助理解这些函数的用法。最后通过`reduce`函数展示了如何计算一组学生总分数的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

匿名函数

匿名函数的本质还是函数,他们除了定义的语法不同,其他的东西都一样

注意:匿名函数只能用来实现功能简单的函数

语法:

函数名 = 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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值