Funktion mit Rückgabewert

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
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

Hallo Leute,

ich komme nicht weiter.
Google kann nicht helfen.
Ich habe eine Funktion mit Rückgabewert geschrieben.
Ich übergebe eine Stringvariable, und möchte die Länge in Byte ermitteln.
Soweit geht auch alles. Ich schaffe es einfach nicht die ermittelten Bytes zurückzugeben.

Code: Alles auswählen

 def längeecocode(eco):
    x=(len(eco))
    x=round(x /1000000,2)
    return x 
In x steht die Länge in Byte
Als Ausgabe erhalte ich: <function längeecocode at 0x0335F270>

Danke...
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Du hast die Klammern an der falschen Stelle. Statt um (len(eco)) sollten sie beim Aufruf von längeecocode stehen. Also len(eco) und längeecocode("...").
In specifications, Murphy's Law supersedes Ohm's.
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

pillmuncher hat geschrieben: Donnerstag 9. Juni 2022, 23:52 Du hast die Klammern an der falschen Stelle. Statt um (len(eco)) sollten sie beim Aufruf von längeecocode stehen. Also len(eco) und längeecocode("...").
Hallo,

da kommt das gleiche raus. Ich erhalte als Rückgabewert: <function längeecocode at 0x03EAF270>

Bis dann...
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@PeterL: Dann solltest du vielleicht den Code posten, der den Aufruf deiner Funktion zeigt, nicht nur deren Definition.

Außerdem könnte es sein, dass du versehentlich sowas programmiert hast:

Code: Alles auswählen

def längeecocode(eco):
    x=len(eco)
    x=round(x /1000000,2)
    return längeecocode  #  <======================
Das könnte dein Ergebnis erklären.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PeterL: Die Länge in Bytes bekommst Du so nicht heraus. Also mal davon abgesehen, das durch 1 Million teilen dabei so überhaupt nicht sinnvoll ist, und man `round()` nur verwenden sollte wenn man tatsächlich mit so einem gerundeten Wert weiterrechnen will, liefert `len()` auf Zeichenketten die Anzahl der Codepoints. Wie viele Bytes das sind kommmt auf die Kodierung an. Was willst Du denn eigentlich wissen? Also wozu denkst Du die Länge in Bytes zu benötigen?

`längeecocode()` ist kein guter Name. Es ist schwer zu lesenwennmanWortesoeinfachohneLeerzeichenaneinanderklebt. Also `laenge_eco_code()` wäre leichter zu lesen. Das beschreibt aber keine Tätigkeit, was Funktions (und Methodennamen) in der Regel aber tun, damit man sie leichter von eher passiven Werten unterscheiden kann.

`berechne_eco_code_laenge()` wäre da eventuell ein passender Name.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

pillmuncher hat geschrieben: Freitag 10. Juni 2022, 00:40 @PeterL: Dann solltest du vielleicht den Code posten, der den Aufruf deiner Funktion zeigt, nicht nur deren Definition.

Außerdem könnte es sein, dass du versehentlich sowas programmiert hast:

Code: Alles auswählen

def längeecocode(eco):
    x=len(eco)
    x=round(x /1000000,2)
    return längeecocode  #  <======================
Das könnte dein Ergebnis erklären.
Hallo,

leider kommt das selbe Ergebnis raus.
ich erstelle eine Variable so: eco = eco + ecocode in ecocode steht irgendwas ,es ist eine Stringvariable. Alles soll in einer Variable abgelegt werden in eco.
Wenn ich die Len Funktion innerhalb einer def benutze geht alles. Mit Return aus einer def geht es nicht. Mit Print kann ich ohne Rückgabefunktion aus einer def mir das Ergebnis anzeigen lassen. Irgendwie kann Return nichts zurückgeben.

Bis dann...
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@PeterL:

Es heißt nicht "eine def", sondern "eine Funktion". Funktionen werden mithilfe des def-Keywords definiert.

Nochmal: Zeig, wie du die Funktion längeecocode() aufrufst. Wie soll man helfen, wenn du dich weigerst, den Code zu zeigen?
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

PeterL hat geschrieben: Donnerstag 9. Juni 2022, 23:37 Ich übergebe eine Stringvariable, und möchte die Länge in Byte ermitteln.
Die Funktion len liefert bei bytes die Anzahl der Bytes zurück und bei str die Anzahl der Zeichen.

Wenn man wissen will, wie viel Bytes übertragen werden müssen, muss man den str erst nach bytes encodieren.
Gleichzeitig muss auch das Encoding festgelegt werden. Mit utf8 liegt man meistens richtig. Es gibt aber auch Anwendungen, die ein anderes mulbibyte encoding für Unicode erwarten (Datenbanken z.B.).

Code: Alles auswählen

def bytes_len(text):
    return len(text.encode("utf8"))


wort = "Überpython"
länge_utf8 = len(wort)
länge_bytes = bytes_len(wort)


print("Anzahl der Zeichen:", länge_utf8)
print("Anzahl der Bytes:", länge_bytes)
Anzahl der Zeichen: 10
Anzahl der Bytes: 11
Das kommt daher, dass bei dem Encoding utf8 pro Zeichen 8 - 32 Bit encodiert werden können.
Das Ü benötigt 2 Bytes bei utf8. Der Buchstabe Ü kommt nicht im ASCII Zeichensatz vor.


