Эффективные массивы в Python
Возвращаясь к теме вызова нативных модулей из Python (теперь это в Linux, но в Windows принципиальных различий быть не должно).
В Python есть очень полезный модуль для работы с массивами, называется он, как не странно, array. Это не единственный модуль для работы с массивами, но он очень удобен, если необходимо обмениваться массивами с программами на C/C++ (например OpenGL текстурку скормить, или просто все тяжелые вычисления на C/C++ написать):
Использование dll из Python
Вообще использование dll из Python особой проблемой не является, для этого есть модуль ctypes, который, начиная с Python 2.5, входит в состав этого самого Python’а. Но по какой-то загадочной причине даже вездесущий Google не смог найти примера связки "своя dll" + "своя python программа", а там есть некоторые неочевидные грабли: когда "своя dll" будет подключаться к чему угодно, но Python будет рапортовать:
|
|
Или говорить, что он ваших функций в упор не видит.
Так что, как говорят буддисты, на благо всех живых существ!
Простые числа. Решето Эратосфена
Это статья посвящена простым числам и эффективным способам их вычисления. Сразу скажу, что те алгоритмы, которые тут приведены, являются весьма и весьма нетривиальными и самому мне не давались довольно долго, но в итоге я их всё-таки придумал, написал и спешу поделиться со всеми вами. Исходные тексты в статье будут приведены на языках C# и Haskell.
Простое число – это натуральное число больше единицы, которое имеет ровно два делителя: единицу и само это число.
Решето Эратосфена – древний, но при этом весьма эффективный и до сих пор широко используемый алгоритм поиска всех простых чисел не превосходящих некоторого N.
Запишем подряд все числа от 2 до N. Дальше вычеркнем из этого списка все числа кратные 2, исключая саму двойку, потом вычеркнем все числа кратные 3, исключая само число 3, число 4 уже вычеркнуто, вычеркиваем числа кратные 5 и т.д. Продолжаем этот процесс, пока квадрат очередного числа не превысит N.
Самая простая программная реализация этого алгоритма выглядит следующим образом:
Функции как данные. Замыкание
Было это в самом-самом начале моего изучения функциональных языков. Читая SICP (русский перевод) я понял что такое замыкание :) . Попробую это описать. Замыкание контекста - способность лямбда функции сохранять контекст, в котором она была определена. Это свойство лямбда функций можно использовать для хранения данных, т.е. некоторые данные можно хранить в виде функций. Извлекать эти данные можно с помощью других функций. Попробуем разобраться (на примере хранение пары):
|
|
Итак, определяем пару как лямбда функцию от одного аргумента (этим аргументом впоследствии будет другая функция), этот аргумент применяется к членам пары. Функция получения первого члена пары будет функцией одного аргумента, которая будет применять этот аргумент к лямбда функции двух аргументов
|
|
Функция получения второго члена пары определяется аналогично.
Теперь мы можем определить пару
|
|
И проверить как работают функции first и second
|
|
Итак, много-много малопонятного текста на русском, и всего три простые строчки на Haskell’е :)
Записки начинающего функциональщика: восемь ферзей возвращаются
Здравствуйте дорогие!
Во-первых, разрешите всех поздравить с наступившим Новым 2006 Годом! Счастья, удачи, успехов всем в новом году!
Во-вторых, разрешите напомнить, что настоящий Мастер использует все подворачивающиеся возможности для достижения полного и окончательного просветления :) . Вот и ваш покорный слуга, находясь в состоянии лёгкой постновогодней абстинентции родил следующее:
Это опять задача о расстановке ферзей, на сей раз занимаемся только подсчётом количества возможных расстановок:
Записки начинающего функциональщика: восемь ферзей
Классическая формулировка этой задачи звучит так: найти все варианты расстановки ферзей на доске 8 на 8 таких, что ферзи не бьют друг друга. Обобщим её для доски N на N.
Записки начинающего функциональщика: простые числа
Всё-таки функциональные языки – это совсем параллельная вселенная. И один из самых параллельных языков в ней – Haskell.
Захотелось нам ввести в программу бесконечный список простых чисел:
Записки начинающего функциональщика: Scheme
Ваш покорный слуга занялся изучением Lisp’а (вернее Scheme). Чума просто! Хотите список из функций? Легко:
|
|