python 函数基础及用法
当前版本:
- Python 3.8.4
简介
函数是一段可重复使用的代码块,用于执行特定的任务。它可以使得代码更简洁、可重复使用、易于理解和维护。
文章目录如下
1. 了解函数
2. 定义函数
2.1. 基本语法
2.2. 定义参数
2.3. 局部变量
2.4. 返回值
3. 实际应用
3.1. 递归调用
3.2. 购物车功能
3.3. 加密、解密
1. 了解函数
函数的作用是将代码组织成逻辑块,以便实现特定的功能。通过函数,可以将复杂的任务分解为更小的、可管理的部分,提高代码的可重用性和可维护性。
函数的使用方式实际上和我们的生活无异,比如房子,我们需要将其分类规划:将睡觉的地方划分为房间,将需要做饭的地方划分为厨房,将学习的地方划分为书房等。只有将生活所需的东西划分开后,才能使得效率更高,如果不作分类则会显得整个房子非常杂乱,在使用的过程中也会令人不适。
编写程序也是同理,例如:开发一个购物网站
def add_item():"""添加商品到购物车"""passdef display_items():"""显示购物车中的商品"""passdef calculate_total_price():"""计算购物车中商品的总价"""pass
我们定义了3个简单的功能,分别是添加商品、显示商品、计算价格等。由于用户可能会持续向购物车中添加商品,所以针对这种场景我们专门编写一个添加商品的函数,当用户操作时直接调用这个函数即可。从代码量的角度看,提高了代码重用性;从维护的角度看,我们根据功能将其封装为不同的函数,在阅读代码时提高了效率,降低了复杂程度。
2. 定义函数
定义函数主要3个重点:怎么定义函数、怎么使用参数、返回值的作用是什么?本章节围绕这3点依次介绍。
2.1. 基本语法
函数通过关键字 def 来定义,后面紧跟函数的名称和参数列表:
def 函数名():代码块
- def:关键字,不可更改。
- 函数名:自定义的名称,以字母或下划线开头,可以由字母、数字和下划线组成。但是不能与python中的关键字同名,比如 for、while等。
- 括号:用于定义函数的参数列表和传递参数,也是不可修改。
- 代码块:用于在函数中执行的代码,必须比函数多一个缩进。
调用函数直接写 函数名() 即可,例如:
# 定义函数
def func():print("这是一个函数!")# 调用函数
func()

- 这就是函数的基本用法
2.2. 定义参数
参数的作用是在函数调用时将数据传递给函数,并在函数体内使用这些数据进行处理。参数的个数可以是1个或多个,且支持默认值。
1、定义1个参数(只需要在括号中增加一个自定义名称即可)
# 定义1个参数
def func(a): # a是自定义的, 可以是b、cc...print(f"处理文件: {a}") # 代码块中引用这个参数# 调用函数,需要传入的参数放到括号中即可
func("file.txt")
func("tmp.xlsx")

2、在面对某些情况时可能会传入一个空的参数,那么我们可以定义一个默认值
# 定义1个参数
def func(a=10): # a=默认值print(f"参数a为:{a}") # 代码块中引用这个参数func("ABC") # 调用函数,传入指定参数
func() # 调用函数,不传入参数
- 当调用函数时没有传入参数,使用默认值;
- 当调用函数时传入了参数,则使用用户传入的参数。

3、若需要定义n个参数,在括号中放入n个参数即可
# 定义3个参数
def func(a, b, c): # 定义3个参数# 代码块中引用这些参数print(f"参数a为:{a}")print(f"参数b为:{b}")print(f"参数c为:{c}")# 调用函数时将参数按逗号分列放入
func(10, 20, 30)

在传参时也可以指定参数名传参
# 按名称传参可以不遵守顺序规则
func(a=10, c=20, b=30)
4、当不确定参数数量时,可通过可变长元组实现(这些参数自动被组合成一个元组)
- 参数语法:*名称
# 定义一个可变长元组
def func(*num): # *后面接自定义的名称# 遍历这个元组for i in num:print(f"参数为:{i}")# 向函数中传入多个参数
func(1, 5, 8)

5、当需要传入不确定数量的键值对时,可通过可变长字典实现(这些参数自动被组合成一个字典)
- 参数语法:**名称
# 定义一个可变长字典
def func(**details): # **后面接自定义的名称# 遍历这个字典for k,v in details.items():print(f"键为:[{k}], 值为:[{v}]")# 向函数中传入字典
D = {"姓名":"小李", "性别":"男", "年龄":20}
func(**D) # 直接传入字典需要使用 **字典名# 向函数中传入键值对
func(喜欢的水果="桃子", 爱好="游泳")

2.3. 局部变量
局部变量就是在函数内部声明的变量,并且只能在函数内部访问。
def func():x = 10 # 函数中定义的变量print(f"函数中打印x为:{x}")func() # 调用函数# 函数外打印这个变量
print(f"函数外打印x为:{x}")

函数中的变量可以正常输出,而函数外出现了报错(没有这个变量)
从上述的例子中得知,函数中定义的变量是无法作用到局外的,也就是说即使使用相同的变量名也不会发生冲突。
x = 20 # 外部定义一个变量def func():x = 10 # 函数中定义一个相同的变量print(f"函数中打印x为:{x}")func() # 调用函数# 函数外打印这个相同的变量
print(f"函数外打印x为:{x}")
函数内和外部的变量名相同也不会发生冲突

