2017-01-12 10 views
5

Sau một thời gian nghiên cứu, tôi không thể tìm thấy lý do tại sao mã này đếm các chữ in hoa trong câu khi chúng được viết hoa, nhưng sẽ đếm "0" chữ cái viết hoa nếu tôi nhập một câu có chứa chữ thường các chữ cái, chẳng hạn như: "Hello World".Tại sao mã này chỉ hoạt động khi đầu vào là tất cả các chữ in hoa?

message = input("Enter your sentence: ") 

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

Có lẽ vì séc của bạn là 'if message.isupper()' bạn có muốn kiểm tra: 'if c.isupper()'? – alfasin

+0

'tổng (bản đồ (str.isupper, thư))' –

Trả lời

9

Do điều kiện trong mệnh đề if của bạn bị thiếu sót; phương pháp isupper trả True nếu tất cả ký tự trong chuỗi nhất định được chữ hoa:

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

Xem documentation for str.isupper:

Return Truenếu tất cả các ký tự cased trong str được chữ hoa và có ít ít nhất một ký tự được gắn trong str, False nếu không.

(tôi nhấn mạnh)

Kể từ khi bạn đang kiểm tra trên message với message.isupper(() này sẽ trở lại False tất cả các thời gian dẫn đến một khoản 0.

Thay vì kiểm tra trên thông báo đầy đủ với message.isupper(), sử dụng if của bạn trên một cơ sở cho mỗi nhân vật với if c.isupper() cho mỗi c trong message:

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

Bạn cũng có thể tận dụng thực tế là True hành vi như 1False như 0 để hơi cắt bớt nếu bạn muốn:

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

hoặc, nếu bạn thích cách tiếp cận chức năng, map chức năng đầu vào của bạn:

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

Mặc dù những có thể, một cách chủ quan, nhìn đẹp hơn; chúng thường bí ẩn hơn cách tiếp cận ban đầu (và cũng kém hiệu quả hơn một chút).

Các vấn đề liên quan