2015-12-31 14 views
7

Uczę się o Pythonie i dostaję się do polecenia expandtabs w Pythonie. To jest oficjalna definicja w docs:Python expandtabs Operacja na ciągi znaków

string.expandtabs(s[, tabsize]) 

Rozwiń zaczepy w łańcuchu zastąpienie ich przez jedną lub więcej pomieszczeń, w zależności od bieżącej kolumny i danej wielkości karty. Numer kolumny jest resetowany do zera po każdej nowej linii występującej w ciągu znaków. Nie rozumie to innych niedrukowalnych znaków ani sekwencji unikowych. Domyślne wielkości zakładka do 8.

Więc co zrozumiałem z tego jest to, że domyślny rozmiar klapek jest 8 i zwiększenia, które możemy używać innych wartości

Więc, gdy próbowałem, że w shell, próbowałem następujące wejścia -

>>> 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 

Więc tutaj

  • 0 usuwa znak tabulatora całkowicie
  • 1 jest dokładnie tak jak domyślnie 8,
  • ale 2 jest dokładnie jak 1 a następnie
  • 3 różni
  • a następnie ponownie 4 jest jak używanie 1

i po to, że zwiększa do 8, który jest domyślny, a następnie wzrasta po 8. Ale dlaczego dziwny wzór w liczbach od 0 do 8? Wiem, że ma zaczynać się od 8, ale jaki jest powód?

Odpowiedz

7

str.expandtabs(n) nie jest odpowiednikiem str.replace("\t", " " * n).

str.expandtabs(n) śledzi bieżącą pozycję kursora w każdej linii i zastępuje znaleziony znak tabulatora liczbą spacji od aktualnej pozycji kursora do następnego punktu tabulacji. Przyjmuje się, że tabulatory są znakami n.

Jest to podstawą działania kart i nie jest specyficzne dla Pythona. Zobacz this answer to a related question dla dobrego wyjaśnienia tabulatorów.

string.expandtabs(n) odpowiada:

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 

i przykład użycia:

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

zauważyć, jak każdy znak tabulatora ("\t") została zastąpiona liczbą miejsc, które powoduje, że do linii z następnym zatrzymaniem tabulatora. W tym przypadku występuje tabulator co 10 znaków, ponieważ dostarczyłem n=10.

+0

Zobacz także [to pytanie] (http://stackoverflow.com/questions/2656997/python-expand-tabs-length-calculation) związane z twoim wyjaśnieniem. – Jens

+0

Czy mógłbyś wyjaśnić to w prostszy sposób? Nie rozumiem, jak to by zmieniło wynik w przypadkach, które dodałem w pytaniu. – WutWut

+0

@WutWut: Być może przyjrzyj się, co to jest [tab stop] (https://en.wikipedia.org/wiki/Tab_stop), a to powinno pomóc ci zrozumieć, jak działa "tabulator" (tabulator). – Jens

2

Metoda expandtabs zastępuje \t białymi znakami, aż do następnej wielokrotności parametru tabsize, tj. Następnej pozycji tabulatora.

dla np. przyjmuje {0} to (7) \ tstring ', więc' \ t 'jest zastępowane białymi spacjami do indeksu = 10, a ciąg znaków jest przesuwany do przodu. więc widzisz 10-7 = 3 białe spacje. (** liczba w nawiasach to numery indeksu **)

eg2. str.expandtabs(4)

"to (4) jest (7) \ tstring" tutaj "\ t 'zastępuje do indeksu = 8. więc widzisz tylko jeden biały spację

Powiązane problemy