über variablen iterieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Pitwheazle
User
Beiträge: 1059
Registriert: Sonntag 19. September 2021, 09:40

Was mache ich hier verkehrt:
Um rechtwinklige Dreiecke zu zeichnen muss ich die ganzen Variablen mit einem Maßstab multiplizieren:

Code: Alles auswählen

def sub_rechtwinklig_hypo_unten(x0, a, b, c):
    scale = c * 8
    p = (a**2/c)
    q = (b**2/c)
    h = math.sqrt(p*q)
    a = a * scale
    b = b * scale
    c = c * scale
    p = p * scale
    q = q * scale
    h = h * scale
... das

Code: Alles auswählen

    a = a * scale
    b = b * scale
    c = c * scale
    p = p * scale
    q = q * scale
    h = h * scale
sieht blöd aus. Also habe ich es mit

Code: Alles auswählen

    variablen = {"a":a,"b":b,"c":c,"P":p,"q":q,"h":h}
    for key in variablen:
        print(key, "=", variablen[key])
        variablen[key] = variablen[key] * scale
        print(key, "=", variablen[key])
    print("a: ", a)
probiert. Mit

Code: Alles auswählen

    print("a: ", a)
... muss ich aber feststellen, dass der Wert nicht geändert wird.
nezzcarth
User
Beiträge: 1778
Registriert: Samstag 16. April 2011, 12:47

Du kannst z.B. so was schreiben:

Code: Alles auswählen

a, b, c, p, q, h = map(lambda x:x*scale, (a, b, c, p, q, h)).
Eine geeignete Datenstruktur/Klasse wäre aber vmtl. eleganter. Generell kann man "a = a <operator> b" meistens schreiben als "a <operator>= b"; also z.b. a *= scale. s.a: https://docs.python.org/3/reference/sim ... statements Ich weiß zwar, dass einbuchstabige Variablen Namen in der Mathematik üblich sind, ich finde sie trotzdem schwer lesbar.
Pitwheazle
User
Beiträge: 1059
Registriert: Sonntag 19. September 2021, 09:40

Prima, danke!
Das mit "map(lambda.." kannte ich noch nicht
... "a *= scale" eigentlich schon.
Wo liegt der Denkfehler in meinem Code?
Benutzeravatar
__blackjack__
User
Beiträge: 14133
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pitwheazle: Alternativ ohne `map()` und ``lambda`` ginge auch:

Code: Alles auswählen

a, b, c, p, q, h = (x * scale for x in (a, b, c, p, q, h))
Ich Code ist kein Denkfehler, der ist in Dir. 😜

An welcher Stelle denkst Du denn würde der Wert von `a` verändert.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Pitwheazle
User
Beiträge: 1059
Registriert: Sonntag 19. September 2021, 09:40

Nun ja Denkfehler macht wohl immer der Denker - oder in dem Fall ich, wenn ich denke, dass ich denke :).
Mein Code ändert wahrscheinlich nicht den Wert von a sondern den Wert von a im Dict?
Benutzeravatar
__blackjack__
User
Beiträge: 14133
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pitwheazle: Den Wert von "a" im Wörterbuch. Die Schlüssel in diesem Wörterbuch sind ja keine Namen, im Sinne der Programmiersprache, sondern Zeichenketten.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Pitwheazle
User
Beiträge: 1059
Registriert: Sonntag 19. September 2021, 09:40

Könnte man diesen denn dazu machen? Ich kann mich erinnern, dass ich vor urdenklichen Zeiten, dieses Problem auch mal bei der Programmierung von dBase hatte.
Benutzeravatar
__blackjack__
User
Beiträge: 14133
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pitwheazle: Nein das geht nicht.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Pitwheazle
User
Beiträge: 1059
Registriert: Sonntag 19. September 2021, 09:40

Danke, auch für das:

Code: Alles auswählen

a, b, c, p, q, h = (x * scale for x in (a, b, c, p, q, h))
... eigentlich logisch :)
karolus
User
Beiträge: 145
Registriert: Samstag 22. August 2009, 22:34

