Seite 1 von 1

über variablen iterieren

Verfasst: Sonntag 31. August 2025, 15:21
von Pitwheazle
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.

Re: über variablen iterieren

Verfasst: Sonntag 31. August 2025, 15:28
von nezzcarth
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.

Re: über variablen iterieren

Verfasst: Sonntag 31. August 2025, 15:34
von Pitwheazle
Prima, danke!
Das mit "map(lambda.." kannte ich noch nicht
... "a *= scale" eigentlich schon.
Wo liegt der Denkfehler in meinem Code?

Re: über variablen iterieren

Verfasst: Sonntag 31. August 2025, 17:01
von __blackjack__
@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.

Re: über variablen iterieren

Verfasst: Sonntag 31. August 2025, 17:14
von Pitwheazle
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?

Re: über variablen iterieren

Verfasst: Sonntag 31. August 2025, 18:43
von __blackjack__
@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.

Re: über variablen iterieren

Verfasst: Sonntag 31. August 2025, 20:23
von Pitwheazle
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.

Re: über variablen iterieren

Verfasst: Sonntag 31. August 2025, 20:29
von __blackjack__
@Pitwheazle: Nein das geht nicht.

Re: über variablen iterieren

Verfasst: Sonntag 31. August 2025, 20:31
von Pitwheazle
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 :)

Re: über variablen iterieren

Verfasst: Sonntag 31. August 2025, 22:04
von karolus
ot: @Pit: der Link zu deinem github ist kaputt

Re: über variablen iterieren

Verfasst: Dienstag 2. September 2025, 00:50
von Pedroski55
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.

Re: über variablen iterieren

Verfasst: Dienstag 2. September 2025, 11:03
von __blackjack__
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.