![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 1 Всего: 43 |
Есть класс.
У него есть метод getItem() Надо, чтобы при каждом вызове метода он выдавал некоторое значение. Теперь про значение: есть 2 числа-границы. Например 1 и 6. Есть строка типа "abcdefghklmnopqrstuvwxyz" Т.е. значения должны быть такие:
Вместо точек - пропуски. Вот как такое организовать? хотел рекурсией, но тогда придется создавать список, куда добавлять эти значения, а так делать нельзя, ибо трата оперативы. |
|||
|
||||
| albertn |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
Помучился, но получилось:
|
|||
|
||||
| Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
Только вместо 2-ки 6-кой инициализировать не советую, все-таки 36^6 строк выводить будет Это сообщение отредактировал(а) Artemios - 14.11.2006, 11:46 -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
| ser_gen |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 25.9.2006 Репутация: 1 Всего: 1 |
Выдавать по одному из функции можно с помощью yield
Что-то вроде return толко при следующем вызове продолжит выполнение со следующей строки функции (после yield)
А алгоритм ищи в книгах по дискретной математики (кажись эта генерация всех возможных комбинаций там должна быть) |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 1 Всего: 43 |
есть вариант об использовании новой системы счисления, база которой равна длине строки. Вот сейчас про него думаю.
ser_gen, т.е. просто состояние переменных метода сохранится? будет ли это работать в классах? Добавлено @ 11:47 Artemios, спасибо, сейчас посмотрим Добавлено @ 11:48 albertn, спасибо. Что у меня за плохая привычка смотреть темы снизу ) |
|||
|
||||
| albertn |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
||||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 1 Всего: 43 |
А вот такой вопрос: имеется функция-генератор(из примера albertn). Как снять с нее 1 значение?
|
|||
|
||||
| albertn |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
Используя метод next
Но только по окончанию он вызывает экскепшон |
||||
|
|||||
| nerezus |
|
||||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 1 Всего: 43 |
спасибо
Добавлено @ 12:23 получилось все.
где
еще раз спасибо ) |
||||
|
|||||
| slav0nic |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 17.5.2006 Репутация: 4 Всего: 5 |
мм, документацию читать не модно нынче=)
в туториале есть пример интересный, для генерации всех комбинаций, думаю переписать его не сложно
Это сообщение отредактировал(а) slav0nic - 14.11.2006, 12:34 --------------------
python.com.ua |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 1 Всего: 43 |
slav0nic, это откуда?
|
|||
|
||||
| slav0nic |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 17.5.2006 Репутация: 4 Всего: 5 |
nerezus, ну ген из оффициальной доки вроде бы брался)
2.1.8 Indentation --------------------
python.com.ua |
|||
|
||||
| Artemios |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
Мне тоже стало интересно, попробовал:
только здесь вычислений больше производится -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
||||
|
|||||
| slav0nic |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 17.5.2006 Репутация: 4 Всего: 5 |
nerezus, короче профилировщик в зубы и тести что быстрее
--------------------
python.com.ua |
|||
|
||||
| albertn |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
Но только есть одна загвоздка. Ни в какой системе счисления нельзя задать число начинающееся с нуля (кроме самого нуля). Тогда надо будет уже указывать количество используемых единиц. Это сообщение отредактировал(а) albertn - 14.11.2006, 13:01 |
||||
|
|||||
| Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
сие интерпретатор не понимает, меняем на gen(s) -- имеем рекурсию. А вообще -- генерит всего лишь перестановки. -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
| Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
Вот новый вариант позиционной системы, так вроде все замечательно:
Это сообщение отредактировал(а) Artemios - 14.11.2006, 13:44 -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
| albertn |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
nerezus по-моему имел ввиду другое. Ему нужен был не способ генерации, основанный на системе счисления, а способ преобразования из десятичной системы (или шестнадцатиричной) в ту, которая задана текущим алфавитом. А твой вариант мало чем отличаеся от всех предыдущих, разве что алгоритмом. |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 1 Всего: 43 |
albertn, да нет, мне нужно было просто составить все возможные комбинации(с повторениями и т.д.) Это уже сделано.
Просто переход на новую систему счисления - это один из способов решения ) Кстати еще способ придумали: на вход идет предудущее "число"(или просто лежит как self.prev), а по нему составляется следующее. ИМХО наиболее простой способ ;) |
|||
|
||||
| Artemios |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
Именно это и было в моем самом первом примере (в self.curr_l на каждой итерации - предыдущее, метод next() генерит следующее) И в более красивом примере albertn (первом) - то же, каждое следующее генерится в цикле на основе предыдущего (в state), с выбросом текущего по yield.
Скажем так, меня просто заинтересовала позиционная система с произвольным алфавитом и базой, а извращения над ней - для подгонки к генерации требуемых комбинаций Оправдался? -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
||||
|
|||||
| albertn |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
В принципе, то все предложенные варианты в той или иной мере основываются на системе счисления. А вариантов я сходу бы штук пять бы сделал. Ведь не в этом суть, а в том, чтоб все это работало как можно быстрее. PS. Невиновным невчем оправдываться |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 1 Всего: 43 |
УУ, а вот твой пример то, хоть и выглядит самым красивым, а глючит нещадно Например, если поставить x1=3 x2=3, то.... |
|||
|
||||
| nerezus |
|
||||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 1 Всего: 43 |
еще раз дам код:
c:\\1.txt
|
||||
|
|||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 1 Всего: 43 |
Для примера, если написать в 1.txt
то работает, как надо. |
|||
|
||||
| albertn |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
nerezus, self.start >= self.finish в строке 15 замени на self.start > self.finish, тогда все заработает
|
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 1 Всего: 43 |
А как сделать, чтобы повторяющихся символов не было?
Можно конечно в список символы загнать и проверять, но... не изящно ) |
|||
|
||||
| albertn |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
||||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 1 Всего: 43 |
Хм, а такой способ как будет выглядеть? Ибо у меня тупо проверкой в генерированной строке производится )
|
|||
|
||||
| albertn |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
|
||||
|
|||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Python: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |