516 Stimmen

Der Unterschied zwischen sys.stdout.write und print?

Gibt es Situationen, in denen sys.stdout.write() ist vorzuziehen gegenüber print ?

( Beispiele: bessere Leistung; sinnvollerer Code)

6 Stimmen

Welche Version von Python? 2.x oder 3.x?

0 Stimmen

Ehrlich gesagt würde ich gerne beides wissen, obwohl ich keine Erfahrung mit Python 3 habe. Habe die Frage aktualisiert.

29 Stimmen

@S.Lott : Frage nach den grundlegenden Unterschieden zwischen sys.stdout.write() y print (bzw. warum Python beides hat), ist eine durchaus berechtigte Frage und braucht keine Beispiele. Der Auftraggeber hat nicht gesagt, dass die Befehlssyntax verwirrend ist.

2voto

David Poundall Punkte 25

Gibt es Situationen, in denen sys.stdout.write() gegenüber print vorzuziehen ist?

Ich habe festgestellt, dass stdout in einer Multithreading-Situation besser funktioniert als print. Ich verwende eine Warteschlange ( FIFO ), um die zu druckenden Zeilen zu speichern, und ich halte alle Threads vor der Druckzeile, bis meine Druckwarteschlange leer ist. Trotzdem verliere ich bei der Verwendung von print manchmal die letzte \n auf der Debug-E/A (unter Verwendung der Wing Pro IDE ).

Wenn ich std.out mit \n in der Zeichenkette, werden die Debug-E/A korrekt formatiert und die \n werden genau angezeigt.

2voto

Hielke Walinga Punkte 2396

In Python 3 gibt es einen triftigen Grund für die Verwendung von print over sys.stdout.write aber dieser Grund kann auch in einen Grund umgewandelt werden, die sys.stdout.write stattdessen.

Der Grund dafür ist, dass print jetzt eine Funktion in Python 3 ist, die man überschreiben kann. Sie können also print überall in einem einfachen Skript verwenden und entscheiden, dass diese print-Anweisungen nach stderr stattdessen. Sie können nun einfach die Druckfunktion umdefinieren, Sie könnten sogar die Druckfunktion global ändern, indem Sie sie mit dem builtins-Modul ändern. Natürlich mit file.write können Sie angeben, um welche Datei es sich handelt, aber mit overwriting print können Sie auch das Zeilentrennzeichen oder das Argumententrennzeichen neu definieren.

Der umgekehrte Weg ist. Vielleicht sind Sie absolut sicher, dass Sie schreiben, um stdout und Sie wissen, dass Sie den Druck auf etwas anderes umstellen werden, können Sie sich für die Verwendung von sys.stdout.write , und verwenden Sie print für das Fehlerprotokoll oder etwas anderes.

Was Sie verwenden, hängt also davon ab, wie Sie es verwenden wollen. print ist flexibler, aber das kann ein Grund dafür sein, es zu verwenden oder nicht zu verwenden. Ich würde mich trotzdem für die Flexibilität entscheiden und den Druck wählen. Ein weiterer Grund für die Verwendung print ist stattdessen die Vertrautheit. Mehr Menschen wissen jetzt, was Sie mit Druck meinen, und weniger wissen sys.stdout.write .

2voto

shanecandoit Punkte 511

Wenn Sie in Python 2 eine Funktion weitergeben müssen, können Sie os.sys.stdout.write auf eine Variable. Sie können dies nicht tun (in der REPL ) mit print .

>import os
>>> cmd=os.sys.stdout.write
>>> cmd('hello')
hello>>>

Das funktioniert wie erwartet.

>>> cmd=print
  File "<stdin>", line 1
    cmd=print
            ^
SyntaxError: invalid syntax

Das funktioniert nicht. print ist eine magische Funktion.

2voto

Samuel Muldoon Punkte 1262

Sie haben gefragt,

Was ist der Unterschied zwischen sys.stdout.write y print ?`

Am besten kann ich das erklären, wenn ich Ihnen zeige, wie man schreibt print in Bezug auf sys.stdout

Im Folgenden habe ich drei verschiedene Möglichkeiten zur Implementierung der Python print Funktion:

Durchführung 1

import sys

def print(*args, sep=" ", file=sys.stdout, end="\n") -> None:
    # implementation One
    file.write(sep.join(str(arg) for arg in args))
    file.write(end)

Durchführung 2

def print(*args, sep=" ", file=sys.stdout, end="\n") -> None:
    # Implementation 2    
    file.write(str(args[0]))
    for arg in args[1:]:
        file.write(sep)
        file.write(str(arg))
    file.write(end)
    return

Umsetzung 3

def print(*args, sep=" ", file=sys.stdout, end="\n") -> None:
    # implementation 3 
    it = iter(args)
    arg = next(it)
    file.write(str(arg))
    try:
        while True:
            arg = next(it)
            file.write(sep)
            file.write(str(arg))
    except StopIteration:
        pass
    file.write(end)
    return None

1voto

Sreedhar Danturthi Punkte 6709

Gibt es Situationen, in denen sys.stdout.write() besser ist als drucken?

Ich arbeite zum Beispiel an einer kleinen Funktion, die Sterne im Pyramidenformat ausgibt, wenn die Zahl als Argument übergeben wird, obwohl man das auch mit end="" in einer separaten Zeile zu drucken, habe ich sys.stdout.write in Abstimmung mit drucken damit dies funktioniert. Um dies näher zu erläutern stdout.write druckt in der gleichen Zeile wie drucken gibt seinen Inhalt immer in einer separaten Zeile aus.

import sys

def printstars(count):

    if count >= 1:
        i = 1
        while (i <= count):
            x=0
            while(x<i):
                sys.stdout.write('*')
                x = x+1
            print('')
            i=i+1

printstars(5)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X