Python 括号类型的更改更改退货类型

Python 括号类型的更改更改退货类型,python,python-3.x,Python,Python 3.x,我是我项目中的一些代码,但我遇到了一个问题,我解决了,但我不知道它是如何工作的。当我更改代码中使用的括号类型时,年份中的值是不同的 当我在= import datetime years=[x for x in range(2015,datetime.datetime.now().year)] 当我打印(年)时,它给出输出[2015201620172018] 但是当我在第2行使用圆括号时 years=(x代表范围内的x(1940,datetime.datetime.now().year)) 当我

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

当我在
=

import datetime
years=[x for x in range(2015,datetime.datetime.now().year)]
当我打印(年)时,它给出输出
[2015201620172018]

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

years=(x代表范围内的x(1940,datetime.datetime.now().year))

当我打印它时,它会给出输出


我不明白为什么会这样,谁能解释一下。谢谢

这是两种不同但相关的结构

[x for x in range(2015,datetime.datetime.now().year)]
被称为列表理解,而

(x for x in range(2015,datetime.datetime.now().year))
被称为生成器表达式


阅读更多信息,请访问以下解释:

  • 在圆括号中,它被称为生成器表达式,在这里你必须做
    list(..)
    使它成为一个列表,
    tuple(..)
    使它成为一个tuple,依此类推。。。更多关于

    生成器迭代器由yield关键字创建。它们与普通函数的真正区别在于收益率和收益率是函数体的出口点和入口点。这意味着,在每次yield调用之后,生成器不仅返回某些内容,而且还记住其状态。调用next()方法会将控制权带回在最后执行的yield语句之后启动的生成器。每个yield语句只执行一次,执行顺序与它在代码中出现的顺序相同。在执行了所有的yield语句之后,迭代结束

  • 有了方括号,它被称为列表理解,它会给出一个列表,因为方括号代表列表,更多的是

    列表理解遵循数学集合生成器表示法(集合理解)的形式,不同于使用map()和filter()函数


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

您需要将其包装在
list()
tuple()
中,以获得可编辑的输出

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


您可以阅读有关此问题的更多信息

生成器是可以动态暂停和恢复的函数,返回可以迭代的对象。与列表不同,它们是惰性的,因此每次只生成一个项目,并且只有在被请求时才生成。因此,在处理大型数据集时,它们的内存效率要高得多。 与列表理解一样,生成器也可以以相同的方式编写,只是它们返回的是生成器对象而不是列表:

>>> 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

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

以下是使用方括号的列表:

[thing for thing in things]
但您尝试使用的是括号,它是生成器理解而不是元组理解,因为括号是为生成器理解保留的,因此:

(thing for thing in things) 
将生成生成器迭代器,而不是元组。要获取元组迭代器,请按以下步骤使用:

tuple(thing for thing in things) 

这只是列表理解的语法,而不是生成器表达式的语法。