2009-10-05 9 views
28

Jak należy tę funkcję zmienić, aby zwróciła "123456"?Jak działa potrójny cytat z Pythona?

def f(): 
    s = """123 
    456""" 
    return s 

UPDATE: Każdy, pytanie polega na zrozumieniu, jak nie mieć \ t lub cokolwiek innego, gdy o komentarz wielowierszowego, a nie jak do korzystania z modułu re.

+2

Czy to zadanie domowe? Wskazówka: Twój ciąg to "123 456" –

+7

To nie jest praca domowa. Próbuję zrozumieć, jak działa "" "." –

+0

Ale jak nie mam \ t w nim? –

Odpowiedz

50

Nie używaj potrójnie cytowanych ciągów, gdy nie chcesz dodatkowych spacji, tabulacji i znaków nowej linii.

Zastosowanie niejawna kontynuacja, to bardziej eleganckie:

def f(): 
    s = ('123' 
     '456') 
    return s 
+1

To przychodziło mi naturalnie, ale nie wtedy, gdy musiałem podłączać wartości zmiennych za pomocą a ex:% s, ale niestety, nawet następujące prace: 's = ('String% s'' ''String% s')% ('foo', 'bar')' – Spade

6

Może jestem brakuje czegoś oczywiste, ale co o tym:

def f(): 
    s = """123456""" 
    return s 

lub po prostu:

def f(): 
    s = "123456" 
    return s 

lub jeszcze prościej:

def f(): 
    return "123456" 

Jeśli to nie odpowiedz na pytanie, a następnie wyjaśnij, na czym polega pytanie.

+0

O zrozumieniu jak nie mieć \ t czy cokolwiek, gdy masz komentarz wielowierszowy. –

+9

Potrójnie cytowany ciąg nie jest komentarzem wielowierszowym, jest nieprzetworzonym łańcuchem znaków i zawiera dokładnie to, co wpisujesz. – JimB

+0

Stoję poprawione. –

-1
re.sub('\D+', '', s) 

zwróci ciąg, jeśli chcesz liczbą całkowitą, przekonwertować ten ciąg z int.

-1

Spróbuj

import re 

a następnie

return re.sub("\s+", "", s) 
-4

Domyślam się:

def f(): 
    s = """123 
    456""" 
    return u'123456' 

minimalnej zmianie i robi to, co prosiliśmy.

+7

:-) Ktokolwiek zignorował to, nie ma poczucia humoru – foosion

+0

Został prawdopodobnie wycofany, ponieważ funkcja miała zwrócić ciąg znaków. – recursive

+0

Masz rację, prawdopodobnie musisz zwrócić ciąg znaków, a ja zwróciłem liczbę całkowitą, w każdym razie nie dostaję również odrzuconej rzeczy, jestem nowy w pythoniu – Juparave

16
def f(): 
    s = """123\ 
456""" 
    return s 

Nie wcawia żadnej z linii blokowych po pierwszej linii; koniec każdej linii z wyjątkiem ostatniej z odwrotnym ukośnikiem.

+1

+1: nawet jeśli nie lubię bashslashes: mógłbym użyć replace ('\ n', '') – van

+0

... i nie {{{return s.replace ('\ n ',' ')}}}, ale raczej w samym zadaniu: {{{456 "" ". replace (' \ n ',' '))}}} – van

14

Kolejne ciągi są łączone, dzięki czemu można używać:

def f(): 
    s = ("123" 
     "456") 
    return s 

To pozwoli Ci zachować wcięcie jak chcesz.

+0

+1 - pobij mnie do niego – PaulMcG

+0

Uwaga do OP - nie ma przecinków między "123" a "456".() Są tam, aby uniknąć konieczności używania "\" do kontynuacji linii. – PaulMcG

9
textwrap.dedent("""\ 
       123 
       456""") 

ze standardowej biblioteki. Pierwsze "\" jest konieczne, ponieważ ta funkcja działa poprzez usunięcie wspólnej wiodącej białej spacji.

+0

Nie odpowiada na pytanie , ale odpowiada na zapytanie Google! Właściwie zapytano: http://stackoverflow.com/questions/1412374/python-triple-quote-multi-line-indentation –

0

Możesz chcieć sprawdzić ten str.splitlines([keepends])

zwróci listę linii w łańcuchu, łamiąc w granicach linii. Ta metoda używa uniwersalnego podejścia do linii podziału. Podziały linii nie są zawarte w wynikowej liście, chyba że podana jest podana i prawdziwa.

Python rozpoznaje "\ r", "\ n" i "\ r \ n" jako granice linii dla ciągów 8-bitowych.

więc na problem pod ręką ... moglibyśmy zrobić somehting tak ..

>>> s = """123 
... 456""" 
>>> s 
'123\n456' 
>>> ''.join(s.splitlines()) 
'123456'