Python 迭代器 与 异常处理

2023-05-16

文章目录

    • 迭代介绍
    • 可迭代对象
    • 迭代器对象
      • 迭代器对象取值
    • 方法的简写
    • for循环内部原理
    • 异常处理
      • 异常的分类
      • 异常的类型
      • 异常的处理
        • try/except 语句
        • try/except...else 语句
        • try/except...finally 语句
        • try/except.../else/finally 语句
      • 断言
      • 主动报错
    • for 循环的本质
    • 迭代取值与索引取值的对比

迭代介绍

什么叫做迭代,迭代可以理解为更新换代,每一次迭代的过程都需要依赖于上一次的结果。迭代器有两个基本的方法:iter()next()


		while True:
		    print(666)

像这种单纯的循环并不能称之为迭代,因为它没有和上一次的结果有关系。

		list_a = ['XWeXiang', 123]
		i = 0
		while i < len(list_a):
		    print(666)
		    i += 1

这种属于迭代,但是并没有取值。

		list_a = ['XWeXiang', 123]
		i = 0
		while i < len(list_a):
		    print(list_a[i])
		    i += 1

此时可以迭代列表中的元素并取出。

可迭代对象

什么是可迭代对象?如果某一个对象中有着内置方法 __iter__ 的称之为可迭代对象
这个方法读作双下iter方法。

如何判断一个对象是否为可迭代的对象

方式一
通过 dir() 函数来判断该对象是否有 __iter__ 方法
	
		print(dir(list_a))

方式二
直接在该对象加点就能弹出它能用的方法,相对于方式一更简单。

哪些是可迭代的对象

通过上面的方法我们可以得到可迭代的对象类型有:字符串、列表、字典、元组、集合、文件
我们可以发现这些都支持 for 循环,其实是因为它们是可迭代对象才支持 for 循环。

迭代器对象

迭代器

迭代器是一个可以记住遍历的位置的对象,它会将遍历出的元素先储存起来,当需要用的时候才调用,极大的
减少占用内存的空间。

迭代器对象

如何判断是否为迭代器对象,迭代器对象的特征是它有列个方法 __iter__方法和__next__方法,有这俩方
法才是迭代器对象。
'需要注意的是,文件对象自带__iter__方法和__next__方法,既是可迭代对象优势迭代器对象。'
可迭代对象如何能编变成迭代器对象,可迭代对象在调用了方法 __iter__ 之后就成为了一个迭代器对象

代码示例
		list_a = ['XWeXiang', 123]
		print(list_a.__iter__())
输出结果
		<list_iterator object at 0x000001D5CBB6A8F0>

此时返回的值是迭代器对象。

''' 
需要注意的是,如果已经调用了方法  __iter__ 成为迭代器对象之后再一次调用方法 __iter__ 返回的是
它本身而不是重新创建一个迭代器对象。

也就是说 list_a.__iter__() 等价于 list_a.__iter__().__iter__().__iter__()
'''

迭代器对象取值

知道了如何成为迭代器对象后,就需要了解怎么从迭代器对象中取值
使用的方法是 __next__方法,此方法会返回下一个迭代器对象
代码示例一
		list_a = ['XWeXiang', 123]
		
		x = list_a.__iter__()
		print(x.__next__())
		print(x.__iter__().__next__())

输出结果
		XWeXiang
		123
		
'此时如果在调用一次 __next__方法的话程序就会报错,因为里面的元素都已经取完了。'		
代码示例二
		list_a = ['XWeXiang', 123]
		
		print(list_a.__iter__().__next__())
		print(list_a.__iter__().__next__())
		print(list_a.__iter__().__iter__().__next__())
		
如果是这种情况下的话,打印的结果都一样,都为第一个元素。因为在打印的时候每一次都生成了新的迭代器
对象。

而在示例一中,因为已经提前生成了迭代器,所以在打印的时候不论调用多少次 __iter__()返回的值都是
自身,也就是不变。

方法的简写

有很多双下方法其实都有简便写法(不是全部都有)

__方法名__  等价于  方法名()
例如  __iter__() 方法和__next__() 方法
这俩种方法可以简写成 iter() next()
例如 __len__() 可以简写成 len()

for循环内部原理

我们在用 for 循环的时候也会逐个取出可迭代对象的值,其实它的底层原理很像下面的代码示例

代码示例

		list_a = ['XWeXiang', 123]
		i = 0
		x = list_a.__iter__()
		while i < len(list_a):
		    print(x.__next__())
		    i += 1