ot: @Pit: der Link zu deinem github ist kaputt
Pedroski55
User
Beiträge: 16
Registriert: Freitag 25. Juli 2025, 00:20

Neulich spiele ich mit svg in html.

Hier ist ein Basisdreieck gezeichnet. Da die svg nur 400 x 400 ist, das Basisdreieck habe ich maximal 360 gemacht.

Nun muss man nur 360 mit einer kleineren Nummer ersetzen und man hat das Dreick verkleinert.

Hier erst html:

Code: Alles auswählen

<!DOCTYPE html>
<html>
  <head>
    <title>Dreieck X</title>

</head>

  <body>
    <h1>Dreieck  X</h1>
    <p>
<svg class="tri" xmlns="http://www.w3.org/2000/svg"
  width="400"
  height="400"
  viewBox="-200 -200 400 400"
>
<defs>
    <style type="text/css"><![CDATA[
 .axes{
		  fill: none;
		  stroke: indigo;
		  stroke-linecap: round;
		  stroke-linejoin: round;
		  stroke-width: 5;
		  stroke-dasharray: 10 20;
  }
.triangle {
		  fill:red;
		  stroke:blue;
  		  stroke-linecap:round;
  		  stroke-linejoin:round;
  		  stroke-width:3;
}
    ]]></style>
  </defs>
<rect  x="-200" y="-200"  width="400" height="400" fill="pink"/>
  <path class="axes"
    d="M 0 -200 V 200 M -200 0 H 200"/>
    	  
   <path class="triangle"
     d="M -180 180 h 360 v -360 l -360 360 ">
</svg>

	</p>
</body>
</html>
Und hier Python:

Code: Alles auswählen

html_file = '/home/peterr/temp/svg/dreieck360.html'
savepath = '/home/peterr/temp/svg/dreieckX.html'
with open(html_file) as infile:
    html = infile.read()

# 360 ist hier die maximale Größe weil die svg nur 400 x 400 ist, könnte größer gemacht werden
# ersetze 360 mit kleineren Nummern und X mit der Nummer
groesse = input('Eine Nummer < 360 eingeben ... ')
newhtml = html.replace('X', groesse).replace('360', groesse)
newsavepath = savepath.replace('X', groesse)
with open(newsavepath, 'w') as outfile:
    outfile.write(newhtml)

# öffne newsavepath in deinem Browser
Nicht genau was du wolltest, weiß ich, aber hat Spaß gemacht!

Ich benutze Vivaldi Browser, darin funktioniert das html einwandfrei.
Benutzeravatar
__blackjack__
User
Beiträge: 14133
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das SVG ist kaputt. Du schliesst <svg> während das letzte <path> noch offen ist. Das ist also kein gültiges XML und ein Browser oder jedes andere Programm kann sich auch einfach weigern das zu verarbeiten.

Das Python-Programm ändert gar nichts am Dreieck sondern nur Titel und Überschrift. Das ist also sinnlos.

Man würde hier auch nicht Buchstaben ersetzen, sondern mindestens mal eine Vorlage verwenden. Man könnte eine Vorlage schreiben, die Pythons `str.format()` benutzt oder `string.Template` aus der Standardbibliothek, wenn man nicht externes wie Jinja als Abhängigkeit haben möchte.

Falls das ursprüngliche Dokument keine Vorlage, sondern ein gültiges, sinnvolles HTML-Dokument sein soll, wäre es deutlich robuster das mit einem HTML-Parser zu verarbeiten um die Stellen zu finden wo etwas ersetzt werden muss.

Das Programm hat auch das Problem, dass man sich das Original überschreibt wenn man 360 eingibt. Dann ist es als Vorlage für das ersetzen von "X" nicht mehr verwendbar.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Pedroski55
User
Beiträge: 16
Registriert: Freitag 25. Juli 2025, 00:20

Hast du es eigentlich ausprobiert Junger? Auf meinem Laptop funktioniert es einwandfrei!

Und jedes Mal bekomme ich ein anderes Dreieck!

Ich gebe zu, ich hatte ein / vergessen in

