Py3 Funtion mit Unterfunktion und Parameter

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
Benutzeravatar
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

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 :mrgreen:

Vielen dank im voraus :)
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

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:

Code: Alles auswählen

kriechen(alpha_potenz, h0, RH0, RH, h1, t1, fcm0, fcm, t0, t)
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:

Code: Alles auswählen

x = 1500 * alpha_3
if beta_H > x:
      beta_H = x
kannst du mit 'min' einfacher schreiben:

Code: Alles auswählen

beta_H = min(beta_H, 1500 * alpha_3)
solche Berechnungen würde ich besser formatieren, damit auf den ersten Blick klar ist, welche Klammern für was verwendet werden:

Code: Alles auswählen

beta_H = 150*(1+(1.2 * RH / RH0 ) ** 18)*( h0 / h1 )+250 * alpha_3
bei dieser Zeile:

Code: Alles auswählen

e_cds0 = ((220+110*alpha_ds1) * exp(alpha_ds2*-1*fcm/fcm0))* 10 ** -6
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:

Code: Alles auswählen

beta_ds = (((t-ts)/t1)/((350*(h0/h1) ** 2+(t-ts)/t1))) ** 0.5
importiere Module am Anfang der Datei.
BlackJack

@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.
Benutzeravatar
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 :)
BlackJack hat geschrieben:@mathman: Mir ist noch aufgefallen, dass es keine ``return``-Anweisungen in den Funktionen gibt!?
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 ?
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.
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.

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)
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 ?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ?
"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.

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
Auf jeden Fall sollte man das Arbeiten mit "global" vermeiden und benötigte Werte per Parameter übergeben bzw. sich zurückliefern lassen, oder man hat die Möglichkeit auf dem selben Objekte direkt zu arbeiten (z.B. bei Listen o.ä.).

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
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

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 ?
Du importierst es auch anders, vergleiche die folgende 2 Importe:

Code: Alles auswählen

from math import exp, pow
import berechnung
daraus sollte klar werden wie du den Punkt lösen kannst.
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

mathman hat geschrieben:
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.
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.
Was heißt "funktioniert nicht bei uns"? Falsches Ergebnis, kein Ergebnis, Fehlermeldung, ...?

[Großbuchstaben am Satzanfang erhöhen die Lesbarkeit.]
Antworten