Python函数:定义、参数与返回值
函数是代码复用的基本单位,本篇将学习如何定义函数、各种参数类型以及返回值的使用。
一、函数基础
1. 为什么需要函数?
- 代码复用:避免重复编写相同逻辑
- 模块化:将复杂程序拆分为小模块,便于维护
- 抽象:调用者只需知道功能,不需了解实现细节
2. 定义函数
def函数名(参数列表):"""函数文档字符串"""函数体return返回值示例:
defgreet(name):"""向指定的人打招呼"""returnf"你好,{name}!"# 调用函数print(greet("小明"))# 你好,小明!3. 查看函数文档
print(greet.__doc__)# 向指定的人打招呼help(greet)# 查看详细帮助二、参数类型
1. 位置参数
按顺序传递的参数,最基本的形式。
defadd(a,b):returna+bprint(add(3,5))# 82. 默认参数
定义时给参数默认值,调用时可省略。
defpower(base,exp=2):returnbase**expprint(power(3))# 9(使用默认exp=2)print(power(3,3))# 27⚠️重要规则:默认参数必须放在位置参数后面。
⚠️经典坑:默认参数不要用可变对象(如列表),因为它只初始化一次。
# 错误示范defappend_item(item,lst=[]):lst.append(item)returnlstprint(append_item(1))# [1]print(append_item(2))# [1, 2] 不是预期的[2]!# 正确写法defappend_item(item,lst=None):iflstisNone:lst=[]lst.append(item)returnlst3. 关键字参数
调用时通过参数名=值的形式传递,不受顺序限制。
defintroduce(name,age,city):print(f"我叫{name},今年{age}岁,来自{city}")introduce(age=18,city="北京",name="小明")# 顺序可以任意4. 可变参数
*args:收集任意数量的位置参数为元组**kwargs:收集任意数量的关键字参数为字典
defsum_all(*args):"""计算所有参数的和"""returnsum(args)print(sum_all(1,2,3))# 6print(sum_all(1,2,3,4,5))# 15defprint_info(**kwargs):"""打印所有关键字参数"""forkey,valueinkwargs.items():print(f"{key}:{value}")print_info(name="小明",age=18,city="北京")# 输出:# name: 小明# age: 18# city: 北京5. 参数组合
参数定义的顺序必须是:位置参数 → 默认参数 → *args → 命名关键字参数 → **kwargs
defcomplex_func(a,b,c=0,*args,d,**kwargs):print(f"a={a}, b={b}, c={c}")print(f"args={args}")print(f"d={d}")print(f"kwargs={kwargs}")complex_func(1,2,3,4,5,d=6,e=7,f=8)# a=1, b=2, c=3# args=(4, 5)# d=6# kwargs={'e': 7, 'f': 8}三、返回值
1. 基本返回值
defadd(a,b):returna+b result=add(3,5)print(result)# 82. 返回多个值
Python函数可以返回多个值(本质是返回元组)。
defcalculate(a,b):"""返回和、差、积、商"""returna+b,a-b,a*b,a/b result=calculate(10,3)print(result)# (13, 7, 30, 3.333...)# 解包接收add_result,sub_result,mul_result,div_result=calculate(10,3)3. 没有return的函数
没有return语句或return后没有值的函数,默认返回None。
defsay_hello():print("Hello")result=say_hello()print(result)# None4. 提前返回
defget_grade(score):ifscore<0orscore>100:return"无效分数"# 提前返回ifscore>=90:return"A"elifscore>=80:return"B"elifscore>=60:return"C"else:return"D"四、变量作用域
1. 局部变量与全局变量
x=10# 全局变量deffunc():x=20# 局部变量(和全局x是两个不同的变量)print(f"函数内x ={x}")func()# 函数内x = 20print(f"函数外x ={x}")# 函数外x = 102. global关键字
在函数内修改全局变量需要用global声明。
count=0defincrement():globalcount# 声明使用全局变量count+=1increment()increment()print(count)# 23. LEGB规则
Python查找变量的顺序:
- Local(局部)→Enclosing(嵌套函数的外层)→Global(全局)→Built-in(内置)
x="global"defouter():x="enclosing"definner():x="local"print(x)# localinner()outer()五、实战:常用工具函数集
importmathdefis_prime(n):"""判断是否为素数"""ifn<2:returnFalseforiinrange(2,int(math.sqrt(n))+1):ifn%i==0:returnFalsereturnTruedeffibonacci(n):"""生成斐波那契数列前n项"""ifn<=0:return[]ifn==1:return[0]seq=[0,1]for_inrange(2,n):seq.append(seq[-1]+seq[-2])returnseqdefbinary_search(arr,target):"""二分查找,返回索引,不存在返回-1"""left,right=0,len(arr)-1whileleft<=right:mid=(left+right)//2ifarr[mid]==target:returnmidelifarr[mid]<target:left=mid+1else:right=mid-1return-1# 测试print(is_prime(17))# Trueprint(fibonacci(10))# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]print(binary_search([1,3,5,7,9],7))# 3六、课后练习
- 编写函数,判断一个字符串是否为回文字符串(正读反读一样)
- 编写函数,统计字符串中字母、数字、空格和其他字符的个数
- 编写函数,实现冒泡排序算法
七、小结
本篇学习了函数的定义、五种参数类型、返回值以及变量作用域。函数是编程的核心概念,掌握好函数能让你的代码更简洁、更易维护。
📌下一篇预告:《Python函数进阶:可变参数、匿名函数与作用域》
本专栏持续更新中,欢迎点赞、收藏、关注三连支持!🐍