Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
2 views

Python Programming Notes Paid

This document introduces the Python programming language, highlighting its high-level nature, advantages over low-level languages, and the processes of interpretation and compilation. It covers Python's history, features, installation instructions for various platforms, and methods for running Python programs, including interactive and script modes. Additionally, it discusses debugging, types of errors, and the importance of understanding syntax, runtime, and semantic errors.

Uploaded by

zeddiff860
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
2 views

Python Programming Notes Paid

This document introduces the Python programming language, highlighting its high-level nature, advantages over low-level languages, and the processes of interpretation and compilation. It covers Python's history, features, installation instructions for various platforms, and methods for running Python programs, including interactive and script modes. Additionally, it discusses debugging, types of errors, and the importance of understanding syntax, runtime, and semantic errors.

Uploaded by

zeddiff860
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 307

UNIT 1

1.1 Introduction:

1. The Python Programming Language:


1 The programming language you will be learning is Python. Python is an example of a
high-level language; other high-level languages you might have heard of are C++, PHP,
and Java.
2 As you might infer from the name high-level language, there are also low-level
languages, sometimes referred to as machine languages or assembly languages.
Loosely speaking, computers can only execute programs written in low-level
languages. Thus, programs written in a high-level language have to be processed before
they can run. This extra processing takes some time, which is a small disadvantage of
high-level languages.
3 But the advantages are enormous. First, it is much easier to program in a high-level
language. Programs written in a high-level language take less time to write, they are
shorter and easier to read, and they are more likely to be correct. Second, high-level
languages are portable, meaning that they can run on different kinds of computers with
few or no modifications. Low-level programs can run on only one kind of computer
and have to be rewritten to run on another.
4 Due to these advantages, almost all programs are written in high-level languages.
Low-level languages are used only for a few specialized applications.
5 Two kinds of applications process high-level languages into low-level languages:
interpreters and compilers. An interpreter reads a high-level program and executes it,
meaning that it does what the program says. It processes the program a little at a time,
alternately reading lines and performing computations.

OUTPUT SOURCE
INTERPRETER
6 CODE
7 A compiler
reads the program and translates it into a low-level program, which can then be run.
8 In this case, the high-level program is called the source code, and the translated
program is called the object code or the executable. Once a program is compiled, you
can execute it repeatedly without further translation.

SOURCE COMPILER OBJECT EXECUTOR OUTPUT


9 CODE CODE

10 Many modern languages use both processes. They are first compiled into a lower
level language, called byte code, and then interpreted by a program called a virtual
machine. Python uses both processes, but because of the way programmers interact with
it, it is usually considered an interpreted language.
11 There are two ways to use the Python interpreter: shell mode and script mode. In shell mode,
you type Python statements into the Python shell and the interpreter

immediately prints the result.


12 In this course, we will be using an IDE (Integrated Development Environment) called
IDLE. When you first start IDLE it will open an interpreter window. 1
13 The first few lines identify the version of Python being used as well as a few other messages;
you can safely ignore the lines about the firewall. Next there is a line identifying the version
of IDLE. The last line starts with >>>, which is the Python prompt. The interpreter uses the
prompt to indicate that it is ready for instructions.
14 If we type print 1 + 1 the interpreter will reply 2 and give us another prompt. 2
15 >>> print 1 + 1
16 2
17 >>>
18 Alternatively, you can write a program in a file and use the interpreter to execute the contents
of the file. Such a file is called a script. For example, we used the text editor in IDLE (but we
could have used any text editor) to create a file named firstprogram.py with the following
contents:
19 print 1 + 1
20 By convention, files that contain Python programs have names that end with .py. To execute
the program we have to invoke the interpreter and tell it the name of the script:
21 $ python firstprogram.py
22 2

This example shows Python being run from a terminal (with $ representing the Unix prompt).
In other development environments, the details of executing programs may differ. IDLE
simplifies the whole process by presenting interpreter windows and a text editor within the
same application. You can run a script in IDLE by either choosing Run → Run Module or
pressing F5. Most programs are more interesting than this one. The examples in this book use
both the Python interpreter and scripts. You will be able to tell which is intended since shell
mode examples (i.e. entering lines directly into the interpreter) will always start with the

1
You can also run the python interpreter by just entering the command python in a terminal. To exit from the interpreter type exit() and hit
return, or press Ctrl-D on a new line.
2
The print statement is one of the changes between Python 2.x and Python 3.x. In Python 3.x, print is a function and not a

2
Python prompt, >>>. Working in shell mode is convenient for testing short bits of code because
you get immediate feedback. Think of it as scratch paper used to help you work out problems.
Anything longer than a few lines should be put into a script so it can be saved for future use.
2. 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 copyrighted. Like Perl, Python source code is now available under the GNU
General Public License (GPL).

• 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 1.0 was released in November 1994. In 2000, Python 2.0 was released. Python
2.7.11 is the latest edition of Python 2.

• Meanwhile, Python 3.0 was released in 2008. Python 3 is not backward compatible with
Python 2. The emphasis in Python 3 had been on the removal of duplicate programming
constructs and modules so that "There should be one -- and preferably
only one -- obvious way to do it." Python 3.5.1 is the latest version of Python 3.

3. Features of python:

Python's features include-


• Easy-to-learn: Python has few keywords, simple structure, and a clearly defined syntax.
This allows a student to pick up the language quickly.

• Easy-to-read: Python code is more clearly defined and visible to the eyes.
• Easy-to-maintain: Python's source code is fairly easy-to-maintain.

• A broad standard library: Python's bulk of the library is very portable and
crossplatform compatible on UNIX, Windows, and Macintosh.

• Interactive Mode: Python has support for an interactive mode, which allows interactive
testing and debugging of snippets of code.

3
• Portable: Python can run on a wide variety of hardware platforms and has the same
interface on all platforms.

• Extendable: 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. A few are
listed below- • It supports 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.

• It provides very high-level dynamic data types and supports dynamic type checking.
• It supports automatic garbage collection.

• It can be easily integrated with C, C++, COM, ActiveX, CORBA, and Java.
4. Installing Python:

Windows platform
Binaries of latest version of Python 3 (Python 3.5.1) are available on this download page The
following different installation options are available.
• Windows x86-64 embeddable zip file Windows x86-64 executable installer
Windows x86-64 web-based installer
• Windows x86 embeddable zip file Windows x86 executable installer
• Windows x86 web-based installer

Note:In order to install Python 3.5.1, minimum OS requirements are Windows 7 with SP1. For
versions 3.0 to 3.4.x, Windows XP is acceptable.

Linux platform
Different flavors of Linux use different package managers for installation of new packages. On

Ubuntu Linux, Python 3 is installed using the following command from the terminal. $sudo

apt-get install python3-minimal

Installation from source

5
Download Gzipped source tarball from Python's download
URL: https://www.python.org/ftp/python/3.5.1/Python-
3.5.1.tgz Extract the tarball tar xvfz Python-3.5.1.tgz Configure
and Install:
cd Python-3.5.1
./configure --prefix=/opt/python3.5.1 make
sudo make install

Mac OS
Download Mac OS installers from this URL:https://www.python.org/downloads/mac-osx/ •
Mac OS X 64-bit/32-bit installer : python-3.5.1-macosx10.6.pkg

• Mac OS X 32-bit i386/PPC installer : python-3.5.1-macosx10.5.pkg Double click this


package file and follow the wizard instructions to install.
The most up-to-date and current source code, binaries, documentation, news, etc., is available
on the official website of Python:
Python Official Website : http://www.python.org/
You can download Python documentation from the following site. The documentation is
available in HTML, PDF and PostScript formats.
Python Documentation Website : www.python.org/doc/

Setting up PATH

Programs and other executable files can be in many directories. Hence, the operating
systems provide a search path that lists the directories that it searches for executables. The
important features are-
• The path is stored in an environment variable, which is a named string maintained by
the operating system. This variable contains information available to the command
shell and other programs.

• The path variable is named as PATH in Unix or Path in Windows (Unix is


casesensitive; Windows is not).

• In Mac OS, the installer handles the path details. To invoke the Python interpreter from
any particular directory, you must add the Python directory to your path.

Setting Path at Unix/Linux

To add the Python directory to the path for a particular session in Unix- • In the csh shell:
type setenv PATH "$PATH:/usr/local/bin/python3" and press Enter.

• In the bash shell (Linux): type export PATH="$PATH:/usr/local/bin/python3" and


press Enter.

• In the sh or ksh shell: type PATH="$PATH:/usr/local/bin/python3" and press Enter.


Note: /usr/local/bin/python3 is the path of the Python directory.

Setting Path at Windows

7
To add the Python directory to the path for a particular session in Windows-
At the command prompt : type path %path%;C:\Python and press Enter.
Note: C:\Python is the path of the Python directory.

Python Environment Variables

Here are important environment variables, which are recognized by Python-

Variable Description

It has a role similar to PATH. This variable tells the Python


interpreter where to locate the module files imported into a program.
PYTHONPATH It should include the Python source library directory and the
directories containing Python source code. PYTHONPATH is
sometimes, preset by the Python installer.
PYTHONSTARTU It contains the path of an initialization file containing Python source
P code. It is executed every time you start the interpreter. It is named as
.pythonrc.py in Unix and it contains commands that load utilities or
modify PYTHONPATH.

PYTHONCASEOK It is used in Windows to instruct Python to find the first


caseinsensitive match in an import statement. Set this variable to
any value to activate it.

PYTHONHOME It is an alternative module search path. It is usually embedded in the


PYTHONSTARTUP or PYTHONPATH directories to make
switching module libraries easy.

5. Running Python program:

There are three different ways to start Python-

8
(1) Interactive Interpreter
You can start Python from Unix, DOS, or any other system that provides you a commandline
interpreter or shell window.
Enter python the command line.
Start coding right away in the interactive interpreter.

$python # Unix/Linux or
python%
# Unix/Linux or
C:>python
# Windows/DOS

Here is the list of all the available command line options-


Option Description

provide debug output


-d

-O generate optimized bytecode (resulting in .pyo files)

-S do not run import site to look for Python paths on startup

-v verbose output (detailed trace on import statements)

-X disable class-based built-in exceptions (just use strings); obsolete starting with
version 1.6

-c cmd run Python script sent in as cmd string

file run Python script from given file

(2) Script from the Command-line


A Python script can be executed at the command line by invoking the interpreter on your
application, as shown in the following example.

9
$python script.py # Unix/Linux or
python% script.py
# Unix/Linux or
C:>python script.py
# Windows/DOS

Note: Be sure the file permission mode allows execution.

(3) Integrated Development Environment

10
You can run Python from a Graphical User Interface (GUI) environment as well, if you have a
GUI application on your system that supports Python. • Unix: IDLE is the very first
Unix IDE for Python.

• Windows: PythonWin is the first Windows interface for Python and is an IDE with a
GUI.

• Macintosh: The Macintosh version of Python along with the IDLE IDE is available from
the main website, downloadable as either MacBinary or BinHex'd files.
If you are not able to set up the environment properly, then you can take the help of your
system admin. Make sure the Python environment is properly set up and working perfectly
fine.

6. Debugging:

Programming is a complex process, and because it is done by human beings, programs


often contain errors. For whimsical reasons, programming errors are called bugs and the
process of tracking them down and correcting them is called debugging.
Three kinds of errors can occur in a program: syntax errors, runtime errors, and semantic
errors. It is useful to distinguish between them in order to track them down more quickly.

Syntax errors
Python can only execute a program if the program is syntactically correct; otherwise,
the process fails and returns an error message. Syntax refers to the structure of a
program and the rules about that structure. For example, in English, a sentence must
begin with a capital letter and end with a period. this sentence contains a syntax error.
So does this one
For most readers, a few syntax errors are not a significant problem, which is why we
can read the poetry of e. e. cummings without spewing error messages. Python is not
so forgiving. If there is a single syntax error anywhere in your program, Python will
print an error message and quit, and you will not be able to run your program.
During the first few weeks of your programming career, you will probably spend a
lot of time tracking down syntax errors. As you gain experience, though, you will
make fewer syntax errors and find them faster.

Runtime errors
The second type of error is a runtime error, so called because the error does not appear
until you run the program. These errors are also called exceptions because they
usually indicate that something exceptional (and bad) has happened. Runtime errors
are rare in the simple programs you will see in the first few chapters, so it might be a
while before you encounter one.

Semantic errors
The third type of error is the semantic error. If there is a semantic error in your
program, it will run successfully, in the sense that the computer will not generate any
error messages, but it will not do the right thing. It will do something else.
Specifically, it will do what you told it to do.
The problem is that the program you wrote is not the program you wanted to write.
The meaning of the program (its semantics) is wrong. Identifying semantic errors
can be tricky because it requires you to work backward by looking at the output of
the program and trying to figure out what it is doing.

One of the most important skills you will acquire is debugging. Although it can be
frustrating, debugging is one of the most intellectually rich, challenging, and interesting
parts of programming.
In some ways, debugging is like detective work. You are confronted with clues, and you have
to infer the processes and events that led to the results you see.
Debugging is usually a trial and error process. Once you have an idea what is going
wrong, you modify your program and try again. If your hypothesis was correct, then you
can predict the result of the modification, and you take a step closer to a working
program. If your hypothesis was wrong, you have to come up with a new one. As
Sherlock Holmes pointed out, “When you have eliminated the impossible, whatever
remains, however improbable, must be the truth.” (A. Conan Doyle, The Sign of Four )
For some people, programming and debugging are the same thing. That is, programming
is the process of gradually debugging a program until it does what you want. The idea is
that you should start with a program that does something and make small modifications,
debugging them as you go, so that you always have a working program.
For example, Linux is an operating system that contains thousands of lines of code, but it
started out as a simple program Linus Torvalds used to explore the Intel 80386 chip. According
to Larry Greenfield, one of Linus’s earlier projects was a program that would switch between
printing AAAA and BBBB. This later evolved into Linux (The Linux Users’ Guide Beta
Version 1).

7. Formal and Natural Languages:


Natural languages are the languages that people speak, such as English, Spanish, and
French. They were not designed by people (although people try to impose some order on
them); they evolved naturally.
Formal languages are languages that are designed by people for specific applications.
For example, the notation that mathematicians use is a formal language that is particularly
good at denoting relationships among numbers and symbols. Chemists use a formal

10

language to represent the chemical structure of molecules. And most importantly:

Programming languages are formal languages that have been designed to express
computations.

Formal languages tend to have strict rules about syntax. For example, 3+3=6 is a
syntactically correct mathematical statement, but 3=+6$ is not. H 2O is a syntactically
correct chemical name, but 2Zz is not. Syntax rules come in two flavors, pertaining to
tokens and structure. Tokens are the basic elements of the language, such as words,
numbers, and chemical elements. One of the problems with 3=+6$ is that $ is not a legal
token in mathematics (at least as far as we know). Similarly, 2 Zz is not legal because there
is no element with the abbreviation Zz. The second type of syntax rule pertains to the
structure of a statement— that is, the way the tokens are arranged. The statement 3=+6$
is structurally illegal because you can’t place a plus sign immediately after an equal sign.
Similarly, molecular formulas have to have subscripts after the element name, not before.
When you read a sentence in English or a statement in a formal language, you have to
figure out what the structure of the sentence is (although in a natural language you do this
subconsciously). This process is called parsing. For example, when you hear the
sentence, “The brown dog barked”, you understand that the brown dog is the subject and
barked is the verb. Once you have parsed a sentence, you can figure out what it means, or
the semantics of the sentence. Assuming that you know what a dog is and what it means to
bark, you will understand the general implication of this sentence.
Although formal and natural languages have many features in common—tokens,
structure, syntax, and semantics—there are many differences:

ambiguity: Natural languages are full of ambiguity, which people deal with by using
contextual clues and other information. Formal languages are designed to be nearly
or completely unambiguous, which means that any statement has exactly one
meaning, regardless of context.
redundancy: In order to make up for ambiguity and reduce misunderstandings, natural
languages employ lots of redundancy. As a result, they are often verbose. Formal languages
are less redundant and more concise.
literalness: Natural languages are full of idiom and metaphor. If someone says, “The penny
dropped”, there is probably no penny and nothing dropped. Formal languages mean
exactly what they say.
People who grow up speaking a natural language—everyone—often have a hard time
adjusting to formal languages. In some ways, the difference between formal and natural
language is like the difference between poetry and prose, but more so:

Poetry: Words are used for their sounds as well as for their meaning, and the whole poem
together creates an effect or emotional response. Ambiguity is not only common but often
deliberate.
Prose: The literal meaning of words is more important, and the structure contributes

11
more meaning. Prose is more amenable to analysis than poetry but still often
ambiguous.
Programs: The meaning of a computer program is unambiguous and literal, and can be understood
entirely by analysis of the tokens and structure.

Here are some suggestions for reading programs (and other formal languages). First,
remember that formal languages are much more dense than natural languages, so it takes
longer to read them. Also, the structure is very important, so it is usually not a good idea to
read from top to bottom, left to right. Instead, learn to parse the program in your head,
identifying the tokens and interpreting the structure. Finally, the details matter. Little things
like spelling errors and bad punctuation, which you can get away with in natural languages,
can make a big difference in a formal language.

8. The Difference Between Brackets, Braces, and Parentheses:

Braces are used for different purposes. If you just want a list to contain some elements and
organize them by index numbers (starting from 0), just use the [] and add elements as
necessary. {} are special in that you can give custom id's to values like a = {"John": 14}.
Now, instead of making a list with ages and remembering whose age is where, you can just
access John's age by a["John"].
The [] is called a list and {} is called a dictionary (in Python). Dictionaries are basically a
convenient form of list which allow you to access data in a much easier way.
However, there is a catch to dictionaries. Many times, the data that you put in the dictionary
doesn't stay in the same order as before. Hence, when you go through each value one by one, it
won't be in the order you expect. There is a special dictionary to get around this, but you have to
add this line from collections import OrderedDict and replace {} with OrderedDict(). But, I
don't think you will need to worry about that for now.

1.2 Variables and Expressions:

1. Values and Types:


A value is one of the fundamental things—like a letter or a number—that a program
manipulates. The values we have seen so far are 2 (the result when we added 1 + 1),
and “Hello, World!”. These values belong to different types: 2 is an integer, and
“Hello, World!” is a string. You (and the interpreter) can identify strings because
they are enclosed in quotation marks. The print statement also works for integers.

>>> print(4)
4

If you are not sure what type a value has, the interpreter can tell you.
>>> type("Hello, World!")

12
<class ’str’>
>>> type(17)
< class ’int’>

Strings belong to the type str and integers belong to the type int. Less obviously, numbers
with a decimal point belong to a type called float, because these numbers
are represented in a format called floating-point.

>>> type(3.2)
<class ’float’>

What about values like “17” and “3.2”? They look like numbers, but they are in
quotation marks like strings.

>>> type("17")
<class ’str’>
>>> type("3.2")

<class ’str’>
They’re strings. Strings in Python can be enclosed in either single quotes (’) or
double quotes (”):

>>> type(’This is a string.’)


<class ’str’>
>>> type("And so is this.")
<class ’str’>

Double quoted strings can contain single quotes inside them, as in "What’s your name?",
and single quoted strings can have double quotes inside them, as in ’The cat said
"Meow!"’.
When you type a large integer, you might be tempted to use commas between groups of three
digits, as in 1,000,000.

2. Variables:

One of the most powerful features of a programming language is the ability to manipulate
variables. A variable is a name that refers to a value. The assignment
statement creates new variables and assigns them values:
>>> message = "What’s your name?"
>>> n = 17
>>> pi = 3.14159
This example makes three assignments. The first assigns the string "What’s your
name?" to a new variable named message. The second assigns the integer 17 to n, and
the third assigns the floating-point number 3.14159 to pi. The assignment operator, =,
should not be confused with an equals sign (even though it uses the same character).
Assignment operators link a name, on the left hand side of the operator,
with a value, on the right hand side. This is why you will get an error if you enter:

>>> 17 = n

A common way to represent variables on paper is to write the name with an arrow
pointing to the variable’s value. This kind of figure is called a state diagram because it
shows what state each of the variables is in (think of it as the variable’s state of mind).
This diagram shows the result of the assignment statements:
messag "What’s your
name?"
e n pi 17

3.14159
The print statement also works with variables.

>>>print (message) What’s your name?


>>> print (n)
17
>>> print (pi)
3.14159

In each case the result is the value of the variable. Variables also have types; again,
we can ask the interpreter what they are.

>>> type(message)
<class ’str’>
>>> type(n)
< class ’int’>
>>> type(pi)
< class ’float’>

The type of a variable is the type (or kind) of value it refers to.

17
14

3. Variable names and keywords:

Programmers generally choose names for their variables that are meaningful—they
document what the variable is used for. Variable names can be arbitrarily long. They
can contain both letters and numbers, but they have to begin with a letter. Although it
is legal to use uppercase letters, by convention we don’t. If you do, remember that case
matters. Bruce and bruce are different variables. The underscore character ( ) can
appear in a name. It is often used in names with multiple words, such as myname or
priceofteainchina. If you give a variable an illegal name, you get a syntax error:
>>> 76trombones = "big parade"
SyntaxError: invalid syntax
>>> more$ = 1000000
SyntaxError: invalid syntax
>>> class = "COMP150"
SyntaxError: invalid syntax

76trombones is illegal because it does not begin with a letter. more$ is illegal because it
contains an illegal character, the dollar sign. But what’s wrong with class? It turns out
that class is one of the Python keywords. Keywords define the language’s rules and
structure, and they cannot be used as variable names. Python has thirty-one keywords:
and del from not while
as elif global or with
assert else if pass yield
break except import print
class exec in raise
continue finally is return
def for lambda try

4. Type conversion:
Sometimes, you may need to perform conversions between the built-in types. To convert
between types, you simply use the type-name as a function.
There are several built-in functions to perform conversion from one data type to another.
These functions return a new object representing the converted value.

Function Description

int(x [,base])
Converts x to an integer. The base specifies the base if x is a string.

float(x) Converts x to a floating-point number.

complex(real Creates a complex number.


[,imag])

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.

19
chr(x) Converts an integer to a character.

unichr(x) Converts an integer to a Unicode character.

16

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.

5. Operators and Operands:

Operators are special symbols that represent computations like addition and
multiplication. The values the operator uses are called operands. The following are
all legal Python expressions whose meaning is more or less clear:

20 + 32 hour - 1 hour * 60 + minute minute / 60


5 ** 2
(5 + 9) * (15 - 7)

The symbols +, -, *, /, have the usual mathematical meanings. The symbol, **, is the
exponentiation operator. The statement, 5 ** 2, means 5 to the power of 2, or 5 squared
in this case. Python also uses parentheses for grouping, so we can force operations to
be done in a certain order just like we can in mathematics.
When a variable name appears in the place of an operand, it is replaced with its value
before the operation is performed. Addition, subtraction, multiplication, and
exponentiation all do what you expect, but you might be surprised by division. The
following operation has an unexpected result:

>>> minute = 59
>>> minute / 60
0 .9833333333333333

The value of minute is 59, and 59 divided by 60 is 0.98333, not 0. The reason for the
discrepancy is that Python is performing integer division3. When both of the operands
are integers, the result must also be an integer, and by convention, integer division
always rounds down, even in cases like this where the next integer is very close. A
possible solution to this problem is to calculate a percentage rather than a fraction:

>>> minute * 100 / 60

21
Operators are special symbols that represent computations like addition and multiplication.
The values the operator uses are called operands. The following are
all legal Python expressions whose meaning is more or less clear:

20 + 32 hour - 1 hour * 60 + minute minute / 60


5 ** 2
(5 + 9) * (15 - 7)

The symbols +, -, *, /, have the usual mathematical meanings. The symbol, **, is the
exponentiation operator. The statement, 5 ** 2, means 5 to the power of 2, or 5 squared
in this case. Python also uses parentheses for grouping, so we can force operations to
be done in a certain order just like we can in mathematics.
When a variable name appears in the place of an operand, it is replaced with its value
before the operation is performed. Addition, subtraction, multiplication, and exponentiation
all do what you expect, but you might be surprised by division. The following operation
has an unexpected result:

>>> minute = 59
>>> minute / 60
0 .9833333333333333

The value of minute is 59, and 59 divided by 60 is 0.98333, not 0. The reason for the
discrepancy is that Python is performing integer division4. When both of the operands
are integers, the result must also be an integer, and by convention, integer division
always rounds down, even in cases like this where the next integer is very close. A
possible solution to this problem is to calculate a percentage rather than a fraction:

>>> minute * 100 / 60


98.33333333333333

Again the result is rounded down, but at least now the answer is approximately correct. Another
alternative is to use floating-point division.

6. Expressions:

An expression is a combination of values, variables, and operators. If you type an


expression on the command line, the interpreter evaluates it and displays the result:
>>> 1 + 1
22
2

The evaluation of an expression produces a value, which is why expressions can appear
on the right hand side of assignment statements. A value all by itself is a
simple expression, and so is a variable.
>>> 17
17
>>> x
2

Confusingly, evaluating an expression is not quite the same thing as printing a value.
>>> message = "What’s your name?"
>>> message
"What’s your name?"
>>> print(message)
What’s your name?
When the Python shell displays the value of an expression, it uses the same format you
would use to enter a value. In the case of strings, that means that it includes the
quotation marks. But the print statement prints the value of the expression, which in
this case is the contents of the string. In a script, an expression all by itself is a legal
statement, but it doesn’t do anything. The script
17
3.2
"Hello, World!"
1+1
produces no output at all. How would you change the script to display the values of these
four expressions?

7. Interactive Mode and Script Mode:

Interactive Mode Programming


Invoking the interpreter without passing a script file as a parameter brings up the following
prompt-

19
$ python
Python 3.3.2 (default, Dec 10 2013, 11:35:01)
[GCC 4.6.3] on Linux
Type "help", "copyright", "credits", or "license" for more information. >>> On
Windows:
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on
win32
Type "copyright", "credits" or "license()" for more information.
>>>
Type the following text at the Python prompt and press Enter-

>>> print ("Hello, Python!")

If you are running the older version of Python (Python 2.x), use of parenthesis as inprint function
is optional. This produces the 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. Python files have the extension.py. Type the
following source code in a test.py file-

print ("Hello, Python!")

24
We assume that you have the Python interpreter set in PATH variable. Now, try to run this
program as follows- On Linux

$ python test.py

This produces the following result-

Hello,
Python!

On Windows

C:\Python34>Python test.py

This produces the following result-


Hello, Python!

Let us try another way to execute a Python script in Linux. Here is the modified test.py
file-

#!/usr/bin/python3 print
("Hello, Python!")

We assume that you have Python interpreter available in the /usr/bin directory. Now, try to run
this program as follows-

$ chmod +x test.py # This is to make file executable


$./test.py

This produces the following result-

Hello, Python!

Order of Operations:

When more than one operator appears in an expression, the order of evaluation
depends on the rules of precedence. Python follows the same precedence rules for its
mathematical operators that mathematics does. The acronym PEMDAS is a useful way
to remember the order of operations:

1. Parentheses have the highest precedence and can be used to force an expression
to evaluate in the order you want. Since expressions in parentheses are evaluated
first, 2*(3-1) is 4, and (1+1)**(5-2) is 8. You can also use parentheses to make an
expression easier to read, as in (minute*100)/60, even though it doesn’t change
the result.
2. Exponentiation has the next highest precedence, so 2**1+1 is 3 and not 4, and
3*1**3 is 3 and not 27.
3. Multiplication and Division have the same precedence, which is higher than
Addition and Subtraction, which also have the same precedence. So 2*3-1 yields
5 rather than 4, and 2/3-1 is -1, not 1 (remember that in integer division, 2/3=0).
26
Operators with the same precedence are evaluated from left to right. So in the
expression minute*100/60, the multiplication happens first, yielding 5900/60, which
in turn yields 98. If the operations had been evaluated from right to left, the result
would have been 59 *1, which is 59, which is wrong. Similarly, in evaluating 17-4-3,
17-4 is evaluated first.
If in doubt, use parentheses.

1.3 Conditional Statements:


1. IF statement:

27
The IF statement is similar to that of other languages. The if statement contains a logical
expression using which the data is compared and a decision is made based on the result of the
comparison.

Syntax if expression:

statement(s)

If the boolean expression evaluates to TRUE, then the block of statement(s) inside the if
statement is executed. In Python, statements in a block are uniformly indented after the :
symbol. If boolean expression evaluates to FALSE, then the first set of code after the end of
block is executed.
Flow Diagram

nested if statements You can use one if or else if statement inside another if or
else if statement(s).

Example

28
num = 3 if
num > 0:
print(num, "is a positive number.")
print("This is always printed.")
num = -1 if num > 0:

