Kapitel 1. Programmieren als eine Art zu denken

Diese Arbeit wurde mithilfe von KI übersetzt. Wir freuen uns über dein Feedback und deine Kommentare: translation-feedback@oreilly.com

Das erste Ziel dieses Buches ist es, dir beizubringen, wie man in Python programmiert. Programmieren zu lernen bedeutet aber auch, eine neue Denkweise zu erlernen. Deshalb ist das zweite Ziel dieses Buches, dir zu helfen, wie ein Informatiker zu denken. Diese Denkweise vereint einige der besten Eigenschaften von Mathematik, Ingenieur- und Naturwissenschaften. Wie Mathematiker/innen verwenden Informatiker/innen formale Sprachen, um Ideen - insbesondere Berechnungen - zu bezeichnen. Wie Ingenieure entwerfen sie Dinge, indem sie Komponenten zu Systemen zusammensetzen und Kompromisse zwischen Alternativen abwägen. Wie Wissenschaftler/innen beobachten sie das Verhalten komplexer Systeme, stellen Hypothesen auf und testen Vorhersagen.

Wir beginnen mit den grundlegenden Elementen des Programmierens und arbeiten uns dann nach oben. In diesem Kapitel erfährst du, wie Python Zahlen, Buchstaben und Wörter darstellt. Und du lernst, wie du arithmetische Operationen durchführst.

Du wirst auch anfangen, das Vokabular der Programmierung zu lernen, einschließlich Begriffen wie Operator, Ausdruck, Wert und Typ. Dieses Vokabular ist wichtig - du wirst es brauchen, um den Rest des Buches zu verstehen, um mit anderen Programmierern zu kommunizieren und um virtuelle Assistenten zu nutzen und zu verstehen.

Arithmetische Operatoren

Ein arithmetischer Operator ist ein Symbol, das eine arithmetische Berechnung darstellt. Das Pluszeichen, +, führt zum Beispiel eine Addition durch:

30 + 12
       
42
       

Das Minuszeichen, , ist der Operator, der die Subtraktion durchführt:

43 - 1
       
42
       

Das Sternchen, *, führt die Multiplikation durch:

6 * 7
       
42
       

Und der Schrägstrich, /, führt die Division durch:

84 / 2
       
42.0
       

Beachte, dass das Ergebnis der Division 42.0 und nicht 42 ist. Das liegt daran, dass es in Python zwei Arten von Zahlen gibt:

  • Ganzzahlen, die ganze Zahlen darstellen, und

  • Fließkommazahlen, die Zahlen mit einem Dezimalpunkt darstellen.

Wenn du zwei ganze Zahlen addierst, subtrahierst oder multiplizierst, ist das Ergebnis eine ganze Zahl. Wenn du aber zwei ganze Zahlen teilst, ist das Ergebnis eine Fließkommazahl. Python bietet einen weiteren Operator, //, der eine ganzzahlige Division durchführt. Das Ergebnis einer Ganzzahldivision ist immer eine ganze Zahl:

84 // 2
       
42
       

Die Ganzzahlendivision wird auch "Bodendivision" genannt, weil sie immer nach unten (zum "Boden" hin) rundet:

85 // 2
       
42
       

Der Operator ** schließlich führt eine Potenzierung durch, d.h. erhöht eine Zahl auf eine Potenz:

7 ** 2
       
49
       

In einigen anderen Sprachen wird das Caret, ^, für die Potenzierung verwendet, aber in Python ist es ein bitweiser Operator namens XOR. Wenn du mit bitweisen Operatoren nicht vertraut bist, könnte das Ergebnis unerwartet sein:

7 ^ 2
       
5
       

Ich werde in diesem Buch nicht auf bitweise Operatoren eingehen, aber du kannst sie unter http://wiki.python.org/moin/BitwiseOperators nachlesen .

Ausdrücke

Eine Sammlung von Operatoren und Zahlen nennt man einen Ausdruck. Ein Ausdruck kann eine beliebige Anzahl von Operatoren und Zahlen enthalten. Hier ist zum Beispiel ein Ausdruck, der zwei Operatoren enthält:

6 + 6 ** 2
       
42
       

Beachte, dass die Potenzierung vor der Addition erfolgt. Python folgt der Reihenfolge der Operationen, die du vielleicht im Matheunterricht gelernt hast: Die Potenzierung erfolgt vor der Multiplikation und Division, die wiederum vor der Addition und Subtraktion erfolgen.

Im folgenden Beispiel kommt die Multiplikation vor der Addition:

