Python篇---返回类型

基础返回类型:

在 Python 中,函数的返回类型就像函数 “产出” 的不同 “物品”,理解它们能帮你更好地控制代码的输出。下面用通俗的方式介绍常见的返回类型及用法:

一、最基础的返回类型

1. 无返回值(None)
  • 特点:函数做完事情后 “啥也不递出来”,默认返回None
  • 用法:适合只需要执行操作(如打印、修改文件)的函数
def say_hello():print("你好")  # 只打印,不返回东西result = say_hello()
print(result)  # 输出:None
2. 单个值(数字、字符串、布尔等)
  • 特点:返回一个具体的 “单个物品”,比如数字、文字、真假值
  • 用法:用于计算结果、判断结果等场景
# 返回数字
def add(a, b):return a + b  # 返回两数之和print(add(2, 3))  # 输出:5# 返回布尔值
def is_adult(age):return age >= 18  # 判断是否成年print(is_adult(20))  # 输出:True

二、返回多个值

  • 特点:用逗号分隔多个值,Python 会自动把它们打包成 “元组” 返回
  • 用法:需要一次性获取多个相关结果时(比如坐标、姓名 + 年龄)
def get_user_info():name = "张三"age = 30return name, age  # 实际返回 ("张三", 30) 这个元组# 两种接收方式
info = get_user_info()
print(info)  # 输出:("张三", 30)name, age = get_user_info()  # 直接拆分成两个变量
print(name)  # 输出:张三
print(age)   # 输出:30

三、返回容器(列表、字典、集合)

1. 列表(list)
  • 特点:返回一组有序的、可重复的数据,像 “购物清单”
  • 用法:需要返回多个同类型数据(如成绩列表、名字列表)
def get_top3_scores():return [98, 95, 92]  # 返回前三名成绩scores = get_top3_scores()
print(scores[0])  # 输出:98(取第一个元素)
2. 字典(dict)
  • 特点:返回 “键值对” 形式的数据,像 “表格”(有标签和对应值)
  • 用法:需要返回有明确属性的数据(如用户信息、商品信息)
def get_product():return {"name": "手机","price": 3999,"stock": 100}product = get_product()
print(product["price"])  # 输出:3999(通过键获取值)
3. 集合(set)
  • 特点:返回一组无序、不重复的数据,像 “去重后的列表”
  • 用法:需要返回无重复的唯一值(如去重后的标签、关键词)
def get_unique_tags():return {"Python", "编程", "Python", "学习"}  # 自动去重tags = get_unique_tags()
print(tags)  # 输出:{'编程', 'Python', '学习'}

四、返回函数或类的实例

1. 返回函数
  • 特点:函数 “产出” 另一个函数,像 “工厂造机器”
  • 用法:需要动态生成不同功能的函数(高级用法)
def make_greeter(language):def chinese_greet():return "你好"def english_greet():return "Hello"# 根据语言返回不同函数if language == "中文":return chinese_greetelse:return english_greetgreet = make_greeter("中文")
print(greet())  # 输出:你好(调用返回的函数)
2. 返回类的实例
  • 特点:函数 “产出” 一个类的对象,像 “工厂造产品”
  • 用法:用于创建复杂对象的 “构造函数”
class Car:def __init__(self, color):self.color = colordef create_car(color):return Car(color)  # 返回Car类的实例my_car = create_car("红色")
print(my_car.color)  # 输出:红色

五、关键注意点

  1. 返回类型可以灵活变化:同一个函数可以根据条件返回不同类型(但不推荐,容易混乱)

    def get_data(flag):if flag:return "成功"  # 字符串else:return 0      # 数字
    
  2. return会立刻结束函数:后面的代码不会执行

    def test():return 1print("这里不会执行")  # 永远到不了这里
    
  3. 没有return时默认返回None:比如单纯打印内容的函数

总结

Python 的返回类型就像函数的 “输出快递”:

  • 简单的结果用单个值(数字、字符串等)
  • 多个相关值用元组列表
  • 有明确属性的用字典
  • 去重数据用集合
  • 复杂功能用函数类实例

根据你的需求选择合适的 “包装方式”,代码会更清晰易懂~

特殊返回类型:

除了前面提到的基础返回类型,Python 中还有一些更 “特殊” 的返回类型,它们通常用于特定场景,虽然不常用但非常强大。下面用通俗的方式介绍几种:

1. 生成器(Generator)—— “一边产生一边用” 的序列

  • 特点:不是一次性返回所有数据,而是 “按需生成”,像 “水流” 一样,用一点取一点,节省内存。
  • 怎么认:函数里用yield代替return,调用后返回的是生成器对象,不是直接的结果。
  • 用法:处理超大数据(比如 100 万个数)时,避免一次性加载到内存。
def number_generator(n):for i in range(n):yield i  # 每次返回一个数,暂停在这,下次调用继续# 调用函数得到生成器(不会立刻执行)
gen = number_generator(5)# 逐步获取结果(每次取一个)
print(next(gen))  # 输出:0
print(next(gen))  # 输出:1
print(next(gen))  # 输出:2
  • 好处:如果要生成 100 万个数字,用列表会占大量内存,生成器则只在需要时计算,内存友好。

