当前位置: 首页 > news >正文

Python 函数完全指南:参数、返回值与高级用法

# Python 函数完全指南:参数、返回值与高级用法

函数是代码复用的基础。学了函数才知道,Python 写得漂亮的人是怎么把代码组织得那么优雅的。这篇文章把我踩过的坑和实战经验全部分享出来。

函数是什么

简单说,函数就是把一段可以重复使用的代码打包起来,给它起个名字,以后想用就直接调用。

# 定义函数defgreet():print("你好!")# 调用函数greet()# 输出: 你好!

函数参数详解

位置参数

按顺序传递,顺序很重要:

defintroduce(name,age,city):print(f"我叫{name},今年{age}岁,来自{city}")introduce("张三",25,"北京")# 我叫张三,今年25岁,来自北京# 顺序错了,结果就错了introduce("北京",25,"张三")# 不对!

关键字参数

指定参数名传递,顺序无所谓:

introduce(age=25,city="北京",name="张三")# 我叫张三,今年25岁,来自北京

默认参数

给参数设置默认值:

defgreet(name,greeting="你好"):print(f"{greeting}{name}!")greet("张三")# 你好,张三!greet("李四","早上好")# 早上好,李四!# 默认参数要放最后# def wrong(a=1, b): # 错误!# def correct(a, b=2): # 正确!

可变参数 *args

不知道会传几个参数时用*args

defsum_all(*numbers):total=0forninnumbers:total+=nreturntotalprint(sum_all(1,2,3))# 6print(sum_all(10,20))# 30print(sum_all())# 0# args 是元组defprint_args(*args):print(type(args))# <class 'tuple'>forarginargs:print(arg)

关键字参数 **kwargs

传递任意数量的关键字参数:

defprint_info(**info):print(type(info))# <class 'dict'>forkey,valueininfo.items():print(f"{key}:{value}")print_info(name="张三",age=25,city="北京")# name: 张三# age: 25# city: 北京# 结合使用deffunc(*args,**kwargs):print("位置参数:",args)print("关键字参数:",kwargs)func(1,2,3,name="张三",age=25)# 位置参数: (1, 2, 3)# 关键字参数: {'name': '张三', 'age': 25}

返回值

基本返回

defadd(a,b):returna+b result=add(3,5)print(result)# 8# 没有 return 返回 Nonedefno_return():print("只打印不返回")print(no_return())# None

多返回值

Python 函数可以返回多个值(实际是元组):

defdivide(a,b):quotient=a//b remainder=a%breturnquotient,remainder q,r=divide(10,3)print(f"商:{q}, 余数:{r}")# 商: 3, 余数: 1# 也可以接收为元组result=divide(10,3)print(result)# (3, 1)

Lambda 表达式

lambda 是匿名函数,适合简单函数:

# 普通函数defsquare(x):returnx**2# lambda 版本square=lambdax:x**2print(square(5))# 25# 结合内置函数使用numbers=[5,2,8,1,9]# sorted 配合 lambda 按绝对值排序sorted_nums=sorted(numbers,key=lambdax:-x)# 降序print(sorted_nums)# [9, 8, 5, 2, 1]# map 配合 lambdadoubled=list(map(lambdax:x*2,numbers))print(doubled)# [10, 4, 16, 2, 18]# filter 配合 lambdaevens=list(filter(lambdax:x%2==0,numbers))print(evens)# [2, 8]

装饰器

装饰器可以在不修改原函数的情况下,给函数添加新功能:

入门装饰器

# 定义装饰器defmy_decorator(func):defwrapper():print("调用函数之前")func()print("调用函数之后")returnwrapper# 使用装饰器@my_decoratordefsay_hello():print("你好!")say_hello()# 调用函数之前# 你好!# 调用函数之后# 相当于:# say_hello = my_decorator(say_hello)

带参数的装饰器

defrepeat(times):defdecorator(func):defwrapper(*args,**kwargs):for_inrange(times):func(*args,**kwargs)returnwrapperreturndecorator@repeat(times=3)defgreet(name):print(f"你好,{name}!")greet("张三")# 你好,张三!# 你好,张三!# 你好,张三!

functools.wraps

保留原函数的信息:

importfunctoolsdefmy_decorator(func):@functools.wraps(func)# 保留原函数信息defwrapper(*args,**kwargs):print("开始")returnfunc(*args,**kwargs)returnwrapper@my_decoratordefadd(a,b):"""返回两数之和"""returna+bprint(add.__name__)# add(而不是 wrapper)print(add.__doc__)# 返回两数之和(保留了原函数的文档)

实战案例

案例1:计时器

importtimeimportfunctoolsdeftimer(func):@functools.wraps(func)defwrapper(*args,**kwargs):start=time.time()result=func(*args,**kwargs)end=time.time()print(f"{func.__name__}执行耗时:{end-start:.2f}秒")returnresultreturnwrapper@timerdefslow_function():time.sleep(1)print("执行完成")slow_function()# 执行完成# slow_function 执行耗时: 1.00秒

案例2:参数验证

