Mit Python-Operatoren Werte manipulieren und verknüpfen


Python-Operatoren helfen Ihnen dabei, mit Werten (Operanden) zu arbeiten, diese zu verändern oder miteinander zu verknüpfen. Die Operatoren können beispielsweise logisch oder arithmetisch sein.

Was sind Python-Operatoren und wie funktionieren sie?

Ein Operator ist ein Zeichen für eine Operation. Meist kommen Operatoren zum Einsatz, die mehrere Operanden verknüpfen. Für gewöhnlich wird dabei ein neuer Wert gebildet. Die Anwendung eines Operators auf einen einzelnen Operanden modifiziert diesen.

Das wohl einfachste Beispiel für Python-Operatoren ist die Verknüpfung von zwei Zahlen durch den Additions-Operator, d. h. ein Pluszeichen zwischen den Zahlen. Python wertet den Ausdruck aus und gibt den entsprechenden Wert zurück:

Besonders an Python ist, dass als Operatoren neben Symbolen auch kurze Wörter wie „and“, „or“, „is“, „not“ oder „in“ zum Einsatz kommen. Die Kombination von Operatoren und Operanden ergibt einen Ausdruck:

Welche Arten von Python-Operatoren gibt es?

Python kennt verschiedene Klassen von Operatoren. Sie operieren auf unterschiedlichen Typen von Operanden und liefern Resultate eines bestimmten Typs. Die verschiedenen Arten von Python-Operatoren in der Übersicht:


Klassen von Python-Operatoren

Erklärung

Operanden

Resultat

Operatoren im Überblick

 


Arithmetische Operatoren

Verknüpfen zwei Zahlen zu einer neuen Zahl

Zahlen

Zahl

+, -, *, /, //, %, **, @

 


Vergleichsoperatoren

Vergleichen zwei Ausdrücke miteinander

Ausdrücke

Bool

<, >, ==, !=, <=, >=

 


Logische Operatoren

Verknüpfen Ausdrücke im booleschen Kontext

Ausdrücke

zuletzt evaluierter Ausdruck / Bool

and, or, not

 


Bitweise Operatoren

Manipulieren Ganzzahlen als Binärfolgen

Zahlen

Zahl

<<, >>, &,

, ^, ~

Zuweisungs-Operatoren

Weisen Wert einem Namen zu

Lvalue, Rvalue

– / evaluierter Ausdruck

=, :=, +=, -=, *=, etc.

 


Identitäts-Operatoren

Feststellen, ob zwei Namen auf dasselbe Objekt verweisen

Objekte

Bool

is, is not

 


Konditionaler Operator

Gibt in Abhängigkeit einer Kondition einen von zwei Werten zurück

Ausdruck, Bedingung, Alternative

Ausdruck / Alternative

… if … else …

 


Mengen-Operatoren

Verknüpfen zwei Mengen / Vergleichen Mengen

Mengen

Menge / Bool

&,

, ^, -, <, >, <=, >=

Mitgliedschaft-Operatoren

Testen, ob ein Iterable ein bestimmtes Objekt enthält

Objekt, Iterable

Bool

in, not in

 


Konkatenations-Operator

Verkettet Sequenzen

Strings / Listen / Tupel

String / Liste / Tupel

+

 


Index- und Slice-Operatoren

Liefern ein oder mehrere Elemente eines Iterable

Iterable, Index / Slice

String / Liste / Tupel

[], [::]

 

Neben dem Typ der Operanden und des Rückgabewerts werden Operatoren nach deren „Arität“ klassifiziert. Die Arität eines Operators hat nichts mit „arisch“ zu tun. Vielmehr drückt der Begriff aus, wie viele Operanden ein Operator verknüpft. In den meisten Fällen kommen „binäre“ Operatoren mit zwei Operanden zum Einsatz. Ferner gibt es einige „unäre“ Operatoren mit nur einem Operanden sowie einen „ternären“ Operator, der drei Operanden verknüpft:


Operator-Arität

Anzahl an Operanden

Beispiel

Unär

Ein Operand

not single_value

Binär

Zwei Operanden

left_operand + right_operand

Ternär

Drei Operanden

some_value if condition else other_value

Operator-Präzendenz beachten