输出结果
		XWeXiang
		123

for 循环的原理也是先调用__iter__()将可迭代对象变成迭代器对象,'''(文件自带 __iter__() 但是
在循环中在调用一遍结果也不变''' 然后用 __next__ 方法来取值,只不过在 for 中不需要得到可迭代对
象的长度,我们需要长度是因为取完值继续取会报错,但是 for 循环对报错进行了处理,异常处理会在下面
讲到。

异常处理

异常,也就是程序出错,会导致程序停止运行,俗称 bug 。
我们先看下异常长啥样,混个脸熟,毕竟以后天天见…
在这里插入图片描述

line 1 表示的是在第一行出错,我们可以点击蓝色的地方跳转到该位置。
SyntaxError 表示的是错误的类型,类型有很多
错误类型后面的是具体错误的原因。

异常的分类

异常有俩种分类,为 语法异常 和 逻辑异常。

1. 语法异常
语法异常或者叫解析错误,比如说丢了个冒号,丢了个括号之类的,这种是不被允许的,被发现只能删库跑路
了(开玩笑)

2. 逻辑异常
例如代码动态获取到了一个字符串类型的数据但是调用了列表的内置方法等运行期检测到的错误

异常的类型

TypeError     		类型错误  
AttributeError    	属性错误
NameError   		变量名错误
SyntaxError   		语法错误
KeyError  			key错误
IndexError  		索引错误
IndentationError  	缩进错误

...还有很多种,没有你想不到的错误哈哈

异常的处理

针对可能会出错的代码 也可以自己提前写好处理措施

try/except 语句

处理异常的语法

		try:
			可能会出错的代码
		except 错误的类型一 as e:
			代码A
		except 错误的类型二 as e:  # 这里的 e 是详细的错误提示
			代码B

上面的 try/except 语句有点像 if 语句,except 可以有多个,如果错误的类型是类型一,执行代码 A,
如果错误的类型是类型二,执行代码 B。如果没有错误则执行完 try 的语句就结束。
代码示例

		try:
		    if len('XWenXiang') > 6:
		        name
		    else:
		        pass
		except NameError:  # 这里的 e 是详细的错误提示
		    print('错误在这里')
			print(e)

输出结果

		错误在这里
		name 'name' is not defined


当代码发生错误且类型为 NameError 的时候,打印字符串。e 是详细的错误提示

万能错误类型

当我们不知道会报什么错的时候,可以用通用的错误类型 Exception

代码示例
		try:
		    if len('XWenXiang') > 6:
		        name
		    else:
		        pass
		except Exception as e:
		    print('错误在这里')
		    print(e)

只是修改了 except 的错误类型,如果不是 Exception 且错误的类型不符合的话,处理异常的代码不会执
行。而 Exception 可以对任意类型异常使用。

try/except…else 语句

和 try/except 语句一样,只不过多了一个 else 分支。

代码示例
		try:
		    if len('XWenXiang') > 6:
		        name = 66
		    else:
		        pass
		except Exception as e:
		    print('错误在这里')
		    print(e)
		else:
		    print('没有错')

输出结果
		没有错
		
else 语句是在被检测的代码'没有错误'的时候执行的

try/except…finally 语句

代码示例
		try:
		    if len('XWenXiang') > 6:
		        name 
		    else:
		        pass
		except Exception as e:
		    print('错误在这里')
		    print(e)
		finally:
		    print('真厉害')

输出结果
		错误在这里
		name 'name' is not defined
		真厉害

finally 语句不管被检测的代码是否有错都执行

try/except…/else/finally 语句

它们可以一起使用

代码示例		
		try:
		    if len('XWenXiang') > 6:
		        name = 66
		    else:
		        pass
		except Exception as e:
		    print('错误在这里')
		    print(e)
		else:
		    print('没有错')
		finally:
		    print('真厉害')

输出结果
		没有错
		真厉害

当前被检测的代码并没有错误,所以会执行 else 的代码和不管错没错都执行的代码 finally

断言

断言使用的关键字是 assert ,用于判断一个表达式,在表达式条件为 false 的时候触发异常

断言语法
		assert expression [, arguments]

expression 是判断语句 
arguments 是报错的时候显示的语句
assert True
assert False,'66'

False 的时候会报错,报错显示 66
assert 后面跟着条件语句,返回 TrueFalse

