SyntaxError - der sich mir nicht erschliesst .... :?

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
c.burkes
User
Beiträge: 58
Registriert: Montag 4. Februar 2019, 11:38

Hey,

hab hier mal nen soweit ganz netten code geschrieben, der bestimmt noch zwei drei Fehler beeinhaltet, die ich gerne finden wuerde, aber mir macht die Funktion def get_work (relativ weit unten) zu schaffen.

Hierzu wird mir gemeldet ....

Code: Alles auswählen

  File "script.py", line 36
    def get_work(mass, acceleration, distance):
      ^
SyntaxError: invalid syntax
... wenn ich die Funktion an das Ende der vorhergehenden Zeile bringe und dann mit Enter absetze, rueckt die Funktion 7 Leerzeichen ein .... Syntax meint doch unter anderem auch command where not expected. Gehe ich recht der Annahme, dass die Konsole das Ding in der vierten Reihe haben will? Und wenn dem so ist, wieso??!? Oder lieg ich meilenweit entfernt?


Code: Alles auswählen

train_mass = 22680
train_acceleration = 10
train_distance = 100

bomb_mass = 1


def f_to_c(f_temp):
  c_temp = (f_temp - 32) * 5 / 9
  return c_temp

f100_in_celsius = f_to_c(100)

def c_to_f(c_temp):
  f_temp = c_temp * (9 / 5) + 32
  return f_temp

c0_in_fahrenheit = c_to_f(0)
print (c0_in_fahrenheit)

def get_force(mass, acceleration):
  return mass * acceleration

train_force = get_force(train_mass, train_acceleration)

print ("The GE train supplies " + str(train_force) + " Newtons of force.")

def get_energy(mass, c):
  c = 3 * 10 ** 8
  return mass * c**2

bomb_energy = get_energy(bomb_mass)

print ("A 1kg bomb supplies " + str(bomb_energy) + " Joules."
       
def get_work(mass, acceleration, distance):
  force = get_force(mass, acceleration)
  return force * distance

train_work = get_work(train_mass, train_acceleration, train_distance)
  
print "The GE train does " + str(train_work) + " Joules of work over " + str(train_distance) + " meters."


Jetzt bin ich mal gespannt =) Und bitte verratet mir nicht alle anderen Fehler ;D

Ganz lieben Dank!

P.S.: @all die mir zu 3 geraten haben ... :* .... das Tutorial ist hier sooo viel besser!
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

In der Codezeile darüber fehlt eine schließende Klammer. Python kann das aber erst erkennen, wenn etwas anderes, nicht erlaubtes, kommt, deshalb wird der Fehler erst dort angezeigt. Bei solchen Fehlern ist es immer sinnvoll, von der Fehlerstelle aus weiter nach oben zu suchen, bis man etwas findet, was den Syntaxfehler auslöst.
In specifications, Murphy's Law supersedes Ohm's.
c.burkes
User
Beiträge: 58
Registriert: Montag 4. Februar 2019, 11:38

Boah ne ey *fp* und ich rueck und setz und tu ... die Klaemmerchen fehlen wohl auch in der letzten Zeile - vielen Dank Dir!!
c.burkes
User
Beiträge: 58
Registriert: Montag 4. Februar 2019, 11:38

32.0
The GE train supplies 226800 Newtons of force.
A 1kg bomb supplies 90000000000000000 Joules.
The GE train does 22680000 Joules of work over 100 meters.

:mrgreen: Danggoe
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@c.burkes: Der Code ist ziemlich unübersichtlich. Eingerückt wird mit 4 Leerzeichen pro Ebene.

Auf Modulebene sind Variablen, Code und Funktionsdefinitionen munter gemischt. Da gehört nur Code hin der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Die Variablendefinitionen und deren Verwendung ist auch total durcheinander. Erst werden die Zugdaten definiert, aber nicht verwendet, dann die Bombenmasse, dann etwas mit Temperaturen, dann werden Teile der Zudaten verwendet, dann die Bombenmasse, und dann wieder die Zugdaten. Das hat doch alles nichts miteinander zu tun, sondern sind drei unterschiedliche Themenbereiche die man getrennt abarbeiten kann/sollte.

