Python函数-形参传入语法浅析
文章目录前言一、函数定义语法二、形参类型汇总表三、最常用的参数类型重要四、进阶用法了解五、注意事项六、快速查询表七、小结前言在Python中函数的形参参数非常灵活。本文系统性地总结Python函数可以接收的所有参数类型从最常用的基础类型到进阶的高级用法配有大量代码示例方便日后查阅。一、函数定义语法def函数名(形参1,形参2默认值,*args,**kwargs):文档字符串可选函数体return返回值# 可选二、形参类型汇总表三、最常用的参数类型重要基本数据类型defprocess(name,age,price,is_active):处理基本数据类型print(f姓名:{name}, 年龄:{age}, 价格:{price}, 状态:{is_active})#调用示例process(Tom,18,99.9,True)列表 Listdefcalculate_total(prices):计算列表总和returnsum(prices)# 调用示例resultcalculate_total([10,20,30,40])print(result)# 输出: 100字典 Dictdefshow_user_info(user):显示用户信息print(f姓名:{user[name]}, 年龄:{user[age]}, 城市:{user.get(city,未知)})# 调用示例show_user_info({name:Tom,age:18,city:北京})默认参数defcreate_user(name,age18,city北京):带默认参数的函数print(f{name},{age}岁, 来自{city})# 调用示例create_user(Tom)# Tom, 18岁, 来自北京create_user(Jerry,20)# Jerry, 20岁, 来自北京create_user(Spike,25,上海)# Spike, 25岁, 来自上海实例化的对象classUser:def__init__(self,name,age):self.namename self.ageagedefintroduce(self):returnf我是{self.name}今年{self.age}岁defgreet(user):接收对象作为参数print(f你好,{user.name})print(user.introduce())# 调用示例tomUser(Tom,18)greet(tom)#输出结果你好,Tom 我是Tom今年18岁函数本身回调函数defapply_operation(data,func):对数据应用指定的操作函数returnfunc(data)# 调用示例传入不同的函数print(apply_operation([1,2,3],sum))# 输出: 6print(apply_operation([1,2,3],len))# 输出: 3print(apply_operation(hello,str.upper))# 输出: HELLOprint(apply_operation(5,lambdax:x*2))# 输出: 10可变参数 *argsdefsum_all(*args):接收任意数量的位置参数print(f参数元组:{args})returnsum(args)# 调用示例print(sum_all(1,2,3))# 输出: 6print(sum_all(10,20,30,40))# 输出: 100print(sum_all())# 输出: 0可变参数 **kwargsdefshow_info(**kwargs):接收任意数量的关键字参数forkey,valueinkwargs.items():print(f{key}:{value})# 调用示例show_info(nameTom,age18,city北京,job工程师)# 输出:# name: Tom# age: 18# city: 北京# job: 工程师混合使用defmixed_params(a,b10,*args,**kwargs):混合使用各种参数类型print(f必传参数 a:{a})print(f默认参数 b:{b})print(f额外位置参数 args:{args})print(f额外关键字参数 kwargs:{kwargs})returnab# 调用示例mixed_params(1,2,3,4,5,x6,y7)# 输出:# 必传参数 a: 1# 默认参数 b: 2# 额外位置参数 args: (3, 4, 5)# 额外关键字参数 kwargs: {x: 6, y: 7}四、进阶用法了解传入类本身classWarrior:defattack(self):return战士挥剑攻击classMage:defattack(self):return法师释放火球defstart_game(player_class):传入类本身在函数内部实例化playerplayer_class()print(f你选择了{player_class.__name__})print(player.attack())# 调用示例start_game(Warrior)# 你选择了 Warrior / 战士挥剑攻击start_game(Mage)# 你选择了 Mage / 法师释放火球实战场景批量创建对象classUser:tableusersdefsave(self):print(f保存到{self.table}表)classProduct:tableproductsdefsave(self):print(f保存到{self.table}表)defbatch_create(model_class,data_list):批量创建并保存对象objs[]fordataindata_list:objmodel_class()forkey,valueindata.items():setattr(obj,key,value)# 动态设置属性obj.save()objs.append(obj)returnobjs# 调用示例batch_create(User,[{name:Tom},{name:Jerry}])batch_create(Product,[{name:iPhone,price:999},{name:Mac,price:1999}])传入模块对象# 假设有不同支付模块# pay_alipay.pydefpay(amount):returnf支付宝支付{amount}元# pay_wechat.pydefpay(amount):returnf微信支付{amount}元defcheckout(pay_module,amount):传入模块对象动态选择支付方式returnpay_module.pay(amount)# 调用示例假设已导入模块importpay_alipayimportpay_wechatprint(checkout(pay_alipay,100))# 支付宝支付 100 元print(checkout(pay_wechat,200))# 微信支付 200 元配套工具函数# getattr: 动态获取属性userUser()user.nameTomprint(getattr(user,name,默认值))# Tom# setattr: 动态设置属性setattr(user,age,18)# 等价于 user.age 18# hasattr: 判断是否有该属性print(hasattr(user,name))# Trueprint(hasattr(user,address))# False五、注意事项可变对象作为默认参数常见陷阱# ❌ 错误写法defadd_item(item,lst[]):lst.append(item)returnlstprint(add_item(1))# [1]print(add_item(2))# [1, 2] ← 期望 [2]但实际继承了上次的结果# ✅ 正确写法defadd_item(item,lstNone):iflstisNone:lst[]lst.append(item)returnlstprint(add_item(1))# [1]print(add_item(2))# [2]参数顺序规则defcorrect_order(a,b10,*args,**kwargs):# 顺序必传参数 → 默认参数 → *args → **kwargspass# ❌ 错误顺序defwrong_order(a,*args,b10):# 语法错误pass六、快速查询表七、小结1.90%的情况你只需要传递数字、字符串、列表、字典、对象、带默认值的参数2.*args和**kwargs 在处理不确定数量的参数时非常有用3.传入类本身和传入模块对象是进阶技巧在框架开发、插件系统中很常见4.Python函数形参的核心思想一切皆对象任何对象都可以作为参数传递参考资料Python官方文档https://docs.python.org/3/tutorial/controlflow.html#defining-functions