我很难理解Python中的循环。 我在Javascript(Modolus 11测试)中有以下代码我想转换为Python:
var secNumber = this.dob + lastDigits;
var factors = [4, 3, 2, 7, 6, 5, 4, 3, 2, 1];
for (var i = 0, sum = 0; i < factors.length; i++) {
sum += secNumber.substring(i, i + 1) * factors[i];
}
// modulus 11 test
return sum % 11 !== 0 ? false : true;
Python等价物是什么?
答案 0 :(得分:4)
Python使用for each loops,因此迭代数字会要求您首先生成一系列数字。 Python使用range()
type:
sum = 0
for i in range(len(factors)):
pass
请注意sum
已明确指定0
。
通常但是,你只是直接循环对象,而不是生成索引:
sum = 0
for element in factors:
pass
但如果要总结这些因素,只需使用sum()
function:
total = sum(factors)
请注意,我避免在那里使用名称sum
来避免屏蔽内置函数。
要从字节序列中乘以字节,只需将zip()
字节和因子放在一起:
sum = 0
for byte, factor in zip(string, factors):
sum += byte * factor
可以使用sum()
和生成器表达式折叠:
total = sum(byte * factor for byte, factor in zip(string, factors))
仅当string
为bytes
object而非Unicode str
string object时才有效; bytes
个对象实际上是0-255范围内的整数序列。
如果您想将字符解释为 digits ,请使用Unicode字符串并使用int()
将每个字符转换为整数:
total = sum(int(digit) * factor for digit, factor in zip(string, factors))
使用您提供的样本输入演示后者:
>>> sec_number = '0411994545'
>>> factors = [4, 3, 2, 7, 6, 5, 4, 3, 2, 1]
>>> sum(int(digit) * factor for digit, factor in zip(string, factors))
164
>>> total = sum(int(digit) * factor for digit, factor in zip(string, factors))
>>> total % 11 == 0
False
注意==
测试已经产生了一个布尔值;没有必要在Python中使用条件表达式来生成布尔结果。
答案 1 :(得分:2)
在python中阅读有关for的文档:
for i in range(len(factors)):
# do stuff
注意:索引从0开始,少结束一次
演示:
>>> [x for x in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
我认为这就是你想要的:
>>> s="0411994545"
>>> f="1234567894"
>>> sum([int(x)*int(y) for x,y in zip(s,f)])
238
>>> sum([int(s[i])*int(f[i]) for i in range(len(s))])
238
答案 2 :(得分:2)
ssum = sum(int(x) * y for (x, y) in zip(S, factors))
答案 3 :(得分:1)
在Python中没有“传统的”for循环,但是有许多构造使得Python中的循环非常强大:
for i in range(0, 10):
print(str(i))
打印从0到9的整数,范围创建一个间隔为[low,high]的迭代器
for i in range(0, 10, 2):
print(str(i))
打印0,2,4,6,8因为步骤(第三个可选参数设置为2)。
您还可以列举您的因素:
for key, val in enumerate(factors):
pass
这会为您提供关键因素以及因子中每个元素的相应值。
如果您不需要钥匙,那么只需为您完成工作:
for val in factors:
# some stuff to do
这会迭代因子中的每个元素。
如果您需要检查特殊条件,可以使用break或continue:
for val in factors:
if val == 0:
continue # skips one iteration
elif val == 1:
break # cancels the whole loop
else
# do some stuff
答案 4 :(得分:1)
Python没有严格的循环C / Javascript样式,但更喜欢更简单的语法。
C / JS风格为:
var i=0, sum=0
i< factors.length
i++
sum += string.substring(i, i + 1) * factors[i]
pythonic for循环只有一个变量和一个列表或可迭代的任务,如下所示:
mysum = 0
for i in range(length):
mysum += int(strings[i])*factors[i]
其中range(length)是一个内置函数,扩展为[0,1,2,3,..,length-1] 并且任务包括冒号后面的缩进块
在JS中,字符串和数字类型会自动转换(即使你不想要它),但在Python中却不是这样。 int()
转换为整数,float()
转换为浮点数。