2. 迭代器(Iterator)—— “可遍历的容器”

  • 特点:和生成器类似,也是 “按需返回” 数据,但更底层,是很多容器(如列表、字典)的 “遍历引擎”。
  • 怎么来:通过iter()函数把列表、字符串等变成迭代器,或者自己定义带__next__()方法的类。
  • 用法:用于自定义遍历逻辑,比如按特殊规则遍历数据。
# 把列表变成迭代器
my_list = [10, 20, 30]
it = iter(my_list)print(next(it))  # 输出:10
print(next(it))  # 输出:20
  • 和生成器的关系:生成器是一种特殊的迭代器,写法更简单。

3. 装饰器(Decorator)返回的函数 —— “增强版函数”

  • 特点:函数返回一个 “被包装过的新函数”,给原函数添加额外功能(如计时、权限检查),但不修改原函数代码。
  • 用法:用于 “增强” 函数功能,比如给多个函数统一加日志、计时。
def timer(func):  # 接收一个函数作为参数def wrapper():import timestart = time.time()func()  # 调用原函数end = time.time()print(f"耗时:{end - start}秒")return wrapper  # 返回包装后的新函数# 用@符号应用装饰器
@timer
def slow_function():time.sleep(1)  # 模拟耗时操作slow_function()  # 执行时会自动打印耗时
  • 效果:调用slow_function()时,不仅会执行原功能,还会自动输出执行时间,这就是装饰器返回的新函数在起作用。

4. 上下文管理器(Context Manager)—— “自动收尾的工具”

  • 特点:返回一个支持with语句的对象,能自动处理 “开始” 和 “结束” 操作(如打开 / 关闭文件、连接 / 断开数据库)。
  • 怎么认:类中定义了__enter__()(开始时执行)和__exit__()(结束时执行)方法,或用@contextmanager装饰器。
  • 用法:替代手动关闭资源,避免忘记释放(如文件没关导致占用)。
# 自定义一个简单的上下文管理器(模拟文件操作)
class MyFile:def __init__(self, filename):self.filename = filenamedef __enter__(self):self.file = open(self.filename, 'w')return self.file  # 返回操作对象def __exit__(self, *args):self.file.close()  # 自动关闭文件# 使用with语句,无需手动close()
with MyFile("test.txt") as f:f.write("Hello")  # 写入内容,结束后自动关闭
  • 常见场景:Python 内置的open()函数返回的就是上下文管理器,所以用with open(...)很安全。

5. 异常(Exception)—— “报错信息包”

  • 特点:函数可以返回(更准确说是 “抛出”)一个异常对象,用于传递错误信息。
  • 用法:遇到错误时,不再返回正常结果,而是 “扔出” 一个错误包,让调用者处理。
def divide(a, b):if b == 0:# 抛出异常(相当于返回一个错误信息)raise ValueError("除数不能为0!")return a / btry:result = divide(5, 0)
except ValueError as e:print(e)  # 捕获并打印错误信息:除数不能为0!
  • 本质:异常也是一种返回形式,只不过是 “错误情况下的返回”,用于中断正常流程并传递问题。

总结:这些特殊返回类型的核心价值

它们本质上都是为了解决特定问题:

  • 生成器 / 迭代器 → 处理大数据,省内存
  • 装饰器 → 增强函数功能,少写重复代码
  • 上下文管理器 → 自动管理资源,避免失误
  • 异常 → 规范错误处理,让代码更健壮

这些类型虽然 “特殊”,但理解后能让你写出更高效、更优雅的 Python 代码~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/94611.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/94611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArkTS 与 TypeScript 的关系及鸿蒙开发常见错误案例

随着 HarmonyOS NEXT(纯血鸿蒙) 的到来,开发者在学习鸿蒙应用开发时会遇到一个新的语言 —— ArkTS。很多人会疑惑:它和 TypeScript(TS)是什么关系?又有哪些新的特性?在实际开发中&a…

初识socket编程(实现一个简单的TCPServer)

监听套接字的创建流程 在网络编程中,listen 套接字(通常称为“监听套接字”)是服务器端用于接收客户端连接请求的特殊套接字,是 TCP 服务器建立连接过程中的核心组件。下面我们就来简单看一下监听套接字创建的过程创建流程&#x…

开发者如何在 Gitee 上开源一个自己的项目

