#!/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[ ]: