整体构思:
1. 可迭代对象
什么是迭代?
迭代言外之意就是更新换代,每次的更新都是要依赖于上一次的结果
什么又是可迭代对象呢?
```就是内置有__iter__()方法的都可以称之为是可迭代对象```
"内置":可以直接点出来的就称之为是内置,既然可以点出来就可以直接拿来使用
__name__:属性
__iter__():方法
"""
__iter__()
双下划线开头的方法我们是第一次遇到,他是一种特殊的方法
像双下划线开头的方法在面相对象里面最常见
用法跟普通方法都是一样的
"""
我们所学的八种基本数据类型都有哪些是可迭代对象呢?
"""
是可迭代对象的有:
字符串、列表、元组、字典、集合等
整型、浮点型、布尔值都不是
ff = open('a.txt', 'w', encoding='utf8')
文件对象也是可迭代对象,因为内置的有__iter__()方法
"""
可迭代对象调用__iter__()方法就变成了"迭代器对象"
print(d.__iter__())
print(iter(d))
def iter(obj):
return obj.__iter__()
# print(len(d))
# print(d.__len__())
def len(obj):
return obj.__len__()
"""
一般情况下,双下滑先开头的方法都有一个与之对于的简化方法 名字()
"""
2. 迭代器对象
迭代器对象:迭代器
什么是迭代器对象?
既内置了__iter__()方法,又内置了__next__方法就是迭代器对象
"""文件对象本身就具备__iter__()和__next__()方法"""
即是可迭代对象又是迭代器对象
到底都有哪些数据类型是迭代器对象
str、list、dict、tuple、set、文件等
迭代器对象有什么用呢?
"""
迭代器其实是一种不依赖于索引取值的方式!
"""
可迭代对象多次调用__iter__()方法之后还是迭代器对象,所以你只需要调用一次即可
l = [1, 2, 3, 4]
# print(l[0])
# print(l[1])
# print(l[2])
res1 = l.__iter__()
# print(res1.__next__())
# print(res1.__next__())
# print(res1.__next__())
print(next(res1))
print(next(res1))
print(next(res1))
d = {'username': 'ly', 'age': 18}
# res = d.__iter__()
# print(res.__next__())
# print(res.__next__())
# print(d.__iter__())
# print(d.__iter__().__iter__().__iter__().__iter__())
''''''''''''''''''''''''''''''''''易错题'''''''''''''''''''''''''''''''''''''''''
ll = [1, 2, 3, 4]
# res = ll.__iter__()
# print(res.__next__())
# print(res.__next__())
# print(res.__next__())
# print(res.__next__())
# print(res.__next__()) # StopIteration 当数据被取值完的时候,如果在次next会直接报错
print(ll.__iter__().__next__()) # 1
print(ll.__iter__().__next__()) # 1
print(ll.__iter__().__next__()) # 1
print(ll.__iter__().__next__()) # 1
res = ll.__iter__()
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())
3. 异常捕获
1. 什么是异常?
异常就是错误发生的信号,如果不对此信号做正确处理,那么之后的程序都不能正常运行了
2. 异常的分类
1. Traceback
是异常所在的位置,一般情况我们直接可以定位到异常发生的位置所在处
2. XXXError 错误的类型
3. XXXError后面的详细信息
重要,一般情况我们直接看错误发生的详细信息都可以定位原因
4. 异常都有哪些类型
1. 语法错误
# 坚决不允许的,容易解决,借助于pycharm工具就可以很容易的定位到
2. 逻辑错误
# 是允许被出现的,但是,我们在写代码的时候,尽量的避免逻辑错误的发生
3. XXXError 错误的类型
# print(name) # NameError
# l = [1,2,3,4]
# print(l[5]) # IndexError
# d = {'a':1}
# print(d['b']) # KeyError
# 1/0 # ZeroDivisionError
4. 如何解决这种异常
"""
语法结构:
try
被监测的代码:一般是可能会发生的错误
except 错误类型1 as e
print(e)
except 错误类型2 as e
print(e)
except 错误类型3 as e
print(e)
except 错误类型4 as e
print(e)
"""
try:
# print(name)
# 1/0
# l = [1,2,3]
# print(l[6])
# 1/0
d = {'a':1}
print(d['aaa'])
except NameError as e:
print(e) # name 'name' is not defined
except IndexError as e:
print(e) # name 'name' is not defined
except Exception as e:
print(e)
else:
print('看一下else什么时候走的?')
finally:
print('看一下finally什么时候走?')
"""
没有异常的时候else会走,有异常的时候else不会走
finally是不管有没有异常都会走
"""
try:
pass
except NameError:
pass
try:
pass
finally:
pass
# 这里面你只需要记住try和else不能单独使用,
try:
pass
except :
pass
else:
pass
# 断言:我断定你一定是正确的、成功的、可行的等
s = 1+2
# 在这一行我居断定s必须是2,如果不是2直接拦截,
assert s == 2
# assert 条件 条件必须成立,如果不成立,代码在这一行直接中断
print(123)
4. for循环的原理
l = [1,2,3,4,5,6,7,8]
# 循环打印出列表中的每一个元素,但是不能使用for循环,必须要使用__next__()取值
l = [1,2,3,4,5,6,7,8,9,10,11,12,13,14]
# 循环打印出列表中的每一个元素,但是不能使用for循环,必须要使用__next__()取值
res = l.__iter__()
while True:
try:
print(res.__next__())
except Exception:
break
for i in l:
print(i)
for循环的原理:
1. 先把关键字in后面的可迭代对象先调用__iter__()
2. while循环,next()取值
3. for的内部当出现异常的时候,做了捕捉处理:StopIteration的错误,break
5. 迭代取值和索引取值的对比
迭代取值
迭代取值
1. 不依赖于索引取值
2. 只能从做往右依次取值,不能重复取值
索引取值
1. 必须依赖于索引取值
2. 可以重复取值
l[0]
3. 必须是容器类型
标签:__,.__,迭代,对象,iter,next,print,取值
From: https://www.cnblogs.com/huangchunfang/p/17451797.html