2013-05-20 15 views
9

miałem Pythona skrypt działa, ale coś musiało się zmienić w Pythonie 3.string.lower w Pythonie 3

Na przykład gdybym chciał konwertować argumentu 1 na małe litery:

import string 
print(string.lower(sys.argv[1])) 

mówi że 'module' object has no attribute 'lower' - OK, Rozumiem, string jest teraz modułem.

Jeśli usunę import i napiszę tylko string.lower('FOO'), to narzeka, że ​​name 'string' is not defined.

Jaki jest prawidłowy sposób konwertowania ciągu na małe litery?

+0

Tak, w twoim drugim przykładzie nie ma zmiennej 'string'. Więc co chcesz przekonwertować? – squiguy

+0

Dlaczego nie 'sys.argv [1] .lower()'? –

+0

Ach, mój błąd. Nie zauważyłem, że dokumentacja znaleziona w wyszukiwarce Google była dla wersji 2.7 – Axarydax

Odpowiedz

11

Można użyć sys.argv[1].lower()

>>> "FOo".lower() 
'foo' 

lower() to metoda sama obiektów smyczkowych.

Moduł został zmieniony w Pythonie 3, nie zawiera już metod związanych z obiektami str, teraz zawiera tylko stałe wymienione poniżej. Można również użyć str.lower("Mystring"), ale nie jest to konieczne.

>>> import string # Python 3 
>>> dir(string) 
['ChainMap', 'Formatter', 'Template', '_TemplateMetaclass', '__builtins__', '__cached__', '__doc__', '__file__', '__initializing__', '__loader__', '__name__', '__package__', '_re', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace'] 
+0

lub 'str.lower (sys.argv [1])' – Elazar

+2

@Elazar Chociaż to działa i jest pouczające, jak działają metody, to jest okropny sposób napisać to. – delnan

+1

@delnan Zgadzam się - jest bardziej podobny do oryginalnego kodu, o którym mowa. – Elazar

4

nie string To str:

>>> str.lower("HELLO") 
'hello' 

Stąd powód dostać błąd name 'string' is not defined. jest to, że obecnie nie istnieje zmienna w zakresie nazwie string.

+1

Działa to w wyniku działania metod, ale nie jest to jeden oczywisty sposób wywołania metody (która brzmi "HELLO" .lower() '). – delnan

+0

@delnan Zgadzam się, ale jest najbliższy oryginalnemu kodowi OP i bezpośrednio odpowiada na pytanie, dlaczego 'string.lower' nie działa. – HennyH

+1

Nie sądzę, że odpowiada na pytanie, ponieważ 'str.lower (" HELLO ")' działa zarówno w Pythonie 2.x ** i ** Python 3.x, a pytanie brzmi: dlaczego 'string.lower (" HELLO ")' nie działa w 3.x. –

3

obiektowego poprawny sposób to:

'FOO'.lower() 

W przykładzie:

print(sys.argv[1].lower()) 
+0

Pytanie brzmi, czy * zorientowana obiektowo droga * jest zawsze poprawna;) – pepr

2

dodać, podczas gdy niektórzy ludzie wolą drogę obiektowego (wywołanie metody obiektu STR) , niektórzy mogą nadal preferować starszą drogę - z funkcjami lub operatorami. Zależy to również od rozwiązania problemu. (Jeśli się nie zgadzasz, pomyśl na przykład o (1.5).__add__(3).)

Możesz łatwo utworzyć własną (prostszą) nazwę funkcji, która jest potrzebna, aby była bardziej czytelna. Zastanów się tylko, czy będzie on czytelny (w przyszłości dla Ciebie i teraz) dla wszystkich:

>>> lower = str.lower 
>>> lower('SoMe CaPiTaL LetTerS to Be LoWeRED') 
'some capital letters to be lowered' 
Powiązane problemy