Hello, World!
Variables and Types
Lists
Basic Operators
String Formatting
Basic String Operations
Conditions
Loops
Functions
Classes and Objects
Dictionaries
Modules and Packages
Hello, World! Python is a very simple language, and has a very straightforward
syntax. It encourages programmers to program without boilerplate (prepared) code.
The simplest directive in Python is the "print" directive - it simply prints out
a line (and also includes a newline, unlike in C).
There are two major Python versions, Python 2 and Python 3. Python 2 and 3 are
quite different. This tutorial uses Python 3, because it more semantically correct
and supports newer features. For example, one difference between Python 2 and 3
is the print statement. In Python 2, the "print" statement is not a function, and
therefore it is invoked without parentheses. However, in Python 3, it is a function,
and must be invoked with parentheses.
Indentation
Python uses indentation for blocks, instead of curly braces. Both tabs and spaces
are supported, but the standard indentation requires standard Python code to use
four spaces. For example:
x = 1
if x == 1:
# indented four spaces
print("x is 1.")
Numbers
Python supports two types of numbers - integers and floating point numbers. (It
also supports complex numbers, which will not be explained in this tutorial).
To define an integer, use the following syntax:
myint = 7
print(myint)
To define a floating point number, you may use one of the following notations:
myfloat = 7.0
print(myfloat)
myfloat = float(7)
print(myfloat)
The difference between the two is that using double quotes makes it easy to include
apostrophes (whereas these would terminate the string if using single quotes)
There are additional variations on defining strings that make it easier to include
things such as carriage returns, backslashes and Unicode characters. These are
beyond the scope of this tutorial, but are covered in the Python documentation.
Simple operators can be executed on numbers and strings:
one = 1
two = 2
three = one + two
print(three)
hello = "hello"
world = "world"
helloworld = hello + " " + world
print(helloworld)
Assignments can be done on more than one variable "simultaneously" on the same
line like this
a, b = 3, 4
print(a,b)
The target of this exercise is to create a string, an integer, and a floating point
number. The string should be named mystring and should contain the word "hello".
The floating point number should be named myfloat and should contain the number
10.0, and the integer should be named myint and should contain the number 20.
Solution
# testing code
if mystring == "hello":
print("String: %s" % mystring)
if isinstance(myfloat, float) and myfloat == 10.0:
print("Float: %f" % myfloat)
if isinstance(myint, int) and myint == 20:
print("Integer: %d" % myint)
Lists
Lists are very similar to arrays. They can contain any type of variable, and they
can contain as many variables as you wish. Lists can also be iterated over in a
very simple manner. Here is an example of how to build a list.
mylist = []
mylist.append(1)
mylist.append(2)
mylist.append(3)
print(mylist[0]) # prints 1
print(mylist[1]) # prints 2
print(mylist[2]) # prints 3
Accessing an index which does not exist generates an exception (an error).
mylist = [1,2,3]
print(mylist[10])
Exercise
In this exercise, you will need to add numbers and strings to the correct lists
using the "append" list method. You must add the numbers 1,2, and 3 to the "numbers"
list, and the words 'hello' and 'world' to the strings variable.
You will also have to fill in the variable second_name with the second name in
the names list, using the brackets operator []. Note that the index is zero-based,
so if you want to access the second item in the list, its index will be 1.
numbers = []
strings = []
names = ["John", "Eric", "Jessica"]
# this code should write out the filled arrays and the second name in the names
list (Eric).
print(numbers)
print(strings)
print("The second name on the names list is %s" % second_name)
Solution
numbers = []
strings = []
names = ["John", "Eric", "Jessica"]
strings.append("hello")
strings.append("world")
second_name = names[1]
# this code should write out the filled arrays and the second name in the names
list (Eric).
print(numbers)
print(strings)
print("The second name on the names list is %s" % second_name)
Basic Operators
Arithmetic Operators
Just as any other programming languages, the addition, subtraction, multiplication,
and division operators can be used with numbers.
number = 1 + 2 * 3 / 4.0
print(number)
Try to predict what the answer will be. Does python follow order of operations?
Another operator available is the modulo (%) operator, which returns the integer
remainder of the division. dividend % divisor = remainder.
remainder = 11 % 3
print(remainder)
Using two multiplication symbols makes a power relationship.
squared = 7 ** 2
cubed = 2 ** 3
lotsofhellos = "hello" * 10
print(lotsofhellos)
even_numbers = [2,4,6,8]
odd_numbers = [1,3,5,7]
all_numbers = odd_numbers + even_numbers
print(all_numbers)
Just as in strings, Python supports forming new lists with a repeating sequence
using the multiplication operator:
print([1,2,3] * 3)
Exercise
The target of this exercise is to create two lists called x_list and y_list, which
contain 10 instances of the variables x and y, respectively. You are also required
to create a list called big_list, which contains the variables x and y, 10 times
each, by concatenating the two lists you have created.
x = object()
y = object()
# TODO: change this code
x_list = [x]
y_list = [y]
big_list = []
print("x_list contains %d objects" % len(x_list))
print("y_list contains %d objects" % len(y_list))
print("big_list contains %d objects" % len(big_list))
# testing code
if x_list.count(x) == 10 and y_list.count(y) == 10:
print("Almost there...")
if big_list.count(x) == 10 and big_list.count(y) == 10:
print("Great!")
Solution
x = object()
y = object()
# testing code
if x_list.count(x) == 10 and y_list.count(y) == 10:
print("Almost there...")
if big_list.count(x) == 10 and big_list.count(y) == 10:
print("Great!")
String Formatting
Python uses C-style string formatting to create new, formatted strings. The "%"
operator is used to format a set of variables enclosed in a "tuple" (a fixed size
list), together with a format string, which contains normal text together with
"argument specifiers", special symbols like "%s" and "%d".
Let's say you have a variable called "name" with your user name in it, and you
would then like to print(out a greeting to that user.)
Any object which is not a string can be formatted using the %s operator as well.
The string which returns from the "repr" method of that object is formatted as
the string. For example:
Exercise
You will need to write a format string which prints out the data using the following
syntax:Hello John Doe. Your current balance is $53.44.
Strings are bits of text. They can be defined as anything between quotes:
As you can see, the first thing you learned was printing a simple sentence. This
sentence was stored by Python as a string. However, instead of immediately printing
strings out, we will explore the various things you can do to them. You can also
use single quotes to assign a string. However, you will face problems if the value
to be assigned itself contains single quotes.For example to assign the string in
these bracket(single quotes are ' ') you need to use double quotes only like this
astring = "Hello world!"
print("single quotes are ' '")
print(len(astring))
That prints out 12, because "Hello world!" is 12 characters long, including
punctuation and spaces.
That prints out 4, because the location of the first occurrence of the letter "o"
is 4 characters away from the first character. Notice how there are actually two
o's in the phrase - this method only recognizes the first.
But why didn't it print out 5? Isn't "o" the fifth character in the string? To
make things more simple, Python (and most other programming languages) start things
at 0 instead of 1. So the index of "o" is 4.
For those of you using silly fonts, that is a lowercase L, not a number one. This
counts the number of l's in the string. Therefore, it should print 3.
This prints a slice of the string, starting at index 3, and ending at index 6.
But why 6 and not 7? Again, most programming languages do this - it makes doing
math inside those brackets easier.
If you just have one number in the brackets, it will give you the single character
at that index. If you leave out the first number but keep the colon, it will give
you a slice from the start to the number you left in. If you leave out the second
number, if will give you a slice from the first number to the end.
You can even put negative numbers inside the brackets. They are an easy way of
starting at the end of the string instead of the beginning. This way, -3 means
"3rd character from the end".
This prints the characters of string from 3 to 7 skipping one character. This is
extended slice syntax. The general form is [start:stop:step].
These make a new string with all letters converted to uppercase and lowercase,
respectively.
This is used to determine whether the string starts with something or ends with
something, respectively. The first one will print True, as the string starts with
"Hello". The second one will print False, as the string certainly does not end
with "asdfasdfasdf".
This splits the string into a bunch of strings grouped together in a list. Since
this example splits at a space, the first item in the list will be "Hello", and
the second will be "world!".
Exercise
Try to fix the code to print out the correct information by changing the string.
Solution
Conditions
Python uses boolean variables to evaluate conditions. The boolean values True and
False are returned when an expression is compared or evaluated. For example:
x = 2
print(x == 2) # prints out True
print(x == 3) # prints out False
print(x < 3) # prints out True
Notice that variable assignment is done using a single equals operator "=", whereas
comparison between two variables is done using the double equals operator "==".
The "not equals" operator is marked as "!=".
Boolean operators
The "and" and "or" boolean operators allow building complex boolean expressions,
for example:
name = "John"
age = 23
if name == "John" and age == 23:
print("Your name is John, and you are also 23 years
old.")
if name == "John" or name == "Rick":
print("Your name is either John or Rick.")
name = "John"
if name in ["John", "Rick"]:
print("Your name is either John or Rick.")
Python uses indentation to define code blocks, instead of brackets. The standard
Python indentation is 4 spaces, although tabs and any other space size will work,
as long as it is consistent. Notice that code blocks do not need any termination.
Here is an example for using Python's "if" statement using code blocks:
For example:
x = 2
if x == 2:
print("x equals two!")
else:
print("x does not equal to two.")
Unlike the double equals operator "==", the "is" operator does not match the values
of the variables, but the instances themselves. For example:
x = [1,2,3]
y = [1,2,3]
print(x == y) # Prints out True
print(x is y) # Prints out False
Change the variables in the first section, so that each if statement resolves as
True.
Solution
if first_array:
print("2")
if len(second_array) == 2:
print("3")
if len(first_array) + len(second_array) == 5:
print("4")
if not second_number:
print("6")
Loops
primes = [2, 3, 5, 7]
for prime in primes:
print(prime)
For loops can iterate over a sequence of numbers using the "range" and "xrange"
functions. The difference between range and xrange is that the range function
returns a new list with numbers of that specified range, whereas xrange returns
an iterator, which is more efficient. (Python 3 uses the range function, which
acts like xrange). Note that the range function is zero based.
"while" loops
While loops repeat as long as a certain boolean condition is met. For example:
unlike languages like C,CPP.. we can use else for loops. When the loop condition
of "for" or "while" statement fails then code part in "else" is executed. If break
statement is executed inside for loop then the "else" part is skipped. Note that
"else" part is executed even if there is a continue statement.
Here are a few examples:
Loop through and print out all even numbers from the numbers list in the same order
they are received. Don't print any numbers that come after 237 in the sequence.
numbers = [951, 402, 984, 651, 360, 69, 408, 319, 601, 485,
980, 507, 725, 547, 544, 615, 83, 165, 141, 501, 263, 617, 865, 575, 219,
390, 984, 592, 236, 105, 942, 941,386, 462, 47, 418, 907, 344, 236, 375, 823, 566,
597, 978, 328, 615, 953, 345,399, 162, 758, 219, 918, 237, 412, 566, 826, 248,
866, 950, 626, 949, 687, 217,815, 67, 104, 58, 512, 24, 892, 894, 767, 553, 81,
379, 843, 831, 445, 742, 717,958, 609, 842, 451, 688, 753, 854, 685, 93, 857,
440, 380, 126, 721, 328, 753, 470,743, 527]
# your code goes here
Solution
numbers = [951, 402, 984, 651, 360, 69, 408, 319, 601, 485, 980, 507, 725, 547,
544, 615, 83, 165, 141, 501, 263, 617, 865, 575, 219, 390, 984, 592, 236, 105,
942, 941, 386, 462, 47, 418, 907, 344, 236, 375, 823, 566, 597, 978, 328, 615,
953, 345,399, 162, 758, 219, 918, 237, 412, 566, 826, 248, 866, 950, 626, 949,
687, 217,815, 67, 104, 58, 512, 24, 892, 894, 767, 553, 81, 379, 843, 831, 445,
742, 717, 958, 609, 842, 451, 688, 753, 854, 685, 93, 857, 440, 380, 126, 721,
328, 753, 470, 743, 527]
Functions
Functions are a convenient way to divide your code into useful blocks, allowing
us to order our code, make it more readable, reuse it and save some time. Also
functions are a key way to define interfaces so programmers can share their code.
How do you write functions in Python?
As we have seen on previous tutorials, Python makes use of blocks.
A block is a area of code of written in the format of:
block_head:
1st block line
2nd block line
…
Where a block line is more Python code (even another block), and the block head
is of the following format: block_keyword block_name(argument1,argument2, ...)
Block keywords you already know are "if", "for", and "while".
Functions in python are defined using the block keyword "def", followed with the
function's name as the block's name. For example:
def my_function():
print("Hello From My Function!")
Functions may also receive arguments (variables passed from the caller to the
function). For example:
Functions may return a value to the caller, using the keyword- 'return' . For
example:
Exercise
In this exercise you'll use an existing function, and while adding your own to
create a fully functional program.
1. Add a function named list_benefits() that returns the following list of strings:
"More organized code", "More readable code", "Easier code reuse", "Allowing
programmers to share and connect code together"
2. Add a function named build_sentence(info) which receives a single argument
containing a string and returns a sentence starting with the given string and ending
with the string " is a benefit of functions!"
3. Run and see all the functions work together!
Solution
name_the_benefits_of_functions()
class MyClass:
variable = "blah"
def function(self):
print("This is a message inside the class.")
We'll explain why you have to include that "self" as a parameter a little bit later.
First, to assign the above class(template) to an object you would do the following:
class MyClass:
variable = "blah"
def function(self):
print("This is a message inside the class.")
myobjectx = MyClass()
Now the variable "myobjectx" holds an object of the class "MyClass" that contains
the variable and the function defined within the class called "MyClass".
Accessing Object Variables
To access the variable inside of the newly created object "myobjectx" you would
do the following:
class MyClass:
variable = "blah"
def function(self):
print("This is a message inside the class.")
myobjectx = MyClass()
myobjectx.variable
class MyClass:
variable = "blah"
def function(self):
print("This is a message inside the class.")
myobjectx = MyClass()
print(myobjectx.variable)
You can create multiple different objects that are of the same class(have the same
variables and functions defined). However, each object contains independent copies
of the variables defined in the class. For instance, if we were to define another
object with the "MyClass" class and then change the string in the variable above:
class MyClass:
variable = "blah"
def function(self):
print("This is a message inside the class.")
myobjectx = MyClass()
myobjecty = MyClass()
myobjecty.variable = "yackity"
# Then print out both values
print(myobjectx.variable)
print(myobjecty.variable)
class MyClass:
variable = "blah"
def function(self):
print("This is a message inside the class.")
myobjectx = MyClass()
myobjectx.function()
The above would print out the message, "This is a message inside the class."
Exercise
We have a class defined for vehicles. Create two new vehicles called car1 and car2.
Set car1 to be a red convertible worth $60,000.00 with a name of Fer, and car2
to be a blue van named Jump worth $10,000.00.
A dictionary is a data type similar to arrays, but works with keys and values instead
of indexes. Each value stored in a dictionary can be accessed using a key, which
is any type of object (a string, a number, a list, etc.) instead of using its index
to address it.
For example, a database of phone numbers could be stored using a dictionary like
this:
phonebook = {}
phonebook["John"] = 938477566
phonebook["Jack"] = 938377264
phonebook["Jill"] = 947662781
print(phonebook)
phonebook = {
"John" : 938477566,
"Jack" : 938377264,
"Jill" : 947662781
}
print(phonebook)
Removing a value
To remove a specified index, use either one of the following notations:
phonebook = {
"John" : 938477566,
"Jack" : 938377264,
"Jill" : 947662781
}
del phonebook["John"]
print(phonebook)
Solution
phonebook = {
"John" : 938477566,
"Jack" : 938377264,
"Jill" : 947662781
}
phonebook.pop("John")
print(phonebook)
Exercise
Add "Jake" to the phonebook with the phone number 938273443, and remove Jill from
the phonebook.
phonebook = {
"John" : 938477566,
"Jack" : 938377264,
"Jill" : 947662781
}
# write your code here
# testing code
if "Jake" in phonebook:
print("Jake is listed in the phonebook.")
if "Jill" not in phonebook:
print("Jill is not listed in the phonebook.")
Solution
phonebook = {
"John" : 938477566,
"Jack" : 938377264,
"Jill" : 947662781
}
# testing code
if "Jake" in phonebook:
print("Jake is listed in the phonebook.")
if "Jill" not in phonebook:
print("Jill is not listed in the phonebook.")
mygame/
mygame/game.py
mygame/draw.py
The Python script game.py will implement the game. It will use the function
draw_game from the file draw.py, or in other words, the draw module, that
implements the logic for drawing the game on the screen.
Modules are imported from other modules using the import command. In this example,
the game.py script may look something like this:
# game.py
# import the draw module
import draw
def play_game():
...
def main():
result = play_game()
draw.draw_game(result)
# this means that if this script is executed, then
# main() will be executed
if __name__ == '__main__':
main()
# draw.py
def draw_game():
...
def clear_screen(screen):
...
In this example, the game module imports the load module, which enables it to use
functions implemented in that module. The mainfunction would use the local function
play_game to run the game, and then draw the result of the game using a function
implemented in the draw module called draw_game. To use the function draw_game
from the draw module, we would need to specify in which module the function is
implemented, using the dot operator. To reference the draw_game function from the
game module, we would need to import the draw module and only then call
draw.draw_game().
When the import draw directive will run, the Python interpreter will look for
a file in the directory which the script was executed from, by the name of the
module with a .py prefix, so in our case it will try to look for draw.py. If it
will find one, it will import it. If not, he will continue to look for built-in
modules.
You may have noticed that when importing a module, a .pyc file appears, which is
a compiled Python file. Python compiles files into Python bytecode so that it won't
have to parse the files each time modules are loaded. If a .pyc file exists, it
gets loaded instead of the .py file, but this process is transparent to the user.
Importing module objects to the current namespace
We may also import the function draw_game directly into the main script's namespace,
by using the from command.
# game.py
# import the draw module
from draw import draw_game
def main():
result = play_game()
draw_game(result)
You may have noticed that in this example, draw_game does not precede with the
name of the module it is imported from, because we've specified the module name
in the import command.
The advantages of using this notation is that it is easier to use the functions
inside the current module because you don't need to specify which module the
function comes from. However, any namespace cannot have two objects with the exact
same name, so the importcommand may replace an existing object in the namespace.
Importing all objects from a module
We may also use the import * command to import all objects from a specific module,
like this:
# game.py
# import the draw module
from draw import *
def main():
result = play_game()
draw_game(result)
This might be a bit risky as changes in the module might affect the module which
imports it, but it is shorter and also does not require you to specify which objects
you wish to import from the module.
Custom import name
We may also load modules under any name we want. This is useful when we want to
import a module conditionally to use the same name in the rest of the code.
For example, if you have two draw modules with slighty different names - you may
do the following:
# game.py
# import the draw module
if visual_mode:
# in visual mode, we draw using graphics
import draw_visual as draw
else:
# in textual mode, we print out text
import draw_textual as draw
def main():
result = play_game()
# this can either be visual or textual depending on
visual_mode
draw.draw_game(result)
Module initialization
The first time a module is loaded into a running Python script, it is initialized
by executing the code in the module once. If another module in your code imports
the same module again, it will not be loaded twice but once only - so local variables
inside the module act as a "singleton" - they are initialized only once.
This is useful to know, because this means that you can rely on this behavior for
initializing objects. For example:
# draw.py
def draw_game():
# when clearing the screen we can use the main
screen object initialized in this module
clear_screen(main_screen)
...
def clear_screen(screen):
...
class Screen():
...
# initialize main_screen as a singleton
main_screen = Screen()
This will execute game.py, and will enable the script to load modules from the
foo directory as well as the local directory.
Another method is the sys.path.append function. You may execute it before running
an import command:
sys.path.append("/foo")
This will add the foo directory to the list of paths to look for modules in as
well.
Exploring built-in modules
Check out the full list of built-in modules in the Python standard library here.
Two very important functions come in handy when exploring modules in Python - the
dir and help functions.
If we want to import the module urllib, which enables us to create read data from
URLs, we simply import the module:
We can look for which functions are implemented in each module by using the dir
function:
When we find the function in the module we want to use, we can read about it more
using the help function, inside the Python interpreter:
help(urllib.urlopen)
Writing packages
Packages are namespaces which contain multiple packages and modules themselves.
They are simply directories, but with a twist.
Each package in Python is a directory which MUST contain a special file called
__init__.py. This file can be empty, and it indicates that the directory it contains
is a Python package, so it can be imported the same way a module can be imported.
If we create a directory called foo, which marks the package name, we can then
create a module inside that package called bar. We also must not forget to add
the __init__.py file inside the foo directory. To use the module bar, we can import
it in two ways:
import foo.bar
In the first method, we must use the foo prefix whenever we access the module bar.
In the second method, we don't, because we import the module to our module's
namespace.
The __init__.py file can also decide which modules the package exports as the API,
while keeping other modules internal, by overriding the __all__ variable, like
so:
__init__.py:
__all__ = ["bar"]
Exercise
In this exercise, you will need to print an alphabetically sorted list of all
functions in the re module, which contain the word find.
import re
# Your code goes here
In [1]:
import re
print(sorted(find_members))