Python Basics
Required Files
Table of Contents
- Invoking the Interpreter
- Operators
- Strings
- Dir and Help
- Built-in Data Structures
- Writing Scripts
- Indentation
- Tabs vs Spaces
- Writing Functions
- Object Basics
- Tips and Tricks
- Troubleshooting
- More References
Invoking the Interpreter
python at the Unix command prompt.Note: you may have to type
python2.4, python2.5, python2.6 or python2.7, rather than python, depending on your machine.[cs188-ta@nova ~]$ python
Python 2.6.5 (r265:79063, Jan 14 2011, 14:20:15)
[GCC 4.4.1] on sunos5
Type "help", "copyright", "credits" or "license" for more information.
>>>Operators
>>>) they will be evaluated and the result will be returned on the next line.>>> 1 + 1
2
>>> 2 * 3
6True and False values.>>> 1==0
False
>>> not (1==0)
True
>>> (2==2) and (2==3)
False
>>> (2==2) or (2==3)
TrueStrings
+ operator is overloaded to do string concatenation on string values.>>> 'artificial' + "intelligence"
'artificialintelligence'>>> 'artificial'.upper()
'ARTIFICIAL'
>>> 'HELP'.lower()
'help'
>>> len('Help')
4' ' or double quotes " " to surround string. This allows for easy nesting of strings.>>> s = 'hello world'
>>> print s
hello world
>>> s.upper()
'HELLO WORLD'
>>> len(s.upper())
11
>>> num = 8.0
>>> num += 2.5
>>> print num
10.5Exercise: Dir and Help
dir and help commands:>>> s = 'abc'
>>> dir(s)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__','__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__','__repr__', '__rmod__', '__rmul__', '__setattr__', '__str__', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'replace', 'rfind','rindex', 'rjust', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>> help(s.find)Help on built-in function find:
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.
Return -1 on failure.
>> s.find('b')
1dir (ignore those with underscores '_' around the method name).Built-in Data Structures
Lists
>>> fruits = ['apple','orange','pear','banana']
>>> fruits[0]
'apple'+ operator to do list concatenation:>>> otherFruits = ['kiwi','strawberry']
>>> fruits + otherFruits
>>> ['apple', 'orange', 'pear', 'banana', 'kiwi', 'strawberry']fruits[-1] will access the last element 'banana':>>> fruits[-2]
'pear'
>>> fruits.pop()
'banana'
>>> fruits
['apple', 'orange', 'pear']
>>> fruits.append('grapefruit')
>>> fruits
['apple', 'orange', 'pear', 'grapefruit']
>>> fruits[-1] = 'pineapple'
>>> fruits
['apple', 'orange', 'pear', 'pineapple']fruits[1:3], returns a list containing the elements at position 1 and 2. In general fruits[start:stop] will get the elements in start, start+1, ..., stop-1. We can also do fruits[start:] which returns all elements starting from the start index. Also fruits[:end] will return all elements before the element at position end:>>> fruits[0:2]
['apple', 'orange']
>>> fruits[:3]
['apple', 'orange', 'pear']
>>> fruits[2:]
['pear', 'pineapple']
>>> len(fruits)
4>>> lstOfLsts = [['a','b','c'],[1,2,3],['one','two','three']]
>>> lstOfLsts[1][2]
3
>>> lstOfLsts[0].pop()
'c'
>>> lstOfLsts
[['a', 'b'],[1, 2, 3],['one', 'two', 'three']]Exercise: Lists
dirand get information about them via the help command:>>> dir(list)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
'__delslice__', '__doc__', '__eq__', '__ge__', '__getattribute__',
'__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__',
'__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__',
'__rmul__', '__setattr__', '__setitem__', '__setslice__', '__str__',
'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse',
'sort']>>> help(list.reverse)
Help on built-in function reverse:
reverse(...)
L.reverse() -- reverse *IN PLACE*
>>> lst = ['a','b','c']
>>> lst.reverse()
>>> ['c','b','a']Tuples
>>> pair = (3,5)
>>> pair[0]
3
>>> x,y = pair
>>> x
3
>>> y
5
>>> pair[1] = 6
TypeError: object does not support item assignmentSets
>>> shapes = ['circle','square','triangle','circle']
>>> setOfShapes = set(shapes)
>>> setOfShapes
set(['circle','square','triangle'])
>>> setOfShapes.add('polygon')
>>> setOfShapes
set(['circle','square','triangle','polygon'])
>>> 'circle' in setOfShapes
True
>>> 'rhombus' in setOfShapes
False
>>> favoriteShapes = ['circle','triangle','hexagon']
>>> setOfFavoriteShapes = set(favoriteShapes)
>>> setOfShapes - setOfFavoriteShapes
set(['square','polyon'])
>>> setOfShapes & setOfFavoriteShapes
set(['circle','triangle'])
>>> setOfShapes | setOfFavoriteShapes
set(['circle','square','triangle','polygon','hexagon'])Dictionaries
>>> studentIds = {'knuth': 42.0, 'turing': 56.0, 'nash': 92.0 }
>>> studentIds['turing']
56.0
>>> studentIds['nash'] = 'ninety-two'
>>> studentIds
{'knuth': 42.0, 'turing': 56.0, 'nash': 'ninety-two'}
>>> del studentIds['knuth']
>>> studentIds
{'turing': 56.0, 'nash': 'ninety-two'}
>>> studentIds['knuth'] = [42.0,'forty-two']
>>> studentIds
{'knuth': [42.0, 'forty-two'], 'turing': 56.0, 'nash': 'ninety-two'}
>>> studentIds.keys()
['knuth', 'turing', 'nash']
>>> studentIds.values()
[[42.0, 'forty-two'], 56.0, 'ninety-two']
>>> studentIds.items()
[('knuth',[42.0, 'forty-two']), ('turing',56.0), ('nash','ninety-two')]
>>> len(studentIds)
3Exercise: Dictionaries
dir and help to learn about the functions you can call on dictionaries.Writing Scripts
for loop. Open the file called foreach.py and update it with the following code:# This is what a comment looks like
fruits = ['apples','oranges','pears','bananas']
for fruit in fruits:
print fruit + ' for sale'
fruitPrices = {'apples': 2.00, 'oranges': 1.50, 'pears': 1.75}
for fruit, price in fruitPrices.items():
if price < 2.00:
print '%s cost %f a pound' % (fruit, price)
else:
print fruit + ' are too expensive!'
foreach.py:[cs188-ta@nova ~/tutorial]$ python foreach.py
apples for sale
oranges for sale
pears for sale
bananas for sale
oranges cost 1.500000 a pound
pears cost 1.750000 a pound
apples are too expensive!if and else) in Python, check out the official Python tutorial section on this topic.map and filter:>>> map(lambda x: x * x, [1,2,3])
[1, 4, 9]
>>> filter(lambda x: x > 3, [1,2,3,4,5,4,3,2,1])
[4, 5, 4]lambda if you're interested.nums = [1,2,3,4,5,6] plusOneNums = [x+1 for x in nums] oddNums = [x for x in nums if x % 2 == 1] print oddNums oddNumsPlusOne = [x+1 for x in nums if x % 2 ==1] print oddNumsPlusOne
listcomp.py, which you can run:[cs188-ta@nova ~]$ python listcomp.py
[1,3,5]
[2,4,6]Exercise: List Comprehensions
listcomp2.py.Beware of Indendation!
if 0 == 1:
print 'We are in a world of arithmetic pain'
print 'Thank you for playing'
Thank you for playingif 0 == 1:
print 'We are in a world of arithmetic pain'
print 'Thank you for playing'
Tabs vs Spaces
Writing Functions
fruitPrices = {'apples':2.00, 'oranges': 1.50, 'pears': 1.75}
def buyFruit(fruit, numPounds):
if fruit not in fruitPrices:
print "Sorry we don't have %s" % (fruit)
else:
cost = fruitPrices[fruit] * numPounds
print "That'll be %f please" % (cost)
# Main Function
if __name__ == '__main__':
buyFruit('apples',2.4)
buyFruit('coconuts',2)
main function as in Java, the __name__ == '__main__' check is used to delimit expressions which are executed when the file is called as a script from the command line. The code after the main check is thus the same sort of code you would put in a main function in Java.[cs188-ta@nova ~]$ python fruit.py
That'll be 4.800000 please
Sorry we don't have coconutsAdvanced Exercise
quickSort function in Python using list comprehensions. Use the first element as the pivot. You can find the solution in quickSort.py.Object Basics
Defining Classes
FruitShop:class FruitShop:
def __init__(self, name, fruitPrices):
"""
name: Name of the fruit shop
fruitPrices: Dictionary with keys as fruit
strings and prices for values e.g.
{'apples':2.00, 'oranges': 1.50, 'pears': 1.75}
"""
self.fruitPrices = fruitPrices
self.name = name
print 'Welcome to the %s fruit shop' % (name)
def getCostPerPound(self, fruit):
"""
fruit: Fruit string
Returns cost of 'fruit', assuming 'fruit'
is in our inventory or None otherwise
"""
if fruit not in self.fruitPrices:
print "Sorry we don't have %s" % (fruit)
return None
return self.fruitPrices[fruit]
def getPriceOfOrder(self, orderList):
"""
orderList: List of (fruit, numPounds) tuples
Returns cost of orderList. If any of the fruit are
"""
totalCost = 0.0
for fruit, numPounds in orderList:
costPerPound = self.getCostPerPound(fruit)
if costPerPound != None:
totalCost += numPounds * costPerPound
return totalCost
def getName(self):
return self.name
FruitShop class has some data, the name of the shop and the prices per pound of some fruit, and it provides functions, or methods, on this data. What advantage is there to wrapping this data in a class?- Encapsulating the data prevents it from being altered or used inappropriately,
- The abstraction that objects provide make it easier to write general-purpose code.
Using Objects
FruitShop implementation inshop.py. We then import the code from this file (making it accessible to other scripts) using import shop, since shop.py is the name of the file. Then, we can create FruitShop objects as follows:import shop
shopName = 'the Berkeley Bowl'
fruitPrices = {'apples': 1.00, 'oranges': 1.50, 'pears': 1.75}
berkeleyShop = shop.FruitShop(shopName, fruitPrices)
applePrice = berkeleyShop.getCostPerPound('apples')
print applePrice
print('Apples cost $%.2f at %s.' % (applePrice, shopName))
otherName = 'the Stanford Mall'
otherFruitPrices = {'kiwis':6.00, 'apples': 4.50, 'peaches': 8.75}
otherFruitShop = shop.FruitShop(otherName, otherFruitPrices)
otherPrice = otherFruitShop.getCostPerPound('apples')
print otherPrice
print('Apples cost $%.2f at %s.' % (otherPrice, otherName))
print("My, that's expensive!")
shopTest.py; you can run it like this:[cs188-ta@nova ~]$ python shopTest.py Welcome to the Berkeley Bowl fruit shop 1.0 Apples cost $1.00 at the Berkeley Bowl. Welcome to the Stanford Mall fruit shop 4.5 Apples cost $4.50 at the Stanford Mall. My, that's expensive!
import shop statement told Python to load all of the functions and classes in shop.py. The line berkeleyShop = shop.FruitShop(shopName, fruitPrices) constructs an instance of the FruitShop class defined in shop.py, by calling the __init__ function in that class. Note that we only passed two arguments in, while __init__ seems to take three arguments: (self, name, fruitPrices). The reason for this is that all methods in a class have self as the first argument. The self variable's value is automatically set to the object itself; when calling a method, you only supply the remaining arguments. The self variable contains all the data (name andfruitPrices) for the current specific instance (similar to this in Java). The print statements use the substitution operator (described in the Python docs if you're curious).Static vs Instance Variables
person_class.py containing the following code:class Person:
population = 0
def __init__(self, myAge):
self.age = myAge
Person.population += 1
def get_population(self):
return Person.population
def get_age(self):
return self.age
[cs188-ta@nova ~]$ python person_class.py>>> import person_class
>>> p1 = person_class.Person(12)
>>> p1.get_population()
1
>>> p2 = person_class.Person(63)
>>> p1.get_population()
2
>>> p2.get_population()
2
>>> p1.get_age()
12
>>> p2.get_age()
63age is an instance variable and population is a static variable. population is shared by all instances of the Person class whereas each instance has its own age variable.More Python Tips and Tricks
- Use
rangeto generate a sequence of integers, useful for generating traditional indexedforloops:for index in range(3): print lst[index] - After importing a file, if you edit a source file, the changes will not be immediately propagated in the interpreter. For this, use the
reloadcommand:
>>> reload(shop)
Troubleshooting
- Problem:
ImportError: No module named pySolution:
When usingimport, do not include the ".py" from the filename.
For example, you should say:import shop
NOT:import shop.py - Problem:
NameError: name 'MY VARIABLE' is not defined
Even after importing you may see this.Solution:
To access a member of a module, you have to typeMODULE NAME.MEMBER NAME, whereMODULE NAMEis the name of the.pyfile, andMEMBER NAMEis the name of the variable (or function) you are trying to access. - Problem:
TypeError: 'dict' object is not callableSolution:
Dictionary looks up are done using square brackets: [ and ]. NOT parenthesis: ( and ). - Problem:
ValueError: too many values to unpackSolution:
Make sure the number of variables you are assigning in aforloop matches the number of elements in each item of the list. Similarly for working with tuples.For example, ifpairis a tuple of two elements (e.g.pair =('apple', 2.0)) then the following code would cause the "too many values to unpack error":(a,b,c) = pairHere is a problematic scenario involving aforloop:pairList = [('apples', 2.00), ('oranges', 1.50), ('pears', 1.75)] for fruit, price, color in pairList: print '%s fruit costs %f and is the color %s' % (fruit, price, color) - Problem:
AttributeError: 'list' object has no attribute 'length' (or something similar)Solution:
Finding length of lists is done usinglen(NAME OF LIST). - Problem:
Changes to a file are not taking effect.Solution:- Make sure you are saving all your files after any changes.
- If you are editing a file in a window different from the one you are using to execute python, make sure you
reload(YOUR_MODULE)to guarantee your changes are being reflected.reloadworks similarly toimport.
More References
- The place to go for more Python information: www.python.org
- A good reference book: Learning Python (From the UCB campus, you can read the whole book online)
Tutorial Python Basics
Python Basics Required Files You can download all of the files associated with the Python mini-tutorial as a zip archive: python_basics...