Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
assert в теле функции, который работает лишь при заданном __debug__.__debug__ == False при загрузке кода из *.pyo файла. https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement. assert в данном случае используется неправильно, по очень простой причине: он производит валидацию значений входных данных, чем должна заниматься бизнес-логика. assert нужен в качестве инструмента для поиска ошибок программиста, например:assert isinstance(k, int), 'Invalid input "k" argument type in template(), should be int, received %s' % type(k)
Выразительная простота python
n = len(s)
...
for i in range(n):
c = s[i]
for i, c in enumerate(s):
...
s, k, c, new_s — это уровень первого курса. Если Вы сейчас закроете эту страницу и откроете её через пару месяцев, то может и Вам код покажется нечитаемым и непонятным. Очень рекомендую «Code complete» («Совершенный код» в русском переводе) для улучшения навыков написания красивого кода. permutation_norep(). Тут же он сталкивается с тем, что далее идёт вызов template() да ещё с двумя аргументами-функциями. Хорошо, идём дальше в глубину template()… Опа, assertion(). Так, а что там за assertion() был? Ага, n и k дожны быть положительными, либо равны нулю, причём n >= k. Далее — reducer(). А что там этот reducer делает?.. Думаю, Вы поняли мысль. permutation_norep:def permutation_norep(s, k):
len_s = len(s)
is_valid_input = len_s > 0 and len_s >= k and k >= 0
if not is_valid_input:
raise ValueError('Invalid input: s={}, k={}'.format(s, k))
if k == 0:
yield ""
return
k <= 1:
yield from s
return
new_k = k - 1
for i in range(len_s):
new_s = s[:i] + s[i + 1:]
for res in permutation_norep(new_s, new_k):
yield s[i] + res
elif потерял (там, где k == 1).
Выразительная простота python на примере задач из комбинаторики