1. week 1
    1. variables
    2. built-in functions
      1. dir()
      2. help()
    3. function definition
      1. def function_name(parameters): body
      2. return expression
        1. What is passed back to the caller? -That memory address is passed back to the caller. What is displayed? -Nothing!
  2. week 2
    1. type STR immutable cannot be modified
      1. single/double quote. triple-quote multi-line strings
      2. escape sequence - '\'
      3. String operators
        1. +, *
    2. print
      1. What is passed back to the caller? -Nothing! What is displayed? -The values at those memory address(es) are displayed on the screen.
    3. input method
      1. var = input("value returned from this function is always a string")
    4. docstring Built-in function help() displays the docstring from a function definition
    5. Function Design Recipe
      1. 1. Examples What should your function do? Type a couple of example calls. Pick a name (often a verb or verb phrase): What is a short answer to "What does your function do"? 2. Type Contract What are the parameter types? What type of value is returned? 3. Header Pick meaningful parameter names. 4. Description Mention every parameter in your description. Describe the return value. 5. Body Write the body of your function. 6. Test Run the examples.
        1. def convert_to_celsius(fahrenheit): ''' (number) -> number Return the number of Celsius degrees equivalent to fahrenheit degrees. >>> convert_to_ccelsius(32) 0 >>> convert_to_celsius(212) 100 ''' return (fahrenheit - 32) * 5 / 9
    6. Function Reuse
    7. Function calls
  3. week3
    1. Functions, Variables, and the Call Stack, frames, namespace
    2. Type: bool True or False
      1. Comparison operators
        1. <, >, ==, >=, <=, !=
      2. Logical Operators
        1. AND
          1. True True -> True True False -> False False True -> False False False -> False
        2. OR
          1. True True -> True True False -> True False True -> True False False -> False
        3. NOT
          1. True False False True
    3. type conversion
      1. str(int/float)
      2. int(str, float) If called with a string that can't be converted, a ValueError happens
      3. float(int/str) If called with a string that can't be converted, a ValueError happens
    4. import module
      1. import module
      2. from module import */name
    5. IF statement
      1. if expression1: body1 [elif expression2: 0 or more clauses body2] [else: 0 or 1 clause bodyN]
      2. Check code and reduce IF statements if possible
      3. Remember if-elif if-if usage options
        1. if-elif is single block. runs only if is false. if IF is true elif is not ran
        2. in IF-IF case every if is separate statement and runing in sequence
      4. Nested IFs
    6. None - value, is NoneType
  4. week 4
    1. More STR operators
      1. Comparison
      2. if substring is IN another one if contains
        1. >>> 'c' in 'aeiou' False >>> 'cad' in 'abracadabra' True >>> 'zoo' in 'ooze' False
      3. len(str)
    2. STR indexing and slicing
      1. Indexing
        1. str[0], str[1],... str[-2], str[-1]
      2. slicing
        1. str[0:1], str[0,len(str)],str[0:], str[:-1] indexes higher then actual indexes return whole word not crossing indexes returning empty string
    3. Modifying strings TypeError: 'str' object does not support item assignment
    4. String Methods
      1. lower(), upper(),endswith(), isnumerical(), count()
    5. FOR loop
      1. for variable in str: body
        1. Accumulator pattern
        2. outside counter
      2. runs while true and definied number of loops
  5. week 5
    1. WHILE loop
      1. while expression: statements
      2. runs infinite number of loops untill expression is FALSE
    2. Lazy Evaluation Condition stops as soon as first element is true or false not checking further conditions
    3. comments #
    4. type LIST mutable can be modified
      1. [expr1, expr2, ..., exprN]
      2. list operations
        1. indexing
          1. grades = [80, 90, 70] >>> grades[0] 80 >>> grades[1] 90 >>> grades[2] 70
        2. slicing
          1. >>> grades[0:2] [80, 90]
        3. IN operator
          1. >>> 90 in grades True >>> 60 in grades False
        4. looping over list elements with FOR loop
          1. >>> for grade in grades: print(grade) 80 90 70
      3. built-in funcs
        1. len(list): return the length of list. min(list): return the smallest element in list. max(list): return the largest element in list. sum(list): return the sum of elements of list (where list items must be numeric).
      4. list methods
        1. help(list)
      5. Lists elements may be of any type
    5. Mutability
      1. mutable: they can be modified
        1. list, dict, set
      2. immutable: they cannot be modified
        1. str, int, float and bool, tuple, frozen set
    6. Aliasing
      1. A side affect. Hard to find bugs
    7. RANGE
      1. range([start,] stop[, step]): return a virtual sequence of numbers from start to stop by step
  6. week 6
    1. FOR loops over indices
      1. # Iterating over the indices of a list for i in range(len(lst)): print(lst[i])
    2. Parallel Lists and Strings Corresponding Elements
    3. Nested Lists
      1. Lists can contain items of any type, including other lists
    4. Nested Loops
      1. The bodies of loops can contain any statements, including other loops.
    5. Reading Files
      1. open(filename, mode)
        1. 'r' - to open for reading 'w' - to open for writing 'a' - open for appending to what is already in the file
      2. File read methods
        1. readline()
          1. When you want to process only part of a file.
        2. for line in file
          1. process every line in the file one at a time
        3. readlines()
          1. return all lines in a file in a list
        4. read()
          1. read the whole file at once and use it as a single string
      3. flanders_file.close()
    6. Writing Files
      1. file.write(str)
      2. File dialogs
        1. import tkinter.filedialog
        2. from_filename = tkinter.filedialog.askopenfilename()
        3. to_filename = tkinter.filedialog.asksaveasfilename()
      3. from_file.close()
  7. week 7
    1. type DICT
      1. {key1: value1, key2: value2, ..., keyN: valueN}
      2. >>> dict['key'] corresponding value
      3. IN operator to check KEY existance
      4. len(dict) - number of key:value pairs
      5. because dict is mutable elements can be changed
      6. del dict[(key)] #remove key:value pair
      7. for looping over keys
      8. key:value are unordered in dict
      9. empty dict = {}
      10. key MUST be immutable
    2. tuples
      1. indexing
      2. slicing
      3. for looping
      4. fewer methods then lists
      5. len(tuple)