Python 以下哪种for循环更有效/更好地编码循环

Python 以下哪种for循环更有效/更好地编码循环,python,Python,在python中,这两个for循环中哪一个更好?我“假设”编译器足够聪明,只需执行一次json.loads,并自行将数据存储在一个临时变量中,以便它能够维护处理for循环所需的迭代器。但后来我开始怀疑我是否弄错了,第一种风格会导致不必要的额外步骤 for employee in json.loads(response.content) 或 从以下几点可以相当清楚地看出: 表达式列表计算一次 因此,您的担心是没有根据的,第一种方法更可取,除非您想再次重用数据或将其写入for行会使该行太长。尽管两

在python中,这两个for循环中哪一个更好?我“假设”编译器足够聪明,只需执行一次json.loads,并自行将数据存储在一个临时变量中,以便它能够维护处理for循环所需的迭代器。但后来我开始怀疑我是否弄错了,第一种风格会导致不必要的额外步骤

for employee in json.loads(response.content)

从以下几点可以相当清楚地看出:

表达式列表计算一次


因此,您的担心是没有根据的,第一种方法更可取,除非您想再次重用数据或将其写入
for
行会使该行太长。

尽管两者基本相同,有一个很好的理由支持使用临时值:它可以让您在尝试迭代结果之前捕获对
json.loads
的调用中的任何错误。这与将代码尽可能集中在
try
语句中是一致的

try:
    employees = json.loads(response.content)
except JSONDecodeError:
    # Maybe log an error message
    # Maybe just reraise the exception
    employees = []

for employee in employees:
    ...

它们实际上是一样的。当然,在第二种情况下,加载内容的引用计数将保持在1(尽管,如果它在函数中并且函数终止,则会降至0)。无论如何,我认为您担心的是,
json.load
在循环的每次迭代中都会被调用。当然不是。这不仅仅是“足够聪明”的问题。这是语言所要求的。实际上,如果我不止一次需要检查或使用
temp
的内容,我只会使用第二个选项。您定义的“更好的方法”是什么?
for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]
try:
    employees = json.loads(response.content)
except JSONDecodeError:
    # Maybe log an error message
    # Maybe just reraise the exception
    employees = []

for employee in employees:
    ...