====== Python ====== The Python language has many similarities to Perl, C and Java. However, there are some definite differences between the languages. This chapter is designed to quickly get you up to speed on the syntax that is expected in Python. ===== Install Python ===== * Install ActivePython. * on windows, you should install Microsoft Visual C++ Compiler for Python 2.7 at link https://www.microsoft.com/en-us/download/details.aspx?id=44266 - Step1: Install setup tools version 6.0 or later: python https://bootstrap.pypa.io/ez_setup.py - Step2: Install **Microsoft Visual C++ Compiler** - Step3: Update pip version pip install -U pip And check new version: pip -V output: pip 7.1.2 from D:\tools\python27\lib\site-packages (python 2.7) ===== Convert Python Script to execute file on windows ===== ==== Install PyInstaller ==== - Step1: Install PyInstaller easy_install.exe dis3 easy_install.exe pyinstaller easy_install.exe --upgrade pyinstaller - Step2: Check PyInstaller was installed: pyinstaller --version ==== Create execute file exe to run on windows ==== Steps to create exe file from python script: - Step1: Create Hello.py print "Hello, Python!"; - Step2: convert Hello.py to exe file: pyinstaller --onefile Hello.py or pyinstaller --onedir Hello.py => The exe file will startup more fastly Error can't run exe python file: Traceback (most recent call last): File "site-packages\PyInstaller\loader\rthooks\pyi_rth__tkinter.py", line 30, in IOError: Tcl data directory "C:\Users\anh\AppData\Local\Temp\_MEI83~1\tcl" not found. [6720] Failed to execute script pyi_rth__tkinter Fix easy_install --upgrade pyinstaller pyinstaller --add-data d:\tools\python27\tcl\tcl8.5;tcl\tcl8.5 --add-data d:\tools\python27\tcl\tk8.5;tk\tk8.5 --onefile tktonkho.py ===== Package Manager for Python ===== ==== Pip ==== === Install Pip === - Step1: Install wget https://bootstrap.pypa.io/get-pip.py python2.7 get-pip.py - Step2: Update pip python -m pip install --upgrade pip === Using pip === * Show all available commands which pip support pip output Usage: pip [options] Commands: install Install packages. uninstall Uninstall packages. freeze Output installed packages in requirements format. list List installed packages. show Show information about installed packages. search Search PyPI for packages. wheel Build wheels from your requirements. zip DEPRECATED. Zip individual packages. unzip DEPRECATED. Unzip individual packages. bundle DEPRECATED. Create pybundles. help Show help for commands. General Options: -h, --help Show help. -v, --verbose Give more output. Option is additive, and can be used up to 3 times. -V, --version Show version and exit. -q, --quiet Give less output. --log-file Path to a verbose non-appending log, that only logs failures. This log is active by default at C:\Users\user1\pip\pip.log. --log Path to a verbose appending log. This log is inactive by default. --proxy Specify a proxy in the form [user:passwd@]proxy.server:port. --timeout Set the socket timeout (default 15 seconds). --exists-action Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup. --cert Path to alternate CA bundle. * search all packages which contain the keyword "search": pip search search output ........................... Fozzy - Full-Text search REST Service easyshop.search - Search replacement for EasyShop sphinxapi - Client for the Sphinx search engine. cubicweb-searchui - set of ui components to ease data browsing deepsearch - A Haystack extension used to index deep and nested model relationships. ........................... ==== conda ==== refer: http://conda.pydata.org/docs/intro.html Conda is an open source package management system and environment management system for installing multiple versions of software packages and their dependencies and switching easily between them. It works on Linux, OS X and Windows, and was created for Python programs but can package and distribute any software. If you’ve used pip and virtualenv in the past, you can use conda to perform all of the same operations. Pip is a package manager, and Virtualenv is an environment manager. Conda is both. ^Task^Conda package and environment manager command^Pip package manager command^Virtualenv environment manager command^ |Install a package|conda install $PACKAGE_NAME|pip install $PACKAGE_NAME|X| |Update a package|conda update --name $ENVIRONMENT_NAME $PACKAGE_NAME|pip install --upgrade $PACKAGE_NAME|X| |Update package manager|conda update conda|Linux/OSX: pip install -U pip Win: python -m pip install -U pip|X| |Uninstall a package|conda remove --name $ENVIRONMENT_NAME $PACKAGE_NAME|pip uninstall $PACKAGE_NAME|X| |Create an environment|conda create --name $ENVIRONMENT_NAME python|X|cd $ENV_BASE_DIR; virtualenv $ENVIRONMENT_NAME| |Activate an environment|source activate $ENVIRONMENT_NAME|X|source $ENV_BASE_DIR/$ENVIRONMENT_NAME/bin/activate| |Deactivate an environment|source deactivate|X|deactivate| |Search available packages|conda search $SEARCH_TERM|pip search $SEARCH_TERM|X| |Install package from specific source|conda install --channel $URL $PACKAGE_NAME|pip install --index-url $URL $PACKAGE_NAME|X| |List installed packages|conda list --name $ENVIRONMENT_NAME|pip list|X| |Create requirements file|conda list --export|pip freeze|X| |List all environments|conda info --envs|X|Install virtualenv wrapper, then lsvirtualenv| |Install other package manager|conda install pip|pip install conda|X| |Install Python|conda install python=x.x|X|X| |Update Python|conda update python *|X|X| conda update python updates to the most recent in the series, so Python 2 to latest 2.x, Python 3 to latest 3.x, and so on. === Install Conda === Linux pip install conda Windows: download and install it from http://conda.pydata.org/miniconda.html(Win32, not 64bits) After install, change the PATH of python to PATH of conda === Basic Create virtual enviornment with conda === * Help options in Creating environment: conda create -h output: usage: conda create [-h] [-y] [--dry-run] [-f] [--file FILE] [--unknown] [--no-deps] [-m] [--use-index-cache] [--use-local] [--offline] [--no-pin] [-c CHANNEL] [--override-channels] [-n ENVIRONMENT | -p PATH] [-q] [--copy] [--alt-hint] [--json] [--clone ENV] [--no-default-packages] [package_spec [package_spec ...]] Create a new conda environment from a list of specified packages. To use the created environment, use 'source activate envname' look in that directory first. This command requires either the -n NAME or -p PREFIX option. Options: positional arguments: package_spec Package versions to install into the conda environment. optional arguments: -h, --help Show this help message and exit. -y, --yes Do not ask for confirmation. --dry-run Only display what would have been done. -f, --force Force install (even when package already installed), implies --no-deps. --file FILE Read package versions from FILE. --unknown Use index metadata from the local package cache, which are from unknown channels (installing local packages directly implies this option). --no-deps Do not install dependencies. -m, --mkdir Create the environment directory if necessary. --use-index-cache Use cache of channel index files. --use-local Use locally built packages. --offline Offline mode, don't connect to the Internet. --no-pin Ignore pinned file. -c CHANNEL, --channel CHANNEL Additional channel to search for packages. These are URLs searched in the order they are given (including file:// for local directories). Then, the defaults or channels from .condarc are searched (unless --override-channels is given). You can use 'defaults' to get the default packages for conda, and 'system' to get the system packages, which also takes .condarc into account. You can also use any name and the .condarc channel_alias value will be prepended. The default channel_alias is http://conda.anaconda.org/. --override-channels Do not search default or .condarc channels. Requires --channel. -n ENVIRONMENT, --name ENVIRONMENT Name of environment (in /usr/local/envs). -p PATH, --prefix PATH Full path to environment prefix (default: /usr/local/envs/zipline). -q, --quiet Do not display progress bar. --copy Install all packages using copies instead of hard- or soft-linking. --alt-hint Use an alternate algorithm to generate an unsatisfiability hint. --json Report all output as json. Suitable for using conda programmatically. --clone ENV Path to (or name of) existing local environment. --no-default-packages Ignore create_default_packages in the .condarc file. * Examples: conda create -n myenv sqlite * Create new virtual environment with name py3k which contain package anaconda with python3x: conda create -n py3k anaconda python=3 === Create virtual environment for zipline app and using it === We will install **zipline** which requirement package **numpy** (Because we can found **numpy** in packages of conda on **https://anaconda.org/anaconda/repo**): - Step1: Create new virtual environment with name **zipline** which contain package **numpy** in conda conda create -n zipline numpy => (option **-n -> --name** of environment)You click yes to install these packages for new virtual environment. You can check new environment created in directory D:\tools\miniconda2\envs\ - Step2: Go to virtual environment zipline: source activate zipline in Windows, go to directory **d:\tools\Miniconda2\condabin\** and run command below conda.bat activate zipline - Step3: Install zipline in environment: conda install -c Quantopian zipline =>install package **zipline** from channel **Quantopian** on **https://anaconda.org/anaconda/repo**{{:script:screen_shot_2020-11-26_at_4.58.01_pm.png|}} === Other commands of conda === * List environments in conda C:\Users\anhvc>conda info --envs output: # conda environments: # zipline d:\tools\Miniconda2\envs\zipline root * d:\tools\Miniconda2 * Remove environment in conda: conda env remove -n zipline (option **-n -> --name** of environment) * Install packages in environment https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-pkgs.html#installing-packages ==== Anaconda ==== install anaconda: conda install anaconda ==== Build python modules from source ==== - Step1: Download source and go to source directory and run pip install -r requirements.txt python setup.py build python setup.py install - Step2: Check modules installed using **python -c**, for example: python -c "from PIL import Image, ImageFont, ImageDraw" ===== First Python Program ===== ==== Interative mode programming ==== Invoking the interpreter without passing a script file as a parameter brings up the following prompt: $ python Python 2.4.3 (#1, Nov 11 2010, 13:34:43) [GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> Type the following text to the right of the Python prompt and press the Enter key: >>> print "Hello, Python!"; If you are running new version of Python, then you would need to use print statement with parenthesis like print ("Hello, Python!"); . However at Python version 2.4.3, this will produce following result: Hello, Python! ==== Script mode programming ==== Invoking the interpreter with a script parameter begins execution of the script and continues until the script is finished. When the script is finished, the interpreter is no longer active. Let us write a simple Python program in a script. All python files will have extension .py. * Create hello.py print "Hello, Python!"; * Run python hello.py => result Hello, Python! Let's try another way to execute a Python script. * Modified hello.py file: #!/usr/bin/python print "Hello, Python!"; * Run: $ chmod +x hello.py # This is to make file executable $./hello.py output: Hello, Python! ===== Python Command line and environment variables ===== refer: https://docs.python.org/2/using/cmdline.html ==== Python Command line ==== ==== Python Environment Variables ==== refer: https://docs.python.org/2/using/cmdline.html#environment-variables === PYTHONHOME === Change the location of the **standard Python libraries**. By default, the libraries are **searched in prefix/lib/pythonversion and exec_prefix/lib/pythonversion**, where prefix and exec_prefix are installation-dependent directories, both defaulting to /usr/local. When PYTHONHOME is set to a single directory, its value replaces both prefix and exec_prefix. **To specify different values for these, set PYTHONHOME to prefix:exec_prefix**. === PYTHONPATH === Augment the **default search path for module files**. The format is the same as the shell’s PATH: one or more directory pathnames separated by os.pathsep (e.g. colons on Unix or semicolons on Windows). Non-existent directories are silently ignored. * In addition to normal directories, individual PYTHONPATH entries may refer to zipfiles containing pure Python modules (in either source or compiled form). Extension modules cannot be imported from zipfiles. * The **default search path** is installation dependent, but **generally begins with prefix/lib/pythonversion** (see PYTHONHOME above). It is **always appended to PYTHONPATH**. * **An additional directory** will be inserted in the search path **in front of PYTHONPATH** as described above under Interface options. The search path can be manipulated from within a Python program as the variable sys.path. ===== Basic Syntax ===== ==== Python Identifiers ==== A Python identifier is a **name used to identify a variable, function, class, module or other object**. An identifier **starts with a letter A to Z or a to z or an underscore (_)** followed by zero or more letters, underscores and digits (0 to 9).\\ Python **does not allow punctuation characters such as @, $ and %** within identifiers. **Python is a case sensitive programming language**. Thus, Manpower and manpower are two different identifiers in Python. Here are following identifier naming convention for Python: * **Class names** start with an **uppercase letter** and **all other identifiers** with a **lowercase letter**. * **Starting an identifier with a single leading underscore** indicates by convention that the identifier is meant to be **private**. * **Starting an identifier with two leading underscores** indicates a **strongly private identifier**. * If the identifier also **ends with two trailing underscores**, the identifier is a **language-defined special name**. ==== Reserved Words ==== The following list shows the reserved words in Python. These reserved words may not be used as constant or variable or any other identifier names. All the Python keywords contain lowercase letters only. |and|exec|not| |assert|finally|or| |break|for|pass| |class|from|print| |continue|global|raise| |def|if|return| |del|import|try| |elif|in|while| |else|is|with| |except|lambda|yield| ==== Lines and Indentation ==== One of the first caveats programmers encounter when learning Python is the fact that **there are no braces to indicate blocks of code** for class and function definitions or flow control. **Blocks of code are denoted by line indentation**, which is rigidly enforced. The number of spaces in the indentation is variable, but all statements within the block must be indented the same amount. Both blocks in this example are fine: if True: print "True" else: print "False" However, the second block in this example will generate an error: if True: print "Answer" print "True" else: print "Answer" print "False" Thus, in Python all the continous lines indented **with similar number of spaces would form a block**. Following is the example having various statement blocks: Note: Don't try to understand logic or different functions used. Just make sure you undertood various blocks even if they are without braces. #!/usr/bin/python import sys try: # open file stream file = open(file_name, "w") except IOError: print "There was an error writing to", file_name sys.exit() print "Enter '", file_finish, print "' When finished" while file_text != file_finish: file_text = raw_input("Enter text: ") if file_text == file_finish: # close the file file.close break file.write(file_text) file.write("\n") file.close() file_name = raw_input("Enter filename: ") if len(file_name) == 0: print "Next time please enter something" sys.exit() try: file = open(file_name, "r") except IOError: print "There was an error reading file" sys.exit() file_text = file.read() file.close() print file_text ==== Multi-Line Statements ==== Statements in Python typically end with a new line. Python does, however, allow the use of the line continuation character **(\) to denote that the line should continue**. For example: total = item_one + \ item_two + \ item_three Statements contained within the **[], {} or ()** brackets do not need to use the line continuation character. For example: days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] ==== Quotation in Python ==== Python accepts single **('), double (") and triple (''' or """) quotes** to denote string literals, as long as the same type of quote starts and ends the string. The **triple quotes** can be used to span the **string across multiple lines**. For example, all the following are legal: word = 'word' sentence = "This is a sentence." paragraph = """This is a paragraph. It is made up of multiple lines and sentences.""" ==== Comments in Python ==== A hash sign **(#)** that is not inside a string literal begins a comment. All characters after the # and up to the physical line end are part of the comment and the Python interpreter ignores them. #!/usr/bin/python # First comment print "Hello, Python!"; # second comment This will produce the following result: Hello, Python! A comment may be on the same line after a statement or expression: name = "Madisetti" # This is again comment You can comment multiple lines as follows: # This is a comment. # This is a comment, too. # This is a comment, too. # I said that already. ==== Using Blank Lines ==== A line containing only whitespace, possibly with a comment, is known as a blank line and Python totally ignores it. In an interactive interpreter session, you must enter an empty physical line to terminate a multiline statement. ==== Waiting for the User ==== The following line of the program displays the prompt, Press the enter key to exit and waits for the user to press the Enter key: #!/usr/bin/python raw_input("\n\nPress the enter key to exit.") Here, "\n\n" are being used to create two new lines before displaying the actual line. Once the user presses the key, the program ends. This is a nice trick to keep a console window open until the user is done with an application. ==== Multiple Statements on a Single Line ==== The semicolon ( ; ) allows multiple statements on the single line given that neither statement starts a new code block. Here is a sample snip using the semicolon: import sys; x = 'foo'; sys.stdout.write(x + '\n') ==== Multiple Statement Groups as Suites ==== A group of individual statements, which make a single code block are called suites in Python. Compound or complex statements, such as if, while, def, and class, are those which require a header line and a suite. Header lines begin the statement (with the keyword) and terminate with a colon ( : ) and are followed by one or more lines which make up the suite. For example: if expression : suite elif expression : suite else : suite ==== Command Line Arguments ==== You may have seen, for instance, that many programs can be run so that they provide you with some basic information about how they should be run. Python enables you to do this with -h: python -h usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ... Options and arguments (and corresponding environment variables): -c cmd : program passed in as string (terminates option list) -d : debug output from parser (also PYTHONDEBUG=x) -E : ignore environment variables (such as PYTHONPATH) -h : print this help message and exit [ etc. ] You can also program your script in such a way that it should accept various options. Command Line Arguments is an advanced topic and should be studied a bit later once you have gone through rest of the Python concepts. ===== Python Data Types ===== Python has five standard data types: * Numbers * String * List * Tuple * Dictionary ==== Assigning Values to Variables ==== Python variables do not have to be explicitly declared to reserve memory space. The declaration happens automatically when you assign a value to a variable. For example: #!/usr/bin/python counter = 100 # An integer assignment miles = 1000.0 # A floating point name = "John" # A string print counter print miles print name Output: 100 1000.0 John ==== Python Numbers ==== Python has five standard data types: * Numbers * String * List * Tuple * Dictionary ==== Python Strings ==== Strings in Python are identified as a contiguous set of characters in between quotation marks. **Subsets of strings** can be taken using the slice operator ( **[ ] and [ : ]** ) with indexes starting at 0 in the beginning of the string and working their way from -1 at the end. The plus ( **+**) sign is the **string concatenation operator** and the asterisk ( * ) is the **repetition operator**. For example: #!/usr/bin/python str = 'Hello World!' print str # Prints complete string print str[0] # Prints first character of the string print str[2:5] # Prints characters starting from 3rd to 5th print str[2:] # Prints string starting from 3rd character print str * 2 # Prints string two times print str + "TEST" # Prints concatenated string This will produce the following result: Hello World! H llo llo World! Hello World!Hello World! Hello World!TEST ==== Python Lists ==== refer: http://www.tutorialspoint.com/python/python_lists.htm\\ A list contains items **separated by commas and enclosed within square brackets ([])**. To some extent, lists are similar to arrays in C. One difference between them is that **all the items belonging to a list can be of different data type**. The values stored in **a list can be accessed** using the slice operator ( **[ ]** and **[ : ]** ) with indexes starting at 0 in the beginning of the list and working their way to end -1. The plus (** + **) sign is the **list concatenation operator**, and the asterisk ( * ) is the **repetition operator**. For example: #!/usr/bin/python list = [ 'abcd', 786 , 2.23, 'john', 70.2 ] tinylist = [123, 'john'] print list # Prints complete list print list[0] # Prints first element of the list print list[1:3] # Prints elements starting from 2nd till 3rd print list[2:] # Prints elements starting from 3rd element print tinylist * 2 # Prints list two times print list + tinylist # Prints concatenated lists This will produce the following result: ['abcd', 786, 2.23, 'john', 70.200000000000003] abcd [786, 2.23] [2.23, 'john', 70.200000000000003] [123, 'john', 123, 'john'] ['abcd', 786, 2.23, 'john', 70.200000000000003, 123, 'john'] ==== Python Tuples ==== A tuple is another sequence data type that is **similar to the list**. A tuple consists of a number of values separated by commas. Unlike lists, however, **tuples are enclosed within parentheses**. The main differences between lists and tuples are: Lists are enclosed in brackets ( [ ] ) and their elements and size can be changed, while tuples are **enclosed** in parentheses ( **( )** ) and **size cannot be updated**. Tuples can be thought of as **read-only lists**. For example: #!/usr/bin/python tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 ) tinytuple = (123, 'john') print tuple # Prints complete list print tuple[0] # Prints first element of the list print tuple[1:3] # Prints elements starting from 2nd till 3rd print tuple[2:] # Prints elements starting from 3rd element print tinytuple * 2 # Prints list two times print tuple + tinytuple # Prints concatenated lists This will produce the following result: ('abcd', 786, 2.23, 'john', 70.200000000000003) abcd (786, 2.23) (2.23, 'john', 70.200000000000003) (123, 'john', 123, 'john') ('abcd', 786, 2.23, 'john', 70.200000000000003, 123, 'john') Following is invalid with tuple, because we attempted to update a tuple, which is not allowed. Similar case is possible with lists: #!/usr/bin/python tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 ) list = [ 'abcd', 786 , 2.23, 'john', 70.2 ] tuple[2] = 1000 # Invalid syntax with tuple list[2] = 1000 # Valid syntax with list ==== Python Dictionary ==== Python's dictionaries are kind of hash table type. They work like associative arrays or hashes found in Perl and **consist of key-value pairs**. **A dictionary key can be almost any Python type**, but are usually numbers or strings. Values, on the other hand, can be any arbitrary Python object. Dictionaries are **enclosed** by curly braces (** { } **) and values can be **assigned and accessed** using square braces ( **[]** ). * For example: #!/usr/bin/python dict = {} dict['one'] = "This is one" dict[2] = "This is two" tinydict = {'name': 'john','code':6734, 'dept': 'sales'} print dict['one'] # Prints value for 'one' key print dict[2] # Prints value for 2 key print tinydict # Prints complete dictionary print tinydict.keys() # Prints all the keys print tinydict.values() # Prints all the values This will produce the following result: This is one This is two {'dept': 'sales', 'code': 6734, 'name': 'john'} ['dept', 'code', 'name'] ['sales', 6734, 'john'] * Dictionaries have no concept of order among elements. It is incorrect to say that the elements are "out of order"; they are simply unordered. Loop in Dictionary: mydict = {'dept': 'sales', 'code': 6734, 'name': 'john'} for i, v in mydict.iteritems(): print i, v * Update dictionary: #!/usr/bin/python dict = {'Name': 'Zara', 'Age': 7} dict2 = {'Sex': 'female' } dict.update(dict2) print "Value : %s" % dict When we run above program, it produces following result Value : {'Age': 7, 'Name': 'Zara', 'Sex': 'female'} ==== Data Type Conversion ==== ^Function^Description^ |int(x [,base])|Converts x to an integer. base specifies the base if x is a string.| |long(x [,base] )|Converts x to a long integer. base specifies the base if x is a string.| |float(x)|Converts x to a floating-point number.| |complex(real [,imag])|Creates a complex number.| |str(x)|Converts object x to a string representation.| |repr(x)|Converts object x to an expression string.| |eval(str)|Evaluates a string and returns an object.| |tuple(s)|Converts s to a tuple.| |list(s)|Converts s to a list.| |set(s)|Converts s to a set.| |dict(d)|Creates a dictionary. d must be a sequence of (key,value) tuples.| |frozenset(s)|Converts s to a frozen set.| |chr(x)|Converts an integer to a character.| |unichr(x)|Converts an integer to a Unicode character.| |ord(x)|Converts a single character to its integer value.| |hex(x)|Converts an integer to a hexadecimal string.| |oct(x)|Converts an integer to an octal string.| ===== Python Operators ===== ==== Arithmetic Operators ==== Assume variable a holds 10 and variable b holds 20, then: ^ Operator ^ Description ^ Example ^ |+|Addition - Adds values on either side of the operator|a + b will give 30| |-|Subtraction - Subtracts right hand operand from left hand operand|a - b will give -10| |*|Multiplication - Multiplies values on either side of the operator|a * b will give 200| |/|Division - Divides left hand operand by right hand operand|b / a will give 2| |%|Modulus - Divides left hand operand by right hand operand and returns remainder|b % a will give 0| |**|Exponent - Performs exponential (power) calculation on operators|a**b will give 10 to the power 20| |//|Floor Division - The division of operands where the result is the quotient in which the digits after the decimal point are removed.|9//2 is equal to 4 and 9.0//2.0 is equal to 4.0| ==== Compare Operators ==== Assume variable a holds 10 and variable b holds 20, then: ^Operator ^ Description ^ Example| |==|Checks if the value of two operands are equal or not, if yes then condition becomes true.|(a == b) is not true.| |!=|Checks if the value of two operands are equal or not, if values are not equal then condition becomes true.|(a != b) is true.| |<>|Checks if the value of two operands are equal or not, if values are not equal then condition becomes true.|(a <> b) is true. This is similar to != operator.| |>|Checks if the value of left operand is greater than the value of right operand, if yes then condition becomes true.|(a > b) is not true.| |<|Checks if the value of left operand is less than the value of right operand, if yes then condition becomes true.|(a < b) is true.| |>=|Checks if the value of left operand is greater than or equal to the value of right operand, if yes then condition becomes true.|(a >= b) is not true.| |<=|Checks if the value of left operand is less than or equal to the value of right operand, if yes then condition becomes true.|(a <= b) is true.| ==== Python Assignment Operators ==== Assume variable a holds 10 and variable b holds 20, then: ^Operator ^ Description ^ Example ^ |=|Simple assignment operator, Assigns values from right side operands to left side operand| c = a + b will assigne value of a + b into c| |+=|Add AND assignment operator, It adds right operand to the left operand and assign the result to left operand| c += a is equivalent to c = c + a| |-=|Subtract AND assignment operator, It subtracts right operand from the left operand and assign the result to left operand| c -= a is equivalent to c = c - a| |*=|Multiply AND assignment operator, It multiplies right operand with the left operand and assign the result to left operand| c *= a is equivalent to c = c * a| |/=|Divide AND assignment operator, It divides left operand with the right operand and assign the result to left operand| c /= a is equivalent to c = c / a| |%=|Modulus AND assignment operator, It takes modulus using two operands and assign the result to left operand| c %= a is equivalent to c = c % a| |**=|Exponent AND assignment operator, Performs exponential (power) calculation on operators and assign value to the left operand| c **= a is equivalent to c = c ** a| |//=|Floor Dividion and assigns a value, Performs floor division on operators and assign value to the left operand| c //= a is equivalent to c = c // a| ==== Python Bitwise Operators ==== Bitwise operator works on bits and perform bit by bit operation. Assume if a = 60; and b = 13; Now in binary format they will be as follows: a = 0011 1100 b = 0000 1101 ----------------- a&b = 0000 1100 a|b = 0011 1101 a^b = 0011 0001 ~a = 1100 0011 There are following Bitwise operators supported by Python language ^Operator ^ Description ^ Example ^ |&|Binary AND Operator copies a bit to the result if it exists in both operands.|(a & b) will give 12 which is 0000 1100| |||Binary OR Operator copies a bit if it exists in eather operand.|(a | b) will give 61 which is 0011 1101| |^|Binary XOR Operator copies the bit if it is set in one operand but not both.|(a ^ b) will give 49 which is 0011 0001| |~|Binary Ones Complement Operator is unary and has the efect of 'flipping' bits.|(~a ) will give -61 which is 1100 0011 in 2's complement form due to a signed binary number.| |<<|Binary Left Shift Operator. The left operands value is moved left by the number of bits specified by the right operand.|a << 2 will give 240 which is 1111 0000| |>>|Binary Right Shift Operator. The left operands value is moved right by the number of bits specified by the right operand.|a >> 2 will give 15 which is 0000 1111| ==== Python Logical Operators ==== There are following logical operators supported by Python language. Assume variable a holds 10 and variable b holds 20 then: ^Operator ^ Description ^ Example ^ |and|Called Logical AND operator. If both the operands are true then then condition becomes true.|(a and b) is true.| |or|Called Logical OR Operator. If any of the two operands are non zero then then condition becomes true.|(a or b) is true.| |not|Called Logical NOT Operator. Use to reverses the logical state of its operand. If a condition is true then Logical NOT operator will make false.|not(a and b) is false.| ==== Python Membership Operators ==== In addition to the operators discussed previously, Python has membership operators, which test for membership in a sequence, such as **strings, lists, or tuples**. There are two membership operators explained below: ^ Operator ^ Description ^ Example ^ |in|Evaluates to true if it finds a variable in the specified sequence and false otherwise.| x in y, here in results in a 1 if x is a member of sequence y.| |not in|Evaluates to true if it does not finds a variable in the specified sequence and false otherwise.|x not in y, here not in results in a 1 if x is not a member of sequence y.| Try following example to understand all the membership operators available in Python programming language: #!/usr/bin/python a = 10 b = 20 list = [1, 2, 3, 4, 5 ]; if ( a in list ): print "Line 1 - a is available in the given list" else: print "Line 1 - a is not available in the given list" if ( b not in list ): print "Line 2 - b is not available in the given list" else: print "Line 2 - b is available in the given list" a = 2 if ( a in list ): print "Line 3 - a is available in the given list" else: print "Line 3 - a is not available in the given list" When you execute the above program it produces the following result: Line 1 - a is not available in the given list Line 2 - b is not available in the given list Line 3 - a is available in the given list ==== Python Identity Operators ==== Identity operators compare the memory locations of two objects. There are two Identity operators explained below: ^ Operator ^ Description ^ Example ^ |is|Evaluates to true if the variables on either side of the operator point to the same object and false otherwise.| x is y, here is results in 1 if id(x) equals id(y).| |is not|Evaluates to false if the variables on either side of the operator point to the same object and true otherwise.| x is not y, here is not results in 1 if id(x) is not equal to id(y).| ===== Python Decision Making ===== ^ Statement ^ Description ^ | if expression: statement(s)|An if statement consists of a boolean expression followed by one or more statements.| | if expression: statement(s) else: statement(s)|An if statement can be followed by an optional else statement, which executes when the boolean expression is false.| | if expression1: statement(s) if expression2: statement(s) elif expression3: statement(s) else statement(s) elif expression4: statement(s) else: statement(s)|You can use one if or else if statement inside another if or else if statement(s).| ===== Python loops ===== ^Loop Type^Description^ | while expression: statement(s)|Repeats a statement or group of statements while a given condition is true. It tests the condition before executing the loop body.| | for iterating_var in sequence: statements(s)|Executes a sequence of statements multiple times and abbreviates the code that manages the loop variable.| |nested loops: with for: for iterating_var in sequence: for iterating_var in sequence: statements(s) statements(s)with while: while expression: while expression: statement(s) statement(s)|You can use one or more loop inside any another while, for or do..while loop.| With Loop Control Statements: ^ Control Statement ^ Description ^ |break statement|Terminates the loop statement and transfers execution to the statement immediately following the loop.| |continue statement|Causes the loop to skip the remainder of its body and immediately retest its condition prior to reiterating.| |pass statement|The pass statement in Python is used when a statement is required syntactically but you do not want any command or code to execute.| Examples: * For from 0 to 3 for x in range(0, 3): print "We're on time %d" % (x) * Lists as an iterable collection = ['hey', 5, 'd'] for x in collection: print x * Loop over Lists of lists list_of_lists = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]] for list in list_of_lists: for x in list: print x ===== Python Functions ===== ==== Defining a Function ==== You can define functions to provide the required functionality. Here are simple rules to define a function in Python. * Function blocks begin with the **keyword def followed by the function name and parentheses ( ( ) )**. * Any input parameters or arguments should be placed within these parentheses. You can also define parameters inside these parentheses. * The **first statement** of a function can be an optional statement - **the documentation string of the function or docstring**. * **The code block** within every function **starts with a colon (:) and is indented**. * The **statement return [expression] exits a function**, optionally passing back an expression to the caller. A return statement with no arguments is the same as return None. ==== Syntax and examples ==== * syntax: def functionname( parameters ): "function_docstring" function_suite return [expression] * simple example: def printme( str ): "This prints a passed string into this function" print str return * calling a function: #!/usr/bin/python # Function definition is here def printme( str ): "This prints a passed string into this function" print str; return; # Now you can call printme function printme("I'm first call to user defined function!"); printme("Again second call to the same function"); Output: I'm first call to user defined function! Again second call to the same function * Return value in function: #!/usr/bin/python # Function definition is here def sum( arg1, arg2 ): # Add both the parameters and return them." total = arg1 + arg2 print "Inside the function : ", total return total; # Now you can call sum function total = sum( 10, 20 ); print "Outside the function : ", total Output: Inside the function : 30 Outside the function : 30 ==== Pass by reference vs value ==== **All parameters (arguments)** in the Python language are **passed by reference**. It means if you change what a parameter refers to within a function, the change also reflects back in the calling function. For example: * Example1: #!/usr/bin/python # Function definition is here def changeme( mylist ): "This changes a passed list into this function" mylist.append([1,2,3,4]); print "Values inside the function: ", mylist return # Now you can call changeme function mylist = [10,20,30]; changeme( mylist ); print "Values outside the function: ", mylist output: Values inside the function: [10, 20, 30, [1, 2, 3, 4]] Values outside the function: [10, 20, 30, [1, 2, 3, 4]] * Example2: #!/usr/bin/python # Function definition is here def changeme(text): "This changes a passed list into this function" text = text + 'world' return # Now you can call changeme function str = 'hello' changeme(str); print str output: hello ==== Global vs. Local variables ==== #!/usr/bin/python total = 0; # This is global variable. # Function definition is here def sumlocal( arg1, arg2 ): # Add both the parameters and return them." total = arg1 + arg2; # Here total is local variable. print "Inside the function local total : ", total return total; def sumglobal( arg1, arg2 ): # Add both the parameters and return them." global total total = arg1 + arg2; # Here total is local variable. return total; # Now you can call sum function sumlocal( 10, 20 ); print "Outside total after run sumlocal : ", total sumglobal( 10, 20 ); print "Outside total after run sumglobal : ", total Output: Inside the function local total : 30 Outside total after run sumlocal : 0 Outside total after run sumglobal : 30 ==== Built-in Functions ==== https://docs.python.org/2/library/functions.html ==== Define Function inside Function ==== Define functions inside other functions: def greet(name): def get_message(): return "Hello " result = get_message()+name return result print greet("John") # Outputs: Hello John ==== Functions can be passed as parameters to other functions ==== def greet(name): return "Hello " + name def call_func(func): other_name = "John" return func(other_name) print call_func(greet) # Outputs: Hello John ==== Functions can return other functions ==== In other words, functions generating other functions. def compose_greet_func(): def get_message(): return "Hello there!" return get_message greet = compose_greet_func() print greet() # Outputs: Hello there! ===== Python Modules ===== A module allows you to logically organize your Python code. Grouping related code into a module makes the code easier to understand and use. A module is a Python object with arbitrarily named attributes that you can bind and reference. Simply, a module is a file consisting of Python code. A module can define functions, classes and variables. A module can also include runnable code. ==== Create simple module ==== Create module support.py def print_func( par ): print "Hello : ", par return ==== import and using module ==== Basic syntax: from file1 import * => import all objects and methods in file1 * Simple import: #!/usr/bin/python # Import module support import support # Now you can call defined function that module as follows support.print_func("Zara") * import with from: #!/usr/bin/python # Import module support from support import print_func # Now you can call defined function that module as follows print_func("Zara") Or #!/usr/bin/python # Import module support from support import * # Now you can call defined function that module as follows print_func("Zara") ==== Excuting modules as script ==== To run modules as script, you add below code at the end your module for running functions in module: if __name__ == "__main__": import sys print_func(sys.argv[1]) => This code only run when your module is __main__. That mean It only implement when you run module as script Therefore simple module support.py will update to: def print_func( par ): print "Hello : ", par return if __name__ == "__main__": import sys print_func(sys.argv[1]) And you can test the module with command below: python support.py "zara" Output: Hello : zara ==== Packages in Python ==== Packages are a way of structuring Python’s module namespace by using “dotted module names”. * Below example design a collection of modules (a “package”) for the uniform handling of sound files and sound data: sound/ Top-level package __init__.py Initialize the sound package formats/ Subpackage for file format conversions __init__.py wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py ... effects/ Subpackage for sound effects __init__.py echo.py surround.py reverse.py ... filters/ Subpackage for filters __init__.py equalizer.py vocoder.py karaoke.py ... The __init__.py files are required to make Python treat the directories as containing packages. In the simplest case, __init__.py **can just be an empty file**, but it can also execute **initialization code for the package or set the __all__ variable**, it is taken to be the list of module names that should be imported when from package **import *** is encountered. It is up to the package author to keep this list up-to-date when a new version of the package is released. For example, the file sound/effects/__init__.py could contain the following code: __all__ = ["echo", "surround", "reverse"] => This would mean that from sound.effects **import *** would import the **three named submodules** of the sound package. * Using package: import sound.effects.echo sound.effects.echo.echofilter(input, output, delay=0.7, atten=4) Or from sound.effects import echo echo.echofilter(input, output, delay=0.7, atten=4) ===== Python Exceptions ===== Used to replace **"Try Catch"** with **"Try Except"** ==== Syntax ==== try: You do your operations here; ...................... except ExceptionI: If there is ExceptionI, then execute this block. except ExceptionII: If there is ExceptionII, then execute this block. ...................... else: If there is no exception then execute this block. Simple code: #!/usr/bin/python try: fh = open("testfile", "w") fh.write("This is my test file for exception handling!!") except IOError: print "Error: can\'t find file or read data" else: print "Written content in the file successfully" fh.close() ==== The try-except clause ==== * The except clause with no exceptions try: You do your operations here; ...................... except: If there is any exception, then execute this block. ...................... else: If there is no exception then execute this block. try: You do your operations here; ...................... except: If there is any exception, then execute this block. ...................... * The except clause with multiple exceptions try: You do your operations here; ...................... except(Exception1[, Exception2[,...ExceptionN]]]): If there is any exception from the given exception list, then execute this block. ...................... else: If there is no exception then execute this block. ==== The try-finally clause ==== * Syntax: try: You do your operations here; ...................... Due to any exception, this may be skipped. finally: This would always be executed. ...................... Note that you can **provide except clause(s), or a finally clause, but not both**. You can not use else clause as well along with a finally clause. * Example: #!/usr/bin/python try: fh = open("testfile", "w") try: fh.write("This is my test file for exception handling!!") finally: print "Going to close the file" fh.close() except IOError: print "Error: can\'t find file or read data" And to display error detail, you add command **raise**: except IOError: print "Error: can\'t find file or read data" raise ===== Python with Statement ===== With the "With" statement, you get better syntax and exceptions handling: * The with statement **simplifies exception handling** by encapsulating common preparation and cleanup tasks. * In addition, it will **automatically close the file**. The with statement provides a way for ensuring that a clean-up is always used. Without with statement, we use: import sys try: # open file stream file = open("welcome.txt") data = file.read() print data file.close() # It's important to close the file when you're done with it except IOError: print "There was an error reading welcome.txt" sys.exit() With Statement Usage * Opening a file using with is as simple as: with open(filename) as file: import sys with open("welcome.txt") as file: # Use file to refer to the file object data = file.read() do something with data * Opens output.txt in write mode import sys with open('output.txt', 'w') as file: # Use file to refer to the file object file.write('Hi there!') Notice, that we didn't have to write "file.close()". That will automatically be called. ===== Python Classes/Objects ===== ==== Creating Classes, Instant Objects and Using ==== * Syntax: class ClassName: . . . * Simple Python Class: class Employee: 'Common base class for all employees' empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary Employee.empCount += 1 def displayCount(self): print "Total Employee %d" % Employee.empCount def displayEmployee(self): print "Name : ", self.name, ", Salary: ", self.salary * Instant object and using: #This would create first object of Employee class emp1 = Employee("Zara", 2000) #This would create second object of Employee class emp2 = Employee("Manni", 5000) emp1.displayEmployee() emp2.displayEmployee() print "Total Employee %d" % Employee.empCount ==== Class Inheritance and Overriding methods ==== * Syntax: class SubClassName (ParentClass1[, ParentClass2, ...]): . . . * Example for Class Inheritance: #!/usr/bin/python class Parent: # define parent class parentAttr = 100 def __init__(self): print "Calling parent constructor" def parentMethod(self): print 'Calling parent method' def setAttr(self, attr): Parent.parentAttr = attr def getAttr(self): print "Parent attribute :", Parent.parentAttr class Child(Parent): # define child class def __init__(self): print "Calling child constructor" def childMethod(self): print 'Calling child method' c = Child() # instance of child c.childMethod() # child calls its method c.parentMethod() # calls parent's method c.setAttr(200) # again call parent's method c.getAttr() # again call parent's method Output: Calling child constructor Calling child method Calling parent method Parent attribute : 200 * Example for Overriding methods: #!/usr/bin/python class Parent: # define parent class def myMethod(self): print 'Calling parent method' class Child(Parent): # define child class def myMethod(self): print 'Calling child method' c = Child() # instance of child c.myMethod() # child calls overridden method Output: Calling child method ==== Private and public variables ==== Default variable in python are public. For private variable, you can **name attributes with a double underscore prefix**, and those attributes will not be directly visible to outsiders Example: #!/usr/bin/python class JustCounter: __secretCount = 0 def count(self): self.__secretCount += 1 print self.__secretCount counter = JustCounter() counter.count() counter.count() print counter.__secretCount Output: 1 2 Traceback (most recent call last): File "test.py", line 12, in print counter.__secretCount AttributeError: JustCounter instance has no attribute '__secretCount' ==== Python static variable ==== refer: http://radek.io/2011/07/21/static-variables-and-methods-in-python/ **All variables defined on the class level** in Python are considered static. See this example: class Example: staticVariable = 5 # Access through class print Example.staticVariable # prints 5 # Access through an instance instance = Example() print instance.staticVariable # still 5 # Change within an instance instance.staticVariable = 6 print instance.staticVariable # 6 print Example.staticVariable # 5 # Change through class Example.staticVariable = 7 print instance.staticVariable # still 6 print Example.staticVariable # now 7 If variable: * used by class -> static variable * And used by object -> property variable of class(public or private variable) ==== Python static functions ==== With static methods it gets a little more complex. In Python, there are two ways of defining static methods within a class. * **@staticmethod**: Method decorated with this decorator shares with the class only the namespace. Note that, **no arguments are mandatory in the method definition**. Static method can access classes static variables. See in the following example: class Example: name = "Example" @staticmethod def static(): print "%s static() called" % Example.name class Offspring1(Example): name = "Offspring1" class Offspring2(Example): name = "Offspring2" @staticmethod def static(): print "%s static() called" % Offspring2.name Example.static() # prints Example Offspring1.static() # prints Example Offspring2.static() # prints Offspring2 * **@classmethod**:The difference between class method and static method in Python is, that **class method recieves one mandatory argument – a class name it was called from**. Let’s have a look: class Example: name = "Example" @classmethod def static(cls): print "%s static() called" % cls.name class Offspring1(Example): name = "Offspring1" pass class Offspring2(Example): name = "Offspring2" @classmethod def static(cls): print "%s static() called" % cls.name Example.static() # prints Example Offspring1.static() # prints Offspring1 Offspring2.static() # prints Offspring2 ==== Python Interface and Multiple Inheritance ==== Interfaces is **not necessary in Python**. This is because Python has **proper multiple inheritance**, and also ducktyping, which means that the places where you must have interfaces in Java, you don't have to have them in Python.For example: class SomeAbstraction( object ): pass # lots of stuff - but missing something class Mixin1( object ): def something( self ): pass # one implementation class Mixin2( object ): def something( self ): pass # another class Concrete1( SomeAbstraction, Mixin1 ): pass class Concrete2( SomeAbstraction, Mixin2 ): pass ===== Decorators for Functions and Methods ===== A decorator is the name used for a software design pattern. Decorators **dynamically alter the functionality of a function, method, or class without having to directly use subclasses or change the source code of the function being decorated**.\\ refer: http://thecodeship.com/patterns/guide-to-python-function-decorators/\\ https://wiki.python.org/moin/PythonDecoratorLibrary ==== Basic Syntax ==== The current syntax for function decorators as implemented in Python 2.4a2 is: @dec2 @dec1 def func(arg1, arg2, ...): pass => function **func** will **automatically call func = dec2(dec1(func))** after declare This is equivalent to: def func(arg1, arg2, ...): pass func = dec2(dec1(func)) ==== Composition of Decorators ==== refer: [[script:python#python_functions|Python Functions]]\\ Function decorators are **simply wrappers to existing functions**. Putting the ideas mentioned above together, we can build a decorator. In this example let's consider **a function that wraps the string output of another function** by p tags. def get_text(name): return "lorem ipsum, {0} dolor sit amet".format(name) def p_decorate(func): def func_wrapper(name): return "

