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

Storytime!

C, как язык, является абстракцией компьютера. Это позволяет вам делать то, что делает компьютер, манипулировать памятью, делать математику, печатать вещи и т. Д.

Но C - это только абстракция. И, в конечном счете, то, что он извлекает из вас , является языком ассемблера. Assembly - это язык, который читает процессор, и если вы его используете, вы делаете что-то с точки зрения процессора. Что делает процессор? В принципе, он читает из памяти, выполняет математику и записывает в память. CPU не просто выполняет математику по номерам в памяти. Во-первых, вам нужно переместить число из памяти в память внутри процессора, называемого регистром . Как только вы закончите делать все, что вам нужно сделать, чтобы это число, вы можете переместить его обратно в обычную системную память. Зачем использовать системную память? Регистры ограничены по количеству. В современных процессорах вы получаете около ста байтов, а более старые популярные процессоры были еще более фантастически ограничены (у 6502 было 3 8-битных регистра для вашего бесплатного использования). Итак, ваша средняя математическая операция выглядит так:

load first number from memory
load second number from memory
add the two
store answer into memory

Многое из того, что ... не математика. Эти операции загрузки и хранения могут занимать до половины времени обработки. C, являясь абстракцией компьютеров, освобождает программиста от беспокойства по поводу использования и жонглирования регистрами, а так как число и тип варьируются между компьютерами, C возлагает ответственность за распределение регистров исключительно на компилятор. С одним исключением.

Когда вы объявляете переменную register, вы сообщаете компилятору «Yo, я намерен использовать эту переменную много и / или быть коротким. Если бы я был вами, Я постараюсь сохранить его в реестре. Когда в стандарте C говорится, что компиляторам вообще не нужно что-то делать, это потому, что стандарт C не знает, на каком компьютере вы компилируете, и это может быть как 6502 выше, где все 3 регистра необходимы только для работы , и нет запасного регистра, чтобы сохранить свой номер. Однако, когда говорится, что вы не можете принять адрес, это потому, что регистры не имеют адресов. Это руки процессора. Поскольку компилятор не должен указывать вам адрес, и поскольку он вообще не может иметь адрес, в настоящее время для компилятора открываются несколько оптимизаций. Он мог, скажем, всегда держать номер в регистре. Он не должен беспокоиться о том, где он хранится в памяти компьютера (за исключением необходимости вернуть его обратно). Это может даже записать его в другую переменную, передать его другому процессору, дать ему изменение местоположения и т. Д.

tl; dr: Краткоживущие переменные, которые выполняют много математики. Не объявляйте слишком много сразу.

-3
задан qshng 5 March 2019 в 04:05
поделиться

3 ответа

Есть более простые способы сделать это в 2 строки кода, но я хотел завершить логику в вашей функции. Вам нужно проверить, где начинаются кавычки и где они заканчиваются, потому что в этом интервале не нужно предпринимать никаких действий

def convert(str):
    new_str =str[0]
    quote=False
    for c in str[1:]:
        if c in ["'", '"']:
            if quote==False:
                new_str=new_str+','
            quote=not quote
        if c not in ["'", '"'] and quote==False:
            new_str = new_str + ','+c
        else:
            new_str = new_str + c 
    return new_str
0
ответ дан Majd Msahel 5 March 2019 в 04:05
поделиться

Я бы попробовал использовать для этого регулярное выражение; не выписывайте парсер самостоятельно, если вам это не нужно.

Я предполагаю, что ваша строка состоит только из буквенных символов, что все цитируемые группы непусты (т. Е. Между кавычками всегда есть несколько символов), и что у вас нет открытых кавычек.

Это, кажется, работает:

import re

s = "AB'CD'E"
splits = re.findall("\"[A-z]+\"|'[A-z]+'|[A-z]", s)
# ['A', 'B', "'CD'", 'E']
",".join(splits)
# "A,B,'CD',E"

Данное регулярное выражение ищет группы буквенных символов, заключенных в двойные или одинарные кавычки, или только в одиночные символы.

0
ответ дан Nathan 5 March 2019 в 04:05
поделиться

Вы можете заменить цитируемые подстроки и символы без кавычек на re.sub, предполагая, что ваши строки хорошо сформированы и кавычки сбалансированы:

re.sub("('[^']*'|.)(?!$)", r'\1,',  "AB'CD'E")
# A,B,'CD',E

Если вам нужно что-то более сложное, возможно, попробуйте анализировать символ за символом как вы предложили. Следите за текущим состоянием - независимо от того, находится ли текущий символ в последовательности в кавычках или нет - с помощью переменной.

0
ответ дан jspcal 5 March 2019 в 04:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: