0

循环变量应该是一个严格递减的自然数,由循环中的参数定义。我发现在 python 中有点困难,因为没有使用索引。例如,下面句子中的循环变体是什么?

P = [int(x) for x in list('{0:b}'.format(12))]
4

3 回答 3

1

它被称为list-comprehension.

你正在做的事情可以写成:

P = []
for x in list('{0:b}'.format(12)):
    P.append(int(x))

似乎代码将数字格式化12为二进制(1100),然后将每个字符转换为整数并添加到P.


您可以使用bin()内置功能更轻松地做到这一点:

>>> map(int, bin(12)[2:])  # in Python 3+ call list() on the map
[1, 1, 0, 0]

bin(12)[2:]"{0:b}".format(12)比- 时间快得多:

>>> timeit.Timer('bin(12)[2:]').repeat()
[0.19629462759158045, 0.15594946498989515, 0.1560687067152564]
>>> timeit.Timer('"{0:b}".format(12)').repeat()
[0.45589523752218497, 0.4375863126642727, 0.43800530974230867]
于 2013-11-13T11:18:19.727 回答
1

我认为您的定义过于严格;并非所有循环在它们编写的语言中都有数字循环变体,当然不一定是递减的。在您的示例中,x是一个循环变体,但不是您寻求的形式。

在幕后,字符串中有一个表示 12 的二进制形式的索引,它会在 0 到 3 之间变化。因此,就您链接的 Wikipedia 文章而言,循环变体将是一个从该索引中减去该索引的函数3.

于 2013-11-13T11:21:48.670 回答
1

为了理解你需要分解。

12的二进制表示

format允许您给出 12 的二进制表示:

>>> '{0:b}'.format(12)
'1100'

您也可以使用binbut '0b'is append 在开头:

>>> bin(12)
'0b1100'

但是,您可以写bin(12)[2:](如另一个答案中所建议)。

迭代字符串

您可以通过执行以下操作使用循环遍历字符串的每个字符:

for x in '1100':

x这个 for 循环中将采用字符串的连续字符:'1', '1', '0', '0'

列表理解

最后,[... for x in ...]是一个列表理解。这将使用 for 创建一个新列表。

[int(x) for x in '1100']

相当于:

list(map(int, '1100'))

和:

list(map(int, ['1', '1', '0', '0']))

或者:

l = []
for x in '1100':
    l.append(int(x))

循环变体?

您的问题实际上是:这里的循环变体是什么?

好吧,在 Python 中,for实际上更多的是foreach. 让我们举个例子for x in [3, 2, 10]。将依次x取值3和。210

如果我们想要一些接近 C 风格的 for 循环的东西:

// C for-loop:
for (int i = 0; i < 10; i++)

我们写:

# Python for-loop:
for i in range(10):

range(10)返回可迭代的内容,i并将采用 . 给出的连续值range

回到你的例子,没有“循环变体”,但如果你需要一个,你可以使用enumerate

for i, x in enumerate('1100'):
    print(i, x)

会给:

(0, '1')
(1, '1')
(2, '0')
(3, '0')
于 2013-11-13T11:22:51.600 回答