Grundlegend für den Einsatz der Python-Operatoren ist zudem ein Verständnis der Operator-Präzendenz. Das Konzept ist als „Punkt- vor Strichrechnung“ aus der Arithmetik bekannt. Zur Erinnerung: Der Ausdruck 3 * 8 + 2 wird interpretiert als (3 * 8) + 2 und nicht als 3 * (8 + 2). Wie für das Plus- und das Mal-Zeichen gibt es Präzendenz-Regeln für alle Python-Operatoren. Hier ein Beispiel für einen Ausdruck mit den logischen Operatoren „and“, „or“ und „not“:

if is_user and is_user_logged_in or is_admin and not login_blocked:
    ...

Ohne die Präzendenz-Regeln für die involvierten Python-Operatoren zu kennen, lässt sich nicht entscheiden, wie die einzelnen Terme zusammengehören. Werden mehrere Operatoren in einem Ausdruck verwendet, wird es schnell kompliziert. Generell ist es besser, sich nicht auf ein perfektes Verständnis impliziter Regeln zu verlassen. Stattdessen setzt man explizite Klammern ein, um zu verdeutlichen, wie die Terme eines Ausdrucks zusammengehören:

if (is_user and is_user_logged_in) or (is_admin and not login_blocked):
    ...

Zum Vergleich dieselben Terme anders gruppiert – die Aussage der beiden Ausdrücke ist unterschiedlich:

if (is_user and is_user_logged_in or is_admin) and not login_blocked:
    ...

Überladene Operatoren, Dunder-Methods und Python-Operator-Funktionen

Manche Python-Operatoren kommen für mehr als eine Operation zum Einsatz. Ein prominentes Beispiel ist das Pluszeichen; es fungiert als Additions-Operator für Zahlen und gleichzeitig als Konkatenations-Operator zum Verketten von Sequenzen wie Strings und Listen. Wir addieren zwei Zahlen mit dem Additions-Operator:

Mit demselben Operator konkatenieren wir zwei Strings:

&quot;Walter&quot; + &quot;White&quot; == &quot;WalterWhite&quot;

Auch Listen konkatenieren wir mit dem Plus-Operator:

['Jack', 'Jim'] + ['John'] == ['Jack', 'Jim', 'John']

Die Mehrfachbelegung des Pluszeichens als Operator spiegelt ein verbreitetes Konzept in der Informatik wider. Man spricht von „überladenen Operatoren“, wenn ein und derselbe Operator je nach Datentyp der Operanden verschiedene Operationen ausführt.

Wie funktionieren überladene Operatoren in Python? Unter der Haube wird ein Operator samt Operanden als Aufruf einer korrespondierenden Funktion interpretiert. Spezifisch wird eine sogenannte Dunder-Methode des ersten Operanden aufgerufen, die den bzw. die weiteren Operanden als Argumente erhält. „Dunder“ steht dabei für „double underscore“, also „doppelte Unterstriche“. So korrespondiert der Plus-Operator zur Dunder-Methode __add__(). Objekte, die eine __add__()-Methode implementieren, lassen sich mit dem Plus-Operator verknüpfen. Dabei ist dem Objekt selbst überlassen, was genau die Verknüpfung konstituiert.

Neben den Dunder-Methoden enthält das operator-ModulFunktionen, die die Funktionalität der Python-Operatoren kapseln. So ruft „operator.add(a, b)“ die Dunder-Methode a.__add__(b) auf, was dem Ausdruck a + b entspricht. Wir führen im weiteren Verlauf des Artikels die Operator-Funktion für jeden Operator soweit vorhanden auf. Der Name der Operator-Funktion korrespondiert zum Namen der entsprechenden Dunder-Methode. Nutzen Sie diese als Referenz zum Implementieren eigener Operator-Funktionalität:


Python-Operator

Operator-Funktion

Dunder-Methode

a + b

operator.add(a, b)

a.__add__(b)

Operatoren nutzen die sogenannte Infix-Notation, die den Operator zwischen den Operanden einsetzt. Demgegenüber kommt beim funktionalen Stil die Prefix-Notation zum Einsatz. Beide Schreibweisen sind äquivalent:


Notation

Verwendung

Beispiel

Infix

Operatoren

a + b

Prefix

