Python
Python
Python
Python is designed to be highly readable which uses English keywords frequently where as other
languages use punctuation and it has fewer syntactical constructions than other languages.
Scripting language is a form of programming language that is usually interpreted rather than
compiled. Conventional programs like c,c++ are converted permanently into executable files
before they are run. In contrast, programs in scripting language are interpreted one command at
a time.
1. Python is Interpreted:
This means that it is processed at runtime by the interpreter and you do not need to compile your
program before executing it.
2. Python is Interactive:
This means that you can actually sit at a Python prompt and interact with the interpreter directly
to write your programs.
3. Python is Object-Oriented:
This means that Python supports Object-Oriented style or technique of programming that
encapsulates code within objects.
4. Python is Beginner's Language:
Python is a great language for the beginner programmers and supports the development of a
wide range of applications from simple text processing to WWW browsers to games.
The Python version used in this course is 2.7.9.
1.1. Introduction
History of Python
Python was developed by Guido van Rossum in the late eighties and early nineties at the
National Research Institute for Mathematics and Computer Science in the Netherlands.
Python is derived from many other languages, including ABC, Modula-3, C, C++, ALGOL-68,
SmallTalk, and Unix shell and other scripting languages.
Python is now maintained by a core development team at the institute, although Guido van
Rossum still holds a vital role in directing its progress.
Python features
Python's feature highlights include:
Easy-to-learn: Python has relatively few keywords, simple structure and a clearly
defined syntax. This allows the student to pick up the language in a relatively short period
of time.
Easy-to-maintain: Python's success is that its source code is fairly easy-to-maintain.
A broad standard library: One of Python's greatest strengths is the bulk of the library is
very portable and cross-platform compatible on UNIX, Windows and Macintosh.
Interactive Mode: Support for an interactive mode in which you can enter results from a
terminal right to the language, allowing interactive testing and debugging of snippets of
code.
Portable: Python can run on a wide variety of hardware platforms and has the same
interface on all platforms.
Expandable: You can add low-level modules to the Python interpreter. These modules
enable programmers to add to or customize their tools to be more efficient.
Databases: Python provides interfaces to all major commercial databases.
GUI Programming: Python supports GUI applications that can be created and ported to
many system calls, libraries and windows systems, such as Windows MFC, Macintosh
and the X Window system of Unix.
Scalable:
Python provides a better structure and support for large programs than shell
scripting.
Apart from the above-mentioned features, Python has a big list of good features,
few are listed below:
Support for functional and structured programming methods as well as OOP.
It can be used as a scripting language or can be compiled to byte-code for building
large applications.
Very high-level dynamic data types and supports dynamic type checking.
Supports automatic garbage collection.
It can be easily integrated with C, C++, ActiveX, CORBA and Java.
Solution
The output would be as shown below,
print ' $'
print '$$$'
print ' $'
2.2. Practise Problems
1. Write a program to to print a sample text as shown,
This is Python
and hope you are a programmer.
Who wants to learn me?
2. Write a program to get the following output?
w w
www
w
www
w w
The first and last lines have tab as space between them.
3.How to write multiple statements on a single line?
4.Write a program to provide following output
hello 'hi' bye 'why'
5.Write a program to show documented comments in the Program.
Problem statement
#!/usr/bin/python
string1="hello friend welcome to python learning"
print string1[2:4]
print string1[-4:-1]
print string1[-1:-4]
print string1[:12]
print string1[12:]
output of above code will be?
Solution
The output would be as follows,
ll
nin
hello friend
welcome to python learning
When you execute the above program it produces the following result:
Line 1 - a is not equal to b
Line 2 - a is not equal to b
Line 3 - a is not equal to b
Line 4 - a is not less than b
Line 5 - a is greater than b
Line 6 - a is either less than or equal to b
Line 7 - b is either greater than or equal to b
3. Assignment operators
Assume variable a holds 10 and variable b holds 20, then:
Example:
Try following example to understand all the assignment operators available in Python
programming language:
#!/usr/bin/python
a = 21
b = 10
c=0
c=a+b
print "Line 1 - Value of c is ", c
c += a
print "Line 2 - Value of c is ", c
c *= a
print "Line 3 - Value of c is ", c
c /= a
print "Line 4 - Value of c is ", c
c =2
c %= a
print "Line 5 - Value of c is ", c
c **= a
print "Line 6 - Value of c is ", c
c //= a
print "Line 7 - Value of c is ", c
When you execute the above program, it produces the following result:
Line 1 - Value of c is 31
Line 2 - Value of c is 52
Line 3 - Value of c is 1092
Line 4 - Value of c is 52
Line 5 - Value of c is 2
Line 6 - Value of c is 2097152
Line 7 - Value of c is 99864
4. 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:
Example:
Try following example to understand all the bitwise operators available in Python programming
language:
#!/usr/bin/python
a = 60 # 60 = 0011 1100
b = 13 # 13 = 0000 1101
c=0
c = a & b; # 12 = 0000 1100
print "Line 1 - Value of c is ", c
c = a | b; # 61 = 0011 1101
print "Line 2 - Value of c is ", c
c = a ^ b; # 49 = 0011 0001
print "Line 3 - Value of c is ", c
c = ~a; # -61 = 1100 0011
print "Line 4 - Value of c is ", c
c = a << 2; # 240 = 1111 0000
print "Line 5 - Value of c is ", c
c = a >> 2; # 15 = 0000 1111
print "Line 6 - Value of c is ", c
When you execute the above program it produces the following result:
Line 1 - Value of c is 12
Line 2 - Value of c is 61
Line 3 - Value of c is 49
Line 4 - Value of c is -61
Line 5 - Value of c is 240
Line 6 - Value of c is 15
5. Logical operators
There are following logical operators supported by Python language. Assume variable a holds 10
and variable b holds 20 then:
Example:
Try the following example to understand all the logical operators available in Python
programming language:
#!/usr/bin/python
a = 10
b = 20
c=0
if ( a and b ):
print "Line 1 - a and b are true"
else:
print "Line 1 - Either a is not true or b is not true"
if ( a or b ):
print "Line 2 - Either a is true or b is true or both are true"
else:
print "Line 2 - Neither a is true nor b is true"
a=0
if ( a and b ):
print "Line 3 - a and b are true"
else:
print "Line 3 - Either a is not true or b is not true"
if ( a or b ):
print "Line 4 - Either a is true or b is true or both are true"
else:
print "Line 4 - Neither a is true nor b is true"
if not( a and b ):
print "Line 5 - Either a is not true or b is not true"
else:
print "Line 5 - a and b are true"
When you execute the above program it produces the following result:
Line 1 - a and b are true
Line 2 - Either a is true or b is true or both are true
Line 3 - Either a is not true or b is not true
Line 4 - Either a is true or b is true or both are true
Line 5 - Either a is not true or b is not true
6. 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:
Example:
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
7. Identity operators
Identity operators compare the memory locations of two objects. There are two Identity operators
explained below:
Example:
Try following example to understand all the identity operators available in Python programming
language:
#!/usr/bin/python
a = 20
b = 20
if ( a is b ):
print "Line 1 - a and b have same identity"
else:
print "Line 1 - a and b do not have same identity"
if ( id(a) == id(b) ):
print "Line 2 - a and b have same identity"
else:
print "Line 2 - a and b do not have same identity"
b = 30
if ( a is b ):
print "Line 3 - a and b have same identity"
else:
print "Line 3 - a and b do not have same identity"
if ( a is not b ):
print "Line 4 - a and b do not have same identity"
else:
print "Line 4 - a and b have same identity"
When you execute the above program it produces the following result:
Line 1 - a and b have same identity
Line 2 - a and b have same identity
Line 3 - a and b do not have same identity
Line 4 - a and b do not have same identity
Here, statement(s) may be a single statement or a block of statements. The condition may be
any expression, and true is any non-zero value. The loop iterates while the condition is true.
When the condition becomes false, program control passes to the line immediately following the
loop.
In Python, all the statements indented by the same number of character spaces after a
programming construct are considered to be part of a single block of code. Python uses
indentation as its method of grouping statements.
Flow Diagram:
Here, key point of the while loop is that the loop might
not ever run. When the condition is tested and the result is false, the loop body will be skipped
and the first statement after the while loop will be executed.
Example:
#!/usr/bin/python
a=0
while a < 5:
a += 1 # Same as a = a + 1
print (a)
And here is the output:
1
2
3
4
5
2. for loop
The for loop in Python has the ability to iterate over the items of any sequence, such as a list or a
string.
Syntax:
The syntax of a for loop look is as follows:
for iterating_var in sequence:
statements(s)
If a sequence contains an expression list, it is evaluated first. Then, the first item in the sequence
is assigned to the iterating variable iterating_var. Next, the statements block is executed. Each
item in the list is assigned to iterating_var, and the statement(s) block is executed until the entire
sequence is exhausted.
Flow Diagram:
Example:
#!/usr/bin/python
list = [2,4,6,8]
sum = 0
for num in list:
sum = sum + num
print ("The sum is: %d" % sum)
with the output simply being:
The sum is: 20
For / Range Loops:
The range() function creates an arithmetic progression as a list. The for loop can use range to
loop from a beginning integer to an ending integer. The default increment or step value is 1, but
you can set this to any positive or negative integer. Here is the syntax:
range([start,]stop[,step])
Example:
Here is some code to print out the first 9 numbers of the Fibonacci series:
#!/usr/bin/python
a=1
b=1
for c in range(1,10):
print (a)
n=a+b
a=b
b=n
print ("")
with the surprising output :
1
1
2
3
5
8
13
21
34
Everything that can be done with for loops can also be done with while loops but for loops give
an easy way to go through all the elements in a list or to do something a certain number of times.
Else statement used with loops
Python supports to have an else statement associated with a loop statement.
If the else statement is used with a for loop, the else statement is executed when the loop has
exhausted iterating the list.
If the else statement is used with a while loop, the else statement is executed when the condition
becomes false.
Example1: else with for loop
The following example illustrates the combination of an else statement with a for statement that
searches for prime numbers from 10 through 20.
#!/usr/bin/python
for num in range(10,20): #to iterate between 10 to 20
for i in range(2,num): #to iterate on the factors of the number
if num%i == 0: #to determine the first factor
j=num/i #to calculate the second factor
print '%d equals %d * %d' % (num,i,j)
break #to move to the next number, the #first FOR
else: # else part of the loop
print num, 'is a prime number'
Syntax:
The syntax for a break statement in Python is as follows:
break
Example:
#!/usr/bin/python
for letter in 'Python':
if letter == 'h':
break
print 'Current Letter :', letter
When the above code is executed, it produces the following result:
Current Letter : P
Current Letter : y
Current Letter : t
2. continue statement
The continue statement in Python returns the control to the beginning of the while loop. The
continue statement rejects all the remaining statements in the current iteration of the loop and
moves the control back to the top of the loop.
The continue statement can be used in both while and for loops.
Syntax:
The syntax for a continue statement in Python is as follows:
continue
Example:
#!/usr/bin/python
for letter in 'Python':
if letter == 'h':
continue
print 'Current Letter :', letter
When the above code is executed, it produces the following result:
Current Letter : P
Current Letter : y
Current Letter : t
Current Letter : o
Current Letter : n
3. 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.
The pass statement is a null operation; nothing happens when it executes. The pass is also
useful in places where your code will eventually go, but has not been written yet for ex. in stubs.
The syntax for a pass statement in Python is as follows:
pass
Example:
#!/usr/bin/python
for letter in 'Python':
if letter == 'h':
pass
print 'This is pass block'
print 'Current Letter :', letter
print "Good bye!"
When the above code is executed, it produces following result:
Current Letter : P
Current Letter : y
Current Letter : t
This is pass blocks
Current Letter : h
Current Letter : o
Current Letter : n
9.1. Lists
Overview
The list type is a container that holds a number of other objects, in a given order. The list type
implements the sequence protocol, and also allows you to add and remove objects from the
sequence.
Creating Lists
To create a list, put a number of expressions in square brackets:
L=[]
L = [expression, ...]
Example:
#!/usr/bin/python
L=[1,2,3,4,5,6,7,8]
list1 = ['physics', 'chemistry', 1997, 2000]
list2 = [1, 2, 3, 4, 5 ]
list3 = ["a", "b", "c", "d"]
listinlist=[1,2,[3,4,5],4,5]
Like string indices, list indices start at 0, and lists can be sliced, concatenated and so on.
Accessing Lists
Lists implement the standard sequence interface; len(L) returns the number of items in the list,
L[i] returns the item at index i (the first item has index 0), and L[i:j] returns a new list, containing
the objects between i and j.
Example:
list1 = ['india','australia','south africa','west indies']
print list1[0],"has brighter chances to win the world cup"
print "But may face competition from",list1[2]
Output of the program is:
india has brighter chances to win the world cup
But may face competition from south africa
Looping over Lists
The for-in statement makes it easy to loop over the items in a list:
Example:
#!/usr/bin/python
list1 = ['physics', 'chemistry', 1997, 2000]
for element in list1:
print element
Output:
physics
chemistry
1997
2000
If you need only the index, use range and len:
To understand this here is an example,
#!/usr/bin/python
list1 = ['physics', 'chemistry', 1997, 2000]
for index in range(len(list1)):
print index
Output is:
0123
Modifying Lists
We can update single or multiple elements of lists by giving the slice on the left-hand side of the
assignment operator, and you can add to elements in a list with the append() method. Following
is a simple example:
Example:
#!/usr/bin/python
List1=['a','b',1,'c']
List1[2]='d'
print List1
Output of the program is:
['a', 'b', 'd', 'c']
We can also delete an element from a list by using del operator.
Example:
#!/usr/bin/python
List1=['a','b',1,'c']
del List1[2]
print List1
Output:
['a', 'b', 'c']
Basic List operations
Lists respond to the + and * operators much like strings; they mean concatenation and repetition
here too, except that the result is a new list, not a string.
In fact, lists respond to all of the general sequence operations we used on strings.
Built-in functions
Python includes the following list functions:
1.cmp(list1, list2)
Compares elements of both lists.
2.len(list)
Gives the total length of the list.
3.max(list)
Returns item from the list with max value.
4.min(list)
Returns item from the list with min value.
5.list(seq)
Converts a tuple into list.
Built-in methods
Python includes following list methods
1.list.append(obj)
Appends object obj to list
2.list.count(obj)
Returns count of how many times obj occurs in list
3.list.extend(seq)
Appends the contents of seq to list
4.list.index(obj)
Returns the lowest index in list that obj appears
5.list.insert(index, obj)
Inserts object obj into list at offset index
6.list.pop(obj=list[-1])
Removes and returns last object or obj from list
7.list.remove(obj)
Removes object the obj from list
8.list.reverse()
Reverses the objects of list in place
9.list.sort()
Sorts the objects of list
9.2. Tuples
Overview
A tuple is a sequence of immutable Python objects. Tuples are sequences, just like lists. The
only difference is that tuples can't be changed i.e., tuples are immutable and tuples use
parentheses and lists use square brackets.
Creating tuples
Creating a tuple is as simple as putting different comma-separated values and optionally you can
put these comma-separated values between parentheses also.
For example:
tup1 = ('p', 'c', 19, 20)
tup2 = (1, 2, 3, 4, 5 )
tup3 = "a", "b", "c", "d"
tup4 = 'a','b','c','d'
The empty tuple is written as two parentheses containing nothing:
tup1 = ()
To write a tuple containing a single value you have to include a comma, even though there is
only one value to differentiate it with other data types:
tup1 = (50,)
Accessing tuples
To access values in tuple, use the square brackets for slicing along with the index or indices to
obtain value available at that index. Following is a simple example:
#!/usr/bin/python
t=(1,2,3)
print t[0]
print t+(t[0],)
Output would be:
1
(1, 2, 3, 1)
Modifying tuples
Tuples are immutable which means you cannot update or change the values of tuple elements.
You are able to take portions of existing tuples to create new tuples.
Example:
#!/usr/bin/python
t=(1,2,3,4)
t[0]=10 #not a valid operation on tuple
t2=t+t #This is possible
and t2 would be (1,2,3,4,1,2,3,4)
Removing individual tuple elements is not possible.But, using del operator it is possible to delete
whole tuple object.
Example:
#!/usr/bin/python
t=(103,6527,10)
del t
print t
Output:
Name Error: name 't' is not defined.
Basic tuple operations
Tuples respond to the + and * operators much like strings; they mean concatenation and
repetition here too, except that the result is a new tuple, not a string.
Built-in
tuple functions
Python includes following tuple functions
1.cmp(tuple1, tuple2)
Compares elements of both tuples.
2.len(tuple)
Gives the total length of the tuple.
3.max(tuple)
Returns item from the tuple with max value.
4.min(tuple)
Returns item from the tuple with min value.
5.tuple(seq)
Converts a list into tuple
9.5. Sets
A set is a dictionary with no values. It has only unique keys. Its syntax is similar to that for a
dictionary. But we omit the values,and can use complex,powerful set logic.
1. Creating a set
General syntax for set creation is as follows:
set1={'a','b','c'}
We can also create a set using set() function by providing parameters as list.
Example:
set1=set([1,2])
Note : Use set() operator for creating empty set ,variable with empty {} will be considered as a
dictionary.
2. Modifying sets
This example explains about the usage of sets.
#!/usr/bin/python
set1 = set() # A new empty set
set1.add("cat")
''' Adds a single member
(We can't add several members using add operator)
'''
set1.update(["dog", "mouse"]) # Adds several members
if "cat" in set1: # Membership test
set1.remove("cat") #removes string literal “cat”
#set1.remove("elephant") - throws an error as there is no “elephant” in set list
print set1
for item in set1: # Iteration on sets
print item
print "Item count:", len(set1) # size of set1 is printed as output
len(set1) == 0 # Tests if set is empty
set1 = set(["cat", "dog"]) # Initialize set from a list
set2 = set(["dog", "mouse"])
set3 = set1 & set2 # Intersection of sets
set31=set1.intersection(set2) # same as above
set4 = set1 | set2 # Union of sets
set41=set1.union(set2) #same as above
set5 = set1 - set3 # Set difference
set6 = set1.difference(set3) #output would be same as set5
set1 <= set2 # Subset test(returns true if set1 is a subset of set2)
set1.issubset(set2) #same as set1<=set2
set1 >= set2 # Superset test(returns true if set1 is a super of set2)
set1.issuperset(set2) #same as set1>=set2
set8 = set1.copy() # set1 is copied to set8
set8.clear() # Clears all the elements of set8
2.
The file object attributes
Once a file is opened and you have one file object, you can get various information related to that
file.
Here is a list of all attributes related to file object:
Attribute Description
file.closed Returns true if file is closed, false otherwise.
file.mode Returns access mode with which file was opened.
file.name Returns name of the file.
file.softspace Returns false if space explicitly required with print, true otherwise.
EXAMPLE:
#!/usr/bin/python
# Open a file
fo = open("foo.txt", "wb")
print "Name of the file: ", fo.name
print "Closed or not : ", fo.closed
print "Opening mode : ", fo.mode
print "Soft space flag : ", fo.softspace
This would produce the following result:
Name of the file: foo.txt
Closed or not : False
Opening mode : wb
Soft space flag : 0
3. The close() Method
The close() method of a file object flushes any unwritten information and closes the file object,
after which no more writing can be done.
Python automatically closes a file when the reference object of a file is
reassigned to another file. It is a good practice to use the close() method to close a file.
SYNTAX:
fileObject.close();
EXAMPLE:
# Open a file
fo = open("foo.txt", "wb")
print "Name of the file: ", fo.name
# Close opened file
fo.close()
This would produce the following result:
Name of the file: foo.txt
13.1. Exception
What is Exception?
Even if a statement or expression is syntactically correct, it may cause an error when an attempt
is made to execute it. Errors detected during execution are called exceptions and are not
unconditionally fatal: you will soon learn how to handle them in Python programs. Most
exceptions are not handled by programs, however, and result in error messages as shown here:
>>> 10 * (1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ZeroDivisionError: integer division or modulo by zero
>>> 4 + spam*3
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects
The last line of the error message indicates what happened. Exceptions come in different types,
and the type is printed as part of the message: the types in the example are ZeroDivisionError,
NameError and TypeError. The string printed as the exception type is the name of the built-in
exception that occurred. This is true for all built-in exceptions, but need not be true for user-
defined exceptions (although it is a useful convention). Standard exception names are built-in
identifiers (not reserved keywords).
The rest of the line provides detail based on the type of exception and what caused it.
The preceding part of the error message shows the context where the exception happened, in
the form of a stack traceback. In general it contains a stack traceback listing source lines;
however, it will not display lines read from standard input.
Built-in Exceptions lists the built-in exceptions and their meanings.
Handling exceptions
If you have some suspicious code that may raise an exception, you can defend your program by
placing the suspicious code in a try: block. After the try: block, include an except: statement,
followed by a block of code which handles the problem as elegantly as possible.
SYNTAX:
Here is simple syntax of try....except...else blocks:
#!/usr/bin/python
try:
You do your operations here;
......................
except Exception1:
If there is Exception1, then execute this block.
except Exception2:
If there is Exception2, then execute this block.
......................
else:
If there is no exception then execute this block.
Here are few important points about the above-mentioned syntax:
A single try statement can have multiple except statements. This is useful when the try
block contains statements that may throw different types of exceptions.
You can also provide a generic except clause, which handles any exception.
After the except clause(s), you can include an else-clause. The code in the else-block
executes if the code in the try: block does not raise an exception.
The else-block is a good place for code that does not need the try: block's protection.
EXAMPLE:
Here is simple example, which opens a file and writes the content in the file and comes out
gracefully because there is no problem at all:
#!/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()
This will produce the following result:
Written content in the file successfully.
EXAMPLE:
Here is one more simple example, which tries to open a file where you do not have permission to
write in the file, so it raises an exception:
#!/usr/bin/python
try:
fh = open("testfile", "r")
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:
This will produce the following result:
Error: can't find file or read data
The except clause with no exceptions:
You can also use the except statement with no exceptions defined as follows:
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.
This kind of a try-except statement catches all the exceptions that occur. Using this kind of try-
except statement is not considered a good programming practice though, because it catches all
exceptions but does not make the programmer identify the root cause of the problem that may
occur.
Example:
# import module sys to get the type of exception
#!/usr/bin/python
import sys
while True:
try:
x = int(input("Enter an integer: "))
r = 1/x
break
except:
print("Oops!",sys.exc_info()[0],"occured.")
print("Please try again.")
print()
print("The reciprocal of",x,"is",r)
Here is a sample run of this program.
Enter an integer: 1.3
Oops! <class 'ValueError'> occured.
Please try again.
Enter an integer: 0
Oops! <class 'ZeroDivisionError'> occured.
Please try again.
Enter an integer: 2
The reciprocal of 2 is 0.5
In this program, we loop until the user enters an integer that has a valid reciprocal. The portion
that can cause exception is placed inside try block. If no exception occurs, except block is
skipped and normal flow continues. But if any exception occurs, it is caught by the except block.
Here, we print the name of the exception using ex_info() function inside sys module and ask the
user to try again. We can see that the values 'a' and '1.3' causes ValueError and '0' causes
ZeroDivisionError.
The except clause with multiple exceptions:
You can also use the same except statement to handle multiple exceptions as follows:
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.
Example:
#!/usr/bin/python
try:
f = open('integers.txt')
s = f.readline()
i = int(s.strip())
except (IOError, ValueError):
print("An I/O error or a ValueError occurred")
except:
print("An unexpected error occurred")
raise
The try-finally clause:
You can use a finally: block along with a try: block. The finally block is a place to put any code
that must execute, whether the try-block raised an exception or not.
The syntax of the try-finally statement is this:
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")
fh.write("This is my test file for exception handling!!")
finally:
print "Error: can\'t find file or read data"
If you do not have permission to open the file in writing mode, then this will produce the following
result:
Error: can't find file or read data
Same example can be written more cleanly as follows:
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"
When an exception is thrown in the try block, the execution immediately passes to the finally
block. After all the statements in the finally block are executed, the exception is raised again and
is handled in the except statements if present in the next higher layer of the try-except statement.
Argument of an Exception:
An exception can have an argument, which is a value that gives additional information about the
problem. The contents of the argument vary by exception. You capture an exception's argument
by supplying a variable in the except clause as follows:
try:
You do your operations here;
......................
except ExceptionType, Argument:
You can print value of Argument here...
If you are writing the code to handle a single exception, you can have a variable follow the name
of the exception in the except statement. If you are trapping multiple exceptions, you can have a
variable follow the tuple of the exception.
This variable will receive the value of the exception mostly containing the cause of the exception.
The variable can receive a single value or multiple values in the form of a tuple. This tuple
usually contains the error string, the error number, and an error location.
EXAMPLE:
Following is an example for a single exception:
#!/usr/bin/python
# Define a function here.
def temp_convert(var):
try:
return int(var)
except ValueError, Argument:
print "The argument does not contain numbers\n", Argument
# Call above function here.
temp_convert("xyz");
This would produce the following result:
The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'
14.2. Methods
A function defined in a class is called a "method". Methods have access to all the data contained
on the instance of the object. they can access and modify anything previously set on self
(discussed in 1.2.2.4). Because they use self, they require an instance of the class in order to be
used. For this reason, they're often referred to as "instance methods".
Constructor __init__
The __init__ method is run as soon as an object of a class is instantiated. Its aim is to initialize
the object. While creating an instance we need some values for internal data.
Example of class with __init__ method
#!/usr/bin/python
class Coordinate(object):
def __init__(self,x,y):
self.x=x
self.y=y
The “.” operator is used to access an attribute of an object. So the __init__ method above is
defining two attributes for new Coordinate object x and y.
Now,c=Coordinate(3,4)
print c.x,c.y
Prints 3 4 as output
Invoking attributes and methods
Syntax to invoke attribute:
object.attribute
Syntax to invoke method:
object.method()
User defined methods
User defined methods are same as function definition but must be defined inside a class.
Example of class with methods:
#!/usr/bin/python
class Rectangle:
def __init__(self,x,y):
self.x = x
self.y = y
def area(self):
return self.x * self.y
def perimeter(self):
return 2 * self.x + 2 * self.y
This example has methods area and perimeter that are used to calculate area and perimeter of
an object of the class Rectangle.
self
Each method in a class definition begins with a reference to the instance object. It is by
convention named self i.e., methods class access data via self.
For example above(Rectangle class),
instantiate object
r=Rectangle(4,5)
r.area() #area() method uses x and y attributes using self
“Self” in Python works as a variable of function but it won't invoke data.
Form and object for a class
Class includes two members form and object.
The following example can explain the difference between form and object for a class.
#!/usr/bin/python
Class A:
i=123 #It is a form
def __init__(self):
self.i=12345
print A.i #It is a form
print A().i #It is an object
Output would be
123
12345
Destructor
Destructor method is used to delete an object created by initializing constructor.
It is called when the instance is about to be destroyed.
The following example shows a class with constructor and destructor:
#!/usr/bin/python
class Greeting:
def __init__(self, name):
self.name = name
def __del__(self):
print "Destructor started"
def SayHello(self):
print "Hello", self.name
make_cycle()
Because make_cycle() creates an object l which refers to itself, the object l will not automatically
be freed when the function returns.
This will cause the memory that l is using to be held onto until the Python garbage collector is
invoked.
Automatic Garbage Collection of Cycles
Because reference cycles are take computational work to discover, garbage collection must be a
scheduled activity. Python schedules garbage collection based upon a threshold of object
allocations and object deallocations. When the number of allocations minus the number of
deallocations are greater than the threshold number, the garbage collector is run. One can
inspect the threshold for new objects (objects in Python known as generation 0 objects) by
loading the gc module and asking for garbage collection thresholds:
import gc
print "Garbage collection thresholds: %r" % gc.get_threshold()
Garbage collection thresholds: (700, 10, 10)
Here we can see that the default threshold on the above system is 700. This means when the
number of allocations vs. the number of deallocations is greater than 700 the automatic garbage
collector will run.
Automatic garbage collection will not run if your Python device is running out of memory; instead
your application will throw exceptions, which must be handled or your application crashes. This is
aggravated by the fact that the automatic garbage collection places high weight upon the
NUMBER of free objects, not on how large they are. Thus any portion of your code which frees
up large blocks of memory is a good candidate for running manual garbage collection.
Manual Garbage Collection
For some programs, especially long running server applications or embedded applications
running on a Digi Device automatic garbage collection may not be sufficient. Although an
application should be written to be as free of reference cycles as possible, it is a good idea to
have a strategy for how to deal with them. Invoking the garbage collector manually during
opportune times of program execution can be a good idea on how to handle memory being
consumed by reference cycles.
The garbage collection can be invoked manually in the following way:
import gc
gc.collect()
gc.collect() returns the number of objects it has collected and deallocated. You can print this
information in the following way:
import gc
collected = gc.collect()
print "Garbage collector: collected %d objects." % (collected)
If we create a few cycles, we can see manual collection work:
import sys, gc
def make_cycle():
l={}
l[0] = l
def main():
collected = gc.collect()
print "Garbage collector: collected %d objects." % (collected)
print "Creating cycles..."
for i in range(10):
make_cycle()
collected = gc.collect()
print "Garbage collector: collected %d objects." % (collected)
if __name__ == "__main__":
ret = main()
sys.exit(ret)
In general there are two recommended strategies for performing manual garbage collection:
time-based and event-based garbage collection. Time-based garbage collection is simple: the
garbage collector is called on a fixed time interval. Event-based garbage collection calls the
garbage collector on an event. For example, when a user disconnects from the application or
when the application is known to enter an idle state.
Recommendations
Which garbage collection technique is correct for an application? It depends. The garbage
collector should be invoked as often as necessary to collect cyclic references without affecting
vital application performance. Garbage collection should be a part of your Python application
design process.
1) Do not run garbage collection too freely, as it can take considerable time to evaluate every
memory object within a large system. For example, one team having memory issues tried calling
gc.collect() between every step of a complex start-up process, increasing the boot time by 20
times (2000%). Running it more than a few times per day - without specific design reasons is
likely a waste of device resources.
2) Run manual garbage collection after your application has completed start up and moves into
steady-state operation. This frees potentially huge blocks of memory used to open and parse file,
to build and modify object lists, and even code modules never to be used again. For example,
one application reading XML configuration files was consuming about 1.5MB of temporary
memory during the process. Without manual garbage collection, there is no way to predict when
that 1.5MB of memory will be returned to the python memory pools for reuse.
3) Consider manually running garbage collection either before or after timing-critical sections of
code to prevent garbage collection from disturbing the timing. As example, an irrigation
application might sit idle for 10 minutes, then evaluate the status of all field devices and make
adjustments.Since delays during system adjustment might affect field device battery life, it makes
sense to manually run garbage collection as the gateway is entering the idle period after the
adjustment process - or run it every sixth or tenth idle period. This insures that garbage collection
won't be triggered automatically during the next timing-sensitive period.
Inheritance Syntax:
class Derivedclass(Baseclass):
…
…
Example:
Consider a class Shape as shown below,
#!/usr/bin/python
class Shape:
def __init__(self,x,y):
self.x = x
self.y = y
self.description = "This shape has not been described yet"
self.author = "Nobody has claimed to make this shape yet"
def area(self):
return self.x * self.y
def perimeter(self):
return 2 * self.x + 2 * self.y
def describe(self,text):
self.description = text
def authorName(self,text):
self.author = text
def scaleSize(self,scale):
self.x = self.x * scale
self.y = self.y * scale
TestAnimals=TestAnimals()
dog=Dog()
cat=Cat()
lion=Lion()
TestAnimals.PrintName(dog)
TestAnimals.GotoSleep(dog)
TestAnimals.MakeNoise(dog)
TestAnimals.PrintName(cat)
TestAnimals.GotoSleep(cat)
TestAnimals.MakeNoise(cat)
TestAnimals.PrintName(lion)
TestAnimals.GotoSleep(lion)
TestAnimals.MakeNoise(lion)
As you can see same methods are repeated in different classes, It is called method overloading.
The output of above program is,
I am a dog
sleep
Woof
I am cat
sleep
Meow
I am a lion
sleep
Roar
Suppose you've created a Vector class to represent two-dimensional vectors, what happens
when you use the plus operator to add them? Most likely Python will not work as desired.
You could, however, define the __add__ method in your class to perform vector addition and
then the plus operator would behave as per expectation. This is called as operator overloading.
EXAMPLE:
#!/usr/bin/python
class Vector:
def __init__(self, a, b):
self.a = a
self.b = b
def __str__(self):
return 'Vector (%d, %d)' % (self.a, self.b)
def __add__(self,other):
return Vector(self.a + other.a, self.b + other.b)
v1 = Vector(2,10)
v2 = Vector(5,-2)
print v1 + v2
When the above code is executed, it produces the following result:
Vector(7,8)