Trotzdem mal den Code posten, der deine Funktion aufruft, da das, was du geschrieben hast, nicht zu der Ausgabe passt.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

PeterL hat geschrieben: Donnerstag 9. Juni 2022, 23:37 Ich übergebe eine Stringvariable, und möchte die Länge in Byte ermitteln.
Die Funktion len liefert bei bytes die Anzahl der Bytes zurück und bei str die Anzahl der Zeichen.

Wenn man wissen will, wie viel Bytes übertragen werden müssen, muss man den str erst nach bytes encodieren.

Code: Alles auswählen

def bytes_len(text):
    return len(text.encode("utf8"))


wort = "Überpython"
länge_utf8 = len(wort)
länge_bytes = bytes_len(wort)


print("Anzahl der Zeichen:", länge_utf8)
print("Anzahl der Bytes:", länge_bytes)
Anzahl der Zeichen: 10
Anzahl der Bytes: 11
Das kommt daher, dass bei dem Encoding utf8 pro Zeichen 8 - 32 Bit encodiert werden können.
Das Ü benötigt 2 Bytes bei utf8. Der Buchstabe Ü kommt nicht im ASCII Zeichensatz vor.


Trotzdem mal den Code posten, der deine Funktion aufruft, da das, was du geschrieben hast, nicht zu der Ausgabe passt.
[/quote]

Hallo,

ich erhalte immer noch die selbe Fehlermeldung: <function längeecocode at 0x03D8F228>

Mein Code:

Code: Alles auswählen

def längeecocode(eco):
   return len(eco.encode("utf8"))
   
  
eco='A00'
längeecocode(eco)
print (längeecocode)    
Bis dann...
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@PeterL: Versuch mal zu erklären, was dieser Code macht:

Code: Alles auswählen

print(längeecocode)
Danach schau dir diesen Code und sein Ergebnis an:

Code: Alles auswählen

print(längeecocode('blubb'))
Vergleiche beide. Ist dir der Unterschied klar?
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

ich erhalte immer noch die selbe Fehlermeldung: <function längeecocode at 0x03D8F228>
Du musst auf jeden Fall noch die Basics lernen.
Der Name "ländercode" zeigt auf die erstellte Funktion.
Die Klammern () rufen die Funktion auf und dann wird ein oder mehrere Objekte zurückgeliefert.
Du rufst die Funktion aber nicht auf.

Code: Alles auswählen

def hallo():
    return 42


print("Repräsentation der Funktion", hallo)
print("Name der Funktion", hallo.__name__)
print("Rückgabewert", hallo())
print()

bar = hallo

print("Repräsentation der Funktion", bar)
print("Name der Funktion", bar.__name__)
print("Rückgabewert", bar())
Repräsentation der Funktion <function hallo at 0x7f568bb6b250>
Name der Funktion hallo
Rückgabewert 42

Repräsentation der Funktion <function hallo at 0x7f568bb6b250>
Name der Funktion hallo
Rückgabewert 42
Wie man sehen kann, zeigen die Namen "hallo" und "bar" auf dieselbe Funktion (virtuelle Speicheradresse ist gleich).

Das Attribut __name__ wird der Funktion zu Zeitpunkt der Definition zugewiesen.
Erst der Aufruf der Funktion gibt auch einen Rückgabewert zurück.



Was man noch so mit Funktionen machen kann:

Code: Alles auswählen

def hello():
    print("Hello World")

def hello_david():
    print("Hello David")


functions = [hello, hello_david]

# Auf das erste Element zugreifen (hello) und die Funktion aufrufen mit ()
functions[0]()

# Auf das zweite Element zugreifen (hello) und die Funktion aufrufen mit ()
functions[1]()
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

Hallo Leute,

danke für euere Hilfe.
Ich weis immer noch nicht wo der Fehler liegt.
Ich lasse es damit gut sein, ich programmiere es um.
Danke...
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@PeterL: So schwer ist das wirklich nicht. Deine Funktion hat ein return-Statement, etwa so:

Code: Alles auswählen

def foo():
    return 123
Wenn du diese Funktion so aufrufst:

Code: Alles auswählen

foo()
dann sagst du damit, dass du mit dem Rückgabewert - der 123 - nichts machen willst. Willst du dagegen diesen Wert verwenden, musst du ihn zB. an einen Namen binden:

Code: Alles auswählen

x = foo()
Diesen Namen kannst du anschließend verwenden:

Code: Alles auswählen

print(x)
Die Ausgabe wäre hier 123.

Was du dagegen gemacht hast, ist sowas:

Code: Alles auswählen

foo()
print(foo)
foo ist ein Funktionsobjekt, dessen String-Repräsentation du ausgibst. Die Ausgabe würde dann zB. so aussehen:

Code: Alles auswählen

<function foo at 0x7fead9034940>
Nochmal im Zusammenhang zum Vergleich:

Code: Alles auswählen

>>> def foo():
...     return 123
... 
>>> print(foo)
<function foo at 0x7fead9034940>
>>> print(foo())
123
>>> x = foo()
>>> print(x)
123
Ist es jetzt klarer?
In specifications, Murphy's Law supersedes Ohm's.
Antworten