Я в питоне новичек. Этап написания Hello World успешно пройден, двигаюсь дальше
Сейчас делаю ревизию своих поделок на наличие в них не pythonic кода. По результатам этой работы придумалось решение одной типовой задачки.
Задачка: есть список клиентов. Добавлять очередного в список только если в нем нет клиента с таким же именем. Если есть, то кидать исключение.
Решение в лоб:
class Customer:
def __init__(name, phone):
self.name = name
self.phone = phone
_cusomers = []
def add_customer(c):
for e in _cusomers:
if e.name == c.name:
raise ValueError
_cusomers += c
Функция add_customer() ужасна своим циклом for. Крутить цикл только чтобы кинуть исключение — совсем не pythonic.
Так стало получше:
def add_customer(c):
if filter(lambda e: e.name == c.name, _cusomers):
raise ValueError
_cusomers += c
Избавился от цикла, но функция стала делать лишнюю работу:
— всегда перебираются все элементы _customers;
— создается список только чтобы проверить что он не пустой;
А потом придумалась такая загогулина:
def add_customer(c):
def test_customer_exist(e):
if e.name == c.name:
raise ValueError
filter(test_customer_exist, _cusomers)
_cusomers += c
От for избавился. Никакой лишней работы не далается. Одна беда — букв много из-за вложенной функции. Эх, если бы raise можно было запихнуть в лямбду...
Как вам?