python之部分内置函数与迭代器与异常处理
常见内置函数(部分)
接上一个博客
| 函数 | 作用 | 用法 |
|---|---|---|
| help(x) | 查看x内部的注释 | >>> help(len) Help on built-in function len in module builtins: len(obj, /) Return the number of items in a container. |
| id(x) | 获取x的内存地址 | >>> id('a') 2284721012216 |
| int(x) | 将x转为整型 | >>> int('123') 123 |
| str(x) | 将x转为字符串类型 | >>> str(123) '123' |
| isinstance(x, y) | 判断x是否为y类型 | >>> isinstance('a', str) True |
| pow(x, y) | 返回x的y次幂 | >>> pow(2, 3) 8 |
| round(x, y) | 把x四舍五入,并保留y位小数,y不写则不要小数部分 | >>> round(2.45) 2 >>> round(2.45, 1) 2.5 |
| sum(x) | 将x全部元素求和 | >>> sum([2, 4, 1]) 7 |

可迭代对象
在了解可迭代对象之前,我们要想了解什么叫做迭代。
在执行重复的步骤时,每一次的结果都要依赖上一个的结果计算,这个过程就叫做迭代。
# 迭代过程
n = 0
while n < 5:
print(n)
n += 1
所以,可迭代对象其实简单的来说就是可以放到for循环里进行遍历的数据,像列表、字典、元组、字符串等等
如果在pycharm中想要查看一个数据是否是可迭代对象,我们可以看看这个数据是否可以调用__iter__方法。
可以调用:会提示

不可以调用:不会提示

属于可迭代对象的数据类型:
列表、字典、元组、集合、字符串、文件
不属于可迭代对象的数据类型:
整型、浮点型、布尔值、函数
迭代器对象
一个可迭代对象在调用__iter__方法后返回的结果就是迭代器对象,迭代器对象可以极大的节省存储空间,它只会在需要用的时候才会取出数据。
迭代器对象能调用__iter__方法和__next__方法,所以迭代器对象一定是可迭代对象,但可迭代对象不一定是迭代器对象。

迭代器对象的取值方法
迭代器对象可以用__next__方法取值,每次可以取出一个值,取完了继续取值会报错。
s = 'hello'
# 将可迭代对象变为迭代器对象
res = s.__iter__()
# 调用__next__方法
print(res.__next__()) # 输出:h
print(res.__next__()) # 输出:e
print(res.__next__()) # 输出:l
print(res.__next__()) # 输出:l
print(res.__next__()) # 输出:o
print(res.__next__()) # 报错StopIteration
也可以使用next方法,等价于__next__
s = 'hello'
# 将可迭代对象变为迭代器对象
res = iter(s)
# 调用__next__方法
print(next(res)) # 输出:h
print(next(res)) # 输出:e
print(next(res)) # 输出:l
print(next(res)) # 输出:l
print(next(res)) # 输出:o
print(next(res)) # 报错StopIteration
取值注意事项
"""可迭代对象不要在调用__iter__的同时调用__next__,不然在下一次调用__next__还是只会输出第一个值"""
s = 'hello'
print(s.__iter__().__next__()) # 输出:h
print(s.__iter__().__next__()) # 输出:h
print(s.__iter__().__next__()) # 输出:h
"""如果一个迭代器对象调用__iter__并不会有任何反应,返回的还是它本身"""
s = 'hello'
res = s.__iter__()
print(res.__iter__().__next__()) # 输出:h
print(res.__iter__().__next__()) # 输出:e
print(res.__next__()) # 输出:l
for循环内部原理
如过此时有一串数据,我们如何不使用for循环将它输出?是不是只能使用while循环输出了?
实现:
s = 'hello'
n = 0
res = iter(s)
while n < len(s):
print(next(res))
n += 1
这时候需要一个变量来判断是否输出完毕,而for循环并不需要额外的变量。
原理
首先我们要了解for循环的语法结构
for 变量名 in 可迭代对象:
循环语句
- 在执行for循环时,for循环会先将可迭代对象变为迭代器对象,也就是调用__iter__方法。
- 使用迭代器对象的__next__方法依次取值并赋值给变量名
- 当值取完后,自动处理报错并退出循环。
前两步的使用while循环表现为:
s = 'hello'
res = s.__iter__()
while True:
print(res.__next__())
第三步的报错该怎么处理,这就是我们接下来要学习的内容。

异常处理
异常就是报错,报错就说明代码有问题,报错的同时程序也会立刻停止运行,异常处理就可以防止报错时程序会停止的问题。
异常信息的组成部分
异常信息有三部分组成。
- Traceback部分:可以知道报错的位置
- error部分:可以知道错误类型
- 报错原因:可以知道为什么会报错

异常的分类
异常主要分为语法异常和逻辑异常两大类。
- 语法异常:语法结构问题,比如if的语法结构写错,小白经常会犯的错误。
- 逻辑异常:代码逻辑出现问题,比如字符串类型调用了不属于它的方法。
异常的类型
常见错误类型,只列举部分。
| 异常类型 | 原因 |
|---|---|
| NameError | 没有声明过的变量被使用了 |
| IndexError | 没有此索引 |
| KeyError | 没有此键(key) |
| ValueError | 无效参数 |
| ImportError | 导入模块错误 |
| SyntaxError | 语法错误 |
| TypeError | 数据类型错误 |
| IndentationError | 缩进错误 |
| AttributeError | 调用了错误的方法 |
| StopIteration | 迭代器没有更多的值了 |

异常处理实操
对于代码中可能出现错误的代码,我们可以进行处理让代码不会报错,防止程序停止。
语法结构(括号内的语法可以被省略):
try:
可能会出错的代码
except 错误类型1 (as 变量名): # 错误的信息会赋值给变量名
处理措施
except 错误类型2 (as 变量名): # 错误的信息会赋值给变量名
处理措施
...
如果不知道错误类型,还可以这么写:
try:
可能会出错的代码
except Exception (as 变量名): # 错误的信息会赋值给变量名
处理措施
except Exception (as 变量名): # 错误的信息会赋值给变量名
处理措施
...
实操:
# 案例一:代码会出错
try:
res = int('a')
print(res)
except Exception as e:
print('代码出错啦')
print(e)
"""
运行结果:
代码出错啦
invalid literal for int() with base 10: 'a'
"""
# 案例二:代码不会出错
try:
res = int('5')
print(res)
except Exception as e:
print('代码出错啦')
print(e)
"""
运行结果:
5
"""
异常处理原则:不要把全部代码全部写入try中,虽然代码不会报错了,但你的功能也无法实现了,异常处理只适用于检测代码,能不用就不用

异常处理的其他操作
结合else使用:如果try语句里的代码没有异常,则执行else里的代码。
try:
res = int('5')
print(res)
except Exception as e:
print(e)
else:
print('代码正常运行结束了')
"""
运行结果:
5
代码正常运行结束了
"""
结合finally使用:无论try语句里的代码如何,最后都会执行finally里的代码。
# 案例一:代码没有异常
try:
res = int('5')
print(res)
except Exception as e:
print(e)
finally:
print('代码结束了')
"""
运行结果:
5
代码结束了
"""
# 案例二:代码有异常
try:
res = int('abc')
print(res)
except Exception as e:
print(e)
finally:
print('代码结束了')
"""
运行结果:
invalid literal for int() with base 10: 'abc'
代码结束了
"""
主动报错:使用raise关键字,强行报错,报错原因可以自行填写。
raise NameError('我就要报错!!!')
# 报错:NameError: 我就要报错!!!
断言(了解即可):使用assert关键字,后面跟判断条件,条件成立则跳过,不成立就会报错。
name = 'jason'
assert isinstance(name, str)
# 无事发生
name = 'jason'
assert isinstance(name, int)
# 报错:AssertionError
for循环本质
了解了异常处理了现在应该明白了for循环的本质了吧!
# for循环
s = 'jason'
for i in s:
print(i)
"""利用while与异常捕获 实现for循环的功能"""
s = 'jason'
# 1.先转换成迭代器对象
res = s.__iter__()
# 2.迭代取值
while True:
# 3.异常处理
try:
print(res.__next__())
except StopIteration as e:
# 4.结束while循环
break
迭代取值与索引取值的区别
迭代取值
优点:兼容所有的容器类型。
缺点:无法重复取值,只能按顺序取值(从左到右),取一个少一个。
索引取值
优点:可以精确反复取值。
缺点:只能取有序的容器类型。