Code: Alles auswählen

<path class="triangle"
     d="M -180 180 h 360 v -360 l -360 360 "/>
doch html ist so lasch, es gibt fast immer etwas zurück, sonst hatte ich das gleich gemerkt!
Das Python-Programm ändert gar nichts am Dreieck sondern nur Titel und Überschrift. Das ist also sinnlos.
Jedes Mal bekomme ich ein anderes Dreieck mit den Seitelängen "groesse" unten und rechts. Du hast es gar nicht ausprobiert, willst aber meckern! Don't worry, be happy!

Es steht auch klar da:

Code: Alles auswählen

groesse = input('Eine Nummer < 360 eingeben ... ')
Also bitte bitte, nicht 360 eingeben ja? Aber falls du das oben nicht verstehst, öffne Bluefish und korrigiere den Fehler, so einfach ist das!

Keinen Sinn für Spass Alter?
Benutzeravatar
DeaD_EyE
User
Beiträge: 1257
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Mich würde das stören, wenn mein Code HTML/SVG mit Syntaxfehler generiert.
Mich stört das schon, wenn die Einrückung nicht perfekt ist, auch wenn es bei HTML keine Rolle spielt.
Also bitte bitte, nicht 360 eingeben ja? Aber falls du das oben nicht verstehst, öffne Bluefish und korrigiere den Fehler, so einfach ist das!

Keinen Sinn für Spass Alter?
Da macht es ja richtig Spaß, zu helfen. Ich gehe jetzt arbeiten, dafür werde ich wenigstens bezahlt....
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

@Pedrovski55: hier im Forum sind wir da, um gegenseitig etwas zu lernen. Der Umgangston mag etwas direkt sein, aber niemals ein persönlicher Angriff.
wenn Du etwas aufgewühlt bist, mach etwas anderes und lies den Beitrag noch mal in einer ruhigen Minute.
Dein Programm ist sehr fragil. Es funktioniert zwar für den gezeigten Zweck, kleine Änderungen können aber zu unbeabsichtigten Fehlern führen. Mit einfachen Änderungen kann man den Code robuster machen.
Pedroski55
User
Beiträge: 16
Registriert: Freitag 25. Juli 2025, 00:20

@Sirius3 kein Problem mit direktem Umgangston, bin nicht aus Zucker. Ihr vielleicht?

Das Skript sollte nur als kleines Beispiel dienen, ist nicht "völlig ausgereift". Natürlich könnte ich mehr drin bauen damit besagte Fehler nicht auftreten können. Ich fand es nur lustig.

Wegen einem fehlenden / so nen Terz zu machen, und sagen dass es nicht funktionert, finde ich sehr fremd, zumal auf meinem Rechner in Vivaldi und Firefox die so erzeugten Htmldateien einwandfrei funktionieren. Wenn das nicht der Fall wäre, hätte ich gleich das fehlende / gemerkt, da kein Resultat. html vergibt viele Sünden! Doch ich habe Dreieck.html für 50, 100, 150, 200 und 250, welche ich im Browser anzeigen kann, trotz fehlendem /

@DeaD_EyE bloß nicht zuviel arbeiten!
Benutzeravatar
sparrow
User
Beiträge: 4548
Registriert: Freitag 17. April 2009, 10:28

@Pedroski: Deine Tefte lesen sich in meinen Augen schon, als wärst du angefressen. Ich würde an deiner Stelle die Kritik annehmen, den Post noch einmal lesen und versuchen zu verstehen, dass da Informationen drin stehen, die dein Wissen erweitern. Es geht ja nicht nur um den / sondern um einiges mehr.
Kritik kann man als Angriff sehen - oder als Chance besser zu werden.
Benutzeravatar
__blackjack__
User
Beiträge: 14133
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pedroski55: Ja ich habe es ausprobiert und es werden HTML-Dateien erzeugt, bei denen andere Zahlen im Dateinamen, in der Überschrift und im Titel stehen, aber alle haben ein gleich grosses Dreieck. Denn die Grösse des Dreiecks wird von dem Code ja überhaupt gar nicht geändert. Hast *Du* das denn auch tatsächlich mal ausprobiert?