12 + 5 * 6
        
42
        

Wenn du willst, dass die Addition zuerst erfolgt, kannst du Klammern verwenden:

(12 + 5) * 6
        
102
        

Jeder Ausdruck hat einen Wert. Zum Beispiel hat der Ausdruck 6 * 7 den Wert 42.

Arithmetische Funktionen

Zusätzlich zu den arithmetischen Operatoren bietet Python einige Funktionen, die mit Zahlen arbeiten. Die Funktion round nimmt zum Beispiel eine Fließkommazahl und rundet sie auf die nächste ganze Zahl ab:

round(42.4)
        
42
        
round(42.6)
        
43
        

Die Funktion abs berechnet den absoluten Wert einer Zahl. Bei einer positiven Zahl ist der absolute Wert die Zahl selbst:

abs(42)
        
42
        

Bei einer negativen Zahl ist der absolute Wert positiv:

abs(-42)
        
42
        

Wenn wir eine Funktion wie diese verwenden, sagen wir, dass wir die Funktion aufrufen. Ein Ausdruck, der eine Funktion aufruft, ist ein Funktionsaufruf.

Wenn du eine Funktion aufrufst, sind die Klammern erforderlich. Wenn du sie weglässt, erhältst du eine Fehlermeldung:

abs 42
        
  Cell In[18], line 1
    abs 42
        ^
SyntaxError: invalid syntax
        

Die erste Zeile dieser Meldung kannst du ignorieren; sie enthält keine Informationen, die wir im Moment verstehen müssen. Die zweite Zeile ist der Code, der den Fehler enthält, mit einem Caret (^) darunter, um anzuzeigen, wo der Fehler entdeckt wurde.

Die letzte Zeile zeigt an, dass es sich um einen Syntaxfehler handelt, was bedeutet, dass etwas mit der Struktur des Ausdrucks nicht stimmt. In diesem Beispiel besteht das Problem darin, dass ein Funktionsaufruf Klammern erfordert.

Schauen wir mal, was passiert, wenn du die Klammern und den Wert weglässt:

abs
        
<function abs(x, /)>
        

Ein Funktionsname an sich ist ein legaler Ausdruck, der einen Wert hat. Wenn er angezeigt wird, zeigt der Wert an, dass abs eine Funktion ist, und er enthält einige zusätzliche Informationen, die ich später erklären werde.

Strings

Neben Zahlen kann Python auch Buchstabenfolgen darstellen, die Strings genannt werden, weil die Buchstaben wie Perlen an einer Kette aufgereiht sind. Um eine Zeichenkette zu schreiben, können wir eine Folge von Buchstaben in gerade Anführungszeichen setzen:

'Hello'
        
'Hello'
        

Es ist auch legal, doppelte Anführungszeichen zu verwenden:

"world"
        
'world'
        

Doppelte Anführungszeichen machen es einfach, eine Zeichenkette zu schreiben, die ein Apostroph enthält, das das gleiche Symbol wie ein gerades Anführungszeichen ist:

"it's a small "
        
"it's a small "
        

Strings können auch Leerzeichen, Satzzeichen und Ziffern enthalten:

'Well, '
        
'Well, '
        

Der + Operator funktioniert mit Zeichenketten; er fügt zwei Zeichenketten zu einer einzigen Zeichenkette zusammen, was alsVerkettung bezeichnet wird:

'Well, ' + "it's a small " + 'world.'
        
"Well, it's a small world."
        

Der * Operator funktioniert auch mit Zeichenketten; er erstellt mehrere Kopien einer Zeichenkette und verkettet sie:

'Spam, ' * 4
        
'Spam, Spam, Spam, Spam, '
        

Die anderen arithmetischen Operatoren funktionieren nicht mit Strings.

Python bietet eine Funktion namens len, die die Länge einer Zeichenkette berechnet:

len('Spam')
        
4
        

Beachte, dass len die Buchstaben zwischen den Anführungszeichen zählt, aber nicht die Anführungszeichen.

Wenn du eine Zeichenfolge erstellst, achte darauf, dass du gerade Anführungszeichen verwendest. Das hintere Anführungszeichen, auch Backtick genannt, verursacht einen Syntaxfehler:

        `Hello`
        
  Cell In[49], line 1
    `Hello`
    ^
SyntaxError: invalid syntax
        

Intelligente Anführungszeichen, auch bekannt als geschweifte Anführungszeichen, sind ebenfalls illegal.

Werte und Typen

