我缺乏Python经验,并从Python 3.4开始。
我在loop idioms上阅读了Python 3.x文档,并且没有找到构建熟悉的C-family for-loop 的方法,即
for x in iterable: # e.g. range, itertools.count, generator functions
pass;
在Python中编写 for -loop这样的设计似乎完全不可能。有谁知道Python迭代序列遵循像
这样的模式的原因change
这是否更有效,更方便,或减少索引超出范围的异常?
答案 0 :(得分:7)
for lower <= var < upper:
对于C风格的循环,这是the proposed syntax。我说&#34;是提议的语法&#34;,因为PEP 284被拒绝,因为:
具体来说,Guido没有购买范围()格式需要修复的前提,&#34;范围()的整点(15年前)是*避免*需要语法来指定数字循环。我认为它运行良好,并且没有什么需要修复的(除了range()需要成为迭代器,它将在Python 3.0中)。&#34;
所以我们没有for lower <= var < upper:
。
现在,如何获得C风格的循环?好吧,你可以使用range([start,]end[,step])
。
for i in range(0,len(blah),3):
blah[i] += merp #alters every third element of blah
#step defaults to 1 if left off
如果您需要索引和值,则可以enumerate
:
for i,j in enumerate(blah):
merp[j].append(i)
如果你想要看两个(或更多!)迭代器,你可以zip
它们(另外:itertools.izip
和itertools.izip_longest
)
for i,j in zip(foo,bar):
if i == j: print("Scooby-Doo!")
最后,总是while
循环
i = 0
while i < upper:
A[i] = b
i++
附录:还有PEP 276,它建议使int
可迭代,但也被拒绝。仍然是半开的
答案 1 :(得分:5)
range(n)
产生一个合适的可迭代:)
for i in range(n):
A[i] = value
对于更一般的情况(不仅仅是计数),你应该转换为while循环。例如
i = 0
while i < n:
A[i] = value
i += 1
答案 2 :(得分:5)
foreach风格的循环现在在大多数语言中都很常见,因为您很少需要访问集合的索引,更常见的是您只需要对象本身。此外,可以使用与随机可访问集合完全相同的语法来迭代将需要迭代器的元素,因为它们不是随机访问(例如,集合)。
在python中,迭代时访问索引的正确方法应该是:
for i, x in enumerate(iterable):
此时,i
是您的索引,x
是iterable[i]
的项目。
答案 3 :(得分:2)
您想要查看使用range()函数。
for i in range(n):
A[i] = value
该函数可以用作范围(n),它返回整数0 - n的列表,或者作为范围(开始,结束),它将从起始值返回到结束值的整数。例如:
range(1, 5)
会给你1号,2号,3号,4号和5号。
答案 4 :(得分:2)
首先,python有几种方法来执行 C style for loops ,其中有两个最常见的存在(你在帖子中提到的第一个,即使用范围返回的生成器对象):< / p>
for i in range(some_end_value):
print(i)
# or the many times preferred
for i, elem in enumerate(some_list):
print("i is at {0} and the value is {1}".format(i, elem))
至于为什么python以这种方式设置,我认为这已经成为设置foreach风格循环的一种更方便和首选的方式 - 特别是因为语言已经摆脱了用最大索引定义数组/列表的需要。例如,在java中,也可以:
for (int i: someArray) {
system.out.println(i) // which would print the current item of an integer array
}
c#(foreach (int i in someArray)
)和c++(for (auto &i: int)
)也有自己的foreach循环。在c中,大多数人倾向于编写宏来获取foreach循环的功能。
它只是访问动态数组,列表,dicts和其他结构的便捷方式。虽然while循环可以用于必须修改迭代器本身的活动 - 或者只是可以使用迭代器以数学方式创建和修改第二个变量。
答案 5 :(得分:2)
Python是一种比C更高级的语言,迭代高级抽象,如'sequence'更自然,更安全地表达另一个 - 'iterator'。 C并没有真正具有这样的抽象,因此用低级“手动”索引或指针增量来表达大多数遍历并不奇怪。然而,这是C的低级特性的工件 - 对于更高级别的抽象来说,将它用作所有循环结构的主要构建块并且大多数(不仅仅是Python)不会这样做是愚蠢的。
答案 6 :(得分:2)
在python中使用C风格的循环的理想方法是使用范围。没有多少人知道range(stop)的重载函数,它接受start,stop和step参数,其中step是可选的。有了这个,你几乎可以用C风格的for循环做任何事情:
range(start, stop[, step])
for (i = 0; i < 10; i++)
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for (i = 1; i < 11; i++)
>>> range(1, 11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for (i = 0; i < 30; i=i+5)
>>> range(0, 30, 5)
[0, 5, 10, 15, 20, 25]
for (i = 0; i < 10; i=i+3)
>>> range(0, 10, 3)
[0, 3, 6, 9]
for (i = 0; i > -10; i--)
>>> range(0, -10, -1)
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
答案 7 :(得分:1)
相当于C-loop:
library(rCharts)
temp <- data.frame(x = 1:100, y = 1:100, z = c(rep(1,50), rep(0,50)))
g <- nPlot(y ~ x, group = "z", data = temp, type = "lineChart")
g$templates$script <- "http://timelyportfolio.github.io/rCharts_nvd3_templates/chartWithTitle_styled.html"
g$set(title = "Example")
g$chart(transitionDuration = -1,
tooltipContent = "#! function(key, x, y) {
return 'z: ' + key + '<br/>' + 'x: ' + x + '<br/>' + 'y: ' + y
}!#",
showLegend = FALSE, margin = list(left = 200,
right = 100,
bottom = 100,
top = 100))
g$xAxis(axisLabel = "x")
g$yAxis(axisLabel = "y", width = 40)
g
即,如果for (i = 0; i < n; i++) A[i] = value;
是A
数组,则将数组中的所有项设置为相同的值:
numpy
或者如果A[:] = value
那么
len(A) > n
如果要创建包含A[:n] = value
值的Python列表:
n
您还可以替换现有列表中的值:
A = [value] * n #NOTE: all items refer to the *same* object
或者没有创建临时列表:
A[:n] = [value]*n #NOTE: it may grow if necessary
使用值时使用相应索引枚举所有值的pythonic方法:
for i in range(n): A[i] = value
也可以使用列表解析来编写代码:
for index, item in enumerate(A):
A[index] = item * item
不要尝试在Python中编写C语言。