MQL und Python-Programmiererin Anja Vogel

PCAP - Vorbereitung

auf das Python Zertifikat:

Certified Associate Python Programmer

Vorbereitung auf das PCAP Zertifikat

Im Unterschied zu PHP, C++ und vielen anderen Programmiersprachen werden keine Klammern, sondern Doppelpunkte und Einrückungen verwendet. Ein Semikolon am Zeilende führt nicht zu einem Fehler, wird aber in der Regel weg gelassen. Dateiendung in Python: py.

Die Standard ASCII Zeichenkodierung definiert nur 128 Zeichen (Zahlen, Groß-, Kleinbuchstaben und drum herum Zeichen)! Pro Zeichen werden 8 Bit verwendet.
UNICODE ist in der Lage, praktisch alle von Menschen verwendete Alphabete zu kodieren. UTF ist die Abkürzung für Unicode Transformation Format.

Main

if __name__ == "__main__": main()

Variablen

Datentypen sind hier gut beschrieben.

x, X = "x", "X" print(x) # x print(X) # X x = y = z = 1 print(f"{x} {y} {z}") # 1 1 1 colors = ["red", "black"] c1, c2 = colors print(c1) # red print(c2) # black

Casting

bool(...) # class 'bool' int(...) # class 'int' float(...) # class 'float' str(...) # class 'str' list(...) # class 'list' (s.u. Map) tuple(...) # class 'tuple' set(...) # class 'set' print(type(...))

Formatierung

print(int("123")) # 123 int("abc") # ValueError int('12.0') # ValueError x = 1.235 print(f"Wert: {x:.2f}") print(f"Wert: {round(x, 2)}") # Wert: 1.24 # Wert: 1.24 y = "1.235" print(f"Wert: {float(y):.2f}") print(f"Wert: {round(float(y), 2)}") # Wert: 1.24 # Wert: 1.24 print("123".zfill(5)) # 00123 <= zeros on the left

Zeichen / ASCII code

Ein codepoint ist eine Zahl, die einem Zeichen zugeordnet wurde:

print(ord('0')) # 48 print(ord('A')) # 65 print(ord('a')) # 97 print(chr(48)) # 0 print(chr(65)) # A print(chr(97)) # a

Strings

print('10:00'.isdigit()) # False print('2025'.isdigit()) # True print('UTF8'.isalpha()) # False print('Yes'.isalpha()) # True print(''.isspace()) # False print(' '.isspace()) # True print('\n'.isspace()) # True print("Suche".endswith("e")) # True print("Suche".endswith("E")) # False

Vergleich

print('test' > 'Test') # True print('TEST' > '1000') # True print('200' > '1000') # True

Wiederholung

text = 'Hallo ' print(text + text + text) # Hallo Hallo Hallo print(text * 3) # Hallo Hallo Hallo text *= 3 print(text) # Hallo Hallo Hallo

Suchen, Trennen und Manipulieren

print("Suche".find("S")) # 0 print("Suche".find("s")) # -1 print("Suche".index("S")) # 0 print("Suche".index("s")) # ValueError print('Suche'.replace('u', 'a')) # Sache if "Ich" in "Ich lerne Python": print("Ja") # Ja print("Suche für mich ein Wort".partition("Suche")) # ('', 'Suche', ' für mich ein Wort') print("Suche für mich ein Wort".partition("mich")) # ('Suche für ', 'mich', ' ein Wort') print("Suche für mich ein Wort".partition("Wort")) # ('Suche für mich ein ', 'Wort', '') print(".Suche..".split(".")) # ['', 'Suche', '', ''] print(".Suche..".strip(".")) # Suche print(".".join("Suche")) # S.u.c.h.e text = "Ich lerne Python" print(text.split()) # ['Ich', 'lerne', 'Python'] <= in Worte trennen print(text.split()[::-1]) # ['Python', 'lerne', 'Ich'] <= reverse! print(text.split()[::-1][0]) # Python <= erste Element print('Python'[:2]) # Py => bis Position 2 print('Python'[1:2]) # y => Position 1 print('Python'[1:]) # ython => ab Position 1

Sortierung

print(sorted('Python')) # ['P', 'h', 'n', 'o', 't', 'y'] print(sorted('Python', reverse=True)) # ['y', 't', 'o', 'n', 'h', 'P']

Arrays

Arrays können in Python folgende Datentypen sein: List, Tuple, Set oder Dictionary.

