Funktion und Rückgabe

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
Wodan
User
Beiträge: 3
Registriert: Samstag 13. Juni 2020, 15:55

Hallo liebe community ich habe eine Frage bezüglich des folgenden Codes

Code: Alles auswählen

def p(data):
    return ('<p>'+data+'<\p>')
    
print(p('hallo'))
Oder so

Code: Alles auswählen

def p(data):
    print ('<p>'+data+'<\p>')
 
p('hallo')   
Welcher der beiden funktion ist performance technisch besser oder welches wäre die richtige weisse eine Funktion zu schreiben und aufzurufen
Wo sind die vor und Nachteile
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Von der Performance her macht es keinen Unterschied.
Welches von beiden Vorgehen richtig ist, hängt davon ab, was die Funktion machen soll. Sie tut ja nicht das selbe.

Die eine Funktion packt eine Zeichenkette in Tags und gibt das Ergebnis zurück.
Die andere packt eine Zeichenkette in Tags, gibt sie in via print aus und None zurück. Sie sollte auch besser print_with_ptags(data) heißen, damit sie die Tätigkeit beschreibt.

Welche von beiden richtig ist, hängt vom Anwendungsfall ab.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich würde weiter gehen, und sagen, dass die erste Variante richtiger ist. Wenn man die Wahl hat zwischen einer Funktion, die nur eine Sache macht und das Ergebnis zurück gibt, oder einer, die mehrere Sachen macht, in diesem Fall auch ausgeben, nimmt man die mit weniger Umfang. Denn vielleicht will man die ausgabe mal in in eine Datei machen, oder in einen socket, oder gar nicht. All diese Wahlmöglichkeiten hat man nicht mehr, wenn das schon da drin passiert. Oder man muss mehr Parameter einführen.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Beide Funktionen sind schlecht. Strings setzt man nicht per + zusammen, sondern benutzt format-Strings. Dann sollte man klären, was `data` ist. Normaler Text muß bei HTML richtig codiert werden. Das tust Du nicht.
Die Klammern bei `return` sind überflüssig.
Funktionen sollten nichts per `print` ausgeben, weil man dann mit dem Ergebnis nichts anderes anfangen kann, als es ausgeben.
Performance spielt normalerweise gar keine Rolle.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Also beispielsweise so:

Code: Alles auswählen

#!/usr/bin/env python3
from markupsafe import Markup


def wrap_in_paragraph(content):
    return Markup("<p>{}</p>").format(content)


def main():
    print(wrap_in_paragraph("I <3 Python & HTML"))


if __name__ == "__main__":
    main()
Ausgabe:

Code: Alles auswählen

<p>I &lt;3 Python &amp; HTML</p>
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Oder halt mit Bordmitteln:

Code: Alles auswählen

import html

def get_paragraph(text):
    escaped = html.escape(text)
    return f"<p>{escaped}</p>"

print(get_paragraph("I <3 Python & HTML"))
Sofern HTML-Code im größeren Stil generiert werden soll, ist eine Template-Engine (z.B. Jinja2) aber meist besser geeignet.
Wodan
User
Beiträge: 3
Registriert: Samstag 13. Juni 2020, 15:55

Vielen Dank für die vielen Antworten
Ja es sollen nur strings ausgegeben werden.
Ich werde mal die Art und weise von snafu als erstes ausprobieren
Antworten