首页 > 其他分享 >可迭代对象、迭代器对象、异常捕获、for循环的原理、迭代取值和索引取值的对比

可迭代对象、迭代器对象、异常捕获、for循环的原理、迭代取值和索引取值的对比

时间:2023-06-02 17:47:40浏览次数:29  
标签:__ .__ 迭代 对象 iter next print 取值

整体构思:

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

相关文章

  • splunk的统计分析功能——特定字段的统计功能包括取值分布(+topK,min/max/平均值)
    特定字段的统计功能——取值分布,topK,min/max/平均值例如:date_second60值,100%的事件时段平均值时段最大值时段最小值上限值时段上限值罕见值具有此字段的事件平均: 30.963998最小值: 0最大值: 59标准 偏差: 17.300073前10个值计数% 50643.032% 51502.368% 22492.321%......
  • 可迭代对象 迭代器 for循环内部原理 捕捉异常
    目录可迭代对象迭代器对象每次都生成一个新的可迭代对象,所以每次取值都是第一个元素只生成一个可迭代对象,每次取值基于一个可迭代对象取值迭代取值索引取值捕捉异常可迭代对象迭代就是每一次的结果必须依赖于上一次的结果#可迭代对象 内置有__iter__()方法的对象都是可迭代......
  • Python中动态导入对象importlib.import_module()的使用
    参考:https://blog.csdn.net/edward_zcl/article/details/88809212https://www.cnblogs.com/yhjoker/p/15969508.html经常在项目中碰到需要根据配置动态导入不同的类的方法进行运行,这时就要用动态函数import_module的使用方法假设项目目录结构如下: ......
  • 还在用BeanUtils拷贝对象?MapStruct才是王者!【附源码】
    前几天,远在北京的小伙伴在群里抛出了“MapStruct”的概念。对于只闻其名,未见其人的我来说,决定对其研究一番。本文我们就从MapStruct的概念出发,通过具体的代码示例来研究它的使用情况,最后与“市面上”的其它工具来做个对比!官方介绍首先我们打开MapStruct的官网地址,映入眼帘的就......
  • 反向迭代器的使用
    对一个vector反向迭代器的使用例子:vector<int>::reverse_iteratorr_iter;for(r_iter=vec.rbegin();//bindsr_itertolastelementr_iter!=vec.rend();//rendrefers1before1stelement++r_iter)//decrementsiteratoroneelementcou......
  • Java 将字符串转换为Document对象
    可以使用JAXP(JavaAPIforXMLProcessing)提供的DocumentBuilder类将字符串数据转换成Document对象。具体步骤如下:1.创建一个DocumentBuilderFactory对象,用于创建DocumentBuilder对象。DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();2.创建一个D......
  • Python基础之迭代器
    可迭代对象什么是迭代? 迭代的言外之意就是更新换代,每次更新都会依赖于上一次的结果什么又是可迭代对象呢? 就是内置方法中有__iter__()的都可以被称为可迭代对象。__name__:这种的属性__iter__:这种是方法""" __iter__() 双下划线开头的方......
  • Vue修改数组、对象并且触发视图更新的方法以及原理
    一、数组 items:['a','b','c'];//一个普通的数组this.items[1]='x';//修改已有项this.items[3]='d';//新增一项this.item.length=2;//修改数组的长度//一个对象数组msg:[{id:1,selected:true,title:'aaa',},{i......
  • 迭代器和生成器
    一、迭代器(Iterator)1、可迭代对象(Iterable)存储了元素的一个容器对象,且容器中的元素可以通过“__iter__()”方法或“__getitem__()”方法访问。可迭代对象不能独立进行迭代,可通过“for…in”遍历来完成2、常见的可迭代对象字符串、列表、元组、字典、集合、文件3、迭代器对......
  • 类,对象和方法
    1.什么是对象对象:看得见摸得着的物件2.什么是类(1)多个对象之间的共同的特征(静态的属性和动态的方法)(2)共同的特征称之为类(3)类就是多个对象之间的共性3.对象和类的关系类是对象的抽象(泛化),对象是类的实例(具体)AisB------>A是对象,B是类4.什么是万物皆对象对象是看得......