可迭代对象 迭代器 for循环内部原理 捕捉异常

发布时间 2023-06-02 16:42:43作者: Meeeoww

可迭代对象

迭代就是每一次的结果必须依赖于上一次的结果

# 可迭代对象
	内置有__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循环
"""		

捕捉异常

img
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异常,并且程序停止运行。