{0}

".format(func(name)) return func_wrapper my_get_text = p_decorate(get_text) print my_get_text("John") #

Outputs lorem ipsum, John dolor sit amet

=> my_get_text = p_decorate(get_text) generate a new function with name func_wrapper def func_wrapper(name): return "

{0}

".format(get_text(name))
==== Example with Python's Decorator Syntax ==== Python makes creating and using decorators a bit cleaner and nicer for the programmer through some syntactic sugar To decorate get_text we don't have to **get_text = p_decorator(get_text)** There is a neat shortcut for that, which is to mention the name of the decorating function before the function to be decorated. The name of the decorator should be perpended with an @ symbol. def p_decorate(func): def func_wrapper(name): return "

{0}

".format(func(name)) return func_wrapper @p_decorate def get_text(name): return "lorem ipsum, {0} dolor sit amet".format(name) print get_text("John") # Outputs

lorem ipsum, John dolor sit amet

===== Generators functions and Yield ===== **Generators functions** allow you to **declare a function that behaves like an iterator**, i.e. it can be used in a for loop. Refer: * https://wiki.python.org/moin/Generators * http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained ==== Simple code generate iterator ==== * simple example of building a list and returning it # Build and return a list def firstn(n): num, nums = 0, [] while num < n: nums.append(num) num += 1 return nums sum_of_first_n = sum(firstn(1000000)) => The code is quite simple and straightforward, but its builds the full list in memory * The following implements generator as an iterable object(using iterator pattern). The Generator don't store the list in memory # Using the generator pattern (an iterable) class firstn(object): def __init__(self, n): self.n = n self.num, self.nums = 0, [] def __iter__(self): return self # Python 3 compatibility def __next__(self): return self.next() def next(self): if self.num < self.n: cur, self.num = self.num, self.num+1 return cur else: raise StopIteration() sum_of_first_n = sum(firstn(1000000)) ==== Generate iterator with python syntax ==== Python provides generator functions as a convenient shortcut to building iterators. Lets us rewrite the above iterator(simple example) as a generator function: * Generate iterator with **yield** # a generator that yields items instead of returning a list def firstn(n): num = 0 while num < n: yield num num += 1 sum_of_first_n = sum(firstn(1000000)) * Generate iterator with generator expression by replacing the square brackets ("[ ]") with parentheses Or list function: # list comprehension doubles = [2 * n for n in range(50)] # same as the list comprehension above doubles = list(2 * n for n in range(50)) * Generate iterator with xrange: sum_of_first_n = sum(xrange(1000000)) * Generators can be composed. Here we create a generator on the squares of consecutive integers. Toggle line numbers #square is a generator square = (i*i for i in irange(1000000)) #add the squares total = 0 for i in square: total += i * Here, we compose a square generator with the takewhile generator, to generate squares less than 100 Toggle line numbers #add squares less than 100 square = (i*i for i in count()) bounded_squares = takewhile(lambda x : x< 100, square) total = 0 for i in bounded_squares: total += i ===== Python Extending and Embedding ===== ==== Python's C API ==== Build Simple C API module: * Create Hellomodule.c #include static PyObject* say_hello(PyObject* self, PyObject* args) { const char* name; if (!PyArg_ParseTuple(args, "s", &name)) return NULL; printf("Hello %s!\n", name); Py_RETURN_NONE; } static PyMethodDef HelloMethods[] = { {"say_hello", say_hello, METH_VARARGS, "Greet somebody."}, {NULL, NULL, 0, NULL} }; PyMODINIT_FUNC inithello(void) { (void) Py_InitModule("hello", HelloMethods); } * Create setup.py for building from distutils.core import setup, Extension module1 = Extension('hello', sources = ['hellomodule.c']) setup (name = 'PackageName', version = '1.0', description = 'This is a demo package', ext_modules = [module1]) * Build python setup.py build * Building the extension module using Microsoft Visual C++ cl /LD hellomodule.c /Ic:\Python24\include c:\Python24\libs\python24.lib /link/out:hello.dll * Using the extension module import hello hello.say_hello("World") => output: Hello World! ==== Cython ==== refer: http://en.wikipedia.org/wiki/Cython\\ **Cython is a compiled language** that generates CPython extension modules. These extension modules **can then be loaded and used by regular Python code** using the import statement. It works by producing a standard Python module. The difference from standard Python behavior however, is that **the original code of the module is actually written in Python but is then translated into C** {{:python:cython.png|}} Cython has an unusually involved hello world program because it interfaces with the Python C API and the distutils extension building facility. At least three files are required for a basic project: * A setup.py file to invoke the distutils build process that generates the extension module * A main python program to load the extension module * Cython source file(s) The following code listings demonstrate the build and launch process: * # hello.pyx - Python Module, this code will be translated to C by Cython def say_hello(): print "Hello World!" * # launch.py - Python stub loader, loads the module that was made by Cython # This code is always interpreted, like normal Python. # It is not compiled to C. import hello hello.say_hello() * # setup.py - unnecessary if not redistributing the code, see below from distutils.core import setup from Cython.Build import cythonize setup(name = 'Hello world app', ext_modules = cythonize("*.pyx")) * These commands build and launch the program: $ python setup.py build_ext --inplace $ python launch.py ===== Python Unit Test ===== Below are steps to write unittest: - You define your own class derived from unittest Testcase - Write your test functions start with test_ - You run the tests by placing the code unittest.main() in your file, usually at the bottom of file Below are example code: * Example code: import unittest class SimpleTest(unittest.TestCase): def setUp(self): pass def test_numbers_3_4(self): self.assertEqual(3*4, 12) def test_strings_aa_2(self): self.assertEqual( 'aa' * 2, 'aaa') if __name__ == '__main__': unittest.main() * Run: python simpletest.py * Output: .F ====================================================================== FAIL: test_strings_aa_2 (__main__.SimpleTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "simpletest.py", line 11, in test_strings_aa_2 self.assertEqual( 'aa' * 2, 'aaa') AssertionError: 'aaaa' != 'aaa' ---------------------------------------------------------------------- Ran 2 tests in 0.001s FAILED (failures=1)