文章目录一、为什么要在 Gitee 上开源?1. 开源的价值2. 为什么是 Gitee?二、前期准备:让项目“可开源”1. 项目代码整理2. 添加必要文件3. 确定开源许可证三、在 Gitee 上创建仓库四、推送本地代码到 Gitee五、完善项目展示(吸引力…

卷积神经网络实现mnist手写数字集识别案例

手写数字识别是计算机视觉领域的“Hello World”,也是深度学习入门的经典案例。它通过训练模型识别0-9的手写数字图像(如MNIST数据集),帮助我们快速掌握神经网络的核心流程。本文将以PyTorch框架为基础,带你从数据加载…

实战笔记——构建智能Agent:SpreadJS代码助手

目录 前言 解决思路 需求理解 MCP Server LangGraph 本教程目标 技术栈 第一部分:构建 MCP Server - 工具服务化的基础架构 第二部分:Tools 实现 第三部分:基于 LangGraph 构建智能 Agent 第四部分:服务器和前端搭建 前…

【Word】用 Python 轻松实现 Word 文档对比并生成可视化 HTML 报告

在日常工作和学习中,我们经常需要对两个版本的文档进行比对,比如合同修改、论文修订、报告更新等。手动逐字检查不仅耗时费力,还容易遗漏细节。 今天,我将带你使用 Python python-docx difflib 实现一个自动化 Word 文档对比工具…

从0开始搭建一个前端项目(vue + vite + typescript)

版本 node:v22.17.1 pnpm:v10.13.1 vue:^3.5.18 vite:^7.0.6 typescipt:~5.8.0脚手架初始化vue pnpm create vuelatest只选择: TypeScript, JSX 3. 用vscode打开创建的项目,并删除多余的代码esl…

1.ImGui-环境安装

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 IMGUI是一个被广泛应用到逆向里面的,它可以用来做外部的绘制,比如登录界面&…

基于springboot的二手车交易系统

博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言&#xff0…

修改win11任务栏时间字体和小图标颜色

1 打开运行提示框 在桌面按快捷键winR,然后如下图所示输入regedit2 查找路径 1、在路径处粘贴路径计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize 2、如下图所示,双击打开ColorPrevalence,将里面的…

第13集 当您的USB设备不在已实测支持列表,如何让TOS-WLink支持您的USB设备--答案Wireshark USB抓包

问:当您的USB设备不在已实测支持列表,如何让TOS-WLink支持您的USB设备? 答案:使用Wireshark USB抓包,日志发给我 为什么要抓包: USB设备种类繁多;TOS-WLink是单片机,内存紧张&#…

[灵动微电子 MM32BIN560CN MM32SPIN0280]读懂电机MCU之比较器

作为刚接触微控制器的初学者,在看到MM32SPIN0280用户手册中“比较器”相关内容时,是不是会感到困惑?比如“5个通用比较器”“轮询功能”“迟滞电压”这些术语,好像都和电机控制有关,但又不知道具体怎么用。别担心&…

⸢ 贰 ⸥ ⤳ 安全架构:数字银行安全体系规划

👍点「赞」📌收「藏」👀关「注」💬评「论」 🔥更多文章戳👉Whoami!-CSDN博客🚀 在金融科技深度融合的背景下,信息安全已从单纯的技术攻防扩展至架构、合规、流程与创新的…

布隆过滤器完全指南:从原理到实战

布隆过滤器完全指南:从原理到实战 摘要:本文深入解析布隆过滤器的核心原理、实现细节和实际应用,提供完整的Java实现代码,并探讨性能优化策略。适合想要深入理解概率数据结构的开发者阅读。 前言 在大数据时代,如何快速判断一个元素是否存在于海量数据集合中?传统的Hash…

​嵌入式Linux学习 - 网络服务器实现与客户端的通信

1.单循环服务器 2.并发服务器 1. 设置socket属性 2. 进程 ​3. 线程 3.多路IO复用模型 - 提高并发程度 1. 区别 2. IO处理模型 1. 阻塞IO模型 2. 非阻塞IO模型 3. 信号驱动IO 4. IO多路复用 3. 特点 4. 函数接口 1. select 2. poll 3. epoll 半包 1.单循环服务…

Mybatis中缓存机制的理解以及优缺点

文章目录一、MyBatis 缓存机制详解1. 一级缓存(Local Cache)2. 二级缓存(Global Cache)3. 缓存执行顺序二、MyBatis 缓存的优点三、MyBatis 缓存的缺点四、适用场景与最佳实践总结MyBatis 提供了完善的缓存机制,用于减…

Rust 登堂 之 类型转换(三)

Rust 是类型安全的语言,因此在Rust 中做类型转换不是一件简单的事,这一章节,我们将对Rust 中的类型转换进行详尽讲解。 高能预警,本章节有些难,可以考虑学了进阶后回头再看 as 转换 先来看一段代码 fn main() {let a…

【MySQL 为什么默认会给 id 建索引? MySQL 主键索引 = 聚簇索引?】

MySQL 索引 MySQL 为什么默认会给 id 建索引? & MySQL 主键索引 聚簇索引? 结论:在 MySQL (InnoDB) 中,主键索引是自动创建的聚簇索引,不需要删除,其他索引是补充优化。 1. MySQL 的id 索引是怎么来的…

[光学原理与应用-321]:皮秒深紫外激光器产品不同阶段使用的工具软件、对应的输出文件

在皮秒深紫外激光器的开发过程中,不同阶段使用的工具软件及其对应的输出文件如下:一、设计阶段工具软件:Zemax OpticStudio:用于光学系统的初步设计和仿真,包括光线追迹、像差分析、优化设计等。MATLAB:用于…

openEuler常用操作指令

openEuler常用操作指令 一、前言 1.简介 openEuler是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持ARM、x86、RISC-V、loongArch、PowerPC、SW…