一、函数基本语法
def 函数名(参数1, 参数2, ...):
"""文档字符串(可选)"""
函数体
return 返回值(可选)
二、函数文档
在函数开头的三引号引起来的内容,可以编写函数文档,以说明此函数的作用,以及用法,使用其它人员理解。
三、函数模块
1.编写函数模块
将编写的函数放在以.py为扩展名的文件中,即创建一个函数模块文件。
2.导入模块
import module_name # 导入整个模块
from module_name import function_name # 从模块中导入特定函数或类
from module_name import function_name1, function_name2 # 从模块中导入多个函数或类
import module_name as alias_name # 导入模块并使用别名
from module_name import * # 导入模块中所有内容(不推荐,可能存在命名空间污染)
四、模块搜索路径
在Python中,模块搜索路径是一个列表,包含了Python解释器在导入模块时会搜索的所有目录。这个列表可以通过 sys.path 来查看和修改。
1.查看模块搜索路径
import sys
print(sys.path)
2.添加自定义路径到模块搜索路径
你可以通过修改 sys.path 来添加自定义路径,以便Python解释器能够找到你自定义的模块。
import sys
sys.path.append('/path/to/your/module')
3.PYTHONPATH环境变量
你也可以通过设置 PYTHONPATH 环境变量来添加自定义路径。这样,每次启动Python解释器时,这些路径都会被自动添加到 sys.path 中。
4.默认搜索路径
sys.path 的默认内容通常包括:
- 当前脚本的目录(如果是在交互式解释器中,则是当前工作目录)。
- 环境变量 PYTHONPATH 中列出的目录(如果设置了的话)。
- Python安装时自带的标准库目录。
- 根据安装路径可能存在的其他目录。
五、函数参数形式
1.位置参数
位置参数是最常见的参数类型,调用函数时,传入的参数值按照顺序与函数定义中的参数一一对应。
def add(a, b):
return a + b
result = add(3, 5) # 位置参数,3对应a,5对应b
print(result) # 输出 8
2.关键字参数
关键字参数允许在调用函数时使用参数名来指定传入的值,这样可以不按照顺序传递参数。
def add(a, b):
return a + b
result = add(b=5, a=3) # 关键字参数,明确指定了a和b的值
print(result) # 输出 8
3.默认值参数
默认值参数允许在定义函数时为参数指定默认值,如果调用函数时没有提供该参数的值,则使用默认值。
def add(a, b=5):
return a + b
result = add(3) # 使用默认值b=5
print(result) # 输出 8
4.不定长参数
*args:用于接收任意数量的位置参数,这些参数会被收集到一个元组中。
def add(*args):
return sum(args)
result = add(1, 2, 3, 4) # 传递多个位置参数
print(result) # 输出 10
**kwargs:用于接收任意数量的关键字参数,这些参数会被收集到一个字典中。
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="Alice", age=30) # 传递多个关键字参数
# 输出:
# name: Alice
# age: 30
结合这些参数类型,你可以灵活地定义和调用函数。例如:
def example_function(a, b=2, *args, **kwargs):
print(f"a: {a}")
print(f"b: {b}")
print(f"args: {args}")
print(f"kwargs: {kwargs}")
example_function(1, 3, 4, 5, name="Alice", age=30)
# 输出:
# a: 1
# b: 3
# args: (4, 5)
# kwargs: {'name': 'Alice', 'age': 30}
在这个例子中,a 是位置参数,b 是默认值参数,args 接收额外的位置参数,*kwargs 接收额外的关键字参数。
六、传递值问题
函数可以传递元组、列表、字典值
传递参数时,在函数内的改动会影响到传递前的参数。如果不想影响,使用var.copy()
方法来传递值。
七、函数与变量作用域
1.全局变量
全局变量是在函数外部定义的变量,它们在整个程序中都可见,可以在任何函数内部访问。
global_var = 10
def print_global():
print(global_var) # 可以直接访问全局变量
print_global() # 输出 10
2.局部变量
局部变量是在函数内部定义的变量,它们只在定义它们的函数内部可见,函数外部无法访问。
def local_example():
local_var = 20
print(local_var) # 局部变量,只能在函数内部访问
local_example() # 输出 20
# print(local_var) # 这行代码会报错,因为local_var在函数外部不可见
3.修改全局变量
如果在函数内部需要修改全局变量,需要使用 global 关键字声明。
global_var = 10
def modify_global():
global global_var # 声明要修改的是全局变量
global_var = 30
modify_global()
print(global_var) # 输出 30
4.局部变量与全局变量同名
如果局部变量和全局变量同名,在函数内部局部变量会覆盖全局变量。
global_var = 10
def conflicting_example():
global_var = 20 # 局部变量,覆盖全局变量
print(global_var) # 输出 20
conflicting_example()
print(global_var) # 输出 10,全局变量未被修改
5.嵌套函数中的变量作用域
在嵌套函数中,内部函数可以访问外部函数的变量,但需要使用 nonlocal 关键字来修改外部函数的变量。
def outer_function(): # outer_function是一个带有闭包变量的函数。函数里面还有函数。
outer_var = 10
def inner_function():
nonlocal outer_var # 声明要修改的是外部函数的变量
outer_var = 20
print(outer_var) # 输出 20
inner_function()
print(outer_var) # 输出 20
outer_function()
八、匿名函数
Lambda函数可以用于需要函数对象的任何地方,但通常用于简单的操作。
1.基本语法
lambda arguments: expression
2.示例
def apply_function(func, value):
return func(value)
result = apply_function(lambda x: x * 2, 5)
print(result) # 输出 10