5.1 定义与调用
函数的作用:能够将复杂的程序逻辑分解为可重复使用的模块。
业务→业务逻辑→程序逻辑
语法:
# 定义一个函数
def 函数名(参数列表):
"""
这个函数的功能是实现xxx功能
"""
函数体
# 调用函数
函数名(参数列表)
示例:
# 定义一个函数
def hello():
"""
这个函数的功能是实现输出hello,world功能
"""
print("HelloWorld")
# 调用函数
hello()
5.2 函数名
命名规则
1、可以由字母、数字和下划线组成
2、不能以数字开头
3、不能是 Python 中的关键字(如 if
、for
、while
等)
合法函数名示例
def my_function():
pass
def add_numbers():
pass
def calculate_sum():
pass
不合法函数名示例
# 以数字开头
def 123function():
pass
# 是关键字
def if():
pass
函数最佳命名规则
1、使用小写字母和下划线,函数名应全部使用小写字母,并使用下划线 (_
) 分隔单词。例如,add_numbers
2、简洁但具有描述性,函数名应该尽可能简短,但也要足够描述其功能。例如,get_total
比 gt
更好
3、使用动词,函数名通常以动词开头,因为它表示一个动作。例如,read_file
, send_email
4、使用名词,如果函数用于获取某些信息,可以使用名词。例如,get_list
, fetch_data
5、使用前缀或后缀,使用前缀或后缀可以帮助区分不同类型的函数。例如,is_valid
表示一个布尔检查函数,get_
通常用于获取信息
6、避免使用数字,尽量不要在函数名中使用数字,除非它们有特殊意义。例如,process_data_v2
可能表示这是数据处理函数的第二个版本
最佳函数命名示例
def add_numbers():
pass
def get_total():
pass
def read_file():
pass
def send_email():
pass
def get_list():
pass
def fetch_data():
pass
def is_valid():
pass
def process_data_v2():
pass
5.3 函数参数
在 Python 函数中,函数可以没有参数,也可以有参数。如果有参数,函数参数是用来传递数据给函数的变量。根据不同的需求,Python 支持多种类型的参数,包括位置参数、关键字参数、默认值参数、不定长参数等。
5.3.1 位置参数
位置参数是按照顺序来传递给函数的。
def multiply(x, y):
print(x * y)
multiply(3, 5) # 3 和 5 是位置参数
5.3.2 关键字参数
关键字参数允许你在调用函数时通过参数名指定参数值,这样就不必关心参数的实际位置了。关键字参数可以在任何位置使用,并且可以与位置参数混合使用。
def multiply(x, y):
print(x * y)
multiply(x=3, y=5) # 使用关键字参数
multiply(3, y=5) # 混合使用位置参数和关键字参数
当位置参数和关键字参数混合使用时,位置参数必须出现在关键字参数之前
5.3.3 默认值参数
默认值参数是在定义函数时为参数指定一个默认值。如果调用函数时没有提供这个参数的值,那么就会使用默认值。
def multiply(x, y=5):
print(x * y)
multiply(3, 6)
multiply(3)
multiply(x=3, y=6)
multiply(x=3)
5.3.4 不定长参数
不定长参数允许函数接受不定数量的位置参数或关键字参数。
*不定长位置参数 (args)
当参数列表前面加上星号 (*) 时,可以接收任意数量的位置参数。
def add_numbers(*args):
numbers_sum = 0
for i in args:
numbers_sum += i
print(numbers_sum)
add_numbers(1, 2)
add_numbers(1, 2, 3)
**不定长关键字参数(\kwargs)
当参数列表前面加上两个星号 (**) 时,可以接收任意数量的关键字参数。
def print_message(**kwargs):
for key, value in kwargs.items():
print(key + "=" + str(value))
print_message(name="buddha", age=18, height=1.75)
print("*" * 20)
print_message(name="buddha", age=18)
5.3.5 参数组合
一个函数的参数可以有位置参数、默认值参数、不定长位置参数、不定长关键字参数的组合。如果有参数组合,其函数定义时,参数从左到右的顺序是:位置参数、默认值参数、不定长位置参数、不定长关键字参数。
def show(name, height=1.80, *args, **kwargs):
print(f'{name},{height}')
for i in args:
print(i)
for key, value in kwargs.items():
print(f'{key}-{value}')
show("buddha", 1, 2, says="hello,world")
5.4 函数返回值
1、返回值,就是函数执行完毕,返回给调用者的结果。如果函数没有显式地返回任何值,则通常返回None
2、函数需要显示地返回返回值,用关键字return
3、函数内可以有多个return,碰到第一个return关键字就结束了函数的调用
4、在Python中,可以返回一个值,或用元组的方式返回多个值
返回一个值的示例
# 函数返回一个值
def add_numbers(a, b):
return a + b
sum_numbers = add_numbers(1,2)
print(sum_numbers) # 3
返回多个值的示例
# 函数返回元组,元组中含有多个值
def do_numbers(a, b):
return a + b, a - b
numbers = do_numbers(1, 2)
print(numbers[0], numbers[1])
5.5 作用域
作用域是指变量在程序中的可见性范围。
1、局部作用域:
- 在函数内部定义的变量具有局部作用域,只能在该函数内部访问。
- 当函数调用结束时,局部变量的作用域也随之结束。
2、全局作用域:
- 在函数外部定义的变量具有全局作用域,可以在整个程序中访问。
- 全局变量在程序执行开始时创建,在程序结束时销毁。
3、封闭作用域:
- 当一个函数内部定义了另一个函数时,内部函数可以访问外部函数的变量(局部变量)。
- 外部函数的变量(局部变量)对于内部函数来说处于封闭作用域。
4、内置作用域:
- Python 提供了一系列内置函数和常量,如
print()
、type()
、input()
等,它们在所有作用域中都是可用的。
内层使用外层变量
# 全局变量
x = "全局变量"
def outer_function():
y = "外部函数的局部变量" # 封闭作用域
def inner_function():
z = "内部函数的局部变量" # 局部作用域
print(z)
print(y) # 访问封闭作用域中的变量
print(x) # 访问全局作用域中的变量
inner_function()
outer_function()
# 下面这行会抛出 NameError,因为 y 是封闭作用域中的变量
# print(y)
# 下面这行会打印全局变量 x 的值
print(x)
原则是:内层可以使用外层,外层使用不了内层
内层修改外层变量
函数内部修改全局变量,该全局变量需要在函数内部用global
关键字声明
内层函数修改外层函数的变量,该外层函数的局部变量在内层函数中用nonlocal
关键字声明
外层不直接使用内层的变量,这样子破坏了函数的封装性
5.6 函数的嵌套
在 Python 中,函数的嵌套是指在一个函数内部定义另一个函数。这样的设计可以用来创建更加复杂的功能组合,同时保持代码的整洁和模块化。
简单嵌套
def outer():
print("这是外部函数被调用")
def inner():
print("这是内部函数被调用")
inner()
outer()
返回内部函数
def outer_function():
print("外包函数...")
def inner_function():
return "内部函数..."
return inner_function # 返回内部函数的引用
inner = outer_function() # 获取内部函数的引用
print(inner()) # 调用内部函数
嵌套的应用
def factorial(n):
"""
实现阶乘的功能,内部函数是递归函数
"""
def recursive_factorial(n):
if n == 0:
return 1
else:
return n * recursive_factorial(n - 1)
return recursive_factorial(n)
print(factorial(3)) # 输出 6
5.7 匿名函数
在 Python 中,匿名函数也称为 lambda 函数。它是一种简洁的方式来定义一个小型的、一次性使用的函数。
匿名函数的语法:
lambda 参数: 表达式
说明:
- 参数:可以是一个或多个参数,多个参数之间用逗号分隔
- 表达式:是一个单一的表达式,表达式的结果作为函数的结果返回
示例:
# 示例 1:计算两个数的和
add = lambda x, y: x + y
print(add(3, 5))
# 示例 2:对一个数进行平方运算
square = lambda x: x ** 2
print(square(4))
# 示例 3:判断一个数是否为偶数
is_even = lambda x: x % 2 == 0
print(is_even(6))
5.8 文档字符串
文档字符串是放在函数、类或模块的第一个逻辑行上的字符串,用于描述该对象的用途、行为或用法。__doc__
属性可以用来获取这些文档字符串的内容。
示例:
def function(*args):
"""函数的文档字符串
:param args: 参数说明
:return: 函数返回值说明
"""
pass
# 通过 函数名.__doc__ 获取文档字符串
print(function.__doc__)
# 通过 help(函数名) 获取文档字符串
help(function)
5.9 内置函数
Python 中提供了大量的内置函数,这些函数可以直接在程序中使用。
5.9.1 获取内置函数帮助信息
方式一:官方手册地址:https://docs.python.org/3/library/functions.html
方式二:函数名.__doc__
方式三:help(函数名)
......
5.9.2 常见内置函数示例
# print() 用于输出文本或变量的值
print("Hello, World!")
num = 5
print(num)
# len() 返回对象(如字符串、列表、元组等)的长度
str = "Python"
print(len(str))
list = [1, 2, 3, 4, 5]
print(len(list))
# range() 用于生成一个整数序列
for i in range(5):
print(i)
# sum() 计算可迭代对象(如列表、元组等)中所有元素的总和
numbers = [1, 2, 3, 4, 5]
print(sum(numbers))
# max() 和 min() 分别返回可迭代对象中的最大值和最小值
numbers = [5, 2, 8, 1, 9]
print(max(numbers))
print(min(numbers))
# abs() 返回一个数的绝对值
num = -5
print(abs(num))
# type() 返回对象的类型
num = 5
print(type(num))
# input() 用于获取用户的输入
name = input("请输入您的名字:")
print(f"您好,{name}!")