Страницы

Поиск по вопросам

воскресенье, 22 декабря 2019 г.

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

#python #python_3x


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

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


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

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

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


?
    


Ответы

Ответ 1



'2016-02-02 13:58:05.235192'.replace(':', '.') '2016-02-02 13.58.05.235192' А вообще вам стоит посмотреть в сторону метода strftime

Ответ 2



Правильный ответ в Вашем случае получает нужную строку напрямую, например, используя strftime() как @Pavel Karateev предложил: #!/usr/bin/env python import time print(time.strftime('%Y-%m-%d %H.%M.%S')) Или, если нужны доли секунды: #!/usr/bin/env python from datetime import datetime print(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)] return type(string)().join(chars) Чтобы сделать каждый второй символ заглавным: >>> upper_every_nth('abcde', 2) 'aBcDe' Замечания по коду в вопросе не нужно использовать ; в конце каждой строки в Питоне не нужно помещать import внутри функций, если вы твёрдо не знаете зачем это нужно. Помещайте import наверху исходного кода модуля не используйте локальное время без указания временной зоны (часового пояса), за исключением случая когда вы сразу отображаете пользователю это значение. Если у вас есть объект, то старайтесь использовать его методы и атрибуты, чтобы получить результат, а не манипулирование его текстового представления. Например: не нужно вызывать str(dtValue), а потом пытаться изменить эту строку, чтобы получить нужный формат (или хуже: пытаться преобразовать эту строку в какой-либо другой объект), лучше сразу вызовите dtValue.strftime(), используя формат, приведённый выше. То есть не используйте: # XXX НЕ ДЕЛАЙТЕ ЭТОГО объект -> его строковое представление -> какие-то строковые манипуляции -> попытка распознать получившуюся строку, чтобы создать новый объект Иногда это называют "Yo-Yo code" (название от yoyo игрушки произошло). Подобный код следует следует избегать. Вместо этого делайте так: объект -> код, который использует методы, атрибуты объекта, чтобы создать новый объект напрямую Следуйте PEP-8 при создании имён, если у вас нет убедительных причин этого не делать, например используйте get_datetime_postfix() вместо getDateTimePostfix() для имён функций.

Комментариев нет:

Отправить комментарий