七天学会Python基础-第六天1/1

  1. 生成器

    • 什么是生成器:Python社区,生成器与迭代器看成一种。生成器的本质就是迭代器。

      • 唯一的区别:生成器是我们自己用python代码构建的数据结构。迭代器都是提供的,或者是转化的来的。
      • 获取生成器的三种方式:
        1. 生尘器函数
        2. 生成器表达式
        3. Python内部提供的一些
    • yield

      • 生成器函数获得一个生成器

        # 生成器函数
        def func():
            print(111)
            print(222)
            yield 3
            a=1
            b=2
            c=3
            print(c+b)
            yield 4
        func() # 不执行
        ret=func() # # 此时ret就是一个迭代器
        print(next(ret))	# 对ret进行取值 3,此时程序停到了第五行,
        print(next(ret))	# 程序接着运行 输出5,对ret进行取值 4,此时程序停到了第10行
        # 一个next对应一个yield
        
    • yield与return

      • return和yield的区别

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

        # 传统 缺点:内存占用太大
        def func():
            l1=[]
            for i in range(1,5000):
                l1.append(f"{i}号包子")
            return l1
        ret=func()
        print(ret)
        ---------------------------------------------------
        # 使用生成器,利用了惰性机制,随用随生成
        def gen_func():
            for i in range(1,5000):
                yield f"{i}号包子"
        ret=gen_func()
        for i in range(200)
        	print(next(ret))
        
    • yield from,将一个可迭代对象使用yield挨个进行返回(将一个可迭代对象变成生成器进行返回)

      # 不使用yeild from
      def func():
          l1=[1,2,3,4,5]
          yield l1
      ret=func()
      print(next(ret)) # 此时得到的是一个列表
      ---------------------------------------------------
      # 使用yeild from
      def func():
          l1=[1,2,3,4,5]
          yield from l1
      ret=func()
      print(next(ret)) # 此时得到的是一个列表中的第一个元素,1
      print(next(ret)) # 此时得到的是一个列表中的第二个元素,2
      ---------------------------------------------------
      # 使用yeild from
      def func():
          l1=[1,2,3,4,5]
          l2=[6,7,8,9,0]
          yield from l1
          yield from l2
      ret=func()
      for i in range(10):
          print(next(ret))
      # 将两个列表中的元素顺序进行返回,即返回完yield form l1生成的迭代器中的元素后就返回yield from l2生成的迭代器中的元素
      
  2. 生成器表达式和列表推导式

    1. 列表推导式:

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

        # 常规
        l1=[]
        for i in range(1,11):
            l1.append(i)
        print(l1)
        ---------------------------------------------------
        # 列表推导式
        l1=[i for i in range(1,11)]
        print(l1)
        
      • 列表推导式分为两类

        1. 循环模式::[变量(加工后的变量)for 变量 in iterable]

          # 将10以内所有整数的平方写入列表
          lst1=[i**2 for i in range(1,11)]
          # 将100以内所有的偶数写入列表
          lst2=[i for i in range(2,101,2)]
          # 从python1期到python100期写入列表
          lst3=[f"python{i}期" for i in range(1,101)]
          
        2. 筛选模式:[变量(加工后的变量)for 变量 in iterable if 条件]

          # 将30以内所有的被三整除的数写入列表
          lst4=[i for i in range(1,31) if i%3==0]
          # 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
          lst5=['barry','ab','alex','wusir','xo']
          lst6=[i.upper() for i in lst5 if len(i)>=3]
          ---------------------------------------------
          # 找到嵌套列表总名字含有两个e的所有名字并大写列下来
          lst7=[['Tom','Billy','Jefferson','Andrew','Weslew','Steven','Joe'],['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']]
          lst8=[j.upper() for i in lst7 for j in i if j.count("e")==2]
          
    2. 生成器表达式:

      • (将列表推导式中的[]替换成()即可),其余的全部一样

      • (变量(加工后的变量)for 变量 in iterable)

        l1=(i for i in range(1,11))
        print(next(l1))
        # 迭代器也可以使用for循环进行打印
        for i in lst9:
            print(i)
        
    3. 总结:

      • 列表推导式:
        • 缺点
          • 列表推导式只能构建比较复杂并且有规律的列表。不要太着迷
          • 超过三层循环才能构建成功的,就不见时使用列表推导式了
          • 只有一行,查找错误(debug模式)不行
        • 优点
          • 一行构建,简单。
          • 装13
      • 提升:
        • 构建一个列表:[2,3,4,5,6,7,8,9,10,'J','Q','K','A']
          • l1=[i for i in range(2,11)]+list("JQKA")
    4. 列表推导式和生成器表达式的区别

      1. 写法上:
      2. 本质:iterable(可迭代对象)和 iterator(迭代器)的区别
    5. 字典推导式(了解)

      lst1=['jay','jj','meet']
      lst2=['周杰伦','林俊杰','元宝']
      # 键是中文,值是英文
      dic={lst2[i]:lst1[i] for i in range(len(lst1))}
      
    6. 集合推导式(了解)

      print({i for i in range(1,11)})
      
  3. 内置函数Ⅰ

    • 函数就是以功能为导向,一个函数封装一个功能,那么Python将一些常用的功能(比如len)给我们封装成了一个一个的函数,供我们使用,他们不仅效率高(底层都是用C语言写的),而且是拿来即用,避免重复造*,那么这些函数就称为内置函数,到目前为止,Python给我们提供的内置函数一共是68个。

    • 分散学习

      • 一带而过(今天学)

        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()
        
        • eval() ,剥去字符串的外衣,运算里面的代码,有返回值

          • 很危险:网络传输的str input 输入的时候 sql诸如的时候等等,决不能使用eval()
          • 应用场景,把一个字典写入文件,再读取这个文件的时候就成为了字符串,此时使用eval()可以将这个字符串转换为原来的字典类型
          s1='1+3'
          print(s1)	# 1+3
          print(eval(s1))	# 4
          
        • exec(),与eval()几乎一样,exec()是处理代码流的

          msg="""
          for i in range(10):
          	print(i)
          """
          print(msg) # 只是字符串,不会运行
          exec(msg) # 剥去字符串的外衣,运行里面的代码
          
        • hash(),获取一个对象(可哈希对象:int,str,Bool,tuple)的哈希值,只能操作不可变的数据类型

          print(hash("abc"))

        • help(),获取帮助

          print(help(str.upper))

        • callable(),判断这个对象是否可调用,返回布尔值

          s1='a'
          def func():
              pass
          print(callable(s1)) # False
          print(callable(func)) # True
          
        • bin() 返回一个数字的二进制。

          • bin(10)
        • oct() 返回一个数字的八进制

          • oct(10)
        • hex()返回一个数字的十六进制

          • hex(10)
      • 重点学习

        abs() enumerate() filter()  map() max()  min() open()  range() print()  len()  list()  dict() str()  float() reversed()  set()  sorted()  sum()    tuple()  type()  zip()  dir() 
        
      • 以后学

         classmethod()  delattr() getattr() hasattr()  issubclass()  isinstance()  object() property()  setattr()  staticmethod()  super()
        
上一篇:迭代器和生成器


下一篇:Js 迭代器与生成器