zoukankan      html  css  js  c++  java
  • 【0813 | Day 14】三元表达式/列表推导式/字典生成式/生成器及其表达式

    三元表达式

    {条件成立时的返回值 if条件 else返回值}

    列表推导式

    print(F"[i for i in range(10)]: {[i for i in range(10)]}")

    字典生成式

    一、字典生成式

    print({i: i**2 for i in range(10)})

    ---> {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

    二、zip()方法

    keys = [ 'name', 'age', 'gender' ]

    values = ['nick', 19, 'male' ]

    res = zip (keys, values)

    print (zip(keys,values))

    info_dict = {k: v for k, v in res}*

    print (info_dict)

    ---> <zip object at 0x11074c088>

    ---> {'name': 'nick', 'age': 19, 'sex': 'male'}

    info_dict = {'name' : 'nick', 'age' : 19, 'gender' : 'male'}

    print(info_dict.keys( ))

    print(info_dict.values( ))

    res = zip (info_dict.keys( ), info_dict.values( ))

    print(zip(info_dict.keys( ), info_dict.values( )) )

    info_dict = {k: v for k, v in res}

    print(info_dict)

    ---> dict_keys(['name', 'age', 'gender'])
    ---> dict_values(['nick', 19, 'male'])
    ---> <zip object at 0x1105cefc8>
    ---> {'name': 'nick', 'age': 19, 'gender': 'male'}

    生成器

    生成器的本质就是迭代器,同时也并不仅仅是迭代器。

    一、yield关键字
    #主体
    def func():
        yield [1, 2, 3]
        print('我出来了吗?')
        yield 789
        print('那我呢?')
        yield 456
    
    
    g = func()
    
    # 第一种
    for i in g:
        print(i)
    
    # 第二种
    g_iter = g.__iter__()
    print(g.__next__())
    print(g.__next__())  #只打印两个yield
    
    #第三种
    g_iter = g.__iter__()
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())  #找不到值
    
    

    ---> [1, 2, 3]
    我出来了吗?
    789
    那我呢?
    456

    ---> [1, 2, 3]
    我出来了吗?
    789

    ---> Traceback (most recent call last):
    [1, 2, 3]
    File "D:/fxyadela/上课练习/生成器.py", line 20, in
    print(g._next_( ))
    我出来了吗?
    StopIteration
    789
    那我呢?
    456

    def func():
        print('from func 1')
        yield 'a'
        print('from func 2')
        yield 'b'
    
    
    g = func()
    for i in g:
        print(i)  
        
    #from func 1
    #a
    #from func 2
    #b
    
    res = list(func())
    print(res)
    
    #from func 1   #这只是打印的值
    #from func 2   #这只是打印的值
    #list(func()): ['a', 'b']  yield的值属于返回值,会存入列表中
    
    1. yield + return

      def i_wanna_return():
          yield 'a'
          yield 'b'
          return None
          yield 'c'
      
      
      for i in i_wanna_return():
          print(i)
      

      ---> a

      ​ b

    2. 迭代器嵌套

      def sub_generator():
          yield 1
          yield 2
          yield from range(3)
      
      
      for i in sub_generator():
          print(i)
      

      ---> 1

      ​ 2

      ​ 0

      ​ 1

      ​ 2

    二、自定义range()方法
    def my_range(start, stop, step=1):
        while start < stop:
            yield start
            start += 1
    
    
    g = my_range(0, 3)
    print(list(g))
    

    ---> [0, 1, 2]

    def range(*args,step = 2):
        args = list(args)
        if len(args) == 1:
            count = 0
            while count < args[0]:
                yield count
                count += 1
        elif len(args) >= 2:
            while args[0] < args[1]:
                yield args[0]
                args[0] += step
    
    for i in range(1,10,2):
        print(i)
    

    ---> 1

    ​ 3

    ​ 5

    ​ 7

    ​ 9

    三、总结

    yield:

    1. 提供一种自定义迭代器的方式
    2. yield可以暂停住函数,并提供当前的返回值

    yield & return:

    1. 相同点:两者都是在函数内部使用,都可以返回值,并且返回值没有类型和个数的限制
    2. 不同点:return只能返回一次值yield可以返回多次值

    生成器表达式

    • 把列表推导式的[]换成()就是生成器表达式,前者[ ]是个列表,后者( )是generator。
    • list可以直接打印每一个元素,而generator只能通过next( )的方法。
    • 优点:省内存,一次只产生一个值在内存中
    #List[]
    
    >>> L = [x * x for x in range(10)]
    
    #generator()
    
    >>> g = (x * x for x in range(10))
    

    ---> L[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

    ---> g<generator object at 0x104feab40>

    一、生成器表达式和列表推导式

    列表推导式相当于直接给你一筐蛋,而生成器表达式相当于给你一只老母鸡。

    # 列表表达式
    with open('52.txt', 'r', encoding='utf8') as f:
        nums = [len(line) for line in f]
    
    print(max(nums))
    
    1
    
    
    # 生成器推导式
    with open('52.txt','r',encoding='utf8') as f:
        nums = (len(line) for line in f)
    
    print(max(nums)) # ValueError: I/O operation on closed file.
    
  • 相关阅读:
    为什么机器学习中常常假设数据是独立同分布的?
    深度学习常见的问题
    隐马尔科夫模型(HMM)与词性标注问题
    机器学习常见问题
    特征向量、特征值以及降维方法(PCA、SVD、LDA)
    anaconda安装tensorflow后pip安装jieba出错的问题
    神经网络与BP神经网络
    tensorflow模块安装
    requests爬取百度音乐
    scrapy爬虫,爬取图片
  • 原文地址:https://www.cnblogs.com/fxyadela/p/11348730.html
Copyright © 2011-2022 走看看