«Реальное программирование»?
Я бы использовал .title (), и я настоящий программист.
Или я бы использовал регулярные выражения
re.sub(r"(^|\s)[a-z]", lambda m: m.group(0).upper(), "this is a set of words")
Здесь написано «Если за началом текста или пробела следует строчная буква» (на английском языке - другие языки, скорее всего, не поддерживаются), то для каждого совпадения преобразуйте текст совпадения в верхний регистр. Поскольку текст совпадения - это пробел и строчная буква, это прекрасно работает.
Если вы хотите использовать его как низкоуровневый код, то работает следующее. Здесь я допускаю только пробел в качестве разделителя (но вы можете захотеть поддерживать перевод строки и другие символы). С другой стороны, «string.lowercase» интернационализирован, поэтому, если вы находитесь в другой локали, он по большей части будет работать. Если вы не хотите этого, используйте string.ascii_lowercase.
import string
def title(s):
# Capitalize the first character
if s[:1] in string.lowercase:
s = s[0].upper() + s[1:]
# Find spaces
offset = 0
while 1:
offset = s.find(" ", offset)
# Reached the end of the string or the
# last character is a space
if offset == -1 or offset == len(s)-1:
break
if s[offset+1:offset+2] in string.lowercase:
# Is it followed by a lower-case letter?
s = s[:offset+1] + s[offset+1].upper() + s[offset+2:]
# Skip the space and the letter
offset += 2
else:
# Nope, so start searching for the next space
offset += 1
return s
Чтобы развить мой комментарий к этому ответу, этот вопрос может быть лишь упражнением ради любопытства. Реальные имена имеют специальные правила использования заглавных букв: «van der» в «Johannes Diderik van der Waals» никогда не пишется с заглавной буквы, «Farrah Fawcett-Majors» имеет «M», а «Cathal Ó hEochaidh» использует не-ASCII Ó и h , которые изменяют "Eochaidh", чтобы означать "внук Eochaidh".