替代标准C“for”; [英] Alternative to standard C "for"
问题描述
你好,
我对Python很陌生,并且有一个直接的&简单的问题。
在C中,有(init; cond; advance)。我们都知道。
在Python中有两种循环方式i = A..B(数字。):
1)i = A
而我< B:
......做点什么...
i + = STEP
2)for i in range (A,B,STEP):
...做点什么...
第一个案子看起来很讨厌,因为它更复杂
东西,不是数字循环。第二个是非常好的,但有一个问题,那就是b $ b问题。如果我做..范围(1,100000000)..(我真的需要
有时),它需要几百兆的内存并减慢
下来。这个简单问题还有其他好的方法吗?发电机?
Adomas
Hi there,
I am quite new to Python, and have a straight & simple question.
In C, there is for (init; cond; advance). We all know that.
In Python there are two ways to loop over i=A..B (numerical.):
1) i = A
while i<B:
...do something...
i+=STEP
2) for i in range(A, B, STEP):
...do something...
First case looks quite nasty, because it''s for more complicated
things, not numerical loops. Second is very nice, but with there''s
problem. If i do ..in range(1, 100000000).. (what I really need
sometimes), it takes few hundred megs of memory and slows
down. Are there other good ways for this simple problem? Generators?
Adomas
推荐答案
广告****************** @ gmail.com 写道:
问题。如果我做..在范围内(1,100000000)..(有时我真正需要的是什么),它需要几百兆的内存并且慢下来。这个简单问题还有其他好的方法吗?发生器?
problem. If i do ..in range(1, 100000000).. (what I really need
sometimes), it takes few hundred megs of memory and slows
down. Are there other good ways for this simple problem? Generators?
使用xrange而不是range。
use xrange instead of range.
>我是Python的新手,并且有一个直接的&简单的问题。
> I am quite new to Python, and have a straight & simple question.
在C中,有(init; cond; advance)。我们都知道。
在Python中有两种方法可以循环i = A..B(数字。):
1)i = A
而i< B:
......做点什么......
我+ = STEP
In C, there is for (init; cond; advance). We all know that.
In Python there are two ways to loop over i=A..B (numerical.):
1) i = A
while i<B:
...do something...
i+=STEP
这确实很难看。你很少需要在Python中使用这样的循环和
,并且有些人认为你可以经常将C等价翻译为
更多pythonic。正如你猜测的那样,你的第二个问题是最好用生成器函数解决
- xrange()。它完全等于
range(),除了它返回一个生成器而不是一个列表。
-
mvh Bj?rn
This is indeed quite ugly. You rarely need such loops in Python and
with some thinking you can often translate the C-equivalent to
something more pythonic. As you guessed, your second problem is best
solved with a generator function - xrange(). It is completely equal to
range() except that it returns a generator instead of a list.
--
mvh Bj?rn
ad *** ***************@gmail.com 写道:
还有其他好方法可以解决这个简单问题吗?发生器?
Are there other good ways for this simple problem? Generators?
非常有趣的问题:)从来没有发生在我身上。
防止python将整个列表加载到内存,一个
可以,正如你的建议,使用一个生成器:
Very interesting problem :) That never occured to me.
To prevent python from loading that entire list into memory, one
could, as you suggested, use a generator:
def genrange(start,stop,step = 1):
while start<停止:
收益率开始
开始+ =步骤
for x in range(5):
print"%s" ; %str(x),
0 1 2 3 4
for gen in genrange(0,5):
def genrange( start , stop , step = 1 ): while start < stop:
yield start
start += step
for x in range( 5 ): print "%s " % str( x ),
0 1 2 3 4
for x in genrange( 0 , 5 ):
print"%s" %str(x),
0 1 2 3 4
-
Daniel Bickett >
dbickett at gmail.com
http://heureusement.org/
这篇关于替代标准C“for”;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!