2017-01-12 18 views
5

Po długim czasie poszukiwań nie udało mi się ustalić, dlaczego ten kod zlicza wielkie litery w zdaniu, gdy wszystkie są pisane wielką literą, ale będą się liczyć "0" wielkimi literami, jeśli wprowadzę zdanie zawierające małe litery litery, takie jak: "Hello World".Dlaczego ten kod działa tylko wtedy, gdy dane wejściowe są wielkimi literami?

message = input("Enter your sentence: ") 

print("Capital Letters: ", sum(1 for c in message if message.isupper())) 
+7

Prawdopodobnie od kiedy twój check to 'if message.isupper()' miałeś zamiar sprawdzić: 'if c.isupper()'? – alfasin

+0

'suma (mapa (str.isupper, wiadomość))' –

Odpowiedz

9

Ponieważ warunek w Twojej klauzuli if jest wadliwy; metoda isupper zwraca True jeśli wszystkie znaków w danym ciągu są wielkie litery:

>>> "UPPER".isupper() 
True 
>>> "UPPEr".isupper() 
False 

Zobacz documentation for str.isupper:

Return Truejeśli wszystkie obudowane znaków str są wielkie litery i nie ma na przynajmniej jedna z postaci z kodami w innym przypadku.

(Kopalnia nacisk)

Skoro sprawdzania message z message.isupper(() ten powróci False cały czas wynikający z sumy 0.

Zamiast sprawdzania pełnej wiadomości z message.isupper(), użyj if na podstawie na charakter z if c.isupper() dla każdego c w message:

print("Capital Letters: ", sum(1 for c in message if c.isupper())) 

Można również skorzystać z faktu, że True działa jak 1 i False jak 0 lekko przyciąć, że w dół, jeśli tylko chcesz:

print("Capital Letters: ", sum(c.isupper() for c in message)) 

lub, jeśli chcesz podejść funkcjonalne map funkcję na swoim wejściu:

print("Capital Letters: ", sum(map(str.isupper, message))) 

Chociaż te mogą, subiektywnie, wyglądają ładniej; na ogół są bardziej tajemnicze niż oryginalne podejście (i nieco mniej wydajne).