2011-09-08 13 views
10

Chcę utworzyć funkcję, która sprawdzi, czy pierwsza litera łańcucha jest wielka. To co ja wymyślił do tej pory:Sprawdzanie, czy pierwsza litera łańcucha jest wielka:

def is_lowercase(word): 
    if word[0] in range string.ascii_lowercase: 
     return True 
    else: 
     return False 

Gdy próbuję uruchomić go otrzymuję ten błąd:

if word[0] in range string.ascii_lowercase 
          ^
SyntaxError: invalid syntax 

Może ktoś rzucić okiem i doradzić, co robię źle ?

+0

'range' to wbudowana funkcja, która zwraca zakres liczb i nie ma żadnego miejsca w tym kodzie. – geoffspear

+2

unikaj wzorca 'if [bool]: return True: else return False'. możesz po prostu użyć 'return [bool]' – wim

Odpowiedz

30

Dlaczego nie używać funkcji str.isupper();

In [2]: word = 'asdf' 
In [3]: word[0].isupper() 
Out[3]: False 

In [4]: word = 'Asdf' 
In [5]: word[0].isupper() 
Out[5]: True 
+0

To jest dobra odpowiedź, ale chciałem dowiedzieć się, co zrobiłem źle w kodzie, który napisałem, zamiast szukać innego rozwiązania tego samego problemu. Mimo wszystko dziekuję. –

+0

@gameFace Dobry punkt. Czasami najlepszym rozwiązaniem jest inne rozwiązanie. ;) – AlG

14

ta jest wbudowana w ciągów:

word = "Hello" 
word.istitle() # True 

jednak pamiętać, że str.istitle wygląda czy każde słowo w ciągu jest tytuł-obudowane, więc to może dać ci niespodzianka:

"Hello world".istitle() # returns False! 

Jeśli chcesz tylko sprawdzić pierwszy znak ciągu użyj tego:

word = "Hello world" 
word[0].isupper() # True 
+0

@Dvvoter: czy chcesz wyjaśnić? – orlp

+1

Wizualna reakcja: w oryginalnym wpisie, zanim edytowałeś, nie dałeś jasno do zrozumienia, że ​​zdania typu "Witaj świecie" i "HELlo" zawodzą. Istitle sprawdza, czy każde słowo spełnia format i nie było jasne, czy było to ograniczenie podane przez OP. Zwinięty downvote –

+0

Dziękuję, widziałem to, ale chciałem stworzyć coś samemu zamiast używać istitle(). –

1

Składnia błąd wynika z faktu, że trzeba nawiasów:

range(string.ascii_lowercase) 

Ale w rzeczywistości nie należy używać zasięgu. Jest to tak proste, jak:

if word[0] in string.ascii_lowercase 
+2

Testowanie, czy znajduje się w "ascii_lowercase" może prowadzić do problemów z lokalizacją w dół drogi - lepiej użyć isupper(). Na przykład, co jeśli słowo jest w cyrylicy? Pierwszy znak byłby wielkimi literami, ale nie byłby w 'ascii_wolcase'. –

+0

'string.ascii_lowercase' nie jest liczbą całkowitą i nie jest poprawnym argumentem dla' range() '. – geoffspear

+0

@Booble wyjaśnia, dlaczego błąd składni powstał w pierwszej kolejności. Dlatego napisałem "nie powinieneś używać zakresu", aby upewnić się, że nie zalecałem używania tego rozwiązania. –

Powiązane problemy