zoukankan      html  css  js  c++  java
  • 生成器和几个内置函数

    词法分析 和 语法分析

    生成器:

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

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

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

    写一个生成器---函数中将return 改成yield就是生成器

    def func()
    	print(123)
        yield "你好啊"# 返回 跟return的作用相同
    print(func())产生一个生成器
    print(func().__next__())
    结果:
    <generator object func at 0x000001F35A653C50>
    123
    你好啊
    

    return 可以返回值 可以写多个但是只执行一次

    yield 可以 返回值 可以写多个 可以返回多次 会记录执行位置 在函数内部yield可以暂时阻塞 while for循环

    ![QQ图片20190719102807](D:\python听课记录\day1\QQ图片20190719102807.pngdef func():
        if 3>2:
            yield "你好"
        if 4>2:
            yield "我好"
        yield "大家好"
    g = func()
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    结果:
    你好
    我好
    大家好
    

    QQ图片20190719102807

    def foo():
        for  i in range(10):
            pass
        yield i
        count = 1
        while True:
            yield count
            count += 1
    
    print(foo().__next__())
    print(foo().__next__())#会产生新的生成器
    print(foo().__next__())
    

    iter() == __iter__()

    next() == __next__()

    send()----了解

    def func():
           a = yield "俺是send"
        	print(a)
    g = func()
    print(g.send(None))#第一次传参只能传None
            
    

    生成器的应用场景:

    def func():
        lst = []
        for i in range(100000):
            lst.append(i)
        return lst
    print(func())
    
    #改成生成器:
    def func():
        lst = []
        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))
    结果:
    
    

    yield from 将可迭代对象逐个返回 ,相当于for循环

    def func():
        lst = ["牛羊配","老奶奶花生米","卫龙","虾扯淡","米老头儿","老干妈"]
        yield from lst#先走完所有的列表才会执行下一个yield#这个地方有坑
    g = func()
    for i in g:
        print(i)
    

    推导式:

    列表推导式

    循环模式

    [变量名 for 变量名 in range(10) ]

    lst = [i for i in range(20)]
    
    print([i+1 for i in range(10)])
    

    筛选模式:

    [变量(加工后的变量) for循环 加工方式 ]

    print([i for i in range(20) if i %2 ==0])
    

    生成器表达式

    循环模式:

    g = (i  for i in range(10) )
    print(next(g))
    print(next(g))
    print(next(g))
    print( list((i  for i in range(10) )))
    
    print( (i  for i in range(10) ))
    结果:
        0
    1
    2
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    <generator object <genexpr> at 0x0000019B5C5E3BF8>
    
    

    筛选模式:

    g = (i for i in range(20) if i%2 ==0)
    for i in g:
        print(i)
    

    字典推导式

    {i:i+1 for i in range(10)}
    
    {i:i+1 for i in range(10) if i%2 ==0}
    

    {键:值 for循环 加工}

    集合推导式

    {i for i in range(10)}
    
    {i for i in range(10)} if i%2 ==0 }
    

    内置函数一

    1. eval---执行字符串类型的代码(但是只能执行一行,多行会报错),并返回最终结果。工作中禁用

      eval('2 + 2')  # 4
      n=81
      eval("n + 4")  # 85
      eval('print(666)')  # 666
      
      
      
    2. exec()---仅执行字符串类型的代码。但是不返回值工作中禁用

      s = """
      for i in range(10):
          print(i)
      """
      
      s1 = """
      print(2)
      def func():
          print(123)
      func()
      """
      print(exec(s))
      print(exec(s1))
      
      
    3. 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
      '''
      
      
    4. help()--函数用于查看函数或模块用途的详细说明。

      print(help(list))
      print(help(str.split))
      
      
    5. callable()---函数用于检查一个对象是否是可调用的。如果返回True,仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。

      def func():
          pass
      print(callable(func))  # 查看是否可调用
      True
      
      
    6. int:函数用于将一个字符串或数字转换为整型。

      print(int())  # 0
      print(int('12'))  # 12
      print(int(3.6))  # 3
      print(int('0100',base=2))  # 将2进制的 0100 转化成十进制。结果为 4
      
      
      
    7. float()---函数用于将整数和字符串转换成浮点数。

      print(float(2))
      2.0
      
      
    8. complex()---函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数

      print(complex(56))  # 复数
      print(complex(56,2)) 
      print(complex("56+6j"))
      结果:
      (56+0j)
      (56+2j)
      (56+6j)
      
      
    9. bin() ---将十进制转换成二进制并返回。

    10. oct()---将十进制转化成八进制字符串并返回。

    11. 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'>
      
      
      
    12. divmod():计算除数与被除数的结果,返回一个包含商和余数的元组(a // b, a % b)。

      print(divmod(5,2))# 2商 1余数
      
      
    13. round()---保留浮点数的小数位数,默认保留整数。

      print(round(3.5))
      print(round(4.5))
      print(round(4.6))
      print(round(5.3234, 2))     
      print(round(5.545, 2))     
      print(round(5.535, 2)
      结果:
      4
      4
      5
      5.32
      5.54
      5.54
      
      
    14. pow()--求x**y次幂。(三个参数为x**y的结果对z取余)

      print(pow(2,3))  # 两个参数为2**3次幂
      print(pow(2,3,3))  # 三个参数为2**3次幂,对3取余。
      
      
      
    15. bytes()---用于不同编码之间的转化。

      # s = "alex"
      # print(bytes(s,encoding="utf-8"))
      
      
    16. ord()--输入字符找当前字符编码的位置

      # ord 输入字符找该字符编码的位置
       print(ord('a'))
       print(ord('中'))
      
      
    17. chr()--输入当前编码的位置数字找出其对应的字符

      # chr 输入位置数字找出其对应的字符
       print(chr(97))
       print(chr(20013))
      
      
    18. repr()---返回一个对象的string形式(原形毕露)。

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

    20. all()---可迭代对象中,全都是True才是True

      print(all([1,2,True,0]))#False
      
      
    21. any()---可迭代对象中,有一个True 就是True

      print(any([1,'',0]))#True
      
      
    22. gloabals()---获取全局空间中的变量

    23. locals()--获取当前空间中的变量

    name = 1
    def func():
        a = 123
        print(locals())
        print(globals())
    func()
    print(locals())
    
    

    练习

    2.用列表推导式做下列小题
    过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
    求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
    求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]
    求出50以内能被3整除的数的平方,并放入到一个列表中。
    构建一个列表:['python1期', 'python2期', 'python3期', 'python4期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']
    构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
    构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白']将其构造成这种列表['alex0', 'WuSir1', '老男孩2', '太白3']

    # 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
    '''
    lst = ["dsadsa","dsafa","fd","fdsfdsfa"]
    lst1 = [i.upper() for i in lst if len(i)>=3]
    print(lst1)
    '''
    # 求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
    '''
    lst = [(i,j) for i in range(0,5,2) for j in range(1,6,2) ]
    print(lst)
    '''
    # 求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]
    '''
    M = [[1,2,3],[4,5,6],[7,8,9]]
    lst = [j for i in M  for j in i if j % 3 ==0]
    print(lst)
    '''
    # 求出50以内能被3整除的数的平方,并放入到一个列表中。
    '''
    lst = [i*i for i in range(51) if i % 3 == 0]
    print(lst)
    '''
    # 构建一个列表:['python1期', 'python2期', 'python3期', 'python4期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']
    '''
    lst = [f"python{i}期" for i in range(1,11) if i != 5]
    print(lst)
    '''
    # 构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
    '''
    lst = [(i,i+1)for i in range(6)]
    print(lst)
    '''
    # 构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    '''
    lst = [i for i in range(20) if i % 2 == 0]
    print(lst)
    '''
    # 有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白']将其构造成这种列表['alex0', 'WuSir1', '老男孩2', '太白3']
    '''
    l1 = ['alex', 'WuSir', '老男孩', '太白']
    l1 = [i+str(l1.index(i)) for i in l1]
    print(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]]

    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}
    ],}
    ls = []
    lst = [[j for j in i.values()] for i in x["Values"] ]
    print(lst)
    
    

    4.构建一个列表,列表里面是三种不同尺寸的T恤衫,每个尺寸都有两个颜色(列表里面的元素为元组类型)。
    colors = ['black', 'white']
    sizes = ['S', 'M', 'L']

    colors = ['black', 'white']
    sizes = ['S', 'M', 'L']
    lst = [(i,j )for i in sizes for j in colors]
    print(lst)
    

    5.构建一个列表,列表里面的元素是扑克牌除去大小王以后,所有的牌类(列表里面的元素为元组类型)。
    l1 = [('A','spades'),('A','diamonds'), ('A','clubs'), ('A','hearts')......('K','spades'),('K','diamonds'), ('K','clubs'), ('K','hearts') ]

    ls = ['spades','diamonds','clubs','hearts']
    ls1 = ["A","2","3","4","5","6","7","8","9","10","J","Q","K"]
    li = [(i,j) for i in ls1 for j in ls]
    print(li)
    

    6.简述一下yield 与yield from的区别。

    # yield 返回的就是当前元素
    # yield from  相当于for循环   后面加可迭代对象 用来循环返回可迭代对象的元素
    

    7.看代码求结果(面试题):
    v = [i % 2 for i in range(10)]
    print(v)

    v = (i % 2 for i in range(10))
    print(v)

    for i in range(5):
         print(i)
    print(i)
    
    # [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
    # 生成器地址  <generator object <genexpr> at 0x00000191D86E3C50>
    # 0 1 2 3 4 4
    
  • 相关阅读:
    android bitmap 防止 内存溢出
    析android应用增量升级(差分升级)
    android 数据库查询中使用索引-大幅提高数据库操作速度
    android 插件框架
    android悬浮view-FloatingView
    android 消息分发框架 otto
    修改了USER_AGENT还是不能抓取到数据怎么办?
    找不到指定文件scrapy,在pycharm中运行程序出现错误
    scrapy抓取豆瓣网信息时报错提醒403[scrapy.spidermiddlewares.httperror] INFO
    slidetoshutdown电脑滑动关机命令失效了怎么办?
  • 原文地址:https://www.cnblogs.com/ciquankun/p/11215783.html
Copyright © 2011-2022 走看看