2012-11-09 84 views
1

我試圖在這裏,但它不能打印長的數字像這樣如何從1-9999打印數字?

for i in range(1,222222222222222): 
    print i 

錯誤:

Traceback (most recent call last): 
    File "x.py", line 1, in <module> 
    for i in range(1,222222222222222): 
MemoryError 
+16

9999!= 222222222222222.你知道嗎? –

+2

@RohitJain這個微小的差異可以在戰鬥中避開讀者的注意。 – 2012-11-09 10:16:35

+0

@Tichodroma ..大聲笑。嗯你是對的。 ;) –

回答

4

使用的xrange而不是範圍。 範圍生成一個列表,將其存儲在內存中並對每個項目執行循環。這在處理相當大的數字時會產生內存錯誤。

x範圍是發電機不是一個名單,是動態創建的項目,因此它不會對內存

傷害我希望這有助於

10

使用xrange

for i in xrange(1, 222222222222222): 
    print i 

This function is very similar to range(), but returns an 「xrange object」 instead of a list. This is an opaque sequence type which yields the same values as the corresponding list, without actually storing them all simultaneously.

+3

'的xrange(222222222222222)'會引發'Overflow'錯誤。 –

1

Python中,你開始循環之前,產生了巨大的內存使用/ OOM錯誤的產生量的範圍內。

你最好使用xrange,它分配小塊的範圍。

for i in xrange(from, to): 
    print i 
2

改爲使用xrange。範圍函數實際上在內存中構造列表,而xrange返回一個生成器(類似於迭代器),並且一次只返回一個數字。

for i in xrange(1,222222222222222L): 
    print i 

查看更多關於該主題here

-1

檢查while循環

a = 0 
while a < 10 : 
    a += 1 
    print (a) 

您也可以使用做同樣的 「For循環」 這個例子

onetoten = range(1,11) 
for count in onetoten: 
    print (count) 
+1

這不是非常pythonic。 – 2012-11-09 10:17:21

+2

的questionner抱怨'範圍()'不是適合他的目的和你建議使用'範圍()'呢?有趣。 – glglgl

+2

@glglgl'的xrange()'可能不適合這麼大的INT'222222222222222',它提出了'OverFlowError'我的32位系統上運行,請參閱[這裏](http://stackoverflow.com/questions/2187135/range-和-xrange-for-13-digit-numbers-in-python),所以'while-loop'可能是一個更好的解決方案。 –

4

您可能正在使用Python2,其中range()產生一個數字列表。包含222222222222222元素的列表非常大,對於大多數RAM來說太大。

與此相反,xrange()產生一個xrange對象,它可以像列表一樣訪問(索引,迭代),但不會佔用太多的空間,因爲這些值是按需計算的。

在Python3中,range()返回的範圍對象與2.x中的xrange對象非常相似。

0

你也可以自己創建發電機using yield

def my_gen(start, end, step): 
    while start < end: 
     start += step 
     yield start 

for x in my_gen(1, 1000, 2): 
    print x