10.16Python基础-函数
Python函数详解
1. 定义一个函数
1.1 def语句
- 概念:
def
是Python中用来定义函数的关键字。 - 格式:
def 函数名([形参]):函数体
1.2 函数的调用
- 方法:通过函数名加括号的方式调用函数。
- 示例:
def hello():print('Hello, World!') hello() # 调用hello函数
1.3 return语句
- 用途:用于从函数中返回结果到调用处。
- 格式:
return 表达式
- 示例:
def add(a, b):return a + b result = add(5, 3) print(result) # 输出 8
2. 函数参数
2.1 函数的调用传参
- 分类:
- 位置传参:按参数的位置传入实参。
- 关键字传参:指定参数名称来传入实参。
- 示例:
def greet(name, message):print(f"{message}, {name}!") greet("Alice", "Hello") # 位置传参 greet(message="Hi", name="Bob") # 关键字传参
2.2 函数的形式参数定义方法
2.2.1 缺省参数(默认参数)
- 特点:当不传入该参数时,使用默认值。
- 示例:
def func(a, b=1):return a + b print(func(3)) # 输出 4 print(func(3, 2)) # 输出 5
2.2.2 形参的定义
2.2.2.1 位置形参
- 定义:函数定义时的参数列表中的参数。
2.2.2.2 星号元组形参
- 符号:
*
- 用途:收集剩余的所有位置参数到一个元组中。
- 示例:
def func(*args):return args print(func(1, 2, 3)) # 输出 (1, 2, 3)
2.2.2.3 命名关键字形参
- 符号:
*
后面加上参数名 - 用途:收集所有未出现在前面的关键字参数到一个字典中。
- 示例:
def func(*, a, b):return a + b print(func(a=5, b=3)) # 输出 8
2.2.2.4 双星号字典形参
- 符号:
**
- 用途:将传入的关键字参数收集到一个字典中。
- 示例:
def func(**kwargs):return kwargs print(func(name="Alice", age=30)) # 输出 {'name': 'Alice', 'age': 30}
2.3 可变不可变
- 区别:
- 可变对象:如列表、字典等,可以在原内存地址上被改变。
- 不可变对象:如整数、字符串等,不能在原内存地址上被改变。
- 示例:
# 可变对象示例 my_list = [1, 2, 3] my_list.append(4) print(my_list) # 输出 [1, 2, 3, 4] # 不可变对象示例 my_string = "Hello" my_string += ", World!" print(my_string) # 输出 "Hello, World!"
3. 返回值
- 用法:使用return语句返回函数执行的结果。
- 示例:
def sum(a, b):return a + b total = sum(10, 5) print(total) # 输出 15
4. 匿名函数
- 定义:使用lambda表达式创建的函数。
- 格式:
lambda 参数列表: 表达式
- 示例:
square = lambda x: x ** 2 print(square(5)) # 输出 25 # 在排序时使用匿名函数 points = [(2, 3), (1, 2), (4, 1)] points.sort(key=lambda point: point[1]) # 按y坐标排序 print(points) # 输出 [(4, 1), (1, 2), (2, 3)]
5. 变量作用域
5.1 什么是变量作用域
- 解释:变量的可见性和生命周期由其所在的作用域决定。
5.2 局部变量和全局变量
- 局部变量:只在当前函数内有效的变量。
- 全局变量:在整个程序中都有效的变量。
- 示例:
global_var = "I am global" def func():local_var = "I am local"print(local_var)print(global_var) # 可以访问全局变量 func() # print(local_var) # 会报错,因为local_var是局部变量
5.3 局部作用域修改全局变量
- 方法:使用global关键字声明要修改的全局变量。
- 示例:
count = 0 def increment():global count # 声明要使用全局变量countcount += 1 increment() print(count) # 输出 1
5.4 局部作用域修改外部变量
- 方法:使用nonlocal关键字声明要修改的外部变量。
- 示例:
def outer():outer_var = 10def inner():nonlocal outer_var # 声明要使用外部变量outer_varouter_var += 5return outer_varreturn inner() print(outer()) # 输出 15
6. 函数的内存分配
- 过程:当函数被调用时,会在内存中为其分配空间以存储局部变量和中间计算结果。
- 示例:
def my_function():a = 10 # a在调用时被分配内存return a * 2 result = my_function() print(result) # 输出 20
7. 函数自调用(递归)
- 定义:函数在其内部再次调用自己的行为。
- 注意:需要有终止条件避免无限循环。
- 示例:
def factorial(n):if n == 0: # 终止条件return 1else:return n * factorial(n - 1) print(factorial(5)) # 输出 120
8. 练习
- 任务:实现一个自定义的myrange函数,模拟内置的range函数的功能。
- 示例:
def myrange(start, end=None, step=1):if end is None: # 当只提供一个参数时end = startstart = 0while start < end:yield startstart += step # 使用自定义的myrange函数 for i in myrange(5):print(i) # 输出 0, 1, 2, 3, 4 for i in myrange(1, 10, 2):print(i) # 输出 1, 3, 5, 7, 9