> >> >>> for x in xrange(2**31): >> pass >> >>Traceback (most recent call last): >> File "<pyshell#16>", line 1, in <module> >> for x in xrange(2**31): >>OverflowError: long int too large to convert to int >
Here are the suggestions I've received: Danny's >################# >def myxrange(m, n=None, skip=1): > """An xrange-like function that can deal with long ints. > Note: doesn't deal with negative ranges particularly well.""" > if n is None: > m, n = 0, m > i = m > while i < n: > yield i > i = i + skip >################# Kent's Encapsulate the while loop in a generator: def count(limit): n=0 while n<limit: yield n n += 1 Andrei's Write your own iterator: >>> def hugerange(minval, maxval): ... val = minval ... while val < maxval: ... yield val ... val += 1 All 3 are essentially the same, aren't they. Which makes me feel even dumber, because I don't understand any of them. I've consulted 3 books, and still don't understand the use of yield. Let me show you what I was doing when I ran into the 2**31-1 limitation: <http://www.rcblue.com/Python/1histogram-5a-ForWeb.txt> This is one of my attempts to test the degree of uniformity of random(). The others are seeing how close the average random() return comes to 0.5, and using random() in an approximation of pi. I've realized now that all 3 scripts require an immense number of calls to random(), so many that I wouldn't be able to use my computer for anything else for weeks, maybe months. But be that as it may, I'd still like to know how to use yield in my 1histogram-5a. For your convenience, here's the list h, and the while loop I used: h = 100*[0] c = 0 while c < k: r = random() i = int(math.floor(100*r)) h[i] += 1 c += 1 So, for a random() return of 0.27862506717494118, i would be 27, and h[27] would be incremented by 1. Thanks, Dick _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor