python 7 segment zähler?

3 Antworten

Hallo! Ich sehe, dass du einen Code geschrieben hast, der 7-Segment-ASCII-Zahlen darstellt. Wenn ich das richtig verstehe, möchtest du, dass dein Code die Zahlen von 1 bis 99 in einer einzigen Spalte ausgibt, anstatt sie in Zweiergruppen zu gruppieren.

Eine Möglichkeit, dies zu erreichen, besteht darin, die

mache_nummer()
-Funktion zu ändern, um die Zahlen entsprechend ihrer Größe zu formatieren. Zum Beispiel könntest du die Zahlen unter 10 so formatieren, dass sie ein Leerzeichen vor der Zahl haben, um sicherzustellen, dass sie alle die gleiche Breite haben. Du könntest dann eine Schleife schreiben, die alle Zahlen von 1 bis 99 durchläuft und sie entsprechend formatiert, bevor sie ausgegeben werden. Hier ist ein Beispielcode, der das tut:

def mache_nummer(num):
    nummern = [
        [" ### "," #  # ","#    #","#    #","#    #"," #  # "," ### ",],
        ["   # ","   ## ","  # # ","   # ","   # ","   # ","#####",],
        [" ### "," #  # ","    # ","  ## "," #    ","#     ","#####",],
        [" ### "," #  # ","    # ","  ## ","    # "," #  # "," ### ",],
        ["   # ","  ## "," # # ","#  # ","######","   # ","   # ",],
        ["#####"," #    ","#     ","#### ","   # "," #  # "," ### ",],
        [" ### "," #  # ","#     ","#### "," #  # "," #  # "," ### ",],
        ["#####","    # ","   # ","  #  "," #   ","#    ","#    ",],
        [" ### "," #  # "," #  # "," ### "," #  # "," #  # "," ### ",],
        [" ### "," #  # "," #  # "," ####","    # "," #  # "," ### ",],
    ]
    out = ""
    if num < 10:
        out = " " + str(num) + " "
    else:
        out = str(num)
    out += "\n"
    for i in range(0, 7):
        for j in range(0, len(out)):
            if out[j] == " ":
                out += nummern[int(out[j+1])][i] + "  "
                break
    print(out)

for num in range(1, 100):
    mache_nummer(num)
    time.sleep(1)

Dieser Code formatiert die Zahlen unter 10 so, dass sie ein Leerzeichen vor der Zahl haben. Anschließend wird für jede Ziffer in der Zahl das entsprechende 7-Segment-ASCII-Art-Array gesucht und ausgegeben. Der Code gibt dann jede Zahl von 1 bis 99 aus, wobei jede Zahl für eine Sekunde angezeigt wird. Ich hoffe, das hilft dir weiter!

Woher ich das weiß:eigene Erfahrung – Vater im Führungsstab von Automobilzulieferer und gute Coder

Naja, wenn ich keine Führungsnullen möchte, dann lasse ich sie weg. Dein eigentliches Problem ist aber wohl ein anderes:

Wie lang ist die Zahl, bzw. wie viele Ziffern hat eine Zahl.

Da gibt es verschiedene Möglichkeiten, unter anderem in dem man einen String erzeugt und die Anzahl der Zeichen nimmt. Gehen wir dabei noch einen Schritt weiter:

>>> def digitfy(num):
...   return [int(digit) for digit in str(num)]
...
>>> digitfy(123)
[1, 2, 3]

Wenn Du jetzt zeilenweise immer wieder über die Liste wanderst und dir die entsprechende Zeile aus nummern baust, dann biste schon fast fertig:

>>> for a in range(5):
...    for digit in digitfy(123):
...       print(nummern[digit][a]+" ",end='')
...    print()
...
   #      ###     ###
  ##     #   #   #   #
 # #         #       #
   #       ##      ##
   #      #          #

Ich habe jetzt nur einen Teil der Zeilen genommen. die Frage ist natürlich, geht das auch eleganter?

>>> for line in range(5):
...    print (" ".join(nummern[digit][line] for digit in digitfy(123)))
...
   #      ###     ###
  ##     #   #   #   #
 # #         #       #
   #       ##      ##
   #      #          #

Man könnt da jetzt prinzipiell noch einen draufsetzen:

>>> out="\n".join( " ".join(nummern[digit][line] for digit in digitfy(7201)) for line in range(7) )
>>> print(out)
 #####    ###     ###      #
     #   #   #   #   #    ##
    #        #  #     #  # #
   #       ##   #     #    #
  #       #     #     #    #
 #       #       #   #     #
 #       #####    ###    #####

Stattdessen könnte man das auch mit ein paar Funktionen schöner gestalten und kapseln.

Schritt 1: Zerlege zähler in eine Liste von Ziffern, z.B. mit ziffern=[int(d) for d in str(zähler)].

Schritt 2: mache_nummer(ziffern):

Ersetze jede Ziffer z in ziffern durch nummern[z]:

quer=[nummern[z] for z in ziffern]. 

Das ist ein 2D-Array mit len(ziffern) Zeilen und 7 Spalten. Das willst Du jetzt spaltenweise ausgeben:

a) Klassische Doppelschleife:

for spalte in range(7):
    for zeile in quer:
        print( zeile[spalte], end=" " )
    print() # Zeilenende

b) Im Python-Stil: Mit zip(*quer) transponierst Du das Array. Das kannst Du direkt ausgeben:

for zeile in zip(*quer):
    print( " ".join(zeile) )

KarlRanseierIII  20.02.2023, 01:16

Ah, das Transponieren ist très chic.

0