Bis jetzt haben wir drei Arten von Werten gesehen:

  • 2 ist eine ganze Zahl,

  • 42.0 ist eine Gleitkommazahl und

  • 'Hello' ist eine Zeichenkette.

Eine Art von Wert wird als Typ bezeichnet. Jeder Wert hat einen Typ - oder wir sagen manchmal, er "gehört" zu einem Typ.

Python bietet eine Funktion namens type, die dir den Typ eines beliebigen Wertes sagt. Der Typ einer Ganzzahl ist int:

type(2)
        
int
        

Der Typ einer Gleitkommazahl ist float:

type(42.0)
        
float
        

Und der Typ eines Strings ist str:

type('Hello, World!')
        
str
        

Die Typen int, float und str können als Funktionen verwendet werden. int kann zum Beispiel eine Fließkommazahl in eine ganze Zahl umwandeln (immer abrunden):

int(42.9)
        
42
        

Und float kann eine ganze Zahl in eine Gleitkommazahl umwandeln:

float(42)
        
42.0
        

Hier ist etwas, das verwirrend sein kann. Was erhältst du, wenn du eine Ziffernfolge in Anführungszeichen setzt?

'126'
        
'126'
        

Sie sieht aus wie eine Zahl, ist aber eigentlich eine Zeichenkette:

type('126')
        
str
        

Wenn du versuchst, sie wie eine Zahl zu verwenden, kann es sein, dass eine Fehlermeldung erhält:

'126' / 3
        
TypeError: unsupported operand type(s) for /: 'str' and 'int'
        

Dieses Beispiel erzeugt einen TypeError, was bedeutet, dass die Werte im Ausdruck, die Operanden genannt werden, den falschen Typ haben. Die Fehlermeldung zeigt an, dass der / Operator die Typen dieser Werte, nämlich str und int, nicht unterstützt.

Wenn du einen String hast, der Ziffern enthält, kannst du ihn mit int in eine ganze Zahl umwandeln:

int('126') / 3
        
42.0
        

Wenn du eine Zeichenkette hast, die Ziffern und einen Dezimalpunkt enthält, kannst du sie mit float in eine Fließkommazahl umwandeln:

float('12.6')
        
12.6
        

Wenn du eine große ganze Zahl schreibst, könntest du versucht sein, Kommas zwischen Gruppen von Ziffern zu setzen, wie in 1,000,000. Dies ist ein zulässiger Ausdruck in Python, aber das Ergebnis ist keine ganze Zahl:

1,000,000
        
(1, 0, 0)
        

Python interpretiert 1,000,000 als kommagetrennte Folge von ganzen Zahlen. Wir werden später mehr über diese Art von Sequenz erfahren.

Du kannst Unterstriche verwenden, um große Zahlen besser lesbar zu machen:

1_000_000
        
1000000
        

Formale und natürliche Sprachen

Natürliche Sprachen sind die Sprachen, die Menschen sprechen, wie Englisch, Spanisch und Französisch. Sie wurden nicht von Menschen entworfen, sondern haben sich natürlich entwickelt.

Formale Sprachen sind Sprachen, die von Menschen für bestimmte Anwendungen entwickelt wurden. Die Notation, die Mathematiker/innen verwenden, ist zum Beispiel eine formale Sprache, die besonders gut geeignet ist, um Beziehungen zwischen Zahlen und Symbolen zu beschreiben. Ähnlich sind Programmiersprachen formale Sprachen, die entwickelt wurden, um Berechnungen auszudrücken.

Obwohl formale und natürliche Sprachen einige Eigenschaften gemeinsam haben, gibt es wichtige Unterschiede:

Zweideutigkeit

Natürliche Sprachen sind voller Mehrdeutigkeit, mit der Menschen umgehen, indem sie Hinweise aus dem Kontext und andere Informationen nutzen. Formale Sprachen sind so konzipiert, dass sie fast oder ganz eindeutig sind, d.h. jedes Programm hat genau eine Bedeutung, unabhängig vom Kontext.

Redundanz

Um Mehrdeutigkeiten auszugleichen und Missverständnisse zu vermeiden, verwenden natürliche Sprachen Redundanz. Infolgedessen sind sie oft langatmig. Formale Sprachen sind weniger redundant und prägnanter.

Buchstäblichkeit

Natürliche Sprachen sind voll von Idiomen und Metaphern. Formale Sprachen bedeuten genau das, was sie sagen.

