Python 3.x Изменение значений элементов строки в цикле
📁 python
Как изменить значение символа строки в цикле? Код:
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;?
Правильный ответ в Вашем случае получает нужную строку напрямую, например, как :
#!/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() для имён функций.
Войдите чтобы оставить ответ