zoukankan      html  css  js  c++  java
  • 生成器

    生成器

    生成器就是自定义迭代器(自己造出来的)

    yield关键字

    yield的英文单词意思是生产,在函数中但凡出现yield关键字,再调用函数,就不会继续执行函数体代码,而是会返回一个值。

    迭代器对象:具有__iter__,__next__的方法

    def func():
        yield 456  # yield会使函数func()变成生成器对象,因此他就具有__iter__方法
        print(789) # yield会停止函数,当运行下一次next才会继续运行下面的代码
        yield 101112 # 一个yield对应一个next
        print(131415)
    f=func() #生成器
    print(f)# <generator object func at 0x000001F0E44237D8>
    f_iter = f.__iter__()
    print(f_iter.__next__())
    print(f_iter.__next__())
    print(f_iter.__next__())
    

    yield三个特性

    1. yield可以把函数变成生成器(自定制的迭代器对象,具有__iter__和__next__方法)
    2. yield可以停止函数,再下一次next再次运行yield下面的代码
    3. 有n个yield生成器就有n个元素,就可以next n次, 第n+1次next会报错

    return的特性

    1. 返回值
    2. 终止函数

    return和yield

    相同点:两者都是在函数内部使用,都可以返回值,并且返回值没有类型和个数的限制

    不同点:return只能返回一次值;yield可以返回多次值

    def func():
        yield [1,1,23]  # yield会使函数func()变成生成器对象,因此他就具有__iter__方法
        print(789) # yield会停止函数,当运行下一次next才会继续运行下面的代码
        yield 101112 # 一个yield对应一个next
        print(131415)
    
    g=func()
    for i in g:
        print(i)
    

    [1, 1, 23]
    789
    101112
    131415

    用生成器自定制一个range方法

    1. 生成一个可迭代器对象 --- 》 我要把我的range函数变成一个可迭代对象(迭代器对象)
      1. 丢一个10进去,然后通过for循环的迭代next会丢出0,1,2,3,4,5,6,7,8, 9
    def range(x):
        count = 0
        while count < x:
            yield count
            count += 1
    
    
    # g = range(10)
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    
    for i in range(10):
        print(i)
    
    

    列表(列表推导式)元组(生成器表达式)的区别

    列表就是一筐鸡蛋,元组就是一只老母鸡(节省空间)

    lt = [i for i in range(10000000)]
    print(lt)
    g = (i for i in range(10000000))
    print(g)
    print(g.__next__())     # 把列表推导式的[]换成()
    #省内存,一次只产生一个值在内存中
    
  • 相关阅读:
    Android 废弃方法属性解决
    Android RecycleView分组
    Android 第三方库FlycoTabLayout
    Android 自定义dialog出现的位置
    Android 底部弹窗实现
    Android 自定义设置布局
    Android 微信、qq分享文本 (Intent)
    SpringBoot关于跨域的三种解决方案
    记录一次通用Mapper+自定义mapper出现的问题分析以及排查
    IDEA配置Maven+新建Maven项目
  • 原文地址:https://www.cnblogs.com/aden668/p/11348191.html
Copyright © 2011-2022 走看看