CSC401: Introducing Python

Scripting Languages

Fundamental tradeoff between:

How quickly correct code can be written

How quickly that code executes

People are expensive

Makes sense to write:

Time-critical libraries at a low level for speed

Everything else at the highest possible level

Functionality tradeoff:

Fast access to OS interface - excludes Java, ...

Convenient for data manipulation from general files (RegEx) - excludes C, ...

Power of high-level languages (data structures, control, etc.) - excludes Shell

Scripting Languages: Perl, Python, Tcl/Tk

Python

Pro:

Like the Unix shell, only better

(Much) more readable than Perl

Object-oriented

But not religious about it

Easy to integrate with C, Fortran, Java

Intuitive - borrowed the best from many languages

A good compromise between scripting and traditional languages

(Quite) orthogonal

better than C (in terms of side-effects)

better than Perl

still less orthogonal than Prolog and even C in some aspects (number of primitives)

Con:

Slower than C

But often as fast as Java

Things that make small programs easy to write can make large ones hard to maintain

A Python Program

# Run with "python helloworld.py"

# Assign a string to a variable.
# Note: no 'main()', no declarations
str = "Hello"

# Print strings (plus newline).
print str, "world!"
prints "Hello world!\n"

# Print strings (plus space).
print str, "world!",
prints "Hello world! "

# Print strings (without newline or space).
import sys;
sys.stdout.write(str + " world!")
sys.stdout.flush();
prints "Hello world!"

Running Python

Interactively (good for debugging)

By putting code in file, and loading it

$ python myfile.py

By making a native executable

Unix: #!/usr/bin/env python

Windows: File association

By compiling to a self-contained program

Instructions are still actually interpreted

Interactive Use

$ python
>>> 3+5
8
>>> x = 3 * 7 ** 2
>>> print x
147
>>> x = "some" + "thing"
>>> print x
something

Variables

Variables are just names for values

Created by use

No declarations

Variables don't have types, but values do

x = 123                # integer
y = "one two three"    # string
z = x + y
TypeError: unsupported operand types for +

Must Define Before Use

Must give a variable a value before using it

Python doesn't try to guess a sensible value

# This is the whole program
print y
NameError: name 'y' is not defined

See how to handle errors later

Quoting Strings

Use either single or double quotes

Must be consistent

Newlines must be escaped with backslashes

print 'Always', "plan", '"ahea\
d"'
Always plan "ahead"
print "ahea
d"
SyntaxError: invalid token

Use triple quotes to represent long strings

Newlines need not be escaped

print """Poetic em
phas
is"""
Poetic em
phas
is

Back-quoting converts value to string

print "carbon-" + 14
TypeError: cannot concatenate 'str' and 'int' objects
print "carbon-" + `14`
carbon-14

Typecast converts value to integer

print "1" + 1
TypeError: cannot concatenate 'str' and 'int' objects
print int("1") + 1
2

Numbers and Arithmetic

The usual numeric types

14 is an integer (32-bit on most machines)

14.0 is floating point (64-bit)

1+4j is complex (2 x 64-bit)

print (1 + 2j) * (2 - 3j)
(8+1j)

Python borrows C's numeric operators

Including in-place forms

x  = 5 * 4 + 3    # x now 23
x -= 10           # x now 13
y  = x % 3        # remainder is 1

Booleans

Values:

True and False are true and false (d'oh)

Empty string, empty list [], empty dict {}, 0, and None are false

(Almost) everything else is true

Usual Boolean operators (and, or, not)

Short-circuit

Return the last thing evaluated, rather than 1 or 0

What is the result of each of the following statements?

print "a" or "b"
a
print 0 or "a"
a
print "a" and "b"
b
print "a" and 0 and 1 and (1/0)
0
print "a" and "0" and 1 and (1/0)
ZeroDivisionError: integer division or modulo by zero

Comparisons

Python borrows C's comparisons

Results are always 1 (true) or 0 (false)

= is assignment, == is equality

Assignment is a statement, not an expression

Strings are compared in dictionary order

print 3 < 5, 2.1 >= 2.2, "a" < "A", "Abc" < "AB"
True False False False

Comparisons can be chained together, as in mathematics

print -1 < 0 < 1
True

String Operators

Use + for concatention, * for multiplication

greet = "Hi " + "there"
Hi there
jolly = "ho" * 3
hohoho

Conditionals

if, elif, and else

Use colon and indentation to show nesting

a = 3
if a < 0:
    print "less"
elif a == 0:
    print "equal"
else:
    print "greater"
greater

Why Indentation?

Based on studies from 1980s

It's what everyone looks at anyway

Just count the number of warnings in C/Java books about misleading indentation

While Loops

Use colon and indentation to show nesting

a = 3
while a > 0:
    print a
    a -= 1
3
2
1

Files

Use built-in function file() to open a file

First argument is path

Second is "r" (for read) or "w" for write

Result is a file object with methods for input and output

# Copy one file to another
input = file("file.txt", "r")    # open file.txt for reading
output = file("copy.txt", "w")   # open copy.txt for writing
line = input.readline()          # get first line
while line:                      # 'None' indicates end-of-file
    output.write(line)           # copy line to output
    line = input.readline()      # try for another line
input.close()                    # don't need file any longer
output.close()                   # we're done

Could also write this as:

input = file("file.txt", "r")
output = file("copy.txt", "w")
for line in input:
    output.write(line)
input.close()
output.close()

Or:

input = file("file.txt", "r")
contents = input.readlines()
input.close()
output = file("copy.txt", "w")
output.writelines(contents)
output.close()

Reading from STDIN

Use input()

x=input("Enter a number: ")
Enter a number: 20
print "You have entered", x
You have entered 20

For entering strings, use raw_input()

s=raw_input("What's your name? ")
What's your name? John
print "Hello,",s,"!"
Hello, John !

More on Files and Printing

Let's say we have a file "a.txt" with 3 lines of text

line 1
line 2
line 3

This will work fine:

import sys
inputfile = file("a.txt","r")
line = inputfile.readline()
while line:
    sys.stdout.write(line)
    line = inputfile.readline()
inputfile.close()
line 1
line 2
line 3

How about this?

inputfile = file("a.txt","r")
line = inputfile.readline()
while line:
    print line
    line = inputfile.readline()
inputfile.close()
line 1

line 2

line 3

Maybe this will solve the print problem?

inputfile = file("a.txt","r")
lines = inputfile.readlines()
print(lines)
['line 1\n', 'line 2\n', 'line 3\n', '\n']

Slides originally created by Greg Wilson. Initial adaptation for CSC401 by David James. Revisions by Michelle Craig, Michael Szamosi, Karen Reid, and David James. Revisions for CSC401 Winter 2006 by Cosmin Munteanu.