可迭代对象,迭代器对象,异常处理

内置函数

  1.help()
    help:返回对象的帮助信息
    help(str)

  2.id()
    id:返回一串相当于内存地址的数字
    s = '春游去动物园'
    print(id(s)) # 30058944

  3.int()
    int:根据传入的参数创建一个新的整数
         类型转换、进制转换
    print(int())  # 0 #不传入参数时,得到结果0。
    print(int('2'))  # 2

  4.isinstance()
    isinstance:判断对象是否是类或者类型元组中任意类元素的实例(判断数据类型)
    print(isinstance(1, int))  # True
    print(isinstance(1, str))  # False
    print(isinstance(1, (int, str)))  # True

  5.pow()
    pow:幂指数
    print(pow(10,3)) # 1000

  6.round()
    round:对浮点数进行四舍五入求值
    print(round(3.1415926)) # 3
    print(round(45.55631,2)) # 45.56 第二个参数控制需要保留几位小数部分

  7.sum()
    sum:求和
    print(sum([1,2,3,4,45,6])) # 61
   

可迭代对象

什么是可迭代对象

  简单的理解是可以用for循环的对象,就是可迭代对象。比如:list,字符串,dict,元组,生成器等。
  Python中,列表、元组、字典、集合、字符串等类型的数据可以使用for ..in...的语法从其中依次取到
数据来使用,这样的过程称为遍历,也叫迭代。

判断对象是否为可迭代的

  使用isinstance判断一个对象是否为可迭代对象(Iterable)
  from collections import Iterable #需要导包

  print(isinstance([1, 2, 3], Iterable)) # 列表为可迭代对象
  True
  print(isinstance({1, 2, 3}, Iterable)) # 集合为可迭代对象
  True
  print(isinstance(100, Iterable)) # 整型不是可迭代对象
  False

可迭代对象的本质

  分析迭代的过程,可发现:每迭代一次(即在for…in…中每循环一次),都会返回对象中的下一条数据,
一直向后读取,直到迭代完全部数据才结束。
  在迭代过程中,应该有一个“记录员”去记录每次访问到第几条数据,以便每次迭代都可以返回下一条数据。
Python将这个“记录员”称为迭代器。可迭代对象的本质是:这个对象提供给用户一个迭代器,来帮助用户在
遍历对象时使用。
  可迭代对象通过__iter__方法通过给我们一个迭代器。当用户在迭代一个可迭代对象时,实际上就是先获
取该对象提供的迭代器,然后通过这个迭代器来一次获取对象中的每一个数据。

  具备__iter__方法的对象,就是一个可迭代对象。


  """
  属于可迭代对象的有
      字符串、列表、字典、元组、集合、文件对象
  可迭代对象其实就是为了后续迭代取值做准备
      提供了不依赖于索引取值的方式
  """

iter()与next()

  对于可迭代对象,可以使用iter()函数得到这些可迭代对象的迭代器,然后对迭代器使用next()函数来获
取下一条数据。(iter()函数调用了可迭代对象的__iter__方法)

  list1 = [1, 2, 3] # 可迭代对象
  list1_iter = iter(list1) # list1使用__iter__方法,形成迭代器list1_iter
  print(next(list1_iter))
  1
  print(next(list1_iter))
  2
  print(next(list1_iter))
  3
  next(list1_iter)
  StopIteration

  在使用next()迭代完最后一个元素后,再次调用next就会抛出StopIteration异常,以此来告诉我们所
有元素均迭代完成。

迭代器对象

什么是迭代器对象

  对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集
合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这
就是迭代器

  迭代是python中访问集合元素的一种非常强大的一种方式。迭代器是一个可以记住遍历位置的对象,因此
不会像列表那样一次性全部生成,而是可以等到用的时候才生成,因此节省了大量的内存资源。迭代器对象从
集合中的第一个元素开始访问,直到所有的元素被访问完。迭代器有两个方法:iter()和next()方法。

  内部实现了__iter__,__next__方法,可以被next函数调用并不断返回下一个值的对象称为迭代器对象,
迭代器对象也可以使用for循环

  迭代器的优点:节约内存,方便操作

  迭代器:不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后出现StopIteration错误,表示无法返回下一个值
  可以被next()函数调用并不断返回下一个值得对象称为迭代器(Iterator对象)
  可以使用isinstance()函数判断一个对象是否是Iterator对象
  isinstance(object,type)

Iterator转换

  可以通过Iter()函数将list、tuple、dict、string转换为Iterator对象(迭代器对象)
  a = iter([1, 2, 3, 4, 5])
  print(next(a)) # 1

  print(isinstance(iter([]), Iterator))
  print(isinstance(iter(()), Iterator))
  print(isinstance(iter({}), Iterator))
  print(isinstance(iter(''), Iterator))
  #结果
  True
  True
  True
  True