Weil wir alle mit natürlichen Sprachen aufgewachsen sind, ist es manchmal schwer, sich an formale Sprachen zu gewöhnen. Formale Sprachen sind dichter als natürliche Sprachen, deshalb dauert es länger, sie zu lesen. Auch die Struktur ist wichtig, deshalb ist es nicht immer am besten, von oben nach unten und von links nach rechts zu lesen. Schließlich kommt es auch auf die Details an. Kleine Fehler in der Rechtschreibung und Zeichensetzung, die in natürlichen Sprachen noch verzeihlich sind, können in einer formalen Sprache einen großen Unterschied machen.

Fehlersuche

Programmierer machen Fehler. Aus skurrilen Gründen werden Programmierfehler als Bugs bezeichnet und der Prozess, sie aufzuspüren, heißt Debugging.

Das Programmieren und vor allem das Debuggen bringt manchmal starke Emotionen hervor. Wenn du mit einem schwierigen Fehler kämpfst, fühlst du dich vielleicht wütend, traurig oder peinlich berührt.

Sich auf diese Reaktionen vorzubereiten, kann dir helfen, mit ihnen umzugehen. Ein Ansatz besteht darin, den Computer als einen Mitarbeiter mit bestimmten Stärken wie Geschwindigkeit und Präzision und bestimmten Schwächen wie mangelndem Einfühlungsvermögen und der Unfähigkeit, das große Ganze zu erfassen, zu betrachten.

Deine Aufgabe ist es, eine gute Führungskraft zu sein: Finde Wege, um die Stärken zu nutzen und die Schwächen abzumildern. Und finde Wege, deine Emotionen zu nutzen, um dich mit dem Problem auseinanderzusetzen, ohne dass deine Reaktionen deine Fähigkeit, effektiv zu arbeiten, beeinträchtigen.

Das Debuggen zu lernen kann frustrierend sein, aber es ist eine wertvolle Fähigkeit, die nicht nur beim Programmieren nützlich ist. Am Ende jedes Kapitels gibt es einen Abschnitt wie diesen mit meinen Vorschlägen zur Fehlersuche. Ich hoffe, sie helfen dir!

Glossar

arithmetischer Operator: Ein Symbol, wie + und *, das eine arithmetische Operation wie Addition oder Multiplikation kennzeichnet.

Ganzzahl: Ein Typ, der ganze Zahlen darstellt.

Gleitkomma: Ein Typ, der Zahlen mit Nachkommastellen darstellt.

Ganzzahlige Division: Ein Operator, //, der zwei Zahlen dividiert und auf eine ganze Zahl abrundet.

Ausdruck: Eine Kombination aus Variablen, Werten und Operatoren.

Wert: Eine Ganzzahl, eine Fließkommazahl oder eine Zeichenkette - oder eine der anderen Arten von Werten, die wir später sehen werden.

Funktion: Eine benannte Folge von Anweisungen, die eine nützliche Operation ausführt. Funktionen können Argumente annehmen oder nicht und können ein Ergebnis liefern oder nicht.

Funktionsaufruf: Ein Ausdruck - oder ein Teil eines Ausdrucks - der eine Funktion ausführt. Er besteht aus dem Funktionsnamen, gefolgt von einer Argumentliste in Klammern.

Syntaxfehler: Ein Fehler in einem Programm, der es unmöglich macht, es zu parsen - und damit auch unmöglich, es auszuführen.

String: Ein Typ, der Folgen von Zeichen repräsentiert.

Verkettung: Das Verbinden von zwei Strings aneinander.

Typ: Eine Kategorie von Werten. Die Typen, die wir bisher gesehen haben, sind Ganzzahlen (Typ int), Gleitkommazahlen (Typ float) und Zeichenketten (Typ str).

Operand: Einer der Werte, auf die ein Operator wirkt.

natürliche Sprache: Eine der Sprachen die die Menschen sprechen und die sich natürlich entwickelt haben.

formale Sprache: Eine der Sprachen, die Menschen für bestimmte Zwecke entwickelt haben, z. B. um mathematische Ideen oder Computerprogramme darzustellen. Alle Programmiersprachen sind formale Sprachen.

Fehler: Ein Fehler in einem Programm.

Debugging: Der Prozess der Fehlersuche und -behebung.

Übungen

Frag einen virtuellen Assistenten

Während du dieses Buch durcharbeitest, gibt es mehrere Möglichkeiten, wie du einen virtuellen Assistenten oder Chatbot nutzen kannst, um dir beim Lernen zu helfen:

  • Wenn du mehr über ein Thema im Kapitel erfahren möchtest oder etwas unklar ist, kannst du um eine Erklärung bitten.

  • Wenn du mit einer der Übungen Schwierigkeiten hast, kannst du um Hilfe bitten.

