【问题标题】:Change in Type of Brackets changes type of return [duplicate]更改括号类型更改返回类型[重复]
【发布时间】:2019-11-30 02:57:41
【问题描述】:

我的项目中有一些代码,但我遇到了一个我解决的问题,但我不知道它是如何工作的。当我更改代码中使用的括号类型时,年份的值是不同的。

当我在= 之后的语句开头和结尾处的第 2 行中使用方括号时

import datetime
years=[x for x in range(2015,datetime.datetime.now().year)]

当我print(years) 它给出输出[2015,2016,2017,2018]

但是当我像这样在第 2 行使用圆括号时

years=(x for x in range(1940,datetime.datetime.now().year))

当我打印它时,它会输出<generator object <genexpr> at 0x041DB630>

我不明白为什么会发生这种情况,谁能解释一下。谢谢

【问题讨论】:

  • 这只是列表理解的语法与生成器表达式的语法。

标签: python python-3.x


【解决方案1】:

您正在第二个实例中创建生成器表达式。

您需要将其包装在 list()tuple() 中以获得可迭代的输出。

在第一个实例中,您会生成一个列表。

你可以阅读更多关于这个问题Getting <generator object <genexpr>

【讨论】:

    【解决方案2】:

    您正在尝试的是理解,它通过循环或迭代项目并将它们分配到容器中来工作。

    下面是使用方括号的列表推导:

    [thing for thing in things]
    

    但是您尝试的是使用括号,它是生成器理解 not 元组理解,因为括号已保留用于生成器理解,因此:

    (thing for thing in things) 
    

    将产生一个生成器迭代器,而不是一个元组。要获取元组迭代器,请按以下方式使用:

    tuple(thing for thing in things) 
    

    【讨论】:

      【解决方案3】:

      生成器是可以在运行中暂停和恢复的函数,返回一个可以迭代的对象。与列表不同,它们是懒惰的,因此一次只生成一个并且仅在被询问时才生成。因此,在处理大型数据集时,它们的内存效率要高得多。 就像列表推导式一样,生成器也可以用相同的方式编写,只是它们返回的是生成器对象而不是列表:

      >>> my_list = ['a', 'b', 'c', 'd']
      >>> gen_obj = (x for x in my_list)
      >>> for val in gen_obj:
      ...     print(val)
      ...
      a
      b
      c
      d
      

      【讨论】:

        【解决方案4】:

        解释如下:

        • 使用圆括号,它被称为生成器表达式,您必须在其中执行 list(..) 以使其成为列表,tuple(..) 使其成为元组等等......更多关于documentation

          生成器迭代器由 yield 关键字创建。它们与普通函数的真正区别在于,与 return 不同的是,yield 既是函数体的出口点,也是入口点。这意味着,在每次 yield 调用之后,生成器不仅会返回一些东西,而且还会记住它的状态。在最后执行的 yield 语句之后调用 next() 方法将控制权返回给生成器。每个 yield 语句只执行一次,按照它在代码中出现的顺序。执行完所有的 yield 语句后,迭代结束。

        • 方括号称为列表推导式,它会给出一个列表,因为方括号用于列表,更多信息请参见documentation

          列表推导式遵循数学集合构建器表示法(集合推导式)的形式,与 map() 和 filter() 函数的使用不同。

        【讨论】:

          【解决方案5】:

          这是两个不同但相关的结构。

          [x for x in range(2015,datetime.datetime.now().year)]
          

          被称为列表推导,而

          (x for x in range(2015,datetime.datetime.now().year))
          

          被称为生成器表达式

          阅读更多https://djangostars.com/blog/list-comprehensions-and-generator-expressions/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-07-03
            • 2011-11-09
            • 1970-01-01
            • 2014-06-07
            • 2017-10-09
            • 2014-09-20
            • 2021-12-24
            • 2013-07-04
            相关资源
            最近更新 更多