函数
在Python中,函数是组织好的、可重复使用的代码段,用来实现单一或相关联的功能。函数能提高代码的模块性和重复利用率。
1. 基本函数定义
# 注解没有强制要求的意思
# def 方法名(参数 : 限定条件注解) -> 结果的类型注解:
# 函数体
def greet(name):
print(f"Hello, {name}!")
greet("Alice") # 输出: Hello, Alice!
2. 函数参数
参数:用于传值,主要分为位置参数、默认参数、可变参数、关键字参数几种来使用。
- 位置参数:最基本的参数传递方式,按照参数定义的顺序依次传递
- 默认参数:在定义函数时,可以给参数指定默认值,调用时可不传该参数
- 可变位置参数:用于接收任意数量的位置参数,存储为元组(tuple)
- 可变关键字参数:用于接收任意数量的关键字参数,存储为字典(dict)
- 仅限关键字参数:在 args 或 * 之后定义的参数,必须用关键字传递( 表示后面的参数必须用 key=value 形式传递)
- 仅限位置参数:Python 3.8+ 支持 / 语法,表示前面的参数只能按位置传递(/ 之前的参数只能按位置传递)
# 位置参数a,b
def add(a, b):
return a + b
# 默认参数:exponent 和 位置参数:base
def power(base, exponent=2):
return base ** exponent
# 可变位置参数 (*args)
def sum_all(*numbers):
return sum(numbers)
# 关键字参数 (**kwargs)
def person_info(**details):
for key, value in details.items():
print(f"{key}: {value}")
# 仅限关键字参数(* 表示后面的参数必须用 key=value 形式传递)
def greet(name, *, message="Hello"):
print(f"{message}, {name}!")
greet("Alice") # 输出:Hello, Alice!
greet("Bob", message="Hi") # 输出:Hi, Bob!
greet("Charlie", "Hey") # 错误:message 必须用关键字传递
# 仅限位置参数 (/之前的参数只能按位置传递)
def greet(name, /, message="Hello"):
print(f"{message}, {name}!")
greet("Alice") # 正确
greet(name="Bob", message="Hi") # 错误:name 不能使用关键字传递
3. 返回值(return)
return :将传入的值经过函数体的一系列变化之后输出的一个值。
def multiply(x, y):
return x * y
result = multiply(3, 4) # 返回12
4. Lambda 函数(匿名函数)
Lambda函数可以接受任何数量的参数,但只能有一个表达式(这个表达式被计算并返回)。Lambda函数通常用于小的、一次性的、匿名的函数场景,如排序或过滤列表中的元素。
# 使用方法:lambda 参数列表: 表达式
square = lambda x: x ** 2
print(square(5)) # 输出: 25
5. 作用域
作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性。
分为 全局变量(在全局有用的变量)和局部变量(仅在自己指定的一部分区域有用的变量)
x = 10 # 全局变量,作用于全局
def func():
global x # 声明使用全局变量
x = 20
func()
print(x) # 输出: 20
6. 装饰器
装饰器修饰器是 Python 中一种强大的语法特性,它允许你在不修改原函数代码的情况下,为函数添加额外的功能,它接受一个函数作为参数并返回一个新的函数。一般用@开头。
- 自定义类修饰器
- 内置修饰器(@property、 @classmethod 、@staticmethod、@timer、@lru_cache)
def my_decorator(func):
def wrapper():
print("函数执行前")
func()
print("函数执行后")
return wrapper
@my_decorator # 自定义的类修饰器
def say_hello():
print("Hello!")
# @property 使用该修饰方法,将方法转为属性使用,property是只读属性
# @属性名.setter 在property转化为属性后,再在该属性后增加一个可写属性,必须与property搭配使用
# 在使用这两个修饰器时,需要讲get__year和set__year方法全部改成year,方便变成属性使用
# @classmethod 不需要实例化,不需要self参数,返回函数的类方法
# @staticmethod 静态方法,不需要实例化,不强制要求传递参数
# @timer 计时修饰器
# @lru_cache 缓存修饰器
say_hello()
函数是 Python 编程的核心概念,合理使用函数可以使代码更模块化、更易读、更易维护。