LATEX, Linux, Python Daniel Borchmann, Tom Hanika, Maximilian Marx 31. Januar 2015 cba Programmieren mit Python Ziele des Abschnitts Ziele This space intentionally left blank. Interaktiv! Python installieren: https://www.python.org/downloads/ hier: Python 3.2+ Programmieren mit Python Funktionen und Objekte Funktionen und Objekte Klassen Konstruktoren Klassen-/Instanzvariablen 1 2 3 4 class Spam(): eggs = [] def __init__(self, bacon): self.bacon = bacon Python 2: 1 2 3 4 class Spam(object): eggs = [] def __init__(self, bacon): self.bacon = bacon Funktionen und Objekte Klassen 1 2 3 4 1 2 3 4 5 6 7 8 Konstruktoren Klassen-/Instanzvariablen class Spam(): eggs = [] def __init__(self, bacon): self.bacon = bacon >>> x = Spam(23) >>> y = Spam(42) >>> x.eggs, x.bacon ([], 23) >>> x.eggs.append(42) >>> x.bacon += 1 >>> y.eggs, x.bacon, y.bacon ([42], 24, 42) Funktionen und Objekte Methoden 1 2 3 4 5 1 2 3 4 5 6 Funktionen in Klassen Klasseninstanz als (explizites) erstes Argument class Spam(): def __init__(self, bacon): self.bacon = bacon def spam(self): print(self.bacon) >>> x = Spam('eggs') >>> y = Spam('bacon') >>> x.spam() eggs >>> y.spam() bacon Funktionen und Objekte Eigenschaften Attribute statt Funktionen 1 2 3 4 5 6 7 1 2 3 4 5 class Spam(): def __init__(self): self._eggs = 0 def eggs(self): self._eggs += 1 print('{}␣eggs'.format(self._eggs)) eggs = property(eggs) >>> x = Spam() >>> x.eggs 1 eggs >>> x.eggs 2 eggs Funktionen und Objekte Gibt’s das auch mit Zucker? 1 2 3 4 5 6 7 8 9 10 1 2 3 Dekoratoren als Kurzschreibweise class Spam(): def __init__(self): self._eggs = 0 @property def eggs(self): self._eggs += 1 print('{}␣eggs'.format(self._eggs)) @eggs.setter def eggs(self, n): self._eggs = n >>> x = Spam(); x.eggs = 41 >>> x.eggs 42 eggs Programmieren mit Python Comprehensions Comprehensions Listen A = { x + 1 | x ∈ [1, 10) } B = { x + 1 | x ∈ A, x = 2 mod 3 } 1 2 3 4 5 6 >>> >>> >>> [2, >>> [3, a = [x + 1 for x in range(1, 10)] b = [x + 1 for x in a if x % 3 == 2] a 3, 4, 5, 6, 7, 8, 9, 10] b 6, 9] Comprehensions Sequenzen Auch für Sets und Dictionaries Faulheit: Generator-Ausdrücke 1 2 3 4 5 6 7 8 >>> {x % 3 for x in range(1, 10)} {0, 1, 2} >>> {w: len(w) for w in ['eggs', 'bacon', 'spam']} {'spam': 4, 'eggs': 4, 'bacon': 5} >>> (x % 3 for x in range(1, 1000)) <generator object <genexpr> at 0x7fe12484be10> >>> len(list(_)) 999 Programmieren mit Python Module Module Import 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 >>> >>> 0.0 >>> >>> 0.0 >>> >>> 0.0 >>> >>> 0.0 >>> >>> 0.0 import math math.sin(0) import math as m m.sin(0) from math import sin, cos sin(0) from math import sin as s s(0) from math import * tan(0) Module Batteries included Nützliche Module in der Standardbibliothek Textverarbeitung: re, string, textwrap Mathematik: decimal, fractions, math, random, statistics Funktionen: functools, itertools, operator Sonstiges: argparse, logging, multiprocessing, os Ostereier: antigravity, this … Module Exkurs: Hausaufgabe 1 2 3 from math import log, ceil from operator import mul from functools import reduce 4 5 6 def factorial(n): return reduce(mul, range(1, n + 1)) 7 8 9 10 def digit_sum(n): def digit(n, idx): return n // 10 ** idx % 10 11 def digits(n): return range(0, ceil(log(n, 10)) + 1) 12 13 14 15 return sum([digit(n, i) for i in digits(n)]) Programmieren mit Python Exceptions Exceptions Fehlerbehandlung 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 try: print(1 // int(input('>␣i␣=␣'))) except ZeroDivisionError: print('Division␣by␣zero') except Exception as e: print(repr(e)) else: print('no␣error') > i = 0 Division by zero > i = a ValueError("invalid␣literal␣for␣int()␣with␣base␣10:␣'a'",) > i = 1 1 no error Programmieren mit Python IO IO Kontext open liefert File-Instanz Automatisches Aufräumen 1 2 3 4 >>> with open('/etc/issue.net') as issue: ... print(issue.read()) ... Debian GNU/Linux 8 IO Schreiben Ausgabe analog 1 2 3 4 5 6 7 8 >>> with open('spam.txt', mode='w') as spam: ... for i in range(1, 5): ... spam.write('{}\n'.format(i)) ... 2 2 2 2 Programmieren mit Python Ausblick Ausblick Ausblick PEP-8: Python Style Guide (https://www.python.org/dev/peps/pep-0008/) Selbstdefinierte Dekoratoren, Ausnahmen, Kontexte Generatoren (Lazy evaluation) Splicing Operatorüberladung Packages