zoukankan      html  css  js  c++  java
  • 列表推导式,生成器

    今日内容

    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))
        
  • 相关阅读:
    Android内存优化4 了解java GC 垃圾回收机制2 GC执行finalize的过程
    Android内存优化3 了解java GC 垃圾回收机制1
    Android内存优化2 了解java内存分配 2
    Android内存优化1 了解java内存分配 1
    Android Parcel对象详解
    Android中Parcel的分析以及使用
    Android进阶笔记:Messenger源码详解
    Android进阶笔记:AIDL内部实现详解 (二)
    Android进阶笔记:AIDL内部实现详解 (一)
    Android开发高级进阶——多进程间通信
  • 原文地址:https://www.cnblogs.com/wang-xing-hao/p/10877954.html
Copyright © 2011-2022 走看看