Funktionen

+ a b / add(a, b)

Betrachten wir ein Beispiel. Wir definieren zwei Zahlen und addieren diese jeweils mit dem Operator, der Operator-Funktion und der korrespondierenden Dunder-Methode:

import operator

a = 42
b = 69

assert a + b == operator.add(a, b) == a.__add__(b)

Auch komplexere Ausdrücke lassen sich mit Operator-Funktionen schreiben. Hier die Kombination der Python-Additions- und Gleichheits-Operatoren in Prefix-Notation:

import operator

assert 'Py' + 'thon' == 'Python'

assert operator.eq(operator.add('Py', 'thon'), 'Python')

Python-Operatoren im Überblick

Wir gehen nun auf elf verschiedene Klassen von Python-Operatoren ein.

Arithmetische Operatoren

Pythons arithmetische Operatoren operieren auf Zahlen und erzeugen dabei eine neue Zahl. Mit Ausnahme des unären Plus bzw. Minus handelt es sich durchweg um binäre Operatoren. Hier dargestellt als Übersicht:


Python-Operator

Bedeutung

Operator-Funktion

Beispiel

+

Addition / unäres Plus

add(a, b) / pos(a)

5 + 3 == 8 / +8 == 4 + 4



Subtraktion / unäres Minus

sub(a, b) / neg(a)

7 – 2 == 5 / -4 == 2 – 6

*

Multiplikation

mul(a, b)

2 * 3 == 6

/

„Echte“ Division

truediv(a, b)

8 / 2 == 4.0, 7 / 2 == 3.5

//

Integer-Division zur nächstkleineren Ganzzahl

floordiv(a, b)

8 // 2 == 4, 7 // 2 == 3

%

Modulus: Restbetrag der Integer-Division

mod(a, b)

8 % 2 == 0, 7 % 2 == 1

**

Exponentation

pow(a, b)

2 ** 3 == 8, 10 ** -1 == 0.1

@

Matrix-Multiplikation

matmul(a, b)


Die Modulus-Operation wird standardmäßig eingesetzt, um zu ermitteln, ob eine Zahl gerade ist. Denn eine gerade Zahl geteilt durch zwei hat den Rest null. Wir definieren eine entsprechende Python-Funktion mit dem Modulus-Operator:

def is_even(number):
    return number % 2 == 0

# test
assert is_even(8) and not is_even(7)

Die Matrix-Multiplikation erfordert den Einsatz eines Pakets wie NumPy.

Python-Vergleichsoperatoren

Die Python-Vergleichsoperatoren treffen eine Aussage darüber, wie sich zwei Elemente untereinander ordnen lassen. Sie liefern ein boolesches Resultat und kommen insbesondere für Sortieralgorithmen zum Einsatz:


Python-Operator

Bedeutung

Operator-Funktion

Beispiel

<

Kleiner als

lt(a, b)

3 < 1, ‚a‘ < ‚z‘

>

Größer als

gt(a, b)

4 > 2, ‚z‘ > ‚a‘

==

Gleich

eq(a, b)

‚a‘ == ‚a‘

!=

Ungleich

ne(a, b)

1 != 2, ‚Jim‘ != ‚Jack‘

<=

Kleiner gleich

le(a, b)

9 <= 10, 10 <= 10

>=

Größer gleich

ge(a, b)

11 >= 10, 10 >= 10

Logische Operatoren

Pythons logische and- und or-Operatoren verknüpfen mehrere Operanden der booleschen Logik folgend. Als Ergebnis liefern beide Operatoren das jeweils zuletzt evaluierte Objekt zurück. Python‘s logischer not-Operator interpretiert ein Objekt im booleschen Kontext und negiert dessen Wahrheitswert:


Python-Operator

Bedeutung

Operator-Funktion

Beispiel

and

Logisches UND

keine direkte Entsprechung

True and False == False, ’name‘ and … == …

or

Logisches ODER

keine direkte Entsprechung

False or True == True, a = “ or ‚Default‘; assert a == ‚Default‘

not

Verneinung

not_(a)

not True == False

Es ist nützlich, sich den Effekt der logischen Operationen an Wahrheitstabellen zu veranschaulichen. Hier dargestellt das logische UND:


and

