函数:定义、参数、返回值与调用
核心概念
函数是可重用的代码块,接收输入(参数),执行操作,返回结果。Python 中函数是一等对象(first-class objects),可以赋值给变量、作为参数传递、从其他函数返回。
关键要素:
- 定义:使用
def关键字 - 参数:函数输入,可选
- 返回值:使用
return,可选 - 调用:使用函数名和括号
定义第一个函数
基本语法:
def greet(name):
"""向某人问好"""
return f"Hello, {name}!"
# 调用函数
message = greet("Alice")
print(message) # Hello, Alice!关键点:
def开始函数定义greet是函数名(遵循变量命名规则)name是参数- 三引号字符串是文档字符串(docstring),描述函数作用
return返回结果
参数与返回值
无参数函数
def say_hello():
print("Hello, World!")
# 没有 return,隐式返回 None
result = say_hello() # 打印 "Hello, World!"
print(result) # None多个参数
def add(a, b):
return a + b
print(add(3, 5)) # 8
print(add("Hello, ", "World")) # Hello, WorldPython 是动态类型,参数可以是任何类型。函数行为取决于运行时类型。
返回多个值
使用元组:
def get_user_info():
name = "Alice"
age = 30
return name, age # 实际返回元组 (name, age)
name, age = get_user_info() # 解包
print(f"{name} is {age} years old")
# 或作为元组使用
info = get_user_info()
print(info) # ('Alice', 30)无 return 或空 return
def print_sum(a, b):
print(a + b)
# 没有 return
result = print_sum(3, 5) # 打印 8
print(result) # None
def early_exit(x):
if x < 0:
return # 提前返回,值为 None
return x * 2
print(early_exit(-5)) # None
print(early_exit(5)) # 10默认参数值
参数可以有默认值:
def greet(name, greeting="Hello"):
return f"{greeting}, {name}!"
print(greet("Alice")) # Hello, Alice!
print(greet("Bob", "Hi")) # Hi, Bob!重要规则:有默认值的参数必须在无默认值参数之后
# 正确
def func(a, b, c=3, d=4):
pass
# 错误
def func(a, b=2, c, d=4): # SyntaxError
pass默认值陷阱:可变对象
危险代码:
def add_item(item, items=[]):
items.append(item)
return items
print(add_item("apple")) # ['apple']
print(add_item("banana")) # ['apple', 'banana'] !!问题:默认值 [] 在函数定义时创建一次,所有调用共享同一个列表对象。
正确写法:
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
print(add_item("apple")) # ['apple']
print(add_item("banana")) # ['banana']使用 None 作为哨兵值,在函数体内创建新列表。
位置参数 vs 关键字参数
位置参数
按顺序传递:
def divide(a, b):
return a / b
print(divide(10, 2)) # 5.0
print(divide(2, 10)) # 0.2,顺序很重要关键字参数
明确指定参数名:
print(divide(a=10, b=2)) # 5.0
print(divide(b=2, a=10)) # 5.0,顺序无关混合使用
位置参数必须在关键字参数之前:
def create_user(name, age, city="Unknown"):
return f"{name}, {age}, from {city}"
# 正确
print(create_user("Alice", 30))
print(create_user("Bob", 25, city="NYC"))
print(create_user("Carol", 28, "LA"))
# 错误
print(create_user(name="Dan", 35)) # SyntaxError文档字符串(Docstring)
函数的第一个字符串是文档字符串,描述函数作用、参数和返回值:
def calculate_area(length, width):
"""
计算矩形面积。
参数:
length: 矩形长度
width: 矩形宽度
返回:
矩形面积(浮点数)
"""
return length * width
# 访问文档字符串
print(calculate_area.__doc__)
help(calculate_area)良好的文档字符串包括:
- 简短描述(一行)
- 详细说明(可选)
- 参数说明
- 返回值说明
- 异常说明(如果适用)
函数是对象
Python 中函数是一等对象:
def square(x):
return x * x
# 函数赋值给变量
f = square
print(f(5)) # 25
# 函数作为参数
def apply_twice(func, value):
return func(func(value))
print(apply_twice(square, 3)) # square(square(3)) = 81
# 函数列表
operations = [square, abs, len]
print(operations[0](4)) # 16匿名函数:lambda
简单的单表达式函数可以用 lambda 定义:
# 普通函数
def add(a, b):
return a + b
# lambda 等价
add_lambda = lambda a, b: a + b
print(add_lambda(3, 5)) # 8
# 常用于排序等场景
pairs = [(1, 'one'), (3, 'three'), (2, 'two')]
pairs.sort(key=lambda pair: pair[1]) # 按字符串排序
print(pairs) # [(1, 'one'), (3, 'three'), (2, 'two')]限制:lambda 只能包含一个表达式,不能有语句(如 if 语句块、return)。复杂逻辑用 def 定义函数。
练习
温度转换:编写函数
celsius_to_fahrenheit(c)和fahrenheit_to_celsius(f),实现温度转换。公式:F = C × 9/5 + 32。默认参数:编写函数
power(base, exponent=2),计算幂次方。默认计算平方。测试power(3)和power(2, 10)。默认值陷阱:解释以下代码的输出,并修复它:
pythondef append_to(element, target=[]): target.append(element) return target list1 = append_to(1) list2 = append_to(2) print(list1) # 输出什么? print(list2) # 输出什么?多返回值:编写函数
min_max(numbers),返回列表中的最小值和最大值。测试:min_max([3, 1, 4, 1, 5, 9, 2, 6])。函数作为参数:编写函数
apply_operation(func, numbers),将函数func应用到列表numbers的每个元素。测试:pythondef double(x): return x * 2 print(apply_operation(double, [1, 2, 3, 4])) # 期望输出:[2, 4, 6, 8]
完成练习后,打开本章答案页核对。
下一步
理解了函数定义和调用,下一节学习作用域:函数如何找到变量,LEGB 规则,全局与局部变量。
回到第二章概览 · 返回Python 学习路线