python基础day17 迭代器和for循环原理

可迭代对象

什么是迭代?

迭代言外之意就是更新换代,每次的更新都是要依赖于上一次的结果

什么是可迭代对象?

就是内置有__iter__()方法的都可以称之为是可迭代对象。

八种基本数据类型:

可迭代对象:

字符串

列表

元组

字典

集合等

文件对象也是可迭代对象:ff = open('a.txt', 'w', encoding='utf8')

整型、浮点型、布尔值都不是可迭代对象

可迭代对象调用__iter__()方法就变成了''迭代器对象''
print(d.__iter__())
print(iter(d))
# 两个是一样的

'''
一般情况下,双下划线开头的方法都有一个与之对应的简化方法。名字()
'''

迭代器对象

迭代器对象:迭代器

什么是迭代器对象?

  即内置了__iter__()方法,又内置了__next__()方法的就是迭代器对象

ps:文件对象本身就具备__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__())

异常捕捉

1. 什么是异常?

  一场就是错误发生的信号,如果不对此信号做正确处理,那么之后的程序都不能正常运行。

2. 异常的分类

  1.Traceback

    是异常所在的位置,一般情况我们直接可以定位到异常发生的位置所在处

  2. xxxError

    错误的类型

  3. xxxError后面的详细信息

    重要,一般情况我们直接看错误发生的详细信息都可以定位原因

  4. 一场都有哪些类型

    1.语法错误

      坚决不允许的,容易解决,借助pycharm工具就可以很容易的定位到

    2. 逻辑错误

      是允许出现的,但是,我们在写代码的时候,尽量的避免逻辑错误的发生

3.错误的类型

# 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)

for循环的原理

'''
for循环的原理:
    1. 先把关键字in后面的可迭代对象先调用__iter__()
    2. while循环,next()取值
    3. for的内部当出现异常的时候,做了捕捉处理:
StopIteration的错误,break
'''
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)

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

迭代取值:

1. 不依赖于索引取值

2. 只能从左往右一次取值,不能重复取值

索引取值:

1. 必须依赖于索引取值

2. 可以重复取值  l[0]

3. 必须是容器类型,字符串也可以

 

posted @ 2023-06-02 15:05  吼尼尼痛  阅读(38)  评论(0)    收藏  举报