资讯动态

在 Python 中,`def` 是定义函数最基础、也最重要的关键字

发布时间:2026/10/15 12:52:52 来源:尧图企业网站定制
在 Python 中def是定义函数最基础、也最重要的关键字。函数可以把一段重复使用的逻辑封装起来使程序更清晰、更容易维护。对于软件类考试来说函数定义、参数传递和返回值经常出现在选择题、程序填空题和程序设计题中。掌握这些内容不仅要会写函数还要理解参数是如何传递的、默认值什么时候生效、可变参数如何使用、返回值怎样组织以及函数作用域对程序结果有什么影响。一、函数定义的基本形式Python 中使用def定义函数基本语法如下def函数名(参数列表):函数体return返回值其中函数名需要符合标识符命名规则参数列表可以为空也可以包含多个参数。函数体必须缩进通常使用 4 个空格。return语句用于返回结果如果函数中没有写return或者只写了return而没有返回值函数默认返回None。例如defgreet(name):returnf你好{name}print(greet(Python))运行结果你好Python这里name是形式参数调用函数时传入的Python是实际参数。函数执行后通过return把拼接好的字符串返回给调用者。二、位置参数与关键字参数函数参数可以分为位置参数和关键字参数。位置参数按照顺序传递关键字参数通过“参数名值”的方式传递。defshow_info(name,age,city):print(f姓名{name})print(f年龄{age})print(f城市{city})# 位置参数调用show_info(小明,20,广州)# 关键字参数调用show_info(city深圳,name小红,age22)位置参数调用时参数顺序必须与函数定义一致。关键字参数调用时顺序可以不固定但关键字参数不能写在位置参数前面也不能重复给同一个参数赋值。三、默认参数默认参数允许在定义函数时给参数设置默认值。如果调用时没有传入对应参数就使用默认值。defregister(name,role学生):print(f{name}的角色是{role})register(小李)register(小王,老师)运行结果小李 的角色是 学生 小王 的角色是 老师默认参数需要注意一个重要问题默认值只会在函数定义时计算一次。如果默认值是可变对象比如列表、字典多次调用函数时可能会共享同一个对象。defadd_item(item,items[]):items.append(item)returnitemsprint(add_item(1))print(add_item(2))运行结果可能是[1] [1, 2]这是因为items[]在函数定义时只创建了一次后续调用会一直使用同一个列表。更安全的写法是defadd_item(item,itemsNone):ifitemsisNone:items[]items.append(item)returnitems这样每次调用时如果没有传入列表就会创建一个新的空列表避免数据被意外共享。四、可变参数*args 和 **kwargs当参数数量不确定时可以使用*args和**kwargs。*args接收多余的位置参数组织成元组**kwargs接收多余的关键字参数组织成字典。defsummary(*args,**kwargs):print(位置参数,args)print(关键字参数,kwargs)summary(1,2,3,namePython,version3)运行结果位置参数 (1, 2, 3) 关键字参数 {name: Python, version: 3}*args和**kwargs常用于封装通用函数。例如可以编写一个求和函数支持传入任意多个数字deftotal(*numbers):result0forninnumbers:resultnreturnresultprint(total(1,2,3))print(total(10,20))五、返回值单个值、多个值与 None函数可以返回一个值也可以返回多个值。返回多个值时Python 实际上是把它们打包成元组。defcalc(a,b):returnab,a-b,a*b s,d,pcalc(10,3)print(和,s)print(差,d)print(积,p)运行结果和 13 差 7 积 30如果函数没有return或者只写return返回值就是None。defsay_hello():print(Hello)resultsay_hello()print(result)运行结果Hello None这里print(Hello)只是输出内容并不是返回值。函数本身没有返回数据所以result的值是None。六、参数传递机制可变对象与不可变对象Python 中参数传递采用对象引用方式。对于不可变对象如整数、字符串、元组在函数内部重新赋值不会影响外部变量对于可变对象如列表、字典如果在函数内部修改对象内容外部变量可能会受到影响。defchange_number(x):xx10defchange_list(lst):lst.append(99)a5nums[1,2,3]change_number(a)change_list(nums)print(a)# 5print(nums)# [1, 2, 3, 99]a没有变化因为整数是不可变对象函数内部的x x 10只是让局部变量x指向新对象。而nums被修改了因为列表是可变对象append直接修改了原列表内容。如果希望函数不修改原列表可以在函数内部创建副本defsafe_change_list(lst):new_lstlst.copy()new_lst.append(99)returnnew_lst七、变量作用域局部变量与全局变量函数内部定义的变量通常是局部变量只能在函数内部使用。函数外部定义的变量是全局变量在函数内部可以读取但不能直接修改。如果需要在函数内部修改全局变量需要使用global关键字。count0defadd():globalcount count1add()add()print(count)# 2不过在实际开发中不建议频繁使用global。更推荐通过参数传入、返回值传出的方式管理数据这样函数之间的依赖关系更清晰。八、lambda 表达式Python 还支持使用lambda定义匿名函数。匿名函数适合用于简单、一次性使用的函数。squarelambdax:x**2print(square(5))# 25pairspairs.sort(keylambdap:p[1])print(pairs)运行结果25lambda函数只能包含一个表达式不能写复杂语句。它常与sorted、map、filter等函数配合使用。九、综合示例学生成绩统计函数下面给出一个综合示例演示函数定义、参数传递、默认参数、可变参数和返回值的使用。defstudent_report(name,*scores,subject综合,min_pass60):ifnotscores:return{name:name,subject:subject,error:没有成绩数据}total_scoresum(scores)avg_scoretotal_score/len(scores)max_scoremax(scores)min_scoremin(scores)passedall(smin_passforsinscores)report{姓名:name,科目:subject,成绩:scores,总分:total_score,平均分:round(avg_score,2),最高分:max_score,最低分:min_score,是否全部及格:passed,}returnreport r1student_report(小明,85,90,76,subject期末)r2student_report(小红,55,80,92,min_pass60)forkey,valueinr1.items():print(key,value)print()forkey,valueinr2.items():print(key,value)运行结果姓名 小明 科目 期末 成绩 (85, 90, 76) 总分 251 平均分 83.67 最高分 90 最低分 76 是否全部及格 True 姓名 小红 科目 综合 成绩 (55, 80, 92) 总分 227 平均分 75.67 最高分 92 最低分 55 是否全部及格 False这个例子中name是普通位置参数*scores接收任意多个成绩subject和min_pass是带默认值的参数。函数返回一个字典便于后续继续处理或展示。十、报告亮点与易错点总结def是函数定义的核心函数必须有函数名、参数列表、缩进函数体返回值通过return给出。位置参数和关键字参数可以混合使用但关键字参数不能出现在位置参数前面也不能重复赋值。默认参数要注意可变对象陷阱不要使用def func(items[])这种写法推荐使用None作为默认值在函数内部创建新对象。*args接收多余位置参数**kwargs接收多余关键字参数它们让函数具有更强的扩展性适合封装通用逻辑。返回值可以是任意类型返回多个值时Python 会将其打包为元组没有返回值时函数返回None。参数传递基于对象引用不可变对象在函数内部重新赋值不会影响外部变量可变对象如果在函数内部被修改外部变量可能随之变化。局部变量和全局变量要区分清楚函数内部默认不能直接修改全局变量需要使用global但应谨慎使用。lambda适合简单表达式函数它不能替代复杂函数但在排序、过滤、映射等场景中非常实用。掌握def定义函数、参数传递机制和返回值规则是学习 Python 程序设计的重要基础。考试中出现相关题目时可以先判断参数类型再看是否有默认值、可变参数或作用域问题最后分析函数返回值是否满足题目要求。这样既能提高解题准确率也能帮助形成规范的编程思维。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