diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..165b667
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+.idea
+.vscode
+__pycache__
diff --git a/2019/PythonIntro/README.md b/2019/PythonIntro/README.md
new file mode 100644
index 0000000..0b41bec
--- /dev/null
+++ b/2019/PythonIntro/README.md
@@ -0,0 +1,4 @@
+# Notes for introductory to Python
+
+The cource was held by Torstein N-H 27.09.2019.
+These notes were used loosely and are included for future reference.
diff --git a/2019/PythonIntro/notes/00_toolchain.md b/2019/PythonIntro/notes/00_toolchain.md
new file mode 100644
index 0000000..7133e73
--- /dev/null
+++ b/2019/PythonIntro/notes/00_toolchain.md
@@ -0,0 +1,44 @@
+# Tools needed to work efficiently with python
+
+## Python
+The interpreter, needed to run any python program.
+
+### MacOS / Linux / BSD
+Install the newest python available from your package manager.
+At the moment 3.6 or 3.7.
+
+### Windows / MacOS
+Install the newest version from [the python foundation](https://www.python.org/downloads/).
+
+## PIP
+A package manager for python libraries (and more). Maybe the best part of python.
+
+It comes with most new installations of python, if not try the following:
+
+### MacOS / Linux / BSD
+Install the newest python available from your package manager.
+Note that, if python 2 is installed pip will install packages for python2 and pip3 packages for python3.
+
+### Windows
+It might come with the python installation.
+
+Try
+```
+python3 -m pip install <package name>
+```
+If not, try installing it from wsl.
+
+If all else fails, it probably includes running random binary scripts as administrator, good luck.
+
+## A good editor
+Learning python is mostly useless if you cant write something in it, find a good editor.
+
+Recommendations:
+- PyCharm
+- Spyder
+- Thonny
+- VSCode (or VSCodium)
+- Atom
+- Emacs
+- Vim
+- Notepad++
\ No newline at end of file
diff --git a/2019/PythonIntro/notes/01_introduction.py b/2019/PythonIntro/notes/01_introduction.py
new file mode 100644
index 0000000..b535d38
--- /dev/null
+++ b/2019/PythonIntro/notes/01_introduction.py
@@ -0,0 +1,34 @@
+"""
+This is a multiline string
+It is customary to use start the file with a multiline string for documentation.
+"""
+
+"And this a single line string"
+
+'Both types of string can be written with single quotes as well'
+
+"This string contains a \" escaped with a \\ "
+
+"If i want a newline\nI can get it along with a\t\tdouble tab in the middle of a line."
+r"This is a literal string, i can write \n without a newline."
+
+# Comments are nicer for documentation as they are harder to mistake for code.
+
+# This is an integer
+4
+
+# This is a float
+3.14
+
+# And this an integer bound to a variable
+a = 4
+
+# Most data can be printed with the print function
+print("Hello world")
+
+# Arithmetic works as expected
+print(4 * 4 + 1 * 3)
+
+# Note that exponentials and rounding are weird
+print(3 ** 2)
+print(int(2.9))
\ No newline at end of file
diff --git a/2019/PythonIntro/notes/02_controlFlow.py b/2019/PythonIntro/notes/02_controlFlow.py
new file mode 100644
index 0000000..b37e46f
--- /dev/null
+++ b/2019/PythonIntro/notes/02_controlFlow.py
@@ -0,0 +1,69 @@
+"""
+Examples of conditionals and loops in python
+"""
+
+
+# This is an if statement
+if True:
+    print("This is true")
+
+    print("Noe mer her...")
+
+# And this another one
+if False:
+    print("This will never be printed")
+
+# Conditions can be more complex
+if 1 in [3, 2, 1, 0] and "a" != "B":
+    print("This should happen even though it is needlessly complex")
+
+# And have multiple terms
+if False:
+    pass
+elif 2 + 2 == 5:
+    five = 2 + 2
+else:
+    pass
+
+# Loops also exist, the most normal is for
+for x in range(1, 11):
+    for y in range(1, 11):
+        print(x * y, end=" \t\t")
+    print()
+
+for x in ["a", "b", "c"]:
+    print(x)
+
+# Another example
+for y in ["Det", "var", "en", "gang", "en", "liste"]:
+    print(y, end=" ")
+print()
+
+# Loops can have unknown length
+i = 0
+while i <= 10:
+    print("i is <= 10")
+    i += 1
+
+# The can also be made infinite
+while True:
+    if i < 5:
+        break
+    
+    print("i > 5")
+    if False:
+        continue
+    i -= 1
+
+
+# Loops can have an else clause
+while True:
+    break
+else:
+    print("This wont happens because of the break.")
+
+for i in range(2):
+    if i < -1000:
+        break
+else:
+    print("This will be printed because the loop exits from its condition, not a break.")
\ No newline at end of file
diff --git a/2019/PythonIntro/notes/03_functions.py b/2019/PythonIntro/notes/03_functions.py
new file mode 100644
index 0000000..edbe296
--- /dev/null
+++ b/2019/PythonIntro/notes/03_functions.py
@@ -0,0 +1,47 @@
+"""
+About functions in python
+"""
+
+# Users may define their own custom functions
+def temp():
+    return 3
+
+# And they may be called after they are defined
+print(temp())
+
+# They take arguments
+def temp2(x, y):
+    return x * y
+
+temp2(1, 4)
+
+# And be used lazily
+def foo(y):
+    return bar(y) - 1
+# foo may not be called here because bar does not yet exist
+# print(foo(5))
+def bar(x):
+    return x + 1
+
+print(foo(5))
+
+# Type hinting is supported (but not enforced)
+def strong_typed(text: str, n: int) -> str:
+    nstr = str()
+    for _ in range(n):
+        nstr += text
+    
+    return nstr
+print(strong_typed("Hello world ", 4))
+
+# Functions can take any number of arguments, optional arguments and and keyword arguments
+def fancy_func(a, b="Hello", c: int = 8) -> None:
+    d = a + c
+    print(b, d)
+fancy_func(1, c=6)
+
+# They don't even need names
+print((lambda x, y : x * y)(2, 3))
+
+# Though lambdas are cool, they are rarely used in python
+# Decorators are often cleaner
diff --git a/2019/PythonIntro/notes/04_1_objectorientation.py b/2019/PythonIntro/notes/04_1_objectorientation.py
new file mode 100644
index 0000000..b2d8d74
--- /dev/null
+++ b/2019/PythonIntro/notes/04_1_objectorientation.py
@@ -0,0 +1,17 @@
+"""
+In python, all things are object.
+This means that all functionality associated with a piece of data is stored with the data.
+"""
+
+# Making a new integer with the int constructor:
+
+a = int(5)
+b = int(4)
+
+# Adding them together
+print(a + b)
+# Or without the read macro and function call:
+print(a.__add__(b).__repr__())
+
+# The most useful method ever
+print("Hello {}\nI am {}".format("people who are still here", "the master of the .format method on strings"))
\ No newline at end of file
diff --git a/2019/PythonIntro/notes/04_2_makingObjects.py b/2019/PythonIntro/notes/04_2_makingObjects.py
new file mode 100644
index 0000000..d4db65b
--- /dev/null
+++ b/2019/PythonIntro/notes/04_2_makingObjects.py
@@ -0,0 +1,32 @@
+"""
+Skippable if out of time, hot to define ones own objects.
+"""
+
+from __future__ import annotations
+
+class MyVector(list):
+    a = 0
+
+    def __init__(self, dim: int, data: list):
+        if dim != len(data):
+            raise ValueError("Wrong dimensions in the vector!!!")
+        self.dim = dim
+        self.data = data
+    
+    def __add__(self, other: MyVector):
+        if self.dim != other.dim:
+            return None
+        else:
+            return MyVector(self.dim, [a + b for a, b in zip(self.data, other.data)])
+    
+    def __repr__(self):
+        return "A vector of dimension {} with data:\n{}".format(self.dim, self.data)
+
+
+a = MyVector(3, [1, 2, 3])
+b = MyVector(3, [-1, -4, 8])
+
+print(a)
+print(b)
+
+print(a + b)
diff --git a/2019/PythonIntro/notes/05_1_datastructures.py b/2019/PythonIntro/notes/05_1_datastructures.py
new file mode 100644
index 0000000..bcfbdc0
--- /dev/null
+++ b/2019/PythonIntro/notes/05_1_datastructures.py
@@ -0,0 +1,79 @@
+"""
+Good built in data structures is among the most important things in a good language.
+Python has several.
+"""
+
+# The list
+a = list()
+a = []
+a = [1, 3, 4, 5 ,6]
+
+# They act like expected
+for item in a:
+    print(item)
+print("\n\n")
+
+# They can contain different types
+b = [1, "Hello", a, 3.14, lambda a : a + 1]
+
+for item in b:
+    print(item)
+
+# And be mutated
+a.append(8)
+a.extend(["Hello", "World"])
+a[1] = 100
+
+print(a)
+
+print(a[:5])
+
+print("\n\n\n")
+
+# They are objects and can be inherited as such
+print(dir(a))
+
+class MyList(list):
+    def __repr__(self):
+        return "This is a useless representation"
+    #pass
+
+b = MyList(a)
+print(b)
+
+
+# The dictionary
+# A mutable fast type agnostic hashed map
+a = dict()
+a = {}
+a = {2: "Hello world", 3: b, 8: 6.12345}
+# Note that all keys must be hashable
+# a[["Not working"]] = 3
+a[3] = ["This might work", "I think"]
+print(a)
+
+# They can be mutated
+a[2] = 5
+del a[3]
+
+print(a)
+
+# The keys and values can be easily red
+print(a.keys())
+print(a.values())
+
+
+# The set
+
+# They act like keys in dictionaries, assuming this makes using them easy
+a = set()
+a = {'apple', 'orange', 'apple', 'banana', 3, 3, 3, 3, 3}
+print(a)
+
+# Lists and set can be made from each other
+a = [1, 2, 3, 2, 1, 2, 3, 2, 1]
+b = set(a)
+c = list(b)
+print(a)
+print(b)
+print(c)
diff --git a/2019/PythonIntro/notes/05_2_usefulFunctions.py b/2019/PythonIntro/notes/05_2_usefulFunctions.py
new file mode 100644
index 0000000..76fcffe
--- /dev/null
+++ b/2019/PythonIntro/notes/05_2_usefulFunctions.py
@@ -0,0 +1,32 @@
+"""
+Some useful functions that should be mentioned
+Most are used on lists
+"""
+
+# zip
+for a, b in zip([1, 2, 3, 4], [3, 2, 1]):
+    print("Found {} and {}, added it is {}.".format(a, b, a+b))
+
+# map
+print()
+mapped = map(lambda x: 2 * x, [1, 2, 0])
+print(mapped)
+print(list(mapped))
+
+print()
+mapped = map(lambda a, b: a - b, [5, 3, 0], [2, 3, -5, 8])
+print(mapped)
+print(list(mapped))
+
+# filter
+print()
+filtered = filter(lambda x: x == 3 or x is not None and x % 3 == 1, [3, 4, None, 11, 12, 13])
+print(filtered)
+print(list(filtered))
+
+# div. normal utils
+print()
+print(len([1, 2, 3]))
+print(max([1, 2, 3]))
+print(min([1, 2, 3]))
+print(sorted([1, 3, 2]))
\ No newline at end of file
diff --git a/2019/PythonIntro/notes/06_io.py b/2019/PythonIntro/notes/06_io.py
new file mode 100644
index 0000000..7b4756f
--- /dev/null
+++ b/2019/PythonIntro/notes/06_io.py
@@ -0,0 +1,32 @@
+"""
+IO is boring but useful, here is how.
+"""
+
+# Input and output from the user is easy.
+a = input("Some prompt here: ")
+print(a)
+
+# Input from files are a bit more tricky
+
+# The way taught in ITGK
+f = open("file.txt")
+f.close()
+
+# The correct way
+
+
+with open("file.txt", "r") as f:
+    lines = f.readlines()
+    for line in lines:
+        print(line)
+
+# Or even better
+with open("file.txt", "r") as f:
+    for line in f:
+        print(line)
+
+# Even better
+with open("newFile.txt", 'w') as f:
+    f.write("This is a new file\nI like it.\n")
+
+# There are four modes of reading, r, w, a and r+
\ No newline at end of file
diff --git a/2019/PythonIntro/notes/07_importing.py b/2019/PythonIntro/notes/07_importing.py
new file mode 100644
index 0000000..9183186
--- /dev/null
+++ b/2019/PythonIntro/notes/07_importing.py
@@ -0,0 +1,21 @@
+"""
+It is easier to reuse code and structure projects in multiple files.
+"""
+
+# We can import our own code
+
+funcs = __import__("03_functions")
+
+print("\n\n")
+funcs.fancy_func(3)
+print("\n\n")
+
+import pandas
+import numpy as np
+
+print(np.pi)
+
+from numpy import e
+print(e)
+
+# Libraries makes life easier, use pip for everything always
\ No newline at end of file
diff --git a/2019/PythonIntro/notes/file.txt b/2019/PythonIntro/notes/file.txt
new file mode 100644
index 0000000..29256bc
--- /dev/null
+++ b/2019/PythonIntro/notes/file.txt
@@ -0,0 +1,45 @@
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+Ornare suspendisse sed nisi lacus sed viverra tellus. Faucibus scelerisque eleifend donec pretium vulputate sapien. Mollis
+nunc sed id semper. Quisque id diam vel quam elementum pulvinar etiam. Nibh sit amet commodo nulla facilisi nullam vehicula.
+Porta lorem mollis aliquam ut porttitor. Senectus et netus et malesuada. Feugiat nibh sed pulvinar proin gravida hendrerit.
+Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Arcu ac tortor dignissim convallis aenean et
+tortor. Dictum non consectetur a erat nam at. Sagittis purus sit amet volutpat consequat mauris nunc. Nullam non nisi est
+sit amet facilisis. Mi eget mauris pharetra et. Id consectetur purus ut faucibus pulvinar elementum integer enim. Enim
+facilisis gravida neque convallis a cras semper auctor neque. Nunc vel risus commodo viverra maecenas accumsan lacus vel.
+Consequat id porta nibh venenatis cras sed felis eget.
+
+Mauris cursus mattis molestie a iaculis at. Enim nunc faucibus a pellentesque sit amet porttitor. Et ligula ullamcorper
+malesuada proin libero nunc consequat. Pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Quam
+viverra orci sagittis eu volutpat. Tellus in hac habitasse platea dictumst vestibulum rhoncus. Commodo ullamcorper a
+lacus vestibulum. Mi eget mauris pharetra et ultrices. Quisque non tellus orci ac. Adipiscing bibendum est ultricies
+integer quis auctor elit. Malesuada fames ac turpis egestas sed tempus urna et. Iaculis nunc sed augue lacus viverra
+vitae congue eu consequat.
+
+Sit amet nisl purus in mollis nunc sed id. Viverra nibh cras pulvinar mattis nunc sed blandit libero volutpat. Elit
+pellentesque habitant morbi tristique senectus et netus. Nec feugiat nisl pretium fusce id velit ut tortor. Et netus et
+malesuada fames ac turpis egestas sed tempus. Sapien nec sagittis aliquam malesuada. Malesuada proin libero nunc 
+onsequat interdum varius sit amet. Sit amet porttitor eget dolor morbi non arcu risus. Id diam vel quam elementum.
+Massa id neque aliquam vestibulum morbi blandit cursus risus at. Morbi leo urna molestie at elementum eu facilisis sed.
+Odio euismod lacinia at quis. Et tortor consequat id porta nibh. Laoreet suspendisse interdum consectetur libero id
+faucibus nisl tincidunt eget. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Id nibh tortor id
+aliquet lectus proin. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Vitae congue eu consequat ac felis
+donec et odio. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus et.
+
+Vel eros donec ac odio tempor orci dapibus. Euismod lacinia at quis risus sed vulputate odio ut enim. Vel pharetra vel
+turpis nunc eget. Justo nec ultrices dui sapien. Donec enim diam vulputate ut pharetra sit amet. Consectetur adipiscing
+elit duis tristique. Ipsum nunc aliquet bibendum enim facilisis gravida neque convallis. Lorem mollis aliquam ut
+porttitor leo a diam sollicitudin tempor. Integer vitae justo eget magna fermentum iaculis eu. Id faucibus nisl tincidunt
+eget nullam non nisi. Tempus iaculis urna id volutpat lacus. Diam sit amet nisl suscipit adipiscing bibendum est.
+Tellus orci ac auctor augue mauris. Accumsan sit amet nulla facilisi morbi tempus iaculis urna id. Fermentum iaculis eu
+non diam phasellus vestibulum lorem sed. Iaculis urna id volutpat lacus laoreet non curabitur gravida. Id faucibus nisl
+tincidunt eget.
+
+Massa vitae tortor condimentum lacinia quis vel eros. Pulvinar pellentesque habitant morbi tristique senectus et netus.
+Tincidunt dui ut ornare lectus sit amet est placerat in. Pellentesque elit eget gravida cum sociis. Malesuada fames ac
+turpis egestas sed. Et odio pellentesque diam volutpat commodo sed egestas egestas fringilla. Augue lacus viverra vitae
+congue eu consequat ac felis. Tempor orci dapibus ultrices in iaculis nunc sed augue. Odio ut enim blandit volutpat
+maecenas volutpat blandit aliquam. Accumsan sit amet nulla facilisi morbi tempus. Habitant morbi tristique senectus
+et netus et malesuada fames. Elementum facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Mi tempus
+imperdiet nulla malesuada pellentesque elit eget. Tristique sollicitudin nibh sit amet. Porttitor massa id neque aliquam
+vestibulum morbi blandit cursus. Proin sed libero enim sed. Neque gravida in fermentum et sollicitudin ac orci.
+Neque volutpat ac tincidunt vitae semper quis lectus nulla. A diam maecenas sed enim ut sem viverra.
\ No newline at end of file
diff --git a/2019/PythonIntro/notes/kurstekst.txt b/2019/PythonIntro/notes/kurstekst.txt
new file mode 100644
index 0000000..53e25e4
--- /dev/null
+++ b/2019/PythonIntro/notes/kurstekst.txt
@@ -0,0 +1,6 @@
+Kurstekst for introkurs i Python
+
+
+Har du lyst til å lære å programmere i Python? Synes du ITGK-forelesningene går for sent, eller ønsker du å pusse opp glemte kunnskaper?
+Da er dekke kurset for deg.
+Kurset går gjennom språkets oppbygging fra kommentarer til overlagring av operatorer, ingen forkunnskaper kreves.
diff --git a/2019/PythonIntro/notes/newFile.txt b/2019/PythonIntro/notes/newFile.txt
new file mode 100644
index 0000000..ab3c0af
--- /dev/null
+++ b/2019/PythonIntro/notes/newFile.txt
@@ -0,0 +1,2 @@
+This is a new file
+I like it.
diff --git a/2019/PythonIntro/notes/requirements.txt b/2019/PythonIntro/notes/requirements.txt
new file mode 100644
index 0000000..f3f0d0f
--- /dev/null
+++ b/2019/PythonIntro/notes/requirements.txt
@@ -0,0 +1,3 @@
+asn1crypto<=0.24.0
+astroid>=2.2.5
+attrs
diff --git a/2019/PythonIntro/notes/tempCodeRunnerFile.py b/2019/PythonIntro/notes/tempCodeRunnerFile.py
new file mode 100644
index 0000000..37ace18
--- /dev/null
+++ b/2019/PythonIntro/notes/tempCodeRunnerFile.py
@@ -0,0 +1 @@
+pi
\ No newline at end of file