Python

= Basics=

Variables
Declaring Variables: list=[1,2,3] string="Hello" int=23

Basic argument specifiers:

%s                     - String (or any object with a string representation, like numbers) %d                     - Integers %f                     - Floating point numbers %. f  - Floating point numbers with a fixed amount of digits to the right of the dot. %x/%X                  - Integers in hex representation (lowercase/uppercase)

Indentation is Mandatory in python:

num=12 if num>5: print("Number is greater than 5") if num<20: print("Number is lesser than 20") print("Program Ended")

Operator Precedence from highest to lowest order:



Statements
IF & ELIF statements:

num=9 if num==5: print("Number is 5") elif num ==11: print("Number is 11") elif num==7: print("Number is 7") else: print("Number isn't 5,11,7")

AND returns true only if both are true >>> 1 == 1 and 2==2 True >>> 1 == 1 and 2==3 False >>> 1 != 1 and 2==2 False >>> 1 == 1 and 2==2 True

OR returns true if either of both arguments are true; false if both are false. >>> 1 != 1 or 2==2 True >>> 1 == 1 or 2==2 True >>> 1 == 1 or 2==3 True

Lists
words=["Hello","World","!"] print(words[0]) print(words[1]) print(words[2])

Mixed List: number=3 things=['string',0,[1,2,number],4,56] print(things[1]) print(things[2]) print(things[2][2])

List Operators: nums = [1,2,3] print(nums+[4,5,6]) print(nums*3)

in operator: >>> words=['spam',"egg"] >>> print("spam" in words) True >>> print("tomato" in words) False >>> print (not "tomato" in words) True >>> print ("tomato" not in words) True

Append to the list: nums=[1,2,3] nums.append(4) print(nums)

Len function:

nums=[1,3,5,2,4] print(len(nums))
 * 1) Unlike append, len is a normal function rather than a method.
 * 2) Therefore it is written before the list it is being called on, without a dot.

Insert Method is similar to append, but allows to add at any position in the list words=["Python","fun"] index=1 words.insert(index,"is") print(words)

Loops
While Loop runs more than once, till condition is true, once condition is false, next section of code is executed: i=1 while i<=500: print(i) i=i+1

print("Finished !")

Infinity while loop: condition always remain True: while 1==1: print('In a loop..!!')

Break the infinity Loop: i=0 while 1==1: print(i) i=i+1 if i>=25: print('Breaking!') break

print("Finished!")

Continue this jumps back to top of the loop, rather than stopping it i=0 while True: i=i+1 if i==10: print('Skip 10') continue if i==25: print("Breaking") break print(i) print("Finished!")

words = ["hello","world","spam","egg"] counter = 0 max_index = len(words)-1
 * While Loop

while counter <= max_index: word = words[counter] print(word + "!") counter = counter + 1

words = ["hello","world","spam","egg"] for word in words: print(word + "!")
 * Same code can be created using FOR Loop but fewer lines

Loop can be combined with Range objects(No need to call List on range objects in For Loop as it is not indexed): for i in range(5): print("hello")

Functions
def myfunc: print("spam") print("spam") print("spam")

myfunc

Arguments

def printe(word): print(word + "!")

printe("spam") printe("world") printe("egg")

Arguments: Functions can have more that 1 argument: def print_twice(x,y): print(x+y) print(x+y)

print_twice(5,8)

Function arguments can be used as variables inside function, not outside: def incr(x): x += 1 print(x)

incr(7) print(x)

Return: int & str functions return a value which can be used later: Return cannot be used outside of a function. def max(x,y): if x>=y: return x else: return y

print(max(4,7)) z = max(8,5) print(z)

def short(x,y): if len(x) <= len(y): return x else: return y

After using return in a function, it stops executing immediately: def add(x,y): total = x + y return total print("This wont be printed")

print(add(4,5))

Comments
print("Test") #This is also a comment.
 * 1) This is a comment.
 * 1) print("Test 2")

Docstrings: def excl(word): """ Print a word with exclamation! """ print(word + "!")

shout("spam")

Functions as an Object: they can be assigned & reassigned to variables. def multiply(x,y): return x*y

