Python3.5元组理解真的受到限制吗? - python

我一直很喜欢添加到Python3.5的元组理解:

In [128]: *(x for x in range(5)),
Out[128]: (0, 1, 2, 3, 4)

但是,当我尝试直接return元组理解时,会出现错误:

In [133]: def testFunc():
     ...:     return *(x for x in range(5)),
     ...: 
  File "<ipython-input-133-e6dd0ba638b7>", line 2
    return *(x for x in range(5)),
           ^
SyntaxError: invalid syntax    

这只是一个小麻烦,因为我可以简单地将元组理解分配给变量并返回该变量。但是,如果我尝试将元组理解放入字典理解中,则会遇到相同的错误:

In [130]: {idx: *(x for x in range(5)), for idx in range(5)}
  File "<ipython-input-130-3e9a3eee879c>", line 1
    {idx: *(x for x in range(5)), for idx in range(5)}
          ^
SyntaxError: invalid syntax

我觉得这有点问题,因为在某些情况下理解对于表现很重要。

在这些情况下,使用字典和列表推导毫无疑问。在其他情况下,元组理解又有多少其他情况不起作用?还是我用错了?

这让我想知道如果使用范围太有限或者我做错了什么呢?如果我没有做错什么,那么创建元组的通用性最快的/最Python方式是什么,以与列表和字典理解相同的方式使用?

参考方案

TLDR:如果要使用元组,请将生成器表达式传递给tuple

{idx: tuple(x for x in range(5)) for idx in range(5)}

Python中没有“元组理解”。这个:

x for x in range(5)

是一个生成器表达式。在其周围添加括号仅用于将其与其他元素分开。这与(a + b) * c中的相同,后者也不涉及元组。

*符号用于迭代器打包/拆包。生成器表达式恰好是可迭代的,因此可以解压缩。但是,必须有一些东西可以将迭代器解包。例如,还可以将列表解压缩到分配的元素中:

*[1, 2]                         # illegal - nothing to unpack into
a, b, c, d = *[1, 2], 3, 4      # legal - unpack into assignment tuple

现在,执行*<iterable>,*解包与,元组文字结合起来。不过,这并非在所有情况下都可用-分隔元素可能优先于创建元组。例如,,中的最后一个[*(1, 2), 3]分开,而在[(*(1, 2), 3)]中则创建一个元组。

在字典中,,含糊不清,因为它用于分隔元素。比较{1: 1, 2: 2}并注意{1: 2,3}是非法的。对于return语句,它为might be possible in the future。

如果您想要一个元组,只要有歧义,就应该使用()-即使Python可以处理它,否则很难为人类解析。

当您的源代码是一个大型语句(例如生成器表达式)时,建议您显式转换为元组。比较以下两个有效版本的代码以提高可读性:

{idx: tuple(x for x in range(5)) for idx in range(5)}
{idx: (*(x for x in range(5)),) for idx in range(5)}

注意list和dict的理解也很相似-实际上就像将生成器表达式传递给listsetdict一样。它们主要用来避免在全局名称空间中查找listsetdict

我觉得这有点问题,因为在某些情况下理解对于表现很重要。

在幕后,生成器表达式和列表/字典/集合推论都创建了一个短暂的函数。除非已对它们进行了概要分析和测试,否则您不应该依赖于理解来进行性能优化。默认情况下,请使用您的用例中最易读的内容。

dis.dis("""[a for a in (1, 2, 3)]""")
  1           0 LOAD_CONST               0 (<code object <listcomp> at 0x10f730ed0, file "<dis>", line 1>)
              2 LOAD_CONST               1 ('<listcomp>')
              4 MAKE_FUNCTION            0
              6 LOAD_CONST               5 ((1, 2, 3))
              8 GET_ITER
             10 CALL_FUNCTION            1
             12 RETURN_VALUE

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

Python uuid4,如何限制唯一字符的长度 - python

在Python中,我正在使用uuid4()方法创建唯一的字符集。但是我找不到将其限制为10或8个字符的方法。有什么办法吗?uuid4()ffc69c1b-9d87-4c19-8dac-c09ca857e3fc谢谢。 参考方案 尝试:x = uuid4() str(x)[:8] 输出:"ffc69c1b" Is there a way to…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

python:ConfigParser对象,然后再阅读一次 - python

场景:我有一个配置文件,其中包含要执行的自动化测试的列表。这些测试是长期循环执行的。   配置文件的设计方式使ConfigParser可以读取它。由于有两个三个参数,因此我需要通过每个测试。现在,此配置文件由script(s1)调用,并且按照配置文件中的列表执行测试。Script(s1)第一次读取配置,并且在每次测试完成后都会执行。阅读两次的要求:由于可能会…

Python exchangelib在子文件夹中读取邮件 - python

我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…