#!/usr/bin/env python
# coding: utf-8
# ## Basic Training
#
# UC Berkeley Python Bootcamp
#
#
#
#
# follow along the code at:
# http://bit.ly/pyboot_01
#
# In[169]:
get_ipython().run_line_magic('run', 'talktools.py')
# In[170]:
from IPython.display import YouTubeVideo
YouTubeVideo("imhrDrE4-mI",width="640",height="390")
# ### Outline
#
# - Hello World!
# - calculator/basic math
# - strings
# - variables
# - basic control statements
# - indentation!
#
#
# In[ ]:
print("Hello, world.")
# # Calculator #
#
# > there are `int` and `float` (but not doubles)
# In[ ]:
print(2 + 2)
# In[ ]:
2 + 2
# In[ ]:
print(2.1 + 2)
# In[ ]:
2.1 + 2 == 4.0999999999999996
# In[ ]:
get_ipython().run_line_magic('run', 'talktools')
# - Python stores floats as their byte representation so is limited by the same 16-bit precision issues as most other languages
#
# - In doing calculations, unless you specify otherwise, Python will store the results in the smallest-byte representation
# > 1. Indentation matters!
# > 2. When you mess up, Python is gentle
# > 3. \# starts a comments (until the end of the line)
# In[ ]:
print(2 + 2)
2 + 2
# In[ ]:
2 # this is a comment and is not printed
# In[ ]:
# this is also a comment
#
# ** Calculator **
#
# - all the math operators you'd expect, including `**` for power.
# - In Python 3, there is no distinction between `int` and `long`
#
# In[ ]:
42**42
# In[ ]:
(42**42).bit_length()
# In[ ]:
bin(42**42)
# Division always leads to a float
# In[ ]:
2 / 2
# In[ ]:
2 / 2.0
# Note: This is an important difference between Python 2 and Python 3. Old-style division between `int`s can be done with a double slash `//`
# In[ ]:
2 // 2
# In[ ]:
3 // 2
# In[ ]:
2.5 // 2 # egad, dont do this.
# There is also `complex` types
# In[ ]:
complex(1,2)
# In[ ]:
1+2j
# In[ ]:
1 + 2j - 2j
# Note: Access to [`decimal`](https://docs.python.org/3/library/decimal.html#module-decimal) (decimal fixed point and floating point arithmetic) and [`fraction`](https://docs.python.org/3/library/fractions.html#module-fractions) types/operations is through built-in `modules`.
#
# ## Let's do some math
# In[ ]:
(3.0*10.0 - 25.0)/5.0
# In[ ]:
print(3.085e18*1e6) # this is a Megaparsec in units of cm!
# In[ ]:
t = 1.0 # declare a variable t (time)
accel = 9.8 # acceleration in units of m/s^2
# In[ ]:
# distance travelled in time t seconds is 1/2 a*t**2
dist = 0.5*accel*t*t
print(dist) # this is the distance in meters
# In[ ]:
dist1 = accel*(t**2)/2
print(dist1)
# In[ ]:
dist2 = 0.5*accel*pow(t,2)
print(dist2)
# - **variables** are assigned on the fly
# - multiplication, division, exponents as you expect
# In[ ]:
print(6 / 5) ; print(9 / 5)
# In[ ]:
print(6 // 5) ; print(9 // 5) # remember double-slash integer division returns the floor
# In[ ]:
6 % 5 # mod operator, get the remainder. x = (x // y)*y + x % y
# In[ ]:
1 << 2 ## shift: move the number 1 by two bits to the left
## that is make a new number 100 (base 2)
# In[ ]:
5 >> 1 ## shift: move the number 5 = 101 (base 2) one to
## to the right (10 = 2)
# In[ ]:
x = 2 ; y = 3 ## assign two variables on the same line!
x | y ## bitwise OR
# In[ ]:
x ^ y ## exclusive OR (10 ^ 11 = 01)
# In[ ]:
x & y ## bitwise AND
# In[ ]:
x = x ^ y ; print(x)
# In[ ]:
x += 3 ; print(x)
# In[ ]:
x /= 2.0 ; print(x)
# we'll see a lot more mathy operators and functions later
# ## Relationships ##
# In[ ]:
# from before dist1 = 4.9 and dist = 4.9
dist1 == dist
# In[ ]:
dist < 10
# In[ ]:
dist <= 4.9
# In[ ]:
dist < (10 + 2j)
# In[ ]:
dist < -2.0
# In[ ]:
dist != 3.1415
# Try using some Greek characters as variables:
#
# \Delta
#
# ** More on Variables & Types **
# In[ ]:
0 == False
# In[ ]:
not False
# In[ ]:
0.0 == False
# In[ ]:
not (10.0 - 10.0)
# In[ ]:
not -1
# In[ ]:
not 3.1415
# In[ ]:
x = None # None is something special. Not true or false
None == False
# In[ ]:
None == True
# In[ ]:
False or True
# In[ ]:
False and True
# In[ ]:
float("nan") == True
# In[ ]:
print(float('inf'))
# In[ ]:
import math
math.isnan(float("NaN"))
#
# ** More on Variables & Types **
# In[ ]:
print(type(1))
# In[ ]:
x = 2 ; type(x)
# In[ ]:
# bytes are immutable sequences of numbers from 0-255
print((255).to_bytes(2,byteorder='big')) ; type(bytes(10))
# In[ ]:
type(2) == type(1)
# In[ ]:
print(type(True))
# In[ ]:
print(type(type(1)))
# In[ ]:
print(type(pow))
#
# we can test whether something is a certain type with **`isinstance()`**
# In[ ]:
isinstance(1,int)
# In[ ]:
isinstance(1,(int,float))
# In[ ]:
isinstance("spam",str)
# In[ ]:
isinstance(1.212,int)
# In[ ]:
isinstance(1.212,int)
# We'll see later than numbers are objects, which have functions (`methods`) that can act upon themselves:
# In[ ]:
(1.212).is_integer()
# In[ ]:
(1.0).is_integer()
# builtin-types: **`int`**, **`bool`**, **`str`**, **`float`**, **`complex`**, **`bytes`**
# # Strings
# Strings are a sequence of characters
# - they can be indexed and sliced up as if they were an array
# - you can glue strings together with + signs
#
# Strings are **immutable** (unlike in C), so you cannot change a string in place (this isn't so bad...)
#
# Strings can be formatted and compared
# In[ ]:
x = "spam" ; print(type(x))
# In[ ]:
print("hello!\n...my sire.")
# In[ ]:
"hello!\n...my sire."
# In[ ]:
"wah?!" == 'wah?!'
# In[ ]:
print("'wah?!' said the student")
# In[ ]:
print("\"wah?!\" said the student")
# backslashes (\\) start special (escape) characters:
# ```
# \n = newline (\r = return)
# \t = tab
# \a = bell
# ```
# string literals are defined with double quotes or quotes.
# The outermost quote type cannot be used inside the string (unless it's escaped with a backslash)
#
# See: http://docs.python.org/reference/lexical_analysis.html#string-literals
# In[ ]:
print("\a\a\a") # try this in CLI python, not the notebook
# In[ ]:
# raw strings don't escape characters
print(r'This is a raw string...newlines \r\n are ignored.')
# In[ ]:
# Triple quotes are real useful for multiple line strings
y = '''For score and seven minutes ago,
you folks all learned some basic mathy stuff with Python
and boy were you blown away!'''
print(y)
#
# - prepending ``r`` makes that string "raw"
#
# - triple quotes allow you to compose long strings
#
# https://docs.python.org/3.4/reference/lexical_analysis.html#literals
# In[ ]:
print("\N{RIGHT CURLY BRACKET}")
# In[ ]:
print("\N{BLACK HEART SUIT}")
# http://www.fileformat.info/info/unicode/char/search.htm
# In[ ]:
s = "spam" ; e = "eggs"
print(s + e)
# In[ ]:
print("spam"
"eggs"
"Trumpkins")
# In[ ]:
print(s
"eggs")
# In[ ]:
print(s + " and " + e)
# In[ ]:
print(s,"and",e, sep=" ")
# In[ ]:
print("green " + e + " and\n " + s + "\n\t ... and Trumpkins")
# In[ ]:
print(s*3 + e)
# In[ ]:
print(s*3,e,sep="->")
# In[ ]:
print("*"*50)
# In[ ]:
print("spam" == "good") ; print("spam" == "spam")
# In[ ]:
"spam" < "zoo"
# In[ ]:
"s" < "spam"
# - you can concatenate strings with ``+`` sign
# - you can do multiple concatenations with the ``*`` sign
# - strings can be compared
# In[ ]:
print('I want' + 3 + ' eggs and no ' + s)
# In[ ]:
print('I want ' + str(3) + ' eggs and no ' + s)
# In[ ]:
pi = 3.14159
print('I want ' + str(pi) + ' eggs and no ' + s)
# In[ ]:
print(str(True) + ":" + ' I want ' + str(pi) + ' eggs and no ' + s)
# you must concatenate only strings, coercing ("casting")
# other variable types to `str`
# there's a cleaner way to do this, with string formatting. we'll see that tomorrow.
# ### Getting input from the user: always a string response
# In[ ]:
faren = input("Enter the temperature (in Fahrenheit): ")
# In[ ]:
cent = (5.0/9.0)*(faren - 32.0)
# In[ ]:
faren = float(faren)
cent = (5.0/9.0)*(faren - 32.0) ; print(cent)
# In[ ]:
faren = float(input("Enter the temperature (in Fahrenheit): "))
print((5.0/9.0)*(faren - 32.0))
#
# #### We can think of strings as arrays (although, unlike in C you never really need to deal with directly addressing character locations in memory)
# In[ ]:
s ="spam"
len(s)
# In[ ]:
len("eggs\n")
# In[ ]:
len("")
# In[ ]:
s[0]
# In[ ]:
s[-1]
# - ``len()`` gives us the length of an array
# - strings are zero indexed
# - can also count backwards
# We can think of strings as arrays
# (although, unlike in C you never really need to deal with directly addressing character locations in memory)
#
# useful for slicing: indices are between the characters
#
# In[ ]:
s[0:1] # get every character between 0 and 1
# In[ ]:
s[1:4] # get every character between 1 and 4
# In[ ]:
s[-2:-1]
# In[ ]:
## slicing [m:n] will return abs(n-m) characters
s[0:100] # if the index is beyond the len(str), you dont segfault!
# In[ ]:
s[100]
# In[ ]:
s[1:] # python runs the index to the end
# In[ ]:
s[:2] # python runs the index to the beginning
# In[ ]:
s[::-1] # print it out backwards
# s = s[:n] + s[n:] for all n
# ## Basic Control (Flow)
# Python has pretty much all of what you use:
#
# if...elif...else, for, while
#
# As well as:
#
# break, continue (within loops)
#
# Does not have:
#
# case (explicitly), goto
#
# Does have: `pass`
# ### Flow is done within blocks (where indentation matters)
# In[ ]:
x = 1
if x > 0:
print("yo")
else:
print("dude")
# Note: if you are doing this within the Python interpreter you'll see the ...
# ```
# >>> x = 1
# >>> if x > 0:
# ... print "yo"
# ... else:
# ... print "dude"
# ...
# yo
# ```
# Note colons & indentations (tabbed or spaced)
# In[ ]:
x = 1
if x > 0:
print("yo")
else:
print("dude")
# Indentations with the same block must be the same but not within different blocks (though this is ugly)
# one-liners
# In[ ]:
print("yo" if x > 0 else "dude")
# a small program... Do Control-C to stop (in Python/IPython) or "Kernel->Interrupt" in IPython notebook
# In[ ]:
x = 1
y = 0
while True:
print("yo" if x > 0 else "dude")
x *= -1
y += 1
if y > 42:
break
# case statements can be constructed with
# just a bunch of if, elif,...else
# In[ ]:
if x < 1:
print("t")
elif x > 100:
print("yo")
else:
print("dude")
# ordering matters. The first block of `True` in an if/elif gets executed then everything else does not.
# blocks cannot be empty
# In[ ]:
x = "fried goldfish"
if x == "spam for dinner":
print("I will destroy the universe")
else:
# I'm fine with that. I'll do nothing
# `pass` is a "do nothing" statement
# In[ ]:
if x == "spam for dinner":
print("I will destroy the universe")
else:
# I'm fine with that. I'll do nothing
pass
# The double percent sign at the top of an IPython/Jupyter cell is a cell-level "magic". It's not Python itself, but defined as part of IPython/Jupyter. We'll see more on this later in the bootcamp.
# In[ ]:
get_ipython().run_cell_magic('file', 'temp1.py', '# set some initial variables. Set the initial temperature low \nfaren = -1000\n\n# we dont want this going on forever, let\'s make sure we cannot have too many attempts \nmax_attempts = 6\nattempt = 0\n\nwhile faren < 100:\n # let\'s get the user to tell us what temperature it is \n newfaren = float(input("Enter the temperature (in Fahrenheit): "))\n if newfaren > faren:\n print("It\'s getting hotter")\n elif newfaren < faren:\n print("It\'s getting cooler")\n else:\n # nothing has changed, just continue in the loop \n continue\n faren = newfaren # now set the current temp to the new temp just entered \n attempt += 1 # bump up the attempt number \n if attempt >= max_attempts:\n # we have to bail out \n break\nif attempt >= max_attempts:\n # we bailed out because of too many attempts \n print("Too many attempts at raising the temperature.")\nelse:\n # we got here because it\'s hot \n print("it\'s hot here, people.")\n')
# In[ ]:
get_ipython().run_line_magic('run', 'temp1')
# In[ ]:
get_ipython().run_line_magic('run', 'temp1')
# In[ ]:
get_ipython().run_cell_magic('file', 'temp2.py', '\n# set some initial variables. Set the initial temperature low \nfaren = -1000\n\n# we dont want this going on forever, let\'s make sure we cannot have too many attempts \nmax_attempts = 6\nattempt = 0\n\nwhile faren < 100 and (attempt < max_attempts):\n # let\'s get the user to tell us what temperature it is \n newfaren = float(input("Enter the temperature (in Fahrenheit): "))\n if newfaren > faren:\n print("It\'s getting hotter")\n elif newfaren < faren:\n print("It\'s getting cooler")\n else:\n # nothing has changed, just continue in the loop \n continue\n faren = newfaren # now set the current temp to the new temp just entered \n attempt += 1 # bump up the attempt number \n\nif attempt >= max_attempts:\n # we bailed out because of too many attempts \n print("Too many attempts at raising the temperature.")\nelse:\n # we got here because it\'s hot \n print("it\'s hot here, people.")\n')
# UC Berkeley Python Bootcamp - Basic Training
# (c) J. Bloom 2008-2016 All Rights Reserved
# In[ ]: