Hi,
wir haben eine Funtkion ksr definiert die die Unterfunktionen kriechen und schwinden beinhaltet.
Damit kann man für alle mögliche Betone die Kriechzahl und Schwinddehnung ermitteln.
Die Funktion ksr berechnet im Vorfeld einige Eingangswerte die für die Unterfunktionen gedacht sind und ruft
dann die jeweiligen Unterfunktionen auf.
http://www.python-forum.de/pastebin.php?mode=view&s=90
Der Benutzer gibt für die Funktion ksr die Parameter fck, Ac_brutto, u, RH, Zementtyp, t, t0, ts an.
Die Funktion berechnet dann etwas wie oben beschrieben. Danach wird die Unterfunktion aufgerufen und genau
darin liegt unser Problem.
kriechen(alpha_potenz=alpha_zement, h0=h0, RH0=RH0, RH=RH, h1=h1, t1=t1, fcm0=fcm0, fcm=fcm, t0=t0, t=t)
Bis jetzt müssen wir jeden Parameter den Wert so zuweisen und das sieht einfach schrecklich aus. Ist es denn irgendwie möglich
den Aufruf schöner zu gestalten so in dieser Art ?
kriechen(alpha_potenz=alpha_zement, h0, RH0, RH, h1, t1, fcm0, fcm, t0, t)
Leider haben wir es nicht hin bekommen. :K
P.S.
Die Berechnungen bzw. Unterfunktionen liefern die richtigen Ergebnisse (Berechnungen aus Normtexten), also die muss man sich nicht zwingend durchlesen es geht wie gesagt nur um das Problem mit dem Parameterübergabe zur Unterfunktion (Zeile 119).
Falls sich doch jemand den Quelltext komplett anschaut, wäre es schön wenn wir als Pythonneulinge ein kurzes Feedback bezüglich Programmierstil erhalten könnten, auch wenn der Code noch nicht lang ist
Vielen dank im voraus
Py3 Funtion mit Unterfunktion und Parameter
Nach den Schlüsselwortargumenten (z.B. keyword = value) dürfen keine Positionsargumente (z.B. value1, value2) mehr kommen. Darum funktioniert deine Verkürzung nicht, so würde es aber funktionieren:
oder du verschiebst den 'alpha_potenz' Parameter an den Schluss der Funktionsdefinition und des Aufrufes.
Für Details siehe:
http://docs.python.org/tutorial/control ... -arguments
http://docs.python.org/tutorial/control ... -functions
Noch zum Code:
kannst du mit 'min' einfacher schreiben:
solche Berechnungen würde ich besser formatieren, damit auf den ersten Blick klar ist, welche Klammern für was verwendet werden:
bei dieser Zeile:
würde ich statt '* 10 ** -6' eher '* 1e-6' schreiben (alternative float schreibweise, ginge auch in C oder so).
verwende math.sqrt statt ** 0.5:
importiere Module am Anfang der Datei.
Code: Alles auswählen
kriechen(alpha_potenz, h0, RH0, RH, h1, t1, fcm0, fcm, t0, t)
Für Details siehe:
http://docs.python.org/tutorial/control ... -arguments
http://docs.python.org/tutorial/control ... -functions
Noch zum Code:
Code: Alles auswählen
x = 1500 * alpha_3
if beta_H > x:
beta_H = x
Code: Alles auswählen
beta_H = min(beta_H, 1500 * alpha_3)
Code: Alles auswählen
beta_H = 150*(1+(1.2 * RH / RH0 ) ** 18)*( h0 / h1 )+250 * alpha_3
Code: Alles auswählen
e_cds0 = ((220+110*alpha_ds1) * exp(alpha_ds2*-1*fcm/fcm0))* 10 ** -6
verwende math.sqrt statt ** 0.5:
Code: Alles auswählen
beta_ds = (((t-ts)/t1)/((350*(h0/h1) ** 2+(t-ts)/t1))) ** 0.5
@mathman: Mir ist noch aufgefallen, dass es keine ``return``-Anweisungen in den Funktionen gibt!?
Und wenn die innere Funktion die Werte unter den gleichen Namen wie die umgebende Funktion kennen soll und keinen der Namen neu binden muss, dann kann man bei lokalen Funktionen auch auf die Argumentübergabe verzichten.
Und wenn die innere Funktion die Werte unter den gleichen Namen wie die umgebende Funktion kennen soll und keinen der Namen neu binden muss, dann kann man bei lokalen Funktionen auch auf die Argumentübergabe verzichten.
- mathman
- User
- Beiträge: 92
- Registriert: Mittwoch 19. November 2008, 08:27
- Wohnort: Magdeburg
- Kontaktdaten:
Vielen Dank für eure Antworten, die Änderungen wurden gleich eingebaut
Für die weitere Bearbeitung, damit man in anderen Funktionen damit weiter rechnen kann, müsste man die einzelnen Variablen global machen, also mit global, oder aber bekommt man das auch mit return hin ?
Dann habe ich noch eine Frage, in unserem Hauptprogramm rufen wir z.Z. die Funktion wie folgt auf
Wenn man zum Beispiel Funktionen von math importiert, wie jetzt z.B. sqrt, kann man die einfach mit sqrt() anstatt mit math.sqrt aufrufen.
Im Gegensatz dazu müssen wir bis jetzt die Funktion mit berechnung.ksr() aufrufen. gib es eine Möglichkeit das ganze mit ksr() auch aufrufen zu können ?
Ja es gibt keine return Anweisung. So wie ich das bis jetzt mitbekommen habe, kann man dort nur einen einzelnen Wert mit Ausgeben.BlackJack hat geschrieben:@mathman: Mir ist noch aufgefallen, dass es keine ``return``-Anweisungen in den Funktionen gibt!?
Für die weitere Bearbeitung, damit man in anderen Funktionen damit weiter rechnen kann, müsste man die einzelnen Variablen global machen, also mit global, oder aber bekommt man das auch mit return hin ?
meinst du jetzt damit, dass man z.B. die Funktion schwinden so aufrufen kann "schwinden()", also keine Parameter übergeben muss? wenn ja dann machen wir was falsch, funktioniert leider nicht bei uns.BlackJack hat geschrieben:Und wenn die innere Funktion die Werte unter den gleichen Namen wie die umgebende Funktion kennen soll und keinen der Namen neu binden muss, dann kann man bei lokalen Funktionen auch auf die Argumentübergabe verzichten.
Dann habe ich noch eine Frage, in unserem Hauptprogramm rufen wir z.Z. die Funktion wie folgt auf
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import berechnung
berechnung.ksr(fck=20, Ac_brutto =200000, u=1800, RH=50, Zementtyp="SL", t=25550, t0=28, ts=0)
Im Gegensatz dazu müssen wir bis jetzt die Funktion mit berechnung.ksr() aufrufen. gib es eine Möglichkeit das ganze mit ksr() auch aufrufen zu können ?
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
"global" ist meistens nicht das, was man will. return liefert automatisch ein Tupel zurück, wenn man mehrere Rückgabewerte benötigt. Mit diesem Tupel kann man dann weiterarbeiten. Ansonsten kann man natürlich auch eine komplexere eigene Datenstruktur anlegen und diese zurückliefern.mathman hat geschrieben: Ja es gibt keine return Anweisung. So wie ich das bis jetzt mitbekommen habe, kann man dort nur einen einzelnen Wert mit Ausgeben.
Für die weitere Bearbeitung, damit man in anderen Funktionen damit weiter rechnen kann, müsste man die einzelnen Variablen global machen, also mit global, oder aber bekommt man das auch mit return hin ?
Code: Alles auswählen
In [1]: def foo():
...: return 1, 2
...:
In [5]: res = foo()
In [6]: res
Out[6]: (1, 2)
In [7]: type(res)
Out[7]: <type 'tuple'>
In [8]: a, b = foo()
In [9]: a
Out[9]: 1
In [10]: b
Out[10]: 2
Code: Alles auswählen
In [21]: def foo(param):
....: param.append(42)
....:
In [22]: l = range(3)
In [23]: foo(l)
In [24]: l
Out[24]: [0, 1, 2, 42]
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Du importierst es auch anders, vergleiche die folgende 2 Importe:mathman hat geschrieben:Wenn man zum Beispiel Funktionen von math importiert, wie jetzt z.B. sqrt, kann man die einfach mit sqrt() anstatt mit math.sqrt aufrufen.
Im Gegensatz dazu müssen wir bis jetzt die Funktion mit berechnung.ksr() aufrufen. gib es eine Möglichkeit das ganze mit ksr() auch aufrufen zu können ?
Code: Alles auswählen
from math import exp, pow
import berechnung
Was heißt "funktioniert nicht bei uns"? Falsches Ergebnis, kein Ergebnis, Fehlermeldung, ...?mathman hat geschrieben:meinst du jetzt damit, dass man z.B. die Funktion schwinden so aufrufen kann "schwinden()", also keine Parameter übergeben muss? wenn ja dann machen wir was falsch, funktioniert leider nicht bei uns.BlackJack hat geschrieben:Und wenn die innere Funktion die Werte unter den gleichen Namen wie die umgebende Funktion kennen soll und keinen der Namen neu binden muss, dann kann man bei lokalen Funktionen auch auf die Argumentübergabe verzichten.
[Großbuchstaben am Satzanfang erhöhen die Lesbarkeit.]