当前位置: 首页 > 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.xdnf.cn/news/465535.html

相关文章:

  • 解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- Manus解密
  • PPT处理控件Aspose.Slides教程:在 Java 中将 PPTX 转换为 EMF
  • Python控制Keysight DAQ973A/DAQ970A实现温度监测
  • .NET 8 kestrel 配置PEM,实现内网https
  • JavaScript - 运算符之逗号操作符与逗号分隔符(逗号操作符概述、逗号操作符用法、逗号分隔符、逗号分隔符用法)
  • 【C++重载操作符与转换】容器与继承
  • Excel函数使用介绍-分组求和SUMIF
  • 达利欧:“交易的艺术”与“背后的力量”
  • OpenCv高阶(4.0)——案例:海报的透视变换
  • 【杂谈】-AI 重塑体育营销:从内容管理到创意释放的全面变革
  • C#发送文件到蓝牙设备
  • 使用 `perf` 和火焰图(Flame Graph)进行性能分析
  • 25.5.15
  • MySQL读写分离
  • 深入解析C++模板:从基础到高级应用
  • LeetCode 热题 100 437. 路径总和 III
  • 运维职业发展思维导图
  • 建筑兔零基础人工智能自学记录92|类脑智能与脑机接口-7
  • vue3搭建脚手架前的前置知识
  • 【Unity】给出两个旋转角度,判断是应该左转还是右转
  • QT设置MySQL驱动
  • 已解决(亲测有效!):安装部署Docker Deskpot之后启动出现Docker Engine Stopped!
  • 11 web 自动化之 DDT 数据驱动详解
  • 文件目录与检索综合练习题
  • 面试 Linux 运维相关问题
  • 基于SpringBoot的家政服务系统设计与实现(源码+文档+部署讲解)
  • 20、鸿蒙学习——OAID、AAID、ODID
  • openEuler24.03 LTS下安装MySQL8.0.42
  • 气动排渣煤粉炉专用V型球阀——法兰连接耐磨阀门生产厂家解析-耀圣
  • 详解 Zephyr RTOS:架构、功能与开发指南