defvalidate(**rules):defdecorator(func):@functools.wraps(func)defwrapper(*args,**kwargs):forparam,conditioninrules.items():ifparaminkwargs:value=kwargs[param]if'min'inconditionandvalue<condition['min']:raiseValueError(f"{param}不能小于{condition['min']}")if'max'inconditionandvalue>condition['max']:raiseValueError(f"{param}不能大于{condition['max']}")if'type'inconditionandnotisinstance(value,condition['type']):raiseTypeError(f"{param}必须是{condition['type']}")returnfunc(*args,**kwargs)returnwrapperreturndecorator@validate(age={'min':0,'max':150,'type':int},name={'type':str})defregister(name,age):print(f"注册成功:{name},{age}岁")register(name="张三",age=25)# 正常register(name="李四",age=-5)# ValueError: age 不能小于 0

案例3:缓存装饰器

defcache(func):cache_dict={}@functools.wraps(func)defwrapper(*args):ifargsincache_dict:print(f"命中缓存:{args}")returncache_dict[args]result=func(*args)cache_dict[args]=resultreturnresultreturnwrapper@cachedeffibonacci(n):ifn<2:returnnreturnfibonacci(n-1)+fibonacci(n-2)print(fibonacci(10))# 55(计算)print(fibonacci(10))# 命中缓存:55(直接从缓存取)

我踩过的坑

坑1:默认参数用可变对象

# 错误!默认参数是可变对象会被共享defadd_item(item,items=[]):items.append(item)returnitemsprint(add_item(1))# [1]print(add_item(2))# [1, 2](不是 [2]!)print(add_item(3))# [1, 2, 3]# 正确做法defadd_item_correct(item,items=None):ifitemsisNone:items=[]items.append(item)returnitemsprint(add_item_correct(1))# [1]print(add_item_correct(2))# [2]print(add_item_correct(3))# [3]

坑2:lambda 中的变量作用域

# lambda 中的变量是延迟绑定的funcs=[lambdax:x+iforiinrange(3)]print([f(0)forfinfuncs])# [3, 3, 3](不是你期望的 [0, 1, 2]!)# 正确做法:立即绑定参数funcs=[lambdax,i=i:x+iforiinrange(3)]print([f(0)forfinfuncs])# [0, 1, 2]

坑3:装饰器顺序

@decorator1@decorator2deffunc():pass# 相当于:func = decorator1(decorator2(func))# 所以执行顺序是:func -> decorator2 -> decorator1

写在最后

函数是 Python 编程的灵魂。掌握好参数传递、返回值、lambda 和装饰器,你的代码会变得简洁又优雅。

我的经验是:好的函数应该做一件事,而且做好这件事。

有帮助的话点个赞,有问题评论区见!

http://www.jsqmd.com/news/636038/

相关文章:

  • 告别模糊截图:html-to-image 终极高清图像生成指南
  • PCILeech DMA攻击工具深度实战指南:掌握无驱动内存取证核心技术
  • 网络攻防实践五 20252901程宇
  • 终极指南:使用icloudpd命令行工具轻松备份你的iCloud照片库
  • OpCore Simplify终极指南:三分钟完成黑苹果完美配置
  • 运维怎么转行网络安全?(非常详细)从零基础入门到精通,收藏这一篇就够了
  • Python GUI程序怎么避免卡顿_利用多线程实现后台异步处理
  • C++ string类
  • 360Controller:macOS平台Xbox游戏控制器驱动深度解析与实战指南
  • 如何通过Java程序监控Oracle表空间_JDBC定时执行巡检SQL并推送报警指标
  • 别急着换卡!双T4虚拟机掉卡报错RmInitAdapter failed,我的排查思路和重启大法复盘
  • Chinook数据库:一站式多数据库平台教学与测试解决方案
  • FOC电流采样实战:从采样电阻到ADC的完整信号链设计
  • 3步解锁B站AI视频总结:让学习效率飙升300%的秘密武器
  • Palantir实战指南:单细胞转录组拟时分析的Python实现与优化
  • 重新定义Windows字体个性化:No!! MeiryoUI深度解析与使用指南
  • AI元人文:意义行为原生论的发生学阐明与伦理中间件建构
  • 别再用RAG硬凑了!:用知识图谱原生支撑AIAgent决策流——从Schema建模、实体对齐到因果推理的全链路工程实践
  • 如何快速配置黑苹果:OpCore-Simplify自动化工具的终极指南
  • 利用龙虾优化代码项目
  • Arduino
  • 2026年烘干机性价比推荐:避坑盘点,哪款才是长期使用的真香之选? - 资讯焦点
  • 一阶数字低通滤波器在嵌入式系统中的应用与C语言实现
  • 降AI率工具怎么挑?亲测6款热门产品,避坑高性价比指南
  • BiliTools:释放你的B站内容收藏潜能,3步完成专业级资源管理
  • GoCodingInMyWay蓖
  • 20253221 2025-2026-2 《Python程序设计》实验2报告
  • 西安全渠道推广实力企业测评:亿众互通T云系统深度解析 - 资讯焦点
  • Java程序设计(第3版)第二章——引用数据类型:String
  • 2026 私厨上门与融合菜服务推荐榜:济南唐汇餐饮领衔品质私宴体验 - 海棠依旧大