Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли прервать выполнение reduce? break в reduce 
:(
    Опции темы
albertn
Дата 5.9.2006, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Написал код для нахождения простых чисел
Код

prost=[]
filter(lambda x:reduce(lambda y,z:y and x%z!=0,prost,True) and (prost.append(x) or True),range(2,10000))

Но функция reduce проходит полностью по списку prost, даже если нашла простое число в начале. Есть ли какая-нить возможность прервать его выполнение как например
Код

prost = []
for x in range(2,10000):
    y = True
    for z in prost:
        if x%z==0:
            y = False
            break
    if y:
        prost.append(x)

print prost

PM WWW ICQ   Вверх
setq
Дата 5.9.2006, 16:32 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Мне не удалось разобраться в твоём oneliner'е (и возможно это сигнал к тому чтобы подумать зачем писать такой код), поэтому я не знаю всё ли там окей. И всё-таки вот мои мелкие соображения:

1) нельзя прервать reduce()

2) код #2 красивее выглядит IMHO

3) зачем нужен filter() и почему не использовать for ... : ... раз уж filter всё равно ничего путного не возвращает? Хотя может ты с кем-нибудь поспорил )) Тогда другое дело.

4) itertools.dropwhile(f, seq) выкидывает из последовательности элементы не удовлетворяющие условию f(). Вот как это можно использовать:
Код

import itertools
primes = []
for x in range(2, 10000):
    if list(itertools.dropwhile(lambda p: x%p!=0, primes)) == []:
        primes.append(x)

  Вверх
albertn
Дата 6.9.2006, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(setq @ 5.9.2006,  16:32)
Мне не удалось разобраться в твоём oneliner'е (и возможно это сигнал к тому чтобы подумать зачем писать такой код), поэтому я не знаю всё ли там окей. И всё-таки вот мои мелкие соображения:

1) нельзя прервать reduce()

2) код #2 красивее выглядит IMHO

3) зачем нужен filter() и почему не использовать for ... : ... раз уж filter всё равно ничего путного не возвращает? Хотя может ты с кем-нибудь поспорил )) Тогда другое дело.

4) itertools.dropwhile(f, seq) выкидывает из последовательности элементы не удовлетворяющие условию f(). Вот как это можно использовать:
Код

import itertools
primes = []
for x in range(2, 10000):
    if list(itertools.dropwhile(lambda p: x%p!=0, primes)) == []:
        primes.append(x)

За функцию itertools.dropwhile спасибо (+1)
функцию filter я использовал как map, только мне надо было, чтоб она ничего не возвращала, а производила итерации. А весь остальной код почти-полностью совпадает с представленным в виде цикла.

Теперь код работает быстрее:
Код

import itertools
primes = []
filter(lambda x:list(itertools.dropwhile(lambda p: x%p!=0, primes)) == [] and primes.append(x),range(2,10000)) or primes

Но есть один недостаток - itertools.dropwhile обрабатывает по-прежнему всю последовательность, а хотелось чтобы функция проверяла до первого неудовлетворяющего последовательности элемента. Есть ли возможность как-нить это реализовать в одну строчку?
PM WWW ICQ   Вверх
setq
Дата 6.9.2006, 14:20 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(albertn @  6.9.2006,  09:00 Найти цитируемый пост)
Но есть один недостаток - itertools.dropwhile обрабатывает по-прежнему всю последовательность...

Да?

  Вверх
albertn
Дата 7.9.2006, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(setq @  6.9.2006,  14:20 Найти цитируемый пост)
Да?

Код

list(itertools.dropwhile(lambda p: x%p!=0, primes))
 Обрабатывает всю последовательность primes. Разве нет?
А на сколько я понял, при использовании next придется как-то отлавливать прерывания.
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0733 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.