zoukankan      html  css  js  c++  java
  • 23_迭代器、模拟For循环

    一、可迭代对象 和 迭代器

    1.可迭代对象和迭代器

    可迭代对象:可以直接作用于for循环的对象统称为可迭代对象,Iterable.

    迭代器:可以被next()函数调用并不断返回下一个值的对象称为迭代器,Iterator.

    2.判断某个对象是否是可迭代对象

    dir() 会打印出对象的所有内置属性和方法,然后判断所有的属性和方法中是否存在'__iter__'.

    1 l = [1,2,3,4]
    2 print(dir(l))  #他会把列表的所有方法和属性打印出来.返回的是一个列表
    3 print('__iter__' in dir(l)) #True 如果对象包含__iter__ ,就表明是一个可迭代对象

    isinstance() 可以判断一个对象是否是可迭代对象Iterable

    1 from collections import Iterable
    2 
    3 
    4 l = [1,2,3,4]
    5 print(isinstance(l,Iterable)) #如果返回True ,表明对象是可迭代对象

    3.判断某个对象是否是迭代器

    dir() : 判断对象的所有内置方法和属性中是否包含'__next__'.

    1 print('__next__' in dir([]))#False 列表不是迭代器
    2 print('__next__' in dir(''))#False 字符串不是迭代器
    3 print('__next__' in dir({}))#False 字典不是迭代器

    isinstance() :可以判断对象是否是迭代器。

    1 print(isinstance('',Iterator)) #False
    2 print(isinstance([],Iterator)) #False
    3 print(isinstance({},Iterator)) #False
    4 print(isinstance(iter([]),Iterator)) #True
    5 print(isinstance(iter(''),Iterator)) #True
    6 print(isinstance(iter({}),Iterator)) #True

    4.可迭代对象   转化成  迭代器

    生成器都是Iterator,但liststrdict、虽然都是Iterable,却不是Iterator

    liststrdictIterable转换成Iterator可以使用'__iter__() '或 iter()函数:

    1 print(isinstance(''.__iter__(),Iterator)) #True
    2 print(isinstance([].__iter__(),Iterator)) #True
    3 print(isinstance({}.__iter__(),Iterator)) #True
    4 print(isinstance(iter([]),Iterator)) #True
    5 print(isinstance(iter(''),Iterator)) #True
    6 print(isinstance(iter({}),Iterator)) #True

    5.迭代器的特点

    1.节省内存
    2.迭代器惰性机制
    3.迭代器不能反复,一直向下执行

    6.文件句柄就是一个迭代器

    我们通过open()方法可以获得一个文件句柄,通过文件句柄我们可以操作文件。文件句柄就是一个迭代器

    1 #文件句柄是一个迭代器
    2 with open('text.txt',encoding='utf-8') as f_read:
    3     print(isinstance(f_read,Iterator))  #True
    4     pass

    二、For循环的机制 - 模拟For循环

    for循环是一种迭代循环机制,在内部调用next(),并捕获异常(StopIteration ),终止循环的操作

     1 #模仿 for 循环
     2 
     3 L = [1,2,3,4]
     4 
     5 #for循环实现
     6 for i in L:
     7     #print(i) 打印 1 2 3 4
     8     pass
     9 
    10 L = L.__iter__()  #L 列表从 可迭代对象转换成了迭代器
    11 while True:
    12     try:
    13         print(L.__next__())   # 每次打印出 L 的元素
    14     except StopIteration:     #迭代器next()在所有元素取出完后,引发StopIteration异常
    15         break      #终止函数
  • 相关阅读:
    sql常用语句
    java学习(东软睿道)2019-09-06(预课)《随堂笔记》
    Servlet和JSP学习总结
    由字符集的转换想到的问题
    mysql主从搭建
    CentOS 源码安装MySQL5.7
    Linux搭建FTP服务器
    连接MySQL报错误代码 ERROR 1045时的解决方案
    [js]使用百度编辑器uediter时遇到的一些问题(span,div等被过滤)
    [css]将textarea前的文字设置在左上角
  • 原文地址:https://www.cnblogs.com/weihengblog/p/8422933.html
Copyright © 2011-2022 走看看