[Tutor] Questions about Functions

bob smith bobsmith327@hotmail.com
Tue Feb 18 22:20:02 2003


Thank you Jeff, Ike and Danny.  I appreciate all of your quick responses and 
great help.  I'm sure I'll be back with more questions soon.

Bob


>From: "Jeff Shannon" <jeff@ccvcorp.com>
>To: tutor@python.org
>CC: bob smith <bobsmith327@hotmail.com>
>Subject: Re: [Tutor] Questions about Functions
>Date: Tue, 18 Feb 2003 13:19:18 -0800
>
>
>bob smith wrote:
>
>>Hi. Im learning Python and like it very much so far, but I have some 
>>questions when it comes to functions.
>>
>>Question #1
>>--------------
>>Whats wrong with passing a variable to a function that receives it with 
>>the same name?
>
>
>The only problem here is that it's possible that you'll lose track of the 
>fact that they are, in fact, two separate variables. You might, for 
>instance, change 'value' in your function, and then be surprised by the 
>fact that the global 'value' is not updated. But if it's clear in your mind 
>that when you're inside a function, you're in a whole different world 
>(well, different namespace), then there's no problem. (At least, no problem 
>until someone *else* goes to modify your code and gets surprised by 
>this...) But this is strictly a programmer-psychology issue, and not a 
>technical issue.
>
>>Question #2
>>--------------
>>Is it considered bad programming to access (and only access) global 
>>variables in functions, thus treating them as global constants?
>
>
>The problem here is that functions (ideally) should be able to operate 
>identically in a variety of contexts, and thus functions should be as 
>self-contained as possible. If your function relies on global constants, 
>and then you have another module that needs the same function, you have to 
>ensure that all the same global constants are set up in that other module.
>
>>Since I cant assign a new value to CONSTANT in func(), does this mean 
>>that Python encourages the use of global constants used like this?
>
>
>You *can* actually assign a new value to CONSTANT -- except that it creates 
>a new local variable that shadows your global constant, with potentially 
>confusing results.
>
>>It seems like a good idea to me, (especially if CONSTANT is needed in 
>>other functions in the program) but you hear the mantra dont use global 
>>variables so much that Im not sure if this is considered poor 
>>programming.
>
>
>Here's the rub -- using constants like this *is* a very useful thing, and 
>sometimes it really is the best option. Certainly using global constants is 
>a lot less hazardous than using global "normal" variables, and as you say, 
>if the constant is needed in a wide variety of places, a global constant is 
>probably better than a dozen local constants (which would be a nightmare to 
>keep in sync if the value needs tweaked). In programs that are large enough 
>to have this issue, I'll usually create a separate constants.py that does 
>nothing but define these constants. Then, every other module that needs to 
>use the constants can 'import constants; print constants.CONSTANT' or 
>equivalent. This gives me the practical value of having global constants 
>available, but still keeps them (relatively) isolated in their own 
>playground.
>
>>Question #3
>>--------------
>>If you know your program is not going to be imported (only run as a 
>>stand-alone program) do you ever need to consider having this kind of 
>>thing:
>>
>>if __name__ == __main__: main()
>
>
>If you're absolutely positive that your script will never be used as a 
>module somewhere else, then this isn't necessary. The catch is that it 
>often happens that a function that you once thought would never be needed 
>elsewhere will suddenly become a quick solution to a new problem elsewhere, 
>and you'll find yourself wanting to import that "only ever stand-alone" 
>program.
>
>The other point here is that this convention supports a design practice. 
>When I'm writing a program, I mentally break the problem down into little 
>pieces, and then I start writing a series of functions (or a set of 
>classes) that'll solve each of those pieces. Once I have the low-level 
>problems solved, I start tying those bits together with higher-level 
>functions, until I have something like a main() function that solves the 
>whole problem. So the 'if __name__ == __main__:' convention fits well 
>with the way that I work. If I were to approach a problem with the thought 
>of *not* using this convention, then I'd be tempted to write a much more 
>linear program (as opposed to a small heirarchy of classes and functions). 
>This is fine for very small scripts, usually, but becomes increasingly 
>difficult to follow as the size of the program grows. And, of course, even 
>very small programs have a tendency to grow in size and complexity... so it 
>seems best to start off in the right direction to begin with.
>
>Hope this makes a few things more clear.
>
>Jeff Shannon
>Technician/Programmer
>Credit International
>
>
>
>_______________________________________________
>Tutor maillist  -  Tutor@python.org
>http://mail.python.org/mailman/listinfo/tutor


_________________________________________________________________
MSN 8 helps eliminate e-mail viruses. Get 2 months FREE*.  
http://join.msn.com/?page=features/virus