a = 4 b = 7 operation = multiply print(operation(a,b))

def shout(word): return word + "!" speak = shout output = speak("shout") print(output)

Function can be used as arguments of other functions: def add(x,y): return x + y

def twice(func(x,y)): return func(func(x,y), func(x,y))

a=6 b=12

print(twice(add,a,b))

def square(x): return x*x

def test(func,x): print(func(x))

test(square,42)

Arrays
x = [1,2,3,4,5] for i in range(5): print x[i]
 * Using Array

f = [] for i in range(30): f.append(i) print f
 * Append to Array

= Modules =

Modules are piece of code written by others to fulfil common tasks.

Print 5 random numbers in range 1 to 8: import random for i in range(5): value = random.randint(1,8) print(value)

import math num = 10 print(math.sqrt(num))

Import certain functions only from module: from math import pi print(pi)

from math import pi,sqrt from math import *           # not recommended, can confuse the variables in code with variables external module.

from math import sqrt as square_root print(square_root(100))

3 types of Modules:

Standard Library -> string, re, datetime, math, random, os, multiprocessing, subprocess, socket, email, json, doctest, unitest, pdb, argparse, sys Installed from external sources Manually written

Python Package Index
PyPI is used to install 3rd party modules. sudo apt-get install python-pip

pip install library_name pip install paramiko

List modules:

pip list pip freeze help('modules')

= Exceptions =

ImportError: an import fails IndexError: list is indexed with an out of range number NameError: an unknown variable is used SyntaxError: the code can't be parsed properly TypeError: a function is called on a value of inappropriate type ValueError: a function is called on value of correct type but with inappropriate value OSError:

Third party libraries has their own defined exceptions.

ZeroDivisionError: x = 7 y = 0 print(x/y)

Exception Handling
try: x = 7 y = 0 print(x/y) print("Calc Done") except ZeroDivisionError: print("An Error Occured") print("due to zero division")

Handling multiple exceptionin a single except statement: try: x = 10 print(x + "Hello") print(x / 2) except ZeroDivisionError: print("Division by Zero") except(ValueError, TypeError): print("Error occured")

Catch all error(not recommended, they can catch unexpected errors and hide programming mistakes): Exception handling is quite useful when dealing with user input. try: word = "spam" print(word / 0) except: print("An error occured")

Finally: this code will always run, even if uncaught exception occurs. try: print("Hello") print(1/0) except ZeroDivisionError: print("Div by Zero") finally: print("This will always run")

try: print(1) print(10/0) except ZeroDivisionError: print(unknown_var) finally: print("This is executed last")

Raising Exceptions: print(1) raise ValueError print(2)

name = "123" raise NameError("Invalid name!")

x = input(":") if float(x) < 0: raise ValueError("Negative!")

Raise statement can be used to raise whatever exception occurs: try: x = 5/0 except: print("An error occured") raise

= Assertions =

Used for sanity checking, programmers use this at start of fuction to check for valid input and after function call to check for valid output.

Expression is tested, if result is false, an exception is raised. print(1) assert 2+2 == 4 print(2) assert 1 + 1 == 3 print(3)

Assertons can take a second argument passed to AssertionError if assertion fails:

Assertions can be caught & handled like other exceptions using Try-Except statement.

If not handled, it can terminate the program. temp = -10 assert (temp >= 0),"Colder than absolute Zero!"

= Exercise =

Function that returns sum of all numbers from 0 till that number: def sum(x): res=0 for i in range(x): res+=1 return res

What is highest nymber output by this code? def nums(x): for i in range(x): print(i) return nums(10)

What is the output of this code? def func(x): res = 0 for i in range(x): res += i return res

print(func(4))

What is the highest number printed by this code: print(0) assert "h" != "w" print(1) assert False print(2) assert True print(3)

= Running Unix Commands =

os.system(deprecated)
import os os.system("date")

import os f = os.popen('date') now = f.read print "Today is ", now

Subprocess
Basic usage: import subprocess subprocess.call("command1") subprocess.call(["command1", "arg1", "arg2"])

Execute the date command: import subprocess subprocess.call("date")

