zoukankan      html  css  js  c++  java
  • python 第十二章 生成器+推导式+内置函数一(不常用的)

    生成器

    # 迭代器:python中内置的一种节省空间的工具
    # 生成器的本质就是一个迭代器
    # 区别:迭代器自带的,生成器自己写的
    
    # return可以写多个,但是只执行一次
    # yield会记录执行位置
    # 一个next()对应一个yield
    
    def func():
        print(123)
        return "you"
    print(func())
    # 123
    # you
    
    # return和yield 都是返回值
    # 在函数体内将return改成yield的就是一个生成器
    def func():
        print(123)
        yield "you" # yield也是返回值
    g =func()# 产生一个生成器
    print(g.__next__())
    # 输出
    # 123
    # you
    
    # return可以写多个,但是只执行一次
    # yield 可以写多个也可以返回多次
    # yield会记录执行位置
    # 一个next()对应一个yield,一一对应
    def func():
        print(123)
        yield "you" # 停
        yield "i" # 再加一个—__next__()方法继续往下走
        yield "l"
    g =func()#产生 一个生成器
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    # 输出
    # 123
    # you
    # i
    # l
    
    
    # if 判断执行过,不在执行第一个if,继续往下走
    def func():
        if 3>2:
            yield "您好"
        if 4>2:
            yield "我好"
        yield "大家好"
    g = func()
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    # 输出
    # 您好
    # 我好
    # 大家好
    
    # 生成器也可以使用for
    def func():
        if 3>2:
            yield "您好"
        if 4>2:
            yield "我好"
        yield "大家好"
    g = func()
    for i in g:
        print(i)
    # 输出
    # 您好
    # 我好
    # 大家好
    
    
    
    # 坑,输出多个print(func().__next__) 会不断产生新的生成器
    # 解决方案赋值只有一个生成器
    g = func()
    next(g) == g.__next__()
    # 推荐使用next()
    print(next(g))
    
    
    # send
    # 第一次传参只能传None
    def func():
        a = yield "我是send"
        print(a)
        a1 = yield
        print(a1)
    g = func()
    print(g.send(None))
    print(g.send(123))
    # 输出
    # 我是send
    # 123
    # None
    
    # 生成器应用场景:节省空间
    
    def func():
        lst = []
        for i in range(1000000):
            lst.append(i)
        return lst
    print(func())
    
    def func():
        for i in range(10000):
            yield i
    g = func()
    for i in range(50):
        print(next(g))
    
    # 获取整个列表
    def func():
        lst = ["牛羊配","老奶奶花生米","卫龙","虾扯蛋","米老头","老干妈"]
        yield lst
    g = func()
    print(next(g))
    
    
    # 获取列表一个一个元素
    def func():
        lst = ["牛羊配","老奶奶花生米","卫龙","虾扯蛋","米老头","老干妈"]
        for i in lst:
            yield i
    g = func()
    print(next(g))
    print(next(g))
    print(next(g))
    
    
    def func():
        lst = ["牛羊配","老奶奶花生米","卫龙","虾扯蛋","米老头","老干妈"]
        yield from lst
    g = func()
    print(next(g))
    
    def func():
        lst = ["牛羊配","老奶奶花生米","卫龙","虾扯蛋","米老头","老干妈"]
        yield from lst
    g = func()
    for i in g:
        print(i)
    
    # 不能同时输出两个列表
    def func():
        lst = ["牛羊配","老奶奶花生米","卫龙","虾扯蛋","米老头","老干妈"]
        lst2 = ["牛羊配","老奶奶花生米","卫龙","虾扯蛋","米老头","老干妈"]
        yield from lst,lst2
    g = func()
    for i in g:
        print(i)
    
    # # 坑
    def func():
        lst1 = ["牛羊配","老奶奶花生米","卫龙","虾扯蛋","米老头","老干妈"]
        lst2 = ["小浣熊","老干爹","亲嘴烧","麻辣烫","黄焖鸡","井盖"]
        yield from lst1
        yield from lst2
    
    

    推导式

    li = []
    for i in range(10):
        li.append(i)
    print(li)
    # 输出
    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    # list推导式
    # 一行输出
    # [] 数据类型 里面放变量(也就是结果)和for循环
    # 循环模式
    print([i for i in range(10)])
    # 输出[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    print([i for i in range(1,50,2)])
    # 输出[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    
    # 筛选模式
    # [变量 (加工后的变量) for 循环 加工方式筛选条件]
    lst = []
    for i in range(20):
        if i %2 == 0:
            lst.append(i)
    print([i for i in range(20) if i % 2 == 0])
    # 输出[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    
    
    # 生成器表达式:
    # 变量 = (其他推导器)
    # 循环模式:
    g = (i for i in range(20))
    print(next(g))
    # list 底层有个for
    print(list((i for i in range(20))))
    
    # 筛选模式
    g = (i for i in range(20) if i%2 == 1)
    for i in g:
        print(next(g))
    
    # 字典推导式
    # {键:值 for循环 加工条件}
    print({i:i+1 for i in range(10)})
    print({i:i+1 for i in range(10) if i % 2==0})
    
    
    # 集合推导式
    print({i for i in range(10)})
    # 筛选
    print({i for i in range(10) if i % 2==0})
    
    # list推导式:
    # [变量(加工后的变量) for循环]
    # [变量(加工后的变量) for循环 加工条件]
    
    # 迭代器表达式:
    # (变量(加工后的变量) for循环)
    # (变量(加工后的变量) for循环 加工条件)
    
    # 字典推导式:
    # {键:值 for循环 加工条件}
    
    # 集合推导式:
    # {变量(加工后的变量) for循环}
    # {变量(加工后的变量) for循环 加工条件}
    
    
    

    内置函数一(不怎么常用的)

    # s = """
    # for i in range(10):
    #     print(i)
    # """
    
    # s1 = """
    # def func():
    #     print(123)
    # func()
    # """
    # print(eval(s))
    # print(exec(s1))  # 牛逼 不能用
    
    # print(hash("hello"))
    
    # print(help(list))
    # help(dict)
    
    
    # def func():
    #     pass
    # print(callable(func))  # 查看是否可调用
    
    # print(float(2))     # 浮点数
    # print(complex(56))  # 复数
    
    # print(oct(15))        # 八进制
    # print(hex(15))        # 十六进制
    
    # print(divmod(5,2))     # (2, 1) 2商 1余
    
    # print(round(5.3234,2))     # 四舍五入 -- 默认是整数,可以指定保留小数位
    
    # print(pow(2,3))            # 幂
    # print(pow(2,3,4))          # 幂,余
    
    # s = "alex"
    # print(bytes(s,encoding="utf-8"))
    
    # print(ord("你"))    # 当前编码
    # print(chr(20320))
    
    # s = "C:u3000"
    # print(repr(s))
    
    # print("u3000你好")
    
    # lst = [1,2,3,False,4,5,6,7]
    # print(all(lst))   # 判断元素是否都为真  相似and
    # print(any(lst))     # 判断元素是否有真    相似or
    
    # name = 1
    # def func():
    #     a = 123
    #     # print(locals())
    #     # print(globals())
    # func()
    
    # print(globals())   # 全局空间中的变量
    # print(locals())   # 查看当前空间的变量
    

    总结

    # 1、生成器
    # 生成器的本质是一个迭代器
    # 生成器于迭代器的区别:生成器是自己写的,迭代器是python自带的
    # 定义一个生成器
    # 在函数体中将return改成yield就是生成器
    # 函数名()就是产生一个生成器
    #
    # 生成器的特点:
    # 节省时间--惰性机制
    # 不能逆行
    # 一次性的
    # 一个next对应一个yield
    # yield 能返回对象,可返回多次
    # yield 可以临时停止循环
    # yield 能够记录执行位置
    #
    # yield from 将一个可迭代对象的元素逐个返回
    #
    #
    # 2、推导式,可节省代码
    # 普通循环体和筛选条件
    # list推导式
    # [变量(加工后的变量) for循环 ]
    # [变量(加工后的变量) for循环 加工条件条件 ]
    #
    # 生成器推导式
    # (变量(加工后的变量) for循环 )
    # (变量(加工后的变量) for循环 加工条件 )
    #
    # 字典推导式
    # {键:值 for循环 }
    # {键:值 for循环 加工条件 }
    #
    # 集合推导式
    # {变量(加工后的变量) for循环 }
    # {变量(加工后的变量) for循环 加工条件 }
    #
    # 3、内置函数
    # all() any() bytes()
    # callable()
    # chr() complex()
    # divmod() eval()
    # exec() format()
    # frozenset() globals()
    # hash() help() id() input()
    # int() iter() locals()
    # next() oct() ord()
    # pow() repr() round()
    
  • 相关阅读:
    Asp.net Url Routing
    关于Linq to DataSet
    WebService开发实例(Axis2实现,无需安装,快速实现)
    开启我的博客之旅
    字符串算法专题之:目录
    递归程序转换为非递归程序的方法
    微信与QQ的比较和定位分析
    字符串算法专题之:字符串匹配算法
    递归程序的含义、实现机制以及复杂度计算
    北洋大讲堂之“斯凯网络CEO宋涛我的创业之路”感想
  • 原文地址:https://www.cnblogs.com/zhangshan33/p/11215377.html
Copyright © 2011-2022 走看看