可迭代对象、迭代器、for循环原理

今日总结

一、常见函数

二、可迭代对象

三、迭代器对象

四、for循环内部原理

五、异常处理

六、for循环的本质

七、迭代取值与索引取值的对比

一、常见函数

1help() 查看注释信息
help(len)
# len(obj, /)
#     Return the number of items in a container.

2id()  返回一串数字,相当于内存地址
print(id('owen'))
# 2509775308144

3int()  类型转换、机制转换
l1 = 11.11  # <class 'float'>
print(int(l1))
# 11

4isinstance()  判断数据类型
print(type('owen')is str)  #  True 之前经常使用,但不推荐
print(isinstance('owen', str))  # True
print(isinstance('owen', int))  # False

5pow()  幂指数
print(pow(5, 2))  # 25  

6round()  自动四舍五入
print(round(1.23, 1))  # 1.2
print(round(1.23, 2))  # 1.23
print(round(2.56, 1))  # 2.6
# round括号里面有两个参数,一个是将要四舍五入的数据,第二个参数是将要保留的小数位

7sum() 求和
print(sum([1, 2, 3, 4, 5, 6, 7]))  # 28

二 、可迭代对象

1、迭代

迭代的含义:
    迭代其实就是更新换代,并且在更新换代时,要更新的内容还要依靠上一次更新的结果
    
迭代代码是什么样子?
a = 1
while True:
    print(a)
    a += 1  # 每次都要借助+=1,符合迭代的条件
    
使用迭代取值:
l1 = [11, 12, 13, 14, 15, 16]
n = 0
while n < len(l1):
    print(l1[n])
    n += 1  # 11  12 13 14 15 16

2 、可迭代对象

含义:
 内置中有__iter__方法的都可以叫做可迭代对象
    # 通过查看内置方法,里面有__iter__
    # __iter__读做双下iter
    
可迭代数据类型:
    i = 123  # 整型  没有
    f = 12.14  # 浮点型  没有
    s = 'owen'  # 字符串  有
    l = [1, 2, 3, 4]  # 列表  有
    d = {'name':'owen', 'age': 20}   # 字典 有
    t = (1, 2, 3, 4)  # 元组  有
    se = {1, 2, 3, 4, 5}  # 集合 有
    b = True  #布尔值 没有
    f = open()  # 文件 有  
    def index():pass  # 函数没有
"""
 属于可迭代对象的类型有:
      字符串、列表、字典、元组、集合、文件对象
      可迭代对象就是为迭代取值做准备
"""  

三、迭代器对象

1、含义:
    可迭代对象调用__iter__,生成的结果就是迭代器对象
 
2、特征:
   含有__iter__的方法和__next__方法
 
3、如何理解迭代器对象
  迭代器对象可以很大程度上节省存储空间
  也就是你想要什么,要哪个可以给你拿出来,当你不需要的时候,它就是一个很小的东西,很节省空间

4、迭代器对象取值
  调用__next__方法,当值被取完时会发生报错
  
5、迭代器对象补充说明
5.1、有些双下方法有简单写法:
   """ 
   __方法名__ = 方法名()
   例如:
    __iter__ = iter()
    __next__ = next()
    __len__ = len()
   """
l = [1, 2, 3, 4]
print(l.__iter__())  # <list_iterator object at 0x0000012915BC5FA0>
print(iter(l))  # <list_iterator object at 0x0000012915BC5FA0>  
# 产生的结果是一样的

5.2、有一些可迭代对象本身也是迭代器对象>>>:文件对象  # 既有__iter__方法也有__next__方法
    
5.3、当迭代器对象调用一次__iter__方法编辑迭代器对象,当再调用时,结果还是迭代器本身
l = [1, 2, 3, 4]
res = l.__iter__()
res1 = l.__iter__().__iter__().__iter__()
print(res, res1)
# <list_iterator object at 0x000001F877675FA0> 
# <list_iterator object at 0x000001F87767A130>

5.4、迭代取值的要求
 当直接调用一个数据时,如果被调用对象不是迭代器对象,那么每次调用的结果都一样
    eg:
l = [1, 2, 3, 4]
print(l.__iter__().__next__())
print(l.__iter__().__next__())
print(l.__iter__().__next__())
print(l.__iter__().__next__())

q1IhRJ.jpg

