Lecture 2 Core Python Language¶
Mostly copied from the official python tutorial
Invoking Python¶
There are three main ways to use python.
- By running a python file, e.g.
python myscript.py
- Through an interactive console (python interpreter or ipython shell)
- In an interactive iPython notebook
We will be using the iPython notebook.
Basic Variables: Numbers and String¶
# comments are anything that comes after the "#" symbol
a = 1 # assign 1 to variable a
b = "hello" # assign "hello" to variable b
The following identifiers are used as reserved words, or keywords of the language, and cannot be used as ordinary identifiers. They must be spelled exactly as written here:
False class finally is return
None continue for lambda try
True def from nonlocal while
and del global not with
as elif if or yield
assert else import pass
break except in raise
Additionally, the following a built in functions which are always available in your namespace once you open a python interpreter
abs() dict() help() min() setattr() all() dir() hex() next() slice() any()
divmod() id() object() sorted() ascii() enumerate() input() oct() staticmethod()
bin() eval() int() open() str() bool() exec() isinstance() ord() sum() bytearray()
filter() issubclass() pow() super() bytes() float() iter() print() tuple()
callable() format() len() property() type() chr() frozenset() list() range()
vars() classmethod() getattr() locals() repr() zip() compile() globals() map()
reversed() __import__() complex() hasattr() max() round() delattr() hash()
memoryview() set()
# how to we see our variables?
print(a)
print(b)
print(a,b)
1 hello 1 hello
All variables are objects. Every object has a type (class). To find out what type your variables are
# as a shortcut, iPython notebooks will automatically print whatever is on the last line
type(b)
str
type(a) is int
True
Different objects attributes and methods, which can be accessed via the syntax variable.method
IPython will autocomplete if you press <tab>
to show you the methods available.
# this returns the method itself
b.capitalize
<function str.capitalize()>
# this calls the method
b.capitalize()
# there are lots of other methods
'Hello'
# binary operations act differently on different types of objects
c = 'World'
print(b + c)
print(a + 2)
print(a + b)
helloWorld 3
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[9], line 5 3 print(b + c) 4 print(a + 2) ----> 5 print(a + b) TypeError: unsupported operand type(s) for +: 'int' and 'str'
Math¶
Basic arithmetic and boolean logic is part of the core python library.
# addition / subtraction
1+1-5
-3
# multiplication
5 * 10
50
# division
1/2
0.5
# that was automatically converted to a float
type(1/2)
float
# exponentiation
2**4
16
# rounding
round(9/10)
1
# built in complex number support
(1+2j) / (3-4j)
(-0.2+0.4j)
# logic
True and True
True
True and False
False
True or True
True
(not True) or (not False)
True
Conditionals¶
The first step to programming. Plus an intro to python syntax.
x = 100
if x > 0:
print('Positive Number')
elif x < 0:
print('Negative Number')
else:
print ('Zero!')
Positive Number
# indentation is MANDATORY
# blocks are closed by indentation level
if x > 0:
print('Positive Number')
if x >= 100:
print('Huge number!')
Positive Number Huge number!
More Flow Control¶
# make a loop
count = 0
while count < 10:
# bad way
# count = count + 1
# better way
count += 1
print(count)
10
# use range
for i in range(5):
print(i)
0 1 2 3 4
Important point: in python, we always count from 0!
# what is range?
type(range)
type
range?
Init signature: range(self, /, *args, **kwargs) Docstring: range(stop) -> range object range(start, stop[, step]) -> range object Return an object that produces a sequence of integers from start (inclusive) to stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1. start defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3. These are exactly the valid indices for a list of 4 elements. When step is given, it specifies the increment (or decrement). Type: type Subclasses:
# iterate over a list we make up
for pet in ['dog', 'cat', 'fish']:
print(pet, len(pet))
dog 3 cat 3 fish 4
What is the thing in brackets? A list! Lists are one of the core python data structures.
Lists¶
l = ['dog', 'cat', 'fish']
type(l)
list
# list have lots of methods
l.sort()
l
['cat', 'dog', 'fish']
# we can convert a range to a list
r = list(range(5))
r
[0, 1, 2, 3, 4]
while r:
p = r.pop()
print('p:', p)
print('r:', r)
p: 4 r: [0, 1, 2, 3] p: 3 r: [0, 1, 2] p: 2 r: [0, 1] p: 1 r: [0] p: 0 r: []
There are many different ways to interact with lists. Exploring them is part of the fun of python.
list.append(x) Add an item to the end of the list. Equivalent to a[len(a):] = [x].
list.extend(L) Extend the list by appending all the items in the given list. Equivalent to a[len(a):] = L.
list.insert(i, x) Insert an item at a given position. The first argument is the index of the element before which to insert, so a.insert(0, x) inserts at the front of the list, and a.insert(len(a), x) is equivalent to a.append(x).
list.remove(x) Remove the first item from the list whose value is x. It is an error if there is no such item.
list.pop([i]) Remove the item at the given position in the list, and return it. If no index is specified, a.pop() removes and returns the last item in the list. (The square brackets around the i in the method signature denote that the parameter is optional, not that you should type square brackets at that position. You will see this notation frequently in the Python Library Reference.)
list.clear() Remove all items from the list. Equivalent to del a[:].
list.index(x) Return the index in the list of the first item whose value is x. It is an error if there is no such item.
list.count(x) Return the number of times x appears in the list.
list.sort() Sort the items of the list in place.
list.reverse() Reverse the elements of the list in place.
list.copy() Return a shallow copy of the list. Equivalent to a[:].
Don't assume you know how list operations work!
# "add" two lists
x = list(range(5))
y = list(range(10,15))
z = x + y
z
[0, 1, 2, 3, 4, 10, 11, 12, 13, 14]
# access items from a list
print('first', z[0])
print('last', z[-1])
print('first 3', z[:3])
print('last 3', z[-3:])
print('middle, skipping every other item', z[5:10:2])
first 0 last 14 first 3 [0, 1, 2] last 3 [12, 13, 14] middle, skipping every other item [10, 12, 14]
MEMORIZE THIS SYNTAX! It is central to so much of python and often proves confusing for users coming from other languages.
In terms of set notation, python indexing is left inclusive, right exclusive. If you remember this, you will never go wrong.
# that means we get an error from the following
N = len(z)
z[N]
--------------------------------------------------------------------------- IndexError Traceback (most recent call last) Cell In[32], line 3 1 # that means we get an error from the following 2 N = len(z) ----> 3 z[N] IndexError: list index out of range
# this index notation also applies to strings
name = 'Xiaomeng Jin'
print(name[:4])
Xiao
print(name[:-4])
Xiaomeng
print(name[-3:])
Jin
# you can also test for the presence of items in a list
5 in z
False
Lists are not meant for math! They don't have a datatype.
z[4] = 'fish'
z
[0, 1, 2, 3, 'fish', 10, 11, 12, 13, 14]
Python is full of tricks for iterating and working with lists
# a cool python trick: list comprehension
squares = [n**2 for n in range(5)]
squares
[0, 1, 4, 9, 16]
# iterate over two lists together uzing zip
for item1, item2 in zip(x,y):
print('first:', item1, 'second:', item2)
first: 0 second: 10 first: 1 second: 11 first: 2 second: 12 first: 3 second: 13 first: 4 second: 14
Other Data Structures¶
We are almost there. We have the building blocks we need to do basic programming. But python has some other data structures we need to learn about.
Tuples¶
Tuples are similar to lists, but they are immutable—they can't be extended or modified. What is the point of this? Generally speaking: to pack together inhomogeneous data. Tuples can then be unpacked and distributed by other parts of your code.
Tuples may seem confusing at first, but with time you will come to appreciate them. Tuples are great to use if you want the data in your collection to be read-only, never to change, and always remain the same and constant.
# tuples are created with parentheses, or just commas
a = ('Jin', 32, True)
b = 'Wang', 25, False
type(b)
tuple
b
('Wang', 25, False)
# can be indexed like arrays
print(a[1]) # not the first element!
32
# and they can be unpacked
name, age, status = a
Dictionaries¶
This is an extremely useful data structure. It maps keys to values.
Dictionaries are unordered!
Tuples can be used as dictionary keys (specifically, tuples that contain immutable values like strings, numbers, and other tuples). Lists can never be used as dictionary keys, because lists are mutable.
# different ways to create dictionaries : Curly brackets or dict
d = {'name': 'Jin', 'age': 32}
e = dict(name='Wang', age=25)
e
{'name': 'Wang', 'age': 25}
# access a value
d['name']
'Jin'
Square brackets [...]
are python for "get item" in many different contexts.
# test for the presence of a key
print('age' in d)
print('height' in e)
True False
# try to access a non-existant key
d['height']
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) Cell In[50], line 2 1 # try to access a non-existant key ----> 2 d['height'] KeyError: 'height'
# add a new key
d['height'] = (5,3) # a tuple
d
{'name': 'Jin', 'age': 32, 'height': (5, 3)}
# keys don't have to be strings
d[99] = 'nighty nine'
d
{'name': 'Jin', 'age': 32, 'height': (5, 3), 99: 'nighty nine'}
# iterate over keys
for k in d:
print(k, d[k])
name Jin age 32 height (5, 3) 99 nighty nine
# better way
### python 2
### for key, val in d.iteritems()
for key, val in d.items():
print(key, val)
name Jin age 32 height (5, 3) 99 nighty nine