列表推导式,生成器

今日内容

  1. 生成器

    • 生成器: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
          yield 4
      ret = func()
      print(next(ret))
      print(next(ret))
      一个netx对应一个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 func():
          for i in range(1,5001):
              yield f'{i}号包子'
      
      for z in range(200):
          print(next(func))
      
    • yield from

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

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

      • 列表推导式:

        • 循环模式:[变量(加工后的变量) for 变量 in iterable]
        • 筛选模式:[变量(加工后的变量) for 变量 in iterable if 条件]
      • 循环模式

        #将10以内所有的整数的平方根写入列表
        ret = [i**2 for i in range(1,11)]
        print(ret)
        #100以内所有的偶数写入列表。
        print([i for i in range(2,101,2)])
        
        从python1期到pyython100期写入列表lst
        print([f'python{i}期'for i in range(1,101)])
      • 筛选模式

        筛选模式:[变量(加工后的变量)for 变量 in iterable if 条件]
        30以内能被3整除的数
        l1 = [i for i in range(1,31)if i%3 == 0]
        print(l1)
        #过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
        l1 = ['barry', 'ab', 'alex', 'wusir', 'xo']
        print([i.upper()for i in l1 if len(i) >= 3])
        
        #含有两个'e'的所有的人名全部大写留下来
        names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
                 ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
        
        print([z.upper for i in names for z in i if z.count('e')==2])
      • 生成器表达式

      • 与列表推导式的写法几乎一模一样,也有筛选模式,循环模式,多层循环结构。写法上只有一个不同[]换成()

        obj = (i for i in range(1,11))
        print(next(obj))
        for i in obj:
            print(i)
      • 总结:

      • 列表推导式:

        缺点:

        1. 列表推导式只能构建比较复杂并且有规律的列表。不要太着迷。
        2. 如果超过三成循环才能构建成功,就不建议用列表推导式。
        3. 查找错误(debug模式)不行

        优点:

        ​ 1.一行构建.简单

        ​ 2.装逼

    • 内置函数

      #eval 剥去字符串的外衣运算里面的代码,有返回值。
      s1 = '1 + 3'
      print(eval(s1))
      s = '{"name":"alex"}'
      print(eval(s))
      #网络传输的str input 输入的时候,sql注入等等绝对不能使用eval。
      
      #exec 与eval几乎一样,代码流
      msg = '''
      for i in range(10):
         print(i)
      
      '''
      exec(msg)
      
      #hash 哈希值
      print(hash('fhadjkdh'))
      
      help 帮助
      s1 = 'fshjak'
      print(help(str))
      print(help(str.upper))
      
      s1 = 'fjda'
      def func():
          print('a')
      #callable 判断一个对象是否可别调用
      print(callable(s1))
      print(callable(func))

猜你喜欢

转载自www.cnblogs.com/wang-xing-hao/p/10877954.html
今日推荐