如何让它取里面一个一个的值
把l变成迭代器对象
l = [1, 2, 3, 4]
res = l.__iter__()
当l成为迭代器对象时再次调用
print(res.__iter__().__next__())
print(res.__iter__().__next__())
print(res.__iter__().__next__())
print(res.__iter__().__next__())

q1oaex.jpg

四、for循环内部原理

for循环底层原理:
   for + 变量名 + in +可迭代对象:
        循环体代码
1、将in后面的数据调用__iter__()变成迭代器对象
    文件对象之所以可以for循环,就是因为文件对象就是迭代器对象
2、针对产生的迭代器对象一次调用__next__()方法迭代取值
3、当值被取完之后,会自动处理报错并退出循环
l1 = [11, 12, 13, 14, 15, 16]
n = 0
while n < len(l1):
    print(l1[n])
    n += 1  
    # 11  12 13 14 15 16

res = l1.__iter__()
while True:
    print(res.__next__())

q1vNCt.jpg

五、异常处理


1、异常含义:
    代码运行出错就是异常, 异常之后程序会立刻停止异常我们也叫做bug
    
2、异常信息的组成部分
 Traceback (most recent call last):
  File "F:/PycharmProjects/pythonProject3/11.py", line 28, in <module>
    l1
NameError: name 'l1' is not defined
2.1、line关键字所在的一行
  用来提示代码是哪一出错了,直接点击前面的蓝色链接
    当报错信息过长时,一般选择最后一个
    
2.2、NameError错误的类型

2.3、 name 'l1' is not defined 
报错的原因,也是解决报错的答案
  
3、异常的分类
3.1、语法异常
 不被容忍的,出现了要马上改过来,要不要钱走,要不然人走
3.2、逻辑异常
  可以出错,只要发生错误时,尽快改好就行
    比如内置方法添加错误等,
    
4、异常类型
NameError 名字发生错误
IndexError 索引错误
KeyError 键错误
ValueError 值错误

2 、异常处理实操

基本语法结构
try:
    可能会发生报错的代码
except 错误的类型1 as e:  # 这里的e指代的是错误的提示信息
    针对错的处理措施
except 错误的类型2 as e:
    针对错的处理措施
    except 错误的类型3 as e:
    针对错的处理措施
# 使用基本这个结构,要先猜测它错的是那个类型,所以有的时候可能自己都摸不准是什么类型,所以有一个万能公式

try:
    可能会发生错误的代码
except Exception as e:
    统一的处理措施
    
异常处理使用准则:
 1、被检测的代码越少越好
 2、能尽量少用就少用

3 、异常处理了解

1、与else结合使用
  当try检测的代码没有发生异常时,正常运行完毕之后执行else的子代码
    结构:
    try:
      可能会出错的代码
    except Exception as e:
        处理的措施
    else:
        如果没有发生报错,则走else的子代码
        
 2、结合finally使用
   不管try检测的代码有没有异常,都会走finally子代码
         try:
           name
        except Exception as e:
            print(e)
        finally:
           print('芜湖')
        #  name 'name' is not defined
        #  芜湖
       
  3、全部整合到一起使用
       try:
      name
  except Exception as e:
      print(e)
  else:
      print('芜湖起飞')
  finally:
      print('起飞')
  # name 'name' is not defined
  # 起飞
    
  4、断言
  断言就是判断是不是健全的语句,如果错了直接崩溃
   name = 'owen'
   assert isinstance(name, str)
    
  5、主动报错
   raise NameError('这错了昂')
   因为它是主动报错,使用就能知道在哪错的

六、for 循环的本质

# 利用while与异常捕获 实现for循环的功能
info = {'name': 'owen', 'age': 20, 'pwd': 123}
1.先转换成迭代器对象
res  = info.__iter__()
res = iter(info)  # 两种方法即可
# 2.迭代取值
while True:
    print(res.__next__())
    try:
        print(next(res))  # 这个地方可能会出错
    except StopIteration as e:  # 当遇到报错时 
        break  # 结束循环

七、迭代取值与索引取值的对比

1、索引取值:
    优势:可以反复的获取相同的元素,且没有固定的方向
    劣势:只能支持有序的容器类型,无序无法取值
2、迭代取值:
    优势:兼容所有容器类型
    劣势:取值的顺序永远都是从左向右,但是没法重复获取

q3ksyR.jpg

posted @   未月  阅读(180)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示