User Tools

Site Tools


python:python
no way to compare when less than two revisions

Differences

This shows you the differences between two versions of the page.


Previous revision
Next revision
python:python [2013/03/13 17:16] dblume
Line 1: Line 1:
 +====== Python ======
  
 +Man, there's too much to do and note.  Logging some stuff to investigate later...
 +
 +  * [[http://pycon.blogspot.com/2011/12/announcing-pycon-2012-tutorials.html|2011 PyCon tutorials announcement]] further details at the [[https://us.pycon.org/2012/schedule/lists/tutorials/|tutorial list]].
 +  * They mention using [[http://ipython.org/|IPython]] enhanced shell.  Hmm.
 +  * [[http://pytools.codeplex.com/releases/view/76089|Python Tools for Visual Studio 2010]].
 +  * [[http://wiki.python.org/moin/PythonSpeed/PerformanceTips|Python Performance Tips at the Python wiki]].
 +  * Of course, there's getting Python running under Xampp. [[xampp]]
 +  * There's [[http://www.infoworld.com/d/application-development/pillars-python-six-python-web-frameworks-compared-169442|A comparison of CubicWeb, Django, Pyramid, Web.py, Web2py, and Zope 2]]
 +  * Look into the microframework [[http://flask.pocoo.org/|Flask]]. Here's a [[http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world|tutorial on making a blog with it]].
 +
 +Would be nice to create a binary search in text files in Python.  Maybe based on an answer deep in [[http://stackoverflow.com/questions/744256/reading-huge-file-in-python|Reading Huge File in Python]].
 +
 +This [[http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained/231855#231855|Explanation of Python "Yield"]] also mentions (at the bottom) explanations for decorators and metaclasses.
 +
 +Would be good to experiment with [[http://pingswept.org/2009/01/24/least-squares-polynomial-fitting-in-python/|least-squares polynomial fitting in Python]].
 +===== Data Analysis =====
 +
 +Looks like I should dive into:
 +
 +  * [[http://docs.scipy.org/doc/|NumPy]]
 +  * [[http://pandas.pydata.org/|Pandas]]
 +  * [[http://ipython.org/|IPython]].  (As seen above.)
 +===== Template Files to Start With =====
 +
 +You have some template files in svn:
 +
 +<code>
 +/Code/python_templates/trunk/make_standalone_application.bat
 +/Code/python_templates/trunk/setup.py
 +/Code/python_templates/trunk/template_cron_job.py
 +/Code/python_templates/trunk/template_gui_app.py
 +/Code/python_templates/trunk/template_gui_app_with_worker_thread.py
 +</code>
 +
 +===== Linux or Bash Tips =====
 +
 +Useful bash command for finding strings within python files...
 +
 +<code bash>
 +find . -name \*.py -type f -print0 | xargs -0 grep -nI "timeit"
 +</code>
 +
 +Interesting way to use ''grep -v'' to remove paths from a list generated by ''find'' Not sure about the escaped ''|'' character, though...
 +
 +<code bash>
 +#!/bin/bash
 +find $PWD -regex ".*\.[hcHC]\(pp\|xx\)?" | \
 +    grep -v " \|unwantedpath/unwantedpath2\|unwantedpath3" > cscope.files
 +cscope -q -b
 +</code>
 +
 +And these two have nothing to do with Python.  Here's how to find if a symbol is in a library, and how to search lots of object files and print the filename above the search...
 +
 +<code bash>
 +nm obj-directory/libmyobject.a | c++filt | grep Initialize_my_obj
 +find bindirectory/ -name \*.a -exec nm /dev/null {} \; 2>/dev/null | \
 +    c++filt | grep -P "(^bindirectory.*\.a|T Initialize_my_obj)"
 +</code>
 +
 +Also handy to merge two streams together...
 +
 +<code bash>
 +( cat file1 && cat file2 ) | sort
 +</code>
 +
 +When a little quick math is needed, use ''bc''
 +<code bash>
 +$ bc <<< "obase=16;ibase=10;15"
 +F
 +$ bc -l <<< 1/3
 +.33333333333333333333
 +$ bc <<< "scale=2; 1/3"
 +.33
 +$ bc <<< "obase=10;ibase=16;B"
 +11
 +</code>
 +
 +and, when coverting from hex to dec...
 +
 +<code bash>
 +echo $((0x2dec))
 +</code>
 +
 +But, then again, does that really seem easier than,
 +
 +<code>
 +python -c "print int('B',16)"
 +</code>
 +
 +There's a bash way to calculate how many days ago a date was:
 +
 +<code bash>
 +$ echo $(( ($(date +%s) - $(date -d "2012-4-16" +%s)) / 86400 ))
 +</code>
 +
 +And a Python way...
 +
 +<code python>
 +python -c "import datetime; print (datetime.date.today() - datetime.date( 2012, 4, 16 )).days"
 +</code>
 +
 +And for displaying lines to get cut instead of wrapped:
 +
 +<code bash>
 +cat_one_line_per_row() {
 +  cat "$@" | expand | cut -b1-$COLUMNS
 +}
 +</code>
 +
 +ctags's man page says that one of its bugs is that it has too many options.  Ain't that the truth.  Make note of the obscure flag here, ''--c++-kinds=+p'', that tells ctags to process prototypes and method declarations.
 +
 +<code bash>
 +ctags -n --if0=yes --c++-kinds=+p --langmap=c++:+.inl.lst \
 +    --langmap=asm:+.inc --file-tags=yes -R --extra=fq \
 +    --exclude=unwanted_file.lst \
 +    --exclude='*unwanted-directory*/*' \
 +    --regex-C++='/^.*CINIT.(.+),.*,.*,.*/CURLOPT_\1/'
 +</code>
 +
 +===== For / Else (Nobreak) =====
 +
 +Python has a [[http://nedbatchelder.com/blog/201110/forelse.html|For/Else keyword]] that should have been called, "nobreak."
 +
 +===== Sorting =====
 +
 +From an old [[http://dblume.livejournal.com/28319.html|note-to-self]]...
 +<code python>
 +import operator
 +
 +rows.sort(key=operator.itemgetter(4))
 +# or
 +rows.sort(lambda x, y : x[4] == y[4] and cmp(x[2],y[2]) or cmp(x[4], y[4]))
 +</code>
 +
 +...not like I could just find the same info at the [[http://wiki.python.org/moin/HowTo/Sorting|Python wiki]] or anything. :-P
 +
 +===== Prepopulating lists with objects =====
 +
 +Remember when you lost a couple of hours thinking that the following line created a list of objects.
 +
 +<code python>
 +    l = [Obj()] * n
 +</code>
 +
 +It doesn't. It creates a list of references to one object.
 +
 +What you meant to write was this:
 +
 +<code python>
 +    l = [Obj() for _ in range(n)]
 +</code>
 +
 +===== Linux script that takes either stdin or files =====
 +
 +<code python>
 +if __name__=='__main__':
 +    if len(sys.argv) < 2:
 +        # Process lines coming from stdin.
 +        while 1:
 +            line = sys.stdin.readline()
 +            if not line:
 +                break
 +            my_process_line( line.rstrip() )
 +    else:
 +        # Process lines of the files specified.
 +        for fname in sys.argv[1:]:
 +            if not os.path.exists( fname ):
 +                treat_argument_as_literal( fname )
 +                continue
 +            with open( fname, 'r' ) as f:
 +                while 1:
 +                    line = f.readline()
 +                    if not line:
 +                        break
 +                    my_process_line( line.rstrip() )
 +</code>
 +
 +===== The With statement =====
 +
 +[[http://amix.dk/blog/post/19663#Making-ugly-code-more-beautiful-using-Pythons-with-statement|Making code more beautiful with "with"]].  (Also mentions yield.)
 +
 +===== timeit =====
 +
 +<code python>
 +import timeit
 +
 +def Use_a():
 +    pass
 +
 +def Use_b():
 +    pass
 +
 +def Run_all_tests():
 +    my_setup()
 +    Use_a()
 +    Use_b()
 +
 +if __name__ == '__main__':
 +
 +#    t = timeit.timeit( 'Run_all_tests()', 'from __main__ import Run_all_tests', number=1 )
 +#    print dir( t )
 +#    print t
 +
 +    t = timeit.Timer( 'Run_all_tests()', 'from __main__ import Run_all_tests' )
 +    print t.timeit()
 +</code>
 +
 +When diving in, cProfile may come in handy.
 +
 +<code python>
 +import cProfile
 +
 +def my_function():
 +    # Complicated stuff
 +    pass
 +    
 +if __name__ == '__main__':
 +    cProfile.run( "my_function()" )
 +</code>
 +
 +===== Dynamically Calculating Column Size ======
 +
 +[[http://stackoverflow.com/questions/3685195/line-up-columns-of-numbers-print-output-in-table-format|Line up columns]]
 +
 +<code python>
 +data = '''\
 +234 127 34 23 45567
 +23 12 4 4 45
 +23456 2 1 444 567'''
 +
 +# Split input data by row and then on spaces
 +rows = [ line.strip().split(' ') for line in data.split('\n') ]
 +
 +# Reorganize data by columns
 +cols = zip(*rows)
 +
 +# Compute column widths by taking maximum length of values per column
 +col_widths = [ max(len(value) for value in col) for col in cols ]
 +
 +# Create a suitable format string
 +format = ' '.join(['%%%ds' % width for width in col_widths ])
 +
 +# Print each row using the computed format
 +for row in rows:
 +  print format % tuple(row)
 +</code>
 +
 +Which outputs:
 +<code>
 +  234 127 34  23 45567
 +   23  12  4      45
 +23456    1 444   567
 +</code>
 +
 +Also, here's a [[http://knowledgestockpile.blogspot.com/2011/01/string-formatting-in-python_09.html|nice summary of string formatting in Python]].
 +
 +===== Different Types of Objects =====
 +
 +<code python>
 +class A:
 +    """ Old, obsolete. """
 +    def __init__(self):
 +        self.__m_x = 0
 +
 +    def getx(self):
 +        return self.__m_x
 +
 +    def setx(self, x):
 +        if x < 0: x = 0
 +        self.__m_x = x
 +
 +    x = property( getx, setx )
 +
 +class B:
 +    """ Old; very small, was for for multitudes of objects. """
 +    __slots__ = [ "__m_x" ]
 +    def __init__(self):
 +        self.__m_x = 0
 +
 +    def getx(self):
 +        return self.__m_x
 +
 +    def setx(self, x):
 +        if x < 0: x = 0
 +        self.__m_x = x
 +
 +    x = property( getx, setx )        
 +
 +class C(object):
 +    """ New, reccommended. """
 +    def __init__(self):
 +        self.__x = 0
 +
 +    def getx(self):
 +        return self.__x
 +
 +    def setx(self, x):
 +        if x < 0: x = 0
 +        self.__x = x
 +
 +    x = property( getx, setx )
 +</code>
 +
 +====== TODO ======
 +
 +TODO Link to my tips from LiveJournal and GMail, and why I chose which timing modules.
 +Touching this page to see if the indexmenu will update its data.
python/python.txt · Last modified: 2024/02/27 15:43 by dblume