On 05/11/2013 04:44 PM, Daniel Magruder wrote:
Dear Tutor at Python.org,
I am new to the python language and have been teaching myself through various 
online resources. I found an exercise where I am to create a program that 
prints a list of the first 1000 prime numbers. After many attempts and looking 
at other answers for other ways around the problem (which I did not 
understand), I am seeking your guidance.
Here is what I have so far. While I understand there are many ways to do this, 
I would like advice on how to finish this program based on the initial path I 
started out on.

def counting_primes():
        primelist = [] # I want a list of 1000 primes
        prime = f(0) # so that when I divid I get a true non int answer
        x = 1 # to test and make sure no other number goes into prime besides 
prime and one
        while len(primelist)<1000: # start a loop for as long as my list is not 
1000 items in length
                if prime % x == num and x < prime:
                        x = x + 1  # keep the dividing loop going until  x and 
prime are equal
                        if prime % x == 0: and prime != x: # if prime is not 
yet a prime number i.e. 8 and x is a number like 4, this prevents false 
positives
                                x= x+1
                                if prime = x:
                                        primelist = primelist + x # add x to my 
list of primes
                                        prime = prime + 1 # check to see if 
next number is prime

        return primelist

Please walk me through any logical errors, I really want to understand this.

First you have to add a top-level call to this function. Otherwise the program does nothing useful.

myprimes = counting_primes()
print len(myprimes)  #how many did we find ?
print myprimes[:10]  #what are the first ten ?

Then you have to eliminate your two syntax errors. There's only one colon in an if statement, and it's at the end. And you cannot use = for comparison, that's what == is for.,

Then you have to eliminate the references to undefined functions and variables. There's no f() defined in your code, and all you want is 0, so simply set prime = 0, not f(0). Actually, you probably want to set prime to 2, as zero and 1 could be problematic. Once it works, you may want to see if you could start at 1 instead. You have no num defined in your code, so you'll have to decide what was actually intended there.

You now have a function which never returns, but at least it executes.

You have one loop which will only exit when the size of primelist reaches 1000, and inside it, logic will will not add to that length. You don't have the necessary loop inside this one to test the candidate.

If I were you, I'd break this code into two functions. The first one will check a given number to see if it is prime, and return True or False. The second one will repeatedly call the first on successively higher numbers till it has enough. As it stands now, you have far too much logic incrementing x and prime, and nothing that resets x back to 2 for the next iteration.

So the two functions, in pseudocode, should be something like:

def testprime(candidate)
check all ints between 2 and candidate, and return true if any of them divide the candidate evenly
    Otherwise return false

def counting_primes()
build a list of primes, where a number is put in the list if testprime() confirms that it is prime.
    return the list once it's big enough


It's actually easier to write two functions this way than to get the logic right for the nested loops that you otherwise need.

Note that testprime() can use a for-loop, it needn't look like transliterated Fortran.


--
DaveA
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to