目录
可迭代对象
迭代就是每一次的结果必须依赖于上一次的结果
# 可迭代对象
内置有__iter__()方法的对象都是可迭代对象
可迭代对象:str、list、 dict、 tuple、set、 文件对象
# 迭代器
可迭代对象调用.__iter__()就变成迭代器,简写iter()
c='hello'
c.__iter__()
print(c.__iter__()) # <str_iterator object at 0x0000017E0C21C610>
print(iter(c)) # <str_iterator object at 0x000001B18D4DC610>
'''一般双下滑线开头的方法都有一个简便的写法,就是函数名()'''
迭代器对象
什么是迭代器对象:既有__iter__方法, 也含有__next__方法
# 如何生成迭代器对象:可迭代对象调用__iter__方法得到迭代器对象
# 取值:可迭代对象调用__next__方法进行取值,简写next
"""
迭代给我们提供了一种不依赖索引取值的方法, 此外可迭代对象都支持for循环
"""
c = 'hello'
res=c.__iter__()
print(res.__next__())
print(c.__iter__().__next__())
print(c.__iter__().__next__())
print(c.__iter__().__next__())
>>>h
h
h
h
e = {'username': 'ly', 'age': 18}
res = e.iter()#得到1个可迭代对象
print(res.next()) >>>username
print(res.next()) >>>age
print(next(res)) # 报错StopIteration,迭代取值次数不可超出迭代对象的长度
简写:
e = {'username': 'ly', 'age': 18}
res = iter(e)
print(next(res))
print(next(res))
* 例
打印字符串元素
c = 'hello'
print(c.iter().next())
print(c.iter().next())
print(c.iter().next())
print(c.iter().next())
每次都生成一个新的可迭代对象,所以每次取值都是第一个元素
h
h
h
h
c = 'hello'
res=c.iter()
print(res.next())
print(res.next())
print(res.next())
print(res.next())
print(res.next())
h
e
l
l
o
只生成一个可迭代对象,每次取值基于一个可迭代对象取值
* 迭代取值与索引取值的对比
迭代取值
1 不依赖于索引取值
2 只能从左往右取值,不能重复取值
索引取值
1 必须依赖于索引取值
2 可重复取值
3 必须是容器类型
#### for循环内部原理
```python
l = [1, 2, 3, 4, 5, 6, 7]
# 要求:循环打印出列表中每个元素,但是,不能使用for循环,__next__ next()
l = [1, 2, 3, 4, 5, 6, 7]
res = l.__iter__()# 转为迭代器
n = 0
while n < len(l):
# '''肯定有一个语法检查错误,捕捉了'''
print(res.__next__())
n+=1
>>>1
2
3
4
5
6
7
"""
for循环内部执行流程:
l = [1, 2, 3, 4, 5, 6, 7]
res = l.__iter__()# 转为迭代器
while True:
try:
print(res.__next__())
except Exception:
break
1. 把关键字in后面的可迭代对象数据类型转为了迭代器 __iter__
2. 内部循环__next__取值
3. next取值完毕之后使用万能捕捉异常,自动处理异常并且结束while循环
"""
捕捉异常
1. 什么是异常?
# 异常就是错误发生的信号,如果此信号不做处理,那么,从本行开始之后的代码都不能正常执行了
2. 异常分类
2.1 Traceback#定位到异常所在位置
2.2 XXXError # 错误的类型
XXXError冒号后面的内容为报错的详细原因,大致定位错误的原因
3. 异常的种类
1. 语法错误
# 是坚决不允许的,借助pycharm可以定位异常位置
2. 逻辑错误
# 是可以被允许的,但是尽可能的避免逻辑错误的发生
4. 常见的错误类型
NameError:名字错误
IndexError:索引错误
KeyError:键错误
ValueError:值错误
IndentationError:缩进错误
...
5.如何捕捉异常
#语法:
try:
被监测的代码
except 错误的类型1 as e:
错误处理,e:错误的原因
except 错误的类型2 as e:
错误处理,e:错误的原因
except 错误的类型3 as e:
错误处理,e:错误的原因
except 错误的类型4 as e:
错误处理,e:错误的原因
print(e)#错误的具体原因
- except
例1
try:
print(username)
except ZeroDivisionError as e:
print(e)
>>>NameError: name 'username' is not defined #错误类型不匹配就报错
例2
try:
print(username)
except NameError as e:
print(e)
>>>name 'username' is not defined
例3
try:
l = [1, 2, 3, ]
print(l[5])
except ZeroDivisionError as e:
print(e)
>>>IndexError: list index out of range
例4
try:
l = [1, 2, 3, ]
print(l[5])
except IndexError as e:
print(e)
>>>list index out of range
- 万能异常Exception
try:
print(username)
except Exception:
print(Exception)
>>><class 'Exception'>
try:
print(username)
except Exception as e: #Exception不需要输入错误类型
print(e)
>>>name 'username' is not defined
else:
print('else')
finally:
print('finally')
"""
else在没有异常时才会执行,finally在有异常和没有异常时都会执行
try和else不能单独使用,必须配合except一起使用
try和finally可以单独使用
"""
assert
assert是Python中的一个关键字,用于对一个表达式进行断言,如果该表达式为True,则程序继续执行;如果该表达式为False,则会抛出AssertionError异常,并且程序停止运行。
标签:__,迭代,iter,next,循环,捕捉,print,取值
From: https://www.cnblogs.com/Super-niu/p/17452219.html