List: [...]

ist geordnet, änderbar und erlaubt doppelte Einträge: l = [3, "Hallo", True, 3] print(l) # [3, 'Hallo', True, 3]

Tupel: (...)

ist geordnet und unveränderlich und erlaubt doppelte Einträge:
t = ("Stift", "Papier", "Schere", "Stift") print(t) # ('Stift', 'Papier', 'Schere', 'Stift')

Set: {...}

ist ungeordnet, unveränderlich, unindiziert, hat keine doppelten Einträge und erlaubt Hinzufügen und Entfernen:
s = {True, 1, 0, False, None} print(s) # {0, True, None}

Dictionary {... : ...}

ist änderbar und hat keine doppelten Einträge:

d = { "brand": "Mini", "brand": "Porsche", "year": 2000, "colors": ["Silber", "Schwarz"] } print(d) # {'brand': 'Porsche', 'year': 2000, 'colors': ['Silber', 'Schwarz']}

Werte aus Listen erhalten (Unpacking):

colors = ['rot', 'gelb', 'orange'] color1, color2, color3 = colors

Listen erzeugen ähnlich der Mengenschreibweise (List Comprehensions):

Quadrate aller geraden Zahlen kleiner 10 (0, 2, 4, 6, 8): sq = [x*x for x in range(10) if x%2==0] print(sq) # [0, 4, 16, 36, 68]

Map:

Die Funktion map() führt eine bestimmte Funktion für jedes Element in einer Liste/Tupel/Set/Dictionary aus. Das Element wird als Parameter an die Funktion gesendet. Beim Dictionary werden allerdings die Keys verwendet!

numbers = [2, 4, 6] # (2, 4, 6) {2, 4, 6} square = lambda x: x ** 2 # x hoch 2 result = map(square, numbers) print(list(result)) # [4, 16, 36] numbers = {0:2, 1:4, 2:6} # Dictionary square = lambda x: x ** 2 # x hoch 2 result = map(square, numbers.values()) # sonst [0, 1, 4] print(list(result)) # [4, 16, 36]

Schleifen

Einfache Schleifen werden mit range() erzeugt: for i in range(3): #start=0,stop=3,step=1 print(i) # 0,1,2 for i in range(1, 3): #start=1,stop=3,step=1 print(i) # 1,2 for i in range(1, 3, 2): #start=1,stop=3,step=2 print(i) # 1 print(range(3)) # range(0, 3) print(len(range(3))) # 3

Schleifen mit Listen:

for x in [5, 2, 9]: print(x) # 5,2,9 numbers = ["one", "two", "three"] for s in numbers: print(s) # one, two, three i = 0 while i < len(numbers): print(numbers[i]) # one, two, three i += 1 [print(c) for c in numbers] # one, two, three print(len(numbers)) # 3

Schleifen mit Dictionaries:

numbers = {1: "one", 2: "two", 3: "three"} for s in numbers: print(s) # 1,2,3 = keys! print(numbers[s]) # values! for s in numbers.values(): print(s) # one, two, three for key, value in numbers.items(): pass # Schleifen dürfen nicht leer sein print(numbers) # {1: 'one', 2: 'two', 3: 'three'} print(numbers.keys()) # dict_keys([1, 2, 3]) print(numbers.values()) # dict_values(['one', 'two', 'three']) print(len(numbers)) # 3

Schleifen mit Strings:

for x in "banana": print(x) # einzelne Buchstaben!

Funktionen

Funktionen werden mit def definiert: def add(a, b=0): """Addition: a + b""" return a + b

Funktionen mit beliebig vielen Argumenten:

def multi(*values): print(values) multi("eins", "zwei", 3, True) # ('eins', 'zwei', 3, True)

Anonyme Funktionen:

Die Syntax ist: lambda arguments : expression a = lambda x, y: x+y print(a(5, 6)) # 11

OOP Objektorientierung

Klassen:

class Person: nr = 0 # Klassenvariable def __init__(self, name): # wird automatisch aufgerufen self.name = name # Objektvariable Person.nr += 1 def greet(self): print(f"Hi, ich bin {self.name}") p1 = Person("Anna") p1.greet() # Hi, ich bin Anna p2 = Person("Paula") p2.greet() # Hi, ich bin Paula print(Person.nr, p1.nr, p1.name , p2.nr, p2.name) # 2 2 Anna 2 Paula

Vererbung:

