Module

Auf unserer Reise beim Erlernen von Python haben wir vordefinierte Python-Funktionen wie print(), input(), type() usw. verwendet. Python verfügt über eine große Anzahl von Funktionen, aber nicht alle sind direkt von einem neuen Python-Skript aus zugänglich. Stattdessen sind sie in separaten Dateien gespeichert, die als Module bezeichnet werden. Um diese Funktionen zu nutzen, müssen wir das Modul importieren, das sie enthält. Dies erfolgt mit der import-Anweisung. Lassen Sie uns das veranschaulichen:
import math           # Import des math-Moduls

print(math.pi)        # Zugriff auf die Konstante pi aus dem math-Modul
print(math.sqrt(16))  # Zugriff auf die Quadratwurzelfunktion aus dem math-Modul
Dieses Programm gibt den Wert von pi (3.141592653589793) und die Quadratwurzel von 16 (4.0) aus.
Wir können auch bestimmte Attribute oder Funktionen aus einem Modul mithilfe der from...import-Anweisung importieren:
from math import pi, sqrt  # Importiert nur pi und sqrt aus dem math-Modul

print(pi)                  # Wir können pi direkt verwenden, ohne es mit dem Modulnamen zu präfixen
print(sqrt(16))            # Ebenso können wir sqrt direkt verwenden
Die Ausgabe des Programms wird dieselbe sein wie zuvor.
Manchmal haben Module lange Namen, und es kann mühsam sein, den ganzen Namen jedes Mal zu tippen, wenn wir eine Funktion verwenden möchten. Um dies zu vermeiden, können wir das Schlüsselwort as verwenden, um dem Modul einen anderen Namen (Alias) zuzuweisen.
import math as m   # Importiert das math-Modul und benennt es als m um

print(m.pi)        # Jetzt können wir den kurzen Alias verwenden
print(m.sqrt(16))  # Verwendung der sqrt-Funktion mit dem Alias
Die Ausgabe wird ebenfalls 3.141592653589793 und 4.0 sein, genau wie zuvor.
Zusammenfassend sind Module in Python wie Werkzeugkästen, die vordefinierte Funktionen und Variablen enthalten, die wir in unseren Programmen importieren und verwenden können. Sie helfen dabei, den Code zu organisieren und effizienter zu gestalten.
Wie Module hinter den Kulissen funktionieren
Wenn Sie ein Modul importieren, führt Python einige Vorgänge im Hintergrund aus, die nicht sofort ersichtlich sind. Hier ist ein Überblick darüber, was passiert, wenn Sie die import-Anweisung verwenden:
  1. Lokalisieren des Moduls: Python sucht zuerst nach dem Modul, indem es die in seiner sys.path-Liste angegebenen Orte überprüft. Diese Liste enthält das aktuelle Verzeichnis, das Verzeichnis der eingebauten Python-Pakete und alle in der Umgebungsvariable PYTHONPATH angegebenen Pfade. Wenn Python das Modul findet, fährt es mit den nächsten Schritten fort. Andernfalls wirft es einen ModuleNotFoundError.
  1. Initialisierung des Moduls: Sobald die Moduldatei gefunden ist, erstellt Python ein neues Modulobjekt (types.ModuleType). Dann lädt es den Inhalt des Moduls in dieses neue Modulobjekt, indem es den gesamten Code auf oberster Ebene in der Moduldatei ausführt. Dazu gehören Definitionen von Funktionen, Klassen, Variablen und die Ausführung von Initialisierungscode.
  1. Caching des Moduls: Nach der Initialisierung wird das Modul in sys.modules (ein Wörterbuch) zwischengespeichert. Dieser Schritt stellt sicher, dass, wenn dasselbe Modul erneut im Skript (oder von anderen Skripten) importiert wird, Python das Modul nicht erneut finden und initialisieren muss. Stattdessen kann es die zwischengespeicherte Version verwenden. Der Schlüssel in diesem Wörterbuch ist der Modulname, und der Wert ist das Modulobjekt.
  1. Hinzufügen des Moduls zum Namensraum des Importeurs: Schließlich fügt Python den Namen des Moduls dem Namensraum des Skripts oder Moduls hinzu, das es importiert hat. Der Name bezieht sich auf das Modulobjekt, sodass Sie auf die Funktionen und Variablen des Moduls mit der Punktnotation zugreifen können.
Lassen Sie uns dies mit etwas Code veranschaulichen:
import sys
import math

print(sys.path)       # Der Pfad, in dem Python nach Modulen sucht
print(sys.modules)    # Die zwischengespeicherten Module
print(math.sqrt(16))  # Zugriff auf eine Funktion aus dem math-Modul
sys.path druckt eine Liste von Verzeichnissen, in denen Python nach Modulen sucht. sys.modules druckt ein Wörterbuch von Modulnamen (Schlüssel) und ihren jeweiligen Modulobjekten (Werte).

Herausforderung: Zufallszahlen

In der Welt der Kryptographie spielen Zufallszahlen eine unglaublich wichtige Rolle. Kryptographische Algorithmen verlassen sich oft darauf, eine Folge von Zufallszahlen zu generieren, um die Daten sicher zu halten.
In dieser Herausforderung sollen Sie einen einfachen Zufallszahlengenerator simulieren, der uns hilft, die Zufälligkeit greifbarer zu verstehen. Python kommt mit einem eingebauten Modul namens random, das verschiedene Funktionen zum Generieren von Zufallszahlen enthält. Sie sollen dieses Modul verwenden, um eine Liste von n zufälligen ganzen Zahlen zwischen zwei gegebenen Zahlen a und b zu generieren. Die Zufälligkeit sollte jedoch nicht wirklich zufällig sein – wir müssen den Seed auf 42 setzen, um die Wiederholbarkeit des Experiments zu gewährleisten. Sie können die Funktion seed() verwenden, um den Seed zu setzen, und randint() verwenden, um eine Zufallszahl zu generieren.
Die erste Zeile der Eingabe enthält drei durch Leerzeichen getrennte ganze Zahlen: n, a und b. Die Zahlen a und b bestimmen den Bereich (einschließlich), aus dem die Zufallszahlen ausgewählt werden sollen, und n bestimmt, wie viele solcher Zahlen Sie generieren müssen.
Das Programm sollte n durch Leerzeichen getrennte Zufallszahlen innerhalb des Bereichs [a, b] ausgeben, mit dem auf 42 festgelegten Zufalls-Seed.
Eingabe
Ausgabe
10 1 100
82 15 4 95 36 32 29 18 95 14
5 1 5
1 1 3 2 2
3 10 20
20 11 10
Hinweis: Da wir den Zufalls-Seed auf 42 gesetzt haben, sollte die Sequenz der Ausgabe bei mehreren Ausführungen des Programms gleich bleiben. Dies ist ein Merkmal, das wir beim Testen, Debuggen und in anderen Szenarien nutzen, in denen determinierte Ausgaben notwendig sind.
 

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue