当前位置: 首页 > news >正文

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 自定义函数的定义、参数类型、变量作用域等核心概念。函数是编程中不可或缺的工具,掌握自定义函数的使用,可以让你的代码更加模块化、可复用和易于维护。


@浙大疏锦行

http://www.dtcms.com/a/191842.html

相关文章:

  • Ubuntu服务器开启SNMP服务 监控系统配置指南 -优雅草星云智控简易化操作
  • Python类的力量:第五篇:魔法方法与协议——让类拥有Python的“超能力”
  • pytorch nn.RNN demo
  • 软件设计师考试《综合知识》设计模式之——工厂模式与抽象工厂模式考点分析
  • 【HTML】个人博客页面
  • 【美团】后端一面复盘|项目驱动 + 手撕 + JVM + 数据库全面覆盖
  • QT 使用QPdfWriter和QPainter绘制PDF文件
  • Parsec解决PnP连接失败的问题
  • 11 web 自动化之 DDT 数据驱动详解
  • Swagger go中文版本手册
  • 【HCIA】策略路由
  • 搭建Hadoop集群standalone
  • STM32 SD卡拔插后FatFs挂载失败可能原因
  • 短视频二创App功能深度解析:短剧创作与推广的智能化革命
  • 开源模型应用落地-模型上下文协议(MCP)-Resources-资源的使用逻辑
  • Python中plotext 库详细使用(命令行界面中直接绘制各种图形)
  • 前馈神经网络回归(ANN Regression)从原理到实战
  • 从单线程到多线程:项目实战web Worker线程使用总结
  • 联合建模组织学和分子标记用于癌症分类|文献速递-深度学习医疗AI最新文献
  • 2025 后端自学UNIAPP【项目实战:旅游项目】5、个人中心页面:微信登录,同意授权,获取用户信息
  • 大模型智能体与 React Flow:构建智能化可视化交互系统的技术范式
  • Node.js 安装 + React Flow 快速入门:环境安装与项目搭建
  • #跟着若城学鸿蒙# 鸿蒙-卡证识别
  • 【搭建Node-RED + MQTT Broker实现AI大模型交互】
  • 游戏引擎学习第283天:“让‘Standing-on’成为一个更严谨的概念
  • 算法分析:蛮力法
  • 【PX4飞控】在 Matlab Simulink 中使用 Mavlink 协议与 PX4 飞行器进行交互
  • Java应用OOM排查:面试通关“三部曲”心法
  • 使用LoRA微调Qwen2.5-VL-7B-Instruct完成电气主接线图识别
  • EasyExcel集成使用总结与完整示例