• 生成器 内置函数I 12


    生成器

    • 生成器:python 社区,生成器与迭代器看成是一种。生成器的本质就是迭代器,唯一的区别:生成器是我们利用python 代码构建 数据结构。迭代器都是提供的,或者转化得来的。

    • 获取生成器的三种方式:

      • 生成器函数。
      • 生成器表达式。
      • python内部提供的一些。
    • 生成器函数获得生成器:

      函数
      def func():
          print(111)
          print(222)
          return 3
      ret = func()
      print(ret)
      
      生成器函数:
      def func():
      	print(111)
      	print(222)
      	yield 3
      	a = 1
      	b = 2
      	c =a +b
      	print(c)
      	yield 4
      	
      ret =func()
      print(next(ret))
      print(next(ret))
      print(next(ret))
      一个next 对应一个yield
      
    • yield return

      return :函数中只存在一个return 结束函数,并且给函数的执行者返回值。yield:函数中只要有yield那么它就是生成器函数而不是函数了。生成器函数中可以存在多个yield ,yield不会结束生成器函数,一个yield对应一个next。

    • 吃包子练习题:

      def func():
          l1 = []
          for i in range(1,5001):
              l1.append(f'{i}号包子')
          return l1
      ret = func()
      print(ret)
      
      def gen_func():
      	for i in range(1,5001):
      		yield f'{i}号包子'
      ret =gen_func()
      for i in range(200):
      	print(next(ret))
      
      for i in range(200):
      	print(next(ret))
      	
      
    • yield from

      def func():
          l1 = [1, 2, 3, 4, 5]
          yield l1
      ret = func()
      print(next(ret))
      
      
      def func():
      	l1 = [1,2,3,4]
      	yield from l1
      	'''
      	yield 1
          yield 2
          yield 3
          yield 4
          yield 5
          '''
          将l1 这个列表变成了迭代器返回。
      ret = func()
      print(next(ret))
      print(next(ret))
      print(next(ret))
      print(next(ret))
      
    • 生成器表达式,列表推导式

      • 用一行代码构建一个比较复杂有规律的列表。

      • 列表推导式:

        • 循环模式:[变量(加工后的变量) for 变量 in iterable]
        • 筛选模式:[变量(加工后的变量) for 变量 in iterable if 条件]
        # l1 = [i**2 for i in range(1,11)]
        # print(l1)
        # l1 = [i for i in range(2,101) if i %2 == 0]
        # print(l1)
        # l1 = [f'python{i}期 ' for i in range(1,101)]
        # print(l1)
        
        # l1 = ['barry','holting','ab','xo']
        # l = [i.upper() for i in l1 if len(i) <3 ]
        # print(l)
        
        l1 = [i for i in range(2,11)] + list('JQKA')
        print(l1)
        
        # 含有两个'e'的所有的人名全部大写留下来
        names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
                 ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
        l1 = []
        for i in names:
            for name in i:
                if name.count('e') == 2:
                    l1.append(name)
        print(l1)
        print([name.upper() for i in names for name in i if name.count('e') == 2])
        
      • 生成器表达式

        # 生成器表达式:
        # 与列表推导式的写法几乎一模一样,也有筛选模式,循环模式,多层循环构建。写法上只有一个不同:
        # [] 换成 ().
        # print([i for i in range(1,11)])
        # print((i for i in range(1,11)))
        # obj = (i for i in range(1,11))
        # print(next(obj))
        # print(next(obj))
        # print(next(obj))
        # print(next(obj))
        # print(next(obj))
        # for i in obj:
        #     print(i)
        
      • 循环模式讲解

        练习题:

    • 总结:

      列表推导式:
          # 缺点:
          # 1,有毒。列表推导式只能构建比较复杂并且有规律的列表。 不要太着迷。
          # 2,超过三层循环才能构建成功的,就不建议用列表推导式。
          # 3,查找错误(debug模式)不行。
          # 优点:
              # 一行构建,简单。
              # 装逼。
      # 构建一个列表: [2,3,4,5,6,7,8,9,10,'j','Q','K','A']
      # l1 = [i for i in range(2,11)] + list('JQKA')
      # print(l1)
      
      列表推导式与生成器表达式区别。
      写法上: [] ( )
      iterable  iterator
      
      
      字典推导式:(了解)
      lst1 = ['jay', 'jj', 'meet']
      lst2 = ['周杰伦','林俊杰','元宝']
      dic ={lst2[i]:lst1[i] for i in range(len(lst1))}
      print(dic)
      集合推导式(了解)
      print({i for i in range(1,11)})
      
    • 内置函数 I (此处了解)

      # python 提供了68个内置函数。
      # 今天讲的这部分大部分了解即可。
      # eval 剥去字符串的外衣运算里面的代码,有返回值。
      bin:将十进制转换成二进制并返回。
      
      oct:将十进制转化成八进制字符串并返回。
      
      hex:将十进制转化成十六进制字符串并返回。
      
      s1 = '1 + 3'
      # print(s1)
      # print(eval(s1))  **
      # s = '{"name": "alex"}'
      # print(s,type(s))
      # print(dict(s)) # 不行
      # print(eval(s),type(eval(s)))
      # 网络传输的str input 输入的时候,sql注入等等绝对不能使用eval。
      
      # exec 与eval几乎一样, 代码流。
      msg = """
      for i in range(10):
          print(i)
      """
      # print(msg)
      # exec(msg)
      # hash 哈希值
      # print(hash('fsjkdafsda'))
      
      # help 帮助
      # s1 = 'fjdsls'
      # print(help(str))
      # print(help(str.upper))
      # s1 = 'sfsda'
      # s1.upper()
      
      
      s1 = 'fdsklfa'
      # s1()
      def func():
          pass
      # func
      # # callable 判断一个对象是否可被调用  ***
      # print(callable(s1))
      # print(callable(func))
      

    16.看代码求结果:(面试题)
    def demo():
    for i in range(4):
    yield i

    g=demo()

    g1=(i for i in g)
    g2=(i for i in g1)

    print(list(g1))
    print(list(g2))
    17.看代码求结果:(面试题)
    def add(n,i):
    return n+i

    def test():
    for i in range(4):
    yield i

    g=test()
    for n in [1,10]:
    g=(add(n,i) for i in g)

    print(list(g))

  • 相关阅读:
    生成一个平面矩形网格文件
    生成球 使用openMesh 库
    U盘安装可能会遇见UEFI的问题,使用easyBCD安装即可。
    vs 代码格式化
    跨域问题的出现和解决
    代理服务器的作用 和 推荐
    sublime user 配置
    git 大佬的相关配置
    win10 注册
    【BZOJ3566】—概率充电器(树形+概率dp)
  • 原文地址:https://www.cnblogs.com/zhaoxinblog/p/13232925.html
Copyright © 2020-2023  润新知