Content from Laufen und Beenden


Zuletzt aktualisiert am 2025-10-30 | Diese Seite bearbeiten

Geschätzte Zeit: 15 Minuten

Übersicht

Fragen

  • Wie kann ich Python-Programme ausführen?

Ziele

  • Starten Sie den JupyterLab-Server.
  • Erstellen Sie ein neues Python-Skript.
  • Erstellen Sie ein Jupyter-Notizbuch.
  • Fahren Sie den JupyterLab-Server herunter.
  • Verstehen Sie den Unterschied zwischen einem Python-Skript und einem Jupyter-Notizbuch.
  • Erstellen von Markdown-Zellen in einem Notizbuch.
  • Erstellen und Ausführen von Python-Zellen in einem Notizbuch.

Um Python auszuführen, werden wir für den Rest dieses Workshops Jupyter Notebooks über JupyterLab verwenden. Jupyter Notebooks sind in den Bereichen Datenwissenschaft und Visualisierung weit verbreitet und dienen als praktischer gemeinsamer Nenner für die interaktive Ausführung von Python-Code, in dem wir die Ergebnisse unseres Python-Codes leicht ansehen und mit anderen teilen können.

Es gibt andere Möglichkeiten, Code zu bearbeiten, zu verwalten und auszuführen. Softwareentwickler verwenden häufig eine integrierte Entwicklungsumgebung (IDE) wie [PyCharm] (https://www.jetbrains.com/pycharm/) oder [Visual Studio Code] (https://code.visualstudio.com/) oder Texteditoren wie Vim oder Emacs, um ihre Python-Programme zu erstellen und zu bearbeiten. Nachdem Sie Ihre Python-Programme bearbeitet und gespeichert haben, können Sie diese Programme in der IDE selbst oder direkt auf der Kommandozeile ausführen. Im Gegensatz dazu können wir mit Jupyter-Notizbüchern die Ergebnisse unseres Python-Codes direkt im Notizbuch ausführen und betrachten.

JupyterLab hat mehrere andere praktische Funktionen:

  • Sie können problemlos Codeblöcke eingeben, bearbeiten, kopieren und einfügen.
  • Mit der Tab-Vervollständigung können Sie ganz einfach auf die Namen der von Ihnen verwendeten Elemente zugreifen und mehr darüber erfahren.
  • Damit können Sie Ihren Code mit Links, Text in verschiedenen Größen, Aufzählungszeichen usw. versehen, um ihn für Sie und Ihre Mitarbeiter leichter zugänglich zu machen.
  • Damit können Sie Zahlen neben dem Code, der sie erzeugt, anzeigen, um eine vollständige Geschichte der Analyse zu erzählen.

Jedes Notizbuch enthält eine oder mehrere Zellen, die Code, Text oder Bilder enthalten.

Erste Schritte mit JupyterLab


JupyterLab ist ein Anwendungsserver mit einer Web-Benutzeroberfläche von Projekt Jupyter, der es ermöglicht, mit Dokumenten und Aktivitäten wie Jupyter-Notizbüchern, Texteditoren, Terminals und sogar benutzerdefinierten Komponenten auf flexible, integrierte und erweiterbare Weise zu arbeiten. JupyterLab erfordert einen einigermaßen aktuellen Browser (idealerweise eine aktuelle Version von Chrome, Safari oder Firefox); Internet Explorer Versionen 9 und niedriger werden nicht unterstützt.

JupyterLab ist Teil der Anaconda Python Distribution. Wenn Sie die Anaconda-Python-Distribution noch nicht installiert haben, finden Sie in der Setup-Anleitung eine Installationsanleitung.

In dieser Lektion werden wir JupyterLab lokal auf unseren eigenen Rechnern laufen lassen, so dass außer der anfänglichen Verbindung zum Herunterladen und Installieren von Anaconda und JupyterLab keine Internetverbindung erforderlich ist

  • Starten Sie den JupyterLab-Server auf Ihrem Rechner
  • Verwenden Sie einen Webbrowser, um eine spezielle localhost URL zu öffnen, die eine Verbindung zu Ihrem JupyterLab Server herstellt
  • Der JupyterLab-Server erledigt die Arbeit und der Webbrowser stellt das Ergebnis dar
  • Geben Sie Code in den Browser ein und sehen Sie sich die Ergebnisse an, nachdem Ihr JupyterLab-Server die Ausführung Ihres Codes beendet hat
Wichtig

JupyterLab? Was ist mit Jupyter-Notebooks?

JupyterLab ist die nächste Entwicklungsstufe des Jupyter-Notebooks. Wenn Sie bereits Erfahrung mit Jupyter-Notizbüchern haben, dann haben Sie eine gute Vorstellung davon, was Sie von JupyterLab erwarten können.

Erfahrene Benutzer von Jupyter-Notizbüchern, die an einer ausführlicheren Diskussion der Ähnlichkeiten und Unterschiede zwischen den Benutzeroberflächen von JupyterLab und Jupyter-Notizbüchern interessiert sind, finden weitere Informationen in der JupyterLab user interface documentation.

Start von JupyterLab


Sie können den JupyterLab-Server über die Befehlszeile oder über eine Anwendung namens Anaconda Navigator starten. Anaconda Navigator ist Teil der Anaconda Python Distribution.

macOS - Befehlszeile

Um den JupyterLab-Server zu starten, müssen Sie über das Terminal auf die Befehlszeile zugreifen. Es gibt zwei Möglichkeiten, Terminal auf dem Mac zu öffnen.

  1. Öffnen Sie in Ihrem Anwendungsordner die Dienstprogramme und doppelklicken Sie auf Terminal
  2. Drücken Sie Befehl + Leertaste, um Spotlight zu starten. Geben Sie Terminal ein und doppelklicken Sie dann auf das Suchergebnis oder drücken Sie Eingabe

Nachdem Sie Terminal gestartet haben, geben Sie den Befehl ein, um den JupyterLab-Server zu starten.

BASH

$ jupyter lab

Windows-Benutzer - Befehlszeile

Um den JupyterLab-Server zu starten, müssen Sie auf die Anaconda-Eingabeaufforderung zugreifen.

Drücken Sie Windows Logo Key und suchen Sie nach Anaconda Prompt, klicken Sie auf das Ergebnis oder drücken Sie Enter.

Nachdem Sie die Anaconda-Eingabeaufforderung gestartet haben, geben Sie den Befehl ein:

BASH

$ jupyter lab

Anaconda Navigator

Um einen JupyterLab-Server von Anaconda Navigator aus zu starten, müssen Sie zuerst Anaconda Navigator starten (klicken Sie hier für detaillierte Anweisungen für macOS, Windows und Linux). Sie können Anaconda Navigator über Spotlight auf macOS (Befehl + Leertaste), die Windows-Suchfunktion (Windows-Logo-Taste) oder das Öffnen einer Terminal-Shell und das Ausführen von anaconda-navigator über die Kommandozeile suchen.

Nachdem Sie Anaconda Navigator gestartet haben, klicken Sie auf die Schaltfläche Launch unter JupyterLab. Möglicherweise müssen Sie nach unten scrollen, um sie zu finden.

Hier ist ein Screenshot einer Anaconda-Navigator-Seite, die der Seite ähnelt, die sich unter macOS oder Windows öffnen sollte.

Anaconda Navigator landing page

Und hier ist ein Screenshot einer JupyterLab-Landingpage, die der Seite ähneln sollte, die sich in Ihrem Standard-Webbrowser öffnet, nachdem Sie den JupyterLab-Server unter macOS oder Windows gestartet haben.

JupyterLab landing page

Die JupyterLab-Schnittstelle


JupyterLab verfügt über viele Funktionen, die in traditionellen integrierten Entwicklungsumgebungen (IDEs) zu finden sind, konzentriert sich aber auf die Bereitstellung flexibler Bausteine für interaktives, forschendes Computing.

Die JupyterLab-Oberfläche besteht aus der Menüleiste, einer ausklappbaren linken Seitenleiste und dem Hauptarbeitsbereich, der Registerkarten mit Dokumenten und Aktivitäten enthält.

Menüleiste

Die Menüleiste am oberen Rand von JupyterLab enthält die Menüs der obersten Ebene, in denen verschiedene in JupyterLab verfügbare Aktionen zusammen mit den entsprechenden Tastenkombinationen (sofern zutreffend) angezeigt werden. Die folgenden Menüs sind standardmäßig enthalten.

  • Datei: Aktionen im Zusammenhang mit Dateien und Verzeichnissen wie Neu, Öffnen, Schließen, Speichern, usw. Das Menü Datei enthält auch die Aktion Abschalten, mit der Sie den JupyterLab-Server herunterfahren können.
  • Bearbeiten: Aktionen im Zusammenhang mit der Bearbeitung von Dokumenten und anderen Aktivitäten wie Rückgängig, Ausschneiden, Kopieren, Einfügen, usw.
  • Ansicht: Aktionen, die das Aussehen von JupyterLab verändern.
  • Ausführen: Aktionen zum Ausführen von Code in verschiedenen Aktivitäten wie Notizbüchern und Code-Konsolen (siehe unten).
  • Kernel: Aktionen zur Verwaltung von Kerneln. Kernel in Jupyter werden weiter unten ausführlicher erklärt.
  • Tabs: Eine Liste der geöffneten Dokumente und Aktivitäten im Hauptarbeitsbereich.
  • Einstellungen: Allgemeine JupyterLab-Einstellungen können über dieses Menü konfiguriert werden. Es gibt auch eine Option Erweiterter Einstellungseditor im Dropdown-Menü, die eine feinere Steuerung der JupyterLab-Einstellungen und Konfigurationsoptionen ermöglicht.
  • Hilfe: Eine Liste von JupyterLab- und Kernel-Hilfe-Links.
Wichtig

Kernel

Die JupyterLab [docs] (https://jupyterlab.readthedocs.io/en/stable/user/documents_kernels.html) definieren Kernel als “separate Prozesse, die vom Server gestartet werden und Ihren Code in verschiedenen Programmiersprachen und Umgebungen ausführen.” Wenn wir ein Jupyter Notebook öffnen, wird ein Kernel - ein Prozess - gestartet, der den Code ausführt. In dieser Lektion werden wir den Jupyter ipython-Kernel verwenden, mit dem wir Python 3-Code interaktiv ausführen können.

Die Verwendung anderer Jupyter-[Kernel für andere Programmiersprachen] (https://github.com/jupyter/jupyter/wiki/Jupyter-kernels) würde es uns ermöglichen, Code in anderen Programmiersprachen in derselben JupyterLab-Schnittstelle zu schreiben und auszuführen, wie R, Java, Julia, Ruby, JavaScript, Fortran, usw.

Ein Screenshot der Standard-Menüleiste finden Sie unten.

JupyterLab Menu Bar

Linke Seitenleiste

Die linke Seitenleiste enthält eine Reihe von häufig verwendeten Registerkarten, wie z.B. einen Dateibrowser (der den Inhalt des Verzeichnisses anzeigt, in dem der JupyterLab-Server gestartet wurde), eine Liste der laufenden Kernel und Terminals, die Befehlspalette und eine Liste der geöffneten Registerkarten im Hauptarbeitsbereich. Nachfolgend finden Sie einen Screenshot der standardmäßigen linken Seitenleiste.

JupyterLab Left Side Bar

Die linke Seitenleiste kann durch Auswahl von “Linke Seitenleiste anzeigen” im Menü “Ansicht” oder durch Klicken auf die aktive Registerkarte der Seitenleiste ein- oder ausgeklappt werden.

Hauptarbeitsbereich

Der Hauptarbeitsbereich in JupyterLab ermöglicht es Ihnen, Dokumente (Notizbücher, Textdateien usw.) und andere Aktivitäten (Terminals, Codekonsolen usw.) in Tafeln mit Registerkarten anzuordnen, die in der Größe verändert oder unterteilt werden können. Nachstehend finden Sie einen Screenshot des standardmäßigen Hauptarbeitsbereichs.

Wenn Sie die Registerkarte “Launcher” nicht sehen, klicken Sie auf das blaue Pluszeichen unter den Menüs “Datei” und “Bearbeiten”, damit sie erscheint.

JupyterLab Main Work Area

Ziehen Sie eine Registerkarte in die Mitte eines Registerkartenfeldes, um die Registerkarte in das Feld zu verschieben. Unterteilen Sie ein Registerkartenfeld, indem Sie eine Registerkarte nach links, rechts, oben oder unten in das Feld ziehen. Der Arbeitsbereich hat eine einzige aktuelle Aktivität. Die Registerkarte für die aktuelle Aktivität ist durch einen farbigen oberen Rand gekennzeichnet (standardmäßig blau).

Erstellen eines Python-Skripts


  • Um mit dem Schreiben eines neuen Python-Programms zu beginnen, klicken Sie auf das Textdatei-Symbol unter der Überschrift Sonstiges auf der Registerkarte “Startprogramm” des Hauptarbeitsbereichs.
    • Sie können auch eine neue einfache Textdatei erstellen, indem Sie Neu -> Textdatei aus dem Menü Datei in der Menüleiste auswählen.
  • Um diese einfache Textdatei in ein Python-Programm umzuwandeln, wählen Sie die Aktion Datei speichern unter aus dem Menü Datei in der Menüleiste und geben Sie Ihrer neuen Textdatei einen Namen, der mit der Erweiterung .py endet.
    • Die Erweiterung .py zeigt jedem (auch dem Betriebssystem), dass diese Textdatei ein Python-Programm ist.
    • Dies ist eine Konvention, keine Vorschrift.

Erstellen eines Jupyter-Notebooks


Um ein neues Notebook zu öffnen, klicken Sie auf das Python 3-Symbol unter der Überschrift Notebook in der Registerkarte Launcher im Hauptarbeitsbereich. Sie können auch ein neues Notizbuch erstellen, indem Sie Neu -> Notizbuch aus dem Menü Datei in der Menüleiste wählen.

Zusätzliche Hinweise zu Jupyter-Notizbüchern.

  • Notebookdateien haben die Erweiterung .ipynb, um sie von reinen Python-Programmen zu unterscheiden.
  • Notizbücher können als Python-Skripte exportiert werden, die über die Befehlszeile ausgeführt werden können.

Nachfolgend sehen Sie einen Screenshot eines Jupyter-Notizbuchs, das in JupyterLab läuft. Wenn Sie an weiteren Details interessiert sind, dann schauen Sie in die offizielle Notebook-Dokumentation.

Example Jupyter Notebook

Wichtig

Wie wird es gespeichert?

  • Die Notizbuchdatei ist in einem Format namens JSON gespeichert.
  • Genau wie eine Webseite sieht das, was gespeichert wird, anders aus als das, was Sie in Ihrem Browser sehen.
  • Aber dieses Format erlaubt es Jupyter, Quellcode, Text und Bilder in einer Datei zu mischen.
Aufgabe

Anordnen von Dokumenten in Registerkartenfeldern

Im JupyterLab-Hauptarbeitsbereich können Sie Dokumente in Panels mit Registerkarten anordnen. Hier ist ein Beispiel aus der offiziellen Dokumentation.

Multi-panel JupyterLab

Erstellen Sie zunächst eine Textdatei, eine Python-Konsole und ein Terminalfenster und ordnen Sie diese in drei Panels im Hauptarbeitsbereich an. Erstellen Sie als Nächstes ein Notizbuch, ein Terminalfenster und eine Textdatei und ordnen Sie diese in drei Bereichen im Hauptarbeitsbereich an. Erstellen Sie schließlich Ihre eigene Kombination von Bereichen und Registerkarten. Welche Kombination von Bereichen und Registerkarten ist Ihrer Meinung nach für Ihren Arbeitsablauf am nützlichsten?

Nachdem Sie die erforderlichen Registerkarten erstellt haben, können Sie eine der Registerkarten in die Mitte eines Bereichs ziehen, um die Registerkarte in den Bereich zu verschieben; anschließend können Sie einen Registerkartenbereich unterteilen, indem Sie eine Registerkarte nach links, rechts, oben oder unten in den Bereich ziehen.

Wichtig

Code vs. Text

Jupyter mischt Code und Text in verschiedenen Arten von Blöcken, den sogenannten Zellen. Wir verwenden den Begriff “Code” oft für “den Quellcode von Software, die in einer Sprache wie Python geschrieben wurde”. Eine “Codezelle” in einem Notizbuch ist eine Zelle, die Software enthält; eine “Textzelle” ist eine Zelle, die normale, für Menschen geschriebene Prosa enthält.

Das Notebook hat einen Befehls- und einen Bearbeitungsmodus.


  • Wenn Sie abwechselnd Esc und Return drücken, ändert sich der äußere Rand Ihrer Codezelle von grau zu blau.
  • Dies sind die Modi Befehl (grau) und Bearbeiten (blau) Ihres Notizbuchs.
  • Im Befehlsmodus können Sie Funktionen auf Notizbuchebene bearbeiten, im Bearbeitungsmodus ändern Sie den Inhalt der Zellen.
  • Im Befehlsmodus (esc/gray),
    • Mit der Taste b wird eine neue Zelle unter der aktuell ausgewählten Zelle erstellt.
    • Mit der Taste a können Sie die obige Kombination erstellen.
    • Mit der Taste x wird die aktuelle Zelle gelöscht.
    • Mit der Taste z können Sie die letzte Operation in einer Zelle rückgängig machen (z. B. Löschen, Erstellen usw.).
  • Alle Aktionen können über die Menüs ausgeführt werden, aber es gibt viele Tastenkombinationen, um die Arbeit zu beschleunigen.
Aufgabe

Befehl vs. Bearbeiten

Befinden Sie sich auf der Seite des Jupyter-Notizbuchs gerade im Befehls- oder im Bearbeitungsmodus?
Wechseln Sie zwischen den beiden Modi. Verwenden Sie die Tastenkombinationen, um eine neue Zelle zu erstellen. Verwenden Sie die Tastenkombinationen, um eine Zelle zu löschen. Verwenden Sie die Tastenkombinationen, um die zuletzt durchgeführte Zellenoperation rückgängig zu machen.

Der Befehlsmodus hat einen grauen Rahmen und der Bearbeitungsmodus einen blauen Rahmen. Verwenden Sie Esc und Return, um zwischen den Modi zu wechseln. Sie müssen sich im Befehlsmodus befinden (drücken Sie Esc, wenn Ihre Zelle blau ist). Tippen Sie b oder a. Sie müssen sich im Befehlsmodus befinden (drücken Sie Esc, wenn Ihre Zelle blau ist). Tippen Sie x. Du musst dich im Befehlsmodus befinden (drücke Esc, wenn deine Zelle blau ist). Tippe z.

Verwenden Sie die Tastatur und die Maus, um Zellen auszuwählen und zu bearbeiten.

  • Wenn Sie die Return-Taste drücken, wird der Rahmen blau und der Bearbeitungsmodus wird aktiviert, so dass Sie innerhalb der Zelle schreiben können.
  • Da wir in der Lage sein wollen, viele Codezeilen in einer einzigen Zelle zu schreiben, bewegt das Drücken der Return-Taste im Bearbeitungsmodus (blau) den Cursor zur nächsten Zeile in der Zelle, wie in einem Texteditor.
  • Wir brauchen einen anderen Weg, um dem Notebook mitzuteilen, dass wir das, was in der Zelle steht, ausführen wollen.
  • Durch gleichzeitiges Drücken von Shift+Return wird der Inhalt der Zelle ausgeführt.
  • Beachten Sie, dass die Tasten Return und Shift auf der rechten Seite der Tastatur direkt nebeneinander liegen.

Das Notebook verwandelt Markdown in eine hübsch gedruckte Dokumentation.

  • Notebooks können auch Markdown wiedergeben.
    • Ein einfaches Klartextformat zum Schreiben von Listen, Links und anderen Dingen, die auf eine Webseite gehören könnten.
    • Entspricht einer Teilmenge von HTML, die so aussieht, wie man sie in einer altmodischen E-Mail verschicken würde.
  • Verwandeln Sie die aktuelle Zelle in eine Markdown-Zelle, indem Sie den Befehlsmodus (Esc/grau) aufrufen und die Taste M drücken.
  • In [ ]: wird verschwinden, um zu zeigen, dass es sich nicht mehr um eine Codezelle handelt und Sie in Markdown schreiben können.
  • Verwandeln Sie die aktuelle Zelle in eine Codezelle, indem Sie den Befehlsmodus (Esc/grau) aufrufen und die Taste y drücken.

Markdown macht das meiste von dem, was HTML macht.

Tabelle: Zeigt eine Markdown-Syntax und ihre gerenderte Ausgabe. +—————————————+————————————————+ | Markdown-Code | Gerenderte Ausgabe | +=======================================+================================================+ +—————————————+————————————————+ | | <p></p> | | * Verwende Sternchen | - Verwende Sternchen | | * um | - um | | * Aufzählungslisten zu erstellen. | - Aufzählungslisten zu erstellen. | | | | +—————————————+————————————————+ +—————————————+————————————————+ | | <p></p> | | 1. Verwende Zahlen | 1. Verwende Zahlen | | 1. um | 2. um | | 1. nummerierte Listen zu erstellen. | 3. nummerierte Listen zu erstellen. | | | | +—————————————+————————————————+ +—————————————+————————————————+ | | <p></p> | | * Du kannst Einrückungen verwenden | - Du kannst Einrückungen verwenden | | * Um Unterlisten zu erstellen | - Um Unterlisten zu erstellen | | * desselben Typs | - desselben Typs | | * Oder Unterlisten | - Oder Unterlisten | | 1. eines anderen | 1. eines anderen | | 1. Typs | 2. Typs | | | | +—————————————+————————————————+ +—————————————+————————————————+ | | <p></p> | | # Eine Überschrift der Ebene 1 | ## Eine Überschrift der Ebene 1 | | | | +—————————————+————————————————+ +—————————————+————————————————+ | | <p></p> | | ## Eine Überschrift der Ebene 2 (usw.)| ### Eine Überschrift der Ebene 2 (usw.) | | | | +—————————————+————————————————+ +—————————————+————————————————+ | | <p></p> | | Zeilenumbrüche | Zeilenumbrüche | | spielen keine Rolle. | spielen keine Rolle. | | | | | Aber Leerzeilen | Aber Leerzeilen | | erzeugen neue Absätze. | erzeugen neue Absätze. | | | | +—————————————+————————————————+ +—————————————+————————————————+ | | <p></p> | | [Links](http://software-carpentry.org)| [Links](https://software-carpentry.org) | | werden mit `[...](...)` erstellt. | werden mit `[...](...)` erstellt. | | Oder verwende [benannte Links][data-carp]. | Oder verwende [benannte Links][data_carpentry]. | | | | | [data-carp]: http://datacarpentry.org | | | | | +—————————————+————————————————+

Aufgabe

Erstellen von Listen in Markdown

Erstellen Sie eine verschachtelte Liste in einer Markdown-Zelle in einem Notizbuch, die wie folgt aussieht:

  1. Finanzierung erhalten.
  2. Arbeiten Sie.
  • Entwurfsexperiment.
  • Daten sammeln.
  • Analysieren.
  1. Schreiben Sie.
  2. Veröffentlichen.

Diese Aufgabe integriert sowohl die nummerierte Liste als auch die Aufzählungsliste. Beachten Sie, dass die Aufzählungsliste um 2 Leerzeichen eingerückt ist, so dass sie mit den Elementen der nummerierten Liste übereinstimmt.

1.  Get funding.
2.  Do work.
    *   Design experiment.
    *   Collect data.
    *   Analyze.
3.  Write up.
4.  Publish.
Aufgabe

Mehr Mathematik

Was wird angezeigt, wenn eine Python-Zelle in einem Notizbuch, das mehrere Berechnungen enthält, ausgeführt wird? Was passiert zum Beispiel, wenn diese Zelle ausgeführt wird?

PYTHON

7 * 3
2 + 1

Python gibt die Ausgabe der letzten Berechnung zurück.

PYTHON

3
Aufgabe

Vorhandene Zelle von Code in Markdown ändern

Was passiert, wenn Sie etwas Python in eine Codezelle schreiben und dann in eine Markdown-Zelle wechseln? Geben Sie zum Beispiel Folgendes in eine Code-Zelle ein:

PYTHON

x = 6 * 7 + 12
print(x)

Und dann führen Sie es mit Shift+Return aus, um sicherzustellen, dass es als Codezelle funktioniert. Gehen Sie nun zurück zu der Zelle und verwenden Sie Esc und dann m, um die Zelle in Markdown umzuwandeln und sie mit Shift+Return “auszuführen”. Was ist passiert und wie könnte dies nützlich sein?

Der Python-Code wird wie Markdown-Text behandelt. Die Zeilen erscheinen als Teil eines zusammenhängenden Absatzes. Dies könnte nützlich sein, um Zellen in Notizbüchern, die für mehrere Zwecke verwendet werden, vorübergehend ein- und auszuschalten.

PYTHON

x = 6 * 7 + 12 print(x)
Aufgabe

Gleichungen

Standard Markdown (wie wir es für diese Notizen verwenden) kann keine Gleichungen darstellen, aber das Notebook schon. Erstellen Sie eine neue Markdown-Zelle und geben Sie Folgendes ein:

$\sum_{i=1}^{N} 2^{-i} \approx 1$

(Es ist wahrscheinlich einfacher, zu kopieren und einzufügen.) Was wird dort angezeigt? Was denken Sie, was der Unterstrich, _, der Zirkumflex, ^, und das Dollarzeichen, $, bedeuten?

Das Notizbuch zeigt die Gleichung so, wie sie in der LaTeX-Gleichungssyntax dargestellt werden würde. Das Dollarzeichen, $, wird verwendet, um Markdown mitzuteilen, dass der Text dazwischen eine LaTeX-Gleichung ist. Wenn Sie mit LaTeX nicht vertraut sind, wird der Unterstrich, _, für tiefgestellte Zeichen und der Zirkumflex, ^, für hochgestellte Zeichen verwendet. Ein Paar geschweifter Klammern, { und }, wird verwendet, um Text zusammenzufassen, so dass die Anweisung i=1 zum tiefgestellten und N zum hochgestellten Zeichen wird. In ähnlicher Weise steht -i in geschweiften Klammern, um die gesamte Anweisung zum hochgestellten Zeichen für 2 zu machen.\sum und \approx sind LaTeX-Befehle für “Summe über” und “Näherungswert” Symbole.

Schließen von JupyterLab


  • Wählen Sie in der Menüleiste das Menü “Datei” und wählen Sie dann unten im Dropdown-Menü “Herunterfahren”. Sie werden aufgefordert, zu bestätigen, dass Sie den JupyterLab-Server herunterfahren möchten (vergessen Sie nicht, Ihre Arbeit zu speichern!). Klicken Sie auf “Herunterfahren”, um den JupyterLab-Server herunterzufahren.
  • Um den JupyterLab-Server neu zu starten, müssen Sie den folgenden Befehl von einer Shell aus erneut ausführen.
$ jupyter lab
Diskussion

Schließen von JupyterLab

Üben Sie das Schließen und Neustarten des JupyterLab-Servers.

Hauptpunkte
  • Python-Skripte sind reine Textdateien.
  • Verwenden Sie das Jupyter-Notebook für die Bearbeitung und Ausführung von Python.
  • Das Notebook hat einen Befehls- und einen Bearbeitungsmodus.
  • Verwenden Sie die Tastatur und die Maus, um Zellen auszuwählen und zu bearbeiten.
  • Das Notebook verwandelt Markdown in eine hübsch gedruckte Dokumentation.
  • Markdown macht das meiste von dem, was HTML macht.

Content from Variablen und Zuweisungen


Zuletzt aktualisiert am 2025-03-02 | Diese Seite bearbeiten

Geschätzte Zeit: 20 Minuten

Übersicht

Fragen

  • Wie kann ich Daten in Programmen speichern?

Ziele

  • Schreibe Programme, die Variablen skalare Werte zuweisen und mit diesen Werten Berechnungen durchführen.
  • Korrektes Verfolgen von Wertänderungen in Programmen, die skalare Zuweisungen verwenden.

Verwenden Sie Variablen, um Werte zu speichern.


  • Variablen sind Namen für Werte.

  • Variablennamen

    • kann nur Buchstaben, Ziffern und den Unterstrich _ enthalten (typischerweise verwendet, um Wörter in langen Variablennamen zu trennen)
    • darf nicht mit einer Ziffer beginnen
    • sind groß-klein-klein (Alter, Alter und AGE sind drei verschiedene Variablen)
  • Der Name sollte auch aussagekräftig sein, damit Sie oder ein anderer Programmierer wissen, worum es sich handelt

  • Variablennamen, die mit Unterstrichen beginnen, wie z.B. __alistairs_real_age, haben eine besondere Bedeutung, also werden wir das nicht tun, bis wir die Konvention verstanden haben.

  • In Python ordnet das Symbol = den Wert auf der rechten Seite dem Namen auf der linken Seite zu.

  • Die Variable wird erstellt, wenn ihr ein Wert zugewiesen wird.

  • Hier ordnet Python der Variablen age ein Alter und der Variablen first_name einen Namen in Anführungszeichen zu.

    PYTHON

    age = 42
    first_name = 'Ahmed'

Verwenden Sie print, um Werte anzuzeigen.


  • Python hat eine eingebaute Funktion namens print, die Dinge als Text ausgibt.
  • Rufen Sie die Funktion auf (d.h. sagen Sie Python, dass es sie ausführen soll), indem Sie ihren Namen verwenden.
  • Übergeben Sie der Funktion Werte (d.h. die zu druckenden Dinge) in Klammern.
  • Um eine Zeichenkette zum Ausdruck hinzuzufügen, schließen Sie die Zeichenkette in einfache oder doppelte Anführungszeichen ein.
  • Die Werte, die an die Funktion übergeben werden, heißen arguments

PYTHON

print(first_name, 'is', age, 'years old')

AUSGABE

Ahmed is 42 years old
  • print setzt automatisch ein einzelnes Leerzeichen zwischen die Elemente, um sie zu trennen.
  • Und bricht am Ende in eine neue Zeile um.

Variablen müssen erstellt werden, bevor sie verwendet werden.


  • Wenn eine Variable noch nicht existiert, oder wenn der Name falsch geschrieben wurde, meldet Python einen Fehler. (Im Gegensatz zu einigen Sprachen, die einen Standardwert “erraten”.)

PYTHON

print(last_name)

FEHLER

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-1-c1fbb4e96102> in <module>()
----> 1 print(last_name)

NameError: name 'last_name' is not defined
  • Die letzte Zeile einer Fehlermeldung ist normalerweise die informativste.
  • Wir werden uns Fehlermeldungen im Detail [später] ansehen (17-scope.md#reading-error-messages).
Wichtig

Variablen bleiben zwischen Zellen bestehen

Beachten Sie, dass die Reihenfolge der Ausführung von Zellen in einem Jupyter-Notizbuch wichtig ist, nicht die Reihenfolge, in der sie erscheinen. Python merkt sich den gesamten Code, der zuvor ausgeführt wurde, einschließlich aller Variablen, die Sie definiert haben, unabhängig von der Reihenfolge im Notizbuch. Wenn Sie also Variablen weiter unten im Notizbuch definieren und dann Zellen weiter oben (erneut) ausführen, sind die weiter unten definierten Variablen weiterhin vorhanden. Erstellen Sie zum Beispiel zwei Zellen mit dem folgenden Inhalt in dieser Reihenfolge:

PYTHON

print(myval)

PYTHON

myval = 1

Wenn Sie dies der Reihe nach ausführen, wird die erste Zelle einen Fehler ergeben. Wenn Sie jedoch die erste Zelle nach der zweiten Zelle ausführen, wird sie 1 ausgeben. Um Verwirrung zu vermeiden, kann es hilfreich sein, die Option Kernel -> Restart & Run All zu verwenden, die den Interpreter löscht und alles von oben nach unten durchführt.

Variablen können in Berechnungen verwendet werden.


  • Wir können Variablen in Berechnungen so verwenden, als wären sie Werte.
    • Erinnern Sie sich daran, dass wir vor ein paar Zeilen den Wert 42 an age zugewiesen haben.

PYTHON

age = age + 3
print('Age in three years:', age)

AUSGABE

Age in three years: 45

Verwenden Sie einen Index, um ein einzelnes Zeichen aus einer Zeichenkette zu erhalten.


  • Die Zeichen (einzelne Buchstaben, Zahlen und so weiter) in einer Zeichenkette sind geordnet. Zum Beispiel ist die Zeichenkette 'AB' nicht dasselbe wie 'BA'. Aufgrund dieser Ordnung können wir die Zeichenfolge als eine Liste von Zeichen behandeln.
  • Jede Position in der Zeichenkette (erste, zweite usw.) erhält eine Nummer. Diese Zahl wird als Index oder manchmal auch als tiefgestellt bezeichnet.
  • Indizes sind nummeriert von 0.
  • Verwenden Sie den Index der Position in eckigen Klammern, um das Zeichen an dieser Position zu erhalten.
Erläutern Sie die Indizierung, indem Sie Teilmengen der Zeichenkette drucken
Eine Python-Codezeile, print(atom_name[0]), demonstriert, dass bei Verwendung des Null-Index nur der Anfangsbuchstabe ausgegeben wird, in diesem Fall ‘h’ für Helium.

PYTHON

atom_name = 'helium'
print(atom_name[0])

AUSGABE

h

Verwenden Sie ein Slice, um eine Teilzeichenkette zu erhalten.


  • Ein Teil einer Zeichenkette wird Substring genannt. Ein Teilstring kann so kurz wie ein einzelnes Zeichen sein.
  • Ein Element in einer Liste wird Element genannt. Wenn wir eine Zeichenkette wie eine Liste behandeln, sind die Elemente der Zeichenkette ihre einzelnen Zeichen.
  • Ein Slice ist ein Teil einer Zeichenkette (oder, allgemeiner, ein Teil einer beliebigen listähnlichen Sache).
  • Wir nehmen ein Slice mit der Notation [start:stop], wobei start der ganzzahlige Index des ersten Elements ist, das wir wollen, und stop der ganzzahlige Index des Elements gerade nach dem letzten Element ist, das wir wollen.
  • Der Unterschied zwischen stop und start ist die Länge des Slice.
  • Die Entnahme eines Slice verändert nicht den Inhalt der ursprünglichen Zeichenkette. Stattdessen wird eine Kopie eines Teils der ursprünglichen Zeichenkette zurückgegeben.

PYTHON

atom_name = 'sodium'
print(atom_name[0:3])

AUSGABE

sod

Verwenden Sie die eingebaute Funktion len, um die Länge einer Zeichenkette zu ermitteln.


PYTHON

print(len('helium'))

AUSGABE

6
  • Verschachtelte Funktionen werden von innen nach außen ausgewertet, wie in der Mathematik.

Python unterscheidet Groß- und Kleinschreibung.


  • Python denkt, dass Groß- und Kleinbuchstaben unterschiedlich sind, also sind Name und name unterschiedliche Variablen.
  • Es gibt Konventionen für die Verwendung von Großbuchstaben am Anfang von Variablennamen, daher werden wir für den Moment Kleinbuchstaben verwenden.

Verwenden Sie aussagekräftige Variablennamen.


  • Python kümmert sich nicht darum, wie Sie Variablen nennen, solange sie die Regeln befolgen (alphanumerische Zeichen und der Unterstrich).

PYTHON

flabadab = 42
ewr_422_yY = 'Ahmed'
print(ewr_422_yY, 'is', flabadab, 'years old')
  • Verwende aussagekräftige Variablennamen, damit andere Leute verstehen, was das Programm macht.
  • Die wichtigste “andere Person” ist dein zukünftiges Ich.
Aufgabe

Vertauschen von Werten

Füllen Sie die Tabelle mit den Werten der Variablen in diesem Programm aus, nach dem jede Anweisung ausgeführt wurde.

PYTHON

# Command  # Value of x   # Value of y   # Value of swap #
x = 1.0    #              #              #               #
y = 3.0    #              #              #               #
swap = x   #              #              #               #
x = y      #              #              #               #
y = swap   #              #              #               #

AUSGABE

# Command  # Value of x   # Value of y   # Value of swap #
x = 1.0    # 1.0          # not defined  # not defined   #
y = 3.0    # 1.0          # 3.0          # not defined   #
swap = x   # 1.0          # 3.0          # 1.0           #
x = y      # 3.0          # 3.0          # 1.0           #
y = swap   # 3.0          # 1.0          # 1.0           #

Diese drei Zeilen tauschen die Werte in x und y aus, indem sie die Variable swap zur temporären Speicherung verwenden. Dies ist eine ziemlich übliche Programmiersprache.

Aufgabe

Vorhersage von Werten

Was ist der endgültige Wert von position in dem untenstehenden Programm? (Versuchen Sie, den Wert vorherzusagen, ohne das Programm auszuführen, und überprüfen Sie dann Ihre Vorhersage)

PYTHON

initial = 'left'
position = initial
initial = 'right'

PYTHON

print(position)

AUSGABE

left

Der Variablen initial wird der Wert 'left' zugewiesen. In der zweiten Zeile erhält die Variable position ebenfalls den Stringwert 'left'. In der dritten Zeile erhält die Variable initial den Wert 'right', aber die Variable position behält ihren String-Wert 'left'.

Aufgabe

Herausforderung

Wenn Sie a = 123 zuweisen, was passiert, wenn Sie versuchen, die zweite Ziffer von a über a[1] zu erhalten?

Zahlen sind keine Zeichenketten oder Sequenzen und Python gibt einen Fehler aus, wenn Sie versuchen, eine Index-Operation mit einer Zahl durchzuführen. In der nächsten Lektion über Typen und Typkonvertierung werden wir mehr über Typen lernen und wie man zwischen verschiedenen Typen konvertiert. Wenn man die N-te Stelle einer Zahl sucht, kann man sie mit der eingebauten Funktion str in eine Zeichenkette umwandeln und dann eine Indexoperation mit dieser Zeichenkette durchführen.

PYTHON

a = 123
print(a[1])

FEHLER

TypeError: 'int' object is not subscriptable

PYTHON

a = str(123)
print(a[1])

AUSGABE

2
Aufgabe

Auswahl eines Namens

Welcher ist ein besserer Variablenname, m, min oder minutes? Tipp: Überlegen Sie, welchen Code Sie lieber von jemandem erben würden, der das Labor verlässt:

  1. ts = m * 60 + s
  2. tot_sec = min * 60 + sec
  3. total_seconds = minutes * 60 + seconds

minutes ist besser, weil min so etwas wie “Minimum” bedeuten könnte (und eigentlich eine eingebaute Funktion in Python ist, die wir später behandeln werden).

Aufgabe

Slicing Praxis

Was gibt das folgende Programm aus?

PYTHON

atom_name = 'carbon'
print('atom_name[1:3] is:', atom_name[1:3])

AUSGABE

atom_name[1:3] is: ar
Aufgabe

Slicing-Konzepte

Gegeben sei die folgende Zeichenkette:

PYTHON

species_name = "Acacia buxifolia"

Was würden diese Ausdrücke zurückgeben?

  1. species_name[2:8]
  2. species_name[11:] (ohne einen Wert nach dem Doppelpunkt)
  3. species_name[:4] (ohne einen Wert vor dem Doppelpunkt)
  4. species_name[:] (nur ein Doppelpunkt)
  5. species_name[11:-3]
  6. species_name[-5:-3]
  7. Was passiert, wenn man einen stop Wert wählt, der außerhalb des Bereichs liegt? (d.h., versuchen Sie species_name[0:20] oder species_name[:103])
  1. species_name[2:8] gibt die Teilzeichenkette 'acia b' zurück
  2. species_name[11:] gibt die Teilzeichenkette 'folia' zurück, von Position 11 bis zum Ende
  3. species_name[:4] gibt die Teilzeichenkette 'Acac' zurück, vom Anfang bis zur Position 4, aber ohne diese
  4. species_name[:] gibt die gesamte Zeichenkette 'Acacia buxifolia' zurück
  5. species_name[11:-3] gibt die Teilzeichenkette 'fo' zurück, von der 11. bis zur drittletzten Position
  6. species_name[-5:-3] gibt auch die Teilzeichenkette 'fo' zurück, von der fünftletzten bis zur drittletzten Position
  7. Wenn ein Teil des Slice außerhalb des Bereichs liegt, schlägt die Operation nicht fehl.species_name[0:20] liefert das gleiche Ergebnis wie species_name[0:], und species_name[:103] liefert das gleiche Ergebnis wie species_name[:]
Hauptpunkte
  • Verwende Variablen, um Werte zu speichern.
  • Verwenden Sie print, um Werte anzuzeigen.
  • Variablen bleiben zwischen Zellen bestehen.
  • Variablen müssen erstellt werden, bevor sie verwendet werden.
  • Variablen können in Berechnungen verwendet werden.
  • Verwenden Sie einen Index, um ein einzelnes Zeichen aus einer Zeichenkette zu erhalten.
  • Verwenden Sie ein Slice, um eine Teilzeichenkette zu erhalten.
  • Verwenden Sie die eingebaute Funktion len, um die Länge einer Zeichenkette zu ermitteln.
  • Python unterscheidet Groß- und Kleinschreibung.
  • Verwenden Sie aussagekräftige Variablennamen.

Content from Datentypen und Typkonvertierung


Zuletzt aktualisiert am 2025-10-30 | Diese Seite bearbeiten

Geschätzte Zeit: 20 Minuten

Übersicht

Fragen

  • Welche Arten von Daten werden in Programmen gespeichert?
  • Wie kann ich einen Typ in einen anderen umwandeln?

Ziele

  • Erläutern Sie die wichtigsten Unterschiede zwischen Ganzzahlen und Fließkommazahlen.
  • Erläutern Sie die wichtigsten Unterschiede zwischen Zahlen und Zeichenketten.
  • Verwenden Sie eingebaute Funktionen, um zwischen Ganzzahlen, Fließkommazahlen und Zeichenketten zu konvertieren.

Jeder Wert hat einen Typ.


  • Jeder Wert in einem Programm hat einen bestimmten Typ.
  • Integer (int): repräsentiert positive oder negative ganze Zahlen wie 3 oder -512.
  • Fließkommazahl (float): repräsentiert reelle Zahlen wie 3.14159 oder -2.5.
  • Zeichenkette (gewöhnlich “string” genannt, str): text.
    • Wird entweder in einfachen oder in doppelten Anführungszeichen geschrieben (solange sie übereinstimmen).
    • Die Anführungszeichen werden nicht gedruckt, wenn die Zeichenkette angezeigt wird.

Verwenden Sie die eingebaute Funktion type, um den Typ eines Wertes zu ermitteln.


  • Verwenden Sie die eingebaute Funktion type, um herauszufinden, welchen Typ ein Wert hat.
  • Funktioniert auch mit Variablen.
    • Aber denken Sie daran: der Wert hat den Typ — die Variable ist nur eine Bezeichnung.

PYTHON

print(type(52))

AUSGABE

<class 'int'>

PYTHON

fitness = 'average'
print(type(fitness))

AUSGABE

<class 'str'>

Typen steuern, welche Operationen (oder Methoden) mit einem bestimmten Wert durchgeführt werden können.


  • Der Typ eines Wertes bestimmt, was das Programm mit ihm machen kann.

PYTHON

print(5 - 3)

AUSGABE

2

PYTHON

print('hello' - 'h')

FEHLER

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-67f5626a1e07> in <module>()
----> 1 print('hello' - 'h')

TypeError: unsupported operand type(s) for -: 'str' and 'str'

Sie können die Operatoren “+” und “*” auf Zeichenketten anwenden.


  • “Hinzufügen” von Zeichenketten verkettet diese.

PYTHON

full_name = 'Ahmed' + ' ' + 'Walsh'
print(full_name)

AUSGABE

Ahmed Walsh
  • Die Multiplikation einer Zeichenkette mit einer ganzen Zahl N erzeugt eine neue Zeichenkette, die aus dieser Zeichenkette besteht, die N Mal wiederholt wird.
    • Da die Multiplikation eine wiederholte Addition ist.

PYTHON

separator = '=' * 10
print(separator)

AUSGABE

==========

Strings haben eine Länge (aber Zahlen nicht).


  • Die eingebaute Funktion len zählt die Anzahl der Zeichen in einer Zeichenkette.

PYTHON

print(len(full_name))

AUSGABE

11
  • Aber Zahlen haben keine Länge (nicht einmal Null).

PYTHON

print(len(52))

FEHLER

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-f769e8e8097d> in <module>()
----> 1 print(len(52))

TypeError: object of type 'int' has no len()

Bei der Verarbeitung von Zahlen müssen diese in Zeichenfolgen umgewandelt werden oder umgekehrt.


  • Kann keine Zahlen und Strings addieren.

PYTHON

print(1 + '2')

FEHLER

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-fe4f54a023c6> in <module>()
----> 1 print(1 + '2')

TypeError: unsupported operand type(s) for +: 'int' and 'str'
  • Nicht erlaubt, weil mehrdeutig: sollte 1 + '2' 3 oder '12' sein?
  • Einige Typen können in andere Typen konvertiert werden, indem der Typname als Funktion verwendet wird.

PYTHON

print(1 + int('2'))
print(str(1) + '2')

AUSGABE

3
12

Kann Ganzzahlen und Fließkommazahlen in Operationen frei mischen.


  • Ganzzahlen und Fließkommazahlen können in der Arithmetik gemischt werden.
    • Python 3 wandelt ganze Zahlen bei Bedarf automatisch in Fließkommazahlen um.

PYTHON

print('half is', 1 / 2.0)
print('three squared is', 3.0 ** 2)

AUSGABE

half is 0.5
three squared is 9.0

Variablen ändern ihren Wert nur, wenn ihnen etwas zugewiesen wird.


  • Wenn wir eine Zelle in einem Arbeitsblatt von einer anderen abhängig machen und letztere aktualisieren, wird die erstere automatisch aktualisiert.
  • Dies geschieht nicht in Programmiersprachen.

PYTHON

variable_one = 1
variable_two = 5 * variable_one
variable_one = 2
print('first is', variable_one, 'and second is', variable_two)

AUSGABE

first is 2 and second is 5
  • Der Computer liest den Wert von variable_one, wenn er die Multiplikation durchführt, erzeugt einen neuen Wert und weist ihn variable_two zu.
  • Danach wird der Wert von variable_two auf den neuen Wert gesetzt und nicht abhängig von variable_one, so dass sich sein Wert nicht automatisch ändert, wenn sich variable_one ändert.
Aufgabe

Brüche

Was für ein Wert ist 3,4? Wie kann man das herausfinden?

Es handelt sich um eine Gleitkommazahl (oft mit “float” abgekürzt). Das kann man mit der eingebauten Funktion type() herausfinden.

PYTHON

print(type(3.4))

AUSGABE

<class 'float'>
Aufgabe

Automatische Typkonvertierung

Was für ein Wert ist 3,25 + 4?

Es handelt sich um eine Fließkommazahl: Ganzzahlen werden bei Bedarf automatisch in Fließkommazahlen umgewandelt.

PYTHON

result = 3.25 + 4
print(result, 'is', type(result))

AUSGABE

7.25 is <class 'float'>
Aufgabe

Wählen Sie einen Typ

Welche Art von Wert (Ganzzahl, Fließkommazahl oder Zeichenkette) würden Sie verwenden, um jede der folgenden Angaben darzustellen? Versuchen Sie, mehr als eine gute Antwort für jedes Problem zu finden. Wann wäre zum Beispiel in Frage 1 das Zählen von Tagen mit einer Fließkommazahl sinnvoller als mit einer ganzen Zahl?

  1. Anzahl der Tage seit Beginn des Jahres.
  2. Zeit, die vom Jahresanfang bis jetzt verstrichen ist, in Tagen.
  3. Seriennummer eines Laborgerätes.
  4. Das Alter einer Laborprobe
  5. Aktuelle Einwohnerzahl einer Stadt.
  6. Durchschnittliche Einwohnerzahl einer Stadt über die Zeit.

Die Antworten auf die Fragen lauten:

  1. Ganzzahl, da die Anzahl der Tage zwischen 1 und 365 liegen würde.
  2. Fließkomma, da gebrochene Tage benötigt werden
  3. Zeichenkette, wenn die Seriennummer Buchstaben und Zahlen enthält, andernfalls Ganzzahl, wenn die Seriennummer nur aus Ziffern besteht
  4. Dies wird variieren! Wie definiert man das Alter einer Probe? ganze Tage seit der Entnahme (Integer)? Datum und Uhrzeit (String)?
  5. Wählen Sie Fließkommazahlen, um die Bevölkerung als große Aggregate (z.B. Millionen) darzustellen, oder Ganzzahlen, um die Bevölkerung in Einheiten von Individuen darzustellen.
  6. Fließkommazahl, da ein Durchschnitt wahrscheinlich einen Bruchteil hat.
Aufgabe

Divisionstypen

In Python 3 führt der //-Operator Ganzzahldivisionen durch, der /-Operator führt Fließkommadivisionen durch, und der %-Operator (oder modulo) berechnet den Rest einer Ganzzahldivision und gibt ihn zurück:

PYTHON

print('5 // 3:', 5 // 3)
print('5 / 3:', 5 / 3)
print('5 % 3:', 5 % 3)

AUSGABE

5 // 3: 1
5 / 3: 1.6666666666666667
5 % 3: 2

Wenn num_subjects die Anzahl der Probanden ist, die an einer Studie teilnehmen, und num_per_survey die Anzahl, die an einer einzigen Umfrage teilnehmen kann, schreibe einen Ausdruck, der die Anzahl der Umfragen berechnet, die nötig sind, um alle einmal zu erreichen.

Wir wollen die minimale Anzahl von Umfragen, die jeden einmal erreicht, was der aufgerundete Wert von num_subjects/ num_per_survey ist. Dies ist gleichbedeutend mit der Durchführung einer Bodenteilung durch // und der Addition von 1. Vor der Division müssen wir 1 von der Anzahl der Probanden subtrahieren, um den Fall zu behandeln, dass num_subjects durch num_per_survey gleichmäßig teilbar ist.

PYTHON

num_subjects = 600
num_per_survey = 42
num_surveys = (num_subjects - 1) // num_per_survey + 1

print(num_subjects, 'subjects,', num_per_survey, 'per survey:', num_surveys)

AUSGABE

600 subjects, 42 per survey: 15
Aufgabe

Zeichenketten in Zahlen umwandeln

Wo es sinnvoll ist, konvertiert float() einen String in eine Fließkommazahl und int() konvertiert eine Fließkommazahl in eine Ganzzahl:

PYTHON

print("string to float:", float("3.4"))
print("float to int:", int(3.4))

AUSGABE

string to float: 3.4
float to int: 3

Wenn die Konvertierung jedoch keinen Sinn ergibt, wird eine Fehlermeldung ausgegeben.

PYTHON

print("string to float:", float("Hello world!"))

FEHLER

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-5-df3b790bf0a2> in <module>
----> 1 print("string to float:", float("Hello world!"))

ValueError: could not convert string to float: 'Hello world!'

Was erwarten Sie angesichts dieser Informationen von dem folgenden Programm?

Was macht sie eigentlich?

Warum glauben Sie, dass es das tut?

PYTHON

print("fractional string to int:", int("3.4"))

Was erwarten Sie von diesem Programm zu tun? Es wäre gar nicht so abwegig zu erwarten, dass der Python 3 int-Befehl die Zeichenkette “3.4” in 3.4 und eine zusätzliche Typkonvertierung in 3 umwandelt. Schließlich kann Python 3 noch eine Menge anderer Zaubereien - ist das nicht Teil seines Charmes?

PYTHON

int("3.4")

AUSGABE

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-2-ec6729dfccdc> in <module>
----> 1 int("3.4")
ValueError: invalid literal for int() with base 10: '3.4'

Python 3 gibt jedoch einen Fehler aus. Warum eigentlich? Um konsistent zu sein, möglicherweise. Wenn Sie Python auffordern, zwei aufeinanderfolgende Typecasts durchzuführen, müssen Sie es explizit im Code umwandeln.

PYTHON

int(float("3.4"))

AUSGABE

3
Aufgabe

Arithmetik mit verschiedenen Typen

Welche der folgenden Möglichkeiten gibt die Fließkommazahl 2.0 zurück? Hinweis: Es kann mehr als eine richtige Antwort geben.

PYTHON

first = 1.0
second = "1"
third = "1.1"
  1. first + float(second)
  2. float(second) + float(third)
  3. first + int(third)
  4. first + int(float(third))
  5. int(first) + int(float(third))
  6. 2.0 * second

Antwort: 1 und 4

Aufgabe

Komplexe Zahlen

Python bietet komplexe Zahlen, die als 1.0+2.0j geschrieben werden. Wenn val eine komplexe Zahl ist, können ihre realen und imaginären Teile mit der Punktnotation als val.real und val.imag angesprochen werden.

PYTHON

a_complex_number = 6 + 2j
print(a_complex_number.real)
print(a_complex_number.imag)

AUSGABE

6.0
2.0
  1. Warum, glaubst du, verwendet Python j statt i für den Imaginärteil?
  2. Was soll 1 + 2j + 3 ergeben?
  3. Was erwarten Sie von 4j? Was ist mit 4 j oder 4 + j?
  1. In der Standardmathematik wird üblicherweise i zur Bezeichnung einer imaginären Zahl verwendet. Medienberichten zufolge handelt es sich dabei jedoch um eine frühe Konvention aus der Elektrotechnik, deren Änderung nun einen technisch aufwendigen Bereich darstellt. Stack Overflow bietet zusätzliche Erklärungen und Diskussionen
  2. (4+2j)
  3. 4j und Syntax Error: invalid syntax. In den letztgenannten Fällen wird j als Variable betrachtet und die Aussage hängt davon ab, ob j definiert ist und wenn ja, welcher Wert ihm zugewiesen wurde.
Hauptpunkte
  • Jeder Wert hat einen Typ.
  • Verwenden Sie die eingebaute Funktion type, um den Typ eines Wertes zu ermitteln.
  • Typen steuern, welche Operationen mit Werten durchgeführt werden können.
  • Strings können addiert und multipliziert werden.
  • Zeichenketten haben eine Länge (Zahlen jedoch nicht).
  • Muss Zahlen in Zeichenketten umwandeln oder umgekehrt, wenn er mit ihnen operiert.
  • Kann Ganzzahlen und Fließkommazahlen in Operationen frei mischen.
  • Variablen ändern ihren Wert nur, wenn ihnen etwas zugewiesen wird.

Content from Eingebaute Funktionen und Hilfe


Zuletzt aktualisiert am 2025-10-30 | Diese Seite bearbeiten

Geschätzte Zeit: 25 Minuten

Übersicht

Fragen

  • Wie kann ich eingebaute Funktionen verwenden?
  • Wie kann ich herausfinden, was sie tun?
  • Welche Arten von Fehlern können in Programmen auftreten?

Ziele

  • Erläutern Sie den Zweck von Funktionen.
  • Rufen Sie eingebaute Python-Funktionen korrekt auf.
  • Richtiges Verschachteln von Aufrufen zu eingebauten Funktionen.
  • Verwenden Sie die Hilfe, um die Dokumentation für eingebaute Funktionen anzuzeigen.
  • Situationen, in denen SyntaxError und NameError auftreten, korrekt beschreiben.

Verwenden Sie Kommentare, um die Dokumentation von Programmen zu ergänzen.


PYTHON

# This sentence isn't executed by Python.
adjustment = 0.5   # Neither is this - anything after '#' is ignored.

Eine Funktion kann null oder mehr Argumente annehmen.


  • Wir haben schon einige Funktionen gesehen — jetzt wollen wir sie uns genauer ansehen.
  • Ein Argument ist ein Wert, der an eine Funktion übergeben wird.
  • len nimmt genau einen.
  • int, str und float erzeugen einen neuen Wert aus einem bestehenden.
  • print nimmt null oder mehr.
  • print ohne Argumente gibt eine leere Zeile aus.
    • Muss immer Klammern verwenden, auch wenn sie leer sind, damit Python weiß, dass eine Funktion aufgerufen wird.

PYTHON

print('before')
print()
print('after')

AUSGABE

before

after

Jede Funktion gibt etwas zurück.


  • Jeder Funktionsaufruf erzeugt ein Ergebnis.
  • Wenn die Funktion kein brauchbares Ergebnis zurückgeben kann, gibt sie normalerweise den speziellen Wert None zurück.None ist ein Python-Objekt, das immer dann einspringt, wenn es keinen Wert gibt.

PYTHON

result = print('example')
print('result of print is', result)

AUSGABE

example
result of print is None

Häufig genutzte eingebaute Funktionen sind max, min und round.


  • Verwenden Sie max, um den größten Wert von einem oder mehreren Werten zu finden.
  • Verwenden Sie min, um die kleinste Zahl zu finden.
  • Beide funktionieren sowohl mit Zeichenketten als auch mit Zahlen.
    • “Größer” und “kleiner” verwenden (0-9, A-Z, a-z), um Buchstaben zu vergleichen.

PYTHON

print(max(1, 2, 3))
print(min('a', 'A', '0'))

AUSGABE

3
0

Funktionen können nur für bestimmte (Kombinationen von) Argumenten funktionieren.


  • max und min müssen mit mindestens einem Argument versehen werden.
    • “Größte der leeren Menge” ist eine sinnlose Frage.
  • Und ihnen müssen Dinge gegeben werden, die sinnvoll verglichen werden können.

PYTHON

print(max(1, 'a'))

FEHLER

TypeError                                 Traceback (most recent call last)
<ipython-input-52-3f049acf3762> in <module>
----> 1 print(max(1, 'a'))

TypeError: '>' not supported between instances of 'str' and 'int'

Funktionen können Standardwerte für einige Argumente haben.


  • round rundet eine Fließkommazahl ab.
  • Rundet standardmäßig auf null Dezimalstellen.

PYTHON

round(3.712)

AUSGABE

4
  • Wir können die Anzahl der gewünschten Dezimalstellen angeben.

PYTHON

round(3.712, 1)

AUSGABE

3.7

Funktionen, die an Objekte angehängt sind, werden Methoden genannt


  • Funktionen nehmen eine andere Form an, die in den Pandas-Episoden üblich sein wird.
  • Methoden haben Klammern wie Funktionen, stehen aber hinter der Variablen.
  • Einige Methoden werden für interne Python-Operationen verwendet und sind durch doppelte Unterstriche gekennzeichnet.

PYTHON

my_string = 'Hello world!'  # Erstellung eines String-Objekts

print(len(my_string))       # Die Funktion len nimmt eine Zeichenkette als Argument und gibt die Länge der Zeichenkette zurück

print(my_string.swapcase()) # Aufruf der swapcase-Methode für das Objekt my_string

print(my_string.__len__())  # Aufruf der internen Methode __len__ für das Objekt my_string, verwendet von len(my_string)

AUSGABE

12
hELLO WORLD!
12
  • Man kann sie sogar aneinandergereiht sehen. Sie arbeiten von links nach rechts.

PYTHON

print(my_string.isupper())          # Nicht alle Buchstaben sind Großbuchstaben
print(my_string.upper())            # Dadurch werden alle Buchstaben großgeschrieben

print(my_string.upper().isupper())  # Jetzt sind alle Buchstaben groß geschrieben

AUSGABE

False
HELLO WORLD
True

Verwenden Sie die eingebaute Funktion help, um Hilfe für eine Funktion zu erhalten.


  • Jede eingebaute Funktion hat eine Online-Dokumentation.

PYTHON

help(round)

AUSGABE

Help on built-in function round in module builtins:

round(number, ndigits=None)
    Round a number to a given precision in decimal digits.

    The return value is an integer if ndigits is omitted or None.  Otherwise
    the return value has the same type as the number.  ndigits may be negative.

Das Jupyter Notebook bietet zwei Möglichkeiten, Hilfe zu erhalten.


  • Option 1: Platzieren Sie den Cursor in der Nähe der Stelle, an der die Funktion in einer Zelle aufgerufen wird (d.h. der Funktionsname oder ihre Parameter),
    • Halten Sie Shift gedrückt und drücken Sie Tab.
    • Führen Sie dies mehrmals durch, um die zurückgegebenen Informationen zu erweitern.
  • Option 2: Geben Sie den Funktionsnamen in eine Zelle ein, hinter der ein Fragezeichen steht. Führen Sie dann die Zelle aus.

Python meldet einen Syntaxfehler, wenn es den Quelltext eines Programms nicht verstehen kann.


  • Versucht erst gar nicht, das Programm auszuführen, wenn es nicht geparst werden kann.

PYTHON

# Forgot to close the quote marks around the string.
name = 'Feng

FEHLER

  File "<ipython-input-56-f42768451d55>", line 2
    name = 'Feng
                ^
SyntaxError: EOL while scanning string literal

PYTHON

# An extra '=' in the assignment.
age = = 52

FEHLER

  File "<ipython-input-57-ccc3df3cf902>", line 2
    age = = 52
          ^
SyntaxError: invalid syntax
  • Sehen Sie sich die Fehlermeldung genauer an:

PYTHON

print("hello world"

FEHLER

  File "<ipython-input-6-d1cc229bf815>", line 1
    print ("hello world"
                        ^
SyntaxError: unexpected EOF while parsing
  • Die Meldung weist auf ein Problem in der ersten Zeile der Eingabe (“Zeile 1”) hin.
    • In diesem Fall sagt uns der Abschnitt “ipython-input” des Dateinamens, dass wir mit Eingaben in IPython arbeiten, dem Python-Interpreter, der vom Jupyter Notebook verwendet wird.
  • Der Teil -6- des Dateinamens zeigt an, dass der Fehler in Zelle 6 unseres Notebooks aufgetreten ist.
  • Es folgt die problematische Codezeile, die auf das Problem mit einem ^-Zeiger hinweist.

Python meldet einen Laufzeitfehler, wenn bei der Ausführung eines Programms etwas schief läuft.


PYTHON

age = 53
remaining = 100 - aege # mis-spelled 'age'

FEHLER

NameError                                 Traceback (most recent call last)
<ipython-input-59-1214fb6c55fc> in <module>
      1 age = 53
----> 2 remaining = 100 - aege # mis-spelled 'age'

NameError: name 'aege' is not defined
  • Beheben Sie Syntaxfehler durch Lesen des Quellcodes und Laufzeitfehler durch Verfolgen der Ausführung.
Aufgabe

Was passiert, wenn

  1. Erklären Sie in einfachen Worten die Reihenfolge der Operationen im folgenden Programm: wann erfolgt die Addition, wann die Subtraktion, wann wird jede Funktion aufgerufen, usw.
  2. Was ist der Endwert von radiance?

PYTHON

radiance = 1.0
radiance = max(2.1, 2.0 + min(radiance, 1.1 * radiance - 0.5))
  1. Reihenfolge der Operationen:
  2. 1.1 * radiance = 1.1
  3. 1.1 - 0.5 = 0.6
  4. min(radiance, 0.6) = 0.6
  5. 2.0 + 0.6 = 2.6
  6. max(2.1, 2.6) = 2.6
  7. Am Ende, radiance = 2.6
Aufgabe

Erkenne den Unterschied

  1. Sagen Sie voraus, was jede der print-Anweisungen im folgenden Programm ausgeben wird.
  2. Läuft max(len(rich), poor) oder gibt es eine Fehlermeldung? Wenn es ausgeführt wird, ergibt das Ergebnis einen Sinn?

PYTHON

easy_string = "abc"
print(max(easy_string))
rich = "gold"
poor = "tin"
print(max(rich, poor))
print(max(len(rich), len(poor)))

PYTHON

print(max(easy_string))

AUSGABE

c

PYTHON

print(max(rich, poor))

AUSGABE

tin

PYTHON

print(max(len(rich), len(poor)))

AUSGABE

4

max(len(rich), poor) wirft einen TypeError. Daraus wird max(4, 'tin'), und wie wir bereits besprochen haben, können eine Zeichenkette und eine ganze Zahl nicht sinnvoll verglichen werden.

FEHLER

TypeError                                 Traceback (most recent call last)
<ipython-input-65-bc82ad05177a> in <module>
----> 1 max(len(rich), poor)

TypeError: '>' not supported between instances of 'str' and 'int'
Aufgabe

Warum nicht?

Warum geben max und min nicht None zurück, wenn sie ohne Argumente aufgerufen werden?

max und min geben in diesem Fall TypeErrors zurück, weil nicht die richtige Anzahl von Parametern übergeben wurde. Wenn nur None zurückgegeben würde, wäre der Fehler viel schwieriger zu verfolgen, da er wahrscheinlich in einer Variablen gespeichert und später im Programm verwendet würde, nur um dann wahrscheinlich einen Laufzeitfehler auszulösen.

Aufgabe

Letztes Zeichen einer Zeichenkette

Wenn Python bei Null anfängt zu zählen und len die Anzahl der Zeichen in einer Zeichenkette liefert, welcher Indexausdruck liefert dann das letzte Zeichen in der Zeichenkette name? (Hinweis: Wir werden in einer späteren Folge einen einfacheren Weg sehen, dies zu tun.)

name[len(name) - 1]

Wichtig

Erforschen Sie die Python-Dokumente!

Die offizielle Python-Dokumentation ist wohl die vollständigste Informationsquelle über die Sprache. Sie ist in verschiedenen Sprachen verfügbar und enthält eine Menge nützlicher Ressourcen. Die Seite Built-in Functions enthält einen Katalog all dieser Funktionen, einschließlich derer, die wir in dieser Lektion behandelt haben. Einige dieser Funktionen sind fortgeschrittener und im Moment unnötig, aber andere sind sehr einfach und nützlich.

Hauptpunkte
  • Verwenden Sie Kommentare, um Programme zu dokumentieren.
  • Eine Funktion kann null oder mehr Argumente annehmen.
  • Zu den häufig verwendeten eingebauten Funktionen gehören max, min und round.
  • Funktionen können nur für bestimmte (Kombinationen von) Argumenten funktionieren.
  • Funktionen können Standardwerte für einige Argumente haben.
  • Benutzen Sie die eingebaute Funktion help, um Hilfe für eine Funktion zu erhalten.
  • Das Jupyter Notebook bietet zwei Möglichkeiten, Hilfe zu erhalten.
  • Jede Funktion gibt etwas zurück.
  • Python meldet einen Syntaxfehler, wenn es den Quelltext eines Programms nicht verstehen kann.
  • Python meldet einen Laufzeitfehler, wenn bei der Ausführung eines Programms etwas schief läuft.
  • Beheben Sie Syntaxfehler, indem Sie den Quellcode lesen, und Laufzeitfehler, indem Sie die Ausführung des Programms verfolgen.

Content from Morgenkaffee


Zuletzt aktualisiert am 2025-03-02 | Diese Seite bearbeiten

Geschätzte Zeit: 0 Minuten

Reflexionsübung


Denken Sie beim Kaffee über Folgendes nach und diskutieren Sie es:

  • Welche verschiedenen Arten von Fehlern meldet Python?
  • Hat der Code immer die erwarteten Ergebnisse geliefert? Wenn nicht, warum?
  • Gibt es etwas, das wir tun können, um Fehler beim Schreiben von Code zu vermeiden?

Content from Bibliotheken


Zuletzt aktualisiert am 2025-10-30 | Diese Seite bearbeiten

Geschätzte Zeit: 20 Minuten

Übersicht

Fragen

  • Wie kann ich Software benutzen, die andere Leute geschrieben haben?
  • Wie kann ich herausfinden, was diese Software macht?

Ziele

  • Erklären, was Softwarebibliotheken sind und warum Programmierer sie erstellen und benutzen.
  • Schreibe Programme, die Module aus der Python-Standardbibliothek importieren und verwenden.
  • Suchen und lesen Sie die Dokumentation der Standardbibliothek interaktiv (im Interpreter) und online.

Der größte Teil der Macht einer Programmiersprache liegt in ihren Bibliotheken.


  • Eine Bibliothek ist eine Sammlung von Dateien (Module genannt), die Funktionen zur Verwendung durch andere Programme enthält.
    • Kann auch Datenwerte (z.B. numerische Konstanten) und andere Dinge enthalten.
    • Der Inhalt einer Bibliothek sollte zusammengehören, aber es gibt keine Möglichkeit, das zu erzwingen.
  • Die Python-Standardbibliothek ist eine umfangreiche Sammlung von Modulen, die mit Python selbst geliefert wird.
  • Viele zusätzliche Bibliotheken sind über PyPI (den Python Package Index) erhältlich.
  • Wir werden später sehen, wie man neue Bibliotheken schreibt.
Wichtig

Bibliotheken und Module

Eine Bibliothek ist eine Sammlung von Modulen, aber die Begriffe werden oft austauschbar verwendet, vor allem, da viele Bibliotheken nur aus einem einzigen Modul bestehen, also mach dir keine Sorgen, wenn du sie vermischt.

Ein Programm muss ein Bibliotheksmodul importieren, bevor es es verwenden kann.


  • Benutze import, um ein Bibliotheksmodul in den Speicher eines Programms zu laden.
  • Dann verweise auf Dinge aus dem Modul als module_name.thing_name.
    • Python verwendet . als Bezeichnung für “Teil von”.
  • Verwendung von math, einem der Module der Standardbibliothek:

PYTHON

import math

print('pi is', math.pi)
print('cos(pi) is', math.cos(math.pi))

AUSGABE

pi is 3.141592653589793
cos(pi) is -1.0
  • Auf jedes Element muss mit dem Namen des Moduls verwiesen werden.
    • math.cos(pi) wird nicht funktionieren: der Verweis auf pi “erbt” nicht irgendwie den Verweis der Funktion auf math.

Benutzen Sie help, um etwas über den Inhalt eines Bibliotheksmoduls zu erfahren.


  • Funktioniert genau wie die Hilfe für eine Funktion.

PYTHON

help(math)

AUSGABE

Help on module math:

NAME
    math

MODULE REFERENCE
    http://docs.python.org/3/library/math

    The following documentation is automatically generated from the Python
    source files.  It may be incomplete, incorrect or include features that
    are considered implementation detail and may vary between Python
    implementations.  When in doubt, consult the module reference at the
    location listed above.

DESCRIPTION
    This module is always available.  It provides access to the
    mathematical functions defined by the C standard.

FUNCTIONS
    acos(x, /)
        Return the arc cosine (measured in radians) of x.
⋮ ⋮ ⋮

Importieren Sie bestimmte Elemente aus einem Bibliotheksmodul, um Programme zu verkürzen.


  • Verwenden Sie from ... import ..., um nur bestimmte Elemente aus einem Bibliotheksmodul zu laden.
  • Dann verweisen Sie direkt auf sie ohne den Bibliotheksnamen als Präfix.

PYTHON

from math import cos, pi

print('cos(pi) is', cos(pi))

AUSGABE

cos(pi) is -1.0

Erstellen Sie einen Alias für ein Bibliotheksmodul, wenn Sie es importieren, um Programme zu verkürzen.


  • Benutzen Sie import ... as ..., um einer Bibliothek einen kurzen Alias zu geben, während Sie sie importieren.
  • Dann verweisen Sie auf Elemente in der Bibliothek mit diesem verkürzten Namen.

PYTHON

import math as m

print('cos(pi) is', m.cos(m.pi))

AUSGABE

cos(pi) is -1.0
  • Wird häufig für Bibliotheken verwendet, die häufig benutzt werden oder lange Namen haben.
    • z.B. wird die matplotlib Plot-Bibliothek oft als mpl aliasiert.
  • Dies kann jedoch dazu führen, dass Programme schwerer zu verstehen sind, da die Leser die Aliasnamen Ihres Programms lernen müssen.
Aufgabe

Inspizieren des Math-Moduls

  1. Welche Funktion aus dem Modul math können Sie verwenden, um eine Quadratwurzel ohne Verwendung von sqrt zu berechnen?
  2. Da die Bibliothek diese Funktion enthält, warum existiert sqrt?
  1. Mit help(math) sehen wir, dass wir pow(x,y) zusätzlich zu sqrt(x) haben, also könnten wir pow(x, 0.5) benutzen, um eine Quadratwurzel zu finden.

  2. Die Funktion sqrt(x) ist bei der Implementierung von Gleichungen wohl lesbarer als pow(x, 0.5). Lesbarkeit ist ein Eckpfeiler guter Programmierung, daher ist es sinnvoll, eine spezielle Funktion für diesen speziellen Fall bereitzustellen.

Auch das Design der Python-Bibliothek math hat seinen Ursprung im C-Standard, der sowohl sqrt(x) als auch pow(x,y) enthält, also zeigt sich ein wenig von der Geschichte des Programmierens in Pythons Funktionsnamen.

Aufgabe

Auffinden des richtigen Moduls

Sie wollen ein zufälliges Zeichen aus einer Zeichenkette auswählen:

PYTHON

bases = 'ACTTGCTTGAC'
  1. Welches Standardbibliothek-Modul könnte Ihnen helfen?
  2. Welche Funktion würden Sie aus diesem Modul auswählen? Gibt es Alternativen?
  3. Versuche, ein Programm zu schreiben, das die Funktion verwendet.

Das Zufallsmodul scheint zu helfen.

Die Zeichenkette besteht aus 11 Zeichen, die jeweils einen Positionsindex von 0 bis 10 haben. Sie könnten die Funktionen random.randrange(https://docs.python.org/3/library/random.html#random.randrange) oder random.randint(https://docs.python.org/3/library/random.html#random.randint) verwenden, um eine zufällige ganze Zahl zwischen 0 und 10 zu erhalten, und dann das Zeichenbasesan diesem Index auswählen:

PYTHON

from random import randrange

random_index = randrange(len(bases))
print(bases[random_index])

oder noch kompakter:

PYTHON

from random import randrange

print(bases[randrange(len(bases))])

Vielleicht haben Sie die Funktion random.sample gefunden? Sie ermöglicht etwas weniger Tipparbeit, ist aber vielleicht etwas schwerer zu verstehen, wenn man nur liest:

PYTHON

from random import sample

print(sample(bases, 1)[0])

Beachten Sie, dass diese Funktion eine Liste von Werten zurückgibt. Wir werden in Folge 11 etwas über Listen lernen.

Die einfachste und kürzeste Lösung ist die Funktion random.choice, die genau das tut, was wir wollen:

PYTHON

from random import choice

print(choice(bases))
Aufgabe

Jigsaw Puzzle (Parsons’s Problem) Programmierbeispiel

Ordnen Sie die folgenden Anweisungen so an, dass eine zufällige DNA-Base und ihr Index in der Zeichenkette ausgegeben wird. Es werden nicht alle Anweisungen benötigt. Sie können auch Zwischenvariablen verwenden/hinzufügen.

PYTHON

bases="ACTTGCTTGAC"
import math
import random
___ = random.randrange(n_bases)
___ = len(bases)
print("random base ", bases[___], "base index", ___)

PYTHON

import math 
import random
bases = "ACTTGCTTGAC" 
n_bases = len(bases)
idx = random.randrange(n_bases)
print("random base", bases[idx], "base index", idx)
Aufgabe

Wann ist die Hilfe verfügbar?

Wenn ein Kollege von Ihnen help(math) tippt, meldet Python einen Fehler:

FEHLER

NameError: name 'math' is not defined

Was hat Ihr Kollege vergessen zu tun?

Importieren des Mathe-Moduls (import math)

Aufgabe

Importieren mit Aliasen

  1. Füllen Sie die Leerzeichen aus, damit das folgende Programm 90.0 ausgibt.
  2. Schreiben Sie das Programm so um, dass es import ohne as verwendet.
  3. Welche Form ist für Sie leichter zu lesen?

PYTHON

import math as m
angle = ____.degrees(____.pi / 2)
print(____)

PYTHON

import math as m
angle = m.degrees(m.pi / 2)
print(angle)

kann geschrieben werden als

PYTHON

import math
angle = math.degrees(math.pi / 2)
print(angle)

Da Sie den Code gerade erst geschrieben haben und mit ihm vertraut sind, finden Sie die erste Version vielleicht sogar einfacher zu lesen. Wenn Sie jedoch versuchen, einen umfangreichen Code zu lesen, der von jemand anderem geschrieben wurde, oder wenn Sie nach mehreren Monaten zu Ihrem eigenen umfangreichen Code zurückkehren, sind nicht abgekürzte Namen oft einfacher, es sei denn, es gibt klare Abkürzungskonventionen.

Aufgabe

Es gibt viele Möglichkeiten, Bibliotheken zu importieren!

Ordnen Sie die folgenden Druckanweisungen den entsprechenden Bibliotheksaufrufen zu.

Druckbefehle:

  1. print("sin(pi/2) =", sin(pi/2))
  2. print("sin(pi/2) =", m.sin(m.pi/2))
  3. print("sin(pi/2) =", math.sin(math.pi/2))

Bibliotheksaufrufe:

  1. from math import sin, pi
  2. import math
  3. import math as m
  4. from math import *
  1. Bibliotheksaufrufe 1 und 4. Um direkt auf sin und pi ohne den Bibliotheksnamen als Präfix zu verweisen, müssen Sie die Anweisung from ... import ... verwenden. Während Bibliotheksaufruf 1 speziell die beiden Funktionen sin und pi importiert, importiert Bibliotheksaufruf 4 alle Funktionen im Modul math.
  2. Bibliotheksaufruf 3. Hier werden sin und pi mit einem verkürzten Bibliotheksnamen m anstelle von math angesprochen. Bibliotheksaufruf 3 macht genau das mit der Syntax import ... as ... - er erzeugt einen Alias für math in Form des verkürzten Namens m.
  3. Bibliotheksaufruf 2. Hier wird auf sin und pi mit dem regulären Bibliotheksnamen math verwiesen, so dass der reguläre Aufruf import ... ausreicht.

Hinweis: Obwohl der Bibliotheksaufruf 4 funktioniert, ist es nicht empfohlen, alle Namen aus einem Modul mit einem Platzhalterimport zu importieren, da es dadurch unklar wird, welche Namen aus dem Modul im Code verwendet werden. Im Allgemeinen ist es am besten, Ihre Importe so spezifisch wie möglich zu gestalten und nur das zu importieren, was Ihr Code verwendet. In Bibliotheksaufruf 1 sagt uns die Anweisung import explizit, dass die Funktion sin aus dem Modul math importiert wird, aber Bibliotheksaufruf 4 vermittelt diese Information nicht.

Aufgabe

Importieren bestimmter Elemente

  1. Füllen Sie die Leerzeichen aus, damit das folgende Programm 90.0 ausgibt.
  2. Finden Sie diese Version leichter zu lesen als die vorhergehenden?
  3. Warum würden Programmierer nicht immer diese Form von import benutzen?

PYTHON

____ math import ____, ____
angle = degrees(pi / 2)
print(angle)

PYTHON

from math import degrees, pi
angle = degrees(pi / 2)
print(angle)

Wahrscheinlich finden Sie diese Version einfacher zu lesen, da sie weniger dicht ist. Der Hauptgrund, diese Form des Imports nicht zu verwenden, ist die Vermeidung von Namenskonflikten. Sie würden zum Beispiel degrees nicht auf diese Weise importieren, wenn Sie auch den Namen degrees für eine eigene Variable oder Funktion verwenden wollten. Oder wenn Sie auch eine Funktion mit dem Namen degrees aus einer anderen Bibliothek importieren würden.

Aufgabe

Lesen von Fehlermeldungen

  1. Lesen Sie den folgenden Code und versuchen Sie, die Fehler zu erkennen, ohne ihn auszuführen.
  2. Führen Sie den Code aus, und lesen Sie die Fehlermeldung. Um welche Art von Fehler handelt es sich?

PYTHON

from math import log
log(0)

AUSGABE

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-1-d72e1d780bab> in <module>
      1 from math import log
----> 2 log(0)

ValueError: math domain error
  1. Der Logarithmus von x ist nur für x > 0 definiert, also liegt 0 außerhalb des Bereichs der Funktion.
  2. Sie erhalten einen Fehler vom Typ ValueError, der anzeigt, dass die Funktion einen unpassenden Argumentwert erhalten hat. Die zusätzliche Meldung “math domain error” macht deutlicher, wo das Problem liegt.
Hauptpunkte
  • Der größte Teil der Macht einer Programmiersprache liegt in ihren Bibliotheken.
  • Ein Programm muss ein Bibliotheksmodul importieren, um es verwenden zu können.
  • Verwenden Sie help, um mehr über den Inhalt eines Bibliotheksmoduls zu erfahren.
  • Importieren Sie bestimmte Elemente aus einer Bibliothek, um Programme zu verkürzen.
  • Erstellen Sie einen Alias für eine Bibliothek, wenn Sie diese importieren, um Programme zu verkürzen.

Content from Tabellarische Daten in DataFrames einlesen


Zuletzt aktualisiert am 2025-10-31 | Diese Seite bearbeiten

Geschätzte Zeit: 20 Minuten

Übersicht

Fragen

  • Wie kann ich tabellarische Daten lesen?

Ziele

  • Importieren Sie die Pandas-Bibliothek.
  • Verwenden Sie Pandas, um einen einfachen CSV-Datensatz zu laden.
  • Erhalten Sie einige grundlegende Informationen über einen Pandas DataFrame.

Verwenden Sie die Pandas-Bibliothek, um Statistiken über tabellarische Daten zu erstellen.


  • Pandas ist eine weit verbreitete Python-Bibliothek für Statistiken, insbesondere für tabellarische Daten.
  • Übernimmt viele Funktionen aus den Dataframes von R.
    • Eine 2-dimensionale Tabelle, deren Spalten Namen haben und möglicherweise verschiedene Datentypen haben.
  • Pandas mit import pandas as pd laden. Der Alias pd wird üblicherweise verwendet, um im Code auf die Pandas-Bibliothek zu verweisen.
  • Einlesen einer CSV-Datendatei (Comma Separated Values) mit pd.read_csv.
    • Argument ist der Name der zu lesenden Datei.
    • Gibt einen DataFrame zurück, den Sie einer Variablen zuweisen können

PYTHON

import pandas as pd

data_oceania = pd.read_csv('data/gapminder_gdp_oceania.csv')
print(data_oceania)

AUSGABE

       country  gdpPercap_1952  gdpPercap_1957  gdpPercap_1962  \
0    Australia     10039.59564     10949.64959     12217.22686
1  New Zealand     10556.57566     12247.39532     13175.67800

   gdpPercap_1967  gdpPercap_1972  gdpPercap_1977  gdpPercap_1982  \
0     14526.12465     16788.62948     18334.19751     19477.00928
1     14463.91893     16046.03728     16233.71770     17632.41040

   gdpPercap_1987  gdpPercap_1992  gdpPercap_1997  gdpPercap_2002  \
0     21888.88903     23424.76683     26997.93657     30687.75473
1     19007.19129     18363.32494     21050.41377     23189.80135

   gdpPercap_2007
0     34435.36744
1     25185.00911
  • Die Spalten in einem DataFrame sind die beobachteten Variablen und die Zeilen die Beobachtungen.
  • Pandas verwendet den Backslash \, um umbrochene Zeilen anzuzeigen, wenn die Ausgabe zu breit ist, um auf den Bildschirm zu passen.
  • Die Verwendung von beschreibenden Namen für DataFrame hilft uns, zwischen mehreren DataFrame zu unterscheiden, damit wir nicht versehentlich einen DataFrame überschreiben oder aus dem falschen DataFrame lesen.
Wichtig

Datei nicht gefunden

Unsere Lektionen speichern ihre Datendateien in einem Unterverzeichnis data, weshalb der Pfad zur Datei data/gapminder_gdp_oceania.csv lautet. Wenn Sie vergessen, data/ einzuschließen, oder wenn Sie es einschließen, aber Ihre Kopie der Datei irgendwo anders liegt, erhalten Sie einen Laufzeitfehler, der mit einer Zeile wie dieser endet:

FEHLER

FileNotFoundError: [Errno 2] No such file or directory: 'data/gapminder_gdp_oceania.csv'

Verwenden Sie index_col, um anzugeben, dass die Werte einer Spalte als Zeilenüberschriften verwendet werden sollen.


  • Die Zeilenüberschriften sind Zahlen (in diesem Fall 0 und 1).
  • Möchte wirklich nach Ländern indexieren.
  • Übergeben Sie dazu den Namen der Spalte an den Parameter read_csv als index_col.
  • Die Benennung des DataFrames data_oceania_country sagt uns, welche Region die Daten umfassen (oceania) und wie sie indiziert sind (country).

PYTHON

data_oceania_country = pd.read_csv('data/gapminder_gdp_oceania.csv', index_col='country')
print(data_oceania_country)

AUSGABE

             gdpPercap_1952  gdpPercap_1957  gdpPercap_1962  gdpPercap_1967  \
country
Australia       10039.59564     10949.64959     12217.22686     14526.12465
New Zealand     10556.57566     12247.39532     13175.67800     14463.91893

             gdpPercap_1972  gdpPercap_1977  gdpPercap_1982  gdpPercap_1987  \
country
Australia       16788.62948     18334.19751     19477.00928     21888.88903
New Zealand     16046.03728     16233.71770     17632.41040     19007.19129

             gdpPercap_1992  gdpPercap_1997  gdpPercap_2002  gdpPercap_2007
country
Australia       23424.76683     26997.93657     30687.75473     34435.36744
New Zealand     18363.32494     21050.41377     23189.80135     25185.00911

Verwenden Sie die Methode DataFrame.info(), um mehr über einen DataFrame herauszufinden.


PYTHON

data_oceania_country.info()

AUSGABE

<class 'pandas.core.frame.DataFrame'>
Index: 2 entries, Australia to New Zealand
Data columns (total 12 columns):
gdpPercap_1952    2 non-null float64
gdpPercap_1957    2 non-null float64
gdpPercap_1962    2 non-null float64
gdpPercap_1967    2 non-null float64
gdpPercap_1972    2 non-null float64
gdpPercap_1977    2 non-null float64
gdpPercap_1982    2 non-null float64
gdpPercap_1987    2 non-null float64
gdpPercap_1992    2 non-null float64
gdpPercap_1997    2 non-null float64
gdpPercap_2002    2 non-null float64
gdpPercap_2007    2 non-null float64
dtypes: float64(12)
memory usage: 208.0+ bytes
  • Dies ist ein DataFrame
  • Zwei Zeilen mit den Namen 'Australia' und 'New Zealand'
  • Zwölf Spalten, von denen jede zwei tatsächliche 64-Bit-Gleitkommawerte enthält.
    • Wir werden später über Nullwerte sprechen, die zur Darstellung fehlender Beobachtungen verwendet werden.
  • Benötigt 208 Bytes Speicherplatz.

Die Variable DataFrame.columns speichert Informationen über die Spalten des DataFrames.


  • Beachten Sie, dass es sich hierbei um Daten und nicht um eine Methode handelt. (Es hat keine Klammern.)
    • Wie math.pi.
    • Verwenden Sie also nicht (), um zu versuchen, es aufzurufen.
  • Wird als Mitgliedvariable oder einfach Mitglied bezeichnet.

PYTHON

print(data_oceania_country.columns)

AUSGABE

Index(['gdpPercap_1952', 'gdpPercap_1957', 'gdpPercap_1962', 'gdpPercap_1967',
       'gdpPercap_1972', 'gdpPercap_1977', 'gdpPercap_1982', 'gdpPercap_1987',
       'gdpPercap_1992', 'gdpPercap_1997', 'gdpPercap_2002', 'gdpPercap_2007'],
      dtype='object')

Verwenden Sie DataFrame.T, um einen DataFrame zu transponieren.


  • Manchmal möchte man Spalten als Zeilen behandeln und umgekehrt.
  • Transponieren (geschrieben .T) kopiert die Daten nicht, sondern ändert nur die Sichtweise des Programms darauf.
  • Wie columns ist sie eine Mitgliedsvariable.

PYTHON

print(data_oceania_country.T)

AUSGABE

country           Australia  New Zealand
gdpPercap_1952  10039.59564  10556.57566
gdpPercap_1957  10949.64959  12247.39532
gdpPercap_1962  12217.22686  13175.67800
gdpPercap_1967  14526.12465  14463.91893
gdpPercap_1972  16788.62948  16046.03728
gdpPercap_1977  18334.19751  16233.71770
gdpPercap_1982  19477.00928  17632.41040
gdpPercap_1987  21888.88903  19007.19129
gdpPercap_1992  23424.76683  18363.32494
gdpPercap_1997  26997.93657  21050.41377
gdpPercap_2002  30687.75473  23189.80135
gdpPercap_2007  34435.36744  25185.00911

Verwenden Sie DataFrame.describe(), um zusammenfassende Statistiken über Daten zu erhalten.


DataFrame.describe() liefert die zusammenfassende Statistik nur für die Spalten, die numerische Daten enthalten. Alle anderen Spalten werden ignoriert, es sei denn, Sie verwenden das Argument include='all'.

PYTHON

print(data_oceania_country.describe())

AUSGABE

       gdpPercap_1952  gdpPercap_1957  gdpPercap_1962  gdpPercap_1967  \
count        2.000000        2.000000        2.000000        2.000000
mean     10298.085650    11598.522455    12696.452430    14495.021790
std        365.560078      917.644806      677.727301       43.986086
min      10039.595640    10949.649590    12217.226860    14463.918930
25%      10168.840645    11274.086022    12456.839645    14479.470360
50%      10298.085650    11598.522455    12696.452430    14495.021790
75%      10427.330655    11922.958888    12936.065215    14510.573220
max      10556.575660    12247.395320    13175.678000    14526.124650

       gdpPercap_1972  gdpPercap_1977  gdpPercap_1982  gdpPercap_1987  \
count         2.00000        2.000000        2.000000        2.000000
mean      16417.33338    17283.957605    18554.709840    20448.040160
std         525.09198     1485.263517     1304.328377     2037.668013
min       16046.03728    16233.717700    17632.410400    19007.191290
25%       16231.68533    16758.837652    18093.560120    19727.615725
50%       16417.33338    17283.957605    18554.709840    20448.040160
75%       16602.98143    17809.077557    19015.859560    21168.464595
max       16788.62948    18334.197510    19477.009280    21888.889030

       gdpPercap_1992  gdpPercap_1997  gdpPercap_2002  gdpPercap_2007
count        2.000000        2.000000        2.000000        2.000000
mean     20894.045885    24024.175170    26938.778040    29810.188275
std       3578.979883     4205.533703     5301.853680     6540.991104
min      18363.324940    21050.413770    23189.801350    25185.009110
25%      19628.685413    22537.294470    25064.289695    27497.598692
50%      20894.045885    24024.175170    26938.778040    29810.188275
75%      22159.406358    25511.055870    28813.266385    32122.777857
max      23424.766830    26997.936570    30687.754730    34435.367440
  • Nicht besonders nützlich bei nur zwei Datensätzen, aber sehr hilfreich, wenn es Tausende sind.
Aufgabe

Andere Daten lesen

Lesen Sie die Daten in gapminder_gdp_americas.csv (die sich im gleichen Verzeichnis wie gapminder_gdp_oceania.csv befinden sollten) in eine Variable mit dem Namen data_americas und zeigen Sie deren zusammenfassende Statistik an.

Um eine CSV-Datei einzulesen, verwenden wir pd.read_csv und übergeben ihr den Dateinamen 'data/gapminder_gdp_americas.csv'. Wir übergeben auch wieder den Spaltennamen 'country' an den Parameter index_col, um nach Ländern zu indizieren. Die zusammenfassende Statistik kann mit der Methode DataFrame.describe() angezeigt werden.

PYTHON

data_americas = pd.read_csv('data/gapminder_gdp_americas.csv', index_col='country')
data_americas.describe()
Aufgabe

Inspektion der Daten

Nachdem du die Daten für Amerika gelesen hast, benutze help(data_americas.head) und help(data_americas.tail), um herauszufinden, was DataFrame.head und DataFrame.tail tun.

  1. Welcher Methodenaufruf zeigt die ersten drei Zeilen dieser Daten an?
  2. Mit welchem Methodenaufruf werden die letzten drei Spalten dieser Daten angezeigt? (Hinweis: Möglicherweise müssen Sie Ihre Ansicht der Daten ändern.)
  1. Wir können uns die ersten fünf Zeilen von data_americas ansehen, indem wir data_americas.head() ausführen, wodurch wir den Anfang des DataFrame sehen können. Wir können die Anzahl der Zeilen angeben, die wir sehen wollen, indem wir den Parameter n in unserem Aufruf von data_americas.head() angeben. Um die ersten drei Zeilen zu sehen, führen Sie aus:

PYTHON

data_americas.head(n=3)

AUSGABE

          continent  gdpPercap_1952  gdpPercap_1957  gdpPercap_1962  \
country
Argentina  Americas     5911.315053     6856.856212     7133.166023
Bolivia    Americas     2677.326347     2127.686326     2180.972546
Brazil     Americas     2108.944355     2487.365989     3336.585802

          gdpPercap_1967  gdpPercap_1972  gdpPercap_1977  gdpPercap_1982  \
country
Argentina     8052.953021     9443.038526    10079.026740     8997.897412
Bolivia       2586.886053     2980.331339     3548.097832     3156.510452
Brazil        3429.864357     4985.711467     6660.118654     7030.835878

           gdpPercap_1987  gdpPercap_1992  gdpPercap_1997  gdpPercap_2002  \
country
Argentina     9139.671389     9308.418710    10967.281950     8797.640716
Bolivia       2753.691490     2961.699694     3326.143191     3413.262690
Brazil        7807.095818     6950.283021     7957.980824     8131.212843

           gdpPercap_2007
country
Argentina    12779.379640
Bolivia       3822.137084
Brazil        9065.800825
  1. Um die letzten drei Zeilen von data_americas zu überprüfen, würden wir den Befehl americas.tail(n=3) verwenden, analog zu head() wie oben. In diesem Fall wollen wir jedoch die letzten drei Spalten betrachten, also müssen wir unsere Ansicht ändern und dann tail() verwenden. Dazu erstellen wir einen neuen DataFrame, in dem Zeilen und Spalten vertauscht sind:

PYTHON

americas_flipped = data_americas.T

Wir können dann die letzten drei Spalten von americas betrachten, indem wir die letzten drei Zeilen von americas_flipped betrachten:

PYTHON

americas_flipped.tail(n=3)

AUSGABE

country        Argentina  Bolivia   Brazil   Canada    Chile Colombia  \
gdpPercap_1997   10967.3  3326.14  7957.98  28954.9  10118.1  6117.36
gdpPercap_2002   8797.64  3413.26  8131.21    33329  10778.8  5755.26
gdpPercap_2007   12779.4  3822.14   9065.8  36319.2  13171.6  7006.58

country        Costa Rica     Cuba Dominican Republic  Ecuador    ...     \
gdpPercap_1997    6677.05  5431.99             3614.1  7429.46    ...
gdpPercap_2002    7723.45  6340.65            4563.81  5773.04    ...
gdpPercap_2007    9645.06   8948.1            6025.37  6873.26    ...

country          Mexico Nicaragua   Panama Paraguay     Peru Puerto Rico  \
gdpPercap_1997   9767.3   2253.02  7113.69   4247.4  5838.35     16999.4
gdpPercap_2002  10742.4   2474.55  7356.03  3783.67  5909.02     18855.6
gdpPercap_2007  11977.6   2749.32  9809.19  4172.84  7408.91     19328.7

country        Trinidad and Tobago United States  Uruguay Venezuela
gdpPercap_1997             8792.57       35767.4  9230.24   10165.5
gdpPercap_2002             11460.6       39097.1     7727   8605.05
gdpPercap_2007             18008.5       42951.7  10611.5   11415.8

Dies zeigt die gewünschten Daten an, aber vielleicht möchten wir lieber drei Spalten statt drei Zeilen anzeigen lassen, also können wir es umdrehen:

PYTHON

americas_flipped.tail(n=3).T    

Anmerkung: Wir hätten die oben genannten Befehle auch in einer einzigen Codezeile ausführen können, indem wir sie “verkettet” hätten:

PYTHON

data_americas.T.tail(n=3).T
Aufgabe

Lesen von Dateien in anderen Verzeichnissen

Die Daten für Ihr aktuelles Projekt sind in einer Datei namens microbes.csv gespeichert, die sich in einem Ordner namens field_data befindet. Sie führen die Analyse in einem Notizbuch mit dem Namen analysis.ipynb in einem Schwesterordner namens thesis durch:

AUSGABE

your_home_directory
+-- field_data/
|   +-- microbes.csv
+-- thesis/
    +-- analysis.ipynb

Welche(r) Wert(e) sollte(n) man an read_csv übergeben, um microbes.csv in analysis.ipynb zu lesen?

Wir müssen den Pfad zu der Datei, die uns interessiert, in dem Aufruf von pd.read_csv angeben. Zunächst müssen wir mit “../” aus dem Ordner thesis und dann mit “field_data/” in den Ordner field_data “springen”. Dann können wir den Dateinamen microbes.csv angeben. Das Ergebnis ist wie folgt:

PYTHON

data_microbes = pd.read_csv('../field_data/microbes.csv')
Aufgabe

Daten schreiben

Neben der Funktion read_csv zum Lesen von Daten aus einer Datei, bietet Pandas eine Funktion to_csv zum Schreiben von DataFrame in Dateien. Wenden Sie an, was Sie über das Lesen von Dateien gelernt haben, und schreiben Sie einen Ihrer DataFrame in eine Datei namens processed.csv. Du kannst help benutzen, um Informationen darüber zu bekommen, wie man to_csv benutzt.

Um den DataFrame data_americas in eine Datei mit dem Namen processed.csv zu schreiben, führen Sie den folgenden Befehl aus:

PYTHON

data_americas.to_csv('processed.csv')

Um Hilfe zu read_csv oder to_csv zu erhalten, können Sie z.B. ausführen:

PYTHON

help(data_americas.to_csv)
help(pd.read_csv)

Beachten Sie, dass help(to_csv) oder help(pd.to_csv) einen Fehler auslöst! Das liegt daran, dass to_csv keine globale Pandas-Funktion ist, sondern eine Mitgliedsfunktion von DataFrames. Das bedeutet, dass man sie nur auf einer Instanz eines DataFrames aufrufen kann, z.B. data_americas.to_csv oder data_oceania.to_csv

Hauptpunkte
  • Verwenden Sie die Pandas-Bibliothek, um grundlegende Statistiken aus tabellarischen Daten zu erhalten.
  • Verwenden Sie index_col, um anzugeben, daß die Werte einer Spalte als Zeilenüberschriften verwendet werden sollen.
  • Verwenden Sie DataFrame.info, um mehr über einen DataFrame herauszufinden.
  • Die Variable DataFrame.columns speichert Informationen über die Spalten des DataFrames.
  • Verwenden Sie DataFrame.T, um einen DataFrame zu transponieren.
  • Verwenden Sie DataFrame.describe, um zusammenfassende Statistiken über Daten zu erhalten.

Content from Pandas DatenFrames


Zuletzt aktualisiert am 2025-10-31 | Diese Seite bearbeiten

Geschätzte Zeit: 30 Minuten

Übersicht

Fragen

  • Wie kann ich eine statistische Analyse von Tabellendaten durchführen?

Ziele

  • Wähle einzelne Werte aus einem Pandas-DataFrame aus.
  • Wähle ganze Zeilen oder ganze Spalten aus einem DataFrame aus.
  • Wählen Sie in einer einzigen Operation eine Teilmenge von Zeilen und Spalten aus einem DataFrame aus.
  • Wählen Sie eine Teilmenge eines DataFrames anhand eines einzigen booleschen Kriteriums aus.

Hinweis zu Pandas DataFrames/Series


Ein DataFrame ist eine Sammlung von Series; Der DataFrame ist die Art und Weise, wie Pandas eine Tabelle darstellt, und Series ist die Datenstruktur, die Pandas zur Darstellung einer Spalte verwendet.

Pandas baut auf der Numpy-Bibliothek auf, was in der Praxis bedeutet, dass die meisten der für Numpy-Arrays definierten Methoden auch für Pandas Series/DataFrames gelten.

Was Pandas so attraktiv macht, ist die leistungsfähige Schnittstelle für den Zugriff auf einzelne Datensätze der Tabelle, die korrekte Behandlung fehlender Werte und relationale Datenbankoperationen zwischen DataFrames.

Auswählen von Werten


Um auf einen Wert an der Position [i,j] eines DataFrame zuzugreifen, haben wir zwei Möglichkeiten, je nachdem, was die Bedeutung von i im Gebrauch ist. Erinnern Sie sich daran, dass ein DataFrame einen Index zur Verfügung stellt, um die Zeilen der Tabelle zu identifizieren; eine Zeile hat also sowohl eine Position innerhalb der Tabelle als auch ein Label, das ihren Eintrag im DataFrame eindeutig identifiziert.

Verwenden Sie DataFrame.iloc[..., ...], um Werte nach ihrer (Eingangs-)Position auszuwählen


  • Kann die Position durch einen numerischen Index angeben, analog zur 2D-Version der Zeichenauswahl in Zeichenketten.

PYTHON

import pandas as pd
data = pd.read_csv('data/gapminder_gdp_europe.csv', index_col='country')
print(data.iloc[0, 0])

AUSGABE

1601.056136

Benutzen Sie DataFrame.loc[..., ...], um Werte nach ihrer (Eintrags-)Bezeichnung auszuwählen.


  • Kann den Ort durch Zeilen- und/oder Spaltennamen angeben.

PYTHON

print(data.loc["Albania", "gdpPercap_1952"])

AUSGABE

1601.056136

Verwenden Sie : allein, um alle Spalten oder alle Zeilen zu meinen.


  • Genau wie die übliche Python-Slicing-Notation.

PYTHON

print(data.loc["Albania", :])

AUSGABE

gdpPercap_1952    1601.056136
gdpPercap_1957    1942.284244
gdpPercap_1962    2312.888958
gdpPercap_1967    2760.196931
gdpPercap_1972    3313.422188
gdpPercap_1977    3533.003910
gdpPercap_1982    3630.880722
gdpPercap_1987    3738.932735
gdpPercap_1992    2497.437901
gdpPercap_1997    3193.054604
gdpPercap_2002    4604.211737
gdpPercap_2007    5937.029526
Name: Albania, dtype: float64
  • Würde das gleiche Ergebnis liefern, wenn man data.loc["Albania"] (ohne zweiten Index) ausgibt.

PYTHON

print(data.loc[:, "gdpPercap_1952"])

AUSGABE

country
Albania                    1601.056136
Austria                    6137.076492
Belgium                    8343.105127
⋮ ⋮ ⋮
Switzerland               14734.232750
Turkey                     1969.100980
United Kingdom             9979.508487
Name: gdpPercap_1952, dtype: float64
  • Würde das gleiche Ergebnis erhalten, wenn man data["gdpPercap_1952"] ausgibt
  • Das gleiche Ergebnis erhält man auch, wenn man data.gdpPercap_1952 ausdruckt (nicht empfohlen, da leicht mit der Notation . für Methoden zu verwechseln)

Wählen Sie mehrere Spalten oder Zeilen mit DataFrame.loc und einem benannten Slice.


PYTHON

print(data.loc['Italy':'Poland', 'gdpPercap_1962':'gdpPercap_1972'])

AUSGABE

             gdpPercap_1962  gdpPercap_1967  gdpPercap_1972
country
Italy           8243.582340    10022.401310    12269.273780
Montenegro      4649.593785     5907.850937     7778.414017
Netherlands    12790.849560    15363.251360    18794.745670
Norway         13450.401510    16361.876470    18965.055510
Poland          5338.752143     6557.152776     8006.506993

Im obigen Code stellen wir fest, dass Slicing unter Verwendung von loc an beiden Enden inklusiv ist, was sich von Slicing unter Verwendung von iloc unterscheidet, bei dem Slicing alles bis zum letzten Index, aber nicht einschließlich, anzeigt.

Das Ergebnis der Zerlegung kann in weiteren Operationen verwendet werden.


  • Normalerweise druckt man nicht nur einen Ausschnitt.
  • Alle statistischen Operatoren, die auf ganze DataFrame angewendet werden, funktionieren auf die gleiche Weise auf Slices.
  • Berechne z.B. den Maximalwert eines Slice.

PYTHON

print(data.loc['Italy':'Poland', 'gdpPercap_1962':'gdpPercap_1972'].max())

AUSGABE

gdpPercap_1962    13450.40151
gdpPercap_1967    16361.87647
gdpPercap_1972    18965.05551
dtype: float64

PYTHON

print(data.loc['Italy':'Poland', 'gdpPercap_1962':'gdpPercap_1972'].min())

AUSGABE

gdpPercap_1962    4649.593785
gdpPercap_1967    5907.850937
gdpPercap_1972    7778.414017
dtype: float64

Verwende Vergleiche, um Daten nach ihrem Wert auszuwählen.


  • Der Vergleich wird Element für Element durchgeführt.
  • Gibt einen ähnlich geformten DataFrame von True und False zurück.

PYTHON

# Use a subset of data to keep output readable.
subset = data.loc['Italy':'Poland', 'gdpPercap_1962':'gdpPercap_1972']
print('Subset of data:\n', subset)

# Which values were greater than 10000 ?
print('\nWhere are values large?\n', subset > 10000)

AUSGABE

Subset of data:
             gdpPercap_1962  gdpPercap_1967  gdpPercap_1972
country
Italy           8243.582340    10022.401310    12269.273780
Montenegro      4649.593785     5907.850937     7778.414017
Netherlands    12790.849560    15363.251360    18794.745670
Norway         13450.401510    16361.876470    18965.055510
Poland          5338.752143     6557.152776     8006.506993

Where are values large?
            gdpPercap_1962 gdpPercap_1967 gdpPercap_1972
country
Italy                False           True           True
Montenegro           False          False          False
Netherlands           True           True           True
Norway                True           True           True
Poland               False          False          False

Wähle Werte oder NaN mit einer booleschen Maske.


  • Ein Rahmen voller Boolescher Operatoren wird manchmal als Maske bezeichnet, weil er so verwendet werden kann.

PYTHON

mask = subset > 10000
print(subset[mask])

AUSGABE

             gdpPercap_1962  gdpPercap_1967  gdpPercap_1972
country
Italy                   NaN     10022.40131     12269.27378
Montenegro              NaN             NaN             NaN
Netherlands     12790.84956     15363.25136     18794.74567
Norway          13450.40151     16361.87647     18965.05551
Poland                  NaN             NaN             NaN
  • Ermittelt den Wert, wenn die Maske wahr ist, und NaN (Not a Number), wenn sie falsch ist.
  • Nützlich, weil NaNs von Operationen wie max, min, Durchschnitt usw. ignoriert werden.

PYTHON

print(subset[subset > 10000].describe())

AUSGABE

       gdpPercap_1962  gdpPercap_1967  gdpPercap_1972
count        2.000000        3.000000        3.000000
mean     13120.625535    13915.843047    16676.358320
std        466.373656     3408.589070     3817.597015
min      12790.849560    10022.401310    12269.273780
25%      12955.737547    12692.826335    15532.009725
50%      13120.625535    15363.251360    18794.745670
75%      13285.513523    15862.563915    18879.900590
max      13450.401510    16361.876470    18965.055510

Gruppieren nach: split-apply-combine


Die Lernenden tun sich hier oft schwer, da viele nicht mit Finanzdaten und -konzepten arbeiten und daher Schwierigkeiten haben, die Beispielkonzepte zu verstehen. Das größte Problem ist jedoch die Zeile, die den wealth_score generiert, dieser Schritt muss gründlich besprochen werden: * Es wird eine implizite Konvertierung zwischen booleschen Werten und Fließkommazahlen verwendet, die im Kurs bisher noch nicht behandelt wurde. * Das Argument Achse=1 muss deutlich erklärt werden.

Pandas Vektorisierungsmethoden und Gruppierungsoperationen sind Funktionen, die Benutzern viel Flexibilität bei der Analyse ihrer Daten bieten.

Nehmen wir zum Beispiel an, dass wir einen besseren Überblick darüber haben wollen, wie sich die europäischen Länder nach ihrem BIP aufteilen.

  1. Wir können uns einen Überblick verschaffen, indem wir die Länder in den untersuchten Jahren in zwei Gruppen aufteilen: diejenigen, die ein BIP höher als der europäische Durchschnitt aufweisen, und diejenigen mit einem niedrigeren BIP.
  2. Wir schätzen dann einen Wohlstandsscore auf der Grundlage der historischen Werte (von 1962 bis 2007), wobei wir berücksichtigen, wie oft ein Land an den Gruppen mit geringerem oder höherem BIP teilgenommen hat

PYTHON

mask_higher = data > data.mean()
wealth_score = mask_higher.aggregate('sum', axis=1) / len(data.columns)
print(wealth_score)

AUSGABE

country
Albania                   0.000000
Austria                   1.000000
Belgium                   1.000000
Bosnia and Herzegovina    0.000000
Bulgaria                  0.000000
Croatia                   0.000000
Czech Republic            0.500000
Denmark                   1.000000
Finland                   1.000000
France                    1.000000
Germany                   1.000000
Greece                    0.333333
Hungary                   0.000000
Iceland                   1.000000
Ireland                   0.333333
Italy                     0.500000
Montenegro                0.000000
Netherlands               1.000000
Norway                    1.000000
Poland                    0.000000
Portugal                  0.000000
Romania                   0.000000
Serbia                    0.000000
Slovak Republic           0.000000
Slovenia                  0.333333
Spain                     0.333333
Sweden                    1.000000
Switzerland               1.000000
Turkey                    0.000000
United Kingdom            1.000000
dtype: float64

Schließlich wird für jede Gruppe in der Tabelle wealth_score ihr (finanzieller) Beitrag über die untersuchten Jahre mit Hilfe verketteter Methoden summiert:

PYTHON

print(data.groupby(wealth_score).sum())

AUSGABE

          gdpPercap_1952  gdpPercap_1957  gdpPercap_1962  gdpPercap_1967  \
0.000000    36916.854200    46110.918793    56850.065437    71324.848786
0.333333    16790.046878    20942.456800    25744.935321    33567.667670
0.500000    11807.544405    14505.000150    18380.449470    21421.846200
1.000000   104317.277560   127332.008735   149989.154201   178000.350040

          gdpPercap_1972  gdpPercap_1977  gdpPercap_1982  gdpPercap_1987  \
0.000000    88569.346898   104459.358438   113553.768507   119649.599409
0.333333    45277.839976    53860.456750    59679.634020    64436.912960
0.500000    25377.727380    29056.145370    31914.712050    35517.678220
1.000000   215162.343140   241143.412730   263388.781960   296825.131210

          gdpPercap_1992  gdpPercap_1997  gdpPercap_2002  gdpPercap_2007
0.000000    92380.047256   103772.937598   118590.929863   149577.357928
0.333333    67918.093220    80876.051580   102086.795210   122803.729520
0.500000    36310.666080    40723.538700    45564.308390    51403.028210
1.000000   315238.235970   346930.926170   385109.939210   427850.333420
Aufgabe

Auswahl der einzelnen Werte

Angenommen, Pandas wurde in Ihr Notebook importiert und die Gapminder-BIP-Daten für Europa wurden geladen:

PYTHON

import pandas as pd

data_europe = pd.read_csv('data/gapminder_gdp_europe.csv', index_col='country')

Schreiben Sie einen Ausdruck, um das Pro-Kopf-BIP von Serbien im Jahr 2007 zu ermitteln.

Die Auswahl kann mit Hilfe der Beschriftungen sowohl der Zeile (“Serbien”) als auch der Spalte (“gdpPercap_2007”) vorgenommen werden:

PYTHON

print(data_europe.loc['Serbia', 'gdpPercap_2007'])

Die Ausgabe ist

AUSGABE

9786.534714
Aufgabe

Ausmaß des Slicings

  1. Ergeben die beiden folgenden Anweisungen die gleiche Ausgabe?
  2. Welche Regel bestimmt, was in numerischen Slices und benannten Slices in Pandas enthalten ist (oder nicht)?

PYTHON

print(data_europe.iloc[0:2, 0:2])
print(data_europe.loc['Albania':'Belgium', 'gdpPercap_1952':'gdpPercap_1962'])

Nein, sie erzeugen nicht die gleiche Ausgabe! Die Ausgabe der ersten Anweisung ist:

AUSGABE

        gdpPercap_1952  gdpPercap_1957
country
Albania     1601.056136     1942.284244
Austria     6137.076492     8842.598030

Die zweite Anweisung ergibt:

AUSGABE

        gdpPercap_1952  gdpPercap_1957  gdpPercap_1962
country
Albania     1601.056136     1942.284244     2312.888958
Austria     6137.076492     8842.598030    10750.721110
Belgium     8343.105127     9714.960623    10991.206760

Es ist offensichtlich, dass die zweite Anweisung eine zusätzliche Spalte und eine zusätzliche Zeile im Vergleich zur ersten Anweisung erzeugt.
Welche Schlussfolgerung können wir ziehen? Wir sehen, dass ein numerisches Slice, 0:2, den letzten Index (d. h. Index 2) in dem angegebenen Bereich ausschließt, während ein benanntes Slice, ‘gdpPercap_1952’:‘gdpPercap_1962’, das letzte Element einschließt.

Aufgabe

Daten rekonstruieren

Erkläre, was jede Zeile in dem folgenden kurzen Programm macht: was steht in first, second, usw.?

PYTHON

first = pd.read_csv('data/gapminder_all.csv', index_col='country')
second = first[first['continent'] == 'Americas']
third = second.drop('Puerto Rico')
fourth = third.drop('continent', axis = 1)
fourth.to_csv('result.csv')

Gehen wir diesen Teil des Codes Zeile für Zeile durch.

PYTHON

first = pd.read_csv('data/gapminder_all.csv', index_col='country')

Diese Zeile lädt den Datensatz mit den BIP-Daten aller Länder in einen DataFrame mit der Bezeichnung first. Der Parameter index_col='country' wählt aus, welche Spalte als Zeilenbeschriftung im DataFrame verwendet werden soll.

PYTHON

second = first[first['continent'] == 'Americas']

In dieser Zeile wird eine Auswahl getroffen: Es werden nur die Zeilen von first extrahiert, bei denen die Spalte “continent” mit “Americas” übereinstimmt. Beachten Sie, dass der boolesche Ausdruck in den eckigen Klammern, first['continent'] == 'Americas', verwendet wird, um nur die Zeilen auszuwählen, in denen der Ausdruck wahr ist. Versuchen Sie, diesen Ausdruck zu drucken! Können Sie auch die einzelnen Wahr/Falsch-Elemente ausdrucken? (Hinweis: Weisen Sie den Ausdruck zunächst einer Variablen zu)

PYTHON

third = second.drop('Puerto Rico')

Wie die Syntax vermuten lässt, wird in dieser Zeile die Zeile von second mit der Bezeichnung “Puerto Rico” gelöscht. Der resultierende DataFrame third hat eine Zeile weniger als der ursprüngliche DataFrame second.

PYTHON

fourth = third.drop('continent', axis = 1)

Auch hier wenden wir die Drop-Funktion an, aber in diesem Fall lassen wir nicht eine Zeile, sondern eine ganze Spalte fallen. Um dies zu erreichen, müssen wir auch den Parameter axis angeben (wir wollen die zweite Spalte mit dem Index 1 löschen).

PYTHON

fourth.to_csv('result.csv')

Der letzte Schritt besteht darin, die Daten, an denen wir gearbeitet haben, in eine csv-Datei zu schreiben. Pandas macht dies mit der Funktion to_csv() einfach. Das einzige erforderliche Argument für die Funktion ist der Dateiname. Beachten Sie, dass die Datei in das Verzeichnis geschrieben wird, von dem aus Sie die Jupyter- oder Python-Sitzung gestartet haben.

Aufgabe

Auswahl der Indizes

Erklären Sie in einfachen Worten, was idxmin und idxmax in dem folgenden kurzen Programm tun. Wann würden Sie diese Methoden verwenden?

PYTHON

data = pd.read_csv('data/gapminder_gdp_europe.csv', index_col='country')
print(data.idxmin())
print(data.idxmax())

Für jede Spalte in data gibt idxmin den Indexwert zurück, der dem Minimum jeder Spalte entspricht; idxmax tut das Gleiche für den Maximalwert jeder Spalte.

Sie können diese Funktionen immer dann verwenden, wenn Sie den Zeilenindex des Minimal-/Maximalwerts und nicht den tatsächlichen Minimal-/Maximalwert erhalten möchten.

Aufgabe

Übung mit der Auswahl

Angenommen, Pandas wurde importiert und die Gapminder-BIP-Daten für Europa wurden geladen. Schreiben Sie einen Ausdruck, um jedes der folgenden Elemente auszuwählen:

  1. Pro-Kopf-BIP für alle Länder im Jahr 1982.
  2. BIP pro Kopf für Dänemark für alle Jahre.
  3. BIP pro Kopf für alle Länder für die Jahre nach 1985.
  4. Das Pro-Kopf-BIP für jedes Land im Jahr 2007 als Vielfaches des Pro-Kopf-BIP für dieses Land im Jahr 1952.

1:

PYTHON

data['gdpPercap_1982']

2:

PYTHON

data.loc['Denmark',:]

3:

PYTHON

data.loc[:,'gdpPercap_1985':]

Pandas ist intelligent genug, um die Zahl am Ende der Spaltenbezeichnung zu erkennen und gibt keinen Fehler aus, obwohl keine Spalte mit dem Namen gdpPercap_1985 existiert. Dies ist nützlich, wenn der CSV-Datei später neue Spalten hinzugefügt werden.

4:

PYTHON

data['gdpPercap_2007']/data['gdpPercap_1952']
Aufgabe

Viele Möglichkeiten des Zugriffs

Es gibt mindestens zwei Möglichkeiten, auf einen Wert oder ein Slice eines DataFrame zuzugreifen: über den Namen oder den Index. Es gibt jedoch noch viele andere. Zum Beispiel kann auf eine einzelne Spalte oder Zeile entweder als DataFrame oder als Series Objekt zugegriffen werden.

Schlagen Sie verschiedene Möglichkeiten vor, die folgenden Operationen mit einem DataFrame durchzuführen:

  1. Zugriff auf eine einzelne Spalte
  2. Zugriff auf eine einzelne Zeile
  3. Zugriff auf ein einzelnes DataFrame-Element
  4. Zugriff auf mehrere Spalten
  5. Zugriff auf mehrere Zeilen
  6. Zugriff auf eine Teilmenge von bestimmten Zeilen und Spalten
  7. Zugriff auf eine Teilmenge von Zeilen- und Spaltenbereichen

1. Zugriff auf eine einzelne Spalte:

PYTHON

# by name
data["col_name"]   # as a Series
data[["col_name"]] # as a DataFrame

# by name using .loc
data.T.loc["col_name"]  # as a Series
data.T.loc[["col_name"]].T  # as a DataFrame

# Dot notation (Series)
data.col_name

# by index (iloc)
data.iloc[:, col_index]   # as a Series
data.iloc[:, [col_index]] # as a DataFrame

# using a mask
data.T[data.T.index == "col_name"].T

2. Zugriff auf eine einzelne Zeile:

PYTHON

# by name using .loc
data.loc["row_name"] # as a Series
data.loc[["row_name"]] # as a DataFrame

# by name
data.T["row_name"] # as a Series
data.T[["row_name"]].T # as a DataFrame

# by index
data.iloc[row_index]   # as a Series
data.iloc[[row_index]]   # as a DataFrame

# using mask
data[data.index == "row_name"]

3. Greife auf ein einzelnes DataFrame-Element zu:

PYTHON

# by column/row names
data["column_name"]["row_name"]         # als Series

data[["col_name"]].loc["row_name"]  # als Series
data[["col_name"]].loc[["row_name"]]  # als DataFrame

data.loc["row_name"]["col_name"]  # als Wert
data.loc[["row_name"]]["col_name"]  # als Series
data.loc[["row_name"]][["col_name"]]  # als DataFrame

data.loc["row_name", "col_name"]  # als Wert
data.loc[["row_name"], "col_name"]  #  Series. Behält den Index bei. Der Spaltenname wird nach `.name` verschoben.
data.loc["row_name", ["col_name"]]  # als Series. Der Index wird nach „.name.“ verschoben. Setzt den Index auf den Spaltennamen.
data.loc[["row_name"], ["col_name"]]  # als DataFrame (behält den ursprünglichen Index und Spaltennamen bei)

# by column/row names: Dot notation
data.col_name.row_name

# by column/row indices
data.iloc[row_index, col_index] # als Wert
data.iloc[[row_index], col_index] # #  Series. Behält den Index bei. Der Spaltenname wird nach `.name` verschoben.
data.iloc[row_index, [col_index]] # als Series. Der Index wird nach „.name.“ verschoben. Setzt den Index auf den Spaltennamen.
data.iloc[[row_index], [col_index]] #  # als DataFrame (behält den ursprünglichen Index und Spaltennamen bei)

# column name + row index
data["col_name"][row_index]
data.col_name[row_index]
data["col_name"].iloc[row_index]

# column index + row name
data.iloc[:, [col_index]].loc["row_name"]  # alsSeries
data.iloc[:, [col_index]].loc[["row_name"]]  # als DataFrame

# using masks
data[data.index == "row_name"].T[data.T.index == "col_name"].T

4. Zugriff auf mehrere Spalten:

PYTHON

# by name
data[["col1", "col2", "col3"]]
data.loc[:, ["col1", "col2", "col3"]]

# by index
data.iloc[:, [col1_index, col2_index, col3_index]]

5. Zugriff auf mehrere Zeilen

PYTHON

# by name
data.loc[["row1", "row2", "row3"]]

# by index
data.iloc[[row1_index, row2_index, row3_index]]

6. Zugriff auf eine Teilmenge von bestimmten Zeilen und Spalten

PYTHON

# by names
data.loc[["row1", "row2", "row3"], ["col1", "col2", "col3"]]

# by indices
data.iloc[[row1_index, row2_index, row3_index], [col1_index, col2_index, col3_index]]

# column names + row indices
data[["col1", "col2", "col3"]].iloc[[row1_index, row2_index, row3_index]]

# column indices + row names
data.iloc[:, [col1_index, col2_index, col3_index]].loc[["row1", "row2", "row3"]]

7. Zugriff auf eine Teilmenge von Zeilen- und Spaltenbereichen

PYTHON

# nach Namen
data.loc["row1":"row2", "col1":"col2"]

# nach index
data.iloc[row1_index:row2_index, col1_index:col2_index]

# column names + row indices
data.loc[:, "col1_name":"col2_name"].iloc[row1_index:row2_index]

# column indices + row names
data.iloc[:, col1_index:col2_index].loc["row1":"row2"]
Aufgabe

Untersuchung der verfügbaren Methoden mit der Funktion dir()

Python enthält eine Funktion dir(), mit der man alle verfügbaren Methoden (Funktionen) anzeigen kann, die in ein Datenobjekt eingebaut sind. In Episode 4 haben wir einige Methoden mit einer Zeichenkette verwendet. Aber wir können sehen, dass noch viel mehr verfügbar sind, wenn wir dir() benutzen:

PYTHON

my_string = 'Hello world!'   # Erstellen eines String-Objekts
dir(my_string)

Dieser Befehl gibt zurück:

PYTHON

['__add__',
...
'__subclasshook__',
'capitalize',
'casefold',
'center',
...
'upper',
'zfill']

Sie können help() oder Shift+Tab verwenden, um mehr Informationen darüber zu erhalten, was diese Methoden tun.

Angenommen, Pandas wurde importiert und die Gapminder-BIP-Daten für Europa wurden als data geladen. Verwenden Sie dann dir(), um die Funktion zu finden, die den Median des Pro-Kopf-BIP aller europäischen Länder für jedes Jahr, für das Informationen verfügbar sind, ausgibt.

Unter vielen Auswahlmöglichkeiten wird in dir() die Funktion median() als Möglichkeit aufgeführt. Also,

PYTHON

data.median()
Diskussion

Interpretation

Die Grenzen Polens sind seit 1945 stabil, haben sich aber in den Jahren davor mehrmals geändert. Wie würden Sie dies handhaben, wenn Sie eine Tabelle des Pro-Kopf-BIP für Polen für das gesamte zwanzigste Jahrhundert erstellen würden?

Hauptpunkte
  • Benutze DataFrame.iloc[..., ...], um Werte nach ganzzahliger Position auszuwählen.
  • Benutze : allein, um alle Spalten oder alle Zeilen zu meinen.
  • Wähle mehrere Spalten oder Zeilen mit DataFrame.loc und einem benannten Slice.
  • Das Ergebnis der Zerlegung kann in weiteren Operationen verwendet werden.
  • Verwende Vergleiche, um Daten nach ihrem Wert auszuwählen.
  • Wähle Werte oder NaN mit Hilfe einer booleschen Maske.

Content from Plotten


Zuletzt aktualisiert am 2025-10-31 | Diese Seite bearbeiten

Geschätzte Zeit: 30 Minuten

Übersicht

Fragen

  • Wie kann ich meine Daten darstellen?
  • Wie kann ich meinen Plot für die Veröffentlichung speichern?

Ziele

  • Erstellt ein Zeitseriendiagramm mit einem einzelnen Datensatz.
  • Erstellt ein Streudiagramm, das die Beziehung zwischen zwei Datensätzen zeigt.

matplotlib ist die am weitesten verbreitete wissenschaftliche Plotting-Bibliothek in Python.


  • Üblicherweise wird eine Unterbibliothek namens matplotlib.pyplot verwendet.
  • Das Jupyter Notebook rendert Plots standardmäßig inline.

PYTHON

import matplotlib.pyplot as plt
  • Einfache Diagramme sind dann (relativ) einfach zu erstellen.

PYTHON

time = [0, 1, 2, 3]
position = [0, 100, 200, 300]

plt.plot(time, position)
plt.xlabel('Time (hr)')
plt.ylabel('Position (km)')
Ein Liniendiagramm, das die Zeit (Std.) relativ zur Position (km) anzeigt, unter Verwendung der im obigen Codeblock angegebenen Werte. Standardmäßig ist die gezeichnete Linie blau vor weißem Hintergrund, und die Achsen wurden automatisch skaliert, um sie an den Bereich der Eingabedaten anzupassen.
Wichtig

Alle offenen Abbildungen anzeigen

In unserem Jupyter-Notebook-Beispiel sollte das Ausführen der Zelle die Abbildung direkt unterhalb des Codes erzeugen. Die Abbildung wird auch in das Notebook-Dokument aufgenommen und kann später betrachtet werden. Andere Python-Umgebungen wie eine interaktive Python-Sitzung, die von einem Terminal aus gestartet wird, oder ein Python-Skript, das über die Kommandozeile ausgeführt wird, erfordern jedoch einen zusätzlichen Befehl, um die Abbildung anzuzeigen.

Weist matplotlib an, eine Abbildung darzustellen:

PYTHON

plt.show()

Dieser Befehl kann auch innerhalb eines Notizbuchs verwendet werden - zum Beispiel, um mehrere Zahlen anzuzeigen, wenn mehrere von einer einzigen Zelle erstellt wurden.

Plotten von Daten direkt aus einem Pandas dataframe.


  • Wir können auch Pandas dataframes plotten.
  • Vor dem Plotten konvertieren wir die Spaltenüberschriften von einem string-Datentyp in integer, da sie numerische Werte darstellen, indem wir str.replace() verwenden, um das Präfix gpdPercap_ zu entfernen, und dann astype(int), um die Reihe von String-Werten (['1952', '1957', ..., '2007']) in eine Reihe von Ganzzahlen zu konvertieren: [1925, 1957, ..., 2007].

PYTHON

import pandas as pd

data = pd.read_csv('data/gapminder_gdp_oceania.csv', index_col='country')

# Extract year from last 4 characters of each column name
# The current column names are structured as 'gdpPercap_(year)', 
# so we want to keep the (year) part only for clarity when plotting GDP vs. years
# To do this we use replace(), which removes from the string the characters stated in the argument
# This method works on strings, so we use replace() from Pandas Series.str vectorized string functions

years = data.columns.str.replace('gdpPercap_', '')

# Convert year values to integers, saving results back to dataframe

data.columns = years.astype(int)

data.loc['Australia'].plot()
BIP-Darstellung für Australien

Wählen Sie Daten aus, transformieren Sie sie und stellen Sie sie dann dar.


  • Standardmäßig zeichnet DataFrame.plot mit den Zeilen als X-Achse.
  • Wir können die Daten transponieren, um mehrere Reihen zu zeichnen.

PYTHON

data.T.plot()
plt.ylabel('GDP per capita')
BIP-Darstellung für Australien und Neuseeland

Es stehen viele Darstellungsarten zur Verfügung.


  • Erstellen Sie z. B. ein Balkendiagramm mit einem ausgefeilteren Stil.

PYTHON

plt.style.use('ggplot')
data.T.plot(kind='bar')
plt.ylabel('GDP per capita')
BIP-Balkenplot für Australien

Daten können auch durch direkten Aufruf der Funktion matplotlib plot geplottet werden.


  • Der Befehl lautet plt.plot(x, y)
  • Die Farbe und das Format der Marker können auch als zusätzliches optionales Argument angegeben werden, z.B. b- ist eine blaue Linie, g-- ist eine grüne gestrichelte Linie.

Holt Australien-Daten aus dem Datenrahmen


PYTHON

years = data.columns
gdp_australia = data.loc['Australia']

plt.plot(years, gdp_australia, 'g--')
BIP-formatierte Darstellung für Australien

Kann viele Datensätze zusammen darstellen.


PYTHON

# Select two countries' worth of data.
gdp_australia = data.loc['Australia']
gdp_nz = data.loc['New Zealand']

# Plot with differently-colored markers.
plt.plot(years, gdp_australia, 'b-', label='Australia')
plt.plot(years, gdp_nz, 'g-', label='New Zealand')

# Create legend.
plt.legend(loc='upper left')
plt.xlabel('Year')
plt.ylabel('GDP per capita ($)')
Wichtig

Hinzufügen einer Legende

Beim Plotten mehrerer Datensätze auf derselben Abbildung ist es oft wünschenswert, eine Legende zur Beschreibung der Daten zu haben.

Dies kann in matplotlib in zwei Stufen erfolgen:

  • Geben Sie eine Beschriftung für jeden Datensatz in der Abbildung an:

PYTHON

plt.plot(years, gdp_australia, label='Australia')
plt.plot(years, gdp_nz, label='New Zealand')
  • Weist matplotlib an, die Legende zu erstellen.

PYTHON

plt.legend()

Standardmäßig versucht matplotlib, die Legende an einer geeigneten Stelle zu platzieren. Wenn Sie lieber eine Position angeben möchten, können Sie dies mit dem Argument loc= tun, z.B. um die Legende in der oberen linken Ecke des Plots zu platzieren, geben Sie loc='upper left' an

BIP-formatierte Darstellung für Australien und Neuseeland
  • Plotten eines Streudiagramms, das das BIP von Australien und Neuseeland in Beziehung setzt
  • Verwenden Sie entweder plt.scatter oder DataFrame.plot.scatter

PYTHON

plt.scatter(gdp_australia, gdp_nz)
BIP-Korrelation mit plt.scatter

PYTHON

data.T.plot.scatter(x = 'Australia', y = 'New Zealand')
BIP-Korrelation mit data.T.plot.scatter
Aufgabe

Minima und Maxima

Füllen Sie die folgenden Felder aus, um das minimale Pro-Kopf-BIP aller europäischen Länder im Zeitverlauf darzustellen. Ändern Sie das Diagramm erneut, um das maximale Pro-Kopf-BIP für Europa im Zeitverlauf darzustellen.

PYTHON

data_europe = pd.read_csv('data/gapminder_gdp_europe.csv', index_col='country')
data_europe.____.plot(label='min')
data_europe.____
plt.legend(loc='best')
plt.xticks(rotation=90)

PYTHON

data_europe = pd.read_csv('data/gapminder_gdp_europe.csv', index_col='country')
data_europe.min().plot(label='min')
data_europe.max().plot(label='max')
plt.legend(loc='best')
plt.xticks(rotation=90)
Minima Maxima Lösung
Aufgabe

Korrelationen

Ändern Sie das Beispiel in den Anmerkungen, um ein Streudiagramm zu erstellen, das die Beziehung zwischen dem minimalen und maximalen Pro-Kopf-BIP der asiatischen Länder für jedes Jahr im Datensatz zeigt. Welche Beziehung sehen Sie (wenn überhaupt)?

PYTHON

data_asia = pd.read_csv('data/gapminder_gdp_asia.csv', index_col='country')
data_asia.describe().T.plot(kind='scatter', x='min', y='max')
Korrelationen Lösung 1

Es sind keine besonderen Korrelationen zwischen den Mindest- und Höchstwerten des BIP von Jahr zu Jahr zu erkennen. Es scheint, als ob die Geschicke der asiatischen Länder nicht gemeinsam steigen und fallen.

Aufgabe

Korrelationen (continued)

Sie werden feststellen, dass die Variabilität des Maximums viel größer ist als die des Minimums. Schauen Sie sich die Indizes Maximum und Maximum an:

PYTHON

data_asia = pd.read_csv('data/gapminder_gdp_asia.csv', index_col='country')
data_asia.max().plot()
print(data_asia.idxmax())
print(data_asia.idxmin())
Korrelationen Lösung 2

Es scheint, dass die Schwankungen in diesem Wert auf einen starken Rückgang nach 1972 zurückzuführen sind. Vielleicht sind geopolitische Gründe im Spiel? Angesichts der Dominanz der Erdöl produzierenden Länder wäre vielleicht der Brent-Rohöl-Index ein interessanter Vergleich? Während Myanmar durchweg das niedrigste BIP aufweist, sind die Schwankungen bei der Nation mit dem höchsten BIP noch ausgeprägter.

Aufgabe

Weitere Korrelationen

Dieses kurze Programm erstellt ein Diagramm, das die Korrelation zwischen dem BIP und der Lebenserwartung für das Jahr 2007 zeigt, wobei die Markergröße durch die Bevölkerung normalisiert wird:

PYTHON

data_all = pd.read_csv('data/gapminder_all.csv', index_col='country')
data_all.plot(kind='scatter', x='gdpPercap_2007', y='lifeExp_2007',
              s=data_all['pop_2007']/1e6)

Erläutern Sie anhand der Online-Hilfe und anderer Quellen, was die einzelnen Argumente von plot bewirken.

More Correlations Solution

Eine gute Anlaufstelle ist die Dokumentation für die Plot-Funktion - help(data_all.plot).

kind - Wie bereits gesehen, bestimmt dies die Art der Darstellung, die gezeichnet werden soll.

x und y - Ein Spaltenname oder Index, der bestimmt, welche Daten auf der x- und y-Achse des Diagramms platziert werden sollen

s - Details dazu finden Sie in der Dokumentation von plt.scatter. Eine einzelne Zahl oder ein Wert für jeden Datenpunkt. Bestimmt die Größe der gezeichneten Punkte.

Wichtig

Speichern der Darstellung in einer Datei

Wenn Sie mit der Darstellung zufrieden sind, möchten Sie sie vielleicht in einer Datei speichern, um sie in eine Veröffentlichung aufzunehmen. Im Modul matplotlib.pyplot gibt es eine Funktion, mit der dies möglich ist: savefig. Der Aufruf dieser Funktion, z.B. mit

PYTHON

plt.savefig('my_figure.png')

speichert die aktuelle Abbildung in der Datei my_figure.png. Das Dateiformat wird automatisch aus der Dateinamenerweiterung abgeleitet (andere Formate sind pdf, ps, eps und svg).

Beachten Sie, dass die Funktionen in plt auf eine globale Abbildungvariable verweisen. Nachdem eine Abbildung auf dem Bildschirm angezeigt wurde (z.B. mit plt.show), wird matplotlib diese Variable auf eine neue leere Abbildung verweisen lassen. Stellen Sie daher sicher, dass Sie plt.savefig aufrufen, bevor der Plot auf dem Bildschirm angezeigt wird, sonst könnten Sie eine Datei mit einem leeren Plot vorfinden.

Bei der Verwendung von Datenrahmen werden die Daten oft in einer einzigen Zeile erzeugt und auf dem Bildschirm dargestellt. Zusätzlich zur Verwendung von plt.savefig können wir einen Verweis auf die aktuelle Abbildung in einer lokalen Variablen (mit plt.gcf) speichern und die Klassenmethode savefig von dieser Variablen aus aufrufen, um die Abbildung in einer Datei zu speichern.

PYTHON

data.plot(kind='bar')
fig = plt.gcf() # get current Abbildunge
fig.savefig('my_Abbildunge.png')
Wichtig

Zugänglich machen von Plots

Wenn Sie Diagramme für ein Papier oder eine Präsentation erstellen, gibt es ein paar Dinge, die Sie tun können, um sicherzustellen, dass jeder Ihre Diagramme verstehen kann.

  • Stellen Sie immer sicher, dass Ihr Text groß genug ist, um ihn zu lesen. Verwenden Sie den Parameter fontsize in xlabel, ylabel, title und legend, und tick_params mit labelsize, um die Textgröße der Zahlen auf Ihren Achsen zu erhöhen.
  • In ähnlicher Weise sollten Sie die Elemente Ihres Graphen gut sichtbar machen. Benutzen Sie s, um die Größe Ihrer Streudiagramm-Markierungen zu erhöhen und linewidth, um die Größe Ihrer Diagrammlinien zu erhöhen.
  • Die Verwendung von Farbe (und nichts anderem) zur Unterscheidung zwischen verschiedenen Plot-Elementen macht Ihre Plots unlesbar für jeden, der farbenblind ist oder zufällig einen Schwarz-Weiß-Bürodrucker hat. Für Linien können Sie mit dem Parameter linestyle verschiedene Linientypen verwenden. Bei Streudiagrammen können Sie mit marker die Form der Punkte ändern. Wenn Sie sich mit den Farben nicht sicher sind, können Sie Coblis oder Color Oracle verwenden, um zu simulieren, wie Ihre Diagramme für Menschen mit Farbenblindheit aussehen würden.
Hauptpunkte
  • matplotlib ist die am weitesten verbreitete wissenschaftliche Plotting-Bibliothek in Python.
  • Plotten von Daten direkt aus einem Pandas-Datenframe.
  • Wählen Sie Daten aus, transformieren Sie sie und stellen Sie sie dann dar.
  • Es stehen viele Darstellungsarten zur Verfügung: Weitere Optionen finden Sie in der Python Graph Gallery.
  • Kann viele Datensätze zusammen darstellen.

Content from Mittagessen


Zuletzt aktualisiert am 2025-03-02 | Diese Seite bearbeiten

Geschätzte Zeit: 0 Minuten

Denken Sie während des Mittagessens über die folgenden Punkte nach und diskutieren Sie sie:

  • Welche Art von Paketen könnten Sie in Python verwenden und warum würden Sie sie verwenden?
  • Wie müssten die Daten formatiert werden, um in Pandas Datenrahmen verwendet werden zu können? Würden die Daten, die Sie haben, diese Anforderungen erfüllen?
  • Auf welche Einschränkungen oder Probleme könntest du stoßen, wenn du darüber nachdenkst, wie du das Gelernte auf deine eigenen Projekte oder Daten anwenden kannst?

Content from Listen


Zuletzt aktualisiert am 2025-10-31 | Diese Seite bearbeiten

Geschätzte Zeit: 20 Minuten

Übersicht

Fragen

  • Wie kann ich mehrere Werte speichern?

Ziele

  • Erklären Sie, warum Programme Wertesammlungen benötigen.
  • Programme schreiben, die flache Listen erstellen, indizieren, zerschneiden und durch Zuweisungen und Methodenaufrufe modifizieren.

Eine Liste speichert viele Werte in einer einzigen Struktur.


  • Berechnungen mit hundert Variablen, die pressure_001, pressure_002, usw. heißen, wären mindestens so langsam wie die manuelle Berechnung.
  • Verwenden Sie eine Liste, um viele Werte zusammen zu speichern.
    • Enthält Werte innerhalb eckiger Klammern [...].
    • Werte sind durch Kommata , getrennt.
  • Verwenden Sie len, um herauszufinden, wie viele Werte in einer Liste sind.

PYTHON

pressures = [0.273, 0.275, 0.277, 0.275, 0.276]
print('pressures:', pressures)
print('length:', len(pressures))

AUSGABE

pressures: [0.273, 0.275, 0.277, 0.275, 0.276]
length: 5

Verwenden Sie den Index eines Elements, um es aus einer Liste zu holen.


  • Genau wie Zeichenketten.

PYTHON

print('zeroth item of pressures:', pressures[0])
print('fourth item of pressures:', pressures[4])

AUSGABE

zeroth item of pressures: 0.273
fourth item of pressures: 0.276

Die Werte von Listen können durch Zuweisungen ersetzt werden.


  • Verwenden Sie einen Indexausdruck auf der linken Seite der Zuweisung, um einen Wert zu ersetzen.

PYTHON

pressures[0] = 0.265
print('pressures is now:', pressures)

AUSGABE

pressures is now: [0.265, 0.275, 0.277, 0.275, 0.276]

Das Anhängen von Elementen an eine Liste verlängert diese.


  • Verwenden Sie list_name.append, um Elemente am Ende einer Liste hinzuzufügen.

PYTHON

primes = [2, 3, 5]
print('primes is initially:', primes)
primes.append(7)
print('primes has become:', primes)

AUSGABE

primes is initially: [2, 3, 5]
primes has become: [2, 3, 5, 7]
  • append ist eine Methode von Listen.
    • Wie eine Funktion, aber an ein bestimmtes Objekt gebunden.
  • Verwenden Sie object_name.method_name, um Methoden aufzurufen.
    • ähnelt absichtlich der Art und Weise, wie wir in einer Bibliothek auf Dinge verweisen.
  • Wir werden im weiteren Verlauf weitere Methoden für Listen kennenlernen.
    • Verwenden Sie help(list) für eine Vorschau.
  • extend ist ähnlich wie append, erlaubt es aber, zwei Listen zu kombinieren. Zum Beispiel:

PYTHON

teen_primes = [11, 13, 17, 19]
middle_aged_primes = [37, 41, 43, 47]
print('primes is currently:', primes)
primes.extend(teen_primes)
print('primes has now become:', primes)
primes.append(middle_aged_primes)
print('primes has finally become:', primes)

AUSGABE

primes is currently: [2, 3, 5, 7]
primes has now become: [2, 3, 5, 7, 11, 13, 17, 19]
primes has finally become: [2, 3, 5, 7, 11, 13, 17, 19, [37, 41, 43, 47]]

Beachten Sie, dass extend zwar die “flache” Struktur der Liste beibehält, aber das Anhängen einer Liste an eine Liste bedeutet, dass das letzte Element in primes selbst eine Liste und keine Ganzzahl ist. Listen können Werte beliebigen Typs enthalten; daher sind auch Listen von Listen möglich.

Verwenden Sie del, um Elemente aus einer Liste vollständig zu entfernen.


  • Wir verwenden del list_name[index], um ein Element aus einer Liste zu entfernen (im Beispiel ist 9 keine Primzahl) und sie damit zu kürzen.
  • del ist keine Funktion oder Methode, sondern eine Anweisung in der Sprache.

PYTHON

primes = [2, 3, 5, 7, 9]
print('primes before removing last item:', primes)
del primes[4]
print('primes after removing last item:', primes)

AUSGABE

primes before removing last item: [2, 3, 5, 7, 9]
primes after removing last item: [2, 3, 5, 7]

Die leere Liste enthält keine Werte.


  • Verwenden Sie [] allein, um eine Liste darzustellen, die keine Werte enthält.
    • “Die Null der Listen.”
  • Hilfreich als Ausgangspunkt für die Sammlung von Werten (die wir in der nächsten Folge sehen werden).

Listen können Werte unterschiedlichen Typs enthalten.


  • Eine einzelne Liste kann Zahlen, Zeichenketten und alles andere enthalten.

PYTHON

goals = [1, 'Create lists.', 2, 'Extract items from lists.', 3, 'Modify lists.']

Zeichenketten können wie Listen indiziert werden.


  • Abrufen einzelner Zeichen aus einer Zeichenkette unter Verwendung von Indizes in eckigen Klammern.

PYTHON

element = 'carbon'
print('zeroth character:', element[0])
print('third character:', element[3])

AUSGABE

zeroth character: c
third character: b

Zeichenketten sind unveränderlich.


  • Die Zeichen in einer Zeichenkette können nicht geändert werden, nachdem sie erstellt wurde.
    • Immutable (unveränderlich): kann nach der Erstellung nicht mehr geändert werden.
    • Im Gegensatz dazu sind Listen veränderlich: Sie können an Ort und Stelle geändert werden.
  • Python betrachtet die Zeichenkette als einen einzelnen Wert mit Teilen, nicht als eine Sammlung von Werten.

PYTHON

element[0] = 'C'

FEHLER

TypeError: 'str' object does not support item assignment
  • Listen und Zeichenketten sind beides Sammlungen.

Eine Indizierung über das Ende der Auflistung hinaus ist ein Fehler.


  • Python meldet einen IndexError, wenn wir versuchen, auf einen Wert zuzugreifen, der nicht existiert.
    • Dies ist eine Art von Laufzeitfehler.
    • Kann beim Parsen des Codes nicht erkannt werden, da der Index möglicherweise anhand von Daten berechnet wird.

PYTHON

print('99th element of element is:', element[99])

AUSGABE

IndexError: string index out of range
Aufgabe

Füllen Sie die Lücken aus

Füllen Sie die Leerzeichen aus, so dass das folgende Programm die gezeigte Ausgabe erzeugt.

PYTHON

values = ____
values.____(1)
values.____(3)
values.____(5)
print('first time:', values)
values = values[____]
print('second time:', values)

AUSGABE

first time: [1, 3, 5]
second time: [3, 5]

PYTHON

values = []
values.append(1)
values.append(3)
values.append(5)
print('first time:', values)
values = values[1:]
print('second time:', values)
Aufgabe

Wie groß ist ein Slice?

Wenn start und stop beide nicht-negative ganze Zahlen sind, wie lang ist die Liste values[start:stop]?

Die Liste values[start:stop] hat bis zu stop - start Elemente. Zum Beispiel hat values[1:4] die 3 Elemente values[1], values[2], und values[3]. Warum “bis zu”? Wie wir in Folge 2 gesehen haben, erhalten wir immer noch eine Liste zurück, wenn stop größer ist als die Gesamtlänge der Liste values, aber sie wird kürzer sein als erwartet.

Aufgabe

Von Zeichenketten zu Listen und zurück

Angesichts dieser:

PYTHON

print('string to list:', list('tin'))
print('list to string:', ''.join(['g', 'o', 'l', 'd']))

AUSGABE

string to list: ['t', 'i', 'n']
list to string: gold
  1. Was bewirkt list('some string')?
  2. Was erzeugt '-'.join(['x', 'y', 'z'])?
  1. list('some string') wandelt eine Zeichenkette in eine Liste um, die alle ihre Zeichen enthält.
  2. join gibt eine Zeichenkette zurück, die die Verkettung jedes Zeichenkettenelements in der Liste ist und fügt das Trennzeichen zwischen jedem Element in der Liste hinzu. Das Ergebnis ist x-y-z. Das Trennzeichen zwischen den Elementen ist die Zeichenkette, die diese Methode liefert.
Aufgabe

Arbeiten mit dem Ende

Was gibt das folgende Programm aus?

PYTHON

element = 'helium'
print(element[-1])
  1. Wie interpretiert Python einen negativen Index?
  2. Wenn eine Liste oder Zeichenkette N Elemente hat, welches ist der negativste Index, der sicher verwendet werden kann, und welche Stelle repräsentiert dieser Index?
  3. Wenn values eine Liste ist, was macht dann del values[-1]?
  4. Wie kann man alle Elemente außer dem letzten anzeigen, ohne values zu ändern? (Tipp: Sie müssen Slicing und negative Indizierung kombinieren.)

Das Programm gibt m aus.

  1. Python interpretiert einen negativen Index so, als würde man vom Ende her beginnen (im Gegensatz zum Anfang). Das letzte Element ist -1.
  2. Der letzte Index, der bei einer Liste mit N Elementen sicher verwendet werden kann, ist das Element -N, das das erste Element darstellt.
  3. del values[-1] entfernt das letzte Element aus der Liste.
  4. values[:-1]
Aufgabe

Schrittweise durch eine Liste

Was gibt das folgende Programm aus?

PYTHON

element = 'fluorine'
print(element[::2])
print(element[::-1])
  1. Wenn wir ein Slice als low:high:stride schreiben, was macht dann stride?
  2. Welcher Ausdruck würde alle geradzahligen Elemente aus einer Sammlung auswählen?

Das Programm druckt

PYTHON

furn
eniroulf
  1. stride ist die Schrittweite des Slice.
  2. Das Slice 1::2 wählt alle geradzahligen Elemente einer Sammlung aus: es beginnt mit dem Element 1 (welches das zweite Element ist, da die Indizierung bei 0 beginnt), geht weiter bis zum Ende (da kein end angegeben ist) und verwendet eine Schrittweite von 2 (d.h. es wählt jedes zweite Element aus).
Aufgabe

Slice Bounds

Was gibt das folgende Programm aus?

PYTHON

element = 'lithium'
print(element[0:20])
print(element[-1:3])

AUSGABE

lithium

Die erste Anweisung gibt die gesamte Zeichenkette aus, da der Slice über die Gesamtlänge der Zeichenkette hinausgeht. Die zweite Anweisung gibt eine leere Zeichenkette zurück, da der Ausschnitt “außerhalb der Grenzen” der Zeichenkette liegt.

Aufgabe

Sortieren und sortiert

Was geben diese beiden Programme aus? Erklären Sie in einfachen Worten den Unterschied zwischen sorted(letters) und letters.sort().

PYTHON

# Program A
letters = list('gold')
result = sorted(letters)
print('letters is', letters, 'and result is', result)

PYTHON

# Program B
letters = list('gold')
result = letters.sort()
print('letters is', letters, 'and result is', result)

Programm A druckt

AUSGABE

letters is ['g', 'o', 'l', 'd'] and result is ['d', 'g', 'l', 'o']

Programm B druckt

AUSGABE

letters is ['d', 'g', 'l', 'o'] and result is None

sorted(letters) gibt eine sortierte Kopie der Liste letters zurück (die ursprüngliche Liste letters bleibt unverändert), während letters.sort() die Liste letters in-place sortiert und nichts zurückgibt.

Aufgabe

Kopieren (oder nicht)

Was geben diese beiden Programme aus? Erklären Sie in einfachen Worten den Unterschied zwischen new = old und new = old[:].

PYTHON

# Program A
old = list('gold')
new = old      # simple assignment
new[0] = 'D'
print('new is', new, 'and old is', old)

PYTHON

# Program B
old = list('gold')
new = old[:]   # assigning a slice
new[0] = 'D'
print('new is', new, 'and old is', old)

Programm A druckt

AUSGABE

new is ['D', 'o', 'l', 'd'] and old is ['D', 'o', 'l', 'd']

Programm B druckt

AUSGABE

new is ['D', 'o', 'l', 'd'] and old is ['g', 'o', 'l', 'd']

new = old macht new zu einem Verweis auf die Liste old; new und old zeigen auf das gleiche Objekt.

new = old[:] erzeugt jedoch ein neues Listenobjekt new, das alle Elemente der Liste old enthält; new und old sind unterschiedliche Objekte.

Hauptpunkte
  • Eine Liste speichert viele Werte in einer einzigen Struktur.
  • Verwenden Sie den Index eines Elements, um es aus einer Liste zu holen.
  • Die Werte von Listen können durch Zuweisung ersetzt werden.
  • Das Anhängen von Elementen an eine Liste verlängert diese.
  • Verwenden Sie del, um Elemente aus einer Liste vollständig zu entfernen.
  • Die leere Liste enthält keine Werte.
  • Listen können Werte unterschiedlichen Typs enthalten.
  • Zeichenketten können wie Listen indiziert werden.
  • Zeichenketten sind unveränderlich.
  • Die Indizierung über das Ende der Auflistung hinaus ist ein Fehler.

Content from For-Schleifen


Zuletzt aktualisiert am 2025-10-31 | Diese Seite bearbeiten

Geschätzte Zeit: 25 Minuten

Übersicht

Fragen

  • Wie kann ich ein Programm dazu bringen, viele Dinge zu tun?

Ziele

  • Erläutern Sie, wozu for-Schleifen normalerweise verwendet werden.
  • Verfolgen Sie die Ausführung einer einfachen (nicht verschachtelten) Schleife und geben Sie die Werte der Variablen in jeder Iteration korrekt an.
  • Schreiben Sie for-Schleifen, die das Accumulator-Muster verwenden, um Werte zu aggregieren.

Eine for-Schleife führt Befehle für jeden Wert in einer Sammlung einmal aus.


  • Die Berechnung der Werte in einer Liste ist genauso mühsam wie die Arbeit mit pressure_001, pressure_002, etc.
  • Eine for-Schleife weist Python an, einige Anweisungen für jeden Wert in einer Liste, einer Zeichenkette oder einer anderen Sammlung einmal auszuführen.
  • “führe für jedes Ding in dieser Gruppe diese Operationen aus”

PYTHON

for number in [2, 3, 5]:
    print(number)
  • Diese for Schleife ist äquivalent zu:

PYTHON

print(2)
print(3)
print(5)
  • Und die Ausgabe der for Schleife ist:

AUSGABE

2
3
5

Eine for-Schleife besteht aus einer Auflistung, einer Schleifenvariablen und einem Körper.


PYTHON

for number in [2, 3, 5]:
    print(number)
  • Die Schleife wird auf der Sammlung [2, 3, 5] ausgeführt.
  • Der Körper, print(number), gibt an, was für jeden Wert in der Sammlung zu tun ist.
  • Die Schleifenvariable, number, ändert sich bei jeder Iteration der Schleife.
    • Das “aktuelle Ding”.

Die erste Zeile der for-Schleife muss mit einem Doppelpunkt enden, und der Körper muss eingerückt sein.


  • Der Doppelpunkt am Ende der ersten Zeile signalisiert den Beginn eines Blocks von Anweisungen.
  • Python verwendet Einrückungen anstelle von {} oder begin/end, um Schachtelungen anzuzeigen.
    • Jede konsistente Einrückung ist erlaubt, aber fast jeder verwendet vier Leerzeichen.

PYTHON

for number in [2, 3, 5]:
print(number)

FEHLER

IndentationError: expected an indented block
  • Die Einrückung ist in Python immer sinnvoll.

PYTHON

firstName = "Jon"
  lastName = "Smith"

FEHLER

  File "<ipython-input-7-f65f2962bf9c>", line 2
    lastName = "Smith"
    ^
IndentationError: unexpected indent
  • Dieser Fehler kann behoben werden, indem die zusätzlichen Leerzeichen am Anfang der zweiten Zeile entfernt werden.

Schleifenvariablen können beliebig benannt werden.


  • Wie alle Variablen sind auch die Schleifenvariablen:
    • Wird bei Bedarf erstellt.
    • Bedeutungslos: ihre Namen können alles Mögliche sein.

PYTHON

for kitten in [2, 3, 5]:
    print(kitten)

Der Körper einer Schleife kann viele Anweisungen enthalten.


  • Aber keine Schleife sollte mehr als ein paar Zeilen lang sein.
  • Für Menschen ist es schwer, sich größere Codeabschnitte zu merken.

PYTHON

primes = [2, 3, 5]
for p in primes:
    squared = p ** 2
    cubed = p ** 3
    print(p, squared, cubed)

AUSGABE

2 4 8
3 9 27
5 25 125

Verwenden Sie range, um über eine Folge von Zahlen zu iterieren.


  • Die eingebaute Funktion range erzeugt eine Folge von Zahlen.
    • Keine Liste: Die Zahlen werden bei Bedarf erzeugt, um die Schleifenbildung über große Bereiche effizienter zu machen.
  • range(N) ist die Zahlen 0..N-1
    • Genau die zulässigen Indizes einer Liste oder Zeichenkette der Länge N

PYTHON

print('a range is not a list: range(0, 3)')
for number in range(0, 3):
    print(number)

AUSGABE

a range is not a list: range(0, 3)
0
1
2

Das Accumulator-Muster macht aus vielen Werten einen einzigen.


  • Ein häufiges Muster in Programmen ist to:
    1. Initialisiere eine Accumulator-Variable auf Null, die leere Zeichenkette oder die leere Liste.
    2. Aktualisiere die Variable mit Werten aus einer Sammlung.

PYTHON

# Sum the first 10 integers.
total = 0
for number in range(10):
   total = total + (number + 1)
print(total)

AUSGABE

55
  • Lies total = total + (number + 1) als:
    • Addiere 1 zum aktuellen Wert der Schleifenvariablen number.
    • Addiere das zum aktuellen Wert der Akkumulatorvariablen total.
    • Weisen Sie dies total zu und ersetzen Sie damit den aktuellen Wert.
  • Wir müssen number + 1 hinzufügen, weil range 0..9 erzeugt, nicht 1..10.
Aufgabe

Klassifizierung von Fehlern

Ist ein Einrückungsfehler ein Syntaxfehler oder ein Laufzeitfehler?

Ein IndentationError ist ein Syntaxfehler. Programme mit Syntaxfehlern können nicht gestartet werden. Ein Programm mit einem Laufzeitfehler wird zwar gestartet, aber unter bestimmten Bedingungen wird ein Fehler ausgelöst.

Aufgabe

Verfolgung der Ausführung

Erstelle eine Tabelle mit den Zeilennummern, die bei der Ausführung dieses Programms ausgeführt werden, und den Werten der Variablen nach der Ausführung jeder Zeile.

PYTHON

total = 0
for char in "tin":
    total = total + 1
Line no Variables
1 total = 0
2 total = 0 char = ‘t’
3 total = 1 char = ‘t’
2 total = 1 char = ‘i’
3 total = 2 char = ‘i’
2 total = 2 char = ‘n’
3 total = 3 char = ‘n’
Aufgabe

Umkehrung einer Zeichenkette

Füllen Sie die Leerzeichen im folgenden Programm so aus, dass es “nit” (das Gegenteil der ursprünglichen Zeichenkette “tin”) ausgibt.

PYTHON

original = "tin"
result = ____
for char in original:
    result = ____
print(result)

PYTHON

original = "tin"
result = ""
for char in original:
    result = char + result
print(result)
Aufgabe

Übung Akkumulieren

Füllen Sie die Lücken in jedem der folgenden Programme aus, um das angegebene Ergebnis zu erhalten.

PYTHON

# Total length of the strings in the list: ["red", "green", "blue"] => 12
total = 0
for word in ["red", "green", "blue"]:
    ____ = ____ + len(word)
print(total)

PYTHON

total = 0
for word in ["red", "green", "blue"]:
    total = total + len(word)
print(total)
Aufgabe

Übung Akkumulieren (continued)

PYTHON

# List of word lengths: ["red", "green", "blue"] => [3, 5, 4]
lengths = ____
for word in ["red", "green", "blue"]:
    lengths.____(____)
print(lengths)

PYTHON

lengths = []
for word in ["red", "green", "blue"]:
    lengths.append(len(word))
print(lengths)
Aufgabe

Übung Akkumulieren (continued)

PYTHON

# Concatenate all words: ["red", "green", "blue"] => "redgreenblue"
words = ["red", "green", "blue"]
result = ____
for ____ in ____:
    ____
print(result)

PYTHON

words = ["red", "green", "blue"]
result = ""
for word in words:
    result = result + word
print(result)
Aufgabe

Übung Akkumulieren (continued)

Erstellen eines Akronyms: Ausgehend von der Liste ["red", "green", "blue"], erstellen Sie das Akronym "RGB" mit Hilfe einer for-Schleife.

Hinweis: Möglicherweise müssen Sie eine String-Methode verwenden, um das Akronym richtig zu formatieren.

PYTHON

acronym = ""
for word in ["red", "green", "blue"]:
    acronym = acronym + word[0].upper()
print(acronym)
Aufgabe

Kumulative Summe

Ordnen Sie die folgenden Codezeilen neu an und rücken Sie sie richtig ein, so dass sie eine Liste mit der kumulierten Summe der Daten ausgeben. Das Ergebnis sollte [1, 3, 5, 10] sein.

PYTHON

cumulative.append(total)
for number in data:
cumulative = []
total = total + number
total = 0
print(cumulative)
data = [1,2,2,5]

PYTHON

total = 0
data = [1,2,2,5]
cumulative = []
for number in data:
    total = total + number
    cumulative.append(total)
print(cumulative)
Aufgabe

Identifizierung von Variablennamensfehlern

  1. Lesen Sie den folgenden Code und versuchen Sie, die Fehler zu identifizieren, ohne ihn auszuführen.
  2. Führen Sie den Code aus und lesen Sie die Fehlermeldung. Was für ein Typ von NameError ist dies Ihrer Meinung nach? Ist es eine Zeichenkette ohne Anführungszeichen, eine falsch geschriebene Variable oder eine Variable, die definiert werden sollte, aber nicht definiert wurde?
  3. Beheben Sie den Fehler.
  4. Wiederholen Sie die Schritte 2 und 3, bis Sie alle Fehler behoben haben.

PYTHON

for number in range(10):
    # use a if the number is a multiple of 3, otherwise use b
    if (Number % 3) == 0:
        message = message + a
    else:
        message = message + "b"
print(message)
  • Bei Python-Variablennamen wird zwischen Groß- und Kleinschreibung unterschieden: number und Number beziehen sich auf unterschiedliche Variablen.
  • Die Variable message muss mit einem leeren String initialisiert werden.
  • Wir wollen die Zeichenkette "a" zu message hinzufügen, nicht die undefinierte Variable a.

PYTHON

message = ""
for number in range(10):
    # use a if the number is a multiple of 3, otherwise use b
    if (number % 3) == 0:
        message = message + "a"
    else:
        message = message + "b"
print(message)
Aufgabe

Identifizierung von Elementfehlern

  1. Lesen Sie den folgenden Code und versuchen Sie, die Fehler zu identifizieren, ohne ihn auszuführen.
  2. Führen Sie den Code aus, und lesen Sie die Fehlermeldung. Um welche Art von Fehler handelt es sich?
  3. Beheben Sie den Fehler.

PYTHON

seasons = ['Spring', 'Summer', 'Fall', 'Winter']
print('My favorite season is ', seasons[4])

Diese Liste hat 4 Elemente und der Index für den Zugriff auf das letzte Element in der Liste ist 3.

PYTHON

seasons = ['Spring', 'Summer', 'Fall', 'Winter']
print('My favorite season is ', seasons[3])
Hauptpunkte
  • Eine for-Schleife führt Befehle einmal für jeden Wert in einer Sammlung aus.
  • Eine for-Schleifebesteht aus einer Sammlung, einer Schleifenvariablen und einem Körper.
  • Die erste Zeile der for-Schleife muss mit einem Doppelpunkt enden, und der Körper muss eingerückt sein.
  • Die Einrückung ist in Python immer sinnvoll.
  • Schleifenvariablen können beliebig benannt werden (es wird jedoch dringend empfohlen, einen aussagekräftigen Namen für die Schleifenvariable zu verwenden).
  • Der Körper einer Schleife kann viele Anweisungen enthalten.
  • Benutze range, um über eine Folge von Zahlen zu iterieren.
  • Das Accumulator-Muster macht aus vielen Werten einen einzigen.

Content from Konditionale


Zuletzt aktualisiert am 2025-10-31 | Diese Seite bearbeiten

Geschätzte Zeit: 25 Minuten

Übersicht

Fragen

  • Wie können Programme verschiedene Dinge für verschiedene Daten tun?

Ziele

  • Korrektes Schreiben von Programmen, die if- und else-Anweisungen und einfache boolesche Ausdrücke (ohne logische Operatoren) verwenden.
  • Verfolgen Sie die Ausführung von nicht verschachtelten Konditionalen und Konditionalen in Schleifen.

Benutze if Anweisungen, um zu kontrollieren, ob ein Codeblock ausgeführt wird oder nicht.


  • Eine if-Anweisung (richtiger: eine bedingte Anweisung) steuert, ob ein Codeblock ausgeführt wird oder nicht.
  • Die Struktur ähnelt der einer for-Anweisung:
    • Die erste Zeile beginnt mit if und endet mit einem Doppelpunkt
    • Körper, der eine oder mehrere Anweisungen enthält, wird eingerückt (normalerweise um 4 Leerzeichen)

PYTHON

mass = 3.54
if mass > 3.0:
    print(mass, 'is large')

mass = 2.07
if mass > 3.0:
    print (mass, 'is large')

AUSGABE

3.54 is large

Konditionale Bedingungen werden oft innerhalb von Schleifen verwendet.


  • Es macht wenig Sinn, eine Bedingung zu verwenden, wenn wir den Wert kennen (wie oben).
  • Nützlich, wenn wir eine Sammlung zu verarbeiten haben.

PYTHON

masses = [3.54, 2.07, 9.22, 1.86, 1.71]
for m in masses:
    if m > 3.0:
        print(m, 'is large')

AUSGABE

3.54 is large
9.22 is large

Verwenden Sie else, um einen Codeblock auszuführen, wenn eine if Bedingung nicht wahr ist.


  • else kann nach einem if verwendet werden.
  • Ermöglicht die Angabe einer Alternative, die ausgeführt werden soll, wenn der if Zweig nicht genommen wird.

PYTHON

masses = [3.54, 2.07, 9.22, 1.86, 1.71]
for m in masses:
    if m > 3.0:
        print(m, 'is large')
    else:
        print(m, 'is small')

AUSGABE

3.54 is large
2.07 is small
9.22 is large
1.86 is small
1.71 is small

Verwenden Sie elif, um zusätzliche Tests zu spezifizieren.


  • Vielleicht möchten Sie mehrere Alternativen anbieten, jede mit ihrem eigenen Test.
  • Verwenden Sie elif (kurz für “else if”) und eine Bedingung, um diese anzugeben.
  • Immer verbunden mit einem if.
  • Muss vor else stehen (das ist der “catch all”).

PYTHON

masses = [3.54, 2.07, 9.22, 1.86, 1.71]
for m in masses:
    if m > 9.0:
        print(m, 'is HUGE')
    elif m > 3.0:
        print(m, 'is large')
    else:
        print(m, 'is small')

AUSGABE

3.54 is large
2.07 is small
9.22 is HUGE
1.86 is small
1.71 is small

Bedingungen werden einmal getestet, in der Reihenfolge.


  • Python durchläuft die Zweige der Bedingung der Reihe nach und testet sie.
  • Die Reihenfolge ist also wichtig.

PYTHON

grade = 85
if grade >= 90:
    print('grade is A')
elif grade >= 80:
    print('grade is B')
elif grade >= 70:
    print('grade is C')

AUSGABE

grade is B
  • Geht nicht automatisch zurück und wertet neu aus, wenn sich Werte ändern.

PYTHON

velocity = 10.0
if velocity > 20.0:
    print('moving too fast')
else:
    print('adjusting velocity')
    velocity = 50.0

AUSGABE

adjusting velocity
  • Verwenden Sie oft Konditionale in einer Schleife, um die Werte von Variablen zu “entwickeln”.

PYTHON

velocity = 10.0
for i in range(5): # execute the loop 5 times
    print(i, ':', velocity)
    if velocity > 20.0:
        print('moving too fast')
        velocity = velocity - 5.0
    else:
        print('moving too slow')
        velocity = velocity + 10.0
print('final velocity:', velocity)

AUSGABE

0 : 10.0
moving too slow
1 : 20.0
moving too slow
2 : 30.0
moving too fast
3 : 25.0
moving too fast
4 : 20.0
moving too slow
final velocity: 30.0

Erstellen Sie eine Tabelle mit den Werten von Variablen, um die Ausführung eines Programms zu verfolgen.


i 0 . 1 . 2 . 3 . 4 .
velocity 10.0 20.0 . 30.0 . 25.0 . 20.0 . 30.0
  • Das Programm muss eine print-Anweisung außerhalb des Schleifenkörpers haben, um den Endwert von velocity anzuzeigen, da sein Wert durch die letzte Iteration der Schleife aktualisiert wird.
Wichtig

Zusammengesetzte Beziehungen mit and, or und Klammern

Oft will man, dass eine Kombination von Dingen wahr ist. Sie können Beziehungen innerhalb einer Bedingung mit and und or kombinieren. Um das obige Beispiel fortzusetzen, nehmen wir an, Sie haben

PYTHON

mass     = [ 3.54,  2.07,  9.22,  1.86,  1.71]
velocity = [10.00, 20.00, 30.00, 25.00, 20.00]

i = 0
for i in range(5):
    if mass[i] > 5 and velocity[i] > 20:
        print("Fast heavy object.  Duck!")
    elif mass[i] > 2 and mass[i] <= 5 and velocity[i] <= 20:
        print("Normal traffic")
    elif mass[i] <= 2 and velocity[i] <= 20:
        print("Slow light object.  Ignore it")
    else:
        print("Whoa!  Something is up with the data.  Check it")

Genau wie in der Arithmetik können und sollten Sie Klammern verwenden, wenn es eine mögliche Mehrdeutigkeit gibt. Eine gute allgemeine Regel ist es, immer Klammern zu verwenden, wenn man and und or in derselben Bedingung mischt. Das heißt, anstelle von:

PYTHON

if mass[i] <= 2 or mass[i] >= 5 and velocity[i] > 20:

verwenden Sie eine der folgenden Formulierungen:

PYTHON

if (mass[i] <= 2 or mass[i] >= 5) and velocity[i] > 20:
if mass[i] <= 2 or (mass[i] >= 5 and velocity[i] > 20):

so ist es für den Leser (und für Python) völlig klar, was Sie wirklich meinen.

Aufgabe

Tracing Execution

Was gibt dieses Programm aus?

PYTHON

pressure = 71.9
if pressure > 50.0:
    pressure = 25.0
elif pressure <= 50.0:
    pressure = 0.0
print(pressure)

AUSGABE

25.0
Aufgabe

Trimmen von Werten

Füllen Sie die Lücken aus, so dass dieses Programm eine neue Liste erstellt, die Nullen enthält, wenn die Werte der ursprünglichen Liste negativ waren, und Einsen, wenn die Werte der ursprünglichen Liste positiv waren.

PYTHON

original = [-1.5, 0.2, 0.4, 0.0, -1.3, 0.4]
result = ____
for value in original:
    if ____:
        result.append(0)
    else:
        ____
print(result)

AUSGABE

[0, 1, 1, 1, 0, 1]

PYTHON

original = [-1.5, 0.2, 0.4, 0.0, -1.3, 0.4]
result = []
for value in original:
    if value < 0.0:
        result.append(0)
    else:
        result.append(1)
print(result)
Aufgabe

Verarbeitung kleiner Dateien

Ändern Sie dieses Programm so, dass es nur Dateien mit weniger als 50 Datensätzen verarbeitet.

PYTHON

import glob
import pandas as pd
for filename in glob.glob('data/*.csv'):
    contents = pd.read_csv(filename)
    ____:
        print(filename, len(contents))

PYTHON

import glob
import pandas as pd
for filename in glob.glob('data/*.csv'):
    contents = pd.read_csv(filename)
    if len(contents) < 50:
        print(filename, len(contents))
Aufgabe

Initialisierung

Ändern Sie dieses Programm so, dass es den größten und den kleinsten Wert in der Liste findet, unabhängig davon, wie groß der ursprüngliche Wertebereich ist.

PYTHON

values = [...some test data...]
smallest, largest = None, None
for v in values:
    if ____:
        smallest, largest = v, v
    ____:
        smallest = min(____, v)
        largest = max(____, v)
print(smallest, largest)

Was sind die Vor- und Nachteile dieser Methode, um den Bereich der Daten zu bestimmen?

PYTHON

values = [-2,1,65,78,-54,-24,100]
smallest, largest = None, None
for v in values:
    if smallest is None and largest is None:
        smallest, largest = v, v
    else:
        smallest = min(smallest, v)
        largest = max(largest, v)
print(smallest, largest)

Wenn Sie == None anstelle von is None geschrieben haben, funktioniert das auch, aber Python-Programmierer schreiben immer is None wegen der besonderen Art und Weise, wie None in dieser Sprache funktioniert.

Man kann argumentieren, dass ein Vorteil dieser Methode darin besteht, den Code lesbarer zu machen. Ein Nachteil ist jedoch, dass dieser Code nicht effizient ist, da es innerhalb jeder Iteration der Schleifenanweisung for zwei weitere Schleifen gibt, die jeweils über zwei Zahlen laufen (die Funktionen min und max). Es wäre effizienter, jede Zahl nur einmal zu durchlaufen:

PYTHON

values = [-2,1,65,78,-54,-24,100]
smallest, largest = None, None
for v in values:
    if smallest is None or v < smallest:
        smallest = v
    if largest is None or v > largest:
        largest = v
print(smallest, largest)

Jetzt haben wir eine Schleife, aber vier Vergleichstests. Es gibt zwei Möglichkeiten, die Schleife weiter zu verbessern: Entweder werden in jeder Iteration weniger Vergleiche durchgeführt, oder es werden zwei Schleifen verwendet, die jeweils nur einen Vergleichstest enthalten. Die einfachste Lösung ist oft die beste:

PYTHON

values = [-2,1,65,78,-54,-24,100]
smallest = min(values)
largest = max(values)
print(smallest, largest)
Hauptpunkte
  • Verwenden Sie if-Anweisungen, um zu kontrollieren, ob ein Codeblock ausgeführt wird oder nicht.
  • Konditionale Bedingungen werden oft innerhalb von Schleifen verwendet.
  • Verwenden Sie else, um einen Codeblock auszuführen, wenn eine if Bedingung nicht wahr ist.
  • Verwenden Sie elif, um zusätzliche Tests zu spezifizieren.
  • Die Bedingungen werden einmal in der Reihenfolge getestet.
  • Erstellen Sie eine Tabelle mit den Werten der Variablen, um die Ausführung eines Programms zu verfolgen.

Content from Schleifen über Datensätze


Zuletzt aktualisiert am 2025-10-31 | Diese Seite bearbeiten

Geschätzte Zeit: 15 Minuten

Übersicht

Fragen

  • Wie kann ich viele Datensätze mit einem einzigen Befehl verarbeiten?

Ziele

  • In der Lage sein, Globbing-Ausdrücke zu lesen und zu schreiben, die mit Dateimengen übereinstimmen.
  • Verwenden Sie glob, um Listen von Dateien zu erstellen.
  • Schreibe for-Schleifen, um Operationen auf Dateien durchzuführen, deren Namen in einer Liste angegeben sind.

Verwenden Sie eine for-Schleife, um Dateien mit einer Liste ihrer Namen zu verarbeiten.


  • Ein Dateiname ist eine Zeichenkette.
  • Und Listen können Zeichenketten enthalten.

PYTHON

import pandas as pd
for filename in ['data/gapminder_gdp_africa.csv', 'data/gapminder_gdp_asia.csv']:
    data = pd.read_csv(filename, index_col='country')
    print(filename, data.min())

AUSGABE

data/gapminder_gdp_africa.csv gdpPercap_1952    298.846212
gdpPercap_1957    335.997115
gdpPercap_1962    355.203227
gdpPercap_1967    412.977514
⋮ ⋮ ⋮
gdpPercap_1997    312.188423
gdpPercap_2002    241.165877
gdpPercap_2007    277.551859
dtype: float64
data/gapminder_gdp_asia.csv gdpPercap_1952    331
gdpPercap_1957    350
gdpPercap_1962    388
gdpPercap_1967    349
⋮ ⋮ ⋮
gdpPercap_1997    415
gdpPercap_2002    611
gdpPercap_2007    944
dtype: float64

Verwenden Sie glob.glob, um Gruppen von Dateien zu finden, deren Namen einem Muster entsprechen.


  • In Unix bedeutet der Begriff “globbing” “eine Menge von Dateien mit einem Muster abgleichen”.
  • Die häufigsten Muster sind:
    • * bedeutet “entspricht null oder mehr Zeichen”
    • ? bedeutet “genau ein Zeichen übereinstimmen”
  • Die Standardbibliothek von Python enthält das Modul glob, um die Funktionalität des Mustervergleichs bereitzustellen
  • Das glob Modul enthält eine Funktion, die auch glob genannt wird, um Dateimuster zu finden
  • Z.B. passt glob.glob('*.txt') auf alle Dateien im aktuellen Verzeichnis, deren Namen mit .txt enden.
  • Das Ergebnis ist eine (möglicherweise leere) Liste von Zeichenketten.

PYTHON

import glob
print('all csv files in data directory:', glob.glob('data/*.csv'))

AUSGABE

all csv files in data directory: ['data/gapminder_all.csv', 'data/gapminder_gdp_africa.csv', \
'data/gapminder_gdp_americas.csv', 'data/gapminder_gdp_asia.csv', 'data/gapminder_gdp_europe.csv', \
'data/gapminder_gdp_oceania.csv']

PYTHON

print('all PDB files:', glob.glob('*.pdb'))

AUSGABE

all PDB files: []

Verwenden Sie glob und for, um Stapel von Dateien zu verarbeiten.


  • Es hilft sehr, wenn die Dateien systematisch und konsistent benannt und gespeichert werden, damit einfache Muster die richtigen Daten finden.

PYTHON

for filename in glob.glob('data/gapminder_*.csv'):
    data = pd.read_csv(filename)
    print(filename, data['gdpPercap_1952'].min())

AUSGABE

data/gapminder_all.csv 298.8462121
data/gapminder_gdp_africa.csv 298.8462121
data/gapminder_gdp_americas.csv 1397.717137
data/gapminder_gdp_asia.csv 331.0
data/gapminder_gdp_europe.csv 973.5331948
data/gapminder_gdp_oceania.csv 10039.59564
  • Dies beinhaltet alle Daten, sowie Daten pro Region.
  • Verwenden Sie ein spezifischeres Muster in den Übungen, um den gesamten Datensatz auszuschließen.
  • Aber beachten Sie, dass das Minimum des gesamten Datensatzes auch das Minimum eines der Datensätze ist, was eine nette Überprüfung der Korrektheit ist.
Aufgabe

Ermitteln von Übereinstimmungen

Auf welche dieser Dateien trifft der Ausdruck glob.glob('data/*as*.csv') nicht zu?

  1. data/gapminder_gdp_africa.csv
  2. data/gapminder_gdp_americas.csv
  3. data/gapminder_gdp_asia.csv

1 wird vom glob nicht gefunden.

Aufgabe

Minimale Dateigröße

Ändern Sie dieses Programm so, dass es die Anzahl der Datensätze in der Datei mit den wenigsten Datensätzen ausgibt.

PYTHON

import glob
import pandas as pd
fewest = ____
for filename in glob.glob('data/*.csv'):
    dataframe = pd.____(filename)
    fewest = min(____, dataframe.shape[0])
print('smallest file has', fewest, 'records')

Beachten Sie, dass die Methode DataFrame.shape() ein Tupel mit der Anzahl der Zeilen und Spalten des Datenrahmens zurückgibt.

PYTHON

import glob
import pandas as pd
fewest = float('Inf')
for filename in glob.glob('data/*.csv'):
    dataframe = pd.read_csv(filename)
    fewest = min(fewest, dataframe.shape[0])
print('smallest file has', fewest, 'records')

Sie könnten sich dafür entschieden haben, die Variable fewest mit einer Zahl zu initialisieren, die größer ist als die Zahlen, mit denen Sie arbeiten, aber das könnte zu Problemen führen, wenn Sie den Code mit größeren Zahlen wiederverwenden. In Python können Sie positive Unendlichkeit verwenden, was unabhängig von der Größe Ihrer Zahlen funktioniert. Welche anderen speziellen Zeichenketten erkennt die Funktion float?

Aufgabe

Vergleich von Daten

Schreiben Sie ein Programm, das die regionalen Datensätze einliest und das durchschnittliche Pro-Kopf-BIP für jede Region über die Zeit in einem einzigen Diagramm darstellt. Pandas gibt eine Fehlermeldung aus, wenn es auf nicht-numerische Spalten in einer Datenrahmenberechnung stößt. Sie müssen also entweder diese Spalten herausfiltern oder Pandas anweisen, sie zu ignorieren.

Diese Lösung erstellt eine nützliche Legende, indem sie die string split method verwendet, um die region aus dem Pfad ‘data/gapminder_gdp_a_specific_region.csv’ zu extrahieren.

PYTHON

import glob
import pandas as pd
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1,1)
for filename in glob.glob('data/gapminder_gdp*.csv'):
    dataframe = pd.read_csv(filename)
    # Extrahieren Sie <Region> aus dem Dateinamen, der voraussichtlich das Format „data/gapminder_gdp_<Region>.csv” hat.
    # Wir teilen die Zeichenfolge mit der Split-Methode und „_” als Trennzeichen,
    # rufen die letzte Zeichenfolge in der Liste ab, die Split zurückgibt („<Region>.csv”), 
    # und entfernen dann die Erweiterung „.csv” aus dieser Zeichenfolge.
    # HINWEIS: Das im nächsten Callout behandelte Modul „pathlib” bietet ebenfalls
    # praktische Abstraktionen für die Arbeit mit Dateisystempfaden und könnte dies ebenfalls lösen:
    # from pathlib import Path
    # region = Path(filename).stem.split(‚_‘)[-1]
    region = filename.split('_')[-1][:-4]
    # Extrahieren Sie die Jahreszahlen aus den Spalten des Datenrahmens. 
    headings = dataframe.columns[1:]
    years = headings.str.split('_').str.get(1)
    # pandas gibt Fehler aus, wenn es bei der Berechnung eines Datenrahmens auf nicht numerische Spalten stößt.
    # Wir können pandas jedoch mit dem Parameter „numeric_only” anweisen, diese zu ignorieren.
    dataframe.mean(numeric_only=True).plot(ax=ax, label=region)
    # HINWEIS: Eine andere Möglichkeit besteht darin, mithilfe der Filtermethode nur die Spalten auszuwählen, deren Name „gdp” enthält.
    # dataframe.filter(like=„gdp“).mean().plot(ax=ax, label=region)
# Titel und Beschriftungen festlegen
ax.set_title('GDP Per Capita for Regions Over Time')
ax.set_xticks(range(len(years)))
ax.set_xticklabels(years)
ax.set_xlabel('Year')
plt.tight_layout()
plt.legend()
plt.show()
Wichtig

Umgang mit Dateipfaden

Das Modul pathlib bietet nützliche Abstraktionen für die Datei- und Pfadmanipulation, wie z.B. die Rückgabe des Namens einer Datei ohne die Dateierweiterung. Dies ist sehr nützlich, wenn man eine Schleife über Dateien und Verzeichnisse zieht. Im folgenden Beispiel erstellen wir ein Objekt Path und untersuchen seine Attribute.

PYTHON

from pathlib import Path

p = Path("data/gapminder_gdp_africa.csv")
print(p.parent)
print(p.stem)
print(p.suffix)

AUSGABE

data
gapminder_gdp_africa
.csv

Hinweis: Überprüfen Sie alle verfügbaren Attribute und Methoden des Objekts Path mit der Funktion dir().

Hauptpunkte
  • Verwenden Sie eine for-Schleife, um Dateien mit einer Liste von Namen zu verarbeiten.
  • Verwenden Sie glob.glob, um Gruppen von Dateien zu finden, deren Namen einem Muster entsprechen.
  • Verwenden Sie glob und for, um Stapel von Dateien zu verarbeiten.

Content from Kaffee am Nachmittag


Zuletzt aktualisiert am 2025-03-02 | Diese Seite bearbeiten

Geschätzte Zeit: 0 Minuten

Reflexionsübung


Denken Sie in der Pause über die folgenden Punkte nach und diskutieren Sie sie:

  • Ein gängiger Spruch in der Softwareentwicklung ist “Wiederhole dich nicht”. Wie können die Techniken, die wir in den letzten Lektionen gelernt haben, uns helfen, Wiederholungen zu vermeiden? *Beachten Sie, dass es in der Praxis einige Nuancen gibt, die mit der einfachsten Lösung, die möglich ist, in Einklang gebracht werden sollten
  • Was sind die Vor- und Nachteile, wenn man eine Variable global oder lokal zu einer Funktion macht?
  • Wann würden Sie erwägen, einen Codeblock in eine Funktionsdefinition zu verwandeln?

Content from Funktionen schreiben


Zuletzt aktualisiert am 2025-11-05 | Diese Seite bearbeiten

Geschätzte Zeit: 25 Minuten

Übersicht

Fragen

  • Wie kann ich meine eigenen Funktionen erstellen?

Ziele

  • Erklären und identifizieren Sie den Unterschied zwischen Funktionsdefinition und Funktionsaufruf.
  • Schreiben Sie eine Funktion, die eine kleine, feste Anzahl von Argumenten annimmt und ein einziges Ergebnis liefert.

Zerlegen Sie Programme in Funktionen, um sie besser verstehen zu können.


  • Der Mensch kann nur einige wenige Dinge gleichzeitig im Arbeitsgedächtnis behalten.
  • Verstehen Sie größere/kompliziertere Ideen, indem Sie Teile verstehen und kombinieren.
    • Komponenten in einer Maschine.
    • Lemmata beim Beweisen von Theoremen.
  • Funktionen dienen in Programmen demselben Zweck.
    • Kapseln wir die Komplexität ein, so dass wir sie als ein einziges “Ding” behandeln können.
  • Ermöglicht auch die Wiederverwendung.
    • Einmal schreiben, viele Male verwenden.

Definieren Sie eine Funktion mit def mit einem Namen, Parametern und einem Codeblock.


  • Beginnen Sie die Definition einer neuen Funktion mit def.
  • Gefolgt vom Namen der Funktion.
    • Muss denselben Regeln gehorchen wie Variablennamen.
  • Dann Parameter in Klammern.
    • Leere Klammern, wenn die Funktion keine Eingaben annimmt.
    • Wir werden dies gleich im Detail besprechen.
  • Dann ein Doppelpunkt.
  • Dann ein eingerückter Code-Block.

PYTHON

def print_greeting():
    print('Hello!')
    print('The weather is nice today.')
    print('Right?')

Durch die Definition einer Funktion wird diese nicht ausgeführt.


  • Die Definition einer Funktion führt sie nicht aus.
    • Wie die Zuweisung eines Wertes zu einer Variablen.
  • Muss die Funktion aufrufen, um den in ihr enthaltenen Code auszuführen.

PYTHON

print_greeting()

AUSGABE

Hello!

Argumente in einem Funktionsaufruf werden mit ihren definierten Parametern abgeglichen.


  • Funktionen sind am nützlichsten, wenn sie mit verschiedenen Daten arbeiten können.
  • Geben Sie Parameter an, wenn Sie eine Funktion definieren.
    • Diese werden zu Variablen, wenn die Funktion ausgeführt wird.
    • werden die Argumente im Aufruf (d.h. die der Funktion übergebenen Werte) zugeordnet.
    • Wenn Sie die Argumente nicht benennen, wenn Sie sie im Aufruf verwenden, werden die Argumente den Parametern in der Reihenfolge zugeordnet, in der die Parameter in der Funktion definiert sind.

PYTHON

def print_date(year, month, day):
    joined = str(year) + '/' + str(month) + '/' + str(day)
    print(joined)

print_date(1871, 3, 19)

AUSGABE

1871/3/19

Oder wir können die Argumente benennen, wenn wir die Funktion aufrufen, was uns erlaubt, sie in beliebiger Reihenfolge anzugeben und die Aufrufseite übersichtlicher zu gestalten; andernfalls könnte man beim Lesen des Codes vergessen, ob das zweite Argument zum Beispiel der Monat oder der Tag ist.

PYTHON

print_date(month=3, day=19, year=1871)

AUSGABE

1871/3/19
  • Über Twitter: () enthält die Zutaten für die Funktion, während der Körper das Rezept enthält.

Funktionen können mit return ein Ergebnis an ihren Aufrufer zurückgeben.


  • Verwenden Sie return ..., um einen Wert an den Aufrufer zurückzugeben.
  • Kann an beliebiger Stelle in der Funktion auftreten.
  • Aber Funktionen sind leichter zu verstehen, wenn return vorkommt:
    • Am Anfang, um Sonderfälle zu behandeln.
    • Ganz am Ende, mit einem Endergebnis.

PYTHON

def average(values):
    if len(values) == 0:
        return None
    return sum(values) / len(values)

PYTHON

a = average([1, 3, 4])
print('average of actual values:', a)

AUSGABE

average of actual values: 2.6666666666666665

PYTHON

print('average of empty list:', average([]))

AUSGABE

average of empty list: None

PYTHON

result = print_date(1871, 3, 19)
print('result of call is:', result)

AUSGABE

1871/3/19
result of call is: None
Aufgabe

Erkennen von Syntaxfehlern

  1. Lesen Sie den folgenden Code und versuchen Sie, die Fehler zu identifizieren, ohne ihn auszuführen.
  2. Führen Sie den Code aus und lesen Sie die Fehlermeldung. Ist es ein SyntaxError oder ein IndentationError?
  3. Beheben Sie den Fehler.
  4. Wiederholen Sie die Schritte 2 und 3, bis Sie alle Fehler behoben haben.

PYTHON

def another_function
  print("Syntax errors are annoying.")
   print("But at least python tells us about them!")
  print("So they are usually not too hard to fix.")

PYTHON

def another_function():
  print("Syntax errors are annoying.")
  print("But at least Python tells us about them!")
  print("So they are usually not too hard to fix.")
Aufgabe

Definition und Verwendung

Was gibt das folgende Programm aus?

PYTHON

def report(pressure):
    print('pressure is', pressure)

print('calling', report, 22.5)

AUSGABE

calling <function report at 0x7fd128ff1bf8> 22.5

Ein Funktionsaufruf muss immer in Klammern gesetzt werden, sonst erhält man die Speicheradresse des Funktionsobjekts. Wenn wir also die Funktion mit dem Namen report aufrufen und ihr den Wert 22.5 geben wollen, könnten wir unseren Funktionsaufruf wie folgt formulieren

PYTHON

print("calling")
report(22.5)

AUSGABE

calling
pressure is 22.5
Aufgabe

Reihenfolge der Operationen

  1. Was ist in diesem Beispiel falsch?

PYTHON

result = print_time(11, 37, 59)

def print_time(hour, minute, second):
   time_string = str(hour) + ':' + str(minute) + ':' + str(second)
   print(time_string)
  1. Erläutern Sie nach der Lösung des obigen Problems, warum dieser Beispielcode ausgeführt wird:

PYTHON

result = print_time(11, 37, 59)
print('result of call is:', result)

ergibt diese Ausgabe:

AUSGABE

11:37:59
result of call is: None
  1. Warum ist das Ergebnis des Aufrufs None?
  1. Das Problem bei diesem Beispiel ist, dass die Funktion print_time() erst nach dem Aufruf der Funktion definiert wird. Python weiß nicht, wie es den Namen print_time auflösen soll, da er noch nicht definiert wurde, und wird ein NameError auslösen, z.B. NameError: name 'print_time' is not defined

  2. Die erste Zeile der Ausgabe 11:37:59 wird von der ersten Codezeile result = print_time(11, 37, 59) gedruckt, die den durch den Aufruf von print_time zurückgegebenen Wert an die Variable result bindet. Die zweite Zeile stammt aus dem zweiten Druckaufruf, um den Inhalt der Variablen result zu drucken.

  3. print_time() nicht explizit return einen Wert, so dass es automatisch None zurückgibt.

Aufgabe

Einkapselung

Füllen Sie die Leerzeichen aus, um eine Funktion zu erstellen, die einen einzelnen Dateinamen als Argument nimmt, die Daten in die durch das Argument benannte Datei lädt und den Mindestwert in diesen Daten zurückgibt.

PYTHON

import pandas as pd

def min_in_data(____):
    data = ____
    return ____

PYTHON

import pandas as pd

def min_in_data(filename):
    data = pd.read_csv(filename)
    return data.min()
Aufgabe

Finde die erste

Füllen Sie die Lücken aus, um eine Funktion zu erstellen, die eine Liste von Zahlen als Argument nimmt und den ersten negativen Wert in der Liste zurückgibt. Was macht Ihre Funktion, wenn die Liste leer ist? Was ist, wenn die Liste keine negativen Zahlen enthält?

PYTHON

def first_negative(values):
    for v in ____:
        if ____:
            return ____

PYTHON

def first_negative(values):
    for v in values:
        if v < 0:
            return v

Wenn eine leere Liste oder eine Liste mit allen positiven Werten an diese Funktion übergeben wird, gibt sie None zurück:

PYTHON

my_list = []
print(first_negative(my_list))

AUSGABE

None
Aufgabe

Aufruf durch Name

Vorhin haben wir diese Funktion gesehen:

PYTHON

def print_date(year, month, day):
    joined = str(year) + '/' + str(month) + '/' + str(day)
    print(joined)

Wir haben gesehen, dass wir die Funktion mit benannten Argumenten aufrufen können, etwa so:

PYTHON

print_date(day=1, month=2, year=2003)
  1. Was gibt print_date(day=1, month=2, year=2003) aus?
  2. Wann haben Sie schon einmal einen Funktionsaufruf wie diesen gesehen?
  3. Wann und warum ist es sinnvoll, Funktionen auf diese Weise aufzurufen?
  1. 2003/2/1
  2. Wir haben Beispiele für die Verwendung von benannten Argumenten bei der Arbeit mit der Pandas-Bibliothek gesehen. Wenn man zum Beispiel einen Datensatz mit data = pd.read_csv('data/gapminder_gdp_europe.csv', index_col='country') einliest, ist das letzte Argument index_col ein benanntes Argument.
  3. Die Verwendung von benannten Argumenten kann den Code lesbarer machen, da man aus dem Funktionsaufruf erkennen kann, welchen Namen die verschiedenen Argumente innerhalb der Funktion haben. Es kann auch die Wahrscheinlichkeit verringern, dass Argumente in der falschen Reihenfolge übergeben werden, da bei der Verwendung von benannten Argumenten die Reihenfolge keine Rolle spielt.
Aufgabe

Einkapselung eines If/Print-Blocks

Der folgende Code wird auf einem Etikettendrucker für Hühnereier ausgeführt. Eine digitale Waage meldet dem Computer die Masse eines Hühnereis (in Gramm) und der Computer druckt dann ein Etikett.

PYTHON

import random
for i in range(10):

    # simulating the mass of a chicken egg
    # the (random) mass will be 70 +/- 20 grams
    mass = 70 + 20.0 * (2.0 * random.random() - 1.0)

    print(mass)

    # egg sizing machinery prints a label
    if mass >= 85:
        print("jumbo")
    elif mass >= 70:
        print("large")
    elif mass < 70 and mass >= 55:
        print("medium")
    else:
        print("small")

Der if-Block, der die Eier klassifiziert, könnte auch in anderen Situationen nützlich sein. Um eine Wiederholung zu vermeiden, könnten wir ihn in eine Funktion falten, get_egg_label(). Wenn wir das Programm überarbeiten, um die Funktion zu verwenden, würden wir folgendes erhalten:

PYTHON

# revised version
import random
for i in range(10):

    # simulating the mass of a chicken egg
    # the (random) mass will be 70 +/- 20 grams
    mass = 70 + 20.0 * (2.0 * random.random() - 1.0)

    print(mass, get_egg_label(mass))
  1. Erstellen Sie eine Funktionsdefinition für get_egg_label(), die mit dem überarbeiteten Programm oben funktionieren wird. Beachten Sie, dass der Rückgabewert der Funktion get_egg_label() wichtig sein wird. Die Beispielausgabe des obigen Programms wäre 71.23 large.
  2. Ein schmutziges Ei könnte eine Masse von mehr als 90 Gramm haben, und ein verdorbenes oder zerbrochenes Ei hat wahrscheinlich eine Masse von weniger als 50 Gramm. Ändern Sie Ihre Funktion get_egg_label(), um diese Fehlerbedingungen zu berücksichtigen. Eine Beispielausgabe könnte 25 too light, probably spoiled sein.

PYTHON

def get_egg_label(mass):
    # egg sizing machinery prints a label
    egg_label = "Unlabelled"
    if mass >= 90:
        egg_label = "warning: egg might be dirty"
    elif mass >= 85:
        egg_label = "jumbo"
    elif mass >= 70:
        egg_label = "large"
    elif mass < 70 and mass >= 55:
        egg_label = "medium"
    elif mass < 50:
        egg_label = "too light, probably spoiled"
    else:
        egg_label = "small"
    return egg_label
Aufgabe

Verkapselnde Datenanalyse

Nehmen Sie an, dass der folgende Code ausgeführt wurde:

PYTHON

import pandas as pd

data_asia = pd.read_csv('data/gapminder_gdp_asia.csv', index_col=0)
japan = data_asia.loc['Japan']
  1. Vervollständigen Sie die nachstehenden Aussagen, um das durchschnittliche BIP Japans über die für die 1980er Jahre angegebenen Jahre zu erhalten.

PYTHON

year = 1983
gdp_decade = 'gdpPercap_' + str(year // ____)
avg = (japan.loc[gdp_decade + ___] + japan.loc[gdp_decade + ___]) / 2
  1. Fassen Sie den obigen Code in einer einzigen Funktion zusammen.

PYTHON

def avg_gdp_in_decade(country, continent, year):
    data_countries = pd.read_csv('data/gapminder_gdp_'+___+'.csv',delimiter=',',index_col=0)
    ____
    ____
    ____
    return avg
  1. Wie würden Sie diese Funktion verallgemeinern, wenn Sie im Voraus nicht wüssten, welche spezifischen Jahre als Spalten in den Daten vorkommen? Was wäre zum Beispiel, wenn wir für jedes Jahrzehnt auch Daten von Jahren hätten, die mit 1 und 9 enden? (Tipp: Verwenden Sie die Spalten, um die Spalten herauszufiltern, die dem Jahrzehnt entsprechen, anstatt sie im Code aufzuzählen)
  1. Das durchschnittliche BIP für Japan über die Jahre, die für die 1980er Jahre berichtet werden, wird mit berechnet:

PYTHON

year = 1983
gdp_decade = 'gdpPercap_' + str(year // 10)
avg = (japan.loc[gdp_decade + '2'] + japan.loc[gdp_decade + '7']) / 2
  1. Dieser Code als Funktion ist:

PYTHON

def avg_gdp_in_decade(country, continent, year):
    data_countries = pd.read_csv('data/gapminder_gdp_' + continent + '.csv', index_col=0)
    c = data_countries.loc[country]
    gdp_decade = 'gdpPercap_' + str(year // 10)
    avg = (c.loc[gdp_decade + '2'] + c.loc[gdp_decade + '7'])/2
    return avg
  1. Um den Durchschnitt für die betreffenden Jahre zu erhalten, müssen wir eine Schleife über sie ziehen:

PYTHON

def avg_gdp_in_decade(country, continent, year):
    data_countries = pd.read_csv('data/gapminder_gdp_' + continent + '.csv', index_col=0)
    c = data_countries.loc[country]
    gdp_decade = 'gdpPercap_' + str(year // 10)
    total = 0.0
    num_years = 0
    for yr_header in c.index: # c's index contains reported years
        if yr_header.startswith(gdp_decade):
            total = total + c.loc[yr_header]
            num_years = num_years + 1
    return total/num_years

Die Funktion kann nun aufgerufen werden durch:

PYTHON

avg_gdp_in_decade('Japan','asia',1983)

AUSGABE

20880.023800000003
Aufgabe

Simulation eines dynamischen Systems

In der Mathematik ist ein dynamisches System ein System, in dem eine Funktion die Zeitabhängigkeit eines Punktes in einem geometrischen Raum beschreibt. Ein kanonisches Beispiel für ein dynamisches System ist die logistische Karte, ein Wachstumsmodell, das eine neue Bevölkerungsdichte (zwischen 0 und 1) auf der Grundlage der aktuellen Dichte berechnet. In diesem Modell nimmt die Zeit die diskreten Werte 0, 1, 2, …

  1. Definieren Sie eine Funktion namens logistic_map, die zwei Eingaben benötigt: x, die die aktuelle Bevölkerung (zum Zeitpunkt t) darstellt, und einen Parameter r = 1. Diese Funktion sollte einen Wert zurückgeben, der den Zustand des Systems (der Population) zum Zeitpunkt t + 1 repräsentiert, wobei die Abbildungsfunktion verwendet wird:

f(t+1) = r * f(t) * [1 - f(t)]

  1. Iterieren Sie die in Teil 1 definierte Funktion logistic_map ausgehend von einer Grundgesamtheit von 0,5 über einen Zeitraum von t_final = 10 in einer Schleife for oder while. Speichern Sie die Zwischenergebnisse in einer Liste, so dass Sie nach Beendigung der Schleife eine Folge von Werten haben, die den Zustand der logistischen Karte zu Zeiten t = [0,1,...,t_final] (insgesamt 11 Werte) darstellen. Drucken Sie diese Liste aus, um die Entwicklung der Population zu sehen.

  2. Kapseln Sie die Logik Ihrer Schleife in eine Funktion mit dem Namen iterate, die die Ausgangsbevölkerung als erste Eingabe, den Parameter t_final als zweite Eingabe und den Parameter r als dritte Eingabe erhält. Die Funktion sollte die Liste der Werte zurückgeben, die den Zustand der logistischen Karte zu den Zeitpunkten t = [0,1,...,t_final] darstellen. Führen Sie diese Funktion für die Zeiträume t_final = 100 und 1000 aus und geben Sie einige der Werte aus. Entwickelt sich die Bevölkerung zu einem stabilen Zustand?

PYTHON

def logistic_map(x, r):
    return r * x * (1 - x)

PYTHON

initial_population = 0.5
t_final = 10
r = 1.0
population = [initial_population]

for t in range(t_final):
    population.append( logistic_map(population[t], r) )

PYTHON

def iterate(initial_population, t_final, r):
    population = [initial_population]
    for t in range(t_final):
        population.append( logistic_map(population[t], r) )
    return population

for period in (10, 100, 1000):
    population = iterate(0.5, period, 1)
    print(population[-1])

AUSGABE

0.06945089389714401
0.009395779870614648
0.0009913908614406382

Die Bevölkerung scheint sich dem Nullpunkt zu nähern.

Wichtig

Verwendung von Funktionen mit Konditionalen in Pandas

Funktionen enthalten oft Konditionale. Hier ist ein kurzes Beispiel, das anzeigt, in welchem Quartil sich das Argument befindet, basierend auf handcodierten Werten für die Quartilsschnittpunkte.

PYTHON

def calculate_life_quartile(exp):
    if exp < 58.41:
        # This observation is in the first quartile
        return 1
    elif exp >= 58.41 and exp < 67.05:
        # This observation is in the second quartile
       return 2
    elif exp >= 67.05 and exp < 71.70:
        # This observation is in the third quartile
       return 3
    elif exp >= 71.70:
        # This observation is in the fourth quartile
       return 4
    else:
        # This observation has bad data
       return None

calculate_life_quartile(62.5)

AUSGABE

2

Diese Funktion würde typischerweise innerhalb einer for-Schleife verwendet werden, aber Pandas hat einen anderen, effizienteren Weg, das Gleiche zu tun, und zwar durch Anwendung einer Funktion auf einen Datenrahmen oder einen Teil eines Datenrahmens. Hier ist ein Beispiel, das die obige Definition verwendet.

PYTHON

data = pd.read_csv('data/gapminder_all.csv')
data['life_qrtl'] = data['lifeExp_1952'].apply(calculate_life_quartile)

Diese zweite Zeile enthält eine ganze Menge, also gehen wir sie Stück für Stück durch. Auf der rechten Seite von = beginnen wir mit data['lifeExp'], das ist die Spalte in dem Datenrahmen namens data mit der Bezeichnung lifExp. Wir benutzen apply(), um das zu tun, was es sagt, nämlich calculate_life_quartile auf den Wert dieser Spalte für jede Zeile des Datenrahmens anzuwenden.

Hauptpunkte
  • Zerlegen Sie Programme in Funktionen, um sie besser verstehen zu können.
  • Definieren Sie eine Funktion mit def mit einem Namen, Parametern und einem Codeblock.
  • Die Definition einer Funktion führt sie nicht aus.
  • Argumente in einem Funktionsaufruf werden mit ihren definierten Parametern abgeglichen.
  • Funktionen können mit return ein Ergebnis an ihren Aufrufer zurückgeben.

Content from Variablenumfang


Zuletzt aktualisiert am 2025-11-05 | Diese Seite bearbeiten

Geschätzte Zeit: 20 Minuten

Übersicht

Fragen

  • Wie funktionieren eigentlich Funktionsaufrufe?
  • Wie kann ich feststellen, wo Fehler aufgetreten sind?

Ziele

  • Identifizieren Sie lokale und globale Variablen.
  • Identifizieren Sie Parameter als lokale Variablen.
  • Lies einen Traceback und bestimme die Datei, Funktion und Zeilennummer, in der der Fehler aufgetreten ist, den Fehlertyp und die Fehlermeldung.

Der Geltungsbereich (Englisch: scope) einer Variablen ist der Teil eines Programms, der diese Variable ‘sehen’ kann.


  • Es gibt nur so viele sinnvolle Namen für Variablen.
  • Leute, die Funktionen benutzen, sollten sich nicht darum kümmern müssen, welche Variablennamen der Autor der Funktion benutzt hat.
  • Leute, die Funktionen schreiben, sollten sich nicht darum kümmern müssen, welche Variablennamen der Funktionsaufrufer verwendet.
  • Der Teil eines Programms, in dem eine Variable sichtbar ist, wird ihr Scope genannt.

PYTHON

pressure = 103.9

def adjust(t):
    temperature = t * 1.43 / pressure
    return temperature
  • pressure ist eine globale Variable.
    • Definiert außerhalb einer bestimmten Funktion.
    • Überall sichtbar.
  • t und temperature sind lokale Variablen in adjust.
    • Definiert in der Funktion.
    • Nicht sichtbar im Hauptprogramm.
    • Erinnern Sie sich: Ein Funktionsparameter ist eine Variable, der automatisch ein Wert zugewiesen wird, wenn die Funktion aufgerufen wird.

PYTHON

print('adjusted:', adjust(0.9))
print('temperature after call:', temperature)

AUSGABE

adjusted: 0.01238691049085659

FEHLER

Traceback (most recent call last):
  File "/Users/swcarpentry/foo.py", line 8, in <module>
    print('temperature after call:', temperature)
NameError: name 'temperature' is not defined
Diskussion

Verwendung von lokalen und globalen Variablen

Verfolge die Werte aller Variablen in diesem Programm, während es ausgeführt wird. (Verwenden Sie ‘—’ als Wert der Variablen, bevor und nachdem sie existieren.)

PYTHON

limit = 100

def clip(value):
    return min(max(0.0, value), limit)

value = -22.5
print(clip(value))
Aufgabe

Lesen von Fehlermeldungen

Lesen Sie den Traceback unten, und identifizieren Sie das Folgende:

  1. Wie viele Ebenen hat der Traceback?
  2. Wie lautet der Name der Datei, in der der Fehler aufgetreten ist?
  3. Wie lautet der Name der Funktion, bei der der Fehler aufgetreten ist?
  4. Bei welcher Zeilennummer in dieser Funktion ist der Fehler aufgetreten?
  5. Um welche Art von Fehler handelt es sich?
  6. Wie lautet die Fehlermeldung?

FEHLER

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-2-e4c4cbafeeb5> in <module>()
      1 import errors_02
----> 2 errors_02.print_friday_message()

/Users/ghopper/thesis/code/errors_02.py in print_friday_message()
     13
     14 def print_friday_message():
---> 15     print_message("Friday")

/Users/ghopper/thesis/code/errors_02.py in print_message(day)
      9         "sunday": "Aw, the weekend is almost over."
     10     }
---> 11     print(messages[day])
     12
     13

KeyError: 'Friday'
  1. Drei Ebenen.
  2. errors_02.py
  3. print_message
  4. Zeile 11
  5. KeyError. Diese Fehler treten auf, wenn versucht wird, einen Schlüssel nachzuschlagen, der nicht vorhanden ist (normalerweise in einer Datenstruktur wie einem Wörterbuch). Weitere Informationen über KeyError und andere eingebaute Ausnahmen finden Sie in den Python docs.
  6. KeyError: 'Friday'
Hauptpunkte
  • Der Geltungsbereich einer Variablen ist der Teil eines Programms, der diese Variable ‘sehen’ kann.

Content from Programmierstil


Zuletzt aktualisiert am 2025-11-05 | Diese Seite bearbeiten

Geschätzte Zeit: 30 Minuten

Übersicht

Fragen

  • Wie kann ich meine Programme besser lesbar machen?
  • Wie formatieren die meisten Programmierer ihren Code?
  • Wie können Programme ihre eigene Funktion überprüfen?

Ziele

  • Begründen Sie die grundlegenden Regeln des Kodierungsstils.
  • Refactor one-page programs to make them more readable and justify the changes.
  • Verwenden Sie die Python Community Coding Standards (PEP-8).

Kodierungsstil


Ein konsistenter Kodierungsstil hilft anderen (einschließlich unserer zukünftigen Selbst), den Code leichter zu lesen und zu verstehen. Code wird viel öfter gelesen als geschrieben, und wie es im Zen of Python heißt, “Lesbarkeit zählt”. Python hat mit einem seiner ersten Python Enhancement Proposals (PEP), PEP8, einen Standardstil vorgeschlagen.

Einige Punkte, die hervorzuheben sind:

  • Dokumentieren Sie Ihren Code und stellen Sie sicher, dass Annahmen, interne Algorithmen, erwartete Eingaben, erwartete Ausgaben, etc. klar sind
  • Verwenden Sie klare, semantisch sinnvolle Variablennamen
  • Verwenden Sie Leerzeichen, nicht Tabulatoren, um Zeilen einzurücken (Tabulatoren können in verschiedenen Texteditoren, Betriebssystemen und Versionskontrollsystemen Probleme verursachen)

Befolgen Sie den Standard-Python-Stil in Ihrem Code.


  • PEP8: eine Stilanleitung für Python, die Themen wie die Benennung von Variablen, das Einrücken von Code, die Strukturierung von import-Anweisungen usw. behandelt. Die Einhaltung von PEP8 macht es für andere Python-Entwickler einfacher, Ihren Code zu lesen und zu verstehen, und zu wissen, wie ihre Beiträge aussehen sollten.
  • Um Ihren Code auf die Einhaltung von PEP8 zu überprüfen, können Sie die pycodestyle Anwendung verwenden und Werkzeuge wie der black code formatter können Ihren Code automatisch so formatieren, dass er mit PEP8 und pycodestyle konform ist (es gibt auch einen Jupyter notebook formatter nb_black).
  • Einige Gruppen und Organisationen folgen anderen Stilrichtlinien als PEP8. Der [Google style guide on Python] (https://google.github.io/styleguide/pyguide.html) gibt zum Beispiel leicht abweichende Empfehlungen. Google hat eine Anwendung geschrieben, die Ihnen dabei helfen kann, Ihren Code entweder nach ihrem Stil oder nach PEP8 zu formatieren: yapf.
  • In Bezug auf den Kodierungsstil ist der Schlüssel Konsistenz. Wählen Sie einen Stil für Ihr Projekt, sei es PEP8, der Google-Stil oder etwas anderes, und tun Sie Ihr Bestes, um sicherzustellen, dass Sie und alle anderen, mit denen Sie zusammenarbeiten, sich daran halten. Die Konsistenz innerhalb eines Projekts ist oft wichtiger als der verwendete Stil. Ein einheitlicher Stil macht Ihre Software für andere und für Sie selbst einfacher zu lesen und zu verstehen.

Verwenden Sie Assertions, um auf interne Fehler zu prüfen.


Assertions sind eine einfache, aber mächtige Methode, um sicherzustellen, dass der Kontext, in dem Ihr Code ausgeführt wird, so ist, wie Sie es erwarten.

PYTHON

def calc_bulk_density(mass, volume):
    '''Return dry bulk density = powder mass / powder volume.'''
    assert volume > 0
    return mass / volume

Wenn die Behauptung False ist, löst der Python-Interpreter eine AssertionError-Laufzeit-Ausnahme aus. Der Quellcode des fehlgeschlagenen Ausdrucks wird als Teil der Fehlermeldung angezeigt. Um Behauptungen in Ihrem Code zu ignorieren, führen Sie den Interpreter mit dem Schalter ‘-O’ (optimize) aus. Behauptungen sollten nur einfache Prüfungen enthalten und niemals den Zustand des Programms verändern. Zum Beispiel sollte eine Assertion niemals eine Zuweisung enthalten.

Verwenden Sie docstrings, um eingebaute Hilfe bereitzustellen.


Wenn das erste Ding in einer Funktion eine Zeichenkette ist, die nicht direkt einer Variablen zugewiesen ist, fügt Python sie an die Funktion an, die über die eingebaute Hilfefunktion zugänglich ist. Diese dokumentierende Zeichenkette wird auch als Docstring bezeichnet.

PYTHON

def average(values):
    "Return average of values, or None if no values are supplied."

    if len(values) == 0:
        return None
    return sum(values) / len(values)

help(average)

AUSGABE

Help on function average in module __main__:

average(values)
    Return average of values, or None if no values are supplied.
Wichtig

Mehrzeilige Zeichenketten

Verwenden Sie oft multiline strings für die Dokumentation. Diese beginnen und enden mit drei Anführungszeichen (entweder einfach oder doppelt) und enden mit drei passenden Zeichen.

PYTHON

"""This string spans
multiple lines.

Blank lines are allowed."""
Diskussion

Was wird angezeigt?

Markieren Sie die Zeilen im folgenden Code, die als Online-Hilfe verfügbar sein werden. Gibt es Zeilen, die verfügbar gemacht werden sollten, aber nicht verfügbar sind? Gibt es Zeilen, die einen Syntaxfehler oder einen Laufzeitfehler verursachen?

PYTHON

"Find maximum edit distance between multiple sequences."
# This finds the maximum distance between all sequences.

def overall_max(sequences):
    '''Determine overall maximum edit distance.'''

    highest = 0
    for left in sequences:
        for right in sequences:
            '''Avoid checking sequence against itself.'''
            if left != right:
                this = edit_distance(left, right)
                highest = max(highest, this)

    # Report.
    return highest
Aufgabe

Dokumentieren Sie dies

Verwenden Sie Kommentare, um potentiell unintuitive Abschnitte oder einzelne Codezeilen zu beschreiben und anderen zu helfen, sie zu verstehen. Sie sind besonders nützlich für alle, die Ihren Code in Zukunft verstehen und bearbeiten müssen, einschließlich Ihnen selbst.

Verwenden Sie docstrings, um die zulässigen Eingaben und erwarteten Ausgaben einer Methode oder Klasse, ihren Zweck, ihre Annahmen und ihr beabsichtigtes Verhalten zu dokumentieren. Docstrings werden angezeigt, wenn ein Benutzer die eingebaute Methode help für Ihre Methode oder Klasse aufruft.

Verwandeln Sie den Kommentar in der folgenden Funktion in einen docstring und überprüfen Sie, ob help ihn richtig anzeigt.

PYTHON

def middle(a, b, c):
    # Return the middle value of three.
    # Assumes the values can actually be compared.
    values = [a, b, c]
    values.sort()
    return values[1]

PYTHON

def middle(a, b, c):
    '''Return the middle value of three.
    Assumes the values can actually be compared.'''
    values = [a, b, c]
    values.sort()
    return values[1]
Aufgabe

Diesen Code aufräumen

  1. Lesen Sie dieses kurze Programm und versuchen Sie zu erraten, was es tut.
  2. Führen Sie es aus: Wie genau war Ihre Vorhersage?
  3. Refaktorieren Sie das Programm, um es lesbarer zu machen. Denken Sie daran, es nach jeder Änderung auszuführen, um sicherzustellen, dass sich sein Verhalten nicht geändert hat.
  4. Vergleichen Sie Ihren Rewrite mit dem Ihres Nachbarn. Was haben Sie gleich gemacht? Was haben Sie anders gemacht, und warum?

PYTHON

n = 10
s = 'et cetera'
print(s)
i = 0
while i < n:
    # print('at', j)
    new = ''
    for j in range(len(s)):
        left = j-1
        right = (j+1)%len(s)
        if s[left]==s[right]: new = new + '-'
        else: new = new + '*'
    s=''.join(new)
    print(s)
    i += 1

Hier ist eine Lösung.

PYTHON

def string_machine(input_string, iterations):
    """
    Takes input_string and generates a new string with -'s and *'s
    corresponding to characters that have identical adjacent characters
    or not, respectively.  Iterates through this procedure with the resultant
    strings for the supplied number of iterations.
    """
    print(input_string)
    input_string_length = len(input_string)
    old = input_string
    for i in range(iterations):
        new = ''
        # iterate through characters in previous string
        for j in range(input_string_length):
            left = j-1
            right = (j+1) % input_string_length  # ensure right index wraps around
            if old[left] == old[right]:
                new = new + '-'
            else:
                new = new + '*'
        print(new)
        # store new string as old
        old = new     

string_machine('et cetera', 10)

AUSGABE

et cetera
*****-***
----*-*--
---*---*-
--*-*-*-*
**-------
***-----*
--**---**
*****-***
----*-*--
---*---*-
Hauptpunkte
  • Befolgen Sie den Standard-Python-Stil in Ihrem Code.
  • Verwenden Sie docstrings, um eingebaute Hilfe bereitzustellen.

Content from Nachbereitung


Zuletzt aktualisiert am 2025-03-02 | Diese Seite bearbeiten

Geschätzte Zeit: 20 Minuten

Übersicht

Fragen

  • Was haben wir gelernt?
  • Was gibt es sonst noch und wo finde ich es?

Ziele

  • Nennen und lokalisieren Sie wissenschaftliche Python-Community-Seiten für Software, Workshops und Hilfe.

Leslie Lamport sagte einmal: “Schreiben ist die Art der Natur, dir zu zeigen, wie schlampig dein Denken ist.” Das Gleiche gilt für das Programmieren: Viele Dinge, die offensichtlich erscheinen, wenn wir über sie nachdenken, erweisen sich als etwas anderes, wenn wir sie genau erklären müssen.

Python unterstützt eine große und vielfältige Gemeinschaft im akademischen Bereich und in der Industrie.


Hauptpunkte
  • Python unterstützt eine große und vielfältige Gemeinschaft im akademischen Bereich und in der Industrie.

Content from Rückmeldung


Zuletzt aktualisiert am 2025-03-02 | Diese Seite bearbeiten

Geschätzte Zeit: 15 Minuten

Übersicht

Fragen

  • Wie ist der Kurs gelaufen?

Ziele

  • Sammeln Sie Feedback zum Kurs

Sammeln Sie das Feedback der Teilnehmer.

Hauptpunkte
  • Wir sind ständig bemüht, diesen Kurs zu verbessern.