class Student(Person): def __init__(self, name, semester): self.__semester = semester # private durch __ Person.__init__(self, name) def greet(self): print(f"Hi, ich bin {self.name} im {self.__semester} Semester.") p = Student("Tanja", "dritten") p.greet() # Hi, ich bin Tanja im dritten Semester.

Mehrfachvererbung:

class Person: def __init__(self, name): self.name = name def greet(self): print(f"Hi, ich bin {self.name}!") class Studienfach: def __init__(self, name): self.name = name class Student(Person, Studienfach): def __init__(self, name, fach): Person.__init__(self, name) Studienfach.__init__(self, fach) # überschreibt name! p = Student("Anja", "Medizin") p.greet() # Hi, ich bin Medizin!

Exceptions

try: int("Test") except ValueError as e: print("Fehler:", e) except: print("Default exception!") finally: print("Fertig") # Fehler: invalid literal for int() with base 10: 'Test' # Fertig

Eingaben bzw. ZeroDivisionError:

TypeError wird hier nicht geworfen, entwerder ZeroDivisionError bei einer 0 oder ValueError, wenn es keine ganze Zahl (ohne Punkt und Komma) ist.

try: num = int(input("Number:")) print(10/num) except (ValueError, ZeroDivisionError): print("Fehler: bitte nur Zahlen über 0 eingeben!")

Exception mit Argumenten:

try: raise Exception(1,2,3,4,5,"error") except Exception as e: print(e.args) # (1, 2, 3, 4, 5, 'error')

Custom Exception:

class MyException(Exception): def __init__(self, msg): self.msg = msg raise MyException("Bädö") # __main__.MyException: Bädö

BaseException:

Exeption fängt die meisten Fehler bereits ab, aber BaseException fängt zusätzlich SystemExit, KeyboardInterrupt und GeneratorExit ab. Durch KeyboardInterrupt wird auch das gewollte Beenden mit ^C abgefangen, wodurch das Programm hängen bleiben kann. try: raise Exception except BaseException: print("Base") except Exception: print("Ex") # Base

Assertion

Fehlerbehandlungen (Exeptions) sollten für Fehlerzustände geschrieben werden, welche man erwartet; Zusicherungen (Assertion) für Fehlerzustände, die niemals auftreten sollten.

try: assert 2 + 2 == 5, "Logischer Fehler" except AssertionError as a: print(a) # Logischer Fehler

Dateien

Mögliche Datei Modi: 'r', 'w', 'a', 'b', '+' with open("file.txt", "r", encoding="utf-8") as f: data = f.read()

Bilder einlesen / binary in bytearray:

try: stream = open("/pfad/Bild.jpg", "rb") image = bytearray(stream.read()) stream.close() except IOError: print("Oh no!") else: print("OK!")

Packages

Pip ist das Paketinstallationsprogramm für Python. Mit pip (pip3) können Pakete aus dem Python Package Index (PyPI) und anderen Indizes installiert werden. Ab Python Version 3.4 ist PIP ist enthalten.

pip --version pip install ... pip list # Installierte Pakete inkl. Version pip uninstall ... pip help

Mathematik Funktionen:

import math x = -1.5 print(math.floor(x)) # -2 print(math.ceil(x)) # -1 print(math.trunc(x)) # -1 print(abs(x)) # 1.5 from math import e, exp, log print(e) # 2.718... print(pow(e, 1)) # 2.718... print(exp(log(e))) # 2.718... print(pow(3, 3)) # 27 print(exp(3*log(3))) # 27 print(log(e, e)) # 1.0 print(exp(0)) # 1.0

Zufall:

import random Obst = ['Äpfel', 'Birnen', 'Bananen', 'Kiwi'] random.shuffle(Obst) print(Obst) # ['Birnen', 'Bananen', 'Kiwi', 'Äpfel'] from random import randrange, randint print(randrange(0,1)) # 0 (0 bis 1 ohne 1!) print(randint(0,1)) # 0 oder 1 - kein dritter Parameter!

Kalender:

import calendar print(calendar.isleap(2026)) # False = nicht teilbar durch 400 print(calendar.isleap(2000)) # True = teilbar durch 400 c = calendar.Calendar() for weekday in c.iterweekdays(): print(weekday, end = "|") # 0|1|2|3|4|5|6|

Betriebsystem:

import platform print(platform.system()) # Linux print(platform.version()) # ... Ubuntu ... print(platform.processor()) # x86_64