it-swarm.dev

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

Ich habe mehrmals gehört, dass print 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 (dh die Klammern) eingeben konnte.

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

67
rectangletangle

Alles aus Jochens Antwort und Svens Antwort plus:

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

[print(x) for x in range(10)]
42
Lennart Regebro

Begründung

Die print-Anweisung taucht schon lange auf Listen zweifelhafter Sprachmerkmale auf, die in Python 3000) entfernt werden sollen, wie Guidos "Python Regrets" -Präsentation [1] Daher ist das Ziel dieses PEP nicht neu, obwohl es unter den Entwicklern von Python) umstritten sein könnte.

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

  • print ist die einzige Funktion auf Anwendungsebene, der eine Anweisung zugeordnet ist. In der Welt von Python wird die Syntax im Allgemeinen als letzter Ausweg verwendet, wenn etwas nicht ohne die Hilfe des Compilers möglich ist . Print ist für eine solche Ausnahme nicht geeignet.
  • Irgendwann in der Anwendungsentwicklung hat man häufig das Bedürfnis, die Druckausgabe durch etwas Anspruchsvolleres zu ersetzen, wie das Protokollieren von Anrufen oder das Aufrufen einer anderen E/A-Bibliothek. Mit einer print () -Funktion ist dies ein einfacher String-Ersatz. Heute ist es ein Chaos, all diese Klammern hinzuzufügen und möglicherweise die >> Stream-Stilsyntax zu konvertieren.
  • Eine spezielle Drucksyntax stellt eine viel größere Barriere für die Evolution dar, z. Eine hypothetische neue Funktion printf () wird nicht zu weit hergeholt, wenn sie zusammen mit einer Funktion print () existiert.
  • Es gibt keine einfache Möglichkeit, print-Anweisungen in einen anderen Aufruf zu konvertieren, wenn ein anderes Trennzeichen benötigt wird, keine Leerzeichen oder überhaupt keine. Es gibt auch keine einfache Möglichkeit , Objekte bequem mit einem anderen Trennzeichen als einem Leerzeichen 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. indem eine andere Funktion in __builtin__.print Eingefügt wird). 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 - Druckfunktion einrichten

53
Jochen Ritzel

Ein Vorteil von print als Funktion ist die Konsistenz. Es gibt keinen Grund für eine Aussage. Vergleichen Sie diese beiden Zeilen

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

Die neue Version ähnelt doch eher Python, oder?

Ein weiterer Vorteil der Funktionsversion ist die Flexibilität. Wenn Sie beispielsweise alle print Aufrufe zum Debuggen abfangen möchten, können Sie print jetzt einfach neu definieren:

def print(*args, **kwargs):
    # whatever
    __builtins__.print(*args, **kwargs)
33
Sven Marnach

Ich habe über diese Frage nachgedacht und hatte keine Ahnung, welche Vorteile python 3 version. Aber als ich die Spalten von pandas.DataFrame Drucken musste (ohne Index([...])) Ich habe das herausgefunden

print * df.columns

wirft eine Ausnahme, während

print (* df.columns)

funktioniert gut! Und wenn Sie die gleichen (konfigurierbaren) Druckoptionen in mehreren Anrufausdrucken haben möchten, können Sie diese im Wörterbuch speichern und als **print_options Übergeben.

Zumindest *args, **kw_args Tricks sind also ein guter Grund, warum print eine Funktion ist!

18
Alleo

Sie können das eingebaute print durch 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 print in einem Lambda oder einem Funktionsaufruf usw .: verwenden.

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