====== Bra moduler ====== * pyserial -- Comport * matplotlib -- Matlabliknande plotverktyg * [[python:numpy]] -- Matlabliknande matte * pandas -- Importera och exportera till olika filformat, ex CSV, tydligen också för att behandla data [[https://docs.python.org/3/reference/|Official reference]] ====== Saker jag vill ha svar på ====== * Grundläggande datastrukturer i Python * Grundläggande datastrukturer i NumPy * Grundläggande datastrukturer i Pandas * Grundläggande datastrukturer i Matplotlib * Hur man läser syntaxguide i pythons dokumentation * Hur man använder context managers * Vad är generators, hur fungerar yield * Vem fan kom på syntaxen ''mylist = [x*x for x in range(3)]'' och när kan den användas? * ^ Verkar vara [[https://www.w3schools.com/python/python_lists_comprehension.asp|List comprehensions]] ====== Cheat sheet ====== empty_list = [] # Tuples are immutable, can contain different datatypes empty_tuple = () populated_tuple = (1, 2, "Kalle", 4.32) singleton_tuple = (3,) print(populated_tuple[2]) # Prints Kalle # Ranges are also immutable r1 = range(0,20,2) # Start stop step # Strings single_str = 'Single quotes allows "double quotes" to be embedded' double_str = "Single quotes allows 'single quotes' to be embedded" triple_str = '''Can be initiated with either single or double quotes and can span multiple lines, including all whitespaces.''' no_escape = r"This string doesn't escape where the \backslash character is encountered" concatenation = 'Literals' " can be concatenated" ''' in this way actually''' # Dictionaries, keys must be hashable >>> a = dict(one=1, two=2, three=3) >>> b = {'one': 1, 'two': 2, 'three': 3} >>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3])) >>> d = dict([('two', 2), ('one', 1), ('three', 3)]) >>> e = dict({'three': 3, 'one': 1, 'two': 2}) >>> a == b == c == d == e True >>> empty_dict = {} my_dict = {'shit': 1337, 'man': 2021, 'dude':1991} all_keys = list(my_dict) leet = my_dict['shit'] # Dictionaries can be unpacked and used as arguments to a function dude = {a: 4, b: 5} function_that_takes_a_and_b(**dude) # Set types must contain hashable objects. They are not ordered and cannot be indexed >>> my_pants = {1, 2, 'shit', 'dude'} >>> 'shit' in my_pants True # Byte objects are very similar to strings, but each character has a value 0-255 # They are created in the same way, but with the prefix 'b' my_bytes = b'Yoman!' ten_zero_bytes = bytes(10) int_to_bytes = bytes([10]) int_to_bytes_again = bytes([10, 4, 21, 0, 255]) my_bytes = 'This is a string'.encode() my_str = my_bytes.decode() # Print formatted outputs print("Id: {0}, value: {1:02X}\n".format(my_id, my_hex_value)) # Print without newline print("No newline after this!", end='') ====== Classes and objects ====== # Name mangling for double underscore and less than one trailing underscores class Foo(object): yo = None # => foo_object.yo _yo = None # => foo_object._yo __yo = None # => foo_object._Foo__yo __yo__ = None # => foo_object.__yo__ # To copy an object import copy inst2 = copy.copy(inst1) ====== Argument parser ====== import argparse def parse_arguments(): parser = argparse.ArgumentParser(description="Some description",epilog="Huh?") parser.add_argument('integers', metavar='N', type=int, nargs='+', help='an integer for the accumulator') parser.add_argument('--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the integers (default: find the max)') parser.add_argument('-v', '--verbose', action='store_true', help='Verbose mode') args = parser.parse_args() return args def main(): args = parse_arguments() if args.verbose: print(dir(args)) if __name__ == '__main__': main() ====== Signals ====== [[https://docs.python.org/3/library/signal.html|Signals python documentation]] import signal def signal_handler_C_c(sig, frame): print('C-c detected, exiting..') def main(): signal.signal(signal.SIGINT, signal_handler_C_c) ====== Exceptions ====== [[https://docs.python.org/3/tutorial/errors.html]] [[https://docs.python.org/3/library/exceptions.html|Predefined exceptions]] # Catch exceptions a_list = ['yo', 'man'] try: print(a_list[3]) except IndexError: print("Index out of range! :(") a_list = ['yo', 'man'] try: print(a_list[3]) except Exception as e: print("Ett fel har uppstått...") print(e) print(type(e)) # Raise exceptions: raise ValueError("Passed array is not of the right shape") ====== Decorators ====== Syntactic sugar based on functions that return function objects. [[https://www.programiz.com/python-programming/decorator|Good guide]], much of the info here is stolen from this site. ===== Basics ===== # Given this function, which is called a decorator function def my_decorator(func): def wrapper(): print("I got decorated!") func() return wrapper # Then one could write something like this def boring(): print("Normal function") pimped_boring = my_decorator(boring) pimped_boring() # Or one could overwrite the boring function name def boring(): print("Normal function") boring = my_decorator(boring) # which is equivalent to write this short-cut syntax @my_decorator def boring(): print("Normal function") ===== Chaining ===== # Given the two decorators def star(func): def inner(*args, **kwargs): print("*" * 30) func(*args, **kwargs) print("*" * 30) return inner def percent(func): def inner(*args, **kwargs): print("%" * 30) func(*args, **kwargs) print("%" * 30) return inner # Then @star @percent def printer(msg): print(msg) # is equivalent to def printer(msg): print(msg) printer = star(percent(printer)) ===== Property decorator and setter decorators ===== [[https://stackoverflow.com/questions/17330160/how-does-the-property-decorator-work-in-python|Explained at stackoverflow]] class MyClass(object): def __init__(self): self._my_property_value = None # Placeholder variable, so getter function works self.my_property = 123 # Will call the proper setter function @property def my_property(self): return self._my_property_value @my_property.setter def my_property(self, value): if value < 0: self._my_property_value = -value * 10 else: self._my_property_value = value/10 my_instance = MyClass() my_instance.my_property = -30 print(my_instance.my_property) # Prints 300 ====== tkinter ====== [[https://tkdocs.com/tutorial/menus.html|Good site]] [[https://tcl.tk/man/tcl8.6/TkCmd/contents.htm|tk reference]] [[https://web.archive.org/web/20200201190621/http://effbot.org/tkinterbook/text.htm|Archived tutorial from effbot.org]]