True

 


True

True

 

 

 

 


or

True

 


True

True

True

 


True

 

Die Operanden der booleschen Python-Operatoren sind keinesfalls auf boolesche Variablen beschränkt. Vielmehr lässt sich jedes Python-Objekt im booleschen Kontext interpretieren. Die folgenden Objekte evaluieren im booleschen Kontext zu False und werden daher als „falsy“ bezeichnet:


Objekt

Erläuterung

False, None

Konstanten, die der Definition nach False sind

0, 0.0, Decimal(0), Fraction(0, 1), etc.

Zahl, die null repräsentiert

“, (), [], {}, set(), range(0), etc.

Leere Sequenz oder Kollektion

Bitweise Operatoren

Pythons bitweise Operatoren operieren auf Ganzzahlen, die als Bitfolgen interpretiert werden. Mit Ausnahme des bitweisen NOT-Operators handelt es sich durchgehend um binäre Operatoren:


Python-Operator

Bedeutung

Operator-Funktion

Beispiel

 


<<

Bitfolge nach links schieben

lshift(a, b)

5 << 3 == 5 * 2 ** 3

 


>>

Bitfolge nach rechts schieben

rshift(a, b)

1 >> 1 == 0, 8 >> 1 == 4

 


&

Zwei Bitfolgen per AND verknüpfen

and_(a, b)


 

 

 


Zwei Bitfolgen per OR verknüpfen

or_(a, b)



^

Zwei Bitfolgen per XOR verknüpfen

xor(a, b)


 


~

Bitfolge mit NOT invertieren

invert(a)


 

Die bitweisen Operatoren eignen sich für optimierte mathematische Operationen. So entspricht der Links-Shift einer Multiplikation mit einer Zweier-Potenz:


Ausdruck

23 = 8

22 = 4

21 = 2

20 = 1

Dezimal

b = 6

 


1

1

 


6

b << 1

1

1

 

 


12

b >> 1

 

 


1

1

3

Zum Veranschaulichen der bitweisen AND-, OR- und NOT-Operationen konstruieren wir eine Tabelle der einzelnen Bits. Die Operationen werden mit Hilfe einer Bitmaske auf eine Zahl in Binärdarstellung angewandt:


Ausdruck

23 = 8

22 = 4

21 = 2

20 = 1

Dezimal

 


bits = 6

 


1

1

 


6

 


mask = 5

 


1

 


1

5

 


bits & mask

 


1

 

 


4

 


bits

mask

 


1

1

1

7

bits ^ mask

 

 


1

1

3

 

Pythons bitweiser NOT-Operator invertiert eine Bitfolge. Dabei wird aus jeder 1 eine 0 und umgekehrt. Ferner wird das Vorzeichen der Zahl umgekehrt:


Ausdruck

23 = 8

22 = 4

21 = 2

20 = 1

Dezimal

b = 6

 


1

1

 


6

~ b

1

 

 


1

-7

Zuweisungs-Operatoren

Zuweisungen zählen zu den grundlegenden Anweisungen der meisten Programmiersprachen. Die Python-Zuweisungs-Operatoren binden einen Wert an einen Variablennamen. Neben der Zuweisungs-Anweisung gibt es den neueren „Walross“-Operator, der eine Zuweisung innerhalb eines Ausdrucks ermöglicht. Ferner existiert eine Reihe erweiterter Zuweisungs-Anweisungen, die eine Zuweisung mit einer weiteren Operation kombinieren:


Python-Operator

Bedeutung

Operator-Funktion

Beispiel

=

Zuweisungs-Anweisung

keine direkte Entsprechung

name = ‚Walther‘

:=

Zuweisungs-Ausdruck („Walross“-Operator)

keine direkte Entsprechung

[ half for x in range(10) if (half := x / 2) < 5 ]

+=

Erweiterte Additions-Zuweisung

iadd(a, b)

x = 1; x += 4; assert x == 5

Python kennt erweiterte Zuweisungs-Operatoren für die arithmetischen und bitweisen Operationen. Wir führen diese hier nicht einzeln auf, sondern zeigen lediglich das generelle Muster am Beispiel der erweiterten Konkatenations-Zuweisung. Zunächst dargestellt ein Code, der einem existierenden String einen weiteren Teil anfügt:

