Advise of programming one of my first programs

Prasad, Ramit ramit.prasad at jpmorgan.com
Mon Mar 26 18:40:49 EDT 2012


> Hi guys just wanted to share one of my first programs. Could you please
> tell me, do I use a right logic ?
> It works fine what I wanted to do, but is it writen in the right way? My
> next step is to make it write the changes of the dictionary on the file :)
> 

When you do get that far, you should look at the pickle library.
It is amazing how easy it is to store data with Python.

> 
> ## DB
> tbook = {'goodie':['Christian','Van Eckel','Bruxelles','Forest','02 344 33
> 33','This is a test note :)'],
>          'osvaldo':['Osvaldo','Rios','Liege','Centrum','023758832',''],
>          'ronaldo':['Diego','Aspanda','Brussels','Vorst','03 443 23
> 23','']}
> 
> ## Edit selected nickname
> def edit():
>     sb = tbook[select]
>     fn = raw_input('New name for ' + sb[0] + ' : ')
>     sb[0] = fn
>     ln = raw_input('New name for ' + sb[1] + ' : ')
>     sb[1] = ln
>     raw_input('\n\n\nPress <Enter> to return')
>     details()
> 
> 
> ## Details of nickname
> def details():
>         sb = tbook[select]
>         print 'Nickname: ', select, ' is selected\n'
>         print 'First name:\t', sb[0], '\n'
>         print 'Last name:\t', sb[1], '\n'
>         print 'Country:\t', sb[2], '\n'
>         print 'City:\t\t', sb[3], '\n'
>         print 'Phone number:\t',sb[4], '\n'
>         print 'Memos:\n'
>         print sb[5]
> 
>         print '\n\n(E)dit\n\n'
>         print '(B)ack to phonebook list\n\n'
>         menu = raw_input('What you wana do? ')
>         if menu == 'e':
>                 edit()
>         if menu == 'b':
>             listpb()
> 

Minor nitpick, but what if the user types 'B' or 'E' like in 
your printed menu? 

> 
> ## Select nickname
> def selectm():
>     global select
>     select = raw_input('Type nickname and press <Enter>: ')
>     if select == '':
>         listpb()
>     if select in tbook:
>         details()
>     else:
>         listpb()


Remove all global variables when your program starts to work.
Instead pass them as arguments and return them from functions.
So do 'details( select )' instead of 'details()' and then in
details, you would do edit( select ). 
> 
> ## List all contacts
> def listpb():
>     print '_' *45, ' Phonebook ', '_' *45,'\n\n\n'
> 
>     print 'Nick\t\tF.Name\t\tL.Name\t\tCity\t\t\tRegion\t\tTel'
>     print '_' * 105,'\n','\t' * 13
>     for val in tbook.keys():
>             print val, '\t\t', tbook[val][0], '\t', tbook[val][1], '\t',
> tbook[val][2], '\t\t', tbook[val][3], '\t\t', tbook[val][4],'\t\t\n'
>     print '_'*105,'\n\n'
>     selectm()
> 
> ## Call list names
> listpb()

if __name__ == "__main__":
    listpb() 

This way you can import the module and not run it on import; it is
useful when you start wanting to reuse functions from a different
project. It is better than copy-pasting functions everywhere because
when you improve the function all the programs will pick it up. Otherwise
you will have to go back to each pasted function and pick it up.


A few items I would work to improve:
1. Remove global variables (already mentioned above)

2. You should separate any menu / navigation from your application
code. details() should only print the details and not take the 
next menu choice. You probably want 2 separate menu functions.
One that returns a 'select'-ed book and one that returns next choice.
This will also help you when you implement my next point.

3. You should also change the structure of your program to loop
instead of calling listpb each time you want to restart. It is a 
much better practice and while it will not affect this program
unless you do not exit for 10s or 100s of thousands of details but if
you write something that *does* navigate that many times it can crash. 
Looping is probably your next programming lesson anyway :)

4. This is more of a side note but instead of using \t\t all the 
time, you would be better off  learning to use the string formatting 
operations. It is a little more effort to learn, but tends to be 
a lot more reliable on  different systems (and with different 
data trying to be printed) than manually trying to align everything.

http://docs.python.org/library/string.html#format-string-syntax


Keep on working, you have made a good start and now it is time
to refactor (programming equivalent of rewriting an essay) and 
make everything better!

Ramit


Ramit Prasad | JPMorgan Chase Investment Bank | Currencies Technology
712 Main Street | Houston, TX 77002
work phone: 713 - 216 - 5423

--


This email is confidential and subject to important disclaimers and
conditions including on offers for the purchase or sale of
securities, accuracy and completeness of information, viruses,
confidentiality, legal privilege, and legal entity disclaimers,
available at http://www.jpmorgan.com/pages/disclosures/email.  


More information about the Python-list mailing list