Форум сайта python.su
857
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'] >>>
Отредактировано py.user.next (Май 31, 2017 03:14:20)
Офлайн
0
В итоге пришел к такому варианту:
import re def Match(item, pattern): result = item.find(pattern) return result >= 0 def KeyFunction(item): pattern = r'(\d+)\.sh$' result = re.search(pattern, item); if result is None: return 0 return int(result.group(1)) items = ['server1.sh', 'server3.sh', 'client1.sh', 'client2.sh', 'server2.sh', 'server.sh', 'client.sh'] clients = [it for it in items if Match(it, "client")] servers = [it for it in items if Match(it, "server")] clients = sorted(clients, key=KeyFunction) servers = sorted(servers, key=KeyFunction) print (clients) print (servers)
Офлайн
0
py.user.next
Спасибо большое за ваши советы!
Отписался в теме, не посмотрев новые ответы, в итоге пришел примерно к тому, о чём Вы говорили!
Чуть позже более внимательно перечитаю ваш пост, как появится свободная минутка спасибо!
Отредактировано houey (Май 30, 2017 08:50:46)
Офлайн
186
> Потом сходу (за секунду) непонятно, что это за выражение;
Как раз для этого и существуют комментарии.
> Перед отправкой ты его не проверил, он выдаёт совсем не то, что должен.
Да, точно скобочки забыл
Но на суть это не влияет, это была просто демонстрация того что между этими срезами можно ещё что-то вставлять.
Офлайн
857
RodegastУахаха, комментарии существуют не для этого. Код должен быть самодокументирован (в основном через понятные имена это делается); вообще, много приёмов там для этого есть, есть даже книжка про ясный код и множество видео, где она перессказывается частями. А комментарии, если и есть, то отвечают на вопрос “почему именно эта строка/оператор/блок здесь, а не другой?”. Короче, алгоритм комментируется обычно, а не код. Если же код неясен без комментария, то это мутный код. Новичковый уровень - писать код, а потом в комментариях разъяснять, что он вообще делает.
Как раз для этого и существуют комментарии.
RodegastДемонстрация-то понятна, но ошибку-то ты допустил. Если ты в одной строке кода ошибку не увидел, то в десяти таких же мутных и подавно не увидишь. Это ещё код писал ты, а вот придёт тебе код от кого-нибудь другого в таком же стиле, сразу поймёшь, что к чему.
это была просто демонстрация того что между этими срезами можно ещё что-то вставлять
houeyТакое делается через
Буду рад услышать советы по улучшению программы.def Match(item, pattern): result = item.find(pattern) return result >= 0
def match(item, pattern): return pattern in item
Отредактировано py.user.next (Май 30, 2017 15:48:33)
Офлайн
186
> Короче, алгоритм комментируется обычно, а не код
Комментируется то что может быть не понятным или не очевидным. По этому если что-то в коде может быть не очевидно, то это может быть прокомментировано. Это норма.
> Демонстрация-то понятна, но ошибку-то ты допустил.
Это меня отвлекли, вот скобок я и не поставил. И не в стиле проблема. Вот например у тебя тремя сообщениями выше есть такой код:
>>> def filt(seq, pat): ... return [i for i in lst if i.startswith(pat)]
Офлайн
857
RodegastЭто очень слабая ошибка, потому что её запуск пропустил. Такое бывает раз на миллион. В реальном коде она бы сразу всплыла, потому что там бы lst не было в глобальном пространстве. У тебя же ошибка именно из-за отсутствия запуска - это классический вариант ошибки, когда код кажется одним, а работает несколько по-другому.
Это ошибка, хотя код и выглядит вполне разборчивым.
>>> def filt(seq, pat): ... return [i for i in lst if i.startswith(pat)] ... >>> def f(): ... lst = ['server1.sh', 'server3.sh', 'client1.sh', 'server2.sh', '1.sh', '2.sh'] ... out = filt(lst, 'server') ... return out ... >>> f() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in f File "<stdin>", line 2, in filt NameError: global name 'lst' is not defined >>>
RodegastВезде рекомендуется переписать код. И такой код сейчас называют модным понятием “код с душком” или “протухший код”. Это как бы и не спагетти, но и качество оставляет желать лучшего.
По этому если что-то в коде может быть не очевидно, то это может быть прокомментировано.
Отредактировано py.user.next (Май 31, 2017 03:24:54)
Офлайн
186
> Это очень слабая ошибка, потому что её запуск пропустил. Такое бывает раз на миллион…В реальном коде она бы сразу всплыла, потому что там бы lst не было в глобальном пространстве…Вот использование кода с моей ошибкой
Не оправдывайся 
> Иными словами, если у тебя код надо описывать комментариями, значит он неясный.
Для меня ясный, для кого-то не очень, а кто-то любой без комментариев не понимает. Это демагогия.
Офлайн
857
RodegastПочитай реальные долгоживущие крупные проекты на Github'е, там нигде не найдёшь комментариев таких. Вообще, полезно читать такой код, даже если не понимаешь его полностью, потому что там есть фишки, которые можно перенять.
Для меня ясный, для кого-то не очень, а кто-то любой без комментариев не понимает. Это демагогия.
Отредактировано py.user.next (Май 31, 2017 11:28:44)
Офлайн