10. Brief Tour of the Standard Library
**************************************


10.1. Operating System Interface
================================

Das Modul "os" bietet Dutzende von Funktionen für die Interaktion mit
dem Betriebssystem:

   >>> import os
   >>> os.getcwd()      # Return the current working directory
   'C:\\Python312'
   >>> os.chdir('/server/accesslogs')   # Change current working directory
   >>> os.system('mkdir today')   # Run the command mkdir in the system shell
   0

Verwenden Sie unbedingt den Stil "import os" anstelle von "from os
import *" “. Dadurch wird verhindert, dass "os.open()" die integrierte
Funktion "open()" überschreibt, die ganz anders funktioniert.

Die integrierten Funktionen "dir()" und "help()" sind nützliche
interaktive Hilfsmittel für die Arbeit mit großen Modulen wie "os"

   >>> import os
   >>> dir(os)<returns a list of all module functions>>>> help(os)
   <gibt eine ausführliche Handbuchseite zurück, die aus den Docstrings des Moduls erstellt wurde>

For daily file and directory management tasks, the "shutil" module
provides a higher level interface that is easier to use:

   >>> import shutil
   >>> shutil.copyfile('data.db', 'archive.db')
   'archive.db'
   >>> shutil.move('/build/executables', 'installdir')
   'installdir'


10.2. File Wildcards
====================

Das Modul "glob" bietet eine Funktion zum Erstellen von Dateilisten
anhand von Verzeichnissuchen mit Platzhaltern:

   >>> import glob
   >>> glob.glob('*.py')
   ['primes.py', 'random.py', 'quote.py']


10.3. Command Line Arguments
============================

Common utility scripts often need to process command line arguments.
These arguments are stored in the "sys" module's *argv* attribute as a
list.  For instance, let's take the following "demo.py" file:

   # File demo.py
   import sys
   print(sys.argv)

Hier ist die Ausgabe, die man erhält, wenn man "python demo.py one two
three" über die Befehlszeile ausführt:

   ['demo.py', 'one', 'two', 'three']

The "argparse" module provides a more sophisticated mechanism to
process command line arguments.  The following script extracts one or
more filenames and an optional number of lines to be displayed:

   import argparse

   parser = argparse.ArgumentParser(
       prog='top',
       description='Die ersten Zeilen jeder Datei anzeigen')
   parser.add_argument('filenames', nargs='+')
   parser.add_argument('-l', '--lines', type=int, default=10)
   args = parser.parse_args()
   print(args)

Wenn das Skript über die Befehlszeile mit dem Befehl "python top.py
--lines=5 alpha.txt beta.txt" ausgeführt wird, setzt es "args.lines" “
auf "5" und "args.filenames" auf "['alpha.txt', 'beta.txt']" “.


10.4. Error Output Redirection and Program Termination
======================================================

Das Modul "sys" verfügt außerdem über Attribute für *stdin*, *stdout*
und *stderr*. Letzteres ist nützlich, um Warnungen und Fehlermeldungen
auszugeben, damit diese auch dann sichtbar sind, wenn *stdout*
umgeleitet wurde:

   >>> sys.stderr.write('Warning, log file not found starting a new one\\n')
   Warning, log file not found starting a new one

Der direkteste Weg, ein Skript zu beenden, ist die Verwendung von
"sys.exit()".


10.5. String Pattern Matching
=============================

Das Modul "re" stellt Werkzeuge für reguläre Ausdrücke zur erweiterten
Zeichenfolgenverarbeitung bereit. Für komplexe Abgleich- und
Bearbeitungsaufgaben bieten reguläre Ausdrücke prägnante, optimierte
Lösungen:

   >>> import re
   >>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
   ['foot', 'fell', 'fastest']
   >>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
   'cat in the hat'

Wenn nur einfache Funktionen benötigt werden, sind String-Methoden
vorzuziehen, da sie leichter zu lesen und zu debuggen sind:

   >>> 'tea for too'.replace('too', 'two')
   'tea for two'


10.6. Mathematik
================

