Zijn er situaties waarin sys.stdout.write()
de voorkeur heeft boven print
?
(Voorbeelden:betere prestaties; code die logischer is)
Antwoord 1, autoriteit 100%
print
is slechts een dunne wrapper die de invoer opmaakt (aanpasbaar, maar standaard met een spatie tussen args en newline aan het einde) en de schrijffunctie van een bepaald object aanroept. Standaard is dit object sys.stdout
, maar u kunt een bestand doorgeven met behulp van het “chevron”-formulier. Bijvoorbeeld:
print >> open('file.txt', 'w'), 'Hello', 'World', 2+3
Zie: https://docs. python.org/2/reference/simple_stmts.html?highlight=print#the-print-statement
In Python 3.x wordt print
een functie, maar het is nog steeds mogelijk om iets anders door te geven dan sys.stdout
dankzij het file
argument.
print('Hello', 'World', 2+3, file=open('file.txt', 'w'))
Zie https://docs.python.org/3/library/functions .html#print
In Python 2.6+ is print
nog steeds een statement, maar het kan gebruikt worden als een functie met
from __future__ import print_function
Update: Bakuriu merkte op dat er een klein verschil is tussen de printfunctie en het printstatement (en meer in het algemeen tussen een functie en een statement).
In geval van een fout bij het evalueren van argumenten:
print "something", 1/0, "other" #prints only something because 1/0 raise an Exception
print("something", 1/0, "other") #doesn't print anything. The function is not called
Antwoord 2, autoriteit 52%
print
converteert eerst het object naar een string (als het nog geen string is). Er wordt ook een spatie voor het object geplaatst als dit niet het begin van een regel is en een teken voor een nieuwe regel aan het einde.
Als je stdout
gebruikt, moet je het object zelf naar een string converteren (door bijvoorbeeld “str” aan te roepen) en er is geen teken voor een nieuwe regel.
Dus
print 99
is gelijk aan:
import sys
sys.stdout.write(str(99) + '\n')
Antwoord 3, autoriteit 14%
Hier is wat voorbeeldcode gebaseerd op het boek Leren Pythonvan Mark Lutz dat uw vraag behandelt:
import sys
temp = sys.stdout # store original stdout object for later
sys.stdout = open('log.txt', 'w') # redirect all prints to this log file
print("testing123") # nothing appears at interactive prompt
print("another line") # again nothing appears. it's written to log file instead
sys.stdout.close() # ordinary file object
sys.stdout = temp # restore print commands to interactive prompt
print("back to normal") # this shows up in the interactive prompt
Als u log.txt in een teksteditor opent, wordt het volgende onthuld:
testing123
another line
Antwoord 4, autoriteit 13%
Mijn vraag is of er al dan niet
zijn situaties waarin
sys.stdout.write()
verdient de voorkeur boven
Nadat ik onlangs een script had ontwikkeld, heb ik het geüpload naar een Unix-server. Al mijn foutopsporingsberichten maakten gebruik van print
-instructies, en deze verschijnen nietin een serverlogboek.
Dit is een geval waarin je in plaats daarvan misschien sys.stdout.write
nodig hebt.
Antwoord 5, autoriteit 5%
Er is ten minste één situatie waarin u sys.stdout
wilt in plaats van afdrukken.
Als u een regel wilt overschrijven zonder naar de volgende regel te gaan, bijvoorbeeld bij het tekenen van een voortgangsbalk of een statusbericht, moet u iets herhalen als
Note carriage return-> "\rMy Status Message: %s" % progress
En aangezien print een nieuwe regel toevoegt, kunt u beter sys.stdout
gebruiken.
Antwoord 6, autoriteit 3%
Mijn vraag is of er situaties zijn waarin
sys.stdout.write()
de voorkeur heeft boven
Als u een opdrachtregeltoepassing schrijft die zowel naar bestanden als naar stdout kan schrijven, is dat handig. Je kunt dingen doen als:
def myfunc(outfile=None):
if outfile is None:
out = sys.stdout
else:
out = open(outfile, 'w')
try:
# do some stuff
out.write(mytext + '\n')
# ...
finally:
if outfile is not None:
out.close()
Het betekent wel dat u de with open(outfile, 'w') as out:
patroon, maar soms is het de moeite waard.
7, Autoriteit 2%
In 2.x, de print
Verklaring Preprocessen Wat u het geeft, draait u het aan in snaren langs de weg, het omgaan met scheiders en newlines en het toestaan van omleiding in een bestand. 3.x verandert het in een functie, maar heeft nog steeds dezelfde verantwoordelijkheden.
sys.stdout
is een bestand of bestand-zoals die methoden heeft om eraan te schrijven, die snaren of iets langs die lijn.
8
Een verschil tussen print
en sys.stdout.write
Om aan te wijzen in Python 3, is ook de waarde die wordt geretourneerd wanneer deze wordt uitgevoerd in de terminal. In Python 3, sys.stdout.write
Retourneert de lengte van de tekenreeks, terwijl print
retourneert alleen None
.
Dus het uitvoeren van de volgende code interactief in de terminal zou de tekenreeks afdrukken, gevolgd door zijn lengte, aangezien de lengte wordt geretourneerd en uitvoer wanneer deze interactief wordt uitgevoerd:
>>> sys.stdout.write(" hi ")
hi 4
9
Het heeft de voorkeur wanneer dynamisch afdrukken nuttig is, bijvoorbeeld om informatie in een lang proces te geven:
import time, sys
Iterations = 555
for k in range(Iterations+1):
# Some code to execute here ...
percentage = k / Iterations
time_msg = "\rRunning Progress at {0:.2%} ".format(percentage)
sys.stdout.write(time_msg)
sys.stdout.flush()
time.sleep(0.01)
10
In Python 3 is er geldige reden om afdruk te gebruiken over sys.stdout.write
, maar deze reden kan ook worden omgezet in een reden om sys.stdout.write
in plaats daarvan.
Deze reden is dat, nu afdrukken is een functie in Python 3, u kunt dit overschrijven. U kunt dus overal afdrukken in een eenvoudig script gebruiken en deze afdrukverklaringen bepalen, moet u in plaats daarvan schrijven naar stderr
. U kunt nu net de afdrukfunctie opnieuw definiëren, u kunt zelfs de afdrukfunctie globaal wijzigen door het te wijzigen met behulp van de ingebouwde module. Natuurlijk met file.write
U kunt opgeven welk bestand is, maar met overschrijvende afdruk kunt u ook de lijnscheider of argument-separator opnieuw definiëren.
andersom is. Misschien ben je absoluut zeker van je schrijven naar stdout
, maar weet ook dat je op iets anders gaat veranderen, je kunt besluiten sys.stdout.write
en gebruik te gebruiken Afdrukken voor foutlog of iets anders.
Dus wat u gebruikt, hangt af van hoe u het wilt gebruiken. print
is flexibeler, maar dat kan een reden zijn om het wel en niet te gebruiken. Ik zou toch voor flexibiliteit kiezen en voor print kiezen. Een andere reden om in plaats daarvan print
te gebruiken, is bekendheid. Meer mensen begrijpen nu wat je bedoelt met print en minder mensen weten sys.stdout.write
.
Antwoord 11
Als u in Python 2 een functie moet doorgeven, kunt u os.sys.stdout.write
toewijzen aan een variabele. U kunt dit niet doen (in de REPL) met print
.
>import os
>>> cmd=os.sys.stdout.write
>>> cmd('hello')
hello>>>
Dat werkt zoals verwacht.
>>> cmd=print
File "<stdin>", line 1
cmd=print
^
SyntaxError: invalid syntax
Dat werkt niet. print
is een magische functie.
Antwoord 12
Zijn er situaties waarin sys.stdout.write() de voorkeur verdient boven
afdrukken?
Ik werk bijvoorbeeld aan een kleine functie die sterren in piramideformaat afdrukt wanneer het getal als argument wordt doorgegeven, hoewel je dit kunt bereiken door end=””te gebruiken om print in een aparte regel, ik heb sys.stdout.writegebruikt in samenwerking met printom dit te maken werk. Om dit verder uit te werken drukt stdout.writein dezelfde regel af waar als printde inhoud altijd in een aparte regel wordt afgedrukt.
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)
13
Een van de verschillen is het volgende, bij het proberen een byte in zijn hexadecimale uitstraling te printen. We weten bijvoorbeeld dat de decimale waarde van 255
0xFF
in hexadecimale uitstraling is:
val = '{:02x}'.format(255)
sys.stdout.write(val) # Prints ff2
print(val) # Prints ff
14
Zijn er situaties waarin Sys.stdout.Write () de voorkeur heeft om af te drukken?
Ik heb ontdekt dat stdout beter werkt dan afdrukken in een multithreading-situatie. Ik gebruik een wachtrij (fifo ) om de lijnen op te slaan om te printen en ik houd alles vast Threads vóór de afdruklijn totdat mijn afdrukwachtrij leeg is. Toch verliest u afdrukken soms de laatste \ N op de Debug I / O (met behulp van de wing pro ide ).
Wanneer ik std.Out met \ n in de reeks gebruik, worden de Debug I / O-indelingen correct en de \ N’s nauwkeurig weergegeven.