[Python] находка новичка
От: alsemm Россия  
Дата: 30.10.09 14:27
Оценка:
Я в питоне новичек. Этап написания 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 можно было запихнуть в лямбду...
Как вам?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.