In jedem Kapitel schlage ich dir Übungen vor, die du mit einem virtuellen Assistenten machen kannst, aber ich ermutige dich, die Dinge selbst auszuprobieren und zu sehen, was für dich funktioniert.

Hier sind einige Themen, zu denen du einen virtuellen Assistenten befragen kannst:

  • Vorhin habe ich die bitweisen Operatoren erwähnt, aber nicht erklärt, warum der Wert von 7 ^ 2 5 ist. Frag doch mal "Was sind die bitweisen Operatoren in Python?" oder "Was ist der Wert von 7 XOR 2?"

  • Ich habe auch die Reihenfolge der Operationen erwähnt. Für mehr Details frage "Was ist die Reihenfolge der Operationen in Python?".

  • Die Funktion round, mit der wir eine Fließkommazahl auf die nächste ganze Zahl runden, kann ein zweites Argument annehmen. Versuche zu fragen: "Was sind die Argumente der Rundungsfunktion?" oder "Wie runde ich Pi auf drei Nachkommastellen ab?"

  • Es gibt noch einen weiteren arithmetischen Operator, den ich nicht erwähnt habe; frag doch mal "Was ist der Modulus-Operator in Python?"

Die meisten virtuellen Assistenten kennen sich mit Python aus und beantworten Fragen wie diese ziemlich zuverlässig. Aber erinnere dich daran, dass diese Tools Fehler machen. Wenn du Code von einem Chatbot bekommst, teste ihn!

Übung

Du fragst dich vielleicht, was round macht, wenn eine Zahl mit 0.5 endet. Die Antwort ist, dass es manchmal auf- und manchmal abrundet. Probiere diese Beispiele aus und versuche herauszufinden, welcher Regel sie folgen:

round(42.5)
        
42
        
round(43.5)
        
44
        

Wenn du neugierig bist, frag einen virtuellen Assistenten: "Wenn eine Zahl mit 0,5 endet, rundet Python dann auf oder ab?"

Übung

Wenn du eine neue Funktion kennenlernst, solltest du sie ausprobieren und absichtlich Fehler machen. So lernst du die Fehlermeldungen, und wenn du sie wieder siehst, weißt du, was sie bedeuten. Es ist besser, jetzt und absichtlich Fehler zu machen als später und aus Versehen.

  1. Du kannst ein Minuszeichen verwenden, um eine negative Zahl wie -2 zu erzeugen. Was passiert, wenn du ein Pluszeichen vor eine Zahl setzt? Was ist mit 2++2?

  2. Was passiert, wenn du zwei Werte hast, zwischen denen kein Operator steht, wie 4 2?

  3. Wenn du eine Funktion wie round(42.5) aufrufst, was passiert, wenn du eine oder beide Klammern weglässt?

Übung

Erinnere dich daran, dass jeder Ausdruck einen Wert und jeder Wert einen Typ hat und wir die Funktion type verwenden können, um den Typ eines beliebigen Wertes zu finden.

Welchen Typ hat der Wert der folgenden Ausdrücke? Stelle für jeden eine Vermutung an und benutze dann type, um es herauszufinden.

  • 765

  • 2.718

  • '2 pi'

  • abs(-7)

  • abs(-7.0)

  • abs

  • int

  • type

Übung

Die folgenden Fragen geben dir die Möglichkeit, das Schreiben von arithmetischen Ausdrücken zu üben:

  1. Wie viele Sekunden gibt es in 42 Minuten 42 Sekunden?

  2. Wie viele Meilen sind in 10 Kilometern enthalten? Tipp: Eine Meile besteht aus 1,61 Kilometern.

  3. Wenn du einen 10-Kilometer-Lauf in 42 Minuten 42 Sekunden läufst, wie hoch ist dann deine durchschnittliche Geschwindigkeit in Sekunden pro Meile?

  4. Wie hoch ist dein durchschnittliches Tempo in Minuten und Sekunden pro Meile?

  5. Wie hoch ist deine Durchschnittsgeschwindigkeit in Meilen pro Stunde?

Wenn du bereits über Variablen Bescheid weißt, kannst du sie für diese Übung verwenden. Wenn nicht, kannst du die Übung auch ohne sie machen - wir werden sie dann im nächsten Kapitel sehen.

Get Think Python, 3. Auflage now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.