name = 'Walther'
name = name + 'White'
assert name == 'WaltherWhite'

Ein äquivalentes Beispiel mit Pythons erweitertem Konkatenations-Operator „+=“ – es wird dasselbe Ergebnis erzielt, aber der Code ist knapper und aussagekräftiger:

name  = 'Walther'
name += 'White'
assert name == 'WaltherWhite'

Identitäts-Operatoren

Der Python-is-Operator testet, ob zwei Variablen auf dasselbe Objekt im Speicher verweisen. Die Objekt-Identität steht im Unterschied zur Objekt-Gleichheit, welche durch den Python Vergleichsoperator „==“ getestet wird. Das „is“ in Python entspricht in etwa JavaScripts strengem Gleichheitsoperator „===“. Python kennt ferner einen negierten Identitäts-Test mit dem „is not“-Operator:


Python-Operator

Bedeutung

Operator-Funktion

Beispiel

is

Identitäts-Test

is_(a, b)

a = 42; b = a; assert a is b

is not

Negierter Identitäts-Test

is_not(a, b)

assert [42] is not [42]

Schauen wir uns ein paar Beispiele an. Wir erzeugen eine Referenz auf ein Objekt im Speicher. Später erzeugen wir eine weitere Referenz als Alias. Beide Variablen zeigen auf dasselbe Objekt im Speicher, der is-Operator liefert „True“:

# assign value to name
a = [42]
# reference existing object
b = a
# if this holds
assert a is b
# so will this
assert a == b

Hier erzeugen wir zwei Referenzen auf voneinander unabhängige Objekte im Speicher. Obschon die Objekte gleich sind, sind sie distinkt. Dementsprechend liefert der is-Operator „False“:

# assign the same value to different names
a = [42]
b = [42]
# `a`, `b` are two different objects
assert a is not b
# that contain the same value
assert a == b

Konditionaler Operator

Bei Pythons konditionalem Operator handelt es sich um einen weiteren Nutzen der if-else-Schlüsselworte. Der konditionale Operator wird gerne eingesetzt, um in Zuweisungen zwischen zwei möglichen Werten zu unterscheiden. Da der konditionale Operator eine Bedingung und zwei Ausdrücke verknüpft, ist er auch als ternärer Operator bekannt.


Python-Operator

Bedeutung

Operator-Funktion

Beispiel

… if … else …

Konditionaler Ausdruck

keine direkte Entsprechung

name = ‚Jim‘ if age == 42 else ‚Jack‘

Betrachten wir zunächst ein Beispiel unter Nutzung der if-else-Anweisung in Python. Der folgende Code legt Celsius oder Fahrenheit als Einheit für eine Temperaturmessung in Abhängigkeit vom gewählten Messsystem fest:

if system == 'metric':
    unit = 'C'
else:
    unit = 'F'

Unter Nutzung des konditionalen Operators lässt sich der Code zu einer einzelnen Zuweisung vereinfachen:

unit = &apos;C&apos; if system == &apos;metric&apos; else &apos;F&apos;

Python-Mengen-Operatoren

Neben Strings, Tupeln, Listen und Dictionaries unterstützt Python standardmäßig Mengen als zusammengesetzten Datentyp. Für die üblichen Mengen-Operationen sind überladene Operatoren definiert:


Python-Operator

Bedeutung

Operator-Funktion

Beispiel

 

 


&

Vereinigung von zwei Mengen bilden

and_(a, b)

{‚a‘, ‚b‘} & {‚a‘, ‚c‘} == {‚a‘}

 

 

 

 


Schnittmenge von zwei Mengen bilden

or_(a, b)

{‚a‘, ‚b‘}

{‚a‘, ‚c‘} == {‚a‘, ‚c‘, ‚b‘}

^

Symmetrische Differenz von zwei Mengen bilden

xor(a, b)

{‚a‘, ‚b‘} ^ {‚a‘, ‚c‘} == {‚c‘, ‚b‘}

 

 




Differenz von zwei Mengen bilden

sub(a, b)

{‚a‘, ‚b‘} – {‚a‘} == {‚b‘}

 

 


>

Testen, ob Menge eine echte Übermenge ist

gt(a, b)

