首页 > 其他分享 >可迭代对象 迭代器 for循环内部原理 捕捉异常

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

时间:2023-06-02 16:44:34浏览次数:45  
标签:__ 迭代 iter next 循环 捕捉 print 取值

目录

可迭代对象

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

# 可迭代对象
	内置有__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异常,并且程序停止运行。

标签:__,迭代,iter,next,循环,捕捉,print,取值
From: https://www.cnblogs.com/Super-niu/p/17452219.html

相关文章

  • springboot项目rabbitmq消费者消费json格式的String,出现无限循环抛出No method found
    转:springboot项目rabbitmq消费者消费json格式的String,出现无限循环抛出Nomethodfoundforclass[B     ......
  • 反向迭代器的使用
    对一个vector反向迭代器的使用例子:vector<int>::reverse_iteratorr_iter;for(r_iter=vec.rbegin();//bindsr_itertolastelementr_iter!=vec.rend();//rendrefers1before1stelement++r_iter)//decrementsiteratoroneelementcou......
  • Python基础之迭代器
    可迭代对象什么是迭代? 迭代的言外之意就是更新换代,每次更新都会依赖于上一次的结果什么又是可迭代对象呢? 就是内置方法中有__iter__()的都可以被称为可迭代对象。__name__:这种的属性__iter__:这种是方法""" __iter__() 双下划线开头的方......
  • 迭代器和生成器
    一、迭代器(Iterator)1、可迭代对象(Iterable)存储了元素的一个容器对象,且容器中的元素可以通过“__iter__()”方法或“__getitem__()”方法访问。可迭代对象不能独立进行迭代,可通过“for…in”遍历来完成2、常见的可迭代对象字符串、列表、元组、字典、集合、文件3、迭代器对......
  • JavaScript中的循环(6个)
    LoopesforwhiledowhileforofforEachforin1.forfor(initialization,condition,increment/decrement){//codegoeshere}eg:for(leti=0;i<6;i++){console.log(i)}2.whileUsingthewhileloopwhenwedonotknowhowmanitera......
  • 九、python循环语句
    九、python循环语句1.for循环for循环遍历一个对象(比如数据序列,字符串,列表,元组等),根据遍历的个数来确定循环次数。for循环可以看作为定循环,while循环可以看作为不定循环。for循环的基本格式for变量in数据:重复执行的代码foriin(1,2,3,4,5): #这里用小括号表示是......
  • 洛谷P1587 [NOI2016] 循环之美
    原文链接:[sol]P1587[NOI2016]循环之美-icyM3tra'sBlog此为备份。题目传送门0.前言提供一种式子较为简洁且不算难写的做法。以及介绍一种较为优秀的dp版杜教筛实现。1.式子推导我们知道纯循环小数一定可以写成分母形如\(k^a-1\)的分数。因此约分后的分母一定......
  • Python循环语句
    #循环语句#使用while循环打印出0-100的所有数字#循环的初始化条件num=1#当num<100时,会一直执行循环体whilenum<101:  print("num=",num)  #迭代语句  num+=1print("循环结束")print("---------------------------")#使用while遍历字符串str="TheageofM......
  • linux for循环
    目录一、单层for二、双层for三、实验            一、单层for    格式:      1.第一种格式foriin变量($(cat/1.txt)或者{1..10})      dodone2.第二种格式for((i......
  • Collection集合的遍历方式一:迭代器
        ......