


















Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Python programación para personas con ganas de aprender mas sobre este lenguaje
Tipo: Monografías, Ensayos
1 / 26
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!



















Variables are used to store values. A string is a series of
characters, surrounded by single or double quotes.
print("Hello world!")
msg = "Hello world!"
print(msg)
first_name = 'albert'
last_name = 'einstein'
full_name = first_name + ' ' + last_name
print(full_name)
A list stores a series of items in a particular order. You
access items using an index, or within a loop.
bikes = ['trek', 'redline', 'giant']
first_bike = bikes[0]
last_bike = bikes[-1]
for bike in bikes:
print(bike)
bikes = []
bikes.append('trek')
bikes.append('redline')
bikes.append('giant')
squares = []
for x in range(1, 11):
squares.append(x**2)
squares = [x**2 for x in range(1, 11)]
finishers = ['sam', 'bob', 'ada', 'bea']
first_two = finishers[:2]
copy_of_bikes = bikes[:]
Tuples are similar to lists, but the items in a tuple can't be
modified.
dimensions = (1920, 1080)
If statements are used to test for particular conditions and
respond appropriately.
equals x == 42
not equal x != 42
greater than x > 42
or equal to x >= 42
less than x < 42
or equal to x <= 42
'trek' in bikes
'surly' not in bikes
game_active = True
can_edit = False
if age >= 18:
print("You can vote!")
if age < 4:
ticket_price = 0
elif age < 18:
ticket_price = 10
else:
ticket_price = 15
Dictionaries store connections between pieces of
information. Each item in a dictionary is a key-value pair.
alien = {'color': 'green', 'points': 5}
print("The alien's color is " + alien['color'])
alien['x_position'] = 0
fav_numbers = {'eric': 17, 'ever': 4}
for name, number in fav_numbers.items():
print(name + ' loves ' + str(number))
fav_numbers = {'eric': 17, 'ever': 4}
for name in fav_numbers.keys():
print(name + ' loves a number')
fav_numbers = {'eric': 17, 'ever': 4}
for number in fav_numbers.values():
print(str(number) + ' is a favorite')
Your programs can prompt the user for input. All input is
stored as a string.
name = input("What's your name? ")
print("Hello, " + name + "!")
age = input("How old are you? ")
age = int(age)
pi = input("What's the value of pi? ")
pi = float(pi)
A while loop repeats a block of code as long as a certain
condition is true.
current_value = 1
while current_value <= 5:
print(current_value)
current_value += 1
msg = ''
while msg != 'quit':
msg = input("What's your message? ")
print(msg)
A class defines the behavior of an object and the kind of
information an object can store. The information in a class
is stored in attributes, and functions that belong to a class
are called methods. A child class inherits the attributes and
methods from its parent class.
class Dog():
"""Represent a dog."""
def init(self, name):
"""Initialize dog object."""
self.name = name
def sit(self):
"""Simulate sitting."""
print(self.name + " is sitting.")
my_dog = Dog('Peso')
print(my_dog.name + " is a great dog!")
my_dog.sit()
class SARDog(Dog):
"""Represent a search dog."""
def init(self, name):
"""Initialize the sardog."""
super().init(name)
def search(self):
"""Simulate searching."""
print(self.name + " is searching.")
my_dog = SARDog('Willie')
print(my_dog.name + " is a search dog.")
my_dog.sit()
my_dog.search()
Your programs can read from files and write to files. Files
are opened in read mode ('r') by default, but can also be
opened in write mode ('w') and append mode ('a').
filename = 'siddhartha.txt'
with open(filename) as file_object:
lines = file_object.readlines()
for line in lines:
print(line)
filename = 'journal.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.")
filename = 'journal.txt'
with open(filename, 'a') as file_object:
file_object.write("\nI love making games.")
Exceptions help you respond appropriately to errors that
are likely to occur. You place code that might cause an
error in the try block. Code that should run in response to
an error goes in the except block. Code that should run only
if the try block was successful goes in the else block.
prompt = "How many tickets do you need? "
num_tickets = input(prompt)
try:
num_tickets = int(num_tickets)
except ValueError:
print("Please try again.")
else:
print("Your tickets are printing.")
Functions are named blocks of code, designed to do one
specific job. Information passed to a function is called an
argument, and information received by a function is called a
parameter.
def greet_user():
"""Display a simple greeting."""
print("Hello!")
greet_user()
def greet_user(username):
"""Display a personalized greeting."""
print("Hello, " + username + "!")
greet_user('jesse')
def make_pizza(topping='bacon'):
"""Make a single-topping pizza."""
print("Have a " + topping + " pizza!")
make_pizza()
make_pizza('pepperoni')
def add_numbers(x, y):
"""Add two numbers and return the sum."""
return x + y
sum = add_numbers(3, 5)
print(sum)
If you had infinite programming skills, what would you
build?
Simple is better than complex
You can use the range() function to work with a set of
numbers efficiently. The range() function starts at 0 by
default, and stops one number below the number passed to
it. You can use the list() function to efficiently generate a
large list of numbers.
for number in range(1001):
print(number)
for number in range(1, 1001):
print(number)
numbers = list(range(1, 1000001))
To copy a list make a slice that starts at the first item and
ends at the last item. If you try to copy a list without using
this approach, whatever you do to the copied list will affect
the original list as well.
finishers = ['kai', 'abe', 'ada', 'gus', 'zoe']
copy_of_finishers = finishers[:]
Readability counts
There are a number of simple statistics you can run on a list
containing numerical data.
ages = [93, 99, 66, 17, 85, 1, 35, 82, 2, 77]
youngest = min(ages)
ages = [93, 99, 66, 17, 85, 1, 35, 82, 2, 77]
oldest = max(ages)
ages = [93, 99, 66, 17, 85, 1, 35, 82, 2, 77]
total_years = sum(ages)
You can use a loop to generate a list based on a range of
numbers or on another list. This is a common operation, so
Python offers a more efficient way to do it. List
comprehensions may look complicated at first; if so, use the
for loop approach until you're ready to start using
comprehensions.
To write a comprehension, define an expression for the
values you want to store in the list. Then write a for loop to
generate input values needed to make the list.
squares = []
for x in range(1, 11):
square = x**
squares.append(square)
squares = [x**2 for x in range(1, 11)]
names = ['kai', 'abe', 'ada', 'gus', 'zoe']
upper_names = []
for name in names:
upper_names.append(name.upper())
names = ['kai', 'abe', 'ada', 'gus', 'zoe']
upper_names = [name.upper() for name in names]
You can work with any set of elements from a list. A portion
of a list is called a slice. To slice a list start with the index of
the first item you want, then add a colon and the index after
the last item you want. Leave off the first index to start at
the beginning of the list, and leave off the last index to slice
through the end of the list.
finishers = ['kai', 'abe', 'ada', 'gus', 'zoe']
first_three = finishers[:3]
middle_three = finishers[1:4]
last_three = finishers[-3:]
A tuple is like a list, except you can't change the values in a
tuple once it's defined. Tuples are good for storing
information that shouldn't be changed throughout the life of
a program. Tuples are designated by parentheses instead
of square brackets. (You can overwrite an entire tuple, but
you can't change the individual elements in a tuple.)
dimensions = (800, 600)
for dimension in dimensions:
print(dimension)
dimensions = (800, 600)
print(dimensions)
dimensions = (1200, 900)
When you're first learning about data structures such as
lists, it helps to visualize how Python is working with the
information in your program. pythontutor.com is a great tool
for seeing how Python keeps track of the information in a
list. Try running the following code on pythontutor.com, and
then run your own code.
dogs = []
dogs.append('willie')
dogs.append('hootz')
dogs.append('peso')
dogs.append('goblin')
for dog in dogs:
print("Hello " + dog + "!")
print("I love these dogs!")
print("\nThese were my first two dogs:")
old_dogs = dogs[:2]
for old_dog in old_dogs:
print(old_dog)
del dogs[0]
dogs.remove('peso')
print(dogs)
Use curly braces to define a dictionary. Use colons to
connect keys and values, and use commas to separate
individual key-value pairs.
alien_0 = {'color': 'green', 'points': 5}
You can loop through a dictionary in three ways: you can
loop through all the key-value pairs, all the keys, or all the
values.
A dictionary only tracks the connections between keys
and values; it doesn't track the order of items in the
dictionary. If you want to process the information in order,
you can sort the keys in your loop.
fav_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
for name, language in fav_languages.items():
print(name + ": " + language)
for name in fav_languages.keys():
print(name)
for language in fav_languages.values():
print(language)
for name in sorted(fav_languages.keys()):
print(name + ": " + language)
To access the value associated with an individual key give
the name of the dictionary and then place the key in a set of
square brackets. If the key you're asking for is not in the
dictionary, an error will occur.
You can also use the get() method, which returns None
instead of an error if the key doesn't exist. You can also
specify a default value to use if the key is not in the
dictionary.
alien_0 = {'color': 'green', 'points': 5}
print(alien_0['color'])
print(alien_0['points'])
alien_0 = {'color': 'green'}
alien_color = alien_0.get('color')
alien_points = alien_0.get('points', 0)
print(alien_color)
print(alien_points)
You can modify the value associated with any key in a
dictionary. To do so give the name of the dictionary and
enclose the key in square brackets, then provide the new
value for that key.
alien_0 = {'color': 'green', 'points': 5}
print(alien_0)
alien_0['color'] = 'yellow'
alien_0['points'] = 10
print(alien_0)
You can remove any key-value pair you want from a
dictionary. To do so use the del keyword and the dictionary
name, followed by the key in square brackets. This will
delete the key and its associated value.
alien_0 = {'color': 'green', 'points': 5}
print(alien_0)
del alien_0['points']
print(alien_0)
You can store as many key-value pairs as you want in a
dictionary, until your computer runs out of memory. To add
a new key-value pair to an existing dictionary give the name
of the dictionary and the new key in square brackets, and
set it equal to the new value.
This also allows you to start with an empty dictionary and
add key-value pairs as they become relevant.
alien_0 = {'color': 'green', 'points': 5}
alien_0['x'] = 0
alien_0['y'] = 25
alien_0['speed'] = 1.
alien_0 = {}
alien_0['color'] = 'green'
alien_0['points'] = 5
Try running some of these examples on pythontutor.com.
You can find the number of key-value pairs in a dictionary.
num_responses = len(fav_languages)
A conditional test is an expression that can be evaluated as
True or False. Python uses the values True and False to
decide whether the code in an if statement should be
executed.
A single equal sign assigns a value to a variable. A double equal
sign (==) checks whether two values are equal.
>>> car = 'bmw'
>>> car == 'bmw'
True
>>> car = 'audi'
>>> car == 'bmw'
False
>>> car = 'Audi'
>>> car.lower() == 'audi'
True
>>> topping = 'mushrooms'
>>> topping != 'anchovies'
True
Testing numerical values is similar to testing string values.
>>> age = 18
>>> age == 18
True
>>> age != 18
False
>>> age = 19
>>> age < 21
True
>>> age <= 21
True
>>> age > 21
False
>>> age >= 21
False
Several kinds of if statements exist. Your choice of which to
use depends on the number of conditions you need to test.
You can have as many elif blocks as you need, and the
else block is always optional.
age = 19
if age >= 18:
print("You're old enough to vote!")
age = 17
if age >= 18:
print("You're old enough to vote!")
else:
print("You can't vote yet.")
age = 12
if age < 4:
price = 0
elif age < 18:
price = 5
else:
price = 10
print("Your cost is $" + str(price) + ".")
You can check multiple conditions at the same time. The
and operator returns True if all the conditions listed are
True. The or operator returns True if any condition is True.
>>> age_0 = 22
>>> age_1 = 18
>>> age_0 >= 21 and age_1 >= 21
False
>>> age_1 = 23
>>> age_0 >= 21 and age_1 >= 21
True
>>> age_0 = 22
>>> age_1 = 18
>>> age_0 >= 21 or age_1 >= 21
True
>>> age_0 = 18
>>> age_0 >= 21 or age_1 >= 21
False
A boolean value is either True or False. Variables with
boolean values are often used to keep track of certain
conditions within a program.
game_active = True
can_edit = False
You can easily test whether a certain value is in a list. You
can also test whether a list is empty before trying to loop
through the list.
>>> players = ['al', 'bea', 'cyn', 'dale']
>>> 'al' in players
True
>>> 'eric' in players
False
banned_users = ['ann', 'chad', 'dee']
user = 'erin'
if user not in banned_users:
print("You can play!")
players = []
if players:
for player in players:
print("Player: " + player.title())
else:
print("We have no players yet!")
prompt = "\nTell me something, and I'll "
prompt += "repeat it back to you."
prompt += "\nEnter 'quit' to end the program. "
message = ""
while message != 'quit':
message = input(prompt)
if message != 'quit':
print(message)
prompt = "\nTell me something, and I'll "
prompt += "repeat it back to you."
prompt += "\nEnter 'quit' to end the program. "
active = True
while active:
message = input(prompt)
if message == 'quit':
active = False
else:
print(message)
prompt = "\nWhat cities have you visited?"
prompt += "\nEnter 'quit' when you're done. "
while True:
city = input(prompt)
if city == 'quit':
break
else:
print("I've been to " + city + "!")
banned_users = ['eve', 'fred', 'gary', 'helen']
prompt = "\nAdd a player to your team."
prompt += "\nEnter 'quit' when you're done. "
players = []
while True:
player = input(prompt)
if player == 'quit':
break
elif player in banned_users:
print(player + " is banned!")
continue
else:
players.append(player)
print("\nYour team:")
for player in players:
print(player)
You can allow your users to enter input using the input()
statement. In Python 3, all input is stored as a string.
name = input("What's your name? ")
print("Hello, " + name + ".")
age = input("How old are you? ")
age = int(age)
if age >= 18:
print("\nYou can vote!")
else:
print("\nYou can't vote yet.")
Use raw_input() in Python 2.7. This function interprets all input as a
string, just as input() does in Python 3.
name = raw_input("What's your name? ")
print("Hello, " + name + ".")
A while loop repeats a block of code as long as a condition
is True.
current_number = 1
while current_number <= 5:
print(current_number)
current_number += 1
Sublime Text doesn't run programs that prompt the user for
input. You can use Sublime Text to write programs that
prompt for input, but you'll need to run these programs from
a terminal.
Every while loop needs a way to stop running so it won't
continue to run forever. If there's no way for the condition to
become False, the loop will never stop running.
while True:
name = input("\nWho are you? ")
print("Nice to meet you, " + name + "!")
The remove() method removes a specific value from a list,
but it only removes the first instance of the value you
provide. You can use a while loop to remove all instances
of a particular value.
pets = ['dog', 'cat', 'dog', 'fish', 'cat',
'rabbit', 'cat']
print(pets)
while 'cat' in pets:
pets.remove('cat')
print(pets) You can use the break statement and the continue
statement with any of Python's loops. For example you can
use break to quit a for loop that's working through a list or a
dictionary. You can use continue to skip over certain items
when looping through a list or dictionary as well.
You can pass a list as an argument to a function, and the
function can work with the values in the list. Any changes
the function makes to the list will affect the original list. You
can prevent a function from modifying a list by passing a
copy of the list as an argument.
def greet_users(names):
"""Print a simple greeting to everyone."""
for name in names:
msg = "Hello, " + name + "!"
print(msg)
usernames = ['hannah', 'ty', 'margot']
greet_users(usernames)
The following example sends a list of models to a function for
printing. The original list is emptied, and the second list is filled.
def print_models(unprinted, printed):
"""3d print a set of models."""
while unprinted:
current_model = unprinted.pop()
print("Printing " + current_model)
printed.append(current_model)
unprinted = ['phone case', 'pendant', 'ring']
printed = []
print_models(unprinted, printed)
print("\nUnprinted:", unprinted)
print("Printed:", printed)
The following example is the same as the previous one, except the
original list is unchanged after calling print_models().
def print_models(unprinted, printed):
"""3d print a set of models."""
while unprinted:
current_model = unprinted.pop()
print("Printing " + current_model)
printed.append(current_model)
original = ['phone case', 'pendant', 'ring']
printed = []
print_models(original[:], printed)
print("\nOriginal:", original)
print("Printed:", printed)
Sometimes you won't know how many arguments a
function will need to accept. Python allows you to collect an
arbitrary number of arguments into one parameter using the
* operator. A parameter that accepts an arbitrary number of
arguments must come last in the function definition.
The ** operator allows a parameter to collect an arbitrary
number of keyword arguments.
def make_pizza(size, *toppings):
"""Make a pizza."""
print("\nMaking a " + size + " pizza.")
print("Toppings:")
for topping in toppings:
print("- " + topping)
make_pizza('small', 'pepperoni')
make_pizza('large', 'bacon bits', 'pineapple')
make_pizza('medium', 'mushrooms', 'peppers',
'onions', 'extra cheese')
def build_profile(first, last, **user_info):
"""Build a user's profile dictionary."""
profile = {'first': first, 'last': last}
for key, value in user_info.items():
profile[key] = value
return profile
user_0 = build_profile('albert', 'einstein',
location='princeton')
user_1 = build_profile('marie', 'curie',
location='paris', field='chemistry')
print(user_0)
print(user_1)
You can store your functions in a separate file called a
module, and then import the functions you need into the file
containing your main program. This allows for cleaner
program files. (Make sure your module is stored in the
same directory as your main program.)
File: pizza.py
def make_pizza(size, *toppings):
"""Make a pizza."""
print("\nMaking a " + size + " pizza.")
print("Toppings:")
for topping in toppings:
print("- " + topping)
File: making_pizzas.py
Every function in the module is available in the program file.
import pizza
pizza.make_pizza('medium', 'pepperoni')
pizza.make_pizza('small', 'bacon', 'pineapple')
Only the imported functions are available in the program file.
from pizza import make_pizza
make_pizza('medium', 'pepperoni')
make_pizza('small', 'bacon', 'pineapple')
import pizza as p
p.make_pizza('medium', 'pepperoni')
p.make_pizza('small', 'bacon', 'pineapple')
from pizza import make_pizza as mp
mp('medium', 'pepperoni')
mp('small', 'bacon', 'pineapple')
Don't do this, but recognize it when you see it in others' code. It
can result in naming conflicts, which can cause errors.
from pizza import *
make_pizza('medium', 'pepperoni')
make_pizza('small', 'bacon', 'pineapple')
As you can see there are many ways to write and call a
function. When you're starting out, aim for something that
simply works. As you gain experience you'll develop an
understanding of the more subtle advantages of different
structures such as positional and keyword arguments, and
the various approaches to importing functions. For now if
your functions do what you need them to, you're doing well.
my_car = Car('audi', 'a4', 2016)
print(my_car.make)
print(my_car.model)
print(my_car.year)
my_car.fill_tank()
my_car.drive()
my_car = Car('audi', 'a4', 2016)
my_old_car = Car('subaru', 'outback', 2013)
my_truck = Car('toyota', 'tacoma', 2010)
Consider how we might model a car. What information
would we associate with a car, and what behavior would it
have? The information is stored in variables called
attributes, and the behavior is represented by functions.
Functions that are part of a class are called methods.
class Car():
"""A simple attempt to model a car."""
def init(self, make, model, year):
"""Initialize car attributes."""
self.make = make
self.model = model
self.year = year
self.fuel_capacity = 15
self.fuel_level = 0
def fill_tank(self):
"""Fill gas tank to capacity."""
self.fuel_level = self.fuel_capacity
print("Fuel tank is full.")
def drive(self):
"""Simulate driving."""
print("The car is moving.")
You can modify an attribute's value directly, or you can
write methods that manage updating values more carefully.
my_new_car = Car('audi', 'a4', 2016)
my_new_car.fuel_level = 5
def update_fuel_level(self, new_level):
"""Update the fuel level."""
if new_level <= self.fuel_capacity:
self.fuel_level = new_level
else:
print("The tank can't hold that much!")
def add_fuel(self, amount):
"""Add fuel to the tank."""
if (self.fuel_level + amount
<= self.fuel_capacity):
self.fuel_level += amount
print("Added fuel.")
else:
print("The tank won't hold that much.")
If the class you're writing is a specialized version of another
class, you can use inheritance. When one class inherits
from another, it automatically takes on all the attributes and
methods of the parent class. The child class is free to
introduce new attributes and methods, and override
attributes and methods of the parent class.
To inherit from another class include the name of the
parent class in parentheses when defining the new class.
class ElectricCar(Car):
"""A simple model of an electric car."""
def init(self, make, model, year):
"""Initialize an electric car."""
super().init(make, model, year)
self.battery_size = 70
self.charge_level = 0
class ElectricCar(Car):
--snip--
def charge(self):
"""Fully charge the vehicle."""
self.charge_level = 100
print("The vehicle is fully charged.")
my_ecar = ElectricCar('tesla', 'model s', 2016)
my_ecar.charge()
my_ecar.drive()
In Python class names are written in CamelCase and object
names are written in lowercase with underscores. Modules
that contain classes should still be named in lowercase with
underscores.
There are many ways to model real world objects and
situations in code, and sometimes that variety can feel
overwhelming. Pick an approach and try it – if your first
attempt doesn't work, try a different approach.
f_path = "/home/ehmatthes/books/alice.txt"
with open(f_path) as f_obj:
lines = f_obj.readlines()
Windows will sometimes interpret forward slashes incorrectly. If
you run into this, use backslashes in your file paths.
f_path = "C:\Users\ehmatthes\books\alice.txt"
with open(f_path) as f_obj:
lines = f_obj.readlines()
To read from a file your program needs to open the file and
then read the contents of the file. You can read the entire
contents of the file at once, or read the file line by line. The
with statement makes sure the file is closed properly when
the program has finished accessing the file.
filename = 'siddhartha.txt'
with open(filename) as f_obj:
contents = f_obj.read()
print(contents)
Each line that's read from the file has a newline character at the
end of the line, and the print function adds its own newline
character. The rstrip() method gets rid of the the extra blank lines
this would result in when printing to the terminal.
filename = 'siddhartha.txt'
with open(filename) as f_obj:
for line in f_obj:
print(line.rstrip())
filename = 'siddhartha.txt'
with open(filename) as f_obj:
lines = f_obj.readlines()
for line in lines:
print(line.rstrip())
Passing the 'w' argument to open() tells Python you want to
write to the file. Be careful; this will erase the contents of
the file if it already exists. Passing the 'a' argument tells
Python you want to append to the end of an existing file.
filename = 'programming.txt'
with open(filename, 'w') as f:
f.write("I love programming!")
filename = 'programming.txt'
with open(filename, 'w') as f:
f.write("I love programming!\n")
f.write("I love creating new games.\n")
filename = 'programming.txt'
with open(filename, 'a') as f:
f.write("I also love working with data.\n")
f.write("I love making apps as well.\n")
When Python runs the open() function, it looks for the file in
the same directory where the program that's being excuted
is stored. You can open a file from a subfolder using a
relative path. You can also use an absolute path to open
any file on your system.
f_path = "text_files/alice.txt"
with open(f_path) as f_obj:
lines = f_obj.readlines()
for line in lines:
print(line.rstrip())
When you think an error may occur, you can write a try-
except block to handle the exception that might be raised.
The try block tells Python to try running some code, and the
except block tells Python what to do if the code results in a
particular kind of error.
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
f_name = 'siddhartha.txt'
try:
with open(f_name) as f_obj:
lines = f_obj.readlines()
except FileNotFoundError:
msg = "Can't find file {0}.".format(f_name)
print(msg)
It can be hard to know what kind of exception to handle
when writing code. Try writing your code without a try block,
and make it generate an error. The traceback will tell you
what kind of exception your program needs to handle.
The try block should only contain code that may cause an
error. Any code that depends on the try block running
successfully should be placed in the else block.
print("Enter two numbers. I'll divide them.")
x = input("First number: ")
y = input("Second number: ")
try:
result = int(x) / int(y)
except ZeroDivisionError:
print("You can't divide by zero!")
else:
print(result)
Without the except block in the following example, the program
would crash if the user tries to divide by zero. As written, it will
handle the error gracefully and keep running.
"""A simple calculator for division only."""
print("Enter two numbers. I'll divide them.")
print("Enter 'q' to quit.")
while True:
x = input("\nFirst number: ")
if x == 'q':
break
y = input("Second number: ")
if y == 'q':
break
try:
result = int(x) / int(y)
except ZeroDivisionError:
print("You can't divide by zero!")
else:
print(result)
Sometimes you want your program to just continue running
when it encounters an error, without reporting the error to
the user. Using the pass statement in an else block allows
you to do this.
f_names = ['alice.txt', 'siddhartha.txt',
'moby_dick.txt', 'little_women.txt']
for f_name in f_names:
try:
with open(f_name) as f_obj:
lines = f_obj.readlines()
except FileNotFoundError:
pass
else:
num_lines = len(lines)
msg = "{0} has {1} lines.".format(
f_name, num_lines)
print(msg)
The json module allows you to dump simple Python data
structures into a file, and load the data from that file the
next time the program runs. The JSON data format is not
specific to Python, so you can share this kind of data with
people who work in other languages as well.
Knowing how to manage exceptions is important when
working with stored data. You'll usually want to make sure
the data you're trying to load exists before working with it.
"""Store some numbers."""
import json
numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
with open(filename, 'w') as f_obj:
json.dump(numbers, f_obj)
"""Load some previously stored numbers."""
import json
filename = 'numbers.json'
with open(filename) as f_obj:
numbers = json.load(f_obj)
print(numbers)
import json
f_name = 'numbers.json'
try:
with open(f_name) as f_obj:
numbers = json.load(f_obj)
except FileNotFoundError:
msg = "Can’t find {0}.".format(f_name)
print(msg)
else:
print(numbers)
Exception-handling code should catch specific exceptions
that you expect to happen during your program's execution.
A bare except block will catch all exceptions, including
keyboard interrupts and system exits you might need when
forcing a program to close.
If you want to use a try block and you're not sure which
exception to catch, use Exception. It will catch most
exceptions, but still allow you to interrupt programs
intentionally.
try:
except:
pass
try:
except Exception:
pass
try:
except Exception as e:
print(e, type(e))
Well-written, properly tested code is not very prone to
internal errors such as syntax or logical errors. But every
time your program depends on something external such as
user input or the existence of a file, there's a possibility of
an exception being raised.
It's up to you how to communicate errors to your users.
Sometimes users need to know if a file is missing;
sometimes it's better to handle the error silently. A little
experience will help you know how much to report.
Take a program you've already written that prompts for user
input, and add some error-handling code to the program.
You can add as many unit tests to a test case as you need.
To write a new test, add a new method to your test case
class.
We’ve shown that get_full_name() works for first and last
names. Let’s test that it works for middle names as well.
import unittest
from full_names import get_full_name
class NamesTestCase(unittest.TestCase):
"""Tests for names.py."""
def test_first_last(self):
"""Test names like Janis Joplin."""
full_name = get_full_name('janis',
'joplin')
self.assertEqual(full_name,
'Janis Joplin')
def test_middle(self):
"""Test names like David Lee Roth."""
full_name = get_full_name('david',
'roth', 'lee')
self.assertEqual(full_name,
'David Lee Roth')
unittest.main()
The two dots represent two passing tests.
Ran 2 tests in 0.000s
Testing a class is similar to testing a function, since you’ll
mostly be testing your methods.
Save as accountant.py
class Accountant():
"""Manage a bank account."""
def init(self, balance=0):
self.balance = balance
def deposit(self, amount):
self.balance += amount
def withdraw(self, amount):
self.balance - = amount
For the first test, we’ll make sure we can start out with different
initial balances. Save this as test_accountant.py.
import unittest
from accountant import Accountant
class TestAccountant(unittest.TestCase):
"""Tests for the class Accountant."""
def test_initial_balance(self):
acc = Accountant()
self.assertEqual(acc.balance, 0)
acc = Accountant(100)
self.assertEqual(acc.balance, 100)
unittest.main()
Ran 1 test in 0.000s
When testing a class, you usually have to make an instance
of the class. The setUp() method is run before every test.
Any instances you make in setUp() are available in every
test you write.
The instance self.acc can be used in each new test.
import unittest
from accountant import Accountant
class TestAccountant(unittest.TestCase):
"""Tests for the class Accountant."""
def setUp(self):
self.acc = Accountant()
def test_initial_balance(self):
self.assertEqual(self.acc.balance, 0)
acc = Accountant(100)
self.assertEqual(acc.balance, 100)
def test_deposit(self):
self.acc.deposit(100)
self.assertEqual(self.acc.balance, 100)
self.acc.deposit(100)
self.acc.deposit(100)
self.assertEqual(self.acc.balance, 300)
def test_withdrawal(self):
self.acc.deposit(1000)
self.acc.withdraw(100)
self.assertEqual(self.acc.balance, 900)
unittest.main()
Ran 3 tests in 0.001s
In general you shouldn’t modify a test once it’s written.
When a test fails it usually means new code you’ve written
has broken existing functionality, and you need to modify
the new code until all existing tests pass.
If your original requirements have changed, it may be
appropriate to modify some tests. This usually happens in
the early stages of a project when desired behavior is still
being sorted out.
Python provides a number of assert methods you can use
to test your code.
assertEqual(a, b)
assertNotEqual(a, b)
assertTrue(x)
assertFalse(x)
assertIn(item, list)
assertNotIn(item, list)
Once you have a rect object, there are a number of attributes that
are useful when positioning objects and detecting relative positions
of objects. (You can find more attributes in the Pygame
documentation.)
screen_rect.left, screen_rect.right
screen_rect.top, screen_rect.bottom
screen_rect.centerx, screen_rect.centery
screen_rect.width, screen_rect.height
screen_rect.center
screen_rect.size
You can create a rect object from scratch. For example a small rect
object that’s filled in can represent a bullet in a game. The Rect()
class takes the coordinates of the upper left corner, and the width
and height of the rect. The draw.rect() function takes a screen
object, a color, and a rect. This function fills the given rect with the
given color.
bullet_rect = pg.Rect(100, 100, 3, 15)
color = (100, 100, 100)
pg.draw.rect(screen, color, bullet_rect)
Pygame runs on all systems, but setup is slightly different
on each OS. The instructions here assume you’re using
Python 3, and provide a minimal installation of Pygame. If
these instructions don’t work for your system, see the more
detailed notes at http://ehmatthes.github.io/pcc/.
$ sudo apt-get install python3-dev mercurial
libsdl-image1.2-dev libsdl2-dev
libsdl-ttf2.0-dev
$ pip install --user
hg+http://bitbucket.org/pygame/pygame
This assumes you’ve used Homebrew to install Python 3.
$ brew install hg sdl sdl_image sdl_ttf
$ pip install --user
hg+http://bitbucket.org/pygame/pygame
Find an installer at
https://bitbucket.org/pygame/pygame/downloads/ or
http://www.lfd.uci.edu/~gohlke/pythonlibs/#pygame that matches
your version of Python. Run the installer file if it’s a .exe or .msi file.
If it’s a .whl file, use pip to install Pygame:
> python – m pip install --user
pygame-1.9.2a0-cp35-none-win32.whl
To test your installation, open a terminal session and try to import
Pygame. If you don’t get any error messages, your installation was
successful.
$ python
>>> import pygame
The following code sets up an empty game window, and
starts an event loop and a loop that continually refreshes
the screen.
import sys
import pygame as pg
def run_game():
pg.init()
screen = pg.display.set_mode((1200, 800))
pg.display.set_caption("Alien Invasion")
while True:
for event in pg.event.get():
if event.type == pg.QUIT:
sys.exit()
pg.display.flip()
run_game()
The display.set_mode() function accepts a tuple that defines the
screen size.
screen_dim = (1200, 800)
screen = pg.display.set_mode(screen_dim)
Colors are defined as a tuple of red, green, and blue values. Each
value ranges from 0-255.
bg_color = (230, 230, 230)
screen.fill(bg_color)
Many objects in a game can be treated as simple
rectangles, rather than their actual shape. This simplifies
code without noticeably affecting game play. Pygame has a
rect object that makes it easy to work with game objects.
We already have a screen object; we can easily access the rect
object associated with the screen.
screen_rect = screen.get_rect()
Rect objects have a center attribute which stores the center point.
screen_center = screen_rect.center
Many objects in a game are images that are moved around
the screen. It’s easiest to use bitmap (.bmp) image files, but
you can also configure your system to work with jpg, png,
and gif files as well.
ship = pg.image.load('images/ship.bmp')
ship_rect = ship.get_rect()
With rects, it’s easy to position an image wherever you want on the
screen, or in relation to another object. The following code
positions a ship object at the bottom center of the screen.
ship_rect.midbottom = screen_rect.midbottom
You can plot as much data as you want on one plot. Here we re-
plot the first and last points larger to emphasize them.
import matplotlib.pyplot as plt
x_values = list(range(1000))
squares = [x**2 for x in x_values]
plt.scatter(x_values, squares, c=squares,
cmap=plt.cm.Blues, edgecolor='none',
s=10)
plt.scatter(x_values[0], squares[0], c='green',
edgecolor='none', s=100)
plt.scatter(x_values[-1], squares[-1], c='red',
edgecolor='none', s=100)
plt.title("Square Numbers", fontsize=24)
--snip--
You can customize or remove axes entirely. Here’s how to access
each axis, and hide it.
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
You can make your plot as big or small as you want. Before
plotting your data, add the following code. The dpi argument is
optional; if you don’t know your system’s resolution you can omit
the argument and adjust the figsize argument accordingly.
plt.figure(dpi=128, figsize=(10, 6))
The matplotlib viewer has an interactive save button, but you can
also save your visualizations programmatically. To do so, replace
plt.show() with plt.savefig(). The bbox_inches='tight'
argument trims extra whitespace from the plot.
plt.savefig('squares.png', bbox_inches='tight')
matplotlib runs on all systems, but setup is slightly different
depending on your OS. If the minimal instructions here
don’t work for you, see the more detailed instructions at
http://ehmatthes.github.io/pcc/. You should also consider
installing the Anaconda distrubution of Python from
https://continuum.io/downloads/, which includes matplotlib.
$ sudo apt-get install python3-matplotlib
Start a terminal session and enter import matplotlib to see if
it’s already installed on your system. If not, try this command:
$ pip install --user matplotlib
You first need to install Visual Studio, which you can do from
https://dev.windows.com/. The Community edition is free. Then go
to https://pypi.python.org/pypi/matplotlib/ or
http://www.lfd.uic.edu/~gohlke/pythonlibs/#matplotlib and download
an appropriate installer file.
The scatter() function takes a list of x values and a list of y values,
and a variety of optional arguments. The s=10 argument controls
the size of each point.
import matplotlib.pyplot as plt
x_values = list(range(1000))
squares = [x**2 for x in x_values]
plt.scatter(x_values, squares, s=10)
plt.show()
import matplotlib.pyplot as plt
x_values = [0, 1, 2, 3, 4, 5]
squares = [0, 1, 4, 9, 16, 25]
plt.plot(x_values, squares)
plt.show()
Plots can be customized in a wide variety of ways. Just
about any element of a plot can be customized.
import matplotlib.pyplot as plt
x_values = list(range(1000))
squares = [x**2 for x in x_values]
plt.scatter(x_values, squares, s=10)
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=18)
plt.ylabel("Square of Value", fontsize=18)
plt.tick_params(axis='both', which='major',
labelsize=14)
plt.axis([0, 1100, 0, 1100000])
plt.show()
A colormap varies the point colors from one shade to another,
based on a certain value for each point. The value used to
determine the color of each point is passed to the c argument, and
the cmap argument specifies which colormap to use.
The edgecolor='none' argument removes the black outline
from each point.
plt.scatter(x_values, squares, c=squares,
cmap=plt.cm.Blues, edgecolor='none',
s=10)
The matplotlib gallery and documentation are at
http://matplotlib.org/. Be sure to visit the examples, gallery,
and pyplot links.
You can make as many plots as you want on one figure.
When you make multiple plots, you can emphasize
relationships in the data. For example you can fill the space
between two sets of data.
Here we use plt.scatter() twice to plot square numbers and
cubes on the same figure.
import matplotlib.pyplot as plt
x_values = list(range(11))
squares = [x**2 for x in x_values]
cubes = [x**3 for x in x_values]
plt.scatter(x_values, squares, c='blue',
edgecolor='none', s=20)
plt.scatter(x_values, cubes, c='red',
edgecolor='none', s=20)
plt.axis([0, 11, 0, 1100])
plt.show()
The fill_between() method fills the space between two data
sets. It takes a series of x-values and two series of y-values. It also
takes a facecolor to use for the fill, and an optional alpha
argument that controls the color’s transparency.
plt.fill_between(x_values, cubes, squares,
facecolor='blue', alpha=0.25)
The strftime() function generates a formatted string from a
datetime object, and the strptime() function genereates a
datetime object from a string. The following codes let you work with
dates exactly as you need to.
%A Weekday name, such as Monday
%B Month name, such as January
%m Month, as a number (01 to 12)
%d Day of the month, as a number (01 to 31)
%Y Four-digit year, such as 2016
%y Two-digit year, such as 16
%H Hour, in 24-hour format (00 to 23)
%I Hour, in 12-hour format (01 to 12)
%p AM or PM
%M Minutes (00 to 59)
%S Seconds (00 to 61)
new_years = dt.strptime('1/1/2017', '%m/%d/%Y')
ny_string = dt.strftime(new_years, '%B %d, %Y')
print(ny_string)
The following code creates a list of dates and a corresponding list
of high temperatures. It then plots the high temperatures, with the
date labels displayed in a specific format.
from datetime import datetime as dt
import matplotlib.pyplot as plt
from matplotlib import dates as mdates
dates = [
dt(2016, 6, 21), dt(2016, 6, 22),
dt(2016, 6, 23), dt(2016, 6, 24),
highs = [57, 68, 64, 59]
fig = plt.figure(dpi=128, figsize=(10,6))
plt.plot(dates, highs, c='red')
plt.title("Daily High Temps", fontsize=24)
plt.ylabel("Temp (F)", fontsize=16)
x_axis = plt.axes().get_xaxis()
x_axis.set_major_formatter(
mdates.DateFormatter('%B %d %Y')
fig.autofmt_xdate()
plt.show()
You can include as many individual graphs in one figure as
you want. This is useful, for example, when comparing
related datasets.
The following code plots a set of squares and a set of cubes on
two separate graphs that share a common x-axis.
The plt.subplots() function returns a figure object and a tuple
of axes. Each set of axes corresponds to a separate plot in the
figure. The first two arguments control the number of rows and
columns generated in the figure.
import matplotlib.pyplot as plt
x_vals = list(range(11))
squares = [x**2 for x in x_vals]
cubes = [x**3 for x in x_vals]
fig, axarr = plt.subplots(2, 1, sharex=True)
axarr[0].scatter(x_vals, squares)
axarr[0].set_title('Squares')
axarr[1].scatter(x_vals, cubes, c='red')
axarr[1].set_title('Cubes')
plt.show()
To share a y-axis, we use the sharey=True argument.
import matplotlib.pyplot as plt
x_vals = list(range(11))
squares = [x**2 for x in x_vals]
cubes = [x**3 for x in x_vals]
fig, axarr = plt.subplots(1, 2, sharey=True)
axarr[0].scatter(x_vals, squares)
axarr[0].set_title('Squares')
axarr[1].scatter(x_vals, cubes, c='red')
axarr[1].set_title('Cubes')
plt.show()
Many interesting data sets have a date or time as the x-
value. Python’s datetime module helps you work with this
kind of data.
The datetime.now() function returns a datetime object
representing the current date and time.
from datetime import datetime as dt
today = dt.now()
date_string = dt.strftime(today, '%m/%d/%Y')
print(date_string)
You can also generate a datetime object for any date and time you
want. The positional order of arguments is year, month, and day.
The hour, minute, second, and microsecond arguments are
optional.
from datetime import datetime as dt
new_years = dt(2017, 1, 1)
fall_equinox = dt(year=2016, month=9, day=22)