RodegastТут ты вообще создаёшь три строки (каждый срез создаёт строку, кладя всё это в память, и тому подобное). Потом ты ещё должен высчитывать сколько букв в слове server, иначе ты не будешь знать, какую цифру там поставить в срезе. Потом сходу (за секунду) непонятно, что это за выражение; сотня таких выражений в коде - и ты будешь сидеть и целый день разбираться в одном исходнике. Читаемость нарушил, а в Zen сказано “Readability counts.”, не просто так же включено в Дзен.
Например если я захочу проверять начало файла на “server”, то достаточно дописать:А в случае одного среза эта возможность становится не очевидной.s[6:] if s[:6] == "server" else "" [:-3]
А к чему приводит ухудшение читаемости? К тому, что ты делаешь ошибку и потом не видишь её, так как над кодом надо слишком долго думать, чтобы её заметить. А когда над кодом надо долго думать, проще предположить, что он правильный, а проверить его потом, когда будет время для этого. Естественно, что так накапливается куча таких кодов, которые типа работают, и времени на них всё никак не находится.
Вот твой код без каких-либо изменений:
>>> s = 'server123.sh' >>> s[6:] if s[:6] == "server" else "" [:-3] '123.sh' >>>
houeyАлгоритм неправильный. Обычно выбирают то, что нужно, а не удаляют то, что не нужно. Представь просто, что у тебя миллион элементов и нужен из них только один, зачем удалять 99999 раз элементы, если можно просто один раз взять нужный.
Если кто знает С++ - я хочу написать полный аналог данной проги на С++, но уже на Python.
Вот выбор нужных
>>> lst = ['server1.sh', 'server3.sh', 'client1.sh', 'server2.sh', '1.sh', '2.sh'] >>> >>> out = [i for i in lst if i.startswith('server')] >>> out ['server1.sh', 'server3.sh', 'server2.sh'] >>>
>>> def filt(seq, pat): ... return [i for i in seq if i.startswith(pat)] ... >>> lst = ['server1.sh', 'server3.sh', 'client1.sh', 'server2.sh', '1.sh', '2.sh'] >>> >>> out = filt(lst, 'server') >>> out ['server1.sh', 'server3.sh', 'server2.sh'] >>>
Удаление элементов так же делается
>>> def filt(seq, pat): ... return [i for i in seq if not i.startswith(pat)] ... >>> lst = ['server1.sh', 'server3.sh', 'client1.sh', 'server2.sh', '1.sh', '2.sh'] >>> >>> out = filt(lst, 'server') >>> out ['client1.sh', '1.sh', '2.sh'] >>>
Add
Исправил ошибку, указанную Rodegast в сообщении.
Но на суть это не влияет, это была просто демонстрация того что между этими срезами можно ещё что-то вставлять.
