zoukankan      html  css  js  c++  java
  • 解密for循环工作机制之迭代器,以及生成器、三元表达式与列表解析、解压序列

    本节内容


    1.迭代器协议与for循环

    2.三元表达式

    3.解压序列

    4.列表解析

    5.生成器

    迭代器协议与for循环

    1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中下一项,要么引起异常报错(因为迭代到头了,只能往后走不能倒退)

    2.可迭代对象:实现了迭代器协议的对象(其实python中所有对象都不是可迭代对象,如何实现:对象内部定义一个__iter__方法

    3.协议就是一种约定,可迭代对象实现了迭代器协议,python内部工具(如for循环,sum,max等)使用迭代器协议访问对象。

    i = [11,22,33,44]
    a = i.__iter__()       #将i变成可迭代对象
    print(a.__next__())             #11
    print(a.__next__())             #22    
    print(a.__next__())             #33  
    print(a.__next__())             #44

    那么for 循环是怎么做的呢?


    for循环做了两件事,第一件事就是把传入for循环对象使用__iter__方法,使其变成可迭代对象,之后每次使用都引用了__next__方法

    第二件事就是:next到头,也就是迭代到头了会报错嘛,而for循环就自动为我们处理了报错

    for a in i:
        print(a)

    注意:while循环的工作机制并不是迭代循环,而是索引循环,所以不能循环字典、集合、文件等迭代对象,使用for循环,还能节省内存因为遍历一个扔一个

    三元表达式

    l = ['鸡蛋%s' %i for i in range(10) if i>5 ]
    print(l)

    三元表达式其实就是简略式编程

    name = 'ecohboy'
    
    a = '帅哥'if name == 'ecohboy' else 'sb'
    print(a)

    if 左边为若真的操作,中间是判断语句,右边为否则操作 但只适用于简单逻辑。

    列表解析


    l = ['鸡蛋%s' %i for i in range(10) if i>5 ]
    print(l)

    解压序列


    l = [1,2,3,4,5,6,7]
    a,*b,c = l
    print(a,b,c)

    解压序列就是一一对应取值,但用这种方法可以不通过索引也可以取到开头与结尾的值

    生成器


    生成器可以理解为一个数据类型,但他自动实现了迭代器协议(不用调用__iter__方法)所以生成器就是可迭代对象

    1.生成器函数配合yeild(返回值)使用:

    def test():
        yield 1
        yield 2
        yield 3
        yield 4
    
    g = test()
    print(g)
    print(g.__next__()) #1
    print(g.__next__()) #2
    print(g.__next__()) #3
    print(g.__next__()) #4

    2.生成器表达式

    laomuji = ('鸡蛋%s' %i for i in range(10))
    print(laomuji.__next__())  #鸡蛋0
    print(laomuji.__next__())  #鸡蛋1
    print(laomuji.__next__())
    print(laomuji.__next__())

    生成器表达式实际就是把列表解析【】改成()

  • 相关阅读:
    ssm框架搭建
    属性注入
    布隆过滤器
    浅谈动态规划
    双指针技巧汇总
    详解二分查找算法
    java内存模型的实现
    JVM内存结构、Java内存模型和Java对象模型
    浅谈动态规划以及相关的股票问题
    了解重构
  • 原文地址:https://www.cnblogs.com/echoboy/p/8993537.html
Copyright © 2011-2022 走看看