Приветствие! На конец-то я взялся за очередную статью по программированию ради моего хорошего друга. Только, к сожалению, на этот раз она, скорее всего, не будет захватывающей. Я просто опишу вам новый для меня язык: Python.
Зачем? Можете спросить вы... А кто его знает!
Не сидится мне на месте. Вот и решил в очередной раз поставить Линукс... Ну вот, а как же без программирования. На с++ я не собираюсь писать. Тут-то мне и пришло в голову наткнуться на Python.
Язык мне очень понравился. Почему? Да сами увидите.
+ После покупки смартфона Nokia нашел возможность программировать под него на этом прекрасном языке. Да еще и интерактивная консоль в мобилке! :)
Поехали!
Перед обсуждением особенностей языка, давай проинсталлируем нужные пакеты для работы. Не забываем о всеми любимой википедии:
Python портируем и работает почти на всех известных платформах — от КПК до мейнфреймов. Существуют порты под Microsoft Windows, все варианты UNIX (включая FreeBSD и GNU/Linux), Plan 9, Mac OS и Mac OS X, Palm OS, OS/2, Amiga, AS/400 и даже OS/390, Symbian и Android
Поэтому, если вы счастливый обладатель какой-то платформы (из выше перечисленных), то вам стоит только позавидовать :). Идем на сайт питона: http://python.org и в секции Downloads ищем пакеты под вашу платформу.
Если у вас стоит подобие Линукса, то все можно сделать куда проще. Сейчас малодистрибутивов обходится без питоновых скриптов, значит у вас 85% запустить на исполнение программу без каких-то подготовок.
Получить базовые пакеты вы можете командой (Debian only):
sudo apt-get install python
Что же мы получили? Интерпретатор Python и базовые библиотеки для работы.
Чем же он особенный?
Ну вот, на конец-то я добрался до этой части статьи. Далее мы с вами будем сравнивать самые популярные языки программированя.
Дубль 1
Для начала поговорим о том, что все так восхваляют в питоне: простота синтаксиса.
Да, действительно. Меня поразил пример кода с первого взгляда. Давайте напишем для сравнения программы, которые будут вычислять сумму первых 1000 чисел (используя цикл).
Для начала я выбрал С# (синтаксис также схож с Java), на котором я до этого программировал:
using System;
class Application
{
public static void Main()
{
int sum = 0;
for (int i = 0; i <= 1000; i++)
{
sum += i;
}
Console.WriteLine(sum.ToString());
}
}
|
Далее пусть будет С++:
#include <iostream>
void main()
{
int sum = 0;
for (int i = 0; i <= 1000; i++)
{
sum += i;
}
cout << sum;
}
|
PHP:
<?php
$sum = 0;
for ($i = 0; $i <= 1000; $i++)
{
$sum += $i;
}
echo $sum;
?>
|
Писанины вначале меньше, но меня убивает знак доллара вначале переменных.
Ну и, на конец-то, герой дня — Python:
for i in range(1001):
sum = sum + i
print sum
|
Классно, да? :)
Ну вот, думаю, вы ощутили разницу в написании кода. Времени на питон уходит раза в 3 меньше. Но вместе и с тем есть свои минусы (о них позже)
Дубль 2
Допустим, вы написали супер популярную программу, от вас требуют перенести ее на другие платформы... Как вы поступите?
Рассмотрим сразу язык С/С++
Он есть кроссплатформенный, но мало чего стоит без внешнего API. Поэтому перенести такой код будет ой как нелегко.
C#: как мы знаем, компилятор IL-кода портирован под несколько других платформ. Для примера возьмем Mono (http://mono-project.org). Да, некоторые библиотеки реализованы, но написать какое-то нормальное GUI-приложение очень тяжело, да и некоторые полезные части тоже не работают, например, сокеты.
Для запуска программы, написанной на С#, вам придется скачать библиотеку Mono(Linux), .Net Framework(Windows). Их размер достигает >50 мб.
PHP: ну что тут скажешь :) Если подумать, то его как-то некорректно сравнивать с языками, которые есть в статье. Он прекрасно работает на разных платформах.
Java: по синтаксису очень похож на С#, да и по возможностям. Занимает не мало места, сравнительно медленный. На счет переносимости, то тут пока ничего не скажешь. Компилятор байт-кода портирован почти под все существующие платформы.
Python: вот эта часть мне особенно понравилась. Вам не нужно писать разный код под разные платформы! Все просто: есть python-файл со скриптом, запускаем его — работает. В нашем случае работа с ОС и другими частями портирована прекрасно, нет никаких проблем. Интерпретатор языка весит не более 10 мб вместе со всеми самыми полезными библиотеками.
Дубль 3
Другие особенности Питона:
- автоматическое управление памятью, что также присутствует в Java, C#.
- Run-time обработка типов. Тут можно долго спорить, но мне эта особенность нравится. Т.е. во время написания программы неизвестный тип переменной, только во время исполнения.
- В Питоне базовые типы не относятся к чему-нибудь другому, они есть простыми объектами классов. Что повышает уровень абстракции, на котором пишется код.
- Теперь вы можете смело использовать множественное наследование.
- Не нужно предварительно объявлять переменную, она записывается в памяти после первого присвоения (что вы можете увидеть во втором дубле на примере Питона).
- Поддержка чисел с бесоконечной точностью.
- Невозможно неправильно обработать объект. Т.е. невозможно допустить несоответствие типов.
Теперь немного математики. Давайте напишем простую программу, которая будет вычислять факториал числа (ну а что же еще остается? :)). Не будем использовать рекурсию, только цикл. И пишем на алгоритмическом языке (насколько я его помню):
получаем число
пока число не равно 0
умножаем число на сумму
уменьшаем число на 1
Все ок, реализовать можно на любом языке. Но на какое время его хватит? :) Имею ввиду максимальное число, с которого можно раздобыть факториал.
Давайте напишем на С# такую функцию:
public static int Factorial(int number)
{
answer = 1;
for (int i = number; i >0; i--)
{
answer *= i;
}
return answer;
}
|
Но int-овская переменная может принимать не более 65535 по модулю.
Есть, конечно, long и т.д., но их все-равно не хватит на большие числа. Как же в таком случае поступают? Проблему можно решить, если использовать строки. Но в Питоне все просто, давайте напишем ф-цию, которая найдет нам факториал числа 100:
def factorial(Number):
sum = 1L
for iL in range (1, Number + 1):
sum = sum * iL
return sum
if __name__ == "__main__":
print factorial(100)
|
Как видите, после цифр мы дописываем 'L', что значит long-значение. И в функции range мы начинаем отсчет с 1, а не 0.
Вот и сам вывод результата:
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
Теперь давайте поговорим о минусах Питона, потому что нету ничего идеального. Я заметил только один недостаток: скорость работы. Python — интерпретируемый язык, поэтому равняться скоростью с С/С++ он не может. Из-за этого его не используют для работы с графикой и вещами, которые требуют быстродействия. Конечно, с годами все совершенствуется. Скорость работы интерпретатора возросла во много раз. Но если вам все-же нехватает скорости исполнения программы вы можете попробовать язык Lua, который пошел от Питона. Он не такой распространенный, но очень быстрый (сравнительно), его, даже, используют в играх в качестве скриптового движка.
Финальная часть
Писать много не буду, что тут еще скажешь. Выбор только за вами. Мне язык очень понравился, под него сделано огромное количество бесплатных библиотек: от написания игр, до высших математических переобразований.
Удачи.
Тысленко Макс (Ockonal at vestace.ru)
18.02.2009