2026/4/18 5:38:49
网站建设
项目流程
做网站可以用哪些软件,自己制作视频app软件,微商的自己做网站叫什么,麻涌企业网站建设Day 11#xff1a;【99天精通Python】函数进阶 - *args、**kwargs 与 Lambda 表达式
前言
欢迎来到第11天#xff01;
在昨天的课程中#xff0c;我们学会了定义标准的函数#xff0c;参数的数量在定义时就是固定的#xff08;比如 def add(a, b) 必须传两个数#xff09…Day 11【99天精通Python】函数进阶 - *args、**kwargs 与 Lambda 表达式前言欢迎来到第11天在昨天的课程中我们学会了定义标准的函数参数的数量在定义时就是固定的比如def add(a, b)必须传两个数。但在实际开发中情况往往没那么简单。比如你想写一个sum_all()函数能计算任意数量数字的和可能是2个也可能是100个。你想写一个能够处理各种配置选项的函数但不想写几十个默认参数。有些简单的函数比如x 1只用一次专门写个def显得太繁琐。今天我们将解锁Python函数的完全体形态学习动态参数和匿名函数。本节内容*args接收任意数量的位置参数**kwargs接收任意数量的关键字参数参数的混合使用顺序解包参数UnpackingLambda 表达式匿名函数Lambda 与高阶函数map, filter, sorted一、动态参数处理不确定数量的输入1.1 *args可变位置参数当你不知道用户会传多少个位置参数时可以使用*args。Python会将所有多余的位置参数打包成一个元组Tuple。语法deffunc(*args):print(args)注意args只是个约定俗成的名字关键是那个星号*。你写*numbers也可以。示例万能求和函数defsum_all(*numbers):计算任意个数字的和total0fornuminnumbers:totalnumreturntotalprint(sum_all(1,2))# 3print(sum_all(1,2,3,4))# 10print(sum_all())# 01.2 **kwargs可变关键字参数如果你想接收任意数量的keyvalue形式的参数可以使用**kwargs。Python会将它们打包成一个字典Dictionary。语法deffunc(**kwargs):print(kwargs)注意kwargs代表 “keyword arguments”关键是双星号**。示例用户信息记录defprint_info(name,**details):print(fName:{name})forkey,valueindetails.items():print(f{key}:{value})print_info(Alice,age25,cityNew York)# 输出:# Name: Alice# age: 25# city: New Yorkprint_info(Bob,jobEngineer,statusSingle,level99)二、参数的组合与解包2.1 这里的顺序很重要如果一个函数同时包含了多种类型的参数定义的顺序必须是位置参数(常规参数)*args(可变位置参数)默认参数(关键字参数)**kwargs(可变关键字参数)defmixed_func(a,b,*args,**kwargs):print(fa{a}, b{b})print(fargs{args})print(fkwargs{kwargs})mixed_func(1,2,3,4,5,x10,y20)# 输出:# a1, b2# args(3, 4, 5)# kwargs{x: 10, y: 20}2.2 参数解包把列表炸开传进去刚才我们是用*来收集参数打包反过来我们在调用函数时也可以用*来解散列表解包。defadd(a,b,c):returnabc nums[1,2,3]# 错误调用add(nums) - 报错因为只传了1个参数整个列表# 正确调用解包print(add(*nums))# 等同于 add(1, 2, 3) - 6同理**可以用来解包字典defintroduce(name,age):print(f我是{name}今年{age}岁)info{name:小明,age:18}# introduce(info) - 报错introduce(**info)# 等同于 introduce(name小明, age18)三、Lambda 表达式一行代码的函数3.1 什么是 LambdaLambda 表达式也称匿名函数是一种定义简单函数的快捷方式。它没有名字通常只包含一行代码。语法lambda参数:表达式关键字lambda开头。参数可以有多个用逗号分隔。冒号后是表达式自动返回该表达式的计算结果不需要return。对比# 普通函数defsquare(x):returnx*x# Lambda 函数square_lambdalambdax:x*xprint(square(5))# 25print(square_lambda(5))# 253.2 什么时候用 LambdaLambda 通常不单独使用单独用不如直接 def它主要是作为参数传递给其他函数如高阶函数。场景 1配合 sort() 排序比如我们有一个字典列表想根据字典里的某个键排序。students[{name:Alice,age:25},{name:Bob,age:20},{name:Charlie,age:22}]# 按年龄排序# sort(key函数) - 这里需要一个函数告诉sort按什么排students.sort(keylambdas:s[age])print(students)# [{name: Bob, age: 20}, {name: Charlie, age: 22}, {name: Alice, age: 25}]场景 2配合 map() 映射map(func, iterable)对序列中的每个元素应用 func。nums[1,2,3,4,5]# 将所有数字平方squaredlist(map(lambdax:x**2,nums))print(squared)# [1, 4, 9, 16, 25]场景 3配合 filter() 过滤filter(func, iterable)保留 func 返回 True 的元素。nums[1,2,3,4,5,6]# 筛选偶数evenslist(filter(lambdax:x%20,nums))print(evens)# [2, 4, 6]四、实战练习练习1超级连接器编写一个函数concat_str(*args, sep/)它可以接收任意多个字符串并用指定的分隔符默认是/连接它们。defconcat_str(*args,sep/):returnsep.join(args)print(concat_str(home,user,docs))# home/user/docsprint(concat_str(2026,01,11,sep-))# 2026-01-11练习2自定义排序逻辑有一个元组列表[(1, one), (3, three), (2, two)]请使用sorted()和lambda表达式按照元组的第二个元素字符串的长度进行排序。data[(1,one),(3,three),(2,two)]# 按字符串长度排序 (one:3, three:5, two:3)# 注意one和two长度一样保持原序sorted_datasorted(data,keylambdax:len(x[1]))print(sorted_data)# [(1, one), (2, two), (3, three)]五、常见问题Q1*args和**kwargs必须这么写吗不是强制的。你完全可以写*vars和**options。但是*args和**kwargs是Python社区的硬性约定为了让别人能看懂你的代码请务必遵守这个命名。Q2Lambda 能包含复杂的逻辑吗不能。Lambda 只能包含一个表达式。它不能包含赋值语句x1、循环for、流程控制if...elif但可以用三元运算符x if c else y。如果逻辑复杂请老老实实写def。Q3args是列表吗kwargs是字典吗args本质上是一个元组 (tuple)不可变。kwargs本质上是一个字典 (dict)。六、小结函数进阶动态参数匿名函数 Lambda参数解包*args (接收位置参数 - 元组)**kwargs (接收关键字参数 - 字典)lambda x: x1配合 sorted/map/filter 使用*列表 - 解包为位置参数**字典 - 解包为关键字参数关键要点想让函数接收任意个参数用*args和**kwargs。*args把多余参数打包成元组**kwargs打包成字典。lambda适合写那种用完即扔的短小函数特别是在排序和数据处理时。参数解包func(*list)是非常实用的技巧。七、课后作业最大值函数不要使用内置的max()编写一个接受任意数量数字的函数my_max(*args)并返回最大值。字典构造器编写一个函数make_dict(**kwargs)它接收任意关键字参数并返回一个字典但要求所有的key都必须转换为大写。输入make_dict(a1, b2)输出{A: 1, B: 2}复杂排序有一个学生列表students [{name:Tom,score:80}, {name:Jerry,score:90}, {name:Spike,score:80}]。请按照分数降序排序如果分数相同则按名字字母序升序排序。提示元组比较规则(score, name)。下节预告Day 12文件操作 (File I/O)- 写了这么多代码结果一关机数据就没了明天我们学习如何读写文件把数据持久化保存下来系列导航上一篇Day 10 - 函数基础下一篇Day 12 - 文件操作待更新