Python 函数
函数是组织代码的基本单元,可以提高代码的复用性和可读性。
函数定义
基本语法
def function_name(parameters):
"""函数文档字符串"""
# 函数体
return result # 返回值
示例
def greet():
"""问候函数"""
print("你好,欢迎学习 Python!")
# 调用函数
greet()
函数参数
位置参数
def add(a, b):
return a + b
result = add(3, 5) # result = 8
默认参数
def greet(name, greeting="你好"):
print(f"{greeting},{name}!")
greet("张三") # 你好,张三!
greet("李四", "欢迎") # 欢迎,李四!
关键字参数
def person(name, age, city):
print(f"姓名:{name}")
print(f"年龄:{age}")
print(f"城市:{city}")
# 使用关键字参数
person(name="张三", age=20, city="北京")
person(city="上海", name="李四", age=25)
不定长参数
*args - 接收任意数量的位置参数
def sum_all(*args):
total = 0
for num in args:
total += num
return total
print(sum_all(1, 2, 3)) # 6
print(sum_all(1, 2, 3, 4, 5)) # 15
**kwargs - 接收任意数量的关键字参数
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="张三", age=20, city="北京")
参数组合使用
def func(a, b, c=0, *args, **kwargs):
print(f"a={a}, b={b}, c={c}")
print(f"args={args}")
print(f"kwargs={kwargs}")
func(1, 2, 3, 4, 5, name="张三", age=20)
# a=1, b=2, c=3
# args=(4, 5)
# kwargs={'name': '张三', 'age': 20}
函数返回值
return 语句
def add(a, b):
return a + b
result = add(3, 5) # result = 8
返回多个值
def get_person():
name = "张三"
age = 20
city = "北京"
return name, age, city
person = get_person()
print(person) # ('张三', 20, '北京')
# 也可以用多个变量接收
name, age, city = get_person()
无返回值
def print_hello():
print("Hello")
result = print_hello() # result = None
变量作用域
局部变量
在函数内部定义的变量,只能在函数内部使用:
def test():
x = 10 # 局部变量
print(x)
test() # 10
# print(x) # 错误:x 未定义
全局变量
在函数外部定义的变量,可以在整个文件中使用:
x = 10 # 全局变量
def test():
print(x) # 可以访问全局变量
test() # 10
使用 global 关键字
在函数内部修改全局变量:
x = 10
def test():
global x # 声明使用全局变量
x = 20
test()
print(x) # 20
nonlocal 关键字
在嵌套函数中修改外层函数的变量:
def outer():
x = 10
def inner():
nonlocal x
x = 20
inner()
print(x) # 20
outer()
匿名函数(lambda)
lambda 函数是简单的匿名函数:
# 基本语法
lambda parameters: expression
# 示例
square = lambda x: x ** 2
print(square(5)) # 25
# 多参数
add = lambda a, b: a + b
print(add(3, 5)) # 8
lambda 与内置函数结合
# 与 map() 配合
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x ** 2, numbers))
print(squared) # [1, 4, 9, 16, 25]
# 与 filter() 配合
numbers = [1, 2, 3, 4, 5, 6]
even = list(filter(lambda x: x % 2 == 0, numbers))
print(even) # [2, 4, 6]
# 与 sorted() 配合
pairs = [(1, 'one'), (3, 'three'), (2, 'two')]
sorted_pairs = sorted(pairs, key=lambda x: x[0])
print(sorted_pairs) # [(1, 'one'), (2, 'two'), (3, 'three')]
递归函数
函数调用自身:
# 阶乘
def factorial(n):
if n <= 1:
return 1
return n * factorial(n - 1)
print(factorial(5)) # 120
# 斐波那契数列
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(10)) # 55
函数注解
为函数参数和返回值添加元数据:
def func(a: int, b: str) -> str:
"""带有类型注解的函数"""
return f"{a} - {b}"
# 注解不会强制执行,仅作为提示
print(func(1, "hello"))
高阶函数
接受函数作为参数或返回函数的函数:
def apply(func, value):
"""高阶函数:接受另一个函数作为参数"""
return func(value)
def double(x):
return x * 2
result = apply(double, 5) # 10
内置函数
Python 提供了许多内置函数:
# 数值相关
abs(-5) # 5 - 绝对值
max([1, 2, 3]) # 3 - 最大值
min([1, 2, 3]) # 1 - 最小值
pow(2, 3) # 8 - 幂运算
round(3.7) # 4 - 四舍五入
sum([1, 2, 3]) # 6 - 求和
# 类型转换
int("10") # 10
float("3.14") # 3.14
str(123) # "123"
bool(1) # True
# 其他
len("hello") # 5 - 长度
type(123) # <class 'int'> - 类型
range(5) # range(0, 5)
list(range(5)) # [0, 1, 2, 3, 4]
小结
本章我们学习了:
- 函数的定义和调用
- 函数参数(位置参数、默认参数、关键字参数、不定长参数)
- 函数返回值
- 变量作用域(局部变量、全局变量)
- 匿名函数 lambda
- 递归函数
- 函数注解
- 高阶函数
- 内置函数
练习
- 编写一个函数,计算两个数的最大公约数
- 编写一个函数,判断一个字符串是否是回文
- 编写一个函数,接受任意数量的数字,返回最大值和最小值
- 使用递归实现汉诺塔游戏