2015-12-31 6 views
7

Ich lerne über Python und kam zum expandtabs Befehl in Python. Dies ist die offizielle Definition in der Dokumentation:Python expandtabs string operation

string.expandtabs(s[, tabsize]) 

Expandieren tabs in einem String sie durch einen oder mehr Räume zu ersetzen, in Abhängigkeit von der aktuellen Spalte und der gegebenen Tab-Größe. Die Spaltennummer wird nach jedem Zeilenumbruch in der Zeichenfolge auf Null zurückgesetzt. Andere nicht druckbare Zeichen oder Escape-Sequenzen werden nicht verstanden. Die Registerkarte Größe standardmäßig 8.

Also, was ich von dem verstehen, dass die Standardgröße von Tabs 8 ist, und dass zu erhöhen, können wir andere Werte

So verwenden, als ich versuchte, dass in der Shell habe ich versucht, die folgenden Eingaben -

>>> str = "this is\tstring" 
>>> print str.expandtabs(0) 
this isstring 
>>> print str.expandtabs(1) 
this is string 
>>> print str.expandtabs(2) 
this is string 
>>> print str.expandtabs(3) 
this is string 
>>> print str.expandtabs(4) 
this is string 
>>> print str.expandtabs(5) 
this is string 
>>> print str.expandtabs(6) 
this is  string 
>>> print str.expandtabs(7) 
this is  string 
>>> print str.expandtabs(8) 
this is string 
>>> print str.expandtabs(9) 
this is string 
>>> print str.expandtabs(10) 
this is string 
>>> print str.expandtabs(11) 
this is string 

Also hier,

  • 0 vollständig das Tab-Zeichen entfernt,
  • 1 ist genau wie der Standard 8,
  • aber 2 ist genau wie 1 und dann
  • 3 unterscheiden
  • und dann wieder 4 ist wie mit 1

und danach erhöht bis 8 das ist der Standard und steigt dann nach 8. Aber warum das seltsame Muster in Zahlen von 0 bis 8? Ich weiß, dass es von 8 anfangen soll, aber was ist der Grund?

Antwort

7

str.expandtabs(n) entspricht nicht str.replace("\t", " " * n).

str.expandtabs(n) verfolgt die aktuelle Cursorposition in jeder Zeile und ersetzt jedes gefundene Tabulatorzeichen durch die Anzahl der Leerzeichen von der aktuellen Cursorposition zum nächsten Tabstopp. Als Tabulatoren werden alle n Zeichen verwendet.

Dies ist grundlegend für die Funktionsweise von Registerkarten und nicht für Python. Eine gute Erklärung der Tabulatoren finden Sie unter this answer to a related question.

string.expandtabs(n) entspricht:

def expandtabs(string, n): 
    result = "" 
    pos = 0 
    for char in string: 
     if char == "\t": 
      # instead of the tab character, append the 
      # number of spaces to the next tab stop 
      char = " " * (n - pos % n) 
     if char == "\n": 
      pos = 0 
     else: 
      pos += len(char) 
     result += char 
    return result 

und ein Beispiel für die Verwendung:

>>> input = "123\t12345\t1234\t1\n12\t1234\t123\t1" 
>>> print(expandtabs(input, 10)) 
123  12345  1234  1 
12  1234  123  1 

Hinweis, wie die einzelnen Tabulatorzeichen ("\t") hat sich mit der Anzahl der Leerzeichen ersetzt worden, dass es an die Leitung bewirkt bis zum nächsten Tabstopp. In diesem Fall gibt es einen Tabstopp alle 10 Zeichen, weil ich n=10 geliefert habe.

+0

Siehe auch [diese Frage] (http://stackoverflow.com/questions/2656997/python-expand-tabs-length-calculation) im Zusammenhang mit Ihrer Erklärung. – Jens

+0

Könnten Sie das bitte auf einfachere Weise erklären? Ich kann nicht verstehen, wie dies die Ausgabe in den Fällen ändern würde, die ich in der Frage hinzugefügt habe. – WutWut

+0

@WutWut: Vielleicht werfen Sie einen Blick auf was ein [Tabstop] (https://en.wikipedia.org/wiki/Tab_stop) ist, und das sollte Ihnen helfen zu verstehen, wie ein Tab (Tabulator) funktioniert. – Jens

2

Die Methode expandtabs ersetzt die \t durch Leerzeichen Zeichen bis zum nächsten Vielfachen von Tabsize-Parameter, d. H. Die nächste Tab-Position.

für zB. take str.expandtabs(5)

'dies (5) ist (7) \ tstring' so das '\ t' wird durch whitespace ersetzt, bis index = 10 und folgende string wird vorwärts bewegt. Sie sehen also 10-7 = 3 Leerzeichen. (** Zahl in Klammern sind Indexnummern **)

eg2. str.expandtabs(4)

'Dies (4) ist (7) \ tstring' hier '\ t' ersetzt bis Index = 8. So sehen Sie nur einen Whitespace