判断对象是否是迭代器

  from collections import Iterator # 需要导包
  a = [1, 2, 3, 4, 5]
  print(isinstance(iter(a), Iterator))  # True
  print(isinstance([], Iterator))  # False []是可迭代对象,不是迭代器
  print(isinstance({}, Iterator))  # False {}是可迭代对象,不是迭代器
  print(isinstance((), Iterator))  # False ()是可迭代对象,不是迭代器
  print(isinstance(set(), Iterator))  # False set()是可迭代对象,不是迭代器
  print(isinstance("", Iterator))  # False ""是可迭代对象,不是迭代器

迭代器补充

   1.有很多双下方法其实都有简便写法 但不是全部
     """
    __方法名__  等价  方法名()
        最为常见的两个是
            __iter__    iter()
            __next__    next()
    """

  2.有一些可迭代对象本身也是迭代器对象>>>:文件对象
  
  3.可迭代对象调用一次__iter__方法编程迭代器对象  如果继续调用 结果还是迭代器对象本身
    res = s.__iter__()
    res1 = s.__iter__().__iter__().__iter__()
    print(res, res1)  # <str_iterator object at 0x10762bdd8> <str_iterator object at 0x107636dd8>

  4.迭代取值
    a = '春游去动物园'
    print(a.__iter__().__next__()) # 春 每次先产生一个新的迭代器对象然后取值
    print(a.__iter__().__next__()) # 春 每次先产生一个新的迭代器对象然后取值
    print(a.__iter__().__next__()) # 春 每次先产生一个新的迭代器对象然后取值

    res = a.__iter__()  # 已经变成迭代器对象了
    print(res.__iter__().__next__())  # 春  之后再调用还是自身
    print(res.__iter__().__next__())  # 游
    print(res.__iter__().__next__())  # 去
    print(res.__iter__().__next__())  # 动
    print(res.__iter__().__next__())  # 物
    print(res.__iter__().__next__())  # 园

可迭代对象,迭代器和生成器之间的关系

for循环的内部原理

  lists = [1, 2, 3, 4, 5, 6, 7]
  '''需求:不依赖于for循环 完成对列表元素的取值'''
  iterator_ = iter(lists)
  n = 0
  while n < len(lists):
      print(next(iterator_), end='')
      n += 1
  执行结果
  1234567
  

for循环的本质

    lists = [1, 2, 3, 4, 5, 6, 7]
    # 1.先转换成迭代器对象
    iterator_ = iter(lists)
    # 2.迭代取值
    while True:
        try:
            print(next(iterator_), end='')
        except StopIteration as ret:
            # 结束while循环
            break
    """
    for循环底层原理
        for 变量名 in 可迭代对象:
            循环体代码
    1.会将in后面的数据调用__iter__()变成迭代器对象
        为什么文件对象也可以for循环 因为本身就是迭代器对象 再次调用不变
    2.针对产生的迭代器对象依次调用__next__()方法迭代取值
    3.当值取完之后 会自动处理报错并退出循环
  """

异常处理

异常简介

  异常是指在语法正确的前提下,程序运行时报错就是异常。
  当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行

异常信息的组成部分

  '''报错信息
     File "D:\pythonproject\test\1.py", line 308, in <module>
        print(name)
    NameError: name 'name' is not defined
  '''
  1.line关键字所在的一行
  	用于提示你代码哪一行出错了 点击前面的蓝色字体可以直接定位
    '''如果报错的信息很长 一般最后一个才是'''
  2.NameError错误的类型
  	代码的报错也可以分为很多类型
  3.name 'name' is not defined
  	具体的报错原因(就是解决报错的答案)

异常类型

异常处理

与python异常相关的关键字

  raise:手动抛出/引发异常

  try/except:捕获异常并处理

  pass:忽略异常

  as:定义异常实例(except IOError as e)

  finally:无论是否出现异常,都执行的代码

  else:如果try中的语句没有引发异常,则执行else中的语句

详细

  1.结合else使用
	当try检测的代码没有发生异常 正常运行完毕之后执行else的子代码
  try:
    可能会出错的代码
  except Exception as e:  
    统一的处理措施
  else:
    可能会出错的代码没有出错 最后走else子代码

  2.结合finally使用
	无论try检测的代码是否有异常 最后都会执行finally子代码
  try:
    name
  except Exception as e:
    print(e)
  finally:
    (代码块)
    无论try检测的代码是否有异常 最后都会执行finally子代码

  3.整合使用
      try:
          name
      except Exception as e:
          print(e)
      else:
          print('11111')
      finally:
          print('22222')

  4.主动报错
    raise NameError('春游去动物园')
    '''由于是主动报错 所以可以非常明确的知道错误的类型'''

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

  1.索引取值
    优势:可以反复获取相同的元素 并且没有固定的方向
    劣势:只能支持有序的容器类型 无序的无法取值兼容性没有迭代取值高
 
  2.迭代取值
    优势:兼容所有的容器类型
    劣势:取值的顺序永远都是从左往右 并且无法重复获取 去完就完了
  
  """
  迭代器里面的东西是固定的 没取一个就会少一个 去完就空了
  """
posted @ 2022-03-23 18:56  春游去动物园  阅读(45)  评论(0编辑  收藏  举报