Das Modul "math" ermöglicht den Zugriff auf die zugrunde liegenden
C-Bibliotheksfunktionen für Gleitkommaarithmetik:

   >>> import math
   >>> math.cos(math.pi / 4)
   0.70710678118654757
   >>> math.log(1024, 2)
   10.0

Das Modul "random" bietet Werkzeuge zur Durchführung von
Zufallsauswahlen:

   >>> import random
   >>> random.choice(['apple', 'pear', 'banana'])
   'apple'
   >>> random.sample(range(100), 10)   # sampling without replacement
   [30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
   >>> random.random()    # random float
   0.17970987693706186
   >>> random.randrange(6)    # random integer chosen from range(6)
   4

Das Modul "statistics" berechnet grundlegende statistische Kennzahlen
(Mittelwert, Median, Varianz usw.) für numerische Daten:

   >>> import statistics
   >>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
   >>> statistics.mean(data)
   1.6071428571428572
   >>> statistics.median(data)
   1.25
   >>> statistics.variance(data)
   1.3720238095238095

Das SciPy-Projekt <https://scipy.org> bietet zahlreiche weitere Module
für numerische Berechnungen.


10.7. Internet Access
=====================

Es gibt eine Reihe von Modulen für den Zugriff auf das Internet und
die Verarbeitung von Internetprotokollen. Zwei der einfachsten sind
"urllib.request" zum Abrufen von Daten über URLs und "smtplib" zum
Versenden von E-Mails:

   >>> from urllib.request import urlopen
   >>> with urlopen('http://worldtimeapi.org/api/timezone/etc/UTC.txt') as response:
   ...     for line in response:
   ...         line = line.decode()             # Convert bytes to a str
   ...         if line.startswith('datetime'):
   ...             print(line.rstrip())         # Remove trailing newline
   ...
   datetime: 2022-01-01T01:36:47.689215+00:00

   >>> import smtplib
   >>> server = smtplib.SMTP('localhost')
   >>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
   ... """To: jcaesar@example.org
   ... From: soothsayer@example.org
   ...
   ... Beware the Ides of March.
   ... """)
   >>> server.quit()

(Beachten Sie, dass für das zweite Beispiel ein auf „localhost“
laufender Mailserver erforderlich ist.)


10.8. Dates and Times
=====================

Das Modul "datetime" stellt Klassen zur Verfügung, mit denen sich
Datums- und Zeitangaben sowohl auf einfache als auch auf komplexe
Weise bearbeiten lassen. Zwar wird die Arithmetik mit Datums- und
Zeitangaben unterstützt, der Schwerpunkt der Implementierung liegt
jedoch auf der effizienten Extraktion von Elementen für die
Ausgabeformatierung und -bearbeitung. Das Modul unterstützt zudem
Objekte, die zeitzonenabhängig sind.

   >>> # dates are easily constructed and formatted
   >>> from datetime import date
   >>> now = date.today()
   >>> now
   datetime.date(2003, 12, 2)
   >>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
   '12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'

   >>> # dates support calendar arithmetic
   >>> birthday = date(1964, 7, 31)
   >>> age = now - birthday
   >>> age.days
   14368


10.9. Data Compression
======================

Gängige Formate für die Datenarchivierung und -komprimierung werden
direkt von folgenden Modulen unterstützt: "zlib", "gzip", "bz2",
"lzma", "zipfile" und "tarfile".

   >>> import zlib
   >>> s = b'witch which has which witches wrist watch'
   >>> len(s)
   41
   >>> t = zlib.compress(s)
   >>> len(t)
   37
   >>> zlib.decompress(t)
   b'witch which has which witches wrist watch'
   >>> zlib.crc32(s)
   226805979


10.10. Performance Measurement
==============================

Manche Python-Anwender interessieren sich sehr dafür, wie sich die
Leistung verschiedener Lösungsansätze für dasselbe Problem im
Vergleich zueinander darstellt. Python bietet ein Messwerkzeug, das
diese Fragen sofort beantwortet.