print(num, "is
a positive number.")

print("This is
also always
printed.")

When the above code is executed, it produces the following result −


3 is a positive number.
This is always printed.

In the above example, num > 0 is the test expression.

The body of if is executed only if this evaluates to True.

When variable num is equal to 3, test expression is true and body inside body of if is executed.

If variable num is equal to -1, test expression is false and body inside body of if is skipped.

The print() statement falls outside of the if block (unindented). Hence, it is executed regardless
of the test expression.

2. IF ELSE Statements

An else statement can be combined with an if statement. An else statement contains a block of
code that executes if the conditional expression in the if statement resolves to 0 or a FALSE
value.

29
The else statement is an optional statement and there could be at the most only one else
statement following if.

Syntax
The syntax of the if...else statement is-

if expression: statement(s) else:


statement(s)

Flow Diagram

30
Example
# Program checks if the number is positive or negative
# And displays an appropriate message num

=3

# Try these two variations as well.


# num = -5
# num = 0

if num >= 0:
print("Positive or Zero")
else:
print("Negative number")

Positive or Zero

In the above example, when num is equal to 3, the test expression is true and body of if is
executed and body of else is skipped.

If num is equal to -5, the test expression is false and body of else is executed and body
25
of if is skipped.

3. Nested IF -ELSE Statements

There may be a situation when you want to check for another condition after a condition
resolves to true. In such a situation, you can use the nested if construct.
In a nested if construct, you can have an if...elif...else construct inside another if...elif...else
construct.

Syntax
The syntax of the nested if...elif...else construct may be-
if expression1:
statement(s)
if expression2:
statement(s)
elif expression3:
statement(s)
else
statement(s)
elif expression4:
statement(s)
else:
statement(s)
26

Example
# !/usr/bin/python3
# In this program, we input a number
# check if the number is positive or
# negative or zero and display
# an appropriate message
# This time we use nested if

num = float(input("Enter a number: "))


if num >= 0:
if num == 0:
print("Zero")
else: print("Positive
number")
else:
print("Negative number")
num=int(input("enter number"))

When the above code is executed, it produces the following result-

Output 1
Enter a number: 5 Positive
number

Output 2
Enter a number: -1
Negative number

Output 3
Enter a number: 0
Zero Divisible by 3 and 2
enter number5

27
not Divisible by 2 not divisible by 3

1.4 Looping:

1. For:
The for loop in Python is used to iterate over a sequence (list, tuple, string) or other iterable
objects. Iterating over a sequence is called traversal.

Syntax of for Loop

for val in sequence:

Body of for

Here, val is the variable that takes the value of the item inside the sequence on each iteration.

Loop continues until we reach the last item in the sequence. The body of for loop is separated
from the rest of the code using indentation.

Flowchart of for Loop


Example: Python for Loop
# Program to find the sum of all numbers stored in
a list

# List of numbers

numbers = [6, 5, 3, 8, 4, 2, 5, 4, 11]

# variable to store the sum sum

=0

# iterate over the list


for val in numbers:

29

36
sum = sum+val

# Output: The sum is 48

print("The sum is", sum)

when you run the program, the output will be:

The sum is 48

2. While Loop

The while loop in Python is used to iterate over a block of code as long as the test expression
(condition) is true.
We generally use this loop when we don't know beforehand, the number of times to iterate.

Syntax of while Loop in Python

while test_expression:

Body of while

In while loop, test expression is checked first. The body of the loop is entered only if the
test_expression evaluates to True. After one iteration, the test expression is
checked again. This process continues until the test_expression evaluates
to False.

In Python, the body of the while loop is determined through indentation.

Body starts with indentation and the first unindented line marks the end. Python

interprets any non-zero value as True. None and 0 are interpreted as False.

Flowchart of while Loop


Example: Python while Loop
# Program to add natural

# numbers upto

# sum = 1+2+3+...+n

# To take input from the user,

# n = int(input("Enter n: ")) n = 10

# initialize sum and counter

38
31
sum = 0

i=1

while i <= n:

sum = sum + i

i = i+1 # update counter

# print the sum


print("The sum is", sum)

When you run the program, the output will be:

Enter n: 10

The sum is 55

In the above program, the test expression will be True as long as our counter variable i is less
than or equal to n (10 in our program).

We need to increase the value of counter variable in the body of the loop. This is very
important (and mostly forgotten). Failing to do so will result in an infinite loop (never ending
loop). Finally the result is displayed.

3. Nested loops:

Python programming language allows to use one loop inside another loop. Following section
shows few examples to illustrate the concept.
Python Nested if Example

# In this program, we input a number


# check if the number is positive or
# negative or zero and display
# an appropriate message
# This time we use nested if

num = float(input("Enter a number: "))


if num >= 0:
if num == 0:
print("Zero")
else: print("Positive
number")
else:
print("Negative number")

Output 1
Enter a number: 5
Positive number
Output 2
Enter a number: -1
Negative number
Output 3
Enter a number: 0
Zero

1.5 Control statements:


1. Terminating loops:

The break statement terminates the loop containing it. Control of the program flows to the
statement immediately after the body of the loop.

40
If break statement is inside a nested loop (loop inside another loop), break will terminate the
innermost loop.

Syntax of break

break

Flowchart of break

41
Example: Python break
# Use of break statement inside loop

for val in "string":


if val == "i":
break
print(val)

print("The end")

Output

tr

The end

42
In this program, we iterate through the "string" sequence. We check if the letter is "i", upon
which we break from the loop. Hence, we see in our output that all the letters up till "i" gets
printed. After that, the loop terminates.

2. Skipping specific conditions:

The continue statement is used to skip the rest of the code inside a loop for the current iteration
only. Loop does not terminate but continues on with the next iteration.

Syntax of Continue

continue

Flowchart of continue

The working of continue statement in for and while loop is shown below.

43
Example: Python continue
# Program to show the use of continue statement inside loops

for val in "string":

if val == "i":

continue

print(val)

print("The end")

Output
st

44
r

ng

The end

This program is same as the above example except the break statement has been replaced with
continue.

We continue with the loop, if the string is "i", not executing the rest of the block. Hence, we
see in our output that all the letters except "i" gets printed.

45
39
UNIT 2

FUNCTIONS :

2.1 Composing Expressions

So far, we have looked at the elements of a program—variables, expressions, and


statements —in isolation, without talking about how to combine them. One of the
most useful features of programming languages is their ability to take small building
blocks and compose them. For example, we know how to add numbers and we know
how to print; it turns out we can do both at the same time:

>>> print(17 + 3)
20

In reality, the addition has to happen before the printing, so the actions aren’t actually
happening at the same time. The point is that any expression involving numbers,
strings, and variables can follow print:

>>> hour = 21
>>> minute = 1
>>> print("Number of minutes since midnight: ",hour * 60 + minute)
Number of minutes since midnight: 1261

You can also put arbitrary expressions on the right-hand side of an assignment
statement:

>>> percentage = (minute * 100) / 60


>>> percentage
1.6666666666666667
>>> print(percentage)
1.6666666666666667

This ability may not seem impressive now, but you will see other examples where the
composition makes it possible to express complex computations neatly and
concisely.
Warning: There are limits on where you can use certain expressions. For example,
left-hand side of an assignment statement has to be a variable name, not an expression.
So, the following is illegal:

>>> minute+1 = hour


File "<stdin>", line 1
SyntaxError: can't assign to operator

48
3.2 Function calls

Many common tasks come up time and time again when programming. Instead of
requiring you to constantly reinvent the wheel, Python has a number of built-in
features which you can use. Including so much ready to use code is sometimes
referred to as a ’batteries included’ philosophy. Python comes with just under fifty (of
which we’ll be only using about a dozen) and the simplest way to use this prewritten
code is via function calls.

The syntax of a function call is simply


FUNCTION NAME(ARGUMENTS)

Not all functions take an argument, and some take more than one (in which case the
arguments are separated by commas).
You have already seen an example of a function call:

>>> type("Hello,World")
<class 'str'>
>>> type(17) <class 'int'>
The name of the function is type, and it displays the type of a value or variable. The
value or variable, which is called the argument of the function, has to be enclosed in
parentheses. It is common to say that a function “takes” an argument and “returns” a
result. The result is called the return value.

We can assign the return value to a variable:

>>> result = type(17)


>>> print(result)
<class 'int'>

Another useful function is len. It takes a Python sequence as an argument. The only
Python sequence we have met so far is a string. A string is a sequence of characters.
For a string argument, len returns the number of characters the string contains.

>>> my_str = "Hello world"


>>> len(my_str)
11

The len function can only be used on sequences. Trying to use it on a number, for
example, results in an error.

>>> len(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()

49
2.3 Type Conversion Functions :

Each Python type comes with a built-in function that attempts to convert values of
another type into that type. The int(ARGUMENT) function, for example, takes any
value and converts it to an integer, if possible, or complains otherwise:

>>> int("32")
32
>>> int("Hello")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'Hello'

The int function can also convert floating-point values to integers, but note that it
truncates the fractional part:

>>> int(-2.3)
-2
>>> int(3.99999)
3
>>> int("42")
42
>>> int(1.0)
1

The float(ARGUMENT) function converts integers and strings to floating-point


numbers:

>>> float(32)
32.0
>>> float("3.14159")
3.14159
>>> float(1)
1.0
It may seem odd that Python distinguishes the integer value 1 from the floating-point
value 1.0. They may represent the same number, but they belong to different types as
they are represented differently inside the computer.

The str(ARGUMENT) function converts any argument to type string:

>>> str(32)
'32'
>>> str(3.14149)
'3.14149'

50
>>> str(True)
'True'
>>> str(true)
Traceback (most recent call last): File
"<stdin>", line 1, in <module>
NameError: name 'true' is not defined

The str(ARGUMENT) function will work with any value and convert it into a string.
Note: True is a predefined value in Python; true is not.

2.4 Math Functions :

Python includes following functions that perform mathematical calculations.

Function Returns ( description )

abs(x) The absolute value of x: the (positive) distance between x and zero.

ceil(x) The ceiling of x: the smallest integer not less than x

cmp(x, y) -1 if x < y, 0 if x == y, or 1 if x > y

exp(x)
The exponential of x: ex

fabs(x) The absolute value of x.

floor(x) The floor of x: the largest integer not greater than x

log(x) The natural logarithm of x, for x> 0

log10(x) The base-10 logarithm of x for x> 0.

max(x1, x2,...) The largest of its arguments: the value closest to positive infinity

min(x1, x2,...) The smallest of its arguments: the value closest to negative infinity

The fractional and integer parts of x in a two-item tuple. Both


modf(x) parts have the same sign as x. The integer part is returned as a
float.
pow(x, y) The value of x**y.

51
x rounded to n digits from the decimal point. Python rounds away
round(x [,n]) from zero as a tie-breaker: round(0.5) is 1.0 and round(-0.5) is -1.0.

Number abs() Method :


Description: The abs() method returns the absolute value of x i.e. the positive
distance between x and zero.
Syntax : Following is the syntax for abs() method-
abs(x)
Parameters :
x - This is a numeric expression.
Return : This method returns the absolute value of x.
The following example shows the usage of the abs() method.

print ("abs(-45) : ", abs(-45)) print


("abs(100.12) : ", abs(100.12))
When we run the above program, it
produces the following result-

abs(-45): 45 abs(100.12)
: 100.12

Number ceil() Method :


Description: The ceil() method returns the ceiling value of x i.e. the smallest integer
not less than x.
Syntax: Following is the syntax for the ceil()
method import math math.ceil( x )
Note: This function is not accessible directly, so we need to import math module and
then we need to call this function using the math static object.

Parameters
x - This is a numeric expression.
Return Value
This method returns the smallest integer not less than x.
Example
The following example shows the usage of the ceil() method.

import math # This will import math module print


("math.ceil(-45.17) : ", math.ceil(-45.17)) print
("math.ceil(100.12) : ", math.ceil(100.12)) print
("math.ceil(100.72) : ", math.ceil(100.72))
print ("math.ceil(math.pi) : ", math.ceil(math.pi))

When we run the above program, it produces the following result

52
math.ceil(-45.17) : -45 math.ceil(100.12)
: 101 math.ceil(100.72) : 101
math.ceil(math.pi) : 4

Number exp() Method


Description
The exp() method returns exponential of x: ex.
Syntax
Following is the syntax for the exp() method

import math math.exp(


x)

Note: This function is not accessible directly. Therefore, we need to import the math
module and then we need to call this function using the math static object.
Parameters
X - This is a numeric expression.
Return Value
This method returns exponential of x: ex.
Example
The following example shows the usage of exp() method.

import math # This will import math module print


("math.exp(-45.17) : ", math.exp(-45.17)) print
("math.exp(100.12) : ", math.exp(100.12)) print
("math.exp(100.72) : ", math.exp(100.72))
print ("math.exp(math.pi) : ", math.exp(math.pi))

When we run the above program, it produces the following result

math.exp(-45.17) : 2.4150062132629406e-20 math.exp(100.12)


: 3.0308436140742566e+43 math.exp(100.72) :
5.522557130248187e+43
math.exp(math.pi) : 23.140692632779267

Number fabs() Method


Description
The fabs() method returns the absolute value of x. Although similar to the abs()
function, there are differences between the two functions. They are- • abs() is a
built in function whereas fabs() is defined in math module.
• fabs() function works only on float and integer whereas abs() works with
complex number also.

53
Syntax
Following is the syntax for the fabs() method

import math math.fabs(


x)

Note: This function is not accessible directly, so we need to import the math module
and then we need to call this function using the math static object.

Parameters
x - This is a numeric value.
Return Value
This method returns the absolute value of x.
Example
The following example shows the usage of the fabs() method.

import math # This will import math module print


("math.fabs(-45.17) : ", math.fabs(-45.17)) print
("math.fabs(100.12) : ", math.fabs(100.12)) print
("math.fabs(100.72) : ", math.fabs(100.72))
print ("math.fabs(math.pi) : ", math.fabs(math.pi))

When we run the above program, it produces following result

math.fabs(-45.17) : 45.17
math.fabs(100.12) : 100.12 math.fabs(100.72)
: 100.72
math.fabs(math.pi) : 3.141592653589793

Number floor() Method


Description
The floor() method returns the floor of x i.e. the largest integer not greater than x.
Syntax
Following is the syntax for the floor() method

import math math.floor(


x)

Note: This function is not accessible directly, so we need to import the math module
and then we need to call this function using the math static object. Parameters
x - This is a numeric expression.
Return Value
This method returns the largest integer not greater than x.

54
The following example shows the usage of the floor() method.

import math # This will import math module print


("math.floor(-45.17) : ", math.floor(-45.17)) print
("math.floor(100.12) : ", math.floor(100.12)) print
("math.floor(100.72) : ", math.floor(100.72)) print
("math.floor(math.pi) : ", math.floor(math.pi))

When we run the above program, it produces the following result

math.floor(-45.17) : -46 math.floor(100.12)


: 100 math.floor(100.72) : 100
math.floor(math.pi) : 3

Number log() Method


Description
The log() method returns the natural logarithm of x, for x > 0.
Syntax
Following is the syntax for the log() method

import math math.log(


x)

Note: This function is not accessible directly, so we need to import the math module
and then we need to call this function using the math static object.

Parameters

55
x - This is a numeric expression.
Return Value
This method returns natural logarithm of x, for x > 0.
Example
The following example shows the usage of the log() method.

import math # This will import math module print


("math.log(100.12) : ", math.log(100.12)) print
("math.log(100.72) : ", math.log(100.72))
print ("math.log(math.pi) : ", math.log(math.pi))

When we run the above program, it produces the following result

math.log(100.12) : 4.6063694665635735 math.log(100.72)


: 4.612344389736092
math.log(math.pi) : 1.1447298858494002

Number log10() Method


Description
The log10() method returns base-10 logarithm of x for x > 0.
Syntax
Following is the syntax for log10() method

import math math.log10(


x)

Note: This function is not accessible directly, so we need to import the math module
and then we need to call this function using the math static object.

Parameters
x - This is a numeric expression.
Return Value
This method returns the base-10 logarithm of x for x > 0.
Example
The following example shows the usage of the log10() method.

import math # This will import math module print


("math.log10(100.12) : ", math.log10(100.12)) print
("math.log10(100.72) : ", math.log10(100.72)) print
("math.log10(119) : ", math.log10(119)) print
("math.log10(math.pi) : ", math.log10(math.pi))
When we run the above program, it produces the following result

math.log10(100.12) : 2.0005208409361854
math.log10(100.72) : 2.003115717099806 math.log10(119)
: 2.0755469613925306 math.log10(math.pi) :
0.49714987269413385

Number max() Method


Description

47

The max() method returns the largest of its arguments i.e. the value closest to positive
infinity.
Syntax
Following is the syntax for max() method

max(x, y, z, .... )

Parameters
• x - This is a numeric expression.
• y - This is also a numeric expression.
• z - This is also a numeric expression. Return Value
This method returns the largest of its arguments. Example
The following example shows the usage of the max() method.

print ("max(80, 100, 1000) : ", max(80, 100, 1000))


print ("max(-20, 100, 400) : ", max(-20, 100, 400))
print ("max(-80, -20, -10) : ", max(-80, -20, -10))
print ("max(0, 100, -400) : ", max(0, 100, -400))

When we run the above program, it produces the following result

max(
80, 100, 1000) : 1000 max(-20, 100, 400) : 400 max(-
80, -20, -10) : -10 max(0, 100, -400) : 100

Number min() Method


Description
The method min() returns the smallest of its arguments i.e. the value closest to
negative infinity.
Syntax
Following is the syntax for the min() method

min(x, y, z, .... )

Parameters
• x - This is a numeric expression.
• y - This is also a numeric expression.
• z - This is also a numeric expression. Return Value
This method returns the smallest of its arguments.
Example
The following example shows the usage of the min() method.

print ("min(80, 100, 1000) : ", min(80, 100, 1000))

48
print ("min(-20, 100, 400) : ", min(-20, 100, 400)) print
("min(-80, -20, -10) : ", min(-80, -20, -10))
print ("min(0, 100, -400) : ", min(0, 100, -400))

When we run the above program, it produces the following result

min(80, 100, 1000) : 80 min(-


20, 100, 400) : -20 min(-80, -
20, -10) : -80 min(0, 100, -
400) : -400

Number modf() Method


Description
The modf() method returns the fractional and integer parts of x in a two-item tuple.
Both parts have the same sign as x. The integer part is returned as a float.
Syntax
Following is the syntax for the modf() method

import math math.modf(


x)

Note: This function is not accessible directly, so we need to import the math module
and then we need to call this function using the math static object.

Parameters
x - This is a numeric expression.
Return Value
This method returns the fractional and integer parts of x in a two-item tuple. Both the
parts have the same sign as x. The integer part is returned as a float.
Example
The following example shows the usage of the modf() method.

import math # This will import math module print


("math.modf(100.12) : ", math.modf(100.12)) print
("math.modf(100.72) : ", math.modf(100.72)) print
("math.modf(119) : ", math.modf(119)) print
("math.modf(math.pi) : ", math.modf(math.pi))
When we run the above program, it produces the following result

math.modf(100.12) : (0.12000000000000455, 100.0)


math.modf(100.72) : (0.7199999999999989, 100.0) math.modf(119)
: (0.0, 119.0)
math.modf(math.pi) : (0.14159265358979312, 3.0)

Number pow() Method Return


Value
This method returns the value of xy. Example
The following example shows the usage of the pow() method.

49
import math # This will import math module
print ("math.pow(100, 2) : ", math.pow(100, 2)) print
("math.pow(100, -2) : ", math.pow(100, -2)) print
("math.pow(2, 4) : ", math.pow(2, 4))
print ("math.pow(3, 0) : ", math.pow(3, 0))

When we run the above program, it produces the following result

math. pow(100, 2) :
10000.0 math.pow(100, -2)
: 0.0001 math.pow(2, 4) :
16.0
math.pow(3, 0) : 1.0

Number round() Method


Description
round() is a built-in function in Python. It returns x rounded to n digits from the
decimal point.
Syntax
Following is the syntax for the round() method

round(x [, n] )

Parameters
• x - This is a numeric expression.
• n - Represents number of digits from decimal point up to which x is to be
rounded. Default is 0.
Return Value
This method returns x rounded to n digits from the decimal point.
Example
The following example shows the usage of round() method
print ("round(70.23456) : ", round(70.23456)) print
("round(56.659,1) : ", round(56.659,1)) print
("round(80.264, 2) : ", round(80.264, 2)) print
("round(100.000056, 3) : ", round(100.000056, 3))
print ("round(-100.000056, 3) : ", round(-100.000056, 3))

When we run the above program, it produces the following result

round(70.23456) : 70
round(56.659,1) : 56.7
round(80.264, 2) : 80.26
round(100.000056, 3) : 100.0
round(-100.000056, 3) : -100.0

Number sqrt() Method


Description

50
The sqrt() method returns the square root of x for x > 0.
Syntax
Following is the syntax for sqrt() method

import math math.sqrt(


x)

Note: This function is not accessible directly, so we need to import the math module
and then we need to call this function using the math static object.

Parameters
x - This is a numeric expression.
Return Value
This method returns square root of x for x > 0.
Example
The following example shows the usage of sqrt() method.

import math # This will import math module print ("math.sqrt(100)


: ", math.sqrt(100))
print ("math.sqrt(7) : ", math.sqrt(7))
print ("math.sqrt(math.pi) : ", math.sqrt(math.pi))

When we run the above program, it produces the following result

math.sqrt(100) : 10.0 math.sqrt(7) :


2.6457513110645907 math.sqrt(math.pi) :
1.7724538509055159
2.5 Function Composition :

Just as with mathematical functions, Python functions can be composed, meaning that
you use the result of one function as the input to another.

>>> def print_twice(some_variable_name):


... print(some_variable_name, some_variable_name)
...
>>> print_twice(abs(-7))
77
>>> print_twice(max(3,1,abs(-11),7)) 11
11

In the first example, abs(-7) evaluates to 7, which then becomes the argument to print
twice. In the second example we have two levels of composition, since abs(- 11) is
first evaluated to 11 before max(3, 1, 11, 7) is evaluated to 11 and (11) print_twice
then displays the result.

We can also use a variable as an argument:

51
>>> saying = "Eric,the half a bee."
>>> print_twice(saying)
Eric,the half a bee. Eric,the half a bee.

Notice something very important here. The name of the variable we pass as an
argument (saying) has nothing to do with the name of the parameter
(some_variable_name). It doesn’t matter what the argument is called; here in
print_twice, we call everybody some_variable_name.

2.5 Adding New Functions

A new function can be created in python using keyword def followed by the function
name and arguments in parathesis and statements to be executed in function
Example:
def requiredArg (str,num):
statements
2.6 Function definitions and use

As well as the built-in functions provided by Python you can define your own
functions. In the context of programming, a function is a named sequence of
statements that performs a desired operation. This operation is specified in a function
definition. In Python, the syntax for a function definition is:
def NAME( LIST OF PARAMETERS ): STATEMENTS

The ’list of parameters’ is where the arguments supplied to the function end up. You
will see more of this later.

You can make up any names you want for the functions you create, except that you
can’t use a name that is a Python keyword. The list of parameters specifies what
information, if any, you have to provide in order to use the new function.

There can be any number of statements inside the function, but they have to be you.
indented from the def. In the examples in this book, we will use the standard
indentation of four spaces3. IDLE automatically indents compound statements for
Function definitions are the first of several compound statements we will see, all
of which have the same pattern:
1. A header, which begins with a keyword and ends with a colon.
2. A body consisting of one or more Python statements, each indented the same
amount – 4 spaces is the Python standard – from the header.

In a function definition, the keyword in the header is def, which is followed by the
list name of the function and a list of parameters enclosed in parentheses. The
parameter may be empty, or it may contain any number of parameters. In either
case, the parentheses are required. The first couple of functions we are going to no
write have parameters, so the syntax looks like this:

52
>>> def new_line() :
... print()

This function is named new_line. The empty parentheses indicate that it has no
which parameters (that is it takes no arguments). Its body contains only a single
statement, outputs a newline character. (That’s what happens when you use a print
command without any arguments.)

Defining a new function does not make the function run. To do that we need a by a
function call. Function calls contain the name of the function to be executed
followed list of values, called arguments, which are assigned to the parameters in
the function definition. Our first examples have an empty parameter list, so the do
function calls not take any arguments. Notice, however, that the parentheses are
required in the function call :

... print("First Line.")


... new_line()
... print("Second Line")
The output of the function is :

First Line.
Second Line
The extra space between the two lines is a result of the new line() function call. What
if we wanted more space between the lines? We could call the same function
repeatedly:

... print("First Line.") ... new_line()


... new_line()
... new_line()
... print("Second Line")
Or we could write a new function named three lines that prints three new lines:

>>> def three_lines() : ... new_line()


... new_line()
... new_line()

... print("First Line.")


... three_lines()
... print("Second Line.")

This function contains three statements, all of which are indented by four spaces. Since
the next statement is not indented, Python knows that it is not part of the function. You
should notice a few things about this program:
• You can call the same procedure repeatedly. In fact, it is quite common and
useful to do so.
• You can have one function call another function; in this case three lines calls
new_line.

53
So far, it may not be clear why it is worth the trouble to create all of these new
functions. Actually, there are a lot of reasons, but this example demonstrates two:
1. Creating a new function gives you an opportunity to name a group of
statements. Functions can simplify a program by hiding a complex computation
behind a single command and by using English words in place of arcane code.
2. Creating a new function can make a program smaller by eliminating repetitive
code. For example, a short way to print nine consecutive new lines is to call
three lines three times.

Pulling together the code fragments from the previous section into a script named
functions.py, the whole program looks like this:

def new_line() :
print()

def three_lines() :
new_line() new_line() new_line()

print("First Line.") three_lines()


print("Second Line.")

This program contains two function definitions: new_line and three_lines. Function
to definitions get executed just like other statements, but the effect is to create the
new function. The statements inside the function do not get executed until the is
called, and the function definition generates no output. As you might expect, you
have create a function before you can execute it. In other words, the function
definition has to be executed before the first time it is called.

2.7 Flow of Execution

In order to ensure that a function is defined before its first use, you have to know
the order in which statements are executed, which is called the flow of execution.
Execution always begins at the first statement of the program. Statements are
executed one at a time, in order from top to bottom. Function definitions do not
alter the flow of execution of the program, but remember that statements inside the
function are not executed until the function is called. Although it is not common,
you can define one function inside another. In this case, the inner definition isn’t
executed until the outer function is called.

Function calls are like a detour in the flow of execution. Instead of going to the next
statement, the flow jumps to the first line of the called function, executes all the
statements there, and then comes back to pick up where it left off. That sounds
simple enough, until you remember that one function can call another. While in the
middle of one function, the program might have to execute the statements in another
function. But while executing that new function, the program might have to execute
yet another function! Fortunately, Python is adept at keeping track of where it is, so

64
each time a function completes, the program picks up where it left off in the function
that called it. When it gets to the end of the program, it terminates.

It is usually not helpful to read a program from top to bottom. In python programs
the top part of a file is almost always used for function definitions and it is not
necessary to read those until you want to understand what a particular function
does. The bottom part of a python file is often called the main program. This part
can be recognised because it is often not indented. It is easier to understand a the
program by following flow of execution starting at the beginning of the main
program.

2.8 Parameters and Arguments

Most functions require arguments. Arguments are values that are input to the function
and these contain the data that the function works on. For example, if you want to find
the absolute value of a number (the distance of a number from zero) you have to
indicate what the number is. Python has a built-in function for computing the absolute
value:

>>> abs(5)
5
>>> abs(-5)
5

In this example, the arguments to the abs function are 5 and -5.

Some functions take more than one argument. For example the built-in function pow
takes two arguments, the base and the exponent. Inside the function, the values that are
passed get assigned to variables called parameters.

>>> pow(2,3)
8
>>> pow(3,2)
9

The first argument is raised to the power of the second argument.

round(), not surprisingly, rounds a number and returns the floating point value first is
rounded to n-digits digits after the decimal point. It takes one or two arguments. The
number to be rounded and the second (optional) value is the number of digits to round
to. If the second number is not supplied it is assumed to be zero.

>>> round(1.23456789)
1
>>> round(1.5)

65
2
>>> round(1.23456789,2)
1.23
>>> round(1.23456789,3)
1.235

Another built-in function that takes more than one argument is max.

>>> max(7,11)
11
>>> max(1,4,17,2,12)
17
>>> max(3*11, 5**3, 512-9, 1024**0)
503

The function max can be sent any number of arguments, separated by commas, and
will return the maximum value sent. The arguments can be either simple values or
expressions. In the last example, 503 is returned, since it is larger than 33, 125, and 1.
Here is an example of a user-defined function that has a parameter:

>>> def print_twice(some_variable_name):


... print(some_variable_name, some_variable_name)

This function takes a single argument and assigns it to the parameter named will be) is
some_variable_name. The value of the parameter (at this point we have no idea what it
printed twice, followed by a newline. The name some_variable_name was chosen to
suggest that the name you give a parameter is up to you,but in general, you want to
choose something more descriptive than some_variable_name.

In a function call, the value of the argument is assigned to the corresponding parameter
in the function definition. In effect, it is as if some_variable_name = "Spam" is
executed when print_twice("Spam") is called; some_variable_name = 5 is executed
when print_twice(5) is called; and some_variable_name = 3.14159 is executed when
print_twice(3.14159) is called. Any type of argument that can be printed can be sent to
print_twice. In the first function call, the argument is a string. In the second, it’s an
integer. In the third, it’s a float.

As with built-in functions, we can use an expression as an argument for print twice:

>>> print_twice("Spam"*4)
SpamSpamSpamSpam SpamSpamSpamSpam

"Spam"*4 is first evaluated to ’SpamSpamSpamSpam’, which is then passed as an


argument to print_twice.

66
2.9 Variable and Parameters are Local

>>> def print_joined_twice(part1, part2) :


... joined = part1 + part2
... print_twice(joined)
This function takes two arguments, concatenates them and stores the result in a local
variable joined. It then calls print twice with joined as the argument. print twice prints
the value of the argument, twice. We can call the function with two strings:

>>> line1 = "Happy birthday," >>>


line2 = "to you."
>>> print_joined_twice(line1, line2)
Happy birthday,to you. Happy birthday,to you.

When print joined twice terminates, the variable joined is destroyed. If we try to print
it, we get an error:

>>> print(joined)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'joined' is not defined

When you create a local variable inside a function, it only exists inside that function,
and you cannot use it outside. Parameters are also local. For example, outside the
function print_twice, there is no such thing as phrase. If you try to use it, Python will
complain. Similarly, part1 and part2 do not exist outside print_joined_twice.

2.10 Stack Diagrams

To keep track of which variables can be used where, it is sometimes useful to draw a
stack diagram. Like state diagrams, stack diagrams show the value of each variable,
but they also show the function to which each variable belongs. Each function is
represented by a frame. A frame is a box with the name of a function beside it and the
parameters and variables of the function inside it. The stack diagram for the previous
example looks like this:

67
print_twice phrase "Happy birthday, to you."

print_joined_twice part1 "Happy birthday, "

"to you."
part2
"Happy birthday, to you."
joined

_main_
line1 "Happy birthday, "
line2 "to you."

The order of the stack shows the flow of execution. print_twice was called by
print_joined_twice, and print_joined_twice was called by _main_ , which is a special
name for the topmost function. When you create a variable outside of any function, it
belongs to _main_ . Each parameter refers to the same value as its corresponding
argument. So, part1 has the same value as line1, part2 has the same value as line2, and
phrase has the same value as joined. If an error occurs during a function call, Python
prints the name of the function, and the name of the function that called it, and the
name of the function that called that, all the way back to the top most function. To see
how this works, we create a Python script named stacktrace.py that looks like this:

def print_twice(phrase):
print(phrase, phrase)
print(joined)

def print_joined_twice(part1, part2):


joined = part1 + part2
print_twice(joined)

line1 = "Happy birthday, " line2


= "to you."
print_joined_twice(line1, line2)

We’ve added the statement, print joined inside the print twice function, but joined is
not defined there. Running this script will produce an error message like this:

Traceback (most recent call last):


File "C:/Python34/example.py", line 11, in <module> print_joined_twice(line1,
line2)
File "C:/Python34/example.py", line 7, in print_joined_twice
print_twice(joined)
File "C:/Python34/example.py", line 3, in print_twice print(joined)
NameError: name 'joined' is not defined

68
This list of functions is called a traceback. It tells you what program file the error
occurred in, and what line, and what functions were executing at the time. It also
shows the line of code that caused the error. Notice the similarity between the
traceback and the stack diagram. It’s not a coincidence. In fact, another common name
for a traceback is a stack trace.

2.11 Fruitful functions and Void functions

2.11.1 The return statement


The return statement allows you to terminate the execution of a function before
you reach the end. One reason to use it is if you detect an error condition:

def print_square_root(x):
if x < 0:
print("Warning: cannot take square root of a negative number.")
return result =
x**0.5
print("The square root of x is", result)

The function print square root has a parameter named x. The first thing it does is check
whether x is less than 0, in which case it displays an error message and then uses return
to exit the function. The flow of execution immediately returns to the caller, and the
remaining lines of the function are not executed.
2.11.2 Return values
The built-in functions we have used, such as abs, pow, round and max, have produced
results. Calling each of these functions generates a value, which we usually assign to a
variable or use as part of an expression.

biggest = max(3, 7, 2, 5) x
= abs(3 - 11) + 10

So far, none of the functions we have written has returned a value, they have printed
values. In this lecture, we are going to write functions that return values, which we will
call fruitful functions, for want of a better name. The first example is area_of_circle,
which returns the area of a circle with the given radius:

def area_of_circle(radius):
if radius < 0:
print("Warning: radius must be non-negative")
return
area = 3.14159 * radius**2
return area

We have seen the return statement before, but in a fruitful function the return statement
includes a return value. This statement means: Return immediately from this function

69
and use the following expression as a return value. The expression provided can be
arbitrarily complicated, so we could have written this function more concisely:

def area_of_circle(radius):
if radius < 0:
print("Warning: radius must be non-negative")
return
return 3.14159 * radius**2

On the other hand, temporary variables like area often make debugging easier.
Sometimes it is useful to have multiple return statements, one in each branch of a
conditional. For instance, we have already seen the built-in abs, now we see how to
write our own:

def absolute_value(x):
if x < 0:
return -x
else:
return x

Since these return statements are in an alternative conditional, only one will be
executed. As soon as one is executed, the function terminates without executing any
subsequent statements. Another way to write the above function is to leave out the else
and just follow if the condition by the second return statement.

def absolute_value(x):
if x < 0:
return -x
return x

Think about this version and convince yourself it works the same as the first one. Code
that appears any place the flow of execution can never reach, is called dead code. In a
fruitful function, it is a good idea to ensure that every possible path through the
program hits a return statement. The following version of absolute value fails to do
this:

def absolute_value(x):
if x < 0:
return -x
elif x > 0:
return x

This version is not correct because if x happens to be 0, neither condition is true, and
the function ends without hitting a return statement. In this case, the return value is a
special value called None:

70
>>> print(absolute_value(0)) None

None is the unique value of a type called the NoneType:

>>> type(None)
<class 'NoneType'>

All Python functions return None whenever they do not return another value. So the
earlier functions we wrote that didn’t have a return statement were actually returning
values, we just never checked.

>>> def print_hello() :


print("hello")

>>> return_value = print_hello() hello


>>> type(return_value)
<class 'NoneType'>

2.11.3 Program Development

At this point, you should be able to look at complete functions and tell what they do.
Also, while completing the laboratory exercises given so far, you will have written
some small functions. As you write larger functions, you might start to have more
difficulty, especially with runtime and semantic errors. To deal with increasingly
complex programs, we are going to suggest a technique called incremental
development. The goal of incremental development is to avoid long debugging
sessions by adding and testing only a small amount of code at a time.
As an example, suppose you want to find the distance between two points, given by the
coordinates (x1, y1) and (x2, y2). By the Pythagorean theorem, the distance is:

distance =(𝑥𝑥𝑥𝑥2 − 𝑥𝑥𝑥𝑥1)2 + (𝑦𝑦𝑦𝑦2 − 𝑦𝑦𝑦𝑦1)2


The first step is to consider what a distance function should look like in Python. In
other words, what are the inputs (parameters) and what is the output (return value)? In
this case, the two points are the inputs, which we can represent using four parameters.
The return value is the distance, which is a floating-point value. Already we can write
an outline of the function:

def distance(x1, y1, x2, y2): return


0.0

71
Obviously, this version of the function doesn’t compute distances; it always returns
zero. But it is syntactically correct, and it will run, which means that we can test it
before we make it more complicated. To test the new function, we call it with sample
values:

>>> distance(1,2,4,6)
0.0

We chose these values so that the horizontal distance equals 3 and the vertical distance
equals 4; that way, the result is 5 (the hypotenuse of a 3-4-5 triangle). When testing a
function, it is useful to know the right answer. At this point we have confirmed that the
function is syntactically correct, and we can start adding lines of code. After each
incremental change, we test the function again. If an error occurs at any point, we
know where it must be—in the last line we added.

A logical first step in the computation is to find the differences x2 − x1 and y2 − y1.
We will store those values in temporary variables named dx and dy and print them.

def distance(x1, y1, x2, y2):


dx = x2 - x1 dy
= y2 - y1
print("dx is", dx)
print("dy is", dy)
return 0.0

If the function is working, the outputs should be 3 and 4. If so, we know that the
function is getting the right parameters and performing the first computation correctly.
If not, there are only a few lines to check.

Next we compute the sum of squares of dx and dy:

def distance(x1, y1, x2, y2):


dx = x2 - x1 dy = y2 - y1
dsquared = dx**2 + dy**2
print("dsquared is: ", dsquared)

return 0.0

Notice that we removed the print statements we wrote in the previous step. Code like
that is called scaffolding because it is helpful for building the program but is not part of
the final product. Again, we would run the program at this stage and check the output
(which should be 25). Finally, using the fractional exponent 0.5 to find the square root,
we compute and return the result:

72
def distance(x1, y1, x2, y2):
dx = x2 - x1 dy = y2 - y1
dsquared = dx**2 + dy**2
result = dsquared**0.5
return result

If that works correctly, you are done. Otherwise, you might want to print the value of
result before the return statement. When you start out, you should add only a line or
two of code at a time. As you gain more experience, you might find yourself writing
and debugging bigger chunks. Either way, the incremental development process can
save you a lot of debugging time. The key aspects of the process are:
1. Start with a working program and make small incremental changes. At any
point, if there is an error, you will know exactly where it is.
2. Use temporary variables to hold intermediate values so you can output and
check them.
3. Once the program is working, you might want to remove some of the
scaffolding or consolidate multiple statements into compound expressions, but
only if it does not make the program difficult to read.

2.11.4 Composition

As you should expect by now, you can call one function from within another. This
ability is called composition. As an example, we’ll write a function that takes two
points, the center of the circle and a point on the perimeter, and computes the area of
the circle. Assume that the center point is stored in the variables xc and yc, and the
perimeter point is in xp and yp. The first step is to find the radius of the circle, which is
the distance between the two points. Fortunately, we’ve just written a function,
distance, that does just that, so now all we have to do is use it:

radius = distance(xc, yc, xp, yp)

The second step is to find the area of a circle with that radius and return it. Again we
will use one of our earlier functions:

result = area_of_circle(radius)

Wrapping that up in a function, we get:

def area_of_circle_two_points(xc, yc, xp, yp):


radius = distance(xc, yc, xp, yp)
result = area_of_circle(radius)
return result

We called this function area of circle two points to distinguish it from the
area_of_circle function defined earlier. There can only be one function with a given
name within a given module. The temporary variables radius and result are useful for

73
development and debugging, but once the program is working, we can make it more
concise by composing the function calls:

def area_of_circle_two_points(xc, yc, xp, yp):


return area_of_circle(distance(xc, yc, xp, yp))

2.11.5 Boolean functions

Functions can return boolean values, which is often convenient for hiding complicated
tests inside functions. For example:

>>> def is_divisible(x, y):


if x % y == 0:
return True
else:
return False

The name of this function is is divisible. It is common to give boolean functions names
that sound like yes/no questions. is_divisible returns either True or False to indicate
whether the x is or is not divisible by y. We can make the function more concise by
taking advantage of the fact that the condition of the if statement is itself a boolean
expression. We can return it directly, avoiding the if statement altogether:

def is_divisible(x, y):


return x % y == 0

This session shows the new function in action:

>>> is_divisible(6,4)
False
>>> is_divisible(6,3)
True

Boolean functions are often used in conditional statements:

if is_divisible(x, y):
print("x is divisible by y")
else:
print("x is not divisible by y")

It might be tempting to write something like:

74
if is_divisible(x, y) == True:
print("x is divisible by y")
else:
print("x is not divisible by y")

But the extra comparison is unnecessary.

2.11.6 Void Functions

Void functions are functions, like ‘print_twice’ (that we defined earlier), that perform
an action (either display something on the screen or perform some other action).
However, they do not return a value.
For instance, we defined the function ‘print_twice’. The function is meant to perform
the action of printing twice the parameter ‘bruce’.

In interactive mode:Python will display the result of a void function if and only if we
call a function in interactive mode.
In script mode:When we call a fruitful function all by itself in script mode, the
return value is lost forever if we do not store or display the result. For instance:

>>> def print_twice(some_variable):


… print(some_variable)
… print(some_variable)

>>> result = print_twice(‘Bing’)
Bing
Bing
>>> print result
None

It is important to note that although Python displayed the value of result earlier, the
result displayed:
Bing Bing is lost forever since we did not store
it anywhere.
In order to transmit this idea Python created the notion of ‘None’. It is a special value
that has its own type.

>>> print(type(None))
<class 'NoneType'>

2.12 Importing with from We can use functions in


modules in three different ways:

75
• Import a module object in Python:If you import math, you get a module object
named math. The module object contains constants like pi and functions like sin
and exp.
>>> import math

>>> print(math)

<module 'math' (built-in)>

>>> print(math.pi)

3.141592653589793

• Import an object from a module in Python

>>> print(math.pi)
3.141592653589793

Now you can access pi directly, without dot notation.

>>> print(pi)

3.141592653589793

• Import all objects from a module in Python

>>> from math import*

The advantage of importing everything from the math module is that your code can be
more concise. The disadvantage is that there might be conflicts between names defined
in different modules, or between a name from a module and one of your variables.

2.13 More Recursion

Recursion is a way of programming or coding a problem, in which a function calls


itself one or more times in its body. Usually, it is returning the return value of this

76
function call. If a function definition fulfils the condition of recursion, we call this
function a recursive function.

Termination condition:
A recursive function has to terminate to be used in a program. A recursive function
terminates, if with every recursive call the solution of the problem is downsized and
moves towards a base case. A base case is a case, where the problem can be solved
without further recursion. A recursion can lead to an infinite loop, if the base case is
not met in the calls.

Example:

4! = 4 * 3! 3!
= 3 * 2!
2! = 2 * 1

Replacing the calculated values gives us the following expression


4! = 4 * 3 * 2 * 1

Generally we can say: Recursion in computer science is a method where the solution to
a problem is based on solving smaller instances of the same problem.

Recursion functions in Python


Now we come to implement the factorial in Python. It's as easy and elegant as the
mathematical definition.

def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n-1)

We can track how the function works by adding two print() functions to the previous
function definition:

def factorial(n):
print("factorial has been called with n = " +
str(n)) if n == 1: return 1 else:
res = n * factorial(n-1)
print("intermediate result for ", n, " * factorial(" ,n-1, "): ",res)
return res

>>> print(factorial(5))

77
This Python script outputs the following results:

factorial has been called with n = 5 factorial


has been called with n = 4 factorial has been
called with n = 3 factorial has been called
with n = 2 factorial has been called with n =
1 intermediate result for 2 * factorial( 1 ): 2
intermediate result for 3 * factorial( 2 ): 6
intermediate result for 4 * factorial( 3 ): 24
intermediate result for 5 * factorial( 4 ):
120
120

2.13 Leap of Faith


Trust in the code blocks you created and tested.

2.14 Checking Types

The built-in function isinstance is introduced in this section. The function verifies the
type of argument.
On section 2.13, we developed a function called factorial. Let us take another step
further and check the type of the argument and make sure it is positive.

def factorial(n) :
if not isinstance(n,int) : print("Factorial is only
defined for intergers.") return None;
elif n<0 :
print("Factorial is not defined for negative intergers.") return
None;
elif n == 0 :
return 1;
else :
return n * factorial(n-1)

>>> factorial('banana')
Factorial is only defined for intergers.
>>> factorial(3.5)
Factorial is only defined for intergers.
>>> factorial(-1)
Factorial is not defined for negative intergers.
>>> factorial(8)
40320

78
This program demonstrates a pattern sometimes called a guardian. The first two
conditionals act as guardians [(not isinstance) and (elif n < 0)] , protecting the code
that follows from values that might cause an error.
The guardians make it possible to prove the correctness of the code.

STRINGS

2.15 A String Is A sequence of Characters

Strings in Python are identified as a contiguous set of characters represented in the


quotation marks. Python allows either pair of single or double quotes. 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 to the end.

The plus (+) sign is the string concatenation operator and the asterisk (*) is the
repetition operator. For example-

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

2.16 Traversal as a For Loop

Recall we said that all programming languages allowed you to perform a few basic
operations: get input, display output, do math, do conditional execution and then there
was just one more thing. The last thing we need to add to the list is repetition, the
ability to loop through a set of statements repeatedly. We will look at this in a lot more
detail later but there is a special type of loop that is particularly useful with strings (and
other compound types) which is worth introducing while we are looking at strings.

A lot of computations involve processing a string one character at a time. Often they
start at the beginning, select each character in turn, do something to it, and continue
until the end. This pattern of processing is called a traversal. Python provides a very
useful language feature for traversing many compound types— the for loop:

79
>>> fruit ='banana'
>>> for char in fruit:
print(char)

The above piece of code can be understood as an abbreviated version of an English


sentence: “For each character in the string fruit, print out the character”. The for loop is
an example of an iterator: something that visits or selects every element in a structure
(in this case a string), usually in turn. The for loop also works on other compound
types such as lists and tuples, which we will look at later.

The following example shows how to use concatenation and a for loop to generate an
abecedarian series. Abecedarian refers to a series or list in which the elements appear
in alphabetical order. For example, in Robert McCloskey’s book Make Way for
Ducklings, the names of the ducklings are Jack, Kack, Lack, Mack, Nack, Ouack,
Pack, and Quack. This loop outputs these names in order:

prefixes = "JKLMNOPQ"
suffix = "ack" for
letter in prefixes:
print letter + suffix

The output of this program is:

Jack
Kack
Lack
Mack
Nack
Nack
Oack
Pack
Qack

2.17 String Slices

A substring of a string is called a slice. Selecting a slice is similar to selecting a


character:

>>> s = "Peter, Paul, and Mary"


>>> print(s[0:5])
Peter
>>> print(s[7:11])
Paul

80
>>> print(s[17:21]) Mary

The operator [n:m] returns the part of the string from the nth character to the mth
character, including the first but excluding the last. If you find this behaviour
counterintuitive it might make more sense if you imagine the indices pointing between
the characters, as in the following diagram:

fruit ’banana’

index 0 1 2 3 4 5 6

If you omit the first index (before the colon), the slice starts at the beginning of the
string. If you omit the second index, the slice goes to the end of the string. Thus:

>>> fruit= "banana"


>>> fruit[0:3]
'ban'
>>> fruit[3:]
'ana'

2.18 Strings Are Immutable


It is tempting to use the [] operator on the left side of an assignment, with the intention
of changing a character in a string. For example:

>>> greeting = "Hello, world!"


>>> greeting[0] = "J"
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
greeting[0] = "J"
TypeError: 'str' object does not support item assignment
>>> print(greeting) Hello, world!

Instead of producing the output Jello, world!, this code produces the runtime error
TypeError:’str’ object doesn’t support item assignment. Strings are immutable, which
means you can’t change an existing string. The best you can do is create a new string
that is a variation on the original:

>>> greeting = "Hello, world!"


>>> newGreeting = "J" + greeting[1:] >>>
print(newGreeting) Jello, world!

81
The solution here is to concatenate a new first letter onto a slice of greeting. This
operation has no effect on the original string.

2.19 Searching

It determines if string str occurs in string, or in a substring of string if starting


index beg and ending index end are given.

Syntax
str.find(str, beg=0, end=len(string))

Parameters
• str -- This specifies the string to be searched.
• beg -- This is the starting index, by default its 0.
• end -- This is the ending index, by default its equal to the length of the string.

Return Value
Index if found and -1 otherwise.

Example

>>> str1 = "this is string example....wow!!!"


>>> str2 = "exam"
>>> print(str1.find(str2))
15
>>> print(str1.find(str2, 10))

15
>>> print(str1.find(str2, 40))
-1

2.20 Looping and Counting

The following program counts the number of times the letter a appears in a string and
is an example of a counter pattern :

>>> fruit = "banana";


>>> count = 0
>>> for char in fruit :
if char == "a" :
count+=1
>>> print(count)
3

2.21 String Methods

82
In addition to the functions that we have seen so far there is also a special type of
function called a method. You can think of a method as a function which is attached to
a certain type of variable (e.g. a string). When calling a function you just need the
name of the function followed by parentheses (possibly with some arguments inside).
In contrast a method also needs to be associated with a variable (also called an object).
The syntax that is used is the variable (or object) name or a value followed by a dot
followed by the name of the method along with possibly some arguments in
parentheses like this:

VARIABLE.METHODNAME(ARGUMENTS)

You can see that it looks just like a function call except for the variable name and the
dot at the start. Compare how the len function and the upper method are used below.

>>> my_str = "hello world"


>>> len(my_str)
11
>>> my_str.upper()
'HELLO WORLD'

The len function returns the length of the sequence which is given as an argument. The
upper method returns a new string which is the same as the string that it is called upon
except that each character has been converted to uppercase. In each case the original
string remains unchanged.

An example of a method which needs an argument to operate on is the count method.

>>> my_str = "the quick brown fox jumps over the lazy dog." >>>
my_str.count("the")
2
>>> my_str.count("hello") 0

>>> my_str.count("e")
3
The count method returns the number of times the string given as an argument occurs
within the string that it is called upon. But what about the following:

>>> ms = "ahaha"
>>> ms.count("aha")
1

The str type contains useful methods that manipulate strings. To see what methods are
available, use the dir function with str as an argument.

83
>>> dir(str)

which will return the list of items associated with strings:


[' add ', ' class ', '__contains ', ' delattr__', ' dir ', ' doc ', '__eq ',
' format ', ' ge ', '__getattribute ', ' getitem ', ' getnewargs ', ' gt ',
' hash ', ' init ', ' init_subclass ', ' iter__', ' le ', ' len ', ' lt ',
' mod ', ' mul ', '__ne ', ' new ', ' reduce ', ' reduce_ex ', ' repr ',
' rmod ', ' rmul ', ' setattr ', ' sizeof ', ' str ', ' subclasshook ',
'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find',
'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier',
'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower',
'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit',
'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper',
'zfill']

To find out more about an item in this list, we can use the help command:

>>> help(str.capitalize)
Help on method_descriptor:

capitalize(...)
S.capitalize() -> str

Return a capitalized version of S, i.e. make the first character have upper
case and the rest lower case.

We can call any of these methods using dot notation:

>>> s = "brendan"
>>> s.capitalize()
'Brendan'

Calling the help function prints out the docstring:

>>> help(str.find)
Help on method_descriptor:
find(...)

S.find(sub[, start[, end]]) -> int

Return the lowest index in S where substring sub is found, such that sub is contained
within S[start:end]. Optional arguments start and end are interpreted as in slice
notation.

84
Return -1 on failure.

The parameters in square brackets are optional parameters. We can use str.find to find
the location of a character in a string:

>>> fruit = "banana"


>>> index = fruit.find('a')
>>> print(index)
1
Or a substring:

>>> fruit.find("na")
2

It also takes an additional argument that specifies the index at which it should start:

>>> fruit.find("na",3)
4

And has a second optional parameter specifying the index at which the search should
end:

>>> "bob".find("b",1,2)
-1

In this example, the search fails because the letter b does not appear in the index range
from 1 to 2 (not including 2).

2.22 The in operator

The in operator tests if one string is a substring of another:

>>> "p" in "apple"


True
>>> "i" in "apple"
False
>>> "ap" in "apple"
True
>>> "pa" in "apple"
False

Note that a string is a substring of itself:

85
>>> "a" in "a"
True
>>> "apple" in "apple"
True

Combining the in operator with string concatenation using +, we can write a function
that removes all the vowels from a string:

def remove_vowels(s):
# vowels contains all the letters we want to remove
vowels = "aeiouAEIOU" s_without_vowels = ""
# scan through each letter in the input string
for letter in s:
# check if the letter is not in the disallowed list of letters
if letter not in vowels:
# the letter is allowed, add it to the result
s_without_vowels += letter return
s_without_vowels

Test this function to confirm that it does what we wanted it to do.

2.23 String Comparison

The comparison operators work on strings. To see if two strings are equal:

>>> if word < "banana": print("Your word," + word + ",


comes before banana.")
elif word > "banana":
print("Your word," + word + ", comes after banana.")
else:
print("Yes, we have no bananas!")

You should be aware, though, that Python does not handle upper- and lowercase letters
the same way that people do. All the uppercase letters come before all the lowercase
letters. As a result:

Your word,zebra, comes after banana.

A common way to address this problem is to convert strings to a standard format, such
as all lowercase, before performing the comparison. A more difficult problem is
making the program realize that zebras are not fruit.

2.24 String Operations

86
S. No. Methods with Description

capitalize()
1 Capitalizes first letter of string

center(width, fillchar)
2
Returns a string padded with fillchar with the original string centered to
a total of width columns.

count(str, beg= 0,end=len(string))


3
Counts how many times str occurs in string or in a substring of string if
starting index beg and ending index end are given.

decode(encoding='UTF-8',errors='strict')
4

Decodes the string using the codec registered for encoding. encoding
defaults to the default string encoding.

encode(encoding='UTF-8',errors='strict')
5
Returns encoded string version of string; on error, default is to raise a
ValueError unless errors is given with 'ignore' or 'replace'.

6 endswith(suffix, beg=0, end=len(string))


Determines if string or a substring of string (if starting index beg and
ending index end are given) ends with suffix; returns true if so and
false otherwise.
expandtabs(tabsize=8)
7

Expands tabs in string to multiple spaces; defaults to 8 spaces per tab


if tabsize not provided.

find(str, beg=0 end=len(string))


8

Determine if str occurs in string or in a substring of string if starting


index beg and ending index end are given returns index if found and -1
otherwise.

87
index(str, beg=0, end=len(string))

9
Same as find(), but raises an exception if str not found.

isalnum()
10
Returns true if string has at least 1 character and all characters are
alphanumeric and false otherwise.

isalpha()
11
Returns true if string has at least 1 character and all characters are
alphabetic and false otherwise.

isdigit()

12
Returns true if the string contains only digits and false otherwise.

islower()
13
Returns true if string has at least 1 cased character and all cased
characters are in lowercase and false otherwise.

isnumeric()
14

Returns true if a unicode string contains only numeric characters and


false otherwise.

isspace()
15
Returns true if string contains only whitespace characters and false
otherwise.
istitle()

16
Returns true if string is properly "titlecased" and false otherwise.

isupper()
17

Returns true if string has at least one cased character and all cased
characters are in uppercase and false otherwise.

88
join(seq)
18
Merges (concatenates) the string representations of elements in
sequence seq into a string, with separator string.

len(string)

19
Returns the length of the string

ljust(width[, fillchar])
20

Returns a space-padded string with the original string left-justified to


a total of width columns.

lower()

21
Converts all uppercase letters in string to lowercase.

lstrip()

22
Removes all leading whitespace in string.

maketrans()

23
Returns a translation table to be used in translate function.

max(str)

24
Returns the max alphabetical character from the string str.

min(str)

25
Returns the min alphabetical character from the string str.

replace(old, new [, max])


26

Replaces all occurrences of old in string with new or at most max


occurrences if max given.

89
rfind(str, beg=0,end=len(string))

27
Same as find(), but search backwards in string.

rindex( str, beg=0, end=len(string))

28
Same as index(), but search backwards in string.

rjust(width,[, fillchar])
29

Returns a space-padded string with the original string right-justified to


a total of width columns.

rstrip()

30
Removes all trailing whitespace of string.

split(str="", num=string.count(str))
31

Splits string according to delimiter str (space if not provided) and


returns list of substrings; split into at most num substrings if given.

splitlines( num=string.count('\n'))
32

Splits string at all (or num) NEWLINEs and returns a list of each line
with NEWLINEs removed.

startswith(str, beg=0,end=len(string))

33 Determines if string or a substring of string (if starting index beg and


ending index end are given) starts with substring str; returns true if so
and false otherwise.

strip([chars])

34
Performs both lstrip() and rstrip() on string

swapcase()

35
Inverts case for all letters in string.

90
title()
36
Returns "titlecased" version of string, that is, all words begin with
uppercase and the rest are lowercase.

translate(table, deletechars="")
37

Translates string according to translation table str(256 chars), removing


those in the del string.

upper()

38
Converts lowercase letters in string to uppercase.

zfill (width)
39

Returns original string leftpadded with zeros to a total of width


characters; intended for numbers, zfill() retains any sign given (less
one zero).
isdecimal()
40

Returns true if a unicode string contains only decimal characters and


false otherwise.

91
Unit 3
Lists A list is an ordered set of values, where
each value is identified by an index. The values that make up a list are called its elements .
Lists are similar to strings, which are ordered sets of characters, except that the elements of
a list can have any type. Lists and strings—and other things that behave like ordered sets—
are called sequences .

The list is the most versatile datatype available in Python, which can be written as a list of
comma-separated values (items) between square brackets. Important thing about a list is that
the items in a list need not be of the same type.

There are several ways to create a new list; the simplest is to enclose the elements in square
brackets ([ and ]):
[10, 20, 30, 40] ["spam", "bungee", "swallow"]

The first example is a list of four integers. The second is a list of three strings. The elements
of a list don’t have to be the same type. The following list contains a string, a float, an
integer, and another list:
["hello", 2.0, 5, [10, 20]]

A list within another list is said to be nested . Finally, there is a special list that contains no
elements. It is called the empty list, and is denoted []. Like numeric 0 values and the empty
string, the empty list is false in a boolean expression:
>>> if []:
... print "This is true."
... else: ... print "This is false." ... This is false.
>>>

With all these ways to create lists, it would be disappointing if we couldn’t assign list values
to variables or pass lists as parameters to functions. We can:
>>> vocabulary = ["ameliorate", "castigate", "defenestrate"]
>>> numbers = [17, 5]
>>> empty = []
>>> print vocabulary, numbers, empty
[’ameliorate’, ’castigate’, ’defenestrate’] [17, 5] []
80

Values and Accessing Elements:


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/python3
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 produces 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']

Lists are mutable :


Unlike strings lists are mutable , which means we can change their elements. Using the
bracket operator on the left side of an assignment, we can update one of the elements:
>>> fruit = ["banana", "apple", "quince"]
>>> fruit[0] = "pear"
>>> fruit[-1] = "orange"
>>> print fruit
[’pear’, ’apple’, ’orange’]

The bracket operator applied to a list can appear anywhere in an expression. When it
appears on the left side of an assignment, it changes one of the elements in the list, so the
first element of fruit has been changed from "banana" to "pear", and the last from
"quince" to "orange". An assignment to an element of a list is called item assignment.
81
Item assignment does not work for strings:
>>> my_string = "TEST"
>>> my_string[2] = "X"
Traceback (most recent
call last): File
"<stdin>", line 1, in
<module>
TypeError: ’str’ object does not support item assignment

but it does for lists:


>>> my_list = ["T", "E", "S", "T"]
>>> my_list[2] = "X"
>>> my_list
[’T’, ’E’, ’X’, ’T’]

With the slice operator we can update several elements at once:


>>> a_list = ["a", "b", "c", "d", "e", "f"]
>>> a_list[1:3] = ["x", "y"]
>>> print a_list
[’a’, ’x’, ’y’, ’d’, ’e’, ’f’]

We can also remove elements from a list by assigning the empty list to them:
>>> a_list = ["a", "b", "c", "d", "e", "f"]
>>> a_list[1:3] = []
>>>
print
a_list
[’a’,
’d’,
’e’,
’f’]

And we can add elements to a list by squeezing them into an empty slice at the desired
location:
>>> a_list = ["a", "d", "f"]
>>> a_list[1:1] = ["b", "c"]
>>> print a_list
[’a’, ’b’, ’c’, ’d’, ’f’]
>>> a_list[4:4] = ["e"]
>>> print a_list
[’a’, ’b’, ’c’, ’d’, ’e’,
’f’]
82
Deleting elements from List :
To remove a list element, you can use either the del statement if you know exactly which
element(s) you are deleting. You can use the remove() method if you do not know exactly
which items to delete. For example-
#!/usr/bin/python3 list = ['physics',
'chemistry', 1997,
2000] print (list)
del list[2]
print ("After deleting value at index 2 : ", list)

When the above code is executed, it produces the following result-


['physics', 'chemistry', 1997, 2000]
After deleting value at index 2 : ['physics', 'chemistry', 2000] Note:
remove() method is discussed in subsequent section.

Built-in List Operators, Concatenation, Repetition, In Operator :


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.

Python Expression Results Description


len([1, 2, 3]) 3 Length

[1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] Concatenation


['Hi!'] * 4 ['Hi!', 'Hi!', 'Hi!', 'Hi!'] Repetition
3 in [1, 2, 3] True Membership

for x in [1,2,3] : print (x,end=' ') 123 Iteration

Built-in List functions and methods :


Python includes the following list functions :
SN Function with Description
1 cmp(list1, list2) : No longer available in Python 3.
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.

96
Let us understand the use of these functions. Listlen()Method

Description
The len() method returns the number of elements in the list.

Syntax
Following is the syntax for len() method-
len(list)

Parameters
list - This is a list for which, number of elements are to be counted.

Return Value
This method returns the number of elements in the list.

Example
The following example shows the usage of len() method.
#!/usr/bin/python3
list1 = ['physics', 'chemistry', 'maths'] print (len(list1))
list2=list(range(5)) #creates list of numbers between 0-4
print (len(list2))

When we run above program, it produces following result -


3
5

List max() Method

Description
The max() method returns the elements from the list with maximum value.

Syntax
Following is the syntax for max() method-

max(list)

Parameters
list - This is a list from which max valued element are to be returned.
97
Return Value
This method returns the elements from the list with maximum value.

Example

The following example shows the usage of max() method.


#!/usr/bin/python3
list1, list2 = ['C++','Java', 'Python'], [456, 700, 200]
print ("Max value element : ", max(list1)) print ("Max value
element : ", max(list2))
When we run above program, it produces following result-
Max value element : Python
Max value element : 700

List min() Method


Description
The method min() returns the elements from the list with minimum value.

Syntax
Following is the syntax for min() method-

min(list)

Parameters
list - This is a list from which min valued element is to be returned.

Return Value
This method returns the elements from the list with minimum value.

Example
The following example shows the usage of min() method.
#!/usr/bin/python3
list1, list2 = ['C++','Java', 'Python'], [456, 700, 200]
print ("min value element : ", min(list1))

When we run above program, it produces following result- print ("min value
element : ", min(list2))

98
min value element : C++
min value element : 200

List list() Method

Description
The list() method takes sequence types and converts them to lists. This is used to convert a
given tuple into list.
Note: Tuple are very similar to lists with only difference that element values of a tuple can
not be changed and tuple elements are put between parentheses instead of square bracket.
This function also converts characters in a string into a list.

Syntax
Following is the syntax for list() method-

list( seq )

Parameters
seq - This is a tuple or string to be converted into list.

Return Value
This method returns the list.

Example
The following example shows the usage of list() method.
#!/usr/bin/python3
aTuple = (123, 'C++', 'Java', 'Python') list1 = list(aTuple)
print ("List elements : ", list1) str="Hello World"
list2=list(str)
print ("List elements : ", list2)
When we run above program, it produces following result-
List elements :[123, 'C++', 'Java', 'Python']
List elements :['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r',
'l', 'd']

Python includes the following list methods-

99
SN Methods with Description

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 obj from list

8 list.reverse()
Reverses objects of list in place

9 list.sort([func])
Sorts objects of list, use compare func if given

List append() Method

Description
The append() method appends a passed obj into the existing list.

Syntax
Following is the syntax for append() method-

list.append(obj)

100
Parameters
obj - This is the object to be appended in the list.

Return Value
This method does not return any value but updates existing list.

Example
The following example shows the usage of append() method. #!/usr/bin/python3
list1 = ['C++', 'Java', 'Python'] list1.append('C#')
print ("updated list : ", list1)
When we run the above program, it produces the following result-
updated list : ['C++', 'Java', 'Python', 'C#']
List count()Method

Description
The count() method returns count of how many times obj occurs in list.

Syntax
Following is the syntax for count() method-

list.count(obj)

Parameters
obj - This is the object to be counted in the list.

Return Value
This method returns count of how many times obj occurs in list.

Example The following example shows the usage of


count() method.
#!/usr/bin/python3
aList = [123, 'xyz', 'zara', 'abc', 123]; print ("Count for
123 : ", aList.count(123))
print ("Count for zara : ", aList.count('zara'))
When we run the above program, it produces the following result-
Count for 123 : 2
Count for zara : 1

Listextend()Method

101
Description
The extend() method appends the contents of seq to list.

Syntax
Following is the syntax for extend() method-

list.extend(seq)
Parameters
seq - This is the list of elements

Return Value
This method does not return any value but adds the content to an existing list.

Example The following example shows the usage of


extend() method.
#!/usr/bin/python3
list1 = ['physics', 'chemistry', 'maths']
list2=list(range(5)) #creates list of numbers between 0-4
list1.extend('Extended List :', list2)
print (list1)

When we run the above program, it produces the following result-


Extended List :['physics', 'chemistry', 'maths', 0, 1, 2, 3,
4]

List index() Method

Description
The index() method returns the lowest index in list that obj appears.

Syntax
Following is the syntax for index() method-

list.index(obj)

Parameters
obj - This is the object to be find out.

Return Value
102
This method returns index of the found object otherwise raises an exception indicating
that the value is not found.

Example
The following example shows the usage of index() method.
#!/usr/bin/python3
list1 = ['physics', 'chemistry', 'maths'] print ('Index of
chemistry', list1.index('chemistry'))
print ('Index of C#', list1.index('C#'))
When we run the above program, it produces the following result-
Index of chemistry 1 Traceback
(most recent call last):
File "test.py", line 3, in print ('Index of
C#', list1.index('C#'))
ValueError: 'C#' is not in list

List insert() Method

Description
The insert() method inserts object obj into list at offset index.

Syntax
Following is the syntax for insert() method-

list.insert(index, obj)

Parameters
• index - This is the Index where the object obj need to beinserted.

• obj - This is the Object to be inserted into the given list.

Return Value
This method does not return any value but it inserts the given element at the given index.

Example
The following example shows the usage of insert() method.
#!/usr/bin/python3
list1 = ['physics', 'chemistry', 'maths'] list1.insert(1,
'Biology')

103
print ('Final list : ', list1)
When we run the above program, it produces the following result-
Final list : ['physics', 'Biology', 'chemistry', 'maths']
List pop() Method

Description
The pop() method removes and returns last object or obj from the list.

Syntax
Following is the syntax for pop() method-

list.pop(obj=list[-1])

Parameters
obj - This is an optional parameter, index of the object to be removed from the list.

Return Value
This method returns the removed object from the list.

Example
The following example shows the usage of pop() method.
#!/usr/bin/python3
list1 = ['physics', 'Biology', 'chemistry', 'maths']
list1.pop()
print ("list now : ", list1) list1.pop(1)
print ("list now : ", list1)
When we run the above program, it produces the following result-

list now : ['physics', 'Biology', 'chemistry']


list now : ['physics', 'chemistry']

Listremove()Method

Parameters
obj - This is the object to be removed from the list.

Return Value
This method does not return any value but removes the given object from the list. Example

104
The following example shows the usage of remove() method.
#!/usr/bin/python3
list1 = ['physics', 'Biology', 'chemistry', 'maths']
list1.remove('Biology') print ("list now : ", list1)
list1.remove('maths')
print ("list now : ", list1)
When we run the above program, it produces the following result-

list now : ['physics', 'chemistry', 'maths']


list now : ['physics', 'chemistry']

Listreverse()Method

Description
The reverse() method reverses objects of list in place.

Syntax
Following is the syntax for reverse() method-

list.reverse()

Parameters
NA

Return Value
This method does not return any value but reverse the given object from the list.

Example
The following example shows the usage of reverse() method.
#!/usr/bin/python3
list1 = ['physics', 'Biology', 'chemistry', 'maths']
list1.reverse()
print ("list now : ", list1)
When we run above program, it produces following result-
list now :['maths', 'chemistry', 'Biology', 'physics']

105
List sort() Method

Description
The sort() method sorts objects of list, use compare function if given.

Syntax
Following is the syntax for sort() method-

list.sort([func])

Parameters
NA

Return Value
This method does not return any value but reverses the given object from the list.

Example
The following example shows the usage of sort() method.
#!/usr/bin/python3 list1 = ['physics', 'Biology', 'chemistry', 'maths']
list1.sort()
print ("list now : ", list1)
When we run the above program, it produces the following result-
list now : ['Biology', 'chemistry', 'maths', 'physics']

Tuples and Dictionaries


tuple is a sequence of immutable Python objects. Tuples are sequences, just like lists. The main
difference between the tuples and the lists is that the tuples cannot be changed unlike lists.
Tuples use parentheses, whereas lists use square brackets.

Creating a tuple is as simple as putting different comma-separated values. Optionally, you can
put these comma-separated values between parentheses also. Forexample-

tup1 = ('physics', 'chemistry', 1997, 2000)


tup2 = (1, 2, 3, 4, 5 ) tup3 = "a", "b", "c",
"d"

The empty tuple is written as two parentheses containing nothing.

tup1 = ();

106
To write a tuple containing a single value you have to include a comma, even though there is
only one value.

tup1 = (50,)
Like string indices, tuple indices start at 0, and they can be sliced, concatenated, and so on.

Accessing values in Tuples :


To access values in tuple, use the square brackets for slicing along with the index or indices to obtain
the value available at that index. For example-
#!/usr/bin/python3
tup1 = ('physics', 'chemistry', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 ) print
("tup1[0]: ", tup1[0]) print
("tup2[1:5]: ", tup2[1:5])

When the above code is executed, it produces the following result-


tup1[0] : physics
tup2[1:5] : [2, 3, 4, 5]
Tuple Assignment :
Once in a while, it is useful to perform multiple assignments in a single statement and this can be
done with tuple assignment :
>>> a,b = 3,4
>>> print a
3
>>> print b
4
>>> a,b,c = (1,2,3),5,6
>>> print a
(1, 2, 3)
>>> print b
5
>>> print c
6

The left side is a tuple of variables; the right side is a tuple of values. Each value is assigned to its respective
variable. All the expressions on the right side are evaluated before any of the assignments. This feature
makes tuple assignment quite versatile. Naturally, the number of variables on the left and the number of
values on the right have to be the same:

>>> a, b, c, d = 1, 2, 3
ValueError: need more than 3 values to unpack
Such statements can be useful shorthand for multiple assignment statements, but care should be taken that
it doesn’t make the code more difficult to read.
One example of tuple assignment that improves readibility is when we want to swap the values of two
variables. With conventional assignment statements, we have to use a temporary variable. For example,
to swap aand b:
107
temp = a a
= b
b = temp
If we have to do this often, such an approach becomes cumbersome. Python provides a form of tuple
assignment that solves this problem neatly:
a, b = b, a

Tuples as return values :


Functions can return tuples as return values. For example, we could write a function that swaps two
parameters :
def swap(x, y):
return y, x
Then we can assign the return value to a tuple with two variables: a,
b = swap(a, b)
In this case, there is no great advantage in making swap a function. In fact, there is a danger in trying
to encapsulate swap, which is the following tempting mistake :

If we call swaplike this def x, y = y, xswap(x, y): # incorrect version

swap(a, b)
then aand xare aliases for the same value. Changing xinside swapmakes xrefer to a different value, but
it has no effect on a in main . Similarly, changing y has no effect on b. This function runs without
producing an error message, but it doesn’t do what we intended. This is an example of a semantic
error.
Basic tuples operations, Concatenation, Repetition, in Operator, Iteration :
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.
In fact, tuples respond to all of the general sequence operations we used on strings in the
previous chapter.
Python Expression Results Description

len((1, 2, 3)) 3 Length

(1, 2, 3) + (4, 5, 6) (1, 2, 3, 4, 5, 6) Concatenation

('Hi!',) * 4 ('Hi!', 'Hi!', 'Hi!', 'Hi!') Repetition

108
3 in (1, 2, 3) True Membership

for x in (1,2,3) : print (x, end=' 123 Iteration


')

Built-in Tuple Functions :


Python includes the following tuple functions-

SN Function with Description

1 cmp(tuple1, tuple2)
No longer available in Python 3.

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.

Tuplelen()Method

Description
The len() method returns the number of elements in the tuple.

Syntax
Following is the syntax for len() method-

len(tuple)

109
Parameters tuple - This is a tuple for which number of elements
to be counted. Return Value

This method returns the number of elements in the tuple.

Example
The following example shows the usage of len() method.
#!/usr/bin/python3
tuple1, tuple2 = (123, 'xyz', 'zara'), (456, 'abc') print
("First tuple length : ", len(tuple1))
print ("Second tuple length : ", len(tuple2))
When we run above program, it produces following result-
First tuple length : 3
Second tuple length : 2

Tuplemax()Method

Description
The max() method returns the elements from the tuple with maximum value.

Syntax
Following is the syntax for max() method-

max(tuple)

Parameters tuple - This is a tuple from which max valued element


to be returned.

Return Value
This method returns the elements from the tuple with maximum value.

Example
The following example shows the usage of max() method.
#!/usr/bin/python3
110
tuple1, tuple2 = ('maths', 'che', 'phy', 'bio'), (456, 700,
200)
print ("Max value element : ", max(tuple1))
print ("Max value element : ", max(tuple2))
When we run the above program, it produces the following result-
Max value element : phy

Max value element : 700

Tuple min() Method

Description
The min() method returns the elements from the tuple with minimum value.

Syntax
Following is the syntax for min() method-

min(tuple)

Parameters tuple - This is a tuple from which min valued element is


to be returned.

Return Value
This method returns the elements from the tuple with minimum value.

Example
The following example shows the usage of min() method.
#!/usr/bin/python3
tuple1, tuple2 = ('maths', 'che', 'phy', 'bio'), (456, 700,
200)
print ("min value element : ", min(tuple1))
print ("min value element : ", min(tuple2))
When we run the above program, it produces the following result-
min value element : bio

min value element : 200

Tupletuple()Method

111
Description
The tuple() method converts a list of items into tuples.

Syntax
Following is the syntax for tuple() method-

tuple( seq )

Parameters
seq - This is a tuple to be converted into tuple.

Return Value
This method returns the tuple.

Example
The following example shows the usage of tuple() method.
#!/usr/bin/python3
list1= ['maths', 'che', 'phy', 'bio'] tuple1=tuple(list1)
print ("tuple elements : ", tuple1)
When we run the above program, it produces the following result-
tuple elements : ('maths', 'che', 'phy', 'bio')
Dictionary
Each key is separated from its value by a colon (:), the items are separated by
commas, and the whole thing is enclosed in curly braces. An empty dictionary
without any items is written with just two curly braces, like this: {}.
Keys are unique within a dictionary while values may not be. The values of a
dictionary can be of any type, but the keys must be of an immutable data type
such as strings, numbers, or tuples.

Accessing Values in a dictionary :


To access dictionary elements, you can use the familiar square brackets along with
the key to obtain its value. Following is a simple example.

112
#!/usr/bin/python3
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
print ("dict['Name']: ", dict['Name'])
print ("dict['Age']: ", dict['Age'])
When the above code is executed, it produces the following result-
dict['Name']: Zara
dict['Age']: 7
If we attempt to access a data item with a key, which is not a part of the dictionary, we get an
error as follows-
#!/usr/bin/python3
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
print "dict['Alice']: ", dict['Alice']
When the above code is executed, it produces the following result-
dict['Zara']:
Traceback (most recent call last):
File "test.py", line 4, in <module> print
"dict['Alice']: ", dict['Alice'];

KeyError: 'Alice'
Updating Dictionary :
You can update a dictionary by adding a new entry or a key-value pair, modifying an
existing entry, or deleting an existing entry as shown in a simple example given below.
#!/usr/bin/python3

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}


dict['Age'] = 8; # update existing entry dict['School'] =
"DPS School" # Add new entry print ("dict['Age']: ",
dict['Age'])
print ("dict['School']: ", dict['School'])
When the above code is executed, it produces the following result-
dict['Age']: 8
dict['School']: DPS School
Deleting Elements from Dictionary :
You can either remove individual dictionary elements or clear the entire contents of a
dictionary. You can also delete entire dictionary in a single operation.
To explicitly remove an entire dictionary, just use the del statement. Following is a simple
example-
113
#!/usr/bin/python3

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}

del dict['Name'] # remove entry with key 'Name'


dict.clear() # remove all entries in dict del
dict # delete entire dictionary

print ("dict['Age']: ", dict['Age']) print


("dict['School']: ", dict['School'])
This produces the following result.
Note: An exception is raised because after del dict, the dictionary does not exist anymore.
dict['Age']:
Traceback (most recent call last):
File "test.py", line 8, in <module>
print "dict['Age']: ", dict['Age'];

TypeError: 'type' object is unsubscriptable


Note: The del() method is discussed in subsequent section.

Properties of Dictionary keys :


Dictionary values have no restrictions. They can be any arbitrary Python object, either
standard objects or user-defined objects. However, same is not true for the keys. There
are two important points to remember about dictionary keys-

A. More than one entry per key is not allowed. This means no duplicate key is allowed.
When duplicate keys are encountered during assignment, the last assignment wins. For
example-
#!/usr/bin/python3
dict = {'Name': 'Zara', 'Age': 7, 'Name': 'Manni'}
print ("dict['Name']: ", dict['Name'])
When the above code is executed, it produces the following result-
dict['Name']: Manni

B. Keys must be immutable. This means you can use strings, numbers or tuples as
dictionary keys but something like ['key'] is not allowed. Following is a simple example-
#!/usr/bin/python3
dict = {['Name']: 'Zara', 'Age': 7}
print ("dict['Name']: ", dict['Name'])
When the above code is executed, it produces the following result-

114
Traceback (most recent call last): File
"test.py", line 3, in <module> dict
= {['Name']: 'Zara', 'Age': 7}
TypeError: list objects are unhashable
Operations in Dictionary :
The del statement removes a key-value pair from a dictionary. For example, the following
dictionary
contains the names of various fruits and the number of each fruit in stock:
>>> del inventory["pears"]
>>> print inventory
{’oranges’: 525, ’apples’: 430, ’bananas’: 312}
Or if we’re expecting more pears soon, we might just change the value associated with
pears:
>>> inventory["pears"] = 0
>>> print inventory
{’oranges’: 525, ’apples’: 430, ’pears’: 0, ’bananas’: 312}
The len function also works on dictionaries; it returns the number of key-value pairs:
>>> len(inventory)
4
Built-In Dictionary Functions & Methods :
Python includes the following dictionary functions-

SN Functions with Description

1 cmp(dict1, dict2)
No longer available in Python 3.

2 len(dict)
Gives the total length of the dictionary. This would be equal to the number of items
in the dictionary.

3 str(dict)
Produces a printable string representation of a dictionary.

4 type(variable)
Returns the type of the passed variable. If passed variable is dictionary, then it
would return a dictionary type.

115
Dictionarylen()Method

Description
The method len() gives the total length of the dictionary. This would be equal to the
number of items in the dictionary.

Syntax
Following is the syntax for len() method-

len(dict)

Parameters
dict - This is the dictionary, whose length needs to be calculated.

Return Value
This method returns the length.

Example
The following example shows the usage of len() method.
#!/usr/bin/python3
dict = {'Name': 'Manni', 'Age': 7, 'Class': 'First'}
print ("Length : %d" % len (dict))
When we run the above program, it produces the following result-

Length : 3
Dictionarystr()Method

Description
The method str() produces a printable string representation of a dictionary.

Syntax
Following is the syntax for str() method −

str(dict)

Parameters
dict - This is the dictionary.
116
Return Value
This method returns string representation.

Example
The following example shows the usage of str() method.
#!/usr/bin/python3 dict = {'Name': 'Manni', 'Age': 7, 'Class': 'First'}
print ("Equivalent String : %s" % str (dict)) When we run the
above program, it produces the following result-

Equivalent String : {'Name': 'Manni', 'Age': 7, 'Class': 'First'}

Dictionary type() Method

Description
The method type() returns the type of the passed variable. If passed variable is dictionary
then it would return a dictionary type.
Syntax
Following is the syntax for type() method-

type(dict)

Parameters
dict - This is the dictionary.

Return Value
This method returns the type of the passed variable.

Example
The following example shows the usage of type() method.
#!/usr/bin/python3 dict = {'Name': 'Manni', 'Age': 7, 'Class': 'First'}
print ("Variable Type : %s" % type (dict))
When we run the above program, it produces the following result-
Variable Type : <type 'dict'>

Python includes the following dictionary methods-

117
SN Methods with Description

1 dict.clear()
Removes all elements of dictionary dict.

2 dict.copy()
Returns a shallow copy of dictionary dict.

3 dict.fromkeys()
Create a new dictionary with keys from seq and values set to value.

4 dict.get(key, default=None)
For key key, returns value or default if key not in dictionary.

5 dict.has_key(key)
Removed, use the in operation instead.

6 dict.items()
Returns a list of dict's (key, value) tuple pairs.

7 dict.keys()
Returns list of dictionary dict's keys.

8 dict.setdefault(key, default=None)
Similar to get(), but will set dict[key]=default if key is not already in dict.

9 dict.update(dict2)
Adds dictionary dict2's key-values pairs to dict.

10 dict.values()
Returns list of dictionary dict's values.

Dictionaryclear()Method

118
Description
The method clear() removes all items from the dictionary.

Syntax
Following is the syntax for clear() method-
dict.clear()

Parameters
NA

Return Value
This method does not return any value.

Example
The following example shows the usage of clear() method.
#!/usr/bin/python3 dict = {'Name':
'Zara', 'Age': 7} print ("Start Len :
%d" % len(dict)) dict.clear()
print ("End Len : %d" % len(dict))

When we run the above program, it produces the following result-


Start Len : 2
End Len : 0

Dictionary copy() Method

Description
The method copy() returns a shallow copy of the dictionary.

Syntax
Following is the syntax for copy() method-

dict.copy()

Parameters
NA
119
Return Value
This method returns a shallow copy of the dictionary.

Example
The following example shows the usage of copy() method.
#!/usr/bin/python3 dict1 = {'Name': 'Manni', 'Age': 7, 'Class': 'First'}
dict2 = dict1.copy()
print ("New Dictionary : ",dict2)
When we run the above program, it produces following result-
New dictionary : {'Name': 'Manni', 'Age': 7, 'Class': 'First'}

Dictionary fromkeys() Method

Description
The method fromkeys() creates a new dictionary with keys from seq and values set to
value.

Syntax
Following is the syntax for fromkeys() method-

dict.fromkeys(seq[, value]))

Parameters
• seq - This is the list of values which would be used for dictionary keys preparation.

• value - This is optional, if provided then value would be set to this value

Return Value
This method returns the list.
Example
The following example shows the usage of fromkeys() method.
#!/usr/bin/python3 seq =
('name', 'age', 'sex') dict
= dict.fromkeys(seq)
print ("New Dictionary : %s" % str(dict))
dict = dict.fromkeys(seq, 10)
print ("New Dictionary : %s" % str(dict)

120
When we run the above program, it produces the following result-
New Dictionary : {'age': None, 'name': None, 'sex': None}
New Dictionary : {'age': 10, 'name': 10, 'sex': 10})

Dictionary get() Method

Description
The method get() returns a value for the given key. If the key is not available then returns
default value None.

Syntax
Following is the syntax for get() method-

dict.get(key, default=None)

Parameters
• key - This is the Key to be searched in the dictionary.

• default - This is the Value to be returned in case key does notexist.

Return Value
This method returns a value for the given key. If the key is not available, then returns
default value as None.

Example
The following example shows the usage of get() method.
#!/usr/bin/python3 dict = {'Name': 'Zara',
'Age': 27} print ("Value : %s" %
dict.get('Age'))
print ("Value : %s" % dict.get('Sex',
"NA"))
When we run the above program, it produces the following result-
Value : 27
Value : NA

Dictionary items() Method

121
Description
The method items() returns a list of dict's (key, value) tuple pairs.

Syntax
Following is the syntax for items() method-

dict.items()

Parameters
NA

Return Value
This method returns a list of tuple pairs.
Example
The following example shows the usage of items() method.
#!/usr/bin/python dict = {'Name': 'Zara', 'Age': 7}
print ("Value : %s" % dict.items())
When we run the above program, it produces the following result-
Value : [('Age', 7), ('Name', 'Zara')]

Dictionary keys() Method

Description
The method keys() returns a list of all the available keys in the dictionary.

Syntax
Following is the syntax for keys() method-

dict.keys()

Parameters
NA

Return Value
This method returns a list of all the available keys in the dictionary.

Example

122
The following example shows the usage of keys() method.
#!/usr/bin/python3 dict = {'Name': 'Zara', 'Age': 7}
print ("Value : %s" % dict.keys())
When we run the above program, it produces the following result-
Value : ['Age', 'Name']

Dictionary setdefault() Method

Description
The method setdefault() is similar to get(), but will set dict[key]=default if the key is not
already in dict.

Syntax
Following is the syntax for setdefault() method-

dict.setdefault(key, default=None)

Parameters
• key - This is the key to be searched.

• default - This is the Value to be returned in case key is not found.

Return Value
This method returns the key value available in the dictionary and if given key is not
available then it will return provided default value.

Example
The following example shows the usage of setdefault() method.
#!/usr/bin/python3 dict = {'Name': 'Zara', 'Age': 7} print ("Value : %s"
% dict.setdefault('Age', None)) print ("Value : %s" %
dict.setdefault('Sex', None))
print (dict)
When we run the above program, it produces the following result-
Value : 7
Value : None
{'Name': 'Zara', 'Sex': None, 'Age': 7} Dictionary update() Method

123
Description
The method update() adds dictionary dict2's key-values pairs in to dict. This function does
not return anything.

Syntax
Following is the syntax for update() method-

dict.update(dict2)
Parameters
dict2 - This is the dictionary to be added into dict.

Return Value
This method does not return any value.

Example
The following example shows the usage of update() method.
#!/usr/bin/python3 dict = {'Name': 'Zara', 'Age': 7} dict2 =
{'Sex': 'female' } dict.update(dict2)
print ("updated dict : ", dict)
When we run the above program, it produces the following result-

updated dict : {'Sex': 'female', 'Age': 7, 'Name': 'Zara'}

Dictionaryvalues()Method

Description
The method values() returns a list of all the values available in a given dictionary.

Syntax
Following is the syntax for values() method-

dict.values()

Parameters
NA

Return Value
This method returns a list of all the values available in a given dictionary.
124
Example
The following example shows the usage of values() method.
#!/usr/bin/python3 dict = {'Sex': 'female', 'Age': 7, 'Name': 'Zara'}
print ("Values : ", list(dict.values()))
When we run above program, it produces following result-
Values : ['female', 7, 'Zara']

Files
Python provides basic functions and methods necessary to manipulate files by default. You
can do most of the file manipulation using a file object.

The open Function

Before you can read or write a file, you have to open it using Python's built-in open()
function. This function creates a file object, which would be utilized to call other support
methods associated with it.

Syntax

file object = open(file_name [, access_mode][, buffering])


Here are parameter details-
• file_name: The file_name argument is a string value that contains the name of the
file that you want to access.

• access_mode: The access_mode determines the mode in which the file has to be
opened, i.e., read, write, append, etc. A complete list of possible values is given
below in the table. This is an optional parameter and the default file access mode is
read (r).
• buffering: If the buffering value is set to 0, no buffering takes place. If the buffering
value is 1, line buffering is performed while accessing a file. If you specify the
buffering value as an integer greater than 1, then buffering action is performed with
the indicated buffer size. If negative, the buffer size is the system default (default
behavior).
Here is a list of the different modes of opening a file-

125
Modes Description

r Opens a file for reading only. The file pointer is placed at the beginning of the
file. This is the default mode.

rb Opens a file for reading only in binary format. The file pointer is placed at the
beginning of the file. This is the default mode.

r+ Opens a file for both reading and writing. The file pointer placed at the
beginning of the file.

rb+ Opens a file for both reading and writing in binary format. The file pointer
placed at the beginning of the file.

w Opens a file for writing only. Overwrites the file if the file exists. If the file does
not exist, creates a new file for writing.

wb Opens a file for writing only in binary format. Overwrites the file if the file
exists. If the file does not exist, creates a new file for writing.

w+ Opens a file for both writing and reading. Overwrites the existing file if the file
exists. If the file does not exist, creates a new file for reading and writing.

wb+ Opens a file for both writing and reading in binary format. Overwrites the
existing file if the file exists. If the file does not exist, creates a new file for
reading and writing.

a Opens a file for appending. The file pointer is at the end of the file if the file
exists. That is, the file is in the append mode. If the file does not exist, it creates
a new file for writing.

ab Opens a file for appending in binary format. The file pointer is at the end of the
file if the file exists. That is, the file is in the append mode. If the file does not
exist, it creates a new file for writing.

a+ Opens a file for both appending and reading. The file pointer is at the end of the
file if the file exists. The file opens in the append mode. If the file does not exist,
it creates a new file for reading and writing.

ab+ Opens a file for both appending and reading in binary format. The filepointer is
at the end of the file if the file exists. The file opens in the append mode. If the
file does not exist, it creates a new file for reading and writing.

126
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 the attributes related to a 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.

Note: softspace attribute is not supported in Python 3.x

Example
#!/usr/bin/python3

# 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)
fo.close()
This produces the following result- Name of the file: foo.txt
Closed or not :False
Opening mode : wb

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();

127
Example

#!/usr/bin/python3

# Open a file
fo = open("foo.txt", "wb")
print ("Name of the file: ", fo.name)
# Close opened file
fo.close()
This produces the following result-

Name of the file: foo.txt

Readingand WritingFiles
The file object provides a set of access methods to make our lives easier. We would see
how to use read() and write() methods to read and write files.

The write() Method

The write() method writes any string to an open file. It is important to note that Python
strings can have binary data and not just text.
The write() method does not add a newline character ('\n') to the end of the string-

Syntax

fileObject.write(string);
Here, passed parameter is the content to be written into the opened file.

Example

128
#!/usr/bin/python3

# Open a file
fo = open("foo.txt", "w")
fo.write( "Python is a great language.\nYeah its great!!\n")

# Close opend
file fo.close()

The above method would create foo.txt file and would write given content in that file and
finally it would close that file. If you would open this file, it would have the following
content-

Python is a great language. Yeah


its great!!

The read() Method

The read() method reads a string from an open file. It is important to note that Python
strings can have binary data apart from the text data.

Syntax

fileObject.read([count]);
Here, passed parameter is the number of bytes to be read from the opened file. This method
starts reading from the beginning of the file and if count is missing, then it tries to read as
much as possible, maybe until the end of file.

Example
Let us take a file foo.txt, which we created above.
#!/usr/bin/python3

# Open a file fo = open("foo.txt", "r+") str = fo.read(10)


print ("Read String is : ", str)
# Close opened file
fo.close()
129
This produces the following result-

Read String is : Python is

File Positions

The tell() method tells you the current position within the file; in other words, the next read
or write will occur at that many bytes from the beginning of the file.
The seek(offset[, from]) method changes the current file position. The offset argument
indicates the number of bytes to be moved. The from argument specifies the reference
position from where the bytes are to be moved.
If from is set to 0, the beginning of the file is used as the reference position. If it is set to 1,
the current position is used as the reference position. If it is set to 2 then the end of the file
would be taken as the reference position.

Example
Let us take a file foo.txt, which we created above.

#!/usr/bin/python3

# Open a file fo = open("foo.txt", "r+") str = fo.read(10)


print ("Read String is : ", str)

# Check current position


position = fo.tell()
print ("Current file position : ", position)

# Reposition pointer at the beginning once again


position = fo.seek(0, 0) str = fo.read(10) print
("Again read String is : ", str)
# Close opened file
fo.close()

This produces the following result-


Read String is : Python is
130
Current file position : 10 Again read String is : Python is

Renaming and Deleting Files

Python os module provides methods that help you perform file-processing operations,
such as renaming and deleting files.
To use this module, you need to import it first and then you can call any related functions.

Therename()Method

The rename() method takes two arguments, the current filename and the new filename.

Syntax

os.rename(current_file_name, new_file_name)

Example
Following is an example to rename an existing file test1.txt-
#!/usr/bin/python3
import os

# Rename a file from test1.txt to test2.txt os.rename(


"test1.txt", "test2.txt" )

The remove() Method

You can use the remove() method to delete files by supplying the name of the file to be
deleted as the argument.

Syntax

os.remove(file_name)

Example
Following is an example to delete an existing file test2.txt-
#!/usr/bin/python3 import os

131
# Delete file test2.txt
os.remove("text2.txt")
Directories :
All files are contained within various directories, and Python has no problem handling these
too. The os module has several methods that help you create, remove, and change
directories.

The mkdir() Method

You can use the mkdir() method of the os module to create directories in the current
directory. You need to supply an argument to this method, which contains the name of the
directory to be created.

Syntax

os.mkdir("newdir")

Example
Following is an example to create a directory test in the current directory-
#!/usr/bin/python3
import os

# Create a directory "test"


os.mkdir("test")

The chdir() Method

You can use the chdir() method to change the current directory. The chdir() method takes
an argument, which is the name of the directory that you want to make the current
directory.

Syntax

os.chdir("newdir")

Example
Following is an example to go into "/home/newdir" directory-

132
#!/usr/bin/python3
import os

# Changing a directory to "/home/newdir"


os.chdir("/home/newdir")

The getcwd() Method

The getcwd() method displays the current working directory.

Syntax

os.getcwd()

Example
Following is an example to give current directory-
#!/usr/bin/python3
import os

# This would give location of the current directory os.getcwd()

The rmdir() Method

The rmdir() method deletes the directory, which is passed as an argument in the method.
Before removing a directory, all the contents in it should beremoved.

Syntax
os.rmdir('dirname')

Example
Following is an example to remove the "/tmp/test" directory. It is required to give fully
qualified name of the directory, otherwise it would search for that directory in thecurrent
directory.

133
#!/usr/bin/python3
import os
# This would remove "/tmp/test" directory.
os.rmdir( "/tmp/test" )
Exceptions
An exception is an event, which occurs during the execution of a program that disrupts the
normal flow of the program's instructions. In general, when a Python script encounters a
situation that it cannot cope with, it raises an exception. An exception is a Python object
that represents an error.
When a Python script raises an exception, it must either handle the exception immediately
otherwise it terminates and quits.

Built-in Exceptions :
Here is a list of Standard Exceptions available in Python.
EXCEPTION DESCRIPTION
NAME

Exception Base class for all exceptions

StopIteration Raised when the next() method of an iterator does not point to any
object.

SystemExit Raised by the sys.exit() function.

StandardError Base class for all built-in exceptions except StopIteration and
SystemExit.

ArithmeticError Base class for all errors that occur for numeric calculation.

OverflowError Raised when a calculation exceeds maximum limit for a numeric


type.

FloatingPointError Raised when a floating point calculation fails.

ZeroDivisonError Raised when division or modulo by zero takes place for all numeric
types.

134
AssertionError Raised in case of failure of the Assert statement.

AttributeError Raised in case of failure of attribute reference or assignment.

EOFError Raised when there is no input from either the raw_input() or input()
function and the end of file is reached.

ImportError Raised when an import statement fails.

KeyboardInterrupt Raised when the user interrupts program execution, usually by


pressing Ctrl+c.

LookupError Base class for all lookup errors.

IndexError Raised when an index is not found in a sequence.

KeyError Raised when the specified key is not found in the dictionary.

NameError Raised when an identifier is not found in the local or global


namespace.

UnboundLocalError Raised when trying to access a local variable in a function or method


but no value has been assigned to it.

EnvironmentError Base class for all exceptions that occur outside the Python
environment.

IOError Raised when an input/ output operation fails, such as the print
statement or the open() function when trying to open a file that does
not exist.

OSError Raised for operating system-related errors.

SyntaxError Raised when there is an error in Python syntax.

IndentationError Raised when indentation is not specified properly.

SystemError Raised when the interpreter finds an internal problem, but when this
error is encountered the Python interpreter does not exit.

135
SystemExit Raised when Python interpreter is quit by using the sys.exit()
function. If not handled in the code, causes the interpreter to exit.

TypeError Raised when an operation or function is attempted that is invalid


for the specified data type.

ValueError Raised when the built-in function for a data type has the valid type
of arguments, but the arguments have invalid values specified.

RuntimeError Raised when a generated error does not fall into any category.

NotImplementedError Raised when an abstract method that needs to be implemented in an


inherited class is not actually implemented.
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-
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.
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

136
This example opens a file, writes content in the file and comes out gracefully because
there is no problem at all.
#!/usr/bin/python3
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 produces the following result-

Written content in the file successfully

Example
This example tries to open a file where you do not have the write permission, so it raises an
exception-
#!/usr/bin/python3 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 produces the following result-

Error: can't find file or read data

Exception with Arguments :


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-

137
try:
You do your operations here
...................... except
ExceptionType as Argument:
You can print value of Argument here...
If you write 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 receives 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/python3

# Define a function here.


def temp_convert(var):
try:
returnint(var) except ValueError as Argument: print("The
argument does not contain numbers\n",Argument)

# Call above function here.


temp_convert("xyz")

This produces the following result-


The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'
User-defined Exceptions :
Python also allows you to create your own exceptions by deriving classes from the standard
built-in exceptions.
Here is an example related to RuntimeError. Here, a class is created that is subclassed from
RuntimeError. This is useful when you need to display more specific information when an
exception is caught.
In the try block, the user-defined exception is raised and caught in the except block. The
variable e is used to create an instance of the class Networkerror.
class Networkerror(RuntimeError): def init (self, arg):
self.args = arg
So once you have defined the above class, you can raise the exception as follows-

138
try: raise Networkerror("Bad hostname")
except Networkerror,e:
print e.args

139
UNIT 4

4.1 Regular Expressions :

(1)Concept of regular expression :


A regular expression is a special sequence of characters that helps you match or find
other strings or sets of strings, using a specialized syntax held in a pattern. Regular
expressions are widely used in UNIX world.
The module re provides full support for Perl-like regular expressions in Python. The re
module raises the exception re.error if an error occurs while compiling or using a regular
expression.
We would cover two important functions, which would be used to handle regular expressions.
Nevertheless, a small thing first: There are various characters, which would have special
meaning when they are used in regular expression. To avoid any confusion while dealing with
regular expressions, we would use Raw Strings as r'expression'.

(2)Various types of regular expressions: Basic patterns that match single chars
• a, X, 9, < -- ordinary characters just match themselves exactly.
• . (a period) -- matches any single character except newline '\n' • \w --
matches a "word" character: a letter or digit or underbar [a-zA-Z0- 9_].
• \W -- matches any non-word character.
• \b -- boundary between word and non-word
• \s -- matches a single whitespace character -- space, newline, return, tab
• \S -- matches any non-whitespace character.
• \t, \n, \r -- tab, newline, return
• \d -- decimal digit [0-9]
• ^ = matches start of the string
• $ = match the end of the string
• \ -- inhibit the "specialness" of a character.

Flag Meaning

ASCII, A Makes several escapes like \w, \b, \s and \d


match only on ASCII characters with the
respective property.
DOTALL, S Make, match any character, including
newlines
IGNORECASE, I Do case-insensitive matches
LOCALE, L Do a locale-aware match
MULTILINE, M Multi-line matching, affecting ^ and $

VERBOSE, X (for Enable verbose REs, which can be organized


‘extended’) more cleanly and understandably

140
(3)Using match function.:

This function attempts to match RE pattern to string with optional flags. Here is the syntax
for this function-

re.match(pattern, string, flags=0)

Here is the description of the parameters-

Parameter Description

pattern This is the regular expression to be matched.

string This is the string, which would be searched to match the


pattern at the beginning of string.

flags You can specify different flags using bitwise OR (|). These are
modifiers, which are listed in the table below.

The re.match function returns a match object on success, None on failure. We use
group(num) or groups() function of match object to get matched expression.

Match Object Description


Methods

group(num=0) This method returns entire match (or specific subgroup


num)

141
groups() This method returns all matching subgroups in a tuple
(empty if there weren't any)

142
Example

import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I) if matchObj: print
("matchObj.group() : ", matchObj.group()) print ("matchObj.group(1) : ",
matchObj.group(1)) print ("matchObj.group(2) : ", matchObj.group(2))
else: print ("No match!!")

When the above code is executed, it produces the following result-

matchObj.group() : Cats are smarter than dogs


matchObj.group(1) : Cats matchObj.group(2) :
smarter

4.2 Classes and Objects:

Python is an object-oriented programming language, which means that it provides features


that support object-oriented programming (OOP). Object-oriented programming has its
roots in the 1960s, but it wasn’t until the mid 1990s that it became the main programming
paradigm used in the creation of new software. It was developed as a way to handle the
rapidly increasing size and complexity of software systems, and to make it easier to modify
these large and complex systems over time. Up to this point we have been writing programs
using a procedural programming paradigm. In procedural programming the focus is on
writing functions or procedures which operate on data. In object-oriented programming the
focus is on the creation of objects which contain both data and functionality together.
(1) Overview of OOP (Object Oriented Programming):

a. Class: A user-defined prototype for an object that defines a set of


attributes that characterize any object of the class. The attributes are data
members (class variables and instance variables) and methods, accessed
via dotnotation.

b. Class variable: A variable that is shared by all instances of a class. Class


variables are defined within a class but outside any of the class's methods.
Class variables are not used as frequently as instance variables are.
129

c. Data member: A class variable or instance variable that holds data


associated with a class and its objects.

d. Function overloading: The assignment of more than one behavior to a


particular function. The operation performed varies by the types of
objects or arguments involved.

e. Instance variable: A variable that is defined inside a method and belongs


only to the current instance of a class.

f. Inheritance: The transfer of the characteristics of a class to other classes


that are derived from it.

g. Instance: An individual object of a certain class. An object obj that belongs


to a class Circle, for example, is an instance of the class Circle.

h. Instantiation: The creation of an instance of aclass.

i. Method : A special kind of function that is defined in a classdefinition.

j. Object: A unique instance of a data structure that is defined by its class.


An object comprises both data members (class variables and instance
variables) and methods.

k. Operator overloading: The assignment of more than one function to a


particular operator.

(2) Class Definition:


The class statement creates a new class definition. The name of the class immediately
follows the keyword class followed by a colon as follows-

144
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)

• The variable empCount is a class variable whose value is shared among all the
instances of a in this class. This can be accessed as Employee.empCount from inside
the class or outside the class.

• The first method init () is a special method, which is called class constructor or
initialization method that Python calls when you create a new instance of this class.

• You declare other class methods like normal functions with the exception that the
first argument to each method is self. Python adds the self argument to the list for
you; you do not need to include it when you call the methods.

(3) Creating Objects:


To create instances of a class, you call the class using class name and pass in whatever
arguments its init method accepts.

This would create first object of Employee class emp1 =


Employee("Zara", 2000)

This would create second object of Employee class emp2 =


Employee("Manni", 5000)

Accessing Attributes
You access the object's attributes using the dot operator with object. Class variable
would be accessed using class name as follows-

145
emp1.displayEmployee()
emp2.displayEmployee()
print ("Total Employee %d" % Employee.empCount)

(4) Instances as Arguments:


Instance variables are always prefixed with the reserved word self. They are typically
introduced and initialized in a constructor method named init .

In the following example, the variables self.name and self.grades are instance variables,
whereas the variable NUM_GRADES is a class variable:

class Student:

NUM_GRADES = 5 def init (self, name):


self.name = name self.grades = [] for i in
range(Student.NUM_GRADES):
self.grades.append(0)

Here “self” is a instance and “name” is a argument


The PVM automatically calls the constructor method when the programmer requests a
new instance of the class, as follows:

s = Student('Mary')

The constructor method always expects at least one argument, self. When the method is
called, the object being instantiated is passed here and thus is bound to self throughout
the code. Other arguments may be given to supply initial values for the object’s data.

(5) Instances as return values:

146
class Numbers:
MULTIPLIER=None def
init (self,x,y):
self.x=x self.y=y
def add(self):
return (self.x+self.y)
print("Enter two numbers for
addition") x=int(input()) y=int(input())
n=Numbers(x,y)
print("addition is : ",n.add())

Here return (self.x+self.y) are the instances as return values


Where self is a instance and .x and .y are variable associated with the instance

(6) Built-in Class Attributes:


Every Python class keeps the following built-in attributes and they can be accessed
using dot operator like any other attribute −
• dict : Dictionary containing the class's namespace.
• doc : Class documentation string or none, if undefined.
• name : Class name.
• module : Module name in which the class is defined. This attribute is "
main " in interactive mode.
• bases : A possibly empty tuple containing the base classes, in the order of
their occurrence in the base class list.
For the above class let us try to access all these attributes-

147
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)

emp1 = Employee("Zara", 2000)


emp2 = Employee("Manni", 5000)
print ("Employee. doc :", Employee. doc ) print
("Employee. name :", Employee. name ) print
("Employee. module :", Employee. module ) print
("Employee. bases :", Employee. bases ) print
("Employee. dict :", Employee. dict )

When the above code is executed, it produces the following result- Employee. doc : Common
base class for all employees
Employee. name : Employee
Employee. module : main
Employee. bases : (<class 'object'>,)
Employee. dict : {' module ': ' main ', ' doc ': 'Common base class for all employees',
'empCount': 2, ' init ': <function Employee. init at 0x00F14270>, 'displayCount': <function
Employee.displayCount at 0x0304C0C0>,
'displayEmployee': <function Employee.displayEmployee at 0x032DFE88>,
' dict ': <attribute ' dict ' of 'Employee' objects>, ' weakref ': <attribute
' weakref ' of 'Employee' objects>}

(7) Inheritance:
Instead of starting from a scratch, you can create a class by deriving it from a pre-
existing class by listing the parent class in parentheses after the new class name. The
child class inherits the attributes of its parent class, and you can use those attributes as
if they were defined in the child class. A child class can also override data members and
methods from the parent.
148
Syntax
Derived classes are declared much like their parent class; however, a list of base classes
to inherit from is given after the class name –
class SubClassName (ParentClass1[, ParentClass2, ...]):
'Optional class documentation string' class_suite

Example
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
When the above code is executed, it produces the following result- Calling child
constructor
Calling child method
Calling parent method
Parent attribute : 200

149
In a similar way, you can drive a class from multiple parent classes as follows-

class A: # define your class A


.....
class B: # define your class B
.....
class C(A, B): # subclass of A and B .....

You can use issubclass() or isinstance() functions to check a relationship of two classes
and instances.
• The issubclass(sub, sup) boolean function returns True, if the given
subclass sub is indeed a subclass of the superclass sup.

• The isinstance(obj, Class) boolean function returns True, if obj is an instance of


class Class or is an instance of a subclass of Class.

(8)Method Overriding:
You can always override your parent class methods. One reason for overriding parent's
methods is that you may want special or different functionality in your subclass.
Example
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

When the above code is executed, it produces the following result-

Calling child method

150
151
(9)Data Encapsulation:
Simplifying the script by identifying the repeated code and placing it in a function. This
is called ’encapsulation’.
Encapsulation is the process of wrapping a piece of code in a function, allowing you to
take advantage of all the things functions are good for.

Generalization means taking something specific, such as printing the multiples of 2, and
making it more general, such as printing the multiples of any integer. This function
encapsulates the previous loop and generalizes it to print multiples of n:

def print_multiples(n): i = 1 while i <= 6: print n*i, "\t", i


+= 1
print

To encapsulate, all we had to do was add the first line, which declares the name of the
function and the parameter list. To generalize, all we had to do was replace the value 2 with
the parameter n. If we call this function with the argument 2, we get the same output as
before. With the argument 3, the output is:

3 6 9 12 15 18

4 8 12 16 20 24

With the argument 4, the output is:


By now you can probably guess how to print a multiplication table—by calling print multiples
repeatedly with different arguments. In fact, we can use another loop:

By now you can probably guess how to print a multiplication table—by calling print multiples
repeatedly with different arguments. In fact, we can use another loop:
i = 1
while i <= 6:

152
More encapsulation
To demonstrate encapsulation again, let’s take the code from the last section and wrap it up in
a function:
def print_mult_table():
i = 1
while i <= 6:

This process is a common development plan. We develop code by writing lines of code
outside any function, or typing them in to the interpreter. When we get the code working, we
extract it and wrap it up in a function. This development plan is particularly useful if you
don’t know how to divide the program into functions when you start writing. This approach
lets you design as you go along.

(10) Data Hiding:


An object's attributes may or may not be visible outside the class definition. You need to
name attributes with a double underscore prefix, and those attributes then will not be directly
visible to outsiders.
Example
class JustCounter:
secretCount = 0 def
count(self):
self. secretCount += 1
print (self. secretCount)
counter = JustCounter()
counter.count() counter.count()
print (counter. secretCount)

153
When the above code is executed, it produces the following result-
1
2
Traceback (most recent call last):
File "C:/Users/USER/AppData/Local/Programs/Python/Python36-32/try2.py", line 9, in
<module>
print (counter. secretCount)
AttributeError: 'JustCounter' object has no attribute ' secretCount'

Python protects those members by internally changing the name to include the class name.
You can access such attributes as object._className attrName. If you would replace your last
line as following, then it works for you-
.........................
print (counter._JustCounter secretCount)

1
2
2

4.3 Multithreaded Programming:

(1) Thread Module:


The newer threading module included with Python 2.4 provides much more powerful,
high-level support for threads than the thread module discussed in the previous section. The
threading module exposes all the methods of the thread module and provides some
additional methods:
• threading.activeCount(): Returns the number of thread objects that are active.

• threading.currentThread(): Returns the number of thread objects in the caller's


thread control.

• threading.enumerate(): Returns a list of all the thread objects that are currently
active.
In addition to the methods, the threading module has the Thread class that implements
threading. The methods provided by the Thread class are as follows:
• run(): The run() method is the entry point for a thread.
• start(): The start() method starts a thread by calling the run method.
• join([time]): The join() waits for threads to terminate.
• isAlive(): The isAlive() method checks whether a thread is still executing.
• getName(): The getName() method returns the name of a thread.
154
• setName(): The setName() method sets the name of a thread.

(2) Creating a thread:


To implement a new thread using the threading module, you have to do the following− •
Define a new subclass of the Thread class.
• Override the init (self [,args]) method to add additional arguments.
• Then, override the run(self [,args]) method to implement what the thread should do
when started.
Once you have created the new Thread subclass, you can create an instance of it and then start
a new thread by invoking the start(), which in turn calls the run()method.

Example:
import threading import time
exitFlag = 0 class myThread
(threading.Thread):
def init (self, threadID, name, counter):
threading.Thread. init (self)
self.threadID = threadID self.name =
name self.counter = counter
def run(self): print ("Starting " +
self.name) print_time(self.name,
self.counter, 5) print ("Exiting " +
self.name)
def print_time(threadName, delay, counter):
while counter:
if exitFlag:
threadName.exit()
time.sleep(delay)
print ("%s: %s" % (threadName,
time.ctime(time.time()))) counter -= 1 # Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# Start new Threads
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print ("Exiting Main Thread")

155
When we run the above program, it produces the following result-
Starting Thread-1Starting Thread-2

Thread-1: Sun Jun 18 13:42:07 2017


Thread-2: Sun Jun 18 13:42:08 2017
Thread-1: Sun Jun 18 13:42:08 2017
Thread-1: Sun Jun 18 13:42:09 2017
Thread-2: Sun Jun 18 13:42:10 2017
Thread-1: Sun Jun 18 13:42:10 2017
Thread-1: Sun Jun 18 13:42:11 2017
Exiting Thread-1
Thread-2: Sun Jun 18 13:42:12 2017
Thread-2: Sun Jun 18 13:42:14 2017
Thread-2: Sun Jun 18 13:42:17 2017
Exiting Thread-2
Exiting Main Thread

(3) Synchronizing threads:

The threading module provided with Python includes a simple-to-implement locking


mechanism that allows you to synchronize threads. A new lock is created by calling the
Lock() method, which returns the new lock.
The acquire(blocking) method of the new lock object is used to force the threads to run
synchronously. The optional blocking parameter enables you to control whether the thread
waits to acquire the lock.
If blocking is set to 0, the thread returns immediately with a 0 value if the lock cannot be
acquired and with a 1 if the lock was acquired. If blocking is set to 1, the thread blocks and
wait for the lock to be released.
The release() method of the new lock object is used to release the lock when it is no longer
required.
Example:

156
import threading import time class
myThread (threading.Thread):
def init (self, threadID, name, counter):
threading.Thread. init (self)
self.threadID = threadID self.name =
name self.counter = counter
def run(self): print ("Starting " +
self.name) # Get lock to
synchronize threads
threadLock.acquire()
print_time(self.name, self.counter, 3) #
Free lock to release next thread
threadLock.release()
def print_time(threadName, delay, counter):
while counter:
time.sleep(delay)
print ("%s: %s" % (threadName, time.ctime(time.time())))
counter -= 1
threadLock = threading.Lock() threads
= []
# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# Start new Threads
thread1.start()
thread2.start()
# Add threads to thread list
threads.append(thread1)
threads.append(thread2)
# Wait for all threads to complete for
t in threads:
t.join() print ("Exiting
Main Thread")

When the above code is executed, it produces the following result-

Starting Thread-1Starting Thread-2

Thread-1: Sun Jun 18 13:50:07 2017


Thread-1: Sun Jun 18 13:50:08 2017
Thread-1: Sun Jun 18 13:50:09 2017
Thread-2: Sun Jun 18 13:50:11 2017

157
Thread-2: Sun Jun 18 13:50:13 2017
Thread-2: Sun Jun 18 13:50:15 2017
Exiting Main Thread

(4)multithreaded priority queue:


The Queue module allows you to create a new queue object that can hold a specific
number of items. There are following methods to control the Queue − •
get(): The get() removes and returns an item from the queue.
• put(): The put adds item to a queue.
• qsize() : The qsize() returns the number of items that are currently in the queue.
• empty(): The empty( ) returns True if queue is empty; otherwise, False.
• full(): the full() returns True if queue is full; otherwise, False.

Example
import queue import threading import time exitFlag = 0 class myThread
(threading.Thread): def init (self, threadID, name, q): threading.Thread. init (self)
self.threadID = threadID self.name = name
self.q = q
def run(self):
print ("Starting " + self.name) process_data(self.name, self.q) print ("Exiting " +
self.name)
def process_data(threadName, q):
while not exitFlag:
queueLock.acquire() if not workQueue.empty():
data = q.get() queueLock.release()

158
print ("%s processing %s" % (threadName, data))
else:
queueLock.release() time.sleep(1) threadList
= ["Thread-1", "Thread-2", "Thread-3"] nameList =
["One", "Two", "Three", "Four", "Five"] queueLock
= threading.Lock()
workQueue =
queue.Queue(10) threads = []
threadID = 1
# Create new threads
for tName in threadList:
thread = myThread(threadID, tName,
workQueue) thread.start() threads.append(thread)
threadID += 1 # Fill the queue queueLock.acquire()
for word in nameList:
workQueue.put(word)
queueLock.release() # Wait
for queue to empty while not
workQueue.empty(): pass
# Notify threads it's time to exit exitFlag
=1
# Wait for all threads to complete for
t in threads:
t.join() print ("Exiting
Main Thread")

When the above code is executed, it produces the following result-


Starting Thread-1Starting Thread-2Starting Thread-3

Thread-3 processing OneThread-1 processing Two

Thread-2 processing Three


Thread-1 processing FourThread-3 processing FiveExiting Thread-2

Exiting Thread-1Exiting Thread-3

Exiting Main Thread

159
4.4Modules:

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. Example
The Python code for a module named aname normally resides in a file namedaname.py.
Here is an example of a simple module, support.py

def print_func( par ):


print "Hello : ", par
return

(1) Importing module:

The import Statement


You can use any Python source file as a module by executing an import statement in some
other Python source file. The import has the following syntax-

Import module1[, module2[,... moduleN]

When the interpreter encounters an import statement, it imports the module if the module
is present in the search path. A search path is a list of directories that the interpreter
searches before importing a module. For example, to import the module hello.py, you need
to put the following command at the top of the script-

# Import module support


import support
# Now you can call defined function that module as follows
support.print_func("Zara")

When the above code is executed, it produces the following result-

Hello : Zara

A module is loaded only once, regardless of the number of times it is imported. This
prevents the module execution from happening repeatedly, if multiple imports occur.

160
The from...import Statement
Python's from statement lets you import specific attributes from a module into the current
namespace. The from...import has the following syntax-

161
From modname import name1[, name2[, ... nameN]]

For example, to import the function fibonacci from the module fib, use the following
statement-

# Fibonacci numbers module


def fib(n): # return Fibonacci series up to
n result = [] a, b = 0, 1 while b < n:
result.append(b) a, b = b, a+b
return result
>>> from fib import fib
>>> fib(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

This statement does not import the entire module fib into the current namespace; it just
introduces the item fibonacci from the module fib into the global symbol table of the
importing module.

The from...import * Statement:


It is also possible to import all the names from a module into the current namespace by using
the following import statement-

from modname import *

This provides an easy way to import all the items from a module into the current
namespace; however, this statement should be used sparingly.

(2) Creating and exploring modules:


Creating modules
Creating/Writing Python modules is very simple. To create a module of your own, simply
create a new .py file with the module name, and then import it using the Python file name (without
the .py extension) using the import command.

Exploring built-in modules


Two very important functions come in handy when exploring modules in Python - the
dir and help functions.
We can look for which functions are implemented in each module by using the dir function:
Example:

162
>>> import urllib
>>> dir(urllib)
[' builtins ', ' cached ', ' doc ', ' file ', ' loader ', ' name ', ' package ',
' path ', ' spec ', 'parse']

(3) Math module :


This module is always available. It provides access to the mathematical functions defined by
the C standard.
These functions cannot be used with complex numbers; use the functions of the same name
from the cmath module if you require support for complex numbers. The distinction between
functions which support complex numbers and those which don’t is made since most users do
not want to learn quite as much mathematics as required to understand complex numbers.
Receiving an exception instead of a complex result allows earlier detection of the unexpected
complex number used as a parameter, so that the programmer can determine how and why it
was generated in the first place.
The following functions are provided by this module. Except when explicitly noted otherwise,
all return values are floats.

(a) Number-theoretic and representation functions

math.ceil(x)
Return the ceiling of x as a float, the smallest integer value greater than or equal to x.

math.copysign(x, y)
Return x with the sign of y. On a platform that supports signed zeros, copysign(1.0, -
0.0) returns -1.0.
New in version 2.6.

math.fabs(x)
Return the absolute value of x.

math.factorial(x)
Return x factorial. Raises ValueError if x is not integral or is negative. New
in version 2.6.

math.floor(x)
Return the floor of x as a float, the largest integer value less than or equal to x.

math.fmod(x, y)
Return fmod(x, y), as defined by the platform C library. Note that the Python expression x
% y may not return the same result. The intent of the C standard is that fmod(x, y) be

163
exactly (mathematically; to infinite precision) equal to x - n*y for some integer n such
that the result has the same sign as x and magnitude less than abs(y).
Python’s x % y returns a result with the sign of y instead, and may not be exactly computable
for float arguments. For example, fmod(-1e-100, 1e100) is -1e-100, but the result of Python’s
- 1e-100 % 1e100 is 1e100-1e-100, which cannot be represented exactly as a float, and rounds
to the surprising 1e100. For this reason, function fmod() is generally preferred when working
with floats, while Python’s x % y is preferred when working with integers.
math.frexp(x)
Return the mantissa and exponent of x as the pair (m, e). m is a float and e is an integer such
that x == m * 2**e exactly. If x is zero, returns (0.0, 0), otherwise 0.5 <= abs(m) < 1. This is
used to “pick apart” the internal representation of a float in a portable way.

math.fsum(iterable)
Return an accurate floating point sum of values in the iterable. Avoids loss of precision by
tracking multiple intermediate partial sums:
>>>
>>> sum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1])
0.9999999999999999
>>> fsum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1])
1.0
The algorithm’s accuracy depends on IEEE-754 arithmetic guarantees and the typical case
where the rounding mode is half-even. On some non-Windows builds, the underlying C
library uses extended precision addition and may occasionally double-round an intermediate
sum causing it to be off in its least significant bit.
For further discussion and two alternative approaches, see the ASPN cookbook recipes for
accurate floating point summation.
New in version 2.6.

math.isinf(x)
Check if the float x is positive or negative infinity. New
in version 2.6.

math.isnan(x)
Check if the float x is a NaN (not a number). For more information on NaNs, see the IEEE
754 standards. New in version 2.6.

math.ldexp(x, i)
Return x * (2**i). This is essentially the inverse of function frexp().

math.modf(x)
Return the fractional and integer parts of x. Both results carry the sign of x and are floats.

math.trunc(x)

164
Return the Real value x truncated to an Integral (usually a long integer). Uses the
trunc method.
New in version 2.6.
Note that frexp() and modf() have a different call/return pattern than their C equivalents: they
take a single argument and return a pair of values, rather than returning their second return
value through an ‘output parameter’ (there is no such thing in Python).
For the ceil(), floor(), and modf() functions, note that all floating-point numbers of
sufficiently large magnitude are exact integers. Python floats typically carry no more than
53 bits of precision (the same as the platform C double type), in which case any float x with
abs(x) >= 2**52 necessarily has no fractional bits.

(b) Power and logarithmic functions

math.exp(x)
Return e**x.
math.expm1(x)
Return e**x - 1. For small floats x, the subtraction in exp(x) - 1 can result in a significant loss
of precision; the expm1() function provides a way to compute this quantity to full precision:
>>>
>>> from math import exp, expm1
>>> exp(1e-5) - 1 # gives result accurate to 11 places 1.0000050000069649e-05
>>> expm1(1e-5) # result accurate to full precision
1.0000050000166668e-05 New
in version 2.7. math.log(x[,
base])
With one argument, return the natural logarithm of x (to base e).
With two arguments, return the logarithm of x to the given base, calculated as
log(x)/log(base). Changed in version 2.3: base argument added. math.log1p(x)
Return the natural logarithm of 1+x (base e). The result is calculated in a way which is
accurate for x near zero.
New in version 2.6.

math.log10(x)
Return the base-10 logarithm of x. This is usually more accurate than log(x, 10).

math.pow(x, y)
Return x raised to the power y. Exceptional cases follow Annex ‘F’ of the C99 standard as far
as possible. In particular, pow(1.0, x) and pow(x, 0.0)always return 1.0, even when x is a zero
or a NaN. If both x and y are finite, x is negative, and y is not an integer then pow(x, y) is
undefined, and raises ValueError.
Unlike the built-in ** operator, math.pow() converts both its arguments to type float.
Use ** or the built-in pow() function for computing exact integer powers.

165
Changed in version 2.6: The outcome of 1**nan and nan**0 was undefined.

math.sqrt(x)
Return the square root of x.

(c) Trigonometric functions

math.acos(x)
Return the arc cosine of x, in radians.
math.asin(x)
Return the arc sine of x, in radians.

math.atan(x)
Return the arc tangent of x, in radians.

math.atan2(y, x)
Return atan(y / x), in radians. The result is between -pi and pi. The vector in the plane from
the origin to point (x, y) makes this angle with the positive X axis. The point of atan2() is that
the signs of both inputs are known to it, so it can compute the correct quadrant for the angle.
For example, atan(1) and atan2(1, 1) are both pi/4, but atan2(-1, -1) is -3*pi/4.

math.cos(x)
Return the cosine of x radians.

math.hypot(x, y)
Return the Euclidean norm, sqrt(x*x + y*y). This is the length of the vector from the origin to
point (x, y).

math.sin(x)
Return the sine of x radians.

math.tan(x)
Return the tangent of x radians.

(d). Angular conversion math.degrees(x)


Convert angle x from radians to degrees.

math.radians(x)
Convert angle x from degrees to radians.

166
(e)Hyperbolic functions

math.acosh(x)
Return the inverse hyperbolic cosine of x.
New in version 2.6.

math.asinh(x)
Return the inverse hyperbolic sine of x.
New in version 2.6.

math.atanh(x)
Return the inverse hyperbolic tangent of x.
New in version 2.6.

167
math.cosh(x)
Return the hyperbolic cosine of x.

math.sinh(x)
Return the hyperbolic sine of x.

math.tanh(x)
Return the hyperbolic tangent of x.

(f). Special functions

math.erf(x)
Return the error function at x.
New in version 2.7.

math.erfc(x)
Return the complementary error function at x.
New in version 2.7.

math.gamma(x)
Return the Gamma function at x.
New in version 2.7.

math.lgamma(x)
Return the natural logarithm of the absolute value of the Gamma function at x. New
in version 2.7.

(g). Constants
math.pi
The mathematical constant π = 3.141592..., to available precision.

math.e
The mathematical constant e = 2.718281..., to available precision.

(5) Random module:


This module implements pseudo-random number generators for various distributions. For
integers, there is uniform selection from a range. For sequences, there is uniform selection
of a random element, a function to generate a random permutation of a list in- 151
place, and a function for random sampling without replacement.
On the real line, there are functions to compute uniform, normal (Gaussian), lognormal,
negative exponential, gamma, and beta distributions. For generating distributions of
angles, the von Mises distribution is available.
Almost all module functions depend on the basic function random(), which generates a
random float uniformly in the semi-open range [0.0, 1.0). Python uses the Mersenne
Twister as the core generator. It produces 53-bit precision floats and has a period of
2**19937-1. The underlying implementation in C is both fast and threadsafe. The
Mersenne Twister is one of the most extensively tested random number generators in
existence. However, being completely deterministic, it is not suitable for all purposes,
and is completely unsuitable for cryptographic purposes.
The functions supplied by this module are actually bound methods of a hidden instance
of the random.Random class. You can instantiate your own instances of Random to get
generators that don’t share state.
Class Random can also be subclassed if you want to use a different basic generator of
your own devising: in that case, override the random(), seed(), getstate(), and
setstate() methods. Optionally, a new generator can supply a getrandbits() method —
this allows randrange() to produce selections over an arbitrarily large range. The
random module also provides the SystemRandom class which uses the system
function os.urandom() to generate random numbers from sources provided by the
operating system.

Warning

The pseudo-random generators of this module should not be used for security
purposes. For security or cryptographic uses, see thesecrets module.

(a) Bookkeeping functions


random.seed(a=None, version=2)
Initialize the random number generator.
If a is omitted or None, the current system time is used. If randomness sources are
provided by the operating system, they are used instead of the system time (see
the os.urandom() function for details on availability).
If a is an int, it is used directly.
With version 2 (the default), a str, bytes, or bytearray object gets converted to an int and
all of its bits are used.
With version 1 (provided for reproducing random sequences from older versions of
Python), the algorithm for str and bytes generates a narrower range of seeds.
Changed in version 3.2: Moved to the version 2 scheme which uses all of the bits in a
string seed.
169
random.getstate()
Return an object capturing the current internal state of the generator. This object can be
passed to setstate() to restore the state.
random.setstate(state)
state should have been obtained from a previous call to getstate(), and setstate() restores
the internal state of the generator to what it was at the time getstate() was called.

random.getrandbits(k)
Returns a Python integer with k random bits. This method is supplied with the
MersenneTwister generator and some other generators may also provide it as an
optional part of the API. When available, getrandbits() enables randrange() to handle
arbitrarily large ranges.

(b) Functions for integers


random.randrange(stop)
random.randrange(start, stop[, step])
Return a randomly selected element from range(start, stop, step). This is equivalent to
choice(range(start, stop, step)), but doesn’t actually build a range object.
The positional argument pattern matches that of range(). Keyword arguments should not
be used because the function may use them in unexpected ways.
Changed in version 3.2: randrange() is more sophisticated about producing equally
distributed values. Formerly it used a style like int(random()*n) which could produce
slightly uneven distributions.

random.randint(a, b)
Return a random integer N such that a <= N <= b. Alias for randrange(a, b+1).

(c) Functions for sequences


random.choice(seq)
Return a random element from the non-empty sequence seq. If seq is empty, raises
IndexError.
random.choices(population, weights=None, *, cum_weights=None, k=1) Return
a k sized list of elements chosen from the population with replacement. If the
population is empty, raises IndexError.
If a weights sequence is specified, selections are made according to the relative weights.
Alternatively, if a cum_weights sequence is given, the selections are made according to
the cumulative weights (perhaps computed using itertools.accumulate()). For example,
the relative weights[10, 5, 30, 5] are equivalent to the cumulative
weights [10, 15, 45, 50]. Internally, the relative weights are converted to cumulative
weights before making selections, so supplying the cumulative weights saves work.
If neither weights nor cum_weights are specified, selections are made with equal
probability. If a weights sequence is supplied, it must be the same length as the
170
population sequence. It is a TypeError to specify both weights and cum_weights.
The weights or cum_weights can use any numeric type that interoperates with the
float values returned by random() (that includes integers, floats, and fractions but
excludes decimals).
New in version 3.6.

random.shuffle(x[, random])
Shuffle the sequence x in place.
The optional argument random is a 0-argument function returning a random float in
[0.0, 1.0); by default, this is the function random().
To shuffle an immutable sequence and return a new shuffled list, use
sample(x, k=len(x)) instead.
Note that even for small len(x), the total number of permutations of x can quickly grow
larger than the period of most random number generators. This implies that most
permutations of a long sequence can never be generated. For example, a sequence of
length 2080 is the largest that can fit within the period of the Mersenne Twister random
number generator.

random.sample(population, k)
Return a k length list of unique elements chosen from the population sequence or set.
Used for random sampling without replacement.
Returns a new list containing elements from the population while leaving the original
population unchanged. The resulting list is in selection order so that all sub-slices will
also be valid random samples. This allows raffle winners (the sample) to be partitioned
into grand prize and second place winners (the subslices).
Members of the population need not be hashable or unique. If the population contains
repeats, then each occurrence is a possible selection in the sample.
To choose a sample from a range of integers, use a range() object as an argument. This
is especially fast and space efficient for sampling from a large population:
sample(range(10000000), k=60).
If the sample size is larger than the population size, a ValueError is raised.

(d) Real-valued distributions


The following functions generate specific real-valued distributions. Function parameters
are named after the corresponding variables in the distribution’s equation, as used in
common mathematical practice; most of these equations can be found in any statistics
text.

random.random()
Return the next random floating point number in the range [0.0, 1.0).

random.uniform(a, b)
Return a random floating point number N such that a
<= N <= b for a <= b and b <= N <= a for b < a.
171
The end-point value b may or may not be included in the range depending on floating-
point rounding in the equation a + (b-a) * random().

random.triangular(low, high, mode)


Return a random floating point number N such that low <= N <= high and with the
specified mode between those bounds. The low and highbounds default to zero and one.
The mode argument defaults to the midpoint between the bounds, giving a symmetric
distribution.
random.betavariate(alpha, beta)
Beta distribution. Conditions on the parameters are alpha > 0 and beta > 0. Returned
values range between 0 and 1.

random.expovariate(lambd)
Exponential distribution. lambd is 1.0 divided by the desired mean. It should be
nonzero. (The parameter would be called “lambda”, but that is a reserved word in
Python.) Returned values range from 0 to positive infinity if lambd is positive, and from
negative infinity to 0 if lambd is negative.

random.gammavariate(alpha, beta)
Gamma distribution. (Not the gamma function!) Conditions on the parameters are
alpha > 0 and beta > 0.
The probability distribution function is: x
** (alpha - 1) * math.exp(-x / beta)
pdf(x) = --------------------------------------
math.gamma(alpha) * beta ** alpha

random.gauss(mu, sigma)
Gaussian distribution. mu is the mean, and sigma is the standard deviation. This is
slightly faster than the normalvariate() function defined below.

random.lognormvariate(mu, sigma)
Log normal distribution. If you take the natural logarithm of this distribution, you’ll get
a normal distribution with mean mu and standard deviation sigma. mu can have any
value, and sigma must be greater than zero.

random.normalvariate(mu, sigma)
Normal distribution. mu is the mean, and sigma is the standard deviation.

random.vonmisesvariate(mu, kappa)
mu is the mean angle, expressed in radians between 0 and 2*pi, and kappa is the
concentration parameter, which must be greater than or equal to zero. If kappa is equal
to zero, this distribution reduces to a uniform random angle over the range 0 to 2*pi.

random.paretovariate(alpha)
172
Pareto distribution. alpha is the shape parameter.

random.weibullvariate(alpha, beta)
Weibull distribution. alpha is the scale parameter and beta is the shape parameter.

(e) Alternative Generator class


random.SystemRandom([seed])
Class that uses the os.urandom() function for generating random numbers from sources
provided by the operating system. Not available on all systems. Does not rely on
software state, and sequences are not reproducible. Accordingly, the seed() method has
no effect and is ignored. The getstate() and setstate() methods raise
NotImplementedError if called.

(f). Notes on Reproducibility


Sometimes it is useful to be able to reproduce the sequences given by a pseudo random
number generator. By re-using a seed value, the same sequence should be reproducible
from run to run as long as multiple threads are not running.
Most of the random module’s algorithms and seeding functions are subject to change
across Python versions, but two aspects are guaranteed not to change:
• If a new seeding method is added, then a backward compatible seeder will be offered.
• The generator’s random() method will continue to produce the same sequence when
the compatible seeder is given the same seed.

(6) Time module:


There is a popular time module available in Python, which provides functions for
working with times and for converting between representations. Here is the list of all available
methods
SN Function with Description

1 time.altzone

The offset of the local DST timezone, in seconds west of UTC, if one is defined.
This is negative if the local DST timezone is east of UTC (as in Western Europe,
including the UK). Use this if the daylight is nonzero.

2 time.asctime([tupletime])

Accepts a time-tuple and returns a readable 24-character string such as 'Tue Dec
11 18:07:14 2008'.

173
3 time.clock( )

Returns the current CPU time as a floating-point number of seconds. To measure


computational costs of different approaches, the value of time.clock is more useful
than that of time.time().

4 time.ctime([secs])

Like asctime(localtime(secs)) and without arguments is like asctime( )

5 time.gmtime([secs])

Accepts an instant expressed in seconds since the epoch and returns a time-tuple
t with the UTC time. Note : t.tm_isdst is always 0

174
6 time.localtime([secs])

Accepts an instant expressed in seconds since the epoch and returns a time-tuple
t with the local time (t.tm_isdst is 0 or 1, depending on whether DST applies to
instant secs by local rules).

7 time.mktime(tupletime)

Accepts an instant expressed as a time-tuple in local time and returns a floating-


point value with the instant expressed in seconds since the epoch.

8 time.sleep(secs)

Suspends the calling thread for secs seconds.

9 time.strftime(fmt[,tupletime])

Accepts an instant expressed as a time-tuple in local time and returns a string


representing the instant as specified by string fmt.

10 time.strptime(str,fmt='%a %b %d %H:%M:%S %Y')

Parses str according to format string fmt and returns the instant in time-tuple
format.

11 time.time( )

Returns the current time instant, a floating-point number of seconds since the
epoch.

12 time.tzset()

Resets the time conversion rules used by the library routines. The environment
variable TZ specifies how this is done.

157
158

PYTHON

PROGRAMMING

UNIT 5 NOTES
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 2 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
CHAPTER I:CREATING THE GUI FORM AND ADDING WIDGETS

Topics covered: Widgets: Button, Canvas,Checkbutton, Entry, Frame, Label, Listbox, Menubutton, Menu,
Message, Radiobutton, Scale, Scrollbar, text, Toplevel, Spinbox, PanedWindow, LabelFrame, tkMessagebox.
Handling Standard attributes and Properties of Widgets.
Layout Management: Designing GUI applications with proper Layout Management features.
Look and Feel Customization:Enhancing Look and Feel of GUI using different appearances of widgets.

python provides various options for developing graphical user interfaces (GUIs). Most important are listed
below.
Tkinter − Tkinter is the Python interface to the Tk GUI toolkit shipped with Python. We would look
this option in this chapter.
wxPython − This is an open-source Python interface for wxWind ows http://wxpython.org.
JPython − JPython is a Python port for Java which gives Python scripts seamless access to Java
class libraries on the local machine http://www.jython.org.
There are many other interfaces available, which you can find them on the net.
Tkinter Programming
Tkinter is the standard GUI library for Python. Python when combined with Tkinter provides a fast and
easy way to create GUI applicat ions. Tkinter provides a powerful object -oriented interface to the Tk GUI
toolkit.
Creating a GUI application using Tkinter is an easy task. All you need to do is perform the following steps

Import the Tkinter module.
Create the GUI application main window.
Add one or more of the above -mentioned widgets to the GUI application.
Enter the main event loop to take action against each event triggered by the user.
Example
#!/usr/bin/python

import Tkinter
top = Tkinter.Tk()
# Code to add widgets will go here...
top.mainloop()
This would create a following window −

Page 3 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Tkinter Widgets
Tkinter provides various controls, such as buttons, labels and text boxes used in a GUI application. These
controls are commonly called widgets.
There are currently 15 types of widgets in Tkinter. We present these widgets as well as a brief description
in the following table –

Page 4 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 5 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 6 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 7 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 8 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
Try the following example yourself −

Page 9 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
import Tkinter

importtkMessageBox top

= Tkinter.Tk()

def helloCallBack():

tkMessageBox.showinfo( "Hello Python", "Hello World")

B = Tkinter.Button(top, text ="Hello", command = helloCallBack)

B.pack()

top.mainloop()

When the above code is executed, it produces the following result −

Python - Tkinter Canvas

The Canvas is a rectangular area intended for drawing pictures or other complex layouts. You can place
graphics, text, widgets or frames on a Canvas.

Syntax

Here is the simple syntax to create this widget −

w = Canvas ( master, option=value, ... )

Parameters

master − This represents the parent window.

options − Here is the list of most commonly used options for this widget. These options can be
used as key-value pairs separated by commas.

Sr.No. Option & Description

Page 10 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
1 Bd

Border width in pixels. Default is 2.

Page 11 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 12 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
12 yscrollincrement

Works like xscrollincrement, but governs vertical movement.

13 yscrollcommand

If the canvas is scrollable, this attribute should be the .set() method of the vertical
scrollbar.

The Canvas widget can support the following standard items −

arc − Creates an arc item, which can be a chord, a pieslice or a simple arc.

coord = 10, 50, 240, 210

arc = canvas.create_arc(coord, start=0, extent=150, fill="blue")

image − Creates an image item, which ca n be an instance of either the BitmapImage or the PhotoImage
classes.

filename = PhotoImage(file = "sunshine.gif")

image = canvas.create_image(50, 50, anchor=NE, image=filename)

line − Creates a line item.

line = canvas.create_line(x0, y0, x1, y1, ..., xn, yn, options)

oval − Creates a circle or an ellipse at the given coordinates. It takes two pairs of coordinates; the top
left and bottom right corners of the bounding rectangle for the oval.

oval = canvas.create_oval(x0, y0, x1, y1, options)

polygon − Creates a polygon item that must have at least three vertices.

oval = canvas.create_polygon(x0, y0, x1, y1,...xn, yn, options)

Example

Try the following example yourself −

import Tkinter

top = Tkinter.Tk()

C = Tkinter.Canvas(top, bg="blue", height=250, width=300)

coord = 10, 50, 240, 210 arc = C.create_arc(coord,

start=0, extent=150, fill="red") C.pack() top.mainloop()

Page 13 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
When the above code is executed, it produces the following result −

Python - Tkinter Checkbutton

The Checkbutton widget is used to disp lay a number of options to a user as toggle buttons. The user can
then select one or more options by clicking the button corresponding to each option.

You can also display images in place of text.

Syntax

Here is the simple syntax to create this widget −

w = Checkbutton ( master, option, ... )

Parameters

master − This represents the parent window.

options − Here is the list of most commonly used options for this widget. These options can be
used as key-value pairs separated by commas.

Sr.No. Option & Description

1 activebackground

Background color when the checkbutton is under the cursor.

2 activeforeground

Foreground color when the checkbutton is under the cursor.

3 bg

Page 14 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 15 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 16 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 17 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
3 invoke()

You can call this method to get the same actions that would occur if the user clicked
on the checkbutton to change its state.

4 select()

Sets (turns on) the checkbutton.

5 toggle()

Clears the checkbutton if set, sets it if cleared.

Example

Try the following example yourself −

from Tkinter import *

importtkMessageBox

import Tkinter

top = Tkinter.Tk()

CheckVar1 = IntVar()

CheckVar2 = IntVar()

C1 = Checkbutton(top, text = "Music", variable = CheckVar1, \

onvalue = 1, offvalue = 0, height=5, \

width = 20)

C2 = Checkbutton(top, text = "Video", variable = CheckVar2, \

onvalue = 1 , offvalue = 0, height=5, \

width = 20)

C1.pack()

C2.pack()

top.mainloop()

When the above code is executed, it produces the following result −

Page 18 of 113
PYTHON
PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 19 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 20 of 113
PYTHON
PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 21 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 22 of 113
PYTHON
PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

scroll by character widths, or PAGES, to scroll by chunks the size of the entry widget.
The number is positive to scroll left to right, negative to scroll right to left.

Example
Try the following example yourself −

from Tkinter import *

top = Tk()

L1 = Label(top, text="User Name")

L1.pack( side = LEFT)

E1 = Entry(top, bd =5)

E1.pack(side = RIGHT)

top.mainloop()

When the above code is executed, it produces the following result −

Frame :

The Frame widget is very important for the process of grouping and organizing other widgets in a
somehow friendly way. It works like a container, which is responsible for arranging the position of other
widgets.

It uses rectangular areas in the screen to o rganize the layout and to provide padding of these widgets. A
frame can also be used as a foundation class to implement complex widgets.

Syntax

Here is the simple syntax to create this widget −

w = Frame ( master, option, ... )

Parameters

master − This represents the parent window.

options − Here is the list of most commonly used options for this widget. These options can be
used as key-value pairs separated by commas.

Sr.No. Option & Description

Page 23 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Try the following example yourself −

from Tkinter import * root = Tk()

Page 24 of 113
PYTHON
PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
frame = Frame(root)

frame.pack() bottomframe

= Frame(root)

bottomframe.pack( side = BOTTOM )

redbutton = Button(frame, text="Red", fg="red")

redbutton.pack( side = LEFT)

greenbutton = Button(frame, text="Brown", fg="brown")

greenbutton.pack( side = LEFT )

bluebutton = Button(frame, text="Blue", fg="blue")

bluebutton.pack( side = LEFT )

blackbutton = Button(bottomframe, text="Black", fg="black")

blackbutton.pack( side = BOTTOM )

root.mainloop()

When the above code is executed, it produces the following result −

Label:

This widget implements a display box wh ere you can place text or images. The text displayed by this
widget can be updated at any time you want.

It is also possible to underline part of the text (like to identify a keyboard shortcut) and span the text
across multiple lines.

Syntax

Here is the simple syntax to create this widget −

w = Label ( master, option, ... )

Parameters

• master − This represents the parent window.

• options − Here is the list of most commonly used options for this widget. These options can be
used as key-value pairs separated by commas.

Page 25 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 26 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 27 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
Try the following example yourself −

from Tkinter import * root = Tk()

Page 28 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 29 of 113
PYTHON
PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 30 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 31 of 113
PYTHON
PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

15 yview_scroll ( number, what )

Scrolls the listbox vertically. For the what argument, use either UNITS to scroll by lines,
or PAGES to scroll by pages, that is, by the height of the listbox. The number argument
tells how many to scroll.

Example

Try the following example yourself −

from Tkinter import *

importtkMessageBox

import Tkinter

top = Tk()

Lb1 = Listbox(top)

Lb1.insert(1, "Python")

Lb1.insert(2, "Perl")

Lb1.insert(3, "C")

Lb1.insert(4, "PHP")

Lb1.insert(5, "JSP")

Lb1.insert(6, "Ruby")

Lb1.pack()

top.mainloop()

When the above code is executed, it produces the following result −

------------------------------------------------------------------------------------------------------

Menubutton:
Page 32 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
A menubutton is the part of a drop-down menu that stays on the screen all the time. Every menubutton is
associated with a Menu widget that can display the choices for that menubutton when the user clicks on it.

Page 33 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
Syntax

Here is the simple syntax to create this widget − w

= Menubutton( master, option, ... )

Page 34 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 35 of 113
PYTHON

PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR


18 Relief

Selects three-dimensional border shading effects. The default is RAISED.

19 State

Normally, menubuttons respond to the mouse. Set state=DISABLED to gray out the
menubutton and make it unresponsive.

20 T ext

To display text on the menubutton, set this option to the string containing the desired
text. Newlines ("\n") within the string will cause line breaks.

21 textvariable

You can associate a control variable of class StringVar with this menubutton. Setting
that control variable wi ll change the displayed text.

22 underline

Normally, no underline appears under the text on the menubutton. To underline one
of the characters, set this option to the index of that character.

23 Width

The width of the widget in characters. The default is 20.

24 wraplength

Normally, lines are not wrapped. You can set this option to a number of characters
and all lines will be broken into pieces no longer than that number.

Example

from Tkinter import *

importtkMessageBox

import Tkinter

Page 36 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
top = Tk() mb= Menubutton ( top, text="condiments",

relief=RAISED ) mb.grid() mb.menu= Menu ( mb, tearoff =

0)

mb["menu"] = mb.menu

mayoVar = IntVar()

ketchVar = IntVar()

mb.menu.add_checkbutton( label="mayo",

variable=mayoVar )

mb.menu.add_checkbutton( label="ketchup",variable=ketchVar )

mb.pack()

top.mainloop()

When the above code is executed, it produces the following result −

Menu:

The goal of this widget is to allow us to create all kinds of menus that can be used by our applications. The
core functionality prov ides ways to create three menu types: pop -up, toplevel and pull-down.

It is also possible to use other extended widgets to implement new types of menus, such as
the OptionMenu widget, which implements a special type that generates a pop -up list of items wi thin a
selection.

Syntax

Here is the simple syntax to create this widget −

w = Menu ( master, option, ... )

Parameters

master − This represents the parent window.

Page 37 of 113
PYTHON

PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR


options − Here is the list of most commonly used options for this widget. These options can be used
as key-value pairs separated by commas.

Sr.No. Description

1 activebackground

The background color that will appear on a choice when it is under the mouse.

Page 38 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 39 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 40 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
5 add_separator()
Adds a separator line to the menu.

6 add( type, options )

Adds a specific type of menu item to the menu.

7 delete( startindex [, endindex ])

Deletes the menu items ranging from startindex to endindex.

8 entryconfig( index, options )

Allows you to modify a menu item, which is identified by the index, and change its
options.

9 index(item)

Returns the index number of the given menu item label.

10 insert_separator ( index )

Insert a new separator at the position specified by index.

11 invoke ( index )

Calls the command callback associated with the choice at position index. If a
checkbutton, its state is toggled between set and cleared; if a radiobutton, that choice
is set.

12 type ( index )

Returns the type of the choice specified by index: either "cascade", "checkbutton",
"command", "radiobutton", "separator", or "tearoff".

Example

from Tkinter import *

defdonothing(): filewin

= Toplevel(root) button

= Button(filewin,
Page 41 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
text="Do nothing

button") button.pack()

root = Tk()

menubar = Menu(root)

filemenu = Menu(menubar, tearoff=0)

filemenu.add_command(label="New", command=donothing)

filemenu.add_command(label="Open", command=donothing)

filemenu.add_command(label="Save", command=donothing)

filemenu.add_command(label="Save as...", command=donothing)

filemenu.add_command(label="Close", command=donothing)

filemenu.add_separator()

filemenu.add_command(label="Exit", command=root.quit)

menubar.add_cascade(label="File", menu=filemenu)

editmenu = Menu(menubar, tearoff=0)

editmenu.add_command(label="Undo", command=donothing)

editmenu.add_separator()

editmenu.add_command(label="Cut", command=donothing)

editmenu.add_command(label="Copy", command=donothing)

editmenu.add_command(label="Paste", command=donothing)

editmenu.add_command(label="Delete", command=donothing)

editmenu.add_command(label="Select All", command=donothing)

menubar.add_cascade(label="Edit", menu=editmenu)

helpmenu = Menu(menubar, tearoff=0)

helpmenu.add_command(label="Help Index", command=donothing)

helpmenu.add_command(label="About...", command=donothing)
Page 42 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
menubar.add_cascade(label="Help", menu=helpmenu)

root.config(menu=menubar) root.mainloop()

When the above code is executed, it produces the following result −

Page 43 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 44 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 45 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 46 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 47 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
Try the following example yourself −

Page 48 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
from Tkinter import *

defsel():
selection = "Value = " + str(var.get())

label.config(text = selection)

root = Tk()

var = DoubleVar()

scale = Scale( root, variable = var )

scale.pack(anchor=CENTER)

button = Button(root, text="Get Scale Value", command=sel)

button.pack(anchor=CENTER)

label = Label(root)

label.pack()

root.mainloop()

When the above code is executed, it produces the following result −

Radiobutton:

This widget implements a multiple-choice button, which is a way to offer many possible selections to the
user and lets user choose only one of them.
In order to implement this functionality, each group of radiobuttons must be associated to the same variable
and each one of the buttons must symbolize a single value. You can use the Tab key to switch from one
radionbutton to another.
Page 49 of 113
PYTHON
PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
Syntax

Page 50 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 51 of 113
PYTHON
PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 52 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

selection = "You selected the option " + str(var.get())

label.config(text = selection) root = Tk() var =

IntVar()

R1 = Radiobutton(root, text="Option 1", variable=var, value=1, command=sel)


Page 53 of 113
PYTHON
PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
R1.pack( anchor = W )

R2 = Radiobutton(root, text="Option 2", variable=var, value=2,


command=sel)

R2.pack( anchor = W )

R3 = Radiobutton(root, text="Option 3", variable=var, value=3,

command=sel)

R3.pack( anchor = W)

label = Label(root)

label.pack()

root.mainloop()

When the above code is executed, it produces the following result −

Scrollbar:

This widget provides a slide controller that is used to implement vertical scrolled widgets, such as Listbox,
Text and Canvas. Note that you can also create horizontal scrollbars on Entry widgets.

Syntax

Here is the simple syntax to create this widget −

w = Scrollbar ( master, option, ... )

Parameters

master − This represents the parent window.

options − Here is the list of most commonly used options for this widget. These options can be used
as key-value pairs separated by commas.

Sr.No. Option & Description

Page 54 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 55 of 113
PYTHON
PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 56 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

meaning as the values returned by the get() method.

Example

Try the following example yourself −


from Tkinter import *

root = Tk()

scrollbar = Scrollbar(root)

scrollbar.pack( side = RIGHT, fill = Y )

mylist = Listbox(root, yscrollcommand = scrollbar.set )

for line in range(100):

mylist.insert(END, "This is line number " + str(line))

mylist.pack( side = LEFT, fill = BOTH )

scrollbar.config( command = mylist.yview )

mainloop()

When the above code is executed, it produces the following result −

Text:

Text widgets provide advanced capabilities that allow you to edit a multiline text and format the way it has
to be displayed, such as changing its color and font.

You can also use elegant structures like tabs and marks to locate specific sections of the text, and apply
changes to those areas. Moreover, you can embed windows and images in the text because this widget
was designed to handle both plain and formatted text.

Syntax

Here is the simple syntax to create this widget −


w = Text ( master, option, ... )
Page 57 of 113
PYTHON
PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
Parameters

• master − This represents the parent window.

• options − Here is the list of most commonly used options for this widget. These options can be
used as key-value pairs separated by commas.

Page 58 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 59 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 60 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Sr.No. Methods & Description

Page 61 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
1 index(mark)

Page 62 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 63 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
Example

Try the following example yourself − from

Tkinter import *

def onclick():

pass

root = Tk()

text = Text(root)

text.insert(INSERT, "Hello.....")

text.insert(END, "Bye Bye.....")

text.pack()

text.tag_add("here", "1.0", "1.4")

text.tag_add("start", "1.8", "1.13")

text.tag_config("here", background="yellow", foreground="blue")

text.tag_config("start", background="black", foreground="green")

root.mainloop()

When the above code is executed, it produces the following result −

-------------------------------------------------------------------------------------------------------

Toplevel :

Toplevel widgets work as windows that are directly managed by the window manager. They do not
necessarily have a parent widget on top of them.

Your application can use any number of top-level windows.

Syntax

Page 64 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
Here is the simple syntax to create this widget − w

= Toplevel ( option, ... )

Parameters

• options − Here is the list of most commonly used options for this widget. These options can be
used as key-value pairs separated by commas.

Page 65 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

9 width

The desired width of the window.

Page 66 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Methods

Toplevel objects have these methods −

Sr.No. Methods & Description

1 deiconify()

Displays the window, after using either the iconify or the withdraw methods.

2 frame()

Returns a system-specific window identifier.

3 group(window)

Adds the window to the window group administered by the given window.

4 iconify()

Turns the window into an icon, without destroying it.

5 protocol(name, function)

Page 67 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 68 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Example

from Tkinter import * root

= Tk()

Page 69 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
top = Toplevel()

top.mainloop()

When the above code is executed, it produces the following result −

Spinbox:

The Spinbox widget is a variant of the standard Tkinter Entry widget, which can be used to select from a
fixed number of values.

Syntax

Here is the simple syntax to create this widget −

w = Spinbox( master, option, ... )

Parameters

master − This represents the parent window.

options − Here is the list of most commonly used options for this widget. These opt ions can be
used as key-value pairs separated by commas.

Sr.No. Option & Description

1 activebackground

The color of the slider and arrowheads when the mouse is over them.

2 bg

The color of the slider and arrowheads when the mouse is not over them.

Page 70 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 71 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

23 width
Page 72 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Page 73 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Example
from Tkinter import * master = Tk() w

= Spinbox(master, from_=0, to=10)

Page 74 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
w.pack()

mainloop()

When the above code is executed, it produces the following result −

A PanedWindow is a container widget that may contain any number of panes, arranged horizontally or
vertically.

Each pane contains one widget and each pair of panes is separated by a movable (via mouse movements)
sash. Moving a sash causes the widgets on eith er side of the sash to be resized.

Syntax

Here is the simple syntax to create this widget −

w = PanedWindow( master, option, ... )

Parameters

master − This represents the parent window.

options − Here is the list of most commonly used options for this widg et. These options can be
used as key-value pairs separated by commas.

Sr.No. Option & Description

1 bg

The color of the slider and arrowheads when the mouse is not over them.

2 bd

The width of the 3 -d borders around the entire perimeter of the trough, and also the
width of the 3 -d effects on the arrowheads and slider. Default is no border around the
trough, and a 2 -pixel border around the arrowheads and slider. Page 75 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
3 borderwidth

Page 76 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

14 width

No default value.

Page 77 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
Methods

PanedWindow objects have these methods −

Sr.No. Methods & Description

1 add(child, options)

Adds a child window to the paned window.

2 get(startindex [,endindex])

This method returns a specific character or a range of text.

3 config(options)

Modifies one or more widget options. If no options are given, the method returns a
dictionary containing all current option values.

Example

from Tkinter import *

m1 = PanedWindow()

m1.pack(fill=BOTH, expand=1)

left = Label(m1, text="left pane")

m1.add(left)

m2 = PanedWindow(m1, orient=VERTICAL)

m1.add(m2)

top = Label(m2, text="top pane")

m2.add(top) bottom = Label(m2,

text="bottom pane") m2.add(bottom)

Page 78 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
mainloop()

When the above code is executed, it produces the following result −

LabelFrame:

A labelframe is a simple container widget. Its primary purpose is to act as a spacer or container for
complex window layouts.

This widget has the features of a frame plus the ability to display a label.

Syntax

Here is the simple syntax to create this widget −

w = LabelFrame( master, option, ... )

Parameters

master − This represents the parent window.

options − Here is the list of most commonly used options for this widget. These options can be
used as key-value pairs separated by commas.

Sr.No. Option & Description

1 bg

The normal background color displayed behind the label and indicator.

2 bd

The size of the border around the indicator. Default is 2 pixels.

3 cursor

If you set this option to a cursor name ( arrow, dot etc.), the mouse cursor will change
to that pattern when it is over the checkbutton.

Page 79 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

root = Tk() labelframe = LabelFrame(root, text="This is a

LabelFrame") labelframe.pack(fill="both", expand="yes")

Page 80 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
left = Label(labelframe, text="Inside the LabelFrame")

left.pack() root.mainloop()

When the above code is executed, it produces the following result −

tkMessageBox:

The tkMessageBox module is used to display message boxes in your applications. This module provides a
number of functions that you can use to display an appropriate message.

Some of these functions are showin fo, showwarning, showerror, askquestion, askokcancel, askyesno, and
askretryignore.

Syntax

Here is the simple syntax to create this widget −

tkMessageBox.FunctionName(title, message [, options])

Parameters

FunctionName − This is the name of the appropriate message box function.

title − This is the text to be displayed in the title bar of a message box.

message − This is the text to be displayed as a message.

options − options are alternative choices that you may use to tailor a standard message box. Some of
the options that you can use are default and parent. The default option is used to specify the default
button, such as ABORT, RETRY, or IGNORE in the message box. The parent option is used to specify the
window on top of which the message box is to be dis played.

You could use one of the following functions with dialogue box −

showinfo()

showwarning()

showerror ()

• askquestion()

• askokcancel()

• askyesno ()
Page 81 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
• askretrycancel ()

Example

import Tkinter

import tkMessageBox

top = Tkinter.Tk()

def hello():

tkMessageBox.showinfo("Say Hello", "Hello World")

B1 = Tkinter.Button(top, text = "Say Hello", command = hello)

B1.pack()

top.mainloop()

When the above code is executed, it produces the following result −

-----------------------------------------------------------------------------------------------------
Handling Standard attributes:
Dimensions
Colors
Fonts
Anchors
Relief styles
Bitmaps
Cursors

Page 82 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Dimensions:
Various lengths, widths, and other dimensions of widgets can be described in many different units.
• If you set a dimension to an integer, it is assumed to be in pixels.
• You can specify units by setting a dimension to a string containing a number followed by.

The common color options are −

• activebackground − Background color for the widget when the widget is active.
• activeforeground − Foreground color for the widget when the widget is active.

Page 83 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
• background − Background color for the widget. This can also be represented as bg.
• disabledforeground − Foreground color for the widget when the widget is disabled.
• foreground − Foreground color for the widget. This can also be represented as fg.
• highlightbackground − Background color of the highlight region when the widget has focus.
• highlightcolor − Foreground color of the highlight region when the widget has focus.
• selectbackground − Background color for the selected items of the widget.
• selectforeground − Foreground color for the selected items of the widget.

Fonts:

There may be up to three ways to specify type style.

Simple Tuple Fonts

As a tuple whose first element is the font family, followed by a size in points, optionally followed by a
string containing one or more of the style modifiers bold, italic, underline and overstrike.

Example
("Helvetica", "16") for a 16-point Helvetica regular.
("Times", "24", "bold italic") for a 24-point Times bold italic.

Font object Fonts

You can create a "font object" by importing the tkFont module and using its Font class constructor −

import tkFont

font = tkFont.Font ( option, ... )

Here is the list of options −

family − The font family name as a string.


size − The font height as an integer in points. To get a font n pixels high, use -n.
weight − "bold" for boldface, "normal" for regular weight.
slant − "italic" for italic, "roman" for unslanted.
underline − 1 for underlined text, 0 for normal.
overstrike − 1 for overstruck text, 0 for normal.

Example

helv36 = tkFont.Font(family="Helvetica",size=36,weight="bold")

X Window Fonts

If you are running under the X Window System, you can use any of the X font names.

For example, the font named "-*-lucidatypewriter-medium-r-*-*-*-140-*-*-*-*-*-*" is the author's


favorite fixed-width font for onscreen use. Use the xfontsel program to help you select pleasing fonts.

Page 84 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Anchors:

Anchors are used to define where text is positioned relative to a reference point.

Here is list of possible constants, which can be used for Anchor attribute.

Page 85 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
NW
N
NE
W
CENTER
E
SW
S
SE

For example, if you use CENTER as a text anchor, the text will be centered horizontally and vertically
around the reference point.

Anchor NW will position the text so that the reference point coincides with the northwest (top left)
corner of the box containing the text.

Anchor W will center the text vertically around the reference point, with the left edge of the text box
passing through that point, and so on.

If you create a small widget inside a large frame and use the anchor=SE option, the widget will be
placed in the bottom right corner of the frame. If you used anchor=N instead, the widget would be
centered along the top edge.

Example

The anchor constants are shown in this diagram −

Relief styles

The relief style of a widget refers to certain simulated 3-D effects around the outside of the widget.
Here is a screenshot of a row of buttons exhibiting all the possible relief styles −

Page 86 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
Here is list of possible constants which can be used for relief attribute.
FLAT
RAISED
SUNKEN
GROOVE
RIDGE

Example

from Tkinter import *

import Tkinter

top = Tkinter.Tk()

B1 = Tkinter.Button(top, text ="FLAT", relief=FLAT )

B2 = Tkinter.Button(top, text ="RAISED", relief=RAISED )

B3 = Tkinter.Button(top, text ="SUNKEN", relief=SUNKEN )

B4 = Tkinter.Button(top, text ="GROOVE", relief=GROOVE )

B5 = Tkinter.Button(top, text ="RIDGE", relief=RIDGE )

B1.pack()

B2.pack()

B3.pack()

B4.pack()

B5.pack()

top.mainloop()

When the above code is executed, it produces the following result −

Page 87 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Bitmaps:

This attribute to displays a bitmap. There are following type of bitmaps available −

"error"
"gray75"
"gray50"
"gray25"
"gray12"
"hourglass"
"info"
"questhead"
"question"
"warning"

Example

from Tkinter import *

import Tkinter

top = Tkinter.Tk()

B1 = Tkinter.Button(top, text ="error", relief=RAISED, \

bitmap="error")

B2 = Tkinter.Button(top, text ="hourglass", relief=RAISED,\

bitmap="hourglass")

B3 = Tkinter.Button(top, text ="info", relief=RAISED,\

Page 88 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
bitmap="info")
B4 = Tkinter.Button(top, text ="question", relief=RAISED,\

bitmap="question")

B5 = Tkinter.Button(top, text ="warning", relief=RAISED,\

bitmap="warning")

B1.pack()

B2.pack()

B3.pack()

B4.pack()

B5.pack()

top.mainloop()

When the above code is executed, it produces the following result −

Cursors:
Python Tkinter supports quite a number of different mouse cursors available. The exact graphic may vary
according to your operating system.
Here is the list of interesting ones −
"arrow"

"dotbox"
"exchange"
"fleur"
• "circle"
• "clock"
• "cross"

Page 89 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
• "heart"
• "heart"
• "man"
• "mouse"
• "pirate"
• "plus"
• "shuttle"
• "sizing"
• "spider"
• "spraycan"
"star"
"target"
"tcross"

Example
from Tkinter import *
import Tkinter

top = Tkinter.Tk()

B1 = Tkinter.Button(top, text ="circle", relief=RAISED, \


cursor="circle")
B2 = Tkinter.Button(top, text ="plus", relief=RAISED,\
cursor="plus")
B1.pack()
B2.pack()
top.mainloop()

• "trek"
• "watch" CHAPTER II: LAYOUT MANAGEMENT

Page 90 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Geometry Management
All Tkinter widgets have access to specific geometry management methods, which have the purpose of
organizing widgets throughout the parent widget area. Tkinter exposes the following geometry manager
classes: pack, grid, and place.
• The pack() Method − This geometry manager organizes widgets in blocks before placing them in
the parent widget.
The grid() Method − This geometry manager organizes widgets in a table -like structure in the
parent widget.
The place() Method − This geometry manager organizes widgets by placing them in a specific
position in the parent widget.
---------------------------------------------------------------------------------------------------------------------
The pack() Method
This geometry manager organizes widgets in blocks before placing them in the parent widget.

widget.pack( pack_options )
Here is the list of possible options −
expand − When set to true, widget expands to fill any space not otherwise used in widget's
parent.
fill − Determines whether widget fills any extra space allocated to it by the packer, or keeps its
own minimal dimensions: NONE (default), X (fill only horizontally), Y (fill only vertically), or BOTH
(fill both horizontally and vertically).
side − Determines which side of the parent widget packs against: TOP (default), BOTTOM, LEFT,
or RIGHT.
Example
Try the following example by moving cursor on different buttons −
from Tkinter import *

root = Tk()
frame = Frame(root)
frame.pack()

bottomframe = Frame(root)
bottomframe.pack( side = BOTTOM )

redbutton = Button(frame, text="Red", fg="red")


redbutton.pack( side = LEFT)

greenbutton = Button(frame, text="green", fg="green")


greenbutton.pack( side = LEFT )

Syntax

Page 91 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

bluebutton = Button(frame, text="Blue", fg="blue") bluebutton.pack(


side = LEFT )

blackbutton = Button(bottomframe, text="Black", fg="black") blackbutton.pack(


side = BOTTOM)

root.mainloop()
When the above code is executed, it produces the following result −

----------------------------------------------------------------------------------------------------------------------

Page 92 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
The grid() Method
This geometry manager organizes widgets in a table-like structure in the parent widget.
Syntax
widget.grid( grid_options )
Here is the list of possible options −
column − The column to put widget in; default 0 (leftmost column).
columnspan − How many columns widgetoccupies; default 1.
ipadx, ipady − How many pixels to pad widget, horizontally and vertically, inside widget's
borders.
padx, pady − How many pixels to pad widget, horizontally and vertically, outside v's borders.
row − The row to put widget in; default the first row that is still empty.
rowspan − How many rowswidget occupies; default 1.
sticky − What to do if the cell is larger than widget. By default, with sticky='', widget is centered
in its cell. sticky may be the string concatenation of zero or mo re of N, E, S, W, NE, NW, SE, and
SW, compass directions indicating the sides and corners of the cell to which widget sticks.

Example
import Tkinter
root = Tkinter.Tk( )
for r in range(3):
for c in range(4):
Tkinter.Label(root, text='R%s/C%s'%(r ,c),
borderwidth=1 ).grid(row=r,column=c)
root.mainloop( )
This would produce the following result displaying 12 labels arrayed in a 3 × 4 grid −

The place() Method


This geometry manager organizes widgets by placing them in a specific position in the parent widget.
Syntax
widget.place( place_options )
Here is the list of possible options −
• anchor − The exact spot of widget other options refer to: may be N, E, S, W, NE, NW, SE, or SW,
compass directions indicating the corners and sides of widget; default is NW (the upper left corner
of widget)
• bordermode − INSIDE (the default) to indicate that other options refer to the parent's inside
(ignoring the parent's border); OUTSIDE otherwise. height, width − Height and width in pixels.
• relheight, relwidth − Height and width as a float between 0.0 and 1.0, as a fraction of the height
and width of the parent widget.
• relx, rely − Horizontal and vertical offset as a float between 0.0 and 1.0, as a fraction of the
height and width of the parent widget.
• x, y − Horizontal and vertical offset in pixels.
Example

Page 93 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
from Tkinter import *
import tkMessageBox
import Tkinter
top = Tkinter.Tk()
def helloCallBack():
tkMessageBox.showinfo( "Hello Python", "Hello World")
B = Tkinter.Button(top, text ="Hello", co mmand = helloCallBack)
B.pack()
B.place(bordermode=OUTSIDE, height=100, width=100)
top.mainloop()
When the above code is executed, it produces the following result −

CHAPTER III : LOOK AND FEEL CUSTOMIZATION

Here is the overview of the Python modules for this chapter:

Creating message boxes – information, warning, and error

Page 94 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
A message box is a pop-up window that gives feedback to the user. It can be informational,hinting at
potential problems as well as catastrophic errors.

Using Python to create message boxes is very easy.

We will add functionality to the Help | About menu item we created in the previous chapter, in the
Creating tabbed widgets recipe.

The code is from GUI_tabbed_all_widgets_both_tabs.py. The typical feedback to the user when clicking
the Help | About menu in most applications is informational. We start with this information and then vary
the design pattern to show warnings and errors.

Add the following line of code to the top of the module where the import statements live:

Page 95 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Next, create a callback function that will display a message box. We have to locate the code

of the callback above the code where we attach the callback to the me nu item, because this

is still procedural and not OOP code.

Add the following code just above the lines where we create the help menu:

GUI_message_box.py

Clicking Help | About now causes the following pop-up window to appear:

Let's transform this code into a warning message box pop-up window, instead. Comment out the previous
line and add the following code:

Running the preceding code will now result in the following slightly modified message box:

Page 96 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Displaying an error message box is simple and usually warns the user of a serious problem.
As we did in the previous code snippet, comment out the previous line and add the following code, as we
have done here:

The error message looks like this:

The following is a simple example that illustrates this technique:

Running this GUI code results in a popup whose user response can be used to branch on the answer of
this event-driven GUI loop, by saving it in the answer variable:
GUI_message_box_yes_no_cancel.py

Page 97 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

The console output using E clipse shows that clicking the Yes button results in the Boolean
value of True being assigned to the answer variable:

How to create independent message boxes


In this recipe, we will create our tkinter message boxes as standalone top -level GUI windows.
You will first notice that, by doing so, we end up with an extra window, so we will explore ways to hide
this window.
In the previous recipe, we invoked tkinter message boxes via our Help | About menu from our main GUI
form.
So, why would we wish to create an independent message box?
One reason is that we might customize our message boxes and reuse them in several of our GUIs. Instead
of having to copy and paste the same code into every Python GUI we design,
we can factor it out of our main GUI code. This can create a small reusable component which we can then
import into different Python GUIs.
Getting ready
We have already created the title of a message box in the previous recipe, Creating message boxes -
information, warning, and error. We will not reuse the code from the previous recipe but build a new GUI
using very few lines of Python code.
How to do it…
We can create a simple message box, as follows:

This will result in the following two windows:


GUI_independent_msg.py

This does not look like what we had in mind. Now, we have two windows, one undesired and the second
with its text displayed as its title.
Oops!
Let's solve this now. We can change the Python code by adding a single or double quote, followed by a
comma:
Page 98 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Now, we do not have a title but our text ended up inside the popup, as we had intended:
GUI_independent_msg_info.py

Page 99 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

The first parameter is the title and the second is the text displayed in the pop -up message box. By adding
an empty pair of single or double quotes, followed by a comma, we can move our text from the title into
the pop-up message box.
We still need a title and we definitely want to get rid of this unnecessary second window. The second
window is caused by a Windows event loop. We can get rid of it by suppressing it.
Add th e following code:

Now, we have only one window. The withdraw() function removes the debug window
that we are not interested in having floating around:
GUI_independent_msg_one_window.py

In order to add a title, all we have to do is place some string int o our empty first argument.

For example, consider the following code snippet:


Now our dialog has a title, as shown in the following screenshot:
GUI_independent_msg_one_window_title.py

Page 100 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

How to create the title of a tkinter window form


The principle of changing the title of a tkinter main root window is the same as what
we discussed in the previous recipe: How to create independent message boxes. We just pass in
a string as the first argument to the constructor of the widget.

Getting ready
Instead of a pop-up dialog window, we create the main root window and give it a title.

The following code creates the main window and adds a title to it. We have already done
in the previous recipes, for example, in Creating tabbed widgets , in Chapter 2, Layout
Management. Here we just focus on this aspect of our GUI:
import tkinter as tk
win = tk.Tk() # Create instance
win.title("Python GUI") # Add a title

This gives a title to the main root window by using the built -in tkinter title property.
After we create a Tk() instance, we can use all the built-in tkinter properties to customize
our GUI.

Changing the icon of the main root window


One way to customize our GUI is to give it an icon different from the default icon that ships
out of the box with tkinter. Here is how we do this.
We will use an icon that ships with Python but you can use any icon you find
useful. Make sure you have the full path to where the icon lives in your code, or you might
get errors.
For this example, I have copied the icon from where I i nstalled Python 3.6 to the same folder
where the code lives.

Page 101 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Place the following code somewhere above the main event loop:
# Change the main windows icon
win.iconbitmap('pyc.ico')
Note how the feather default icon in the top-left corner of the GUI changed:
GUI_icon.py
----------------------------------------------------------------------------------------------------------------------
------------------------------------
Using a spin box control
In this recipe, we will use a Spinbox widget, and we will als o bind the Enter key on the keyboard to one of
our widgets.
Getting ready
We will use our tabbed GUI and add a Spinbox widget above the ScrolledText control.
This simply requires us to increment the ScrolledText row value by one and to insert our new Spinb ox
control in the row above the Entry widget.
First, we add the Spinbox control. Place the following code above the ScrolledText
widget:
# Adding a Spinbox widget
spin = Spinbox(mighty, from_=0, to=10)
spin.grid(column=0, row=2)

This will modify our GUI as follows:


GUI_spinbox.py

Next, we will reduce the size of the Spinbox widget:


spin = Spinbox(mighty, from_=0, to=10, width=5)
Running the preceding code results in the following GUI: GUI_spinbox_small.py

Page 102 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Next, we add another property to customize our widget further; bd is a short-hand notation
for the borderwidth property:
spin = Spinbox(mighty, from_=0, to=10, width=5 , bd=8)
Running the preceding code results in the following GUI:
GUI_spinbox_small_bd.py

Here, we add functionality to the widget by creating a callback and linking it to the control.
This will print the selection of the Spinbox into ScrolledText as well as onto stdout.
The variable named scrol is our reference to the ScrolledText widget:
# Spinbox callback
def _spin():
value = spin.get()
print(value)
scrol.insert(tk.INSERT, value + 'n')
spin = Spinbox(mighty, from_=0, to=10, width=5, bd=8,
command=_spin)
Running the preceding code results in the following GUI:
GUI_spinbox_small_bd_scrol.py

Page 103 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Instead of using a range, we can also specify a set of values:


# Adding a Spinbox widget using a set of values
spin = Spinbox(mighty, values=(1, 2, 4, 42, 100), width=5, bd=8,
command=_spin)
spin.grid(column=0, row=2)
This will create the following GUI output:
GUI_spinbox_small_bd_scrol_values .py

Relief, sunken and raised appearance of widgets:


We can control the appearance of our Spinbox widgets by using a property that makes appear in different
sunken or raised formats.

We will add one more Spinbox control to demonstrate the available appe arances of widgets, using the
relief property of the Spinbox control.
First, let's increase the borderwidth to distinguish our second Spinbox from the first
Spinbox:
# Adding a second Spinbox widget
spin = Spinbox(mighty, values=(0, 50, 100), width=5, bd=2 0,
command=_spin)
spin.grid(column=1, row=2)
This will create the following GUI output:
GUI_spinbox_two_sunken.py

Page 104 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Both our preceding Spinbox widgets have the same relief style. The only difference is that our new widget
to the right of the first Spinbox has a much larger border width.
In our code, we did not specify which relief property to use, so the relief defaulted to
tk.SUNKEN.
We imported tkinter as tk. This is why we can call the relief property as
tk.SUNKEN.
Here are the available relief property options that can be set:
tk.SUNKEN tk.RAISED tk.FLAT tk.GROOVE tk.RIDGE
By assigning the different available options to the relief property, we can create different appearances for
this widget.
Assigning the tk.RIDGE relief and reducing the border width to the same value as our first
Spinbox widget results in the following GUI:
GUI_spinbox_two_ridge.py

First, we created a second Spinbox aligned in the second column (index == 1). It defaults to
SUNKEN, so it looks similar to our first Spinbox. We distinguished the two widgets by
increasing the border width of the second control (the one on the right).
Next, we explicitly set the relief property of the Spinbox widget. We made the border width the same as
our first Spinbox because, by giving it a different relief, the differences became visible without having to
change any other properties.
Here is an example of the different options:

Page 105 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Creating tooltips using Python


This recipe will show us how to create tooltips. When the user hovers the mouse over a widget, additional
information will be available in the form of a tooltip.
We will code this additional information into our GUI.
Add the following class just below the import statements:

In an Object Oriented Programming (OOP) approach, we create a new class in our Python module.
Python allows us to place more than one class into the same Python module and it also enables us to mix-
and-match classes and regular functions in the same module.
The preceding code does exactly this.
The ToolTip class is a Python class, and in order to use it, we have to instantiate it.

Page 106 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
This is the beginning of OOP programming in this book. This might appear a little bit advanced,
but do not worry; we will explain everything and it does actually work.
Consider adding the following code just below the creation of the Spinbox:
# Add a Tooltip
create_ToolTip(spin, 'This is a Spin control.')
Now, when we hover the mouse over the Spinbox widget, we get a tooltip, providing additional
information to the user:
GUI_tooltip.py

We call the function that creates the ToolTip, and then we pass in a reference to the widget and the text
we wish to display when we hover the mouse over the widget.
The rest of the recipes in this book will use OOP when it makes sense. Here, we've shown the simp lest
OOP example possible. As a default, every Python class we create inherits from the object base class.
Python, being the pragmatic programming language that it truly is, simplifies the class creation process.
We can write the following syntax:
class To olTip(object):
pass
We can also simplify it by leaving the default base class out:
class ToolTip():
pass
Similarly, we can inherit and expand any tkinter class.

Adding a progressbar to the GUI


In this recipe, we will add a Progressbar to our GUI. It is ve ry easy to add
a ttk.Progressbar, and we will demonstrate how to start and stop a Progressbar. This
recipe will also show you how to delay the stopping of a Progressbar and how to run it in
a loop.
Progressbar is typically used to show the current status o f a longrunning
process.
First, we add four buttons into LabelFrame on Tab 2, replacing the labels that were there
before. We set the Labelframe text property to ProgressBar.
We then place a ttk.Progressbar widget below all other widgets on Tab 2 and align this
new widget with the other widgets.
Our GUI now looks as follows:
GUI_progressbar.py

Page 107 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

We connect each of our four new buttons to a new callback function, which we assign to their command
property:

Clicking the Run Progressbar button will run the Progressbar from the
left to the right, then the Progressbar will stop there, and the green bar
will disappear.
Here is the code:

Clicking the Start Progressbar button will start the Progressbar. The Progressbar will
run to the end, and then it will start all over from the left, in an endless loop:
def start_progressbar():
progress_bar.start()
In order to stop this endless loop of our progressbar widget, we simply create another
callback function and assign it to one of our buttons:
def stop_progressbar():
progress_bar.stop()
As soon as we click the Stop Progressbar button, our Progressbar will stop and it will
reset itself to the beginning, making it invisible. We no longer see a green bar inside
the Progressbar.
If we click the Run Progressbar button and then click the Stop

Page 108 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
Progressbar button, the progress of the bar will temporarily halt, but then the
loop will run to completion and so will the ProgressBar.
We can also delay the stopping of the running ProgressBar. While we might expect that a
sleep statement would do the trick, it does not. Instead, we have to use the after
function of tkinter, as follows: def progressbar_stop_after(wait_ms=1000):
win.after(wait_ms, progress_bar.stop)
Coding it this way will stop the running ProgressBar when we click this button after the time
specified in the wait_ms variable, in milliseconds.
How to use the canvas widget
This recipe shows how to add dramatic color effects to our GUI by using the tkinter canvas widget. We
will improve our previous code from GUI_tooltip.py, and we'll improve the look of our GUI by adding some
more colors to it.
First, we will create a third tab in our GUI in order to isolate our new code.
Here is the code to create the new third tab:
tabControl = ttk.Notebook(win) # Create Tab Control
tab1 = ttk.Frame(tabControl) # Create a tab
tabControl.add(tab1, text='Tab 1') # Add the tab tab2
= ttk.Frame(tabControl) tabControl.add(tab2,
text='Tab 2') # Add a second tab tab3 =
ttk.Frame(tabControl)
tabControl.add(tab3, text='Tab 3') # Add a third tab
tabControl.pack(expand=1, fill="both") # Pack to make tabs visible
Next, we use another built-in widget of tkinter: Canvas. A lot of people like this widget because
it has powerful capabilities:
# Tab Control 3 -------------------------------
tab3_frame = tk.Frame(tab3, bg='blue')
tab3_frame.pack() for orange_color in
range(2):
canvas = tk.Canvas(tab3_frame, width=150, height=80, highlightthickness=0,
bg='orange')
canvas.grid(row=orange_color, column=orange_color)

After we have created the new tab, we place a regular tk.Frame into it and assign it a background color of
blue. In the loop, we create two tk.Canvas widgets, making their color orange and assigning them to grid
coordinates 0,0 and 1,1. This also makes the blue background color of the tk.Frame visible in the two
other grid locations.
The following screenshot shows the result created by running the preceding code and clicking on the new
Tab 3. It really is orange and blue when you run the code. In a noncolored printed book, this might not be
visually obvious, but those colors are true; you can trust me on this.
You can check out the graphing and drawing capabilities by searching online. I will not go deeper into this
widget in this book (but it is very cool):
GUI_canvas.py

Page 109 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

CHAPTER IV: STORING DATA IN OUR MYSQL DATABASE VIA OUR GUI

Topics covered: Connecting to a MySQL database from Python, Configuring the MySQL connection,
Designing the Python GUI database, Using the INSERT command, Using the UPDATE command, Using the
DELETE command, Storing and retrieving data from MySQL database.
----------------------------------------------------------------------------------------------------------------------
-----------------------------------
Before using mysql with python we need to install mysql first and mysqlconnector for python.

Page 110 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Connecting to a MySQL database from Python:


Installing and connecting to a MySQL server from Python
Before we can connect to a MySQL database, we have to connect to the MySQL Server. In order to do
this, we need to know the IP address of the MySQL server as well as the port it is listening on.
We also have to be a registered user with a password in order to get authenticated by the MySQL server.

You will need to have access to a running MySQL Server instance and you also need to
have administrator privileges in order to crea te databases and tables.
There is a free MySQL Community Edition available from the official MySQL website. You
can download and install it on your local PC from h t t p ://d e v . m y s q l . c o m /d o w n l o a d s /w i n
d o w s /i n s t a l l e r /5. 7. h t m l :

During the installation process, you will choose a password for the Root user, and you can also add more
users. I recommend you add yourself as a DB Admin and choose a password as well:
Note: if you set password during installation remember that for further use.

Page 111 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Note : you can add user account to mysql , or you can use its inbuilt root user account.
After installing mysql we need to install mysql connector for python .
Before installing python connector first check version of your python .so no compatibility
issues will be there .
In order to connect to MySQL, we first need to install a special Python connector driver.
This driver will enable us to talk to the MySQL server from Python. There is a freely available driver on the
MySQL website and it comes with a very nice online tutorial:
h t t p ://d e v . m y s q l . c o m /d o c /c o n n e c t o r - p y t h o n /e n /i n d e x . h t m l
At the time of writing this book, this MySQL connector has not yet been updated to Python 3.6, so we wil l
follow a slightly different approach.
From h t t p ://w w w . l f d . u c i . e d u /~g o h l k e /p y t h o n l i b s /#m y s q l c l i e n t , we can
download apackage that lets us talk to our MySQL server via Python 3.6:

One way to verify that we have installed the correct driver and that it lets Python talk to
MySQL, is by looking into the Python site-packages directory. If your site-packages directory

Page 112 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
has a new MySQLdb folder as well as some other _mysql modules, the installation was
successful:

First, let's verify that our MySQL server installation works by using the MySQL Command
Line Client. At the mysql> prompt, type SHOW DATABASES; then press Enter:

Page 113 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Replace the placeholder bracketed names <adminUser> and <adminPwd>


with the real credentials you are using in your MySQL installation.
import MySQLdb as mysql
conn = mysql.connect(user=<adminUser>, password=<adminPwd>,
host='127.0.0.1')
print(conn)
conn.close()

If you are not able to connect to the MySQL server via the Command Line Client or the
Python mysqlclient, then something probably went wrong during the installation. If this is
the case, try uninstalling, rebooting your PC, and then running the installation again.

Configuring the MySQL database connection


First, we create a dic tionary in the same module of the GUI_MySQL_class.py code:
# create dictionary to hold connection info
dbConfig = {
'user': <adminName>, # use your admin name
'password': <adminPwd>, # not the real password
'host': '127.0.0.1', # IP address of localhost
}

Page 114 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
Next, in the connection method, we unpack the dictionary values. Take a look at the
following code snippet: mysql.connect('user': <adminName>, 'password':
<adminPwd>, 'host':
'127.0.0.1')
Instead of using the preceding snippet, we use (**dbConfig), which achieves the same thing
as the preceding one but is much shorter:
import MySQLdb as mysql #
unpack dictionary credentials conn
= mysql.connect(**dbConfig)
print(conn)

import GuiDBConfig as guiConf


# unpack dictionary credentials
conn = mysql.connect(**guiConf.dbConfig)
print(conn)
Once we place this module into a secure place, separated from the rest of
the code, we have achieved a better level of security for our MySQL data.
Now that we know how to connect to MySQL and have administrator privileges, we can
create our own database by issuing the following commands:
GUIDB = 'GuiDB'
# unpack dictionary credentials
conn = mysql.connect(**guiConf.dbConfig)
cursor = conn.cursor()
try:
cursor.execute("CREATE DATABASE {}
DEFAULT CHARACTER SET 'utf8'".format(GUIDB))
except mysql.Error as err:
print("Failed to create DB: {}".format(err))
conn.close()
In order to execute commands to MySQL, we create a cursor object from the connection
object.

A cursor is usually a place in a specific row in a database table, which we move up or down the table, but
here, we use it to create the database itself. We wra p the Python code into a try...except block and use
the built-in error codes of MySQL to tell us if anything went wrong.
We can verify that this block works by executing the database -creating code twice. The first time, it will
create a new database in MySQL, and the second time, it will print out an error message stating that this
database already exists:
MySQL_create_DB.py

This results in the same successful connection to the MySQL server, but the difference is that
the connection method no longer exposes any mission-critical information:

Page 115 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

We can verify which databases exist by executing the following MySQL command using the
very same cursor object syntax. Instead of issuing the CREATE DATABASE command we create
a cursor and use it to execute the SHOW DATABASES command, the result of which we fetch
and print to the console output:

import MySQLdb as mysql import


GuiDBConfig as guiConf

Page 116 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
# unpack dictionary credentials conn =
mysql.connect(**guiConf.dbConfig) cursor
= conn.cursor() cursor.execute("SHOW
DATABASES")
print(cursor.fetchall())
conn.close()
Designing the Python GUI database
Before we start creating tables and inserting data into them, we have to design the database. Unlike
changing local Python variable names, changing a database schema once it has been created and loaded
with data is not that easy.
We would have to DROP the table, which means we would lose all the data that was in the table. So,
before dropping a table, we would have to extract the data, then DROP the table, recreate it, and finally
reimport the original data.
You get the picture...
Designing our GUI MySQL database means first thinking about what we want our Python application to do
with it and then choosing names for our tables that match the intended purpose.
Our refactored Python GUI now looks like the following screenshot. We have renamed the first tab as
MySQL and created two tkinter LabelFrame widgets. We labeled the one on the top Python database and
it contains two labels and six tkinter entry widgets plus three buttons, which we aligned in four rows and
three columns using the tkinter grid layout manager. We will enter book titles and pages into the entry
widgets, and clicking the buttons will result in either inserting, retrieving, or modifying book quotations.
The LabelFrame at the bottom has a label of Book Quotation and the ScrolledText widget that is part of
this frame will display our books and quotations:
GUI_MySQL.py

We will create two SQL tables to hold our data. The first will hold the data for the book title and book
page, and then, we will join with the second table, which will hold the book quotation. We will link the two
tables together via primary to foreign key relations.
So, let's create the first database table now. Before we do that, let's verify first that our database does,
indeed, have no tables. According to the online MySQL documentation, the command to view the tables
that exist in a database is as follows:

Page 117 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
14.7.5.37 SHOW TABLES Syntax

SHOW [FULL] TABLES [{FROM | IN} db_name]


[LIKE 'pattern' | WHERE expr]

It is important to note that, in the preceding syntax, arguments in square brackets, such as FULL, are
optional while arguments in curly braces, such as FROM, are required for the SHOW TABLES command.
The pipe symbol between FROM and IN means that the MySQL syntax requires one or the other:
# unpack dictionary credentials
conn = mysql.connect(**guiConf.dbConfig)
# create cursor
cursor = conn.cursor()
# execute command
cursor.execute("SHOW TABLES FROM guidb")
print(cursor.fetchall())
# close connection to MySQL
conn.close()

When we execute the SQL command in Python, we get the expected result, which is an empty tuple
showing us that our database currently has no tables:
GUI_MySQL_class.py

We can also first select the database by executing the USE <DB> command and then we
don't have to pass it into the SHOW TABLES command because we have already selected the
database we want to talk to. The following code creates the same true result as the previous
one:
cursor.execute("USE guidb")
cursor.execute("SHOW TABLES")

Now that we know how to verify that our database has no tables, let's create some. After we have created
two tables, we will verify that they have truly made it into our database by using the same commands as
before.
We create the first table, named Books, by executing the following code:

# connect by unpacking dictionary credentials


conn = mysql.connect(**guiConf.dbConfig)
# create cursor
cursor = conn.cursor()
# select DB
cursor.execute("USE guidb")
# create Table inside DB
cursor.execute("CREATE TABLE Books (
Book_ID INT NOT NULL AUTO_INCREMENT,
Book_Title VARCHAR(25) NOT NULL,
Book_Page INT NOT NULL,

Page 118 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
PRIMARY KEY (Book_ID)
) ENGINE=InnoDB")
# close connection to MySQL
conn.close()

If you remember the password you assigned to the root user during the installation, you
can then run the SHOW COLUMNS FROM books; command, as shown in the following
screenshot. This will display the columns of our books table from our guidb:

Page 119 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

#select DB
cursor.execute("USE guidb")
# create second Table inside DB
cursor.execute("CREATE TABLE Quotations (
Quote_ID INT,
Quotation VARCHAR(250),
Books_Book_ID INT,
FOREIGN KEY (Books_Book_ID)
REFERENCES Books(Book_ID)
ON DELETE CASCADE
) ENGINE=InnoDB")

Executing the SHOW TABLES command now shows that our database has two tables:
GUI_MySQL_class.py

We can see the columns by executing the SQL command using Python:
GUI_MySQL_class.py

Using the MySQL client might present the data in a better format. We could also use Python's
pretty print (pprint) feature:
GUI_MySQL_class.py

Page 120 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

----------------------------------------------------------------------------------------------------------------------
Using the SQL INSERT command
After creating the database and tables, we will insert data into the two tables.
import MySQLdb as mysql
import Ch07_Code.GuiDBConfig as guiConf
class MySQL():
# class variable
GUIDB = 'GuiDB'
#------------------------------------------------------
def connect(self):
# connect by unpacking dictionary credentials
conn = mysql.connector.connect(**guiConf.dbConfig)
# create cursor
cursor = conn.cursor()
return conn, cursor
#------------------------------------------------------
def close(self, cursor, conn):
# close cursor
#------------------------------------------------------
def showDBs(self):
# connect to MySQL
#------------------------------------------------------
def createGuiDB(self):
# connect to MySQL
#------------------------------------------------------
def dropGuiDB(self):
# connect to MySQL
#------------------------------------------------------
def useGuiDB(self, cursor):
'''Expects open connection.'''
# select DB
#------------------------------------------------------
def createTables(self):
# connect to MySQL
# create Table inside DB
#------------------------------------------------------ def
dropTables(self):
# connect to MySQL
#------------------------------------------------------
def showTables(self):

Page 121 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
# connect to MySQL
#------------------------------------------------------ def
insertBooks(self, title, page, bookQuote):
# connect to MySQL
# insert data
#------------------------------------------------------
def insertBooksExample(self):
# connect to MySQL
# insert hard-coded data
#------------------------------------------------------
def showBooks(self):
# connect to MySQL
#------------------------------------------------------
def showColumns(self):
# connect to MySQL
#------------------------------------------------------
def showData(self):
# connect to MySQL
#------------------------------------------------------
if __name__ == '__main__':
# Create class instance
mySQL = MySQL()
Running the preceding code creates the following tables and data in the database we
Created:

----------------------------------------------------------------------------------------------------------------------
Using the SQL UPDATE command
This recipe will use the code from the previous recipe, Using the SQL INSERT command, explain it in more
detail, and then extend the code to update our data. In order to update the data that we previously
inserted into our MySQL database tables, we use the SQL UPDATE command.

import MySQLdb as mysql


import Ch07_Code.GuiDBConfig as guiConf
Page 122 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
class MySQL(): #
class variable
GUIDB = 'GuiDB'
#------------------------------------------------------
def showData(self): # connect to MySQL
conn, cursor = self.connect()
self.useGuiDB(cursor)
# execute command
cursor.execute("SELECT * FROM books")
print(cursor.fetchall())
cursor.execute("SELECT * FROM quotations")
print(cursor.fetchall())
# close cursor and connection
self.close(cursor, conn)
#==========================================================
if __name__ == '__main__':
# Create class instance
mySQL = MySQL()
mySQL.showData()

We might not agree with the Gang of Four, so let's change their famous programming

The Gang of Four are the four authors who created the world -famous book called Design Patterns, which
strongly influenced our entire software industry to recognize, think, and code using software design
patterns.
We will do this by updating our database of favorite quotes. First, we retrieve the primary key value by
searching for the book title and then we pass that value into our search for the quote:
#------------------------------------------------------
def updateGOF(self):
# connect to MySQL
conn, cursor = self.connect()
self.useGuiDB(cursor)
# execute command
cursor.execute("SELECT Book_ID FROM books WHERE Book_Title =
'Design Patterns'")
primKey = cursor.fetchall()[0][0]
print("Primary key=" + str(primKey))
cursor.execute("SELECT * FROM quotations WHERE Books_Book_ID =
(%s)", (primKey, ))
print(cursor.fetchall())
# close cursor and connection
self.close(cursor, conn)
#==========================================================
if __name__ == '__main__':
mySQL = MySQL() # Create class instance
mySQL.updateGOF()

quote.

Page 123 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

o/p:

Now that we know the primary key of the quote, we can update the quote by executing the
following commands:
#------------------------------------------------------
def showDataWithReturn(self):
# connect to MySQL
conn, cursor = self.connect()
self.useGuiDB(cursor)
# execute command
cursor.execute("SELECT Book_ID FROM bo oks WHERE Book_Title =
'Design Patterns'")
primKey = cursor.fetchall()[0][0]
print(primKey)
cursor.execute("SELECT * FROM quotations WHERE Books_Book_ID =
(%s)", (primKey, ))
print(cursor.fetchall())
cursor.execute("UPDATE quotations SET Quotation =
(%s) WHERE Books_Book_ID = (%s)",
("Pythonic Duck Typing: If it walks like a duck and
talks like a duck it probably is a duck...",
primKey))
# commit transaction
conn.commit ()
cursor.execute("SELECT * FROM quotations WHERE Books_Book_ID =
(%s)", (primKey, ))
print(cursor.fetchall())
# close cursor and connection
self.close(cursor, conn)
#==========================================================
if __name__ == '__main__':
# Create class instance
mySQL = MySQL()
#------------------------
mySQL.updateGOF()
book, quote = mySQL.showDataWithReturn()
print(book, quote)

Page 124 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

Using the SQL DELETE command


In this recipe, we will use the SQL DELETE command to delete the data we created in the
previous recipe, Using the SQL UPDATE command.
While deleting data might at first sight sound trivial, once we get a rather large database
design in production, things might not be that easy any more.
Because we have designed our GUI database by relating two tables via a primary to foreign
key relation, when we delete certain data, we do not end up with orphan records because
this database design takes care of cascading deletes.

# No FOREIGN KEY relation to Books Table


cursor.execute("CREATE TABLE Quotations (
Quote_ID INT AUTO_INCREMENT,
# create second Table inside DB --
Quotation VARCHAR(250),
Books_Book_ID INT,
PRIMARY KEY (Quote_ID)
) ENGINE=InnoDB")

Page 125 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

After inserting data into the books and quotations tables, if we execute a DELETE
statement, we are only deleting the book with Book_ID 1 while the related quotation
with the Books_Book_ID 1 is left behind.
This in an orphaned record. There no longer exists a book record that has a Book_ID of 1:

This situation can create a mess, which we avoid by using cascading deletes.

We do this in the creation of the tables by adding certain d atabase constraints. When we
created the table that holds the quotations in a previous recipe, we created our quotations
table with a foreign key constraint that explicitly references the primary key of the books
table, linking the two:

# create second Table inside DB


cursor.execute("CREATE TABLE Quotations (
Quote_ID INT AUTO_INCREMENT,
Quotation VARCHAR(250),
Books_Book_ID INT,
PRIMARY KEY (Quote_ID),
FOREIGN KEY (Books_Book_ID)
REFERENCES Books(Book_ID)
ON DELETE CASCADE
) ENGINE=InnoDB")
The FOREIGN KEY relation includes the ON DELETE CASCADE attribute, which basically
tells our MySQL server to delete related records in this table when the records that this
foreign key relates to are deleted.
Without specifying the ON DELETE CASCADE attribute in the c reation of
our table we can neither delete nor update our data because an UPDATE is
a DELETE followed by an INSERT.

Because of this design, no orphan records will be left behind, which is what we want.
In MySQL, we have to specify ENGINE=InnoDB on both t he related tables
in order to use primary to foreign key relations.
Let's display the data in our database:
#==========================================================
if __name__ == '__main__': # Create class instance mySQL = MySQL() mySQL.showData()
This shows us the following data in our database tables:
Page 126 of 113
PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

GUI_MySQL_class.py
This shows us that we have two records that are related via primary to foreign key relationships.
When we now delete a record in the books table, we expect the related record in the quotations
table to also be deleted by a cascading delete. Let's try this by executing the following SQL
commands in Python:
import MySQLdb as mysql
import Ch07_Code.GuiDBConfig as guiConf
class MySQL():
#--------------------------------------------------- ---
def deleteRecord(self):
# connect to MySQL
conn, cursor = self.connect()
self.useGuiDB(cursor)
# execute command
cursor.execute("SELECT Book_ID FROM books WHERE Book_Title =
'Design Patterns'")
primKey = cursor.fetchall()[0][0]
# print(primKey)
cursor. execute("DELETE FROM books WHERE Book_ID = (%s)",
(primKey, ))
# commit transaction
conn.commit ()
# close cursor and connection
self.close(cursor, conn)
#==========================================================
if __name__ == '__main__':
# Create class instance
mySQL = MySQL()
#------------------------
mySQL.deleteRecord()
mySQL.showData()

Storing and retrieving data from our MySQL

database

We will use our Python GUI to insert data into our MySQL database tables. We have already

refactored the GUI we built in the previous recipes in our preparation for connecting and

using a database.

Page 127 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
We will use two textbox entry widgets into which we can type the book or journal title and the page number.

We will also use a ScrolledText widget to type our favorite book quotations into, which we will then store in

our MySQL database.

In order to make the buttons do something, we will connect them to callback functions as

we did in the previous recipes. We will display the data in the ScrolledText widget

below the buttons.

In order to do this, we will import the MySQL.py module, as we did before. The entire code

that talks to our MySQL server instance and database resides in this module, which is a

form of encapsulating the code in the spirit of object -oriented programming.

We connect the Insert Quote button to the following callback function:

# Adding a Button

self.action = ttk.Button(self.mySQL, text="Insert Quote",

command=self.insertQuote)

self.action.grid(column=2, row=1)

# Button callback def

insertQuote(self):

Page 128 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
title = self.bookTitle.get()
page = self.pageNumber.get() quote

= self.quote.get(1.0, tk.END)

print(title)

print(quote)

self.mySQL.insertBooks(title, page, quote)

When we now run our code, we can insert data from our Python GUI into our MySQL

database:

GUI_MySQL.py

After entering a book title and book page plus a quotation from the book or movie, we insert the data into
our database by clicking the Insert Quote button.

Our current design allows for titles, pages, and a quotation. We can also insert our favorite quotations
from movies. While a movie does not have pages, we can use the page column to insert the approximate
time when the quotation occurred within the movie.

Page 129 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR

After inserting the data, we can verify that it made it into our two MySQL tab les by clicking

the Get Quotes button, which then displays the data we inserted into our two MySQL

database tables, as shown in the preceding screenshot.

Clicking the Get Quotes button invokes the callback method we associated with the button

click event. This gives us the data that we display in our ScrolledText widget:

# Adding a Button

self.action1 = ttk.Button(self.mySQL, text="Get Quotes",

command=self.getQuote)

self.action1.grid(column=2, row=2)

# Button callback

def getQuote(self):

allBooks = self.mySQL.showBooks()

print(allBooks)

self.quote.insert(tk.INSERT, allBooks)

We use the self.mySQL class instance variable to invoke the showBooks() method, which is a part of the
MySQL class we imported:

Page 130 of 113


PYTHON PROGRAMMING SYIT SEM III UNIT V NOTES BY: PROF.AJAY PASHANKAR
from Ch07_Code.GUI_MySQL_class import MySQL
class OOP(): def

__init__(self):

# create MySQL instance


self.mySQL = MySQL()

class MySQL():

#------------------------------------------------------

def showBooks(self):

# connect to MySQL

conn, cursor = self.connect()

self.useGuiDB(cursor)

# print results

cursor.execute("SELECT * FROM Books")

allBooks = cursor.fetchall()

print(allBooks)

# close cursor and connection

self.close(cursor, conn)

return allBooks

Page 131 of 113

You might also like