Python « Наиболее изящный способ сделать первую букву строки заглавной в Python

Как наиболее изящно сделать только первую букву в строке заглавной?

Мой вариант такой, но можно ли его улучшить?
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .python.geshi_code {font-family:monospace;} .python.geshi_code .imp {font-weight: bold; color: red;} .python.geshi_code .kw1 {color: #ff7700;font-weight:bold;} .python.geshi_code .kw2 {color: #008000;} .python.geshi_code .kw3 {color: #dc143c;} .python.geshi_code .kw4 {color: #0000cd;} .python.geshi_code .co1 {color: #808080; font-style: italic;} .python.geshi_code .coMULTI {color: #808080; font-style: italic;} .python.geshi_code .es0 {color: #000099; font-weight: bold;} .python.geshi_code .br0 {color: black;} .python.geshi_code .sy0 {color: #66cc66;} .python.geshi_code .st0 {color: #483d8b;} .python.geshi_code .nu0 {color: #ff4500;} .python.geshi_code .me1 {color: black;} .python.geshi_code span.xtra { display:block; }

vals['name'] = vals['name'][0].upper() + vals['name'][1:]
 

1 ответов


Ваш метод возвратит исключение на пустой строке. Тут либо нужно гарантировать, что подаются непустые строки, либо ещё и впилить проверку (что сделает код ещё менее элегантным). Тем не менее, я бы сделал проверку и превратил бы это в функцию (а в js ещё бы впилил её в базовый класс).
Например так:


def capitalizeFirst (string):
   if string:
      return string[0].upper() + string[1:]
   return string[:]
 

Я думаю можно вот так
S = 'string'
S.capitalize()


Ничего лучше вашего ппридумать не могу.
Если не по существу вопроса, то можно так:


vals['name'] = "".join(vals['name'][0].upper(), vals['name'][1:])
 

Немного костыльный вариант.

>>> s = 'i like CATS'
>>> s[:1].upper() + s[1:]или
>>> s[:1].capitalize() + s[1:]
'I like CATS'

From django.utils.text

# Capitalizes the first letter of a string.
capfirst = lambda x: x and force_text(x)[0].upper() + force_text(x)[1:]
capfirst = allow_lazy(capfirst, six.text_type)

По моему все варианты немного не подходят, потому что не учитывается что первый символ может быть и не буквой, а пробелом или чем угодно. Вариант с регулярками еще не предлагался :)

s = u' ;%3№ первая буква заглавная'
capfirst  = re.sub(ur'^([^а-яёa-z]*)([а-яёa-z])', lambda x: u'%s%s' % (x.group(1), x.group(2).upper()), s)

Выглядит, конечно, монструозно, зато вполне выполняет задачу)