Beispielsweise könnte es verlockend sein, anstelle des herkömmlichen
Ansatzes zum Vertauschen von Argumenten die Funktion zum Packen und
Entpacken von Tupeln zu verwenden. Das Modul "timeit" veranschaulicht
schnell einen leichten Leistungsvorteil:

   >>> from timeit import Timer
   >>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
   0.57535828626024577
   >>> Timer('a,b = b,a', 'a=1; b=2').timeit()
   0.54962537085770791

Im Gegensatz zur feinen Granularität von "timeit" bieten die Module
"profile" und "pstats" Werkzeuge zur Identifizierung zeitkritischer
Abschnitte in größeren Code-Blöcken.


10.11. Quality Control
======================

Ein Ansatz zur Entwicklung hochwertiger Software besteht darin, für
jede Funktion im Zuge ihrer Entwicklung Tests zu schreiben und diese
Tests während des Entwicklungsprozesses regelmäßig auszuführen.

Das Modul "doctest" bietet ein Werkzeug zum Durchsuchen eines Moduls
und zum Überprüfen von Tests, die in den Docstrings eines Programms
eingebettet sind.  Die Erstellung von Tests ist so einfach wie das
Kopieren und Einfügen eines typischen Aufrufs zusammen mit seinen
Ergebnissen in den Docstring. Dies verbessert die Dokumentation, indem
es dem Benutzer ein Beispiel liefert, und ermöglicht es dem
*doctest*-Modul, sicherzustellen, dass der Code der Dokumentation
entspricht:

   def average(values):
       """Berechnet das arithmetische Mittel einer Liste von Zahlen.

       >>> print(average([20, 30, 70]))
       40.0
       """
       return sum(values) / len(values)

   import doctest
   doctest.testmod()   # eingebettete Tests automatisch validieren

Das Modul "unittest" ist nicht ganz so einfach zu handhaben wie das
Modul "doctest" “, ermöglicht jedoch die Pflege einer umfassenderen
Reihe von Tests in einer separaten Datei:

   import unittest

   class TestStatisticalFunctions(unittest.TestCase):

       def test_average(self):
           self.assertEqual(average([20, 30, 70]), 40.0)
           self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
           with self.assertRaises(ZeroDivisionError):
               average([])
           with self.assertRaises(TypeError):
               average(20, 30, 70)

   unittest.main()  # Der Aufruf über die Befehlszeile führt alle Tests aus


10.12. Batteries Included
=========================

Python verfolgt die Philosophie „Batteries included“. Dies zeigt sich
am deutlichsten an den ausgefeilten und robusten Funktionen seiner
größeren Pakete. Zum Beispiel:

* Die Module "xmlrpc.client" und "xmlrpc.server" machen die
  Implementierung von Remote Procedure Calls zu einer fast trivialen
  Aufgabe. Trotz der Namen der Module sind keine direkten Kenntnisse
  oder der Umgang mit XML erforderlich.

* The "email" package is a library for managing email messages,
  including MIME and other **RFC 2822**-based message documents.
  Unlike "smtplib" and "poplib" which actually send and receive
  messages, the email package has a complete toolset for building or
  decoding complex message structures (including attachments) and for
  implementing internet encoding and header protocols.

* Das Paket "json" bietet umfassende Unterstützung für die Analyse
  dieses gängigen Datenaustauschformats. Das Modul "csv" unterstützt
  das direkte Lesen und Schreiben von Dateien im CSV-Format (Comma-
  Separated Value), das von Datenbanken und
  Tabellenkalkulationsprogrammen allgemein unterstützt wird. Die XML-
  Verarbeitung wird durch die Pakete "xml.etree.ElementTree" ,
  "xml.dom" und "xml.sax" unterstützt. Zusammen vereinfachen diese
  Module und Pakete den Datenaustausch zwischen Python-Anwendungen und
  anderen Tools erheblich.

* Das Modul "sqlite3" ist eine Hülle für die SQLite-
  Datenbankbibliothek und stellt eine persistente Datenbank bereit,
  die mithilfe einer leicht vom Standard abweichenden SQL-Syntax
  aktualisiert und abgefragt werden kann.

* Die Internationalisierung wird durch eine Reihe von Modulen
  unterstützt, darunter "gettext" , "locale" und das Paket "codecs" .
