
第10章 Python 函数定义、参数与返回值复制粘贴是万恶之源。函数就是用来消灭重复代码的把一段逻辑包起来起个名字需要时喊一声。Python 的函数定义简单到只有def一个关键字但参数玩法比 Java 丰富得多——默认参数、关键字参数、可变参数这一章一次讲清。一、基本定义与文档字符串defgreet(name):打招呼这是文档字符串用 help(函数名) 可查看returnf你好,{name}!print(greet(小明))输出你好, 小明!Python 没有返回类型声明直接return就行函数体靠缩进。三引号包起来的字符串是文档字符串写在函数第一行是 Python 的官方注释规范。二、默认参数defpower(base,exp2):returnbase**expprint(3^2 ,power(3))print(2^10 ,power(2,10))输出3^2 9 2^10 1024调用时没传exp就用默认值 2。重要规则有默认值的参数必须放在没有默认值的参数后面否则语法错误。三、关键字参数调用时点名defcreate_user(name,age,city):returnf{name}/{age}/{city}print(create_user(age18,name小红,city北京))# 顺序随便输出小红/18/北京参数一多位置传参就容易搞混哪个是年龄哪个是城市。关键字参数让调用处自解释还能打乱顺序——这是 Python 代码可读性的重要来源。四、可变参数 *args 与 **kwargsdefsum_all(*args):returnsum(args)print(sum_all(1,2,3) ,sum_all(1,2,3))defshow_info(**kwargs):fork,vinkwargs.items():print(f{k}:{v})show_info(name小明,age18)输出sum_all(1,2,3) 6 show_info: name: 小明 age: 18*args把多余的位置参数收成元组任意个数的参数**kwargs把多余的关键字参数收成字典任意个数的命名参数。装饰器、框架回调大量使用这两个语法。五、多返回值本质是元组defdivide(a,b):returna//b,a%b# 一次返回两个值q,rdivide(17,5)print(17 ÷ 5 商,q,余,r)输出17 ÷ 5 商 3 余 2Java 想返回多个值要造个对象或用数组Python 直接返回元组调用方解包即可。六、函数是一等公民函数可以像变量一样传来传去defadd(x,y):returnxydefsub(x,y):returnx-ydefcalc(op,x,y):returnop(x,y)print(calc(add, 5, 3) ,calc(add,5,3))print(calc(sub, 5, 3) ,calc(sub,5,3))输出calc(add, 5, 3) 8 calc(sub, 5, 3) 2把函数当参数传是 Python 函数式风格的基础sorted(key...)、map/filter全靠它。七、类型注解写给人和工具看的defarea(width:float,height:float)-float:returnwidth*heightprint(面积:,area(3,4.5))输出面积: 13.5注解不影响运行但能让 IDE 提示更准、团队协作更清晰。大型项目推荐写。八、本章小结def 函数名(参数):return文档字符串写在第一行默认参数放最后关键字参数让调用自解释*args收位置参数成元组**kwargs收关键字参数成字典多返回值本质是元组用解包接收函数是一等公民可赋值、可传参、可返回类型注解建议写提升可读性与工具支持。下一篇第11章 Python 函数进阶lambda、作用域与递归