Execute ls command with arguments: import subprocess subprocess.call(["ls", "-l", "/etc/resolv.conf"])

Execute date command: import subprocess p = subprocess.Popen("date", stdout=subprocess.PIPE, shell=True) (output, err) = p.communicate print "Today is", output

import subprocess p = subprocess.Popen(["ls", "-l", "/etc/resolv.conf"], stdout=subprocess.PIPE) output, err = p.communicate print "*** Running ls -l command ***\n", output

import subprocess p = subprocess.Popen(["ping", "-c", "10", "4.2.2.2"], stdout=subprocess.PIPE) output, err = p.communicate print output

The only problem with above code is that output, err = p.communicate will block next statement till ping is completed i.e. you will not get real time output from the ping command.

So you can use the following code to get real time output: import subprocess cmdping = "ping -c4 4.2.2.2" p = subprocess.Popen(cmdping, shell=True, stderr=subprocess.PIPE) while True: out = p.stderr.read(1) if out == '' and p.poll != None: break if out != '': sys.stdout.write(out) sys.stdout.flush

=Using SSH=

import paramiko ssh = paramiko.SSHClient ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy) ssh.connect( '192.168.1.23', username = 'root', password = 'libreelec' ) stdin, stdout, stderr = ssh.exec_command( 'ls -al' )

for line in stdout: print('... ' + line.strip('\n')) ssh.close

= Using Databases =

Installing Modules for MySQL: sudo apt-get install python-pip python-dev libmysqlclient-dev pip install MySQL-python

Connecting to a DB on localhost(need to create a db 'testdb' beforehand):

Source: tutorialspoint.com import MySQLdb db = MySQLdb.connect("localhost","guest","guest123","testdb")
 * 1) !/usr/bin/python

cursor = db.cursor cursor.execute("SELECT VERSION") data = cursor.fetchone print "Database Version : %s " % data db.close

Creating Database: import MySQLdb db = MySQLdb.connect("localhost","guest","guest123","testdb")
 * 1) !/usr/bin/python

cursor = db.cursor sql="""CREATE table book_tbl (      book_id INT NOT NULL AUTO_INCREMENT,       book_title VARCHAR(100) NOT NULL,       book_author VARCHAR(100) NOT NULL,       submission_date DATE,       PRIMARY KEY( book_id ));"""

cursor.execute(sql) db.close

Writing to Database with User Input: import MySQLdb a=int(input('Please enter the Book ID:\n')) b=str(raw_input('Please enter the Book Title:\n')) c=str(raw_input('Please enter the Book Author:\n')) d=int(input('Please enter the Book Submission Date:\n'))
 * 1) !/usr/bin/python

db = MySQLdb.connect("localhost","guest","guest123","testdb" )

cursor = db.cursor

sql = "INSERT INTO book_tbl(book_id, \      book_title, book_author, submission_date) \       VALUES ('%d', '%s', '%s', '%d' )" % \ (a, b, c, d ) try: cursor.execute(sql) db.commit print("Database Updated.") except: db.rollback print("Error when saving to DB.\n") db.close

Read from Database: import MySQLdb db = MySQLdb.connect("localhost","guest","guest123","testdb" )
 * 1) !/usr/bin/python

cursor = db.cursor

sql = "SELECT * FROM book_tbl WHERE book_id > '%d'" % (10)

try: cursor.execute(sql) results = cursor.fetchall for row in results: ID = row[0] Title = row[1] Author = row[2] Date = row[3]

print "ID=%d,Title=%s,Author=%s,Date=%s" % (ID, Title, Author, Date ) except: print "Error: unable to fetch data" db.close

= GUI =

Hello World
from Tkinter import Tk, Label

root = Tk

w = Label(root, text="Hello World!") w.pack

root.mainloop

= Misc =
 * Pause

import time time.sleep(5)


 * EasySNMP

sudo apt-get install libsnmp-dev snmp-mibs-downloader sudo apt-get install gcc python-dev sudo pip install easysnmp

from easysnmp import snmp_get snmp_get('.1.3.6.1.4.1.2021.10.1.3.1', hostname='10.107.88.93', community='public', version=2)


 * References