[Tutor] Making a Primary Number List generator
Daniel Magruder
dsm3 at att.net
Tue May 14 01:01:51 CEST 2013
Dear Dave,
I am using python 2.
I am still confused as what return does. What does it mean if a function returns True to the caller? What is the caller?
Your code worked for returning a list of 1000 items of odd numbers, so I then tried writing a code to replay isodd to give True or False for isprime. However,
> def isodd(candidate):
> if candidate%2 ==0:
> return False
> else:
> return True
The meaning of this I am still confused about. What does it mean if the value is returned as false if it has 0 remainder, what does it mean if it is returned as true? Is this like a dictionary with keys and values?
Also, here is my new code, which still does not work. I have no idea why not, and am getting very frustrated by the fact that making a program that determines if a number is prime or not is so hard for me. I would appreciate any assistance, and a verbal walk through of how to logically determine if a number is prime.
def isprime(x):
test=2
numberinquestion = x
while test < numberinquestion:
if numberinquestion % test == 0:
test += 1
return False
elif numberinquestion / test == int:
test += 1
return False
if test == numberinquestion:
return True
def counting_primes():
prime = 2
primelist=[]
while len(primelist) < 1000:
if isprime(prime):
primelist.append(prime)
prime += 1
return primelist
Sincerely,
Dan
On May 12, 2013, at 6:43 AM, Dave Angel <davea at davea.name> wrote:
> On 05/11/2013 09:58 PM, Daniel Magruder wrote:
>
> Please respond to the list, not the individual. Otherwise you're robbing yourself and others of the possibility of learning from and helping multiple people. I don't mind if you ALSO reply to me (which is what reply-all does by default), but many people do object. In Thunderbird, you normally just do Reply-list, and it does the right thing. But with other email programs, you might do reply-all, and remove whichever recipients you don't need.
>
>> Dear Dave,
>> I can't tell you how much I appreciate your assistance, however as a novice I doubt my ability to crawl. I sincerely envy your depth of understanding about this and in trying to learning would really benefit if you could please expound on a few notions.
>> Why must I top-level call? What is that actually? Several of the sources I have seen like learnpython.org suggest that def function(): is sufficient...
>
> A function is defined by a def, but a program that never calls any of them will do nothing at all (except look for syntax errors and the like). There are probably tens of thousands of defined functions in the library, but running python will only execute the ones you call.
>
> Typically at the bottom of every script there needs to be at least one function call that gets things started. (Unless the script is so trivial that it's written without using any functions). But in either case, some top-level code is needed.
>
> That top-level code can be as simple as a single call, or it might define a few variables, and then make the call(s).
>
>> I thought I had to define prime as f(0) so that it would be a float, not an integer division. Am I wrong? I am so utterly confused.
>
> I'm afraid you're wrong in a couple of points. There's no such function as f() in the standard library. If you wanted to define a literal float, you could either use 0.0, or use float(0). But you do not want a float there, everything can be done with ints.
>
>> In many sample codes I have seen num or int seem to be short hand for anything that is a number, because I though I was dividing and would receive a float remainder for non-prime numbers, I wan't to use that as a test.
>
> int and float are types (and act like functions), and if you needed to check the type of an object, you'd use isinstance(myvar, int) or isinstance(myvar, float). You can't just do a comparison with int. But dividing two ints will give an int in Python 2.x and will give a float in Python 3.x. And that's regardless of whether it comes out even or not. Which version of Python are you using?
>
> Fortunately, there's a much better way of telling if an int can be divided by another int: The modulo operator, represented by a "%" symbol.
>
> prime%n will give the remainder, and if it's zero, you know that prime is evenly divisible by n (and therefore isn't prime).
>
>
>> For your suggestion:
>>> def testprime(candidate)
>>> check all ints between 2 and candidate, and return true if any of them divide the candidate evenly
>> I don't mean to be so dependent, but how would I do this? Also what is the difference between return and print?
>>> Otherwise return false
>>>
>
> The return statement is the way a function returns a value to its caller. Let's suppose you wanted a function that returned true if its int argument was odd. You could do it like this:
>
> def isodd(candidate):
> if candidate%2 ==0:
> return False
> else:
> return True
>
> Now, the body of that function could be done in one line, but I wanted to illustrate the returning of useful values, and also the possibility that the return might not be at the end, and that there might be more than one place the function returns.
>
> Why not get the other function to call this one temporarily, and see if you can make the program find the first 1000 odd numbers instead. Then you can come back to the testprime() function and see if you can create one that returns True for primes, and False for anything else. Clearly that function will need a loop.
>
>>> def counting_primes()
>>> build a list of primes, where a number is put in the list if testprime() confirms that it is prime.
>> Again, how would I do this, so if I had something that told me a number was prime, how would I take that prime and put it in a list if the function is on loop?
>>> return the list once it's big enough
>
> You're already doing that in the code you showed. You initialized the primelist, then started a while loop. The difference I'm suggesting is that instead of dealing with x in this function, you defer that to the testprime() function. So your loop would call testprime() and conditionally append the value prime to the primelist.
>
> def counting_primes():
> primelist=[]
> prime = 2
> while len(primelist) < 1000:
> if isodd(prime):
> primelist.append(prime)
> prime += 1
> return primelist
>
>> Despite going to many sources I can not seem to find a single source that adequately explains Python 100% without any technical jargon or assumptions of prior knowledge. What I mean by this, is that I now have the gist of the utmost basics, but I would say my understanding is befuddled. Furthermore if I were to attempt to write code (such as this exercise) I am completely lost. What do you recommend for a good source to learn Python? I have tried MIT open course ware, but again even their intro explains the obvious, but not how to use it collectively.
>> Sincerely,
>> Dan
>>
>>
>
> With no experience in programming other languages, you'd need a different kind of tutorial than I sought when I was learning Python. And you absolutely need to match your tutorial against the version of Python you're running on your machine. 2.x and 3.x aren't VERY different, but there were enough changes that you don't want to be dealing with that while learning initially.
>
> Anybody else want to recommend a tutorial for someone who has no programming experience in other languages?
>
> --
> DaveA
>
More information about the Tutor
mailing list