[Tutor] Funtions, modules & global variables

Alan Gauld alan.gauld at btinternet.com
Mon Sep 26 02:35:43 CEST 2011


On 26/09/11 00:21, questions anon wrote:
> Hi All,
> I am trying to move from writing one long script each time I need to do
> a new thing but I do not quite understand how functions work, even after
> reading many manuals.

Can you be more specific about what you dpn;t understand.

For example can you understand how this function works?

def square(x):
     return x*x

If not what is the area of difficulty?

> My first attempt is to create a python file where I have defined a
> number of functions that get data in various ways.
> I have also made another python file where I want to plot the data in
> different ways. but I am having trouble getting that data to run in my
> python plotting file.

It may be easier to keep all the functions in a single file initially. 
It just eliminates an extra layer of complexity until we get things 
working. Once you know your functions work we can think about moving 
them into separate files.


> I have made the variable I require 'global' but that doesn't seem to be
> working. I keep receiving:
> /
> UnboundLocalError: local variable 'TSFC' referenced before assignment/

global in Python means global within the current file. It does not mean 
across all files.

>
> Below is a some of the script for both folder, just note that their will
> be many functions in each folder

I'm not sure I understand that bit. So I'll just ignore it for now! :-)


> #selectdata.py
> def selectalldata():
>          for (path, dirs, files) in os.walk(MainFolder):
>              for dir in dirs:
>                  print dir
>              path=path+'/'
>              for ncfile in files:
>                  if ncfile[-3:]=='.nc':
>                      print "dealing with ncfiles:", path+ncfile
>                      ncfile=os.path.join(path,ncfile)
>                      ncfile=Dataset(ncfile, 'r+', 'NETCDF4')
>                      global TSFC

Normally globals are defined at the top of the function. Its not 
necessary but its where most readers will look for it. In this case 
there is no existing global variable TSFC so it gets created in your 
module space on the assignment.

 >                      TSFC=ncfile.variables['T_SFC'][:,:,:]

I'm not familiar with the [:,:,:] style? What does it do?
Are you sure you want the commas?


But since that happens inside an if block, if the block doesn't get 
executed the global variable will never get created. Any attempt to 
access the variable before the if block is executed will result in your 
error.

>                      LAT=ncfile.variables['latitude'][:]
>                      LON=ncfile.variables['longitude'][:]
>                      TIME=ncfile.variables['time'][:]
>                      fillvalue=ncfile.variables['T_SFC']._FillValue
>                      ncfile.close()

And since there are no other functions in this file nobody else can see 
the TSFC variable you created. And since the function does not return 
any data it will be hard for other modules to use this function.


>
>
> #plotdata.py
>
> from selectdata import selectalldata
> selectalldata()

This will (msometimes) create a TSFC variable in the selectdata module, 
but you will not be able to access it here because you have not imported 
selectdata. If you had you could have done

TSFC = selectdata.TSFC

But since you didn't I suspect that

> def plotncfilewithtime():
>      for TSFC, TIME in zip((TSFC[1::3]),(TIME[1::3])):

This will fail when it tries to slice TSFC which it can't see.
Even if it did work it would be bad practice to do this sin e from the 
next line onwards the original TSFC would be masked by the new TSFC 
variable you are creating. Better to use unique names for the two values.

>      #convert time from numbers to date and prepare it to have no
> symbols for saving to filename
....
I ignored the techie stuff :-)

>      print "end of processing"
> plotncfilewithtime()

Again, this is not the best way to use functions, better to get the 
function to return the output to be displayed by the other program.

HTH,

-- 
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/



More information about the Tutor mailing list