所以 assert expression 相当于 

			if not expression:
				raise AssertionError  #(主动报错)
				

主动报错

主动报错就是使用 raise 语句抛出一个指定的异常

语法格式如下:
		raise [Exception [, args [, traceback]]]

代码示例
		raise NameError(996)
		
此时会报一个类型为 NameError 的错。

我们也可以使用万能的错位类型 'Exception' ,后面加括号,括号里跟着错误时显示的内容。

for 循环的本质

迭代所有的内容,并处理继续迭代报的错,类似于下面的代码

		x = iter(range(1, 10))
		while True:
		    try:
		        print(x.__iter__().__next__())
		    except StopIteration as e:
		        break

不过 for 循环是已经封装好的,我们日常也是使用 for 循环,很少使用底层的迭代。

迭代取值与索引取值的对比

1.索引取值
	优势:可以反复获取相同的元素 并且没有固定的方向
  	劣势:只能支持有序的容器类型 无序的无法取值兼容性没有迭代取值高
 
2.迭代取值
	优势:兼容所有的容器类型
 	劣势:取值的顺序永远都是从左往右 并且无法重复获取 去完就完了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 迭代器 与 异常处理 的相关文章

  • 数字信号处理上机实验一

    数字信号处理上机实验一 给定信号 x n 61
  • 如何使用arduino 更改传感器寄存器的内容,这里以更改MLX90614的地址为例

    这里参考了这篇文章 xff08 ARDUINO使用MLX90614红外温度传感器研究笔记 雨田大大的博客 CSDN博客 mlx90614红外传感器 xff09 xff0c 构建了一个修改地址的程序关于crc校验的部分 xff08 CRC x
  • linux网络编程之udp

    这里写目录标题 UDP服务器代码UDP客服端代码结果 UDP服务器代码 ucp ser c span class token macro property span class token directive hash span span
  • 【Jetson Orin NX 开发板烧录启动系统】

    64 英伟达Jetson Orin NX 开发板上市有一段时间了 xff0c 其中16G套件能提供100TOPS算力 xff0c 性能是上一代Jetson Xavier NX 的 5 倍 其启动系统安装于之前Jetpack SD 烧录完全不
  • 起航-GitLens使用

    目录 GitLens 插件功能介绍准备工作开始使用加入暂存区 xff0c 和取消修改操作取消暂存区 xff0c 取消add操作加入到本地分支 xff0c 提交到远程提交记录远程被修改提示分支合并功能管理所有分支记录工作区暂存 GitLens
  • 在Docker环境下使用ROS

    在Docker环境下使用ROS Docker安装 参考 https docs docker com install linux docker ce ubuntu 卸载老旧版本 sudo apt get remove docker docke
  • 嵌入式linux项目之智能仓储(基于正点原子IMX6ULL开发板)

    基于正点原子的IMX6ULL开发板的智能仓储项目 提示 xff1a 该项目根据华清远见智能仓储项目改版 xff0c 将他的A9开发板换成了自己的IMX6ULL开发板 同时等我将该项目整个流程完成之后 xff0c 会为大家附上适配正点原子li
  • STM32电路知识学习

    STM32最小系统板电路知识学习 单片机最小系统是指用最少的电路组成单片机可以工作的系统 xff0c 通常最小系统包含 xff1a 电源电路 时钟电路 复位电路 调试 下载电路 xff0c 对于STM32还需要启动选择电路 总之 xff0c
  • ubuntu18.04运行vins-fusion跑通自己的数据集

    博主是双目加imu 命令 xff1a xff08 一定要记得改成自己的路径哦 xff09 cd catkin ws source devel setup bash roslaunch vins vins rviz launch source
  • 17.C语言 常见面试题

    嵌入式工程师必备0x10到题目 宏定义 1 用预处理指令 define声明一个常数 xff0c 用于表明1年中有多少秒 define 宏名 宏体 宏名 xff1a 大写字母表示 define SECOND OF YEAR 365 24 36
  • 自动控制原理第一章

    开环控制系统 xff1a 输入量与输出量没有反向联系 被控量 xff08 输出信号 xff09 xff0c 系统在特定输入下的输出称系统对该输入的响应 控制量 xff08 输入信号 xff09 给定值 扰动 xff1a 破坏控制量与被控量正
  • 利用Mavros控制无人机

    准备 xff1a 1 ubuntu18 04 2 Qgc 3 Mavros 4 ROS 5 PX4 Mavros安装 xff1a 参考安装链接 xff1a Ubuntu18 04安装px4 43 mavros xff08 解决mavros报
  • 5分钟搭建MySQL监控平台(mysql-exporter+Prometheus+Grafana)

    一 工具介绍 Prometheus 普罗米修斯可以简单理解为一个监控工具 xff0c 以时间为单位展示指定数据维度的变化 趋势 span style color fe2c24 strong mysqld exporter strong sp
  • Prometheus环境搭建

    实验环境 xff1a 准备三台虚拟机 xff0c 本文用Centos7为例 xff1b 我这里所使用的的虚拟机地址分别为 xff1a 主机名 xff1a IP prometheus weme 192 168 10 63 agent weme
  • 无人机飞控系统硬件设计

    目录 一 飞行控制系统简介 1 飞控系统功能分析 2 飞控系统基本原理 3 飞控系统的组成部分 3 1 地面部分 3 2 中央处理器 3 3 传感器模块 3 4 传输定位模块 二 飞控系统硬件平台设计 一 飞行控制系统简介 1 飞控系统功能
  • Ubuntu20.04中怎么更换源都不行install或者update始终报错,解决方案

    更换源后安装或者更新依旧报错 xff0c 试试下面两种方法 xff0c 亲测可行 方法一 xff1a 静态ip改成动态ip 如果ip是静态改成动态ip后 xff0c 重新在试试apt update 1 vi etc netplan 00 i
  • AlphaGo 引发的中国象棋之路

    笔者是一位多年的象棋爱好者 xff0c 早在2005 xff0c 中国象棋有款软件奇兵1 04 xff0c 当时打败特级大师于幼华 xff0c 又打败了柳大华 xff0c 后期软件和计算机硬件的发展 xff0c 象棋软件又有了质的飞越 xf
  • linux驱动IO模型

    1 非阻塞 当应用层读取驱动中的数据时 xff0c 无论数据是否准备号 xff0c 都需要立即返回 open 34 dev mycdev 34 O RDWR O NOBLOCK 非阻塞方式打开 默认打开方式为阻塞方式打开 O NOBLIOC
  • ROS学习(一)工作空间,功能包,节点

    本文主要介绍建立一个功能包 xff0c 一个publisher结点 xff0c 实现话题的发布 一工作空间 1创建所需的文件夹 mkdir ros cd ros mkdir src 2工作空间的初始化 cd src catkin init
  • NVIDIA Jetson Xavier NX搭建pytorch gpu环境(超详细)

    NVIDIA Jetson Xavier NX开发套件在搭建tensorflow gpu环境时可以使用指令直接安装或者官网下载whl文件安装 作者在安装pytorch环境时总是安装不上gpu版本 报错 AssertionError Torc