Das da steht, das man Zahlen <360 eingeben soll, wird Benutzer nicht davon abhalten das zu ignorieren. Die werden 360 eingeben, negative Zahlen, und jkdcjkdsm. Welche die Neugierig sind auch inf, -inf, und NaN. Es wäre halt ein leichtes entweder die EIngabe abzusichern, oder wenigstens die Vorlage und die generierten Dateien so zu benennen, dass da kein Unfall passieren kann.

@Pitwheazle: Geht es bei der Skalierung eigentlich um die Zahlen für die Aufgabe oder nur für's zeichnen? Wenn die skalierten Zahlen sonst nirgends gebraucht werden, könnte man das vielleicht auch in SVG über ein transform-Attribut lösen.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Pitwheazle
User
Beiträge: 1059
Registriert: Sonntag 19. September 2021, 09:40

Mit svg kann ich umgehen und meine Dreiecke und auch viele kompliziertere Gebilde funktionieren wunderbar. Ich erzeuge aber Aufgaben mit Zufallszahlen und dann muss ich den "Maßstab" jeweils anpassen, damit die Figuren immer etwa gleich groß sind. "transform" kann ich auch. Es ging mir wirklich nur um den Pythoncode:

Code: Alles auswählen

a, b, c, p, q, h = (x * scale for x in (a, b, c, p, q, h))
... den habe ich jetzt und damit könnte man dieses Posting auch schließen. Danke
@Pedroski55 das ist zwar sehr nett, dass du dich meines Problemes angenommen hast, auch dafür Dank, der brachte mich aber in Bezug auf meine Fragestellung nicht weiter :).
nezzcarth
User
Beiträge: 1778
Registriert: Samstag 16. April 2011, 12:47

Pedroski55 hat geschrieben: Mittwoch 3. September 2025, 06:59 zumal auf meinem Rechner in Vivaldi und Firefox die so erzeugten Htmldateien einwandfrei funktionieren. Wenn das nicht der Fall wäre, hätte ich gleich das fehlende / gemerkt, da kein Resultat. html vergibt viele Sünden!
Nicht HTML vergibt die Sünden, sondern der Webbrowser. Moderne Browser orientieren sich an "Postal's Principle" (https://de.m.wikipedia.org/wiki/Robustheitsgrundsatz) und sind sehr gut darin, kaputtes HTML "schön zu lügen". Das heißt aber nicht, dass die Eingabe standardkonformes HTML wäre. Es ist ein üblicher Fehlschluss, dass HTML korrekt wäre, weil es korrekt im Browser angezeigt wird. Mag widersprüchlich oder in der Praxis irrelevant erscheinen, aber ist technisch nunmal so. Ob etwas korrekt im Sinne des HTML-Standards ist, sagt dir z. B. der Validator der W3C (Mit-Herausgeber des HTML-Standards): https://validator.w3.org/ Und in Bezug auf dein HTML kommt er zu einem ähnlichen Schluss, wie dem, der hier im Thread schon genannt wurde. Gleiches gilt für die Quellcode-Anzeige im Firefox, die Fehler rot markiert.

Der Fehler liegt im XML-basierten SVG, führt so aber auch zu defektem HTML. Insofern hast du "Glück", dass das mein Standalone SVG ist, denn die meisten Werkzeuge, die das XML direkt verarbeiten, sind da deutlich strikter. XML kann man analog mit einer geeigneten Bibliothek oder einem geeigneten Tool gegen das Schema validieren.

Sieh es doch einfach als Verbesserungsvorschlag, nicht als Vorwurf. Defektes HTML ist weit verbreitet (s. z. B.: https://meiert.com/blog/html-conformance-2024/). Aber wenn alle daran arbeiten, dass das weniger wird, brauchen die Browser auch vielleicht irgendwann nicht mehr diese Klimmzüge zu machen, was der Performance zuträglich sein dürfte (ist natürlich ein Wunschtraum).
Antworten