day26 Python 自定义函数
目录
一、函数的基本定义
示例 1:不带参数的函数
示例 2:查看文档字符串
二、带参数的函数
示例 3:带一个参数的函数
示例 4:带多个参数的函数
三、带返回值的函数
示例 5:计算两个数的和并返回结果
示例 6:返回多种类型的数据
四、变量作用域
示例 7:变量作用域示例
五、函数的参数类型
1. 位置参数
2. 默认参数值
3. 可变数量参数
*args(收集位置参数)
**kwargs(收集关键字参数)
4. 同时使用 *args 和 **kwargs
六、总结
在 Python 编程中,函数是代码复用和模块化的核心工具。Python 提供了许多内置函数和库函数,但掌握自定义函数的创建和使用,才能真正发挥编程的灵活性和高效性。本文将从函数的基本定义入手,逐步深入到参数类型、变量作用域等高级用法,帮助你全面掌握自定义函数的精髓。
一、函数的基本定义
函数是封装了一段特定功能的代码块,可以通过函数名和参数调用。Python 中定义函数的基本语法如下:
def function_name(parameter1, parameter2, ...):"""Docstring: 描述函数的功能、参数和返回值 (可选但强烈推荐)"""# 函数体: 实现功能的代码# ...return value # 可选,用于返回结果
-
def
是定义函数的关键字。 -
function_name
是函数的名称,通常使用小写字母和下划线命名,例如calculate_area
。 -
parameter1, parameter2, ...
是函数的参数,用于接收调用时传入的值。 -
():
参数列表必须放在圆括号中,即使没有参数,括号也不能省略。 -
:
冒号表示函数定义的头部结束,接下来是缩进的函数体。 -
Docstring 是位于函数定义第一行的多行字符串,用于解释函数的作用、参数、返回值等。可以通过
help(function_name)
或function_name.__doc__
查看。 -
函数体 是缩进的代码块,包含实现函数功能的语句。
-
return value
用于从函数中返回一个值。如果没有return
语句,或者return
后面没有值,函数会自动返回None
。
示例 1:不带参数的函数
def greet():"""打印一句问候语。"""message = "大家好!欢迎学习 Python 函数定义!"print(message)greet()
输出:
大家好!欢迎学习 Python 函数定义!
示例 2:查看文档字符串
print(greet.__doc__)
输出:
打印一句问候语。
二、带参数的函数
函数的参数分为形参和实参:
-
形参:在函数定义中列出的变量名。
-
实参:在函数调用时传递给函数的实际值。
示例 3:带一个参数的函数
def greet_person(name):"""根据给定的名字打印问候语。Args:name (str): 要问候的人的名字。"""message = f"你好, {name}! 很高兴认识你。"print(message)greet_person("张三")
输出:
你好, 张三! 很高兴认识你。
示例 4:带多个参数的函数
def add_features(feature1, feature2):"""计算两个数值特征的和。Args:feature1 (float or int): 第一个特征值。feature2 (float or int): 第二个特征值。"""total = feature1 + feature2print(f"{feature1} + {feature2} = {total}")add_features(10, 25)
输出:
10 + 25 = 35
三、带返回值的函数
函数不仅可以执行操作(如打印),还可以计算并返回一个结果。
示例 5:计算两个数的和并返回结果
def calculate_sum(a, b):"""计算两个数的和并返回结果。Args:a (float or int): 第一个数。b (float or int): 第二个数。Returns:float or int: 两个数的和。"""result = a + breturn resultprint(calculate_sum(2, 3))
输出:
5
示例 6:返回多种类型的数据
def preprocess_data(raw_data_points):"""模拟数据预处理,例如将所有数据点乘以 2。Args:raw_data_points (list): 原始数据点列表。Returns:list: 处理后的数据点列表。"""processed = []for point in raw_data_points:processed.append(point * 2)return processeddata = [1, 2, 3, 4, 5]
processed_data = preprocess_data(data)print(f"原始数据: {data}")
print(f"预处理后数据: {processed_data}")
输出:
原始数据: [1, 2, 3, 4, 5]
预处理后数据: [2, 4, 6, 8, 10]
四、变量作用域
理解变量在何处可见和可访问非常重要。
-
局部变量:在函数内部定义的变量,只在该函数内部有效。当函数执行完毕后,局部变量通常会被销毁。
-
全局变量:在所有函数外部定义的变量,可以在程序的任何地方被访问。但在函数内部修改全局变量需要特殊声明(如
global
关键字)。
示例 7:变量作用域示例
global_var = "我是一个全局变量"def scope_test():local_var = "我是一个局部变量"print(f"在函数内部,可以看到局部变量: '{local_var}'")print(f"在函数内部,也可以看到全局变量: '{global_var}'")scope_test()
print(f"\n在函数外部,可以看到全局变量: '{global_var}'")
输出:
在函数内部,可以看到局部变量: '我是一个局部变量'
在函数内部,也可以看到全局变量: '我是一个全局变量'在函数外部,可以看到全局变量: '我是一个全局变量'
五、函数的参数类型
Python 函数的参数类型丰富多样,包括位置参数、默认参数值、可变数量参数等。
1. 位置参数
位置参数是按顺序匹配的参数。
def describe_pet(animal_type, pet_name):"""显示宠物的信息。"""print(f"\n我有一只 {animal_type}.")print(f"我的 {animal_type} 的名字叫 {pet_name.title()}.")describe_pet("猫", "咪咪")
输出:
我有一只 猫.
我的 猫 的名字叫 咪咪.
为了提高可读性,推荐使用关键字参数。
describe_pet(animal_type="猫", pet_name="咪咪")
2. 默认参数值
默认参数值是在定义函数时给参数指定的默认值。调用时如果未提供该参数,则使用默认值。
def describe_pet_default(pet_name, animal_type="狗"):"""显示宠物的信息,动物类型默认为狗。Args:pet_name (str): 宠物的名字。animal_type (str, optional): 动物类型,默认为 "狗"。"""print(f"我有一只 {animal_type}.")print(f"我的 {animal_type} 的名字叫 {pet_name.title()}.")describe_pet_default(pet_name="小黑")
describe_pet_default(pet_name="雪球", animal_type="仓鼠")
输出:
我有一只 狗.
我的 狗 的名字叫 小黑.我有一只 仓鼠.
我的 仓鼠 的名字叫 雪球.
3. 可变数量参数
可变数量参数允许函数接收不定数量的参数。
*args(收集位置参数)
*args
将多余的位置参数收集为一个元组。
def make_pizza(size, *toppings):"""概述要制作的比萨。"""print(f"\n制作一个 {size} 寸的比萨,配料如下:")if toppings:for topping in toppings:print(f"- {topping}")else:print("- 原味 (无额外配料)")make_pizza(12, "蘑菇")
make_pizza(16, "香肠", "青椒", "洋葱")
make_pizza(9)
输出:
制作一个 12 寸的比萨,配料如下:
- 蘑菇制作一个 16 寸的比萨,配料如下:
- 香肠
- 青椒
- 洋葱制作一个 9 寸的比萨,配料如下:
- 原味 (无额外配料)
**kwargs(收集关键字参数)
**kwargs
将多余的关键字参数收集为一个字典。
def build_profile(first_name, last_name, **user_info):"""创建一个字典,其中包含我们知道的有关用户的一切。"""profile = {}profile['first_name'] = first_nameprofile['last_name'] = last_namefor key, value in user_info.items():profile[key] = valuereturn profileuser_profile = build_profile('爱因斯坦', '阿尔伯特',location='普林斯顿',field='物理学',hobby='小提琴')
print(f"\n用户信息: {user_profile}")
输出:
用户信息: {'first_name': '爱因斯坦', 'last_name': '阿尔伯特', 'location': '普林斯顿', 'field': '物理学', 'hobby': '小提琴'}
4. 同时使用 *args 和 **kwargs
def process_data(id_num, name, *tags, status="pending", **details):print(f"ID: {id_num}")print(f"Name: {name}")print(f"Tags (*args): {tags}")print(f"Status: {status}")print(f"Details (**kwargs): {details}")print("-" * 20)process_data(101, "Alice", "vip", "new_user", location="USA", age=30)
process_data(102, "Bob", status="active", department="Sales")
process_data(103, "Charlie", "admin")
process_data(name="David", id_num=104, profession="Engineer")
输出:
ID: 101
Name: Alice
Tags (*args): ('vip', 'new_user')
Status: pending
Details (**kwargs): {'location': 'USA', 'age': 30}
--------------------
ID: 102
Name: Bob
Tags (*args): ()
Status: active
Details (**kwargs): {'department': 'Sales'}
--------------------
ID: 103
Name: Charlie
Tags (*args): ('admin',)
Status: pending
Details (**kwargs): {}
--------------------
ID: 104
Name: David
Tags (*args): ()
Status: pending
Details (**kwargs): {'profession': 'Engineer'}
--------------------
六、总结
系统地学习了 Python 自定义函数的定义、参数类型、变量作用域等核心概念。函数是编程中不可或缺的工具,掌握自定义函数的使用,可以让你的代码更加模块化、可复用和易于维护。
@浙大疏锦行