ü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.
Antworten
Pitwheazle
User
Beiträge: 1058
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: 1775
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: 1058
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: 14095
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: 1058
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: 14095
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: 1058
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: 14095
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: 1058
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: 12
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: 14095
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
Antworten