循环变量应该是一个严格递减的自然数,由循环中的参数定义。我发现在 python 中有点困难,因为没有使用索引。例如,下面句子中的循环变体是什么?
P = [int(x) for x in list('{0:b}'.format(12))]
它被称为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]
我认为您的定义过于严格;并非所有循环在它们编写的语言中都有数字循环变体,当然不一定是递减的。在您的示例中,x
是一个循环变体,但不是您寻求的形式。
在幕后,字符串中有一个表示 12 的二进制形式的索引,它会在 0 到 3 之间变化。因此,就您链接的 Wikipedia 文章而言,循环变体将是一个从该索引中减去该索引的函数3.
为了理解你需要分解。
format
允许您给出 12 的二进制表示:
>>> '{0:b}'.format(12)
'1100'
您也可以使用bin
but '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
和。2
10
如果我们想要一些接近 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')