zoukankan      html  css  js  c++  java
  • python基础08--迭代器,生成器

    1.1 迭代器

    1、可迭代对象:str,list,tuple,set,dict,

       迭代器:f(文件)range()

       可迭代对象和迭代器都可以for循环

    可迭代对象不会计数,

    迭代器会计数,上面操作到第3个,则下面的程序继续使用第4

     

       以上数据类型中都有一个函数__iter__()

       所有包含了函数__iter__()的数据类型都是可迭代对象 Iterable

    2、 获取迭代器  .__iter__

    迭代器往外拿元素 .__next__

    lis = [1,2,3,4]

    it = lis.__iter__()    #it是迭代器

    print(it.__next__())  #打印第一个元素

    print(it.__next__())  #打印第二个元素

     

    3、Iterable:可迭代对象  内部包含__iter__()

       Iterator:迭代器      内部包含__iter__() __next__

    from collections import Iterable    #可迭代的

    from collections import Iterator    #迭代器

    lis = [1,2,3,4]

     

    isinstence(对象,类型)  #判断对象是否是这个类型

    isinstence(lis,Iterable)    #判断是否是可迭代对象

    isinstence(lis,Iterator)    #判读是否是迭代器

     

    4、迭代器的特点:

    a 节省内存  迭代器是在循环的过程中,每次生成一个

    b 惰性机制  迭代器拿值,一定要next

    c 只能往前拿,不能往回走

     

    5、模拟for循环

    lis = [1,2,3,4]

    it = lis.__iter__()

    while True:

    try:

    print(it.__next__())

    except StopIteration:

    berak

     

    1.2 生成器

    1、生成器函数: 只要含有yield关键字的函数都是生成器函数

    生成器表达式:(i for i in lis if

     

    2、生成器特点

    生成器中的数据只能取一次,取完就没有了

    惰性运算,不找他取值,他就不工作中

     

    for 循环 套生成器表达式,拆开算

     

    3、生成器函数  yield不能和return共用且需要写在函数中

    生成器函数,执行后会得到一个生成器作为返回值

    def generator():

    print(1)

    yield ‘a’     

    print(2)

    yield ‘b’

    ret = generator()     #ret既是一个迭代器__iter__(),__next__()

    print(ret)

    print(ret.__next__())  #第一个yield之前的操作

    print(ret.__next__())  #第二个yield之前的操作

     

    可以直接用for循环,读取生成器

    for i in ret():

    print(i)

     

    4、生成器函数 应用,实时读取文件

    def tail(filename):
         f = open(filename,encoding="utf-8")
         while True:
             line = f.readline()
             if line.strip():
                 yield line.strip()      #生成器

    g = tail("file")
    for i in g:
         print(i)

     

    5、生成器函数的方法

    send 获取到下一个值的效果基本和next一样

         只是在获取下一个值的时候,给上一个值的位置传递一个数据

    注意事项:第一次使用生成器的时候,必须使用next获取

                      最后一个yield不能接受外部的值

    def generator():
         print(1)
         co = yield       #第一次迭代的时候执行到yield,
        print(co)       #第二次send迭代到第二个yield,且接受了传过来的参数
         print(2)
         yield
    g = generator()
    g.__next__()
    g.send("women")

    6、生成器表达式

    g = (i for i in range(10))  #g 就是生成器

    (元素相关的操作或者某个操作 for 元素 in 可迭代类型)

     

    lis =[1,2,3,5]
    s = [print("women") for i in lis]

     

    7、推导式:遍历操作,筛选操作

     

    列表推导式

    g = [i for i in range(10)]  #返回的是一个列表

    [满足条件的元素相关操作 for 元素 in 可迭代类型 if 元素相关操作]

    ret = [i for i in range(30) if i %3 == 0]

    print(ret)

      

    字典推导式

    例子字典中值和key互换

    dic={1:”women”,2:”nen”}

    dic_new = {mcase[k]:k for k in dic}

    print(dic_new)

    集合推导式 去重

  • 相关阅读:
    ICQ
    Create小程序
    LRU最近最少使用算法
    感知器
    聚类-K均值
    阈值分类法
    最邻近分类
    设计模式
    高级排序算法
    Socket编程
  • 原文地址:https://www.cnblogs.com/fbug/p/11792968.html
Copyright © 2011-2022 走看看