аватар question@mail.ru · 01.01.1970 03:00

Python 3.x Изменение значений элементов строки в цикле

Как изменить значение символа строки в цикле? Код:

def getDateTimePostfix():    import datetime;    dtValue = datetime.datetime.now();    retValue = str(dtValue);    for sym in retValue:        if sym == ':':            sym = '.'    retu retValue;

Пытаюсь скорректировать дату, избавившись от "":"", но не получается изменить отдельные символы.

Или лучше сделать цикл такого типа?

    i = 0;    for item in retValue:        if retValue[i]  == ':':            retValue[i] = '.'        i = i + 1;

?

аватар answer@mail.ru · 01.01.1970 03:00

Правильный ответ в Вашем случае получает нужную строку напрямую, например, как :

#!/usr/bin/env pythonimport timeprint(time.strftime('%Y-%m-%d %H.%M.%S'))

Или, если нужны доли секунды:

#!/usr/bin/env pythonfrom datetime import datetimeprint(datetime.now().strftime('%Y-%m-%d %H.%M.%S.%f'))

Ответ на вопрос в заголовке

Q: Изменение значений элементов строки в цикле

Строки неизменяемы (immutable) в Питоне. Поэтому изменить строку нельзя, можно только новую создать и заменить старую строчку: s = create_new_string(s).

Бесполезно присваивать новое значение переменной цикла. Оно будет перезаписано на следующей итерации. Если решение нельзя найти используя методы строк (такие как .replace()) или используя регулярные выражения (re модуль), то вариант с преобразованием в список и использованием ''.join в конце не так уж и плох. Например, чтобы преобразовать каждый n-ый символ в строке в заглавный (начиная с единички), не используя regex:

def upper_every_nth(string, n):    chars = [char if i % n else char.upper()             for i, char in enumerate(string, start=1)]    retu type(string)().join(chars)

Чтобы сделать каждый второй символ заглавным:

>>> upper_every_nth('abcde', 2)'aBcDe'

Замечания по коду в вопросе

  • не нужно использовать ; в конце каждой строки в Питоне
  • не нужно помещать import внутри функций, если вы твёрдо не знаете зачем это нужно. Помещайте import наверху исходного кода модуля
  • не используйте локальное время без указания временной зоны (часового пояса), за исключением случая когда вы сразу отображаете пользователю это значение.

Если у вас есть объект, то старайтесь использовать его методы и атрибуты, чтобы получить результат, а не манипулирование его текстового представления. Например: не нужно вызывать str(dtValue), а потом пытаться изменить эту строку, чтобы получить нужный формат (или хуже: пытаться преобразовать эту строку в какой-либо другой объект), лучше сразу вызовите dtValue.strftime(), используя формат, приведённый выше. То есть не используйте:

# XXX НЕ ДЕЛАЙТЕ ЭТОГОобъект -> его строковое представление -> какие-то строковые  манипуляции -> попытка распознать получившуюся строку, чтобы создать новый объект

Иногда это называют (название от ). Подобный код следует следует избегать. Вместо этого делайте так:

объект -> код, который использует методы, атрибуты объекта,   чтобы создать новый объект напрямую

Следуйте при создании имён, если у вас нет убедительных причин этого не делать, например используйте get_datetime_postfix() вместо getDateTimePostfix() для имён функций.

Последние

Похожие