`__name__` ist ein Name. Da kann man über den Index in der Python-Dokumentation zu einer Beschreibung kommen: das ist an eine Zeichenkette mit dem Namen des Moduls gebunden. Ausser man führt das Modul als Programm aus, dann ist der Name an den Wert "__main__" gebunden. Der ``if``-Zweig wird also nur ausgeführt wenn man das Modul als Programm ausführt, aber nicht wenn man es einfach nur importiert.
Also mal abgesehen davon das man mit der Zeit Erfahrung sammelt und so ein paar Zeilen schon im Kopf formuliert hat bevor man sie schreibt, werden Programme nicht einfach so von Anfang bis Ende runtergeschrieben, sondern *entwickelt*. Also ein Stück Programm schreiben, testen ob das tut was es soll, und dann den nächsten Schritt. Wobei das auch durchaus so ablaufen kann, dass man erst Code schreibt um einen kleinen Teilschritt zu machen, und dann im nächsten Entwicklungsschritt eine Schleife darum legt um diesen Teilschritt für jeden Teil von Eingabedaten zu wiederholen.
Die Entwicklung kann also durchaus so aussehen:
Code: Alles auswählen
# Die Position von einem Wort suchen und ausgeben:
text = "Hänsel und Gretel gingen durch den Wald. Hänsel sah die Hexe."
print(text.index("Hänsel"))
# Wort und Position ausgeben:
text = "Hänsel und Gretel gingen durch den Wald. Hänsel sah die Hexe."
name = "Hänsel"
print(name, "an Position", text.index(name))
# Sinnvoll damit umgehen wenn das Wort nicht vorkommt:
text = "Hänsel und Gretel gingen durch den Wald. Hänsel sah die Hexe."
name = "Klaus"
try:
index = text.index(name)
except ValueError:
pass
else:
print(name, "an Position", index)
# Nicht nur den ersten Index ausgeben, sondern in einer Schleife alle finden
# und ausgeben.
text = "Hänsel und Gretel gingen durch den Wald. Hänsel sah die Hexe."
name = "Hänsel"
index = 0
while True:
try:
index = text.index(name, index)
except ValueError:
break
print(name, "an Position", index)
index += len(name)
# Das ganze nicht nur für ein Wort, sondern für jedes Wort in einer Liste
# wiederholen.
text = "Hänsel und Gretel gingen durch den Wald. Hänsel sah die Hexe."
for name in ["Hänsel", "Gretel", "Hexe"]:
index = 0
while True:
try:
index = text.index(name, index)
except ValueError:
break
print(name, "an Position", index)
index += len(name)
Programmieren ist zu einem grossen Teil Probleme in kleinere Teilprobleme zu zerlegen, und die wieder in Teilprobleme zu zerlegen, solange bis die so klein sind, das man sie mit wenigen Zeilen Code lösen kann. Und dann testen man die Teillösungen, und wenn sie funktionieren, setzt man sie zu grösseren Teillösungen zusammen, bis das Gesamtproblem gelöst ist. Ab einer gewissen Komplexität, die gar nicht mal so hoch sein muss, zerlegt man den Code am besten auch in Funktionen. Die lassen sich besser isoliert testen, auch automatisiert, und auch wenn sie schon als Teillösung in einer grösseren (Teil-)Lösung verwendet werden. Beispiel:
Code: Alles auswählen
#!/usr/bin/env python3
def print_positions(name, text):
index = 0
while True:
try:
index = text.index(name, index)
except ValueError:
break
print(name, "an Position", index)
index += len(name)
def main():
text = "Hänsel und Gretel gingen durch den Wald. Hänsel sah die Hexe."
for name in ["Hänsel", "Gretel", "Hexe"]:
print_positions(name, text)
if __name__ == "__main__":
main()
Wobei man üblicherweise auch die Programmlogik von der Benutzerinteraktion trennt, weil die `print_positions()`-Funktion lässt sich schlecht/nur umständlich automatisiert testen:
Code: Alles auswählen
#!/usr/bin/env python3
import pytest
def find_positions(name, text):
index = 0
while True:
try:
index = text.index(name, index)
except ValueError:
break
yield index
index += len(name)
def print_positions(name, text):
for index in find_positions(name, text):
print(name, "an Position", index)
def main():
text = "Hänsel und Gretel gingen durch den Wald. Hänsel sah die Hexe."
for name in ["Hänsel", "Gretel", "Hexe"]:
print_positions(name, text)
@pytest.mark.parametrize(
"name, expected",
[("Klaus", []), ("Hänsel", [0, 41]), ("Gretel", [11]), ("Hexe", [56])],
)
def test_find_positions(name, expected):
text = "Hänsel und Gretel gingen durch den Wald. Hänsel sah die Hexe."
assert list(find_positions(name, text)) == expected
if __name__ == "__main__":
main()
Testlauf:
Code: Alles auswählen
$ pytest forum21.py
============================= test session starts ==============================
platform linux -- Python 3.8.0, pytest-7.2.0, pluggy-1.0.0
rootdir: /home/bj
collected 4 items
forum21.py .... [100%]
============================== 4 passed in 0.01s ===============================