随机推荐

  • uCOS-iii学习笔记(11)——任务信号量和任务消息队列

    理解 xff1a 任务信号量 任务消息队列是跟随任务创建而来的 xff0c 不需要额外创建 xff0c 并且他和多值信号量 消息队列有一些不同 xff0c 多值信号量他们是建立于1对多得关系 xff0c 而我们的任务信号量还有任务消息队列是
  • C语言当中什么情况下形参可以改变实参详细实例及解释

    在 C 语言中 xff0c 形参可以改变实参的值的情况与 C 43 43 类似 xff0c 也有传递指针和传递引用两种方式 传递指针 当我们传递一个指针作为函数的形参时 xff0c 函数内部同样可以通过这个指针来改变指向的实参的值 这是因为
  • git仓库与vscode关联

    git仓库与vscode关联 git安装完后 xff0c 会提示输入用户信息 a 设置用户名 xff1a git config global user name 39 你再github上注册的用户名 39 b 设置用户邮箱 xff1a gi
  • python修改全局变量

    span class token comment 全局变量 span num span class token operator 61 span span class token number 10 span span class toke
  • python函数不能修改全局变量

    span class token comment 全局变量 span num span class token operator 61 span span class token number 10 span span class toke
  • FreeRTOS笔记(六)互斥量mutex

    概念 互斥量是二进制信号量的一个变种 xff0c 开启互斥量需要在头文件FreeRTOSConfig h 设置configUSE MUTEXES 为1 互斥量和信号量的主要区别如下 互斥量用于保护资源时必须要被返还 信号量用于数据同步时不需
  • 完爆面试官!spring可能带来的一个深坑

    4步套路 xff0c 解决动态规划问题 1 确定问题状态 提炼最后一步的问题转化 2 转移方程 xff0c 把问题方程化 3 按照实际逻辑设置初始条件和边界情况 4 确定计算顺序并求解 结合实例感受下 xff1a 你有三种硬币 xff0c
  • 树莓派Raspberry Pi 2B在Kali上使用TightVNCServer灰屏

    1 将 root vnc xstartup改为 span class token shebang important bin sh span unset SESSION MANAGER unset DBUS SESSION BUS ADDR
  • STM32——UCOSIII 简介

    目录 UCOSIII简介 UCOSIII中的任务 组成 任务堆栈 任务控制块 任务函数 任务函数模板 UCOSIII系统任务 组成 空闲任务 时钟节拍任务 统计任务 定时任务 中断服务管理任务 UCOSIII任务状态 组成及状态概念 UCO
  • ARM —— 寄存器的封装

    目录 SFR 直接一对一封装 结构体封装寄存器 SFR 全称 xff1a 特殊功能寄存器 xff08 Special Function Register xff09 作用 xff1a 用于 控制片内外设 xff0c 存放 相应功能部件的 控
  • Ubuntu给Pix2.4.8刷Ardupilot固件

    全文基于waf编译器使用 waf命令 xff0c APM官网对于waf的使用描述 xff1a https github com ArduPilot ardupilot blob master BUILD md 前提 xff1a 已经在ubu
  • 程序猿面试经验总结(经验篇)

    开篇序 金九银十大家都知道吧 xff0c 的确九十月份都是跳槽旺季与招聘旺季 xff0c 无论是找工作的 招聘的单位都是特别特别的多 xff0c 多的你有时候看都看不过来 xff0c 以至于让你有时候很难选择 xff0c 其实选择对应自己的
  • STM32 HAL库和标准库的原理区别

    STM32 HAL库和标准库的原理区别 HAL简介 HAL库 xff0c HAL是Hardware Abstraction Layer的缩写 xff0c 中文名称是 xff1a 硬件抽象层 xff0c 是st公司为了更方便地进行stm32之
  • 【超详细~】js的三大定时器:setTimeout、setInterval、requestAnimationFrame

    setTimeout xff08 表达式 xff0c 时间 xff09 61 gt 是指延迟指定时间后才调用函数 xff0c 调用次数仅一次 xff1b setInterval xff08 表达式 xff0c 时间 xff09 61 gt
  • FreeRTOS的学习(一)——实时操作系统和多任务的介绍

    目录 1 初识FreeRTOS 2 FreeRTOS 任务的状态 3 FreeRTOS 的任务 任务的创建和删除 1 xTaskCreate xff1a 使用静态的方法创建一个任务 2 xTaskCreateStatic xff1a 使用静
  • FreeRTOS的学习(四)—— 信号量之间的优先级翻转问题和互斥信号量

    目录 优先级翻转现象 什么是优先级翻转 互斥信号量 1 互斥信号量简介 2 创建互斥信号量 1 函数 xSemaphoreCreateMutex 2 函数 xSemaphoreCreateMutexStatic 3 释放互斥信号量 4 获取
  • STC15单片机 固定翼无人机/航模 飞控程序

    stc15单片机 固定翼无人机 飞控程序 硬件 stcf2k60s22 4g无线通信模块nrf24l01mg90s数字舵机摇杆无刷电机电调 用到的单片机资源 pwmad转换 程序结构 利用ADC转换读取摇杆值将摇杆数值转换为16进制通过2
  • ESP8266 WIFI 模块使用说明

    ESP8266是ai thinker公司推出的一款无线WIFI模块 xff0c 可以通过配置 xff0c 和单片机上的串口进行通信 xff0c 利用WIFI传输数据 1 AT指令简介 同许多通信模块一样 xff0c 我们需要对WIFI模块利
  • Ubuntu18更新软件源、安装python3.8和安装pip

    目录 一 更新软件源二 安装python3 8三 安装pip 一 更新软件源 1 xff09 首先 xff0c 打开sources list文件 sudo vim etc apt sources list 若没有vim xff0c 则需要进
  • Python 迭代器 与 异常处理

    文章目录 迭代介绍可迭代对象迭代器对象迭代器对象取值 方法的简写for循环内部原理异常处理异常的分类异常的类型异常的处理try except 语句try except else 语句try except finally 语句try exce