2016-10-21 5 views
-1
for size in [1, 2, 3, 4]: 
    result = 0 
    print("size=" + str(size)) 
    for element in range(size): 
     result = result + element 
     print(" adding " + str(element)+", result so far=" + str(result)) 
    print("Done. size=" + str(size) + " result=" + str(result)) 
print("All done!") 

Ich frage mich, warum wir die str() Funktion auf size und result in der 7. Zeile verwenden. Ich weiß, dass wir nicht Integer und String in einer einzigen Druckfunktion verwenden können, aber wenn die Regel so ist, warum gibt es kein Problem in diesem Code (über Integer + String-Regel)?Python Integer und String Mit

x=18 
print("Hello , I am" , x , "years old.") 

Wir verwenden Integer und String in einer einzigen Zeile, nicht wahr?

+3

Im ersten Code drucken Sie eine Zeichenfolge. Im zweiten Code drucken Sie ein Tupel. – Chr

+1

@ C.Dlp - Das ist nur in Python 2, und es sieht so aus, als ob das OP Python 3 verwendet, in diesem Fall ist es ein Funktionsaufruf mit mehreren Argumenten anstatt einer Anweisung, die mit einem einzelnen Tupel arbeitet. – TigerhawkT3

Antwort

0

Der Operator plus (+) kann keine Zeichenfolgen und Zahlen hinzufügen. Deshalb müssen Sie str() verwenden.

Wenn Sie versuchen:

"hello" + 2 

Sie den Fehler erhalten:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: cannot concatenate 'str' and 'int' objects 

Wenn print(a, "b", c, d) verwenden Sie mehrere Argumente sind vorbei und es ist nicht für die Verkettung benötigen. Jedes Argument wird vor dem Drucken in eine Zeichenfolge umgewandelt.

1

Es geht um die Ordnung der Dinge laufen:

"Done. size=" + str(size) + " result=" + str(result) 

hat zuerst getan werden, vor die print Funktion aufgerufen wird. Die print Funktion erhält nur die einzige verbundene Zeichenfolge - es hat keine Ahnung, dass ein + verwendet wurde, um es zu konstruieren.

In diesem Fall:

print("Hello , I am" , x , "years old.") 

die print Funktion alle vier Argumente bekommt (eigentlich eine 4-Element-Tupel) und kann nun seine Magie arbeitet auf jede Konvertierung in einen String selbst (siehe Unnötige Detail unten).

Übrigens, wenn Sie dagegen protestieren, dass Sie str() verwenden müssen, gibt es andere Möglichkeiten, die zu druckende Zeichenfolge zu formatieren. Die folgenden Zeilen alle produzieren die gleiche Ausgabe:

print("Done. size=" + str(size) + " result=" + str(result)) 
print("Done. size=%d result=%d" % (size, result)) 
print("Done. size={} result={}".format(size, result)) 
print(f"Done. size={size:} result={result:}") 

die letzten f" " benötigt Python 3.6 oder höher.

unnötiges Detail:

Die Umwandlung in str() in der print() Funktion tatsächlich durchgeführt wird (in der C-Implementierung) von dem API-Aufruf Python PyFile_WriteObject() das Flag Py_PRINT_RAW verwenden. Wenn Py_PRINT_RAW angegeben wird, wird das str() des Objekts geschrieben.

+0

print ("Fertig. Size =", size, "result =", result) Es hat auch geklappt. Können wir str- und int-Objekte mit Komma verketten? – Gingerbread

+0

Es verkettet Objekte nicht mit dem Komma. Print erhält nur ein paar Argumente, wandelt sie in Strings um und verkettet sie später. – purpletentacle

+0

@Lebkuchen: nein. Ein Komma ist kein Operator in Python, und es wäre höllisch verwirrend, wenn es wäre. Die 'print'-Funktion liest jedes Argument und führt selbst ein' str() 'aus. Was stimmt nicht mit den Mechanismen, die ich dir gezeigt habe? – cdarke

1

Nur weil zwei Referenzen zusammen in einer Zeile erscheinen, bedeutet das nicht, dass sie verkettet werden. Im ersten Beispiel verketten Sie Strings (deshalb müssen sie alle Strings sein) und senden sie an die Funktion print. Im zweiten Beispiel senden Sie mehrere Argumente an die print-Funktion, die jeden einzelnen drucken wird. Die print-Funktion kann eine beliebige Anzahl von Argumenten verarbeiten, die nicht notwendigerweise vom selben Typ sein müssen.