assert {‚a‘, ‚b‘} > {‚a‘}

 

 


>=

Testen, ob Menge eine Übermenge ist

ge(a, b)

assert {‚a‘} >= {‚a‘}

 

 


<

Testen, ob Menge eine echte Untermenge ist

lt(a, b)

assert {‚a‘} < {‚a‘, ‚b‘}

 

 


<=

Testen, ob Menge eine Untermenge ist

le(a, b)

assert {‚a‘} <= {‚a‘}

 

 

Python-Mitgliedschaft-Operatoren

Die Python-Mitgliedschaft-Operatoren „in“ und „not in“ liefern eine Aussage darüber, ob ein Objekt in einer Kollektion enthalten ist.


Python-Operator

Bedeutung

Operator-Funktion

Beispiel

in

Testet, ob ein Objekt in einem Iterable enthalten ist

contains(a, b)

‚y‘ in ‚Python‘

not in

Negierung des in-Operators

not contains(a, b)

‚x‘ not in ‚Python‘

Die Mitgliedschaft-Operatoren funktionieren mit Iterables und nutzen eine Gleichheitsprüfung, um zu ermitteln, ob das Zielobjekt in der Kollektion enthalten ist:

'Py' in 'Python'
'Px' not in 'Python'

'Jack' in ['Jim', 'Jack']

Unter Einsatz des in-Operators spart man sich, Code der folgenden Form zu schreiben:

def my_in(target, collection):
    for element in collection:
        if element == target:
            return True
    return False

# test
word = 'Python'
letter = 'y'
assert (my_in(letter, word)) == (letter in word)

Konkatenations-Operator

In Python dient der Konkatenations-Operator dazu, Sequenzen desselben Typs zu verketten. Als Operator-Symbol kommt das Pluszeichen zum Einsatz.


Python-Operator

Bedeutung

Operator-Funktion

Beispiel

+

Verkettet zwei Sequenzen

add(a, b)

[‚Jim‘] + [‚Jack‘, ‚John‘]

Schauen wir uns ein paar Beispiele an. Wir verketten zwei Strings, zwei Listen und zwei Tupel:

assert "Walter" + "White" == 'WalterWhite'

assert ['a', 'b'] + ['c'] == ['a', 'b', 'c']

assert ('q', 'r') + ('s', 't') == ('q', 'r', 's', 't')
site_title = 'Welcome'
print('<h1>' + site_title + '</h1>')

Beim Vergleich Python vs. PHP unterscheiden sich die Konkatenations-Operatoren der beiden Sprachen. Denn PHP verwendet den Punkt „.“ als Symbol. Dasselbe Beispiel dargestellt in PHP:

$siteTitle = 'Welcome';
echo '<h1>' . $siteTitle . '</h1>';

Index- und Slice-Operatoren

Der Python-Index-Operator dient zum Extrahieren eines bestimmten Elements einer Kollektion. Mit dem Slice-Operator lässt sich eine Untersequenz extrahieren.


Python-Operator

Bedeutung

Operator-Funktion

Beispiel

iterable[index]

Liefert das unter dem Index befindliche Element eines Iterable

getitem(iterable, index)

‚Python'[1] == ‚y‘

sequence[start:stop:step]

Liefert ein Slice einer Sequenz

getitem(iterable, slice(start, stop, step))

‚Python'[0:1] == ‚Py‘, ‚Python'[0:-1:2] == ‚Pto‘

Pythons Index- und Slice-Operatoren greifen intern auf die Dunder-Methode __getitem__() zurück. Diese wird entweder mit einem numerischen Index oder einem Slice-Objekt aufgerufen:

names = ['Jim', 'Jack', 'John']
names[0] == names.__getitem__(0)
names[0:2] == names.__getitem__(slice(0, 2))

Der Slice-Operator ist praktisch, denn er erlaubt das Extrahieren einer Untersequenz ohne Einsatz einer Python-For-Loop oder Python-While-Loop. Damit ersparen sich Programmierende, Code der folgenden Form zu schreiben:

word = 'Python'
start, stop, step = 0, 5, 2
index, substring = start, ''
while index in range(start, stop, step):
    substring += word[index]
    index += step

# test
assert substring == word[start:stop:step]



Source link

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen