Was ist der Vorteil der neuen Druckfunktion in Python 3.x gegenüber der Python 2-Druckanweisung?

70

Ich habe mehrmals gehört, dass Drucken als Funktion (3.x) besser ist als als Anweisung (2.x). Aber wieso?

Ich war ein Fan davon, eine Aussage zu sein, hauptsächlich weil ich zwei Zeichen weniger eingeben konnte (dh die Klammern).

Es würde mich interessieren, in welchen Situationen die print-Anweisung sie einfach nicht schneidet und eine Funktion überlegen ist.

Rechteck
quelle
7
@ LennartRegebro: Es sind nicht nur zwei Zeichen: Der gesamte Ablauf fühlt sich anders an. Wenn Sie es nicht als Kontoauszug haben, entstehen Kosten - insbesondere für diejenigen, die an den Kontoauszug gewöhnt sind. Aber es lindert einige Schmerzen in Eckfällen.
Arne Babenhauserheide
2
Ja, jetzt müssen Sie zusätzliche Klammern nachverfolgen, was das Verketten vieler Zeichenfolgen etwas ärgerlicher macht, wenn Sie auch Inline-Zeichenfolgen durch Tupel ersetzen. Ich bekomme definitiv mehr Tippfehler / ungültige Syntaxfehler in Py3! Ich habe jetzt eine Variable verwendet, um den gedruckten Text zu generieren.
Demis

Antworten:

44

Alles von Jochens Antwort und Svens Antwort plus:

Sie können print()es an Orten verwenden, an denen Sie es nicht verwenden können print, z.

[print(x) for x in range(10)]
Lennart Regebro
quelle
13
Ich habe diesen absichtlich nicht erwähnt, da mir keine Verwendung einfiel, die ich print()eher als Ausdruck als als Aussage für empfehlen würde . In Ihrem Beispiel wird eine nicht benötigte Liste mit dem 10-fachen der Werte erstellt . Die NoneVerwendung ist sicherlich besser for x in range(10): print(x).
Sven Marnach
7
@Sven: Sicher. Ich hatte sicher nicht vor, dass es die akzeptierte Antwort ist. :)
Lennart Regebro
2
Ich habe gerade versucht, einen Druck in einem Lambda zu verwenden, in dem eine Klasse mir erlaubte, eine Funktion zum Protokollieren von Werten zu übergeben. Ich wollte sie nur ausdrucken. Ich musste eine Funktion an anderer Stelle definieren, weil Sie nicht schreiben können lambda x: print x:(.
Daniel Buckmaster
Es machte es auch den klugen Leuten, die die Sprache Python erstellen, einfacher, Funktionen wie ein anderes Trennzeichen
hinzuzufügen
57

Begründung

Die print-Anweisung ist seit langem in Listen zweifelhafter Sprachfunktionen enthalten, die in Python 3000 entfernt werden sollen, wie beispielsweise Guidos "Python Regrets" -Präsentation [1] . Daher ist das Ziel dieses PEP nicht neu, obwohl es unter Python-Entwicklern möglicherweise sehr umstritten ist.

Die folgenden Argumente für eine print () -Funktion stammen aus einer Python-3000-Nachricht von Guido selbst [2] :

  • print ist die einzige Funktionalität auf Anwendungsebene, der eine Anweisung zugeordnet ist. Innerhalb Python der Welt, wird Syntax der Regel als letztes Mittel eingesetzt, wenn etwas nicht ohne Hilfe vom Compiler durchgeführt werden. Print ist für eine solche Ausnahme nicht geeignet.
  • Irgendwann in der Anwendungsentwicklung besteht häufig die Notwendigkeit, die Druckausgabe durch etwas Anspruchsvolleres zu ersetzen, z. B. das Protokollieren von Anrufen oder Aufrufen in eine andere E / A-Bibliothek. Mit einer print () -Funktion ist dies ein unkomplizierter String-Ersatz. Heute ist es ein Chaos, all diese Klammern hinzuzufügen und möglicherweise die >> Stream-Syntax zu konvertieren.
  • Eine spezielle Syntax für den Druck stellt eine viel größere Barriere für die Evolution dar, z. B. ist eine hypothetische neue printf () - Funktion nicht zu weit hergeholt, wenn sie mit einer print () - Funktion koexistiert.
  • Es gibt keine einfache Möglichkeit, Druckanweisungen in einen anderen Aufruf umzuwandeln, wenn ein anderes Trennzeichen benötigt wird, keine Leerzeichen oder gar keine. Außerdem gibt es keine einfache Möglichkeit , überhaupt bequem Objekte mit einem anderen Separator als ein Raum zu drucken.
  • Wenn print () eine Funktion ist, ist es viel einfacher, sie innerhalb eines Moduls (nur def print(*args):...) oder sogar innerhalb eines Programms zu ersetzen (z. B. durch Einfügen einer anderen Funktion __builtin__.print). So wie es ist, kann man dies tun, indem man eine Klasse mit einer write () -Methode schreibt und diese sys.stdout zuweist - das ist nicht schlecht, aber definitiv ein viel größerer konzeptioneller Sprung, und es funktioniert auf einer anderen Ebene als print.

- PEP 3105 - Drucken zu einer Funktion machen

Jochen Ritzel
quelle
1
Schön, spricht aber nicht an, warum ein Ausdruck (Funktionsaufruf) einfacher zu handhaben ist als eine Aussage in Bezug auf Grammatikkonstrukte, insbesondere eine einfache lambda.
36

Ein Vorteil printeiner Funktion ist die Konsistenz. Es gibt keinen Grund dafür, eine Aussage zu machen. Vergleichen Sie diese beiden Zeilen

2.x: print >> my_file, x
3.x: print(x, file=my_file)

Die neue Version ähnelt viel mehr Python, nicht wahr?

Ein weiterer Vorteil der Funktionsversion ist die Flexibilität. Wenn Sie beispielsweise alle printAufrufe zu Debugging-Zwecken abfangen möchten , können Sie jetzt einfach Folgendes neu definieren print:

def print(*args, **kwargs):
    # whatever
    __builtins__.print(*args, **kwargs)
Sven Marnach
quelle
3
re "Die neue Version sieht viel mehr nach Python aus, nicht wahr?": Sie sind beide gültige Python, nicht wahr? Ich glaube, Sie meinten "pythonisch", aber selbst "pythonisch" ist ziemlich vage. Ich bin mit Ihrer Antwort nicht einverstanden, ich finde nur, dass Ihre Frage ein unzureichendes Argument für die printFunktion ist. (Die Delegation der Antwort an das OP ist für Psychologen und Manager, denke ich :)
tzot
2
ΤΖΩΤΖΙΟΥ: Ich sagte, es geht um Konsistenz. Dies ist keine harte Tatsache, daher muss ich das Urteil letztendlich dem Leser überlassen. Ich könnte es machen "Meiner Meinung nach sieht die neue Version eher wie Python aus", wenn Sie es vorziehen. :)
Sven Marnach
18

Ich dachte über diese Frage nach und hatte keine Ahnung von den Profis der Python 3-Version. Aber als ich die Spalten von pandas.DataFrame(ohne Index([...])) drucken musste , habe ich das herausgefunden

print * df.columns

löst eine Ausnahme aus, während

print (* df.columns)

funktioniert gut! Wenn Sie dieselben (konfigurierbaren) Druckoptionen in mehreren Anrufdrucken haben möchten, können Sie diese im Wörterbuch speichern und als übergeben**print_options

So zumindest *args, **kw_argsTricks sind ein guter Grund für printeine Funktion zu sein!

Alleo
quelle
12

Sie können das eingebaute printdurch ein benutzerdefiniertes ersetzen :

import os
import sys

def print(s):
   sys.stderr.write('Will now print ' + str(s) + '.' + os.linesep)
   sys.stdout.write(str(s) + os.linesep)

print(['A', 'list'])
# Output: 
# stderr: Will now print ['A', 'list'].
# stdout: ['A', 'list']

Sie können printinnerhalb eines Lambda oder eines Funktionsaufrufs usw.: Verwenden .

example_timeout_function(call=lambda: print('Hello world'), timeout=5)
do_things(print_function=print)
Artur Gaspar
quelle