`f100_in_celsius` wird berechnet, aber nirgends verwendet. Ich nehme mal an das sollte auch ausgegeben werden‽

Die beiden Umrechnungsfunktionen sollten besser benannt werden, also die Einheiten nicht abgekürzt werden. Der Name für das Ergebnis in den beiden Funktionen ist überflüssig.

Zwischen einer Funktion und der öffnenden Klammer für den Aufruf gehört kein Leerzeichen.

Bei der Ausgabe für die Bombe steht die 1 für die Masse fest in der Zeichenkette, aber für die Berechnung wird eine Variable verwendet. Wenn man den Wert ändert, stimmt die Ausgabe nicht mehr, oder man muss immer daran denken den Wert dort auch anzupassen. Das ist aber fehleranfällig.

Zusammenstückeln von Zeichenketten und Werten mittels `str()` und ``+`` ist eher BASIC als Python. In Python gibt es dafür Zeichenkettenformatierung mit der `format()`-Methode (oder f-Zeichenketten ab Python 3.6).

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3

SPEED_OF_LIGHT = 3 * 10**8


def fahrenheit_to_celsius(f_temp):
    return (f_temp - 32) * 5 / 9


def celsius_to_fahrenheit(c_temp):
    return c_temp * (9 / 5) + 32


def get_force(mass, acceleration):
    return mass * acceleration


def get_energy(mass):
    return mass * SPEED_OF_LIGHT**2


def get_work(mass, acceleration, distance):
    return get_force(mass, acceleration) * distance


def main():
    print(fahrenheit_to_celsius(100))
    print(celsius_to_fahrenheit(0))
    
    bomb_mass = 1
    bomb_energy = get_energy(bomb_mass)
    print('A {}kg bomb supplies {} Joules.'.format(bomb_mass, bomb_energy))
    
    train_mass = 22680
    train_acceleration = 10
    train_distance = 100
    train_force = get_force(train_mass, train_acceleration)
    print('The GE train supplies {} Newtons of force.'.format(train_force))
    train_work = get_work(train_mass, train_acceleration, train_distance)
    print(
        'The GE train does {} Joules of work over {} meters.'.format(
            train_work, train_distance
        )
    )


if __name__ == '__main__':
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
c.burkes
User
Beiträge: 58
Registriert: Montag 4. Februar 2019, 11:38

Hi @__blackjack__,

"@c.burkes: Der Code ist ziemlich unübersichtlich. Eingerückt wird mit 4 Leerzeichen pro Ebene."

... das hat codecademy auch gesagt, dass Sie da aus irgendeinem Grund ne Sonderschiene fahren. Kann ich ja aber hier im Forum gerne manuell korrigieren *tu*


"Die Variablendefinitionen und deren Verwendung ist auch total durcheinander."

Das liegt an der Aufgabenstellung, die nur wohl dazu dienen soll die Zusammenhaenge zwischen den Funktionen ersichtlich zu machen. Umschreiben geht noch nicht mal (wenn ich denn den Skill haette ;), weil die Konsole dann die Ergebnisse nicht mehr erkennt.


Fuer die Muehe, die Du Dir mit dem code gegeben hast, bin ich aber sehr dankbar! Das ist auf jeden Fall mal ne Kampfansage und ein kurz- bis mittelfristiges Ziel, das so strukturieren zu koennen. So kann man den code tatsaechlich lesen und ist sich schnell im Bilde, was hier Phase ist.

Danke fuer die Motivation. Kann ich gerade brauchen =)

c.b
c.burkes
User
Beiträge: 58
Registriert: Montag 4. Februar 2019, 11:38

Als Du geschrieben hast: Zug, Temperatur, Bombe, .... musste ich erstmal schlucken xD x``D
Antworten