Python入门(4):函数
目录
1 基本概念
1.1 函数的定义与调用
2 函数的参数
2.1 位置参数(Positional Arguments)
2.2 默认参数(Default Arguments)
2.3 关键字参数(Keyword Arguments)
**2.4 可变参数(*args 和 kwargs)
3 返回值与作用域
3.1 返回值(return)
3.2 变量的作用域
4 Lambda函数(匿名函数)
5 高阶函数与装饰器
5.1 高阶函数
5.2 装饰器(Decorator)
6 最佳实践与常见问题
说明:类型提示是非强制性和非限制性的
1 基本概念
函数(Function) 是一段可重复调用的代码块,用于执行特定任务。通过函数,我们可以实现代码的模块化、复用和逻辑分离。
1.1 函数的定义与调用
# 定义一个简单的函数
def greet(name):
"""
向用户打招呼的函数
:param name: 用户名(字符串类型)
:return: 无返回值(None)
"""
print(f"Hello, {name}!")
# 调用函数
greet("Alice") # 输出:Hello, Alice!
关键点说明:
-
def
:定义函数的关键字。 -
greet
:函数名,需遵循变量命名规则(小写字母+下划线)。 -
(name)
:参数列表,调用时需传入对应的值。 -
"""docstring"""
:函数的文档字符串,用于说明功能(可通过help(greet)
查看)。
2 函数的参数
2.1 位置参数(Positional Arguments)
按参数定义的顺序传递值。
def add(a, b):
"""返回两个数的和"""
return a + b
result = add(3, 5) # a=3, b=5
print(result) # 输出:8
2.2 默认参数(Default Arguments)
为参数提供默认值,调用时可省略。
def power(base, exponent=2):
"""计算base的exponent次方,默认平方"""
return base ** exponent
print(power(3)) # 输出:9(使用默认exponent=2)
print(power(3, 3)) # 输出:27
注意:默认参数必须定义在非默认参数之后!
2.3 关键字参数(Keyword Arguments)
通过参数名指定值,可忽略顺序。
def describe_pet(name, animal_type="dog"):
print(f"I have a {animal_type} named {name}.")
describe_pet(name="Max") # 输出:I have a dog named Max.
describe_pet(animal_type="cat", name="Luna") # 顺序无关
**2.4 可变参数(*args 和 kwargs)
-
*args
:接收任意数量的位置参数,存储为元组。 -
**kwargs
:接收任意数量的关键字参数,存储为字典。
def log_details(*args, **kwargs):
"""记录任意数量的位置参数和关键字参数"""
print("Positional args:", args) # 输出:(1, 2, 3)
print("Keyword args:", kwargs) # 输出:{'name': 'Alice', 'age': 25}
log_details(1, 2, 3, name="Alice", age=25)
3 返回值与作用域
3.1 返回值(return)
-
函数通过
return
返回结果,若无return
则返回None
。 -
可返回多个值(实际是返回一个元组)。
def divide(a, b):
"""返回商和余数"""
quotient = a // b
remainder = a % b
return quotient, remainder
q, r = divide(10, 3) # q=3, r=1
3.2 变量的作用域
-
局部变量:函数内定义的变量,仅函数内有效。
-
全局变量:函数外定义的变量,需用
global
关键字修改。
count = 0 # 全局变量
def increment():
global count # 声明使用全局变量
count += 1
increment()
print(count) # 输出:1
4 Lambda函数(匿名函数)
Lambda用于定义简单的单行函数,语法:lambda 参数: 表达式
。
lambda函数详解:Python扩展知识详解:lambda函数-CSDN博客
# 普通函数
def square(x):
return x ** 2
# Lambda等效
square = lambda x: x ** 2
print(square(4)) # 输出:16
# 常用场景:排序、map/filter等高阶函数
numbers = [1, 4, 2, 5]
sorted_numbers = sorted(numbers, key=lambda x: -x) # 降序排序
5 高阶函数与装饰器
5.1 高阶函数
接受函数作为参数或返回函数的函数。
def apply_operation(func, x, y):
"""应用传入的函数操作"""
return func(x, y)
result = apply_operation(lambda a, b: a * b, 3, 4) # 输出:12
5.2 装饰器(Decorator)
装饰器用于扩展函数功能,而不修改原函数代码。
def log_time(func):
"""记录函数执行时间的装饰器"""
def wrapper(*args, **kwargs):
import time
start = time.time()
result = func(*args, **kwargs) # 调用原函数
print(f"Time taken: {time.time() - start:.2f}s")
return result
return wrapper
@log_time
def slow_function():
import time
time.sleep(2)
slow_function() # 输出:Time taken: 2.00s
装饰器本质:@log_time
等价于 slow_function = log_time(slow_function)
。
6 最佳实践与常见问题
-
单一职责原则:一个函数只做一件事。
-
避免全局变量:优先通过参数和返回值传递数据。
-
类型提示(Type Hints):Python 3.5+支持标注参数和返回类型。
# 类型提示:name: str 表示传输的参数是str类型
# -> str : 表示返回的参数是str类型
def greet(name: str) -> str:
return f"Hello, {name}"
说明:类型提示是非强制性和非限制性的
- 非强制性:Python解释器不会强制类型检查,即使传入错误类型也能运行
- 非限定性:标注类型不会限制实际传入的类型,只是开发者的意图声明