良好的编码风格:使用临时变量列表长度与否?

时间:2013-12-19 20:29:32

标签: python

这个问题与python有关,但它实际上对很多语言都很常见。看看那段代码:

import sys
people = ['John', 'Jack', 'Charles']
cities = ['London', 'Liverpool', 'Manchester']
if (len(cities) != len(people)):
    print "Error! Length of cities list \
    (%s) differs from length of people list (%s)" % (len(cities), len(people))
    sys.exit(1)
for i in xrange (len(cities)):
    print "Hello, %s from %s" %(people[i], cities[i])

似乎正确。但是在这个小片段len被称为3到5次(如果列表长度相等则为3次,如果列表长度不同则为5次)。我们需要重写这样的代码吗?

import sys
people = ['John', 'Jack', 'Charles']
cities = ['London', 'Liverpool', 'Manchester']
people_count = len(people)
cities_count = len(cities)
if (cities_count != people_count):
    print "Error! Length of cities list \
    (%s) differs from length of people list (%s)" % (cities_count, people_count)
    sys.exit(1)
for i in xrange (cities_count):
    print "Hello, %s from %s" % (people[i], cities[i])

换句话说:在哪些情况下我们需要临时变量来存储列表长度,在哪些情况下不需要它?

4 个答案:

答案 0 :(得分:3)

我认为这属于不要重复自己:如果你想改变使用那个长度,你必须改变五件事,但如果你使用一个变量,它可能就是那个。

答案 1 :(得分:2)

如果你需要计算长度,你很可能做错了。在您的具体情况下,我会改为使用它:

for p, c in zip(people, cities):
    print "Hello, %s from %s" % (p, c)

但一般情况下,只要len(somelist)在同一列表的代码中出现两次,我就会将其粘贴到变量中。

答案 2 :(得分:1)

如果这就是你所要求的,它不会给你任何显着的性能提升。 len(列表) O(1),这意味着它与访问变量的速度相同。

从一个干净的代码,我相信重复len(城市)更清洁。

  1. 的字符数少于cities_count
  2. 它立即显示你在做什么。

答案 3 :(得分:0)

这听起来像是过早优化。如果频繁发生len()次调用,则值得将它们放在单独的变量中。否则,您可以将len()电话留在那里以便于编码。

另一方面,编码风格(或编码策略)更喜欢用于存储需要仅计算一次的工作的附加变量。在这种情况下,这样做不会有明显的性能提升,但这是一个不同的讨论。