python之部分内置函数与迭代器与异常处理的更多相关文章
- python学习交流 - 内置函数使用方法和应用举例
内置函数 python提供了68个内置函数,在使用过程中用户不再需要定义函数来实现内置函数支持的功能.更重要的是内置函数的算法是经过python作者优化的,并且部分是使用c语言实现,通常来说使用内置函 ...
- 十五. Python基础(15)--内置函数-1
十五. Python基础(15)--内置函数-1 1 ● eval(), exec(), compile() 执行字符串数据类型的python代码 检测#import os 'import' in c ...
- python 常见的内置函数
内置函数 接下来,我们就一起来看看python里的内置函数.截止到python版本3.6.2,现在python一共为我们提供了68个内置函数.它们就是python提供给你直接可以拿来使用的所有函数.这 ...
- python常用的内置函数哈哈
python常用的内置函数集合做一个归类用的时候可以查找 abs 返回数字x的绝对值或者x的摸 all (iterable)对于可迭代的对象iterable中所有元素x都有bool(x)为true,就 ...
- python常用的内置函数
python常用的内置函数集合做一个归类用的时候可以查找- abs 返回数字x的绝对值或者x的摸 - all (iterable)对于可迭代的对象iterable中所有元素x都有bool(x)为tru ...
- 十六. Python基础(16)--内置函数-2
十六. Python基础(16)--内置函数-2 1 ● 内置函数format() Convert a value to a "formatted" representation. ...
- Python的常用内置函数介绍
Python的常用内置函数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.取绝对值(abs) #!/usr/bin/env python #_*_coding:utf-8_ ...
- python之路——内置函数和匿名函数
阅读目录 楔子 内置函数 匿名函数 本章小结 楔子 在讲新知识之前,我们先来复习复习函数的基础知识. 问:函数怎么调用? 函数名() 如果你们这么说...那你们就对了!好了记住这个事儿别给忘记了,咱们 ...
- Python进阶(五)----内置函数Ⅱ 和 闭包
Python进阶(五)----内置函数Ⅱ 和 闭包 一丶内置函数Ⅱ ####内置函数#### 特别重要,反复练习 ###print() 打印输入 #sep 设定分隔符 # end 默认是换行可以打印到 ...
随机推荐
- (十)React Ant Design Pro + .Net5 WebApi:后端环境搭建-IdentityServer4(二)授权模式
一.前言 先交代一下整个Demo项目结构: 一个认证服务(端口5000)IdentityServer4.Authentication 五个授权模式(两个控制台程序,三个MVC项目端口5001)文件夹G ...
- 网络协议之:socket协议详解之Datagram Socket
目录 简介 什么是Datagram Socket 使用socat来创建UDP服务 使用ss命令来监控Datagram Sockets 使用nc建立和UDP Socket的连接 总结 简介 上一篇文章我 ...
- IMWebConf 2017 官网彩蛋解谜
前言 IMWebConf 2017 ←这是官网 然后看到了这个: 所以就试了下,作为一个前端菜鸟,发现通关还挺简单的,不过每个方面的知识都涉及到一点,所以在这里总结一下. 下面进入正题. 第 0 关 ...
- H5进阶篇--实现微信摇一摇功能
在HTML5中,DeviceOrientation特性所提供的DeviceMotion事件封装了设备的运动传感器时间,通过改时间可以获取设备的运动状态.加速度等数据(另还有deviceOrientat ...
- web项目中视频的上传和展示
思路: 上传:<form>表单提交视频-->后台使用字节流保存到本地. 展示:<video>标签展示: src属性发送请求 --> 使用字节流将视频绑定到响应并返回 ...
- vue+koa2即时聊天,实时推送比特币价格,爬取电影网站
技术栈 vue+vuex+vue-router+socket.io+koa2+mongodb+pm2自动化部署+图灵机器人+[npm script打包,cdn同步,服务器上传一个命令全搞定] 功能清单 ...
- Canvas 制作海报
HTML <template> <view class="content"> <view class="flex_row_c_c mod ...
- dev分支代码覆盖master分支代码
将develop分支上的代码完全覆盖master分支, 1. 切换到master分支 git checkout master 2. 执行以下命令 git reset --hard origin/dev ...
- 实现WebMvcConfigurer接口扩展Spring MVC的功能
前言: 先查看WebMvcConfigurer接口中都定义了哪些内容 public interface WebMvcConfigurer { default void configurePathMat ...
- 算法基础③--DFS解决迷宫问题入门
迷宫问题 通过深度优先搜索(DFS)方法实现. 迷宫问题一 一天蒜头君掉进了一个迷宫里面,蒜头君想逃出去,可怜的蒜头君连迷宫是否有能逃出去的路都不知道. 看在蒜头君这么可怜的份上,就请聪明的你告诉蒜头 ...