函数中是可以使用外部的变量的
x = 20 # 外部定义一个变量def func():print(f"函数中打印x为:{x}")func() # 调用函数# 函数外打印这个相同的变量
print(f"函数外打印x为:{x}")

由于在函数中定义的局部变量是无法作用到全局的,如果希望作用到全局使用关键字 global。
使用第1个出错的例子,加上关键字 global:
def func():global x # 将x定义为全局变量x = 10 # 函数中定义这个变量print(f"函数中打印x为:{x}")func() # 调用函数# 函数外打印这个变量
print(f"函数外打印x为:{x}")

总结
- 局部变量就是函数中定义的变量,作用域为函数内部。
- 全局变量就是在外部定义的变量,作用域为整个脚本。
- 将函数中局部变量转换为全局变量使用关键字 global。
- 局部变量和全局变量名称不会冲突,放心使用。
- 局部变量无法作用到外部,也同样无法作用到其他函数。
2.4. 返回值
函数的返回值在编程中扮演着重要的角色,用于传递数据、控制程序流程和处理错误。通过正确使用返回值,可以编写出更灵活和可重用的代码。
函数可以返回各种类型的值,包括但不限于:
- 基本数据类型:整数、浮点数、布尔值、字符等。
- 数据结构:列表、元组、字典、集合等。
- 其他函数:函数也可以作为返回值。
- None:返回一个空。
def func1():return 10 # 返回一个数字def func2():return "abc" # 返回一个字符串def func3():return [1, 2] # 返回一个列表def func4():return True # 返回一个布尔值def func5():return func1() # 返回一个其他函数def func6():return None # 返回一个空def func7():return 1,2,3 # 返回多个值
【案例一】返回平均值
# 定义计算平均值的函数
def average(*num):total = sum(num) # 求和average = total / len(num) # 取平均数return int(average) # 返回平均数(取整)# 调用函数并获取平均值
average_value = average(10, 30, 30, 65)
print("平均值:", average_value)

【案例二】根据函数返回的布尔值来决定下一代码
# 导入随机数模块
import random# 定义一个函数
def func(x):# 判断参数值if x == 1:return Trueelse:return False# 向函数传入一个0或1的随机数,赋值给变量
check_func = func(random.randint(0,1))# 判断这个变量的布尔值
if check_func:print("函数执行成功, 执行代码块xxx")
else:print("函数执行错误, 执行代码块yyy")

3. 实际应用
3.1. 递归调用
函数可以调用其他函数,也可以调用自己。
def delete_file():'''定义一个删除文件的函数'''# 询问用户是否删除文件user_input = input("是否删除文件(y/n): ")if user_input == "y":print("删除文件file.txt")elif user_input == "n":print("不删除文件file.txt")else: # 输入的不是y或n则继续调用自己,询问用户delete_file()# 调用函数
delete_file()

3.2. 购物车功能
封装一个购物车功能,包括添加商品到购物车、显示购物车中的商品和计算购物车中商品的总价的功能。
封装一些用于购物车的功能
# 定义一个空的购物车列表
commodity = []def add_item(item_name, item_price):"""添加商品到购物车"""item = {"name": item_name, "price": item_price}commodity.append(item)def display_items():"""显示购物车中的商品"""if len(commodity) == 0:print("购物车为空")else:print("购物车中的商品如下:")for item in commodity:print("商品名称:[{}], 价格:{}元".format(item["name"], item["price"]))def calculate_total_price():"""计算购物车中商品的总价"""total_price = 0for item in commodity:total_price += item["price"]return total_price
通过这些功能去执行某些事件
# 添加商品到购物车
add_item("手机", 1999)
add_item("电视", 3999)
add_item("电脑", 5999)# 显示购物车中的商品
display_items()# 计算购物车中商品的总价
total_price = calculate_total_price()
print(f"购物车共计: {total_price}元")

3.3. 加密、解密
使用 ord 获取字符的 ASCII 值 + 1,将其转换为其他字符(用作密文),解密使用 ASCII 值 - 1
def encrypt(message):'''封装一个对字符串加密的函数'''encrypted_message = "" # 先定义一个空的密文for char in message: # 遍历这个字符串encrypted_char = chr(ord(char) + 1) # 转换单个字符encrypted_message += encrypted_char # 将转换后的字符添加到密文变量中return encrypted_message # 返回密文def decrypt(encrypted_message):'''封装一个对字符串解密的函数'''decrypted_message = "" # 先定义一个空的解密变量for char in encrypted_message: # 遍历这个加密的字符decrypted_char = chr(ord(char) - 1) # 转换为正常字符decrypted_message += decrypted_char # 将转换后的字符添加到解密变量中return decrypted_message # 返回解密字符
我们自定义一串字符来看看效果
# 定义一个需要加密的字符串
str = "Hello, World!"# 加密消息
encrypted_str = encrypt(str)
print("加密后的字符:", encrypted_str)# 解密消息
decrypted_str = decrypt(encrypted_str)
print("解密后的字符:", decrypted_str)
