zoukankan      html  css  js  c++  java
  • 生成器 推导式 内置函数

    今日总结

    1. 生成器

      生成器的本质就是一个迭代器

      生成器和迭代器的区别:

      ​ 生成器是 python 自带的

      ​ 生成器是程序员写的

    2. 生成器

    • 节省空间-------惰性机制
    • 不能逆行
    • 一次性
    • 一个 next 对应一个 yield
    • yield 能够返回内容,还能够返回多次
    • yield 能够临时停止循环
    • yield 能够记录执行的位置
    • yield from —— 将一个可迭代对象的元素逐个返回
    1. 定义一个生成器

      基于函数

      函数体中存在 yield 就是一个生成器

      函数名 ( ) 就是产生一个生成器

    推导式

    list : [ ] [ 变量(加工后的变量) for 循环 加工条件]

    dic : {} {键 : 值 for 循环 加工条件}

    set : { } {变量 (加工后的变量) for 循环 加工条件 }

    生成迭代器 : ( 变量 (加工后的变量) for 循环 加工条件)

    内置函数

    生成器

    迭代器:python 中内置的一种节省空间的工具

    生成器的本质是一个迭代器

    迭代器和生成器额区别 : 一个是 python 自带的,一个是程序员自己写的

    def func():
        if 3 > 2:
            yield "你好"
        if 4 > 2:
            yield "我好"
        yield "大家好"
    g = func()
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    
    #
    你好
    我好
    大家好
    
    下面这样的结果也是一样的
    def func():
        if 3 > 2:
            yield "你好"
        if 4 > 2:
            yield "我好"
        yield "大家好"
    g = func()
    for i in g:
        print(i)
    
    
    
    # for 循环的本质
    while True:
        try:
            print(g.__next__())
        except StopIteration :
            break
    
    def foo():
        for i in range(10):
            pass
            yield i
        count = 1
        while True:
            yield count
            count += 1
    g = foo()
    print(next(g))
    print(next(g))
    print(next(g))
    
    # 或者for i in g
          print(i)
    
    这里是新的坑
    
    
    def foo():
        for i in range(10):
            pass
            yield i
        count = 1
        while True:
            yield count
            count += 1
    print(foo().__next__())
    print(foo().__next__())    #记住这个是调用新的生成器
    
    #
    0
    0
    
    send()   只是了解
    
    
    def func():
        a = yield "是send"
        print(a)
        yield "你好"
    g = func()
    print(g.send(None))  #send  第一次只能是 None
    print(g.send(123))
    

    生成器应用场景

    def func():
        lst = []
        for i in range(1000000):
            lst.append(i)
        return lst
    print(func())   #这个结果实在是太强大了,鸡蛋太多  所以找只鸡 想吃就下一个
    
    
    所以参考下面的代码
    
    
    def func():
        for i in range(100000):
            yield i
    g = func()
    for i in range(50):     #想吃几个拿几个
        print(next(g))
    
    
    def func():
        lst1 = ["牛肉羊","鸡蛋羹","玉米","火腿肠","米饭","拉面"]
        for i in lst1:
            yield i
    g = func()
    print(next(g))
    print(next(g))
    #
    牛肉羊
    鸡蛋羹
    
    def func():
        lst1 = ["牛肉羊","鸡蛋羹","玉米","火腿肠","米饭","拉面"]
        lst2 = ["小浣熊","苹果","梨子","桃子","西瓜","芒果"]
        yield from lst1
        yield from lst2
    g = func()
    print(next(g))
    print(next(g))
    
    
    结果
    
    牛肉羊
    鸡蛋羹
    
    def func():
        lst1 = ["牛肉羊","鸡蛋羹","玉米","火腿肠","米饭","拉面"]
        lst2 = ["小浣熊","苹果","梨子","桃子","西瓜","芒果"]
        yield from lst1
        yield from lst2
    g = func()
    print(next(g))
    print(next(g))             #是先走完 lst1   然后再走 lst2
    for i in g :
        
    #结果
    
    牛肉羊
    鸡蛋羹
    玉米
    火腿肠
    米饭
    拉面
    小浣熊
    苹果
    梨子
    桃子
    西瓜
    芒果
    

    生成器总结:

    1. 在函数中将return 改写成yield 就是一个生成器
    2. yield 会记录执行位置
    3. return 和 yield 都是返回
    4. return 可以写多个但是只执行一次,yield 可以写多个,还可以返回多次
    5. 一个__next__对应一个 yield
    6. 生成器可以利用 for 循环获取值
    7. yield from—— 将可迭代元素逐个返回
    8. 在函数内部,能将 for 循环和 while 循环临时暂停

    推导式

    list  推导式
    [变量 for i in range(20)]
    
    lst = []
    for i in range(20):
        lst.append(i)
    print(lst)         为了简洁代码  有了以下的操作
    
    print(list(i for i in range(20)))
    
    
    筛选模式
    [变量(加工后的变量) for 循环  加工方式]
    
    
    lst = []
    for i in range(20):
        if i % 2 == 0:
            lst.append(i)
    print(lst)
    
    
    #print([i for i in range(20) if i % 2 == 0 ])
    
    这两个的结果是一样的,你看第二个多简洁
    
    生成器表达式
    循环模式
    
    g = (i for i in range(20))
    print(next(g))
    print(next(g))
    
    print(list([i for i in range(20)]))
    
    
    #字典模式
     #  {键:值 for 循环  加工条件}
    
    print({i:i+1 for i in range(10)})
    #{0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}
    
    print({i:i+1 for i in range(20) if i % 2 == 0})
    {0: 1, 2: 3, 4: 5, 6: 7, 8: 9, 10: 11, 12: 13, 14: 15, 16: 17, 18: 19}
    
    
    集合推导式
    
    
    print({i for i in range(20)})
    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}
    
    
    print({i for i in range(20) if i % 2 == 0 })
    {0, 2, 4, 6, 8, 10, 12, 14, 16, 18}
    
    
    生成器总结
    list:
    
    # [变量(加工后的变量) for循环]
    
    # [变量(加工后的变量) for循环 加工条件]
    
    
    
    # 生成器表达式:
    
    # (变量(加工后的变量) for循环)
    
    # (变量(加工后的变量) for循环 加工条件)
    
    
    
    # 字典推导式:
    
    # {键:值 for循环 加工条件}
    
    
    
    # 集合推导式:
    
    # {变量(加工后的变量) for循环 加工条件}
    

    内置函数一

    eval:执行字符串类型的代码,并返回最终结果

    eval('2 + 2')  # 4
    n=81
    eval("n + 4")  # 85
    eval('print(666)')  # 666
    

    exec:执行字符串类型的代码。

    s = '''
    for i in [1,2,3]:
        print(i)
    '''
    exec(s)
    

    以上两个内置函数很强大 工作中禁止使用

    hash:获取一个对象(可哈希对象:int,str,Bool,tuple)的哈希值。

    print(hash(12322))
    print(hash('123'))
    print(hash('arg'))
    print(hash('alex'))
    print(hash(True))
    print(hash(False))
    print(hash((1,2,3)))
    
    '''
    -2996001552409009098
    -4637515981888139739
    1
    2528502973977326415
    '''
    

    help:函数用于查看函数或模块用途的详细说明。

    print(help(list))
    print(help(str.split))
    

    callable:函数用于检查一个对象是否是可调用的。如果返回True,仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。

    name = 'alex'
    def func():
        pass
    print(callable(name))  # False
    print(callable(func))  # True
    

    int:函数用于将一个字符串或数字转换为整型。

    print(int())  # 0
    print(int('12'))  # 12
    print(int(3.6))  # 3
    print(int('0100',base=2))  # 将2进制的 0100 转化成十进制。结果为 4
    

    float:函数用于将整数和字符串转换成浮点数。

    complex:函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数。。

    print(float(3))  # 3.0
    print(complex(1,2))  # (1+2j)
    

    bin:将十进制转换成二进制并返回

    oct:将十进制转化成八进制字符串并返回。

    hex:将十进制转化成十六进制字符串并返回。

    print(bin(10),type(bin(10)))  # 0b1010 <class 'str'>
    print(oct(10),type(oct(10)))  # 0o12 <class 'str'>
    print(hex(10),type(hex(10)))  # 0xa <class 'str'>
    

    divmod:计算除数与被除数的结果,返回一个包含商和余数的元组(a // b, a % b)。

    round:保留浮点数的小数位数,默认保留整数。

    pow:求xy次幂。(三个参数为xy的结果对z取余)

    print(divmod(7,2))  # (3, 1)
    print(round(7/3,2))  # 2.33
    print(round(7/3))  # 2
    print(round(3.32567,3))  # 3.326
    print(pow(2,3))  # 两个参数为2**3次幂
    print(pow(2,3,3))  # 三个参数为2**3次幂,对3取余。
    

    bytes:用于不同编码之间的转化。

    # s = '你好'
    # bs = s.encode('utf-8')
    # print(bs)
    # s1 = bs.decode('utf-8')
    # print(s1)
    # bs = bytes(s,encoding='utf-8')
    # print(bs)
    # b = '你好'.encode('gbk')
    # b1 = b.decode('gbk')
    # print(b1.encode('utf-8'))
    

    ord:输入字符找当前字符编码的位置

    chr:输入当前编码的位置数字找出其对应的字符

    # ord 输入字符找该字符编码的位置
    # print(ord('a'))
    # print(ord('中'))
    
    # chr 输入位置数字找出其对应的字符
    # print(chr(97))
    # print(chr(20013))
    

    repr:返回一个对象的string形式(原形毕露)。

    # %r  原封不动的写出来
    # name = 'taibai'
    # print('我叫%r'%name)
    
    # repr 原形毕露
    print(repr('{"name":"alex"}'))
    print('{"name":"alex"}')
    

    all:可迭代对象中,全都是True才是True

    any:可迭代对象中,有一个True 就是True

    # all  可迭代对象中,全都是True才是True
    # any  可迭代对象中,有一个True 就是True
    # print(all([1,2,True,0]))
    # print(any([1,'',0]))
    
  • 相关阅读:
    Fast exit from dram self-refresh
    关于Net开发中一些SQLServer性能优化的建议
    收集一些优秀的DoNet开源项目
    收集一些优秀的DoNet开源项目
    收集一些优秀的DoNet开源项目
    LINQ表达式用法整理
    LINQ表达式用法整理
    LINQ表达式用法整理
    SQL 拼接多个字段的值&一个字段多条记录的拼接
    你应该知道的jQuery技巧【收藏】
  • 原文地址:https://www.cnblogs.com/hualibokeyuan/p/11215161.html
Copyright © 2011-2022 走看看