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

    Python函数04/生成器/推导式/内置函数

    内容大纲

    1.生成器

    2.推导式

    3.内置函数

    1.生成器

    迭代器:Python中内置的一种节省空间的工具
    生成器的本质就是一个迭代器
    迭代器和生成器的区别:一个是Python自带的,一个是程序员自己写的
        
    写一个生成器:
    # def func():
    #     print(123)
    #     return "你好"
    # func()
    
    # def func():
    #     if 3>2:
    #         yield "你好"  # 停
    #     if 4>2:
    #         yield "我好"
    #     yield "大家好"
    # g = func()  # 产生一个生成器
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    # for i in g:
    #     print(i)
    
    # 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)) # -- 推荐使用
    # print(next(g)) # -- 推荐使用
    # print(next(g)) # -- 推荐使用
    # for i in g:
    #     print(i)
    
    坑 -- 会产生新的生成器(g = foo()就不会是每次都产生一个生成器了)
    print(foo().__next__())
    print(foo().__next__())
    
    # send()  -- 了解
    # def func():
    #     a = yield "俺是send"
    #     print(a)
    # g = func()
    # print(g.send(None))
    # print(g.send(123))
    #第一次获取yield值只能用next不能用send(其实是第一次可以用send(None))
    #send可以给上一个yield传递值
    
    生成器应用场景:
    
    # def func():
    #     lst = []
    #     for i in range(100000):
    #         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():
    #     lst = ["牛羊配","老奶奶花生米","卫龙","虾扯蛋","米老头","老干妈"]
    #     for i in lst:
    #         yield i
    # g = func()
    # print(next(g))
    # print(next(g))
    # print(next(g))
    # print(next(g))
    # print(next(g))
    
    # def func():
    #     lst1 = ["牛羊配","老奶奶花生米","卫龙","虾扯蛋","米老头","老干妈"]
    #     lst2 = ["小浣熊","老干爹","亲嘴烧","麻辣烫","黄焖鸡","井盖"]
    #     yield from lst1
    #     yield from lst2
    #
    # g = func()
    # print(next(g))
    # print(next(g))
    # print(next(g))
    
    # for i in g:
    #     print(i)
    
    # g.__iter__()
    # g.__next__()
    
    在函数中将return改写成yield就是一个生成器
    yield会记录执行位置
    return和yield都是返回
    return可以写多个,但是只执行一次;yield可以写多个,还可以返回多次
    一个__next__()对应一个yield
    生成器可以采用for循环获取值
    yield from -- 将可迭代对象元素逐个返回
    在函数内部,yield能将for循环和while循环进行临时暂停
    

    2.推导式

    # lst = []
    # for i in range(20):
    #     lst.append(i)
    # print(lst)
    
    list推导式
    # print([i for i in range(20)])
    
    # 循环模式
    # [变量 for i in range(20)]
    # print([i+1 for i in range(10)])
    
    # 筛选模式
    # 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])
    # [变量(加工后的变量) for循环 加工方式]
    
    # print([i for i in range(50) if i % 2 == 1])
    # print([i for i in range(1,50,2)])
    
    生成器表达式:
    
    # 循环模式:
    # g = (i for i in range(20))
    # print(next(g))
    # print(next(g))
    # print(next(g))
    
    # print(list((i for i in range(20))))
    
    # 筛选模式
    # g = (i for i in range(50) if i % 2 == 1)
    # for i in g:
    #     print(i)
    
    字典推导式:(了解)
    # print({i:i+1 for i in range(10)})
    # print({i:i+1 for i in range(10) if i % 2 == 0})
    # {键:值 for循环 加工条件}
    
    集合推导式:(了解)
    # 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循环 加工条件}
    
    # 将10以内所有整数的平方写入列表
    # 100以内所有的偶数写入列表.
    # 从python1期到python24期写入列表lst
    # print([f"pyhton{i}期" for i in range(1,25)])
    
    # 将这个列表中大于3的元素留下来。
    # print([i for i in [1,2,3,23,1234,4235,] if i > 3])
    

    3.内置函数(一)

    # s = """
    # for i in range(10):
    #     print(i)
    # """
    
    # s1 = """
    # def func():
    #     print(123)
    # func()
    # """
    # print(eval(s))
    # print(exec(s1))  # 厉害 不能用 (工作中尽量不要使用,容易出问题)
    
    # print(hash("asdfas"))
    
    # 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())   # 查看当前空间的变量
    

    4.今日总结

    # 1.生成器
    # 生成器的本质就是一个迭代器
    # 生成器和迭代器的区别:
        # 迭代器是Python自带的
        # 生成器是咱们(程序员)写得
        
    定义一个生成器:
        基于函数
        函数体中存在yield就是一个生成器
        函数名()就是产生一个生成器
       
    生成器:
        节省空间 --惰性机制
        不能逆行
        一次性
        一个next对应一个yield
        yield能够进行返回内容,还能够返回多次
        yield能够临时停止循环
        yield能够记录执行的位置
    
    yield from --将一个可迭代对象的元素逐个返回
    
    # list:[变量(加工后的变量) for循环 加工条件]
    # dict:{键:值 for循环 加工条件}
    # set:{变量(加工后的变量) for循环 加工条件}
    # 生成器表达式:(变量(加工后的变量) for循环 加工条件)
    
    # 1.普通循环推导
    # 2.筛选推导
    
    # 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()
    """
    

    5.今日练习

    # 2.用列表推导式做下列小题
    # 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
    # print([i.upper() for i in s if len(i) > 3])
    # 求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
    # print([(i, i+1) for i in range(6) if i % 2 == 0])
    # 求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]
    # print([i[-1] for i in M])
    # 求出50以内能被3整除的数的平方,并放入到一个列表中。
    # print([i for i in range(50) if i % 3 == 0])
    # 构建一个列表:['python1期', 'python2期', 'python3期', 'python4期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']
    # print([f'python{i}期' for i in range(1,11) if i != 5])
    # 构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
    # print([(i,i+1) for i in range(6)])
    # 构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    # print([i for i in range(20) if i % 2 == 0])
    # 有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白']将其构造成这种列表['alex0', 'WuSir1', '老男孩2', '太白3']
    # l1 = ['alex', 'WuSir', '老男孩', '太白']
    # print([l1[i]+str(i) for i in range(len(l1)) ])
    
    # 3.有以下数据类型:
    # x = {
    # 'name':'alex',
    # 'Values':[{'timestamp':1517991992.94,
    # 'values':100,},
    # {'timestamp': 1517992000.94,
    # 'values': 200,},
    # {'timestamp': 1517992014.94,
    # 'values': 300,},
    # {'timestamp': 1517992744.94,
    # 'values': 350},
    # {'timestamp': 1517992800.94,
    # 'values': 280}
    # ],}
    # 将上面的数据通过列表推导式转换成下面的类型:
    # [[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]]
    # print([em for i in x['Values'] for em in i.values()])
    #
    # 4.构建一个列表,列表里面是三种不同尺寸的T恤衫,每个尺寸都有两个颜色(列表里面的元素为元组类型)。
    # colors = ['black', 'white']
    # sizes = ['S', 'M', 'L']
    # print([(a,b) for a in sizes for b in colors])
    
    # 5.构建一个列表,列表里面的元素是扑克牌除去大小王以后,所有的牌类(列表里面的元素为元组类型)。
    # l1 = [('A','spades'),('A','diamonds'), ('A','clubs'), ('A','hearts')......('K','spades'),('K','diamonds'), ('K','clubs'), ('K','hearts') ]
    # print([(a,b) for a in ['A','2','3','4','5','6','7','8','9','10','J','Q','K'] for b in ['spades','diamonds','clubs','hearts']])
    
    # 6.简述一下yield 与yield from的区别。
    # yield  yield只能由for循环,逐个返回
    # yield from  可以将可迭代对象元素逐个返回
    
    # 7.看代码求结果(面试题):
    # v = [i % 2 for i in range(10)]
    # print(v)
    # [0,1,0,1,0,1,0,1,0,1]
    #
    # v = (i % 2 for i in range(10))
    # print(v)
    #<generator object <genexpr> at 0x000000F9C7CBFEB8> # 内存地址
    #
    # for i in range(5):
    #      print(i)
    # print(i)
    # 1
    # 2
    # 3
    # 4
    # 4
    
  • 相关阅读:
    65 进程互斥锁的优化实现
    Linux多线程编程
    互斥锁和自旋锁
    64 进程互斥锁的初步实现(下)
    63 进程互斥锁的初步实现(中)
    Linux中断子系统
    62 进程互斥锁的初步实现(上)
    61 进程互斥锁的详细设计
    Linux进程调度的时机
    嵌入式领域linux作为实时操作系统的缺点(转)
  • 原文地址:https://www.cnblogs.com/liubing8/p/11215869.html
Copyright © 2011-2022 走看看