我目前遇到了一个问题: 我想处理非常有效地将字符串添加到其他字符串,所以我查找了许多方法和技术,并且我想出了“最快”的方法。 但我完全不明白它是如何运作的:
def method6():
return ''.join([`num` for num in xrange(loop_count)])
特别是([`num` for num in xrange(loop_count)])
完全迷惑了我。
答案 0 :(得分:6)
它是list comprehension,使用反引号进行repr
转换。不要这样做。在py3k中不推荐使用反引号并删除反引号,更高效和pythonic方式根本不是构建中间列表,而是使用生成器表达式:
''.join(str(num) for num in xrange(loop_count)) # use range in py3k
答案 1 :(得分:2)
括号中的这一位是列表理解,可以说是Python中最强大的元素之一。它从迭代中生成一个列表。您可能想查找其文档。使用反引号将num转换为字符串是不可取的 - 尝试使用str(num)或其他一些代替。
join()是字符串类的方法。它接受一个字符串列表并返回一个字符串,该字符串由每个由“self”(也称为调用字符串)分隔的组件字符串组成。这里的技巧是直接从字符串文字''调用join(),这在Python中是允许的。这段代码将产生一个字符串,该字符串由xrange(loop_count)的每个元素的字符串形式组成,没有分离。
答案 2 :(得分:2)
xrange()是range()的更快(用C语言编写)版本。
反引号表示法 - num
,将变量强制转换为字符串,与str(num)相同。
[x表示y]中的x被称为列表推导,基本上是一个单行循环,它返回一个列表作为结果。总而言之,您的代码在语义上等同于以下内容,但更快,因为列表推导和xrange
比for循环和range
更快:
z = []
for i in range(loop_count):
z.append(str(i))
return "".join(z)
答案 3 :(得分:1)
首先:虽然这段代码在2.x系列的Python中仍然是正确的,但它有点混乱,可以用不同的方式编写:
def method6a():
return ''.join(str(num) for num in xrange(loop_count))
在Python 2.x中,可以使用反引号代替repr函数。方括号[]内的表达式是列表理解。如果您不熟悉列表推导:它们的工作方式类似于循环和列表追加语句的组合,只是您不必为变量创建名称:
这两个是等价的:
a = [repr(num) for num in xrange(loop_count)]
# <=>
a = []
for num in xrange(loop_count):
a.append(repr(num))
因此,列表推导将包含从0到loop_count(独占)的所有数字的列表。
最后,string.join(iterable)
将使用string
的内容连接iterable
中的所有字符串,使用string
作为每个元素之间的分隔符。如果你使用空字符串作为分隔符,那么所有元素之间都没有任何连接 - 这正是你想要的:从0到loop_count的所有数字的串联。
至于我的修改:
str
代替repr
,因为所有整数的结果都相同,而且更容易阅读。通常,大多数Python程序员都很好地理解'.join(可迭代)习语是指“任何字符串列表的字符串连接”,因此可理解性应该不是问题。