LINUX.ORG.RU

Программирование на Python: Часть 1. Возможности языка и основы синтаксиса

 


0

0

Этот цикл статей предназначен для того, чтобы помочь успешному преодолению «кривой обучения», последовательно предоставляя информацию, начиная с самых базовых принципов языка до его продвинутых возможностей в плане интеграции с другими технологиями. В первой статье речь пойдет об основных возможностях и синтаксисе Python. В дальнейшем мы рассмотрим более сложные аспекты работы с этим популярным языком, в частности объектно- ориентированное программирование на Python.

>>> Подробности

★★★

Проверено: boombick ()
Ответ на: комментарий от ei-grad

Нет, мне бы сравнительный пример кода паскаля и питона, который раскрывает преимущество питона над паскалем.

yantux
()
Ответ на: комментарий от yantux

А вообще в таких случаях очень советуют ознакомиться с парадоксом Blub.

eugine_kosenko ★★★
()
Ответ на: комментарий от eugine_kosenko

Ну, замыкания в Паскале кагбэ давно имеются, но такое страшное слово «настоящие программисты на ассемблере и паскале» вряд ли знают, не пугайте их. ;-)

Reaper ★★
()
Ответ на: комментарий от eugine_kosenko

На самом деле внутри процедур и функций давно можно было объявлять процедуры и функции, которые могут обращатся к локальным переменным этой функции. Их удобно использовать внутри, но передавать как результат вычисления нет смысла, так как они используют один из регистров проца как указатель на фрагмент стека в котором эти локальные переменные находятся а при выходе из функции то что в стеке уже не имеет значения.

SV0L0CH
()
Ответ на: комментарий от eugine_kosenko

Упоминание о замыканиях в Паскале я встретил в книге Джефа Элджера «С++ for real programmers». Он там расписывал, что единственная вкусность паскаля доступна и в С++, показал, как делать аналоги замыканий.

Код паскалевский примерно такой был:

procedure p(n: integer);
var
  procedure fn;
  begin
    { тут что-то делается... }
  end;
begin
  callback(@fn);
end;

книга достаточно старая, на каком компиляторе он пробовал, я не знаю.

Reaper ★★
()
Ответ на: комментарий от SV0L0CH

> но передавать как результат вычисления нет смысла, так как ...

А этим все реализации паскаля страдали?

Reaper ★★
()
Ответ на: комментарий от yantux

Нет, мне бы сравнительный пример кода паскаля и питона, который раскрывает преимущество питона над паскалем.

Вам ненавязчиво намекают, что говорить о вкусе устриц лучше с теми кто из ел. :) Сядьте и разберитесь с питоном, много времени это у вас не займёт, а там уже и сами себе ответите. А ещё лучше поучаствуйте в живом проекте.

shty ★★★★★
()
Ответ на: комментарий от eugine_kosenko

>Меня убило вот это var procedure

Тут похоже всего навсего пустой раздел с переменными, паскалисты привыкли его прописывать чтобы потом не забыть.

SV0L0CH
()
Ответ на: комментарий от Reaper

>А этим все реализации паскаля страдали?

Насчёт делфи ньюансов не знаю (да и не интересно мне уже).

SV0L0CH
()
Ответ на: комментарий от eugine_kosenko

Вы гениально продемонстрировали, что миф о великой удобочитаемости Питона - не более чем миф. Не надо писать такие примеры кода, ни на чем.

Gukl ★★★
()
Ответ на: комментарий от yantux

Нет, мне бы сравнительный пример кода паскаля и питона, который раскрывает преимущество питона над паскалем.


При чем тут сравнительный пример?
Паскаль быстро компилируется (можно в один проход) и быстро выполняется, а питон вяло интерпритируется.

vada ★★★★★
()
Ответ на: комментарий от vada

>Паскаль быстро компилируется (можно в один проход) и быстро выполняется, а питон вяло интерпритируется.

Не забудь про время разработки: быстрая разработка и приемлемая производительность как правило в разы лучше для ынтырпрайза (да и для хеллоуворлдов), чем быстрая работа и годы на разработку и отладку.

Труд хорошего инженера вообще-то стоит дороже труда процессора и памяти.

anonymous
()
Ответ на: комментарий от Gukl

>миф о великой удобочитаемости Питона

о_О какая к черту удобочитаемомость? Код на С++ или жабе гораздо понятнее. А тут еще вкуривать надо, как же оно так хитровыебнуто работает

annulen ★★★★★
()
Ответ на: комментарий от Gukl

>Представь простыню, в которой таких строк сотня

Достаточно открыть код почти любой питоновой программы

annulen ★★★★★
()
Ответ на: комментарий от Gukl

Совершенно читабельно, как мне кажется. Я же говорю - как в алгебре или матане есть то, что называется set-builder notation: {(x,y)|x<-[0,100],y<-[0,x], x+y нечётный}

А вот сгенерить то же самое через императивный код - получится что-нибудь типа

for(int i=0;i<=100; i++){
 for(int j=0;j<=i;j++){
  if((i+j)%2==1){
...

Нифига не читабельней, как мне кажется.

yet_another_anon
()
Ответ на: комментарий от annulen

покажи этот код тому кто первый раз слышит про язык такой C++ - думаю ему тоже ничего не будет понятно. разумеется имеется в виду читаемость кода тем, кто язык знает. а обфускацией заниматься можно на чем угодно

olegsov
()
Ответ на: комментарий от annulen

какая к черту удобочитаемомость? Код на С++ [..] гораздо понятнее.

ололо, просто Вы к нему больше привыкли, а насчёт большей удобочитаемости не скажите, порой «kewl h@c|(erz» так понапишут - чёрт ногу сломит :)

shty ★★★★★
()
Ответ на: комментарий от annulen

Я, собственно, к тому, что удобочитаемость завист не от языка, а от изначальной удобонаписанности.

Gukl ★★★
()
Ответ на: комментарий от yet_another_anon

Зато можно нормальные имена дать переменным, чтобы было понятно, что с чем тут делают. Для числодробилки, конечно, некритично, можно и место поэкономить ;)

Gukl ★★★
()
Ответ на: комментарий от Gukl

>Вы гениально продемонстрировали, что миф о великой удобочитаемости Питона - не более чем миф.

Так функциональщики же постоянно орут о лямбдах и генераторах, не? Причем вещи то и вправду хорошие и я их введение только одобряю, но мифическая «читабельность кода» (которая мифична не только в случае питона, но и для всех ЯП вообще) таки падает, это да.

YogSagot ★★☆
()
Ответ на: комментарий от Reaper

провыерил в Лазарусе, так работает и нафиг нужно это замыкание?

[code]procedure p(n: integer); var procedure fn; begin { тут что-то делается... } end; begin fn(); end;[/code]

yantux
()
Ответ на: комментарий от eugine_kosenko

> Паскаль уже научился делать замыкания?

Привёл пример кода выше. если это и есть замыкания. Только вот зачем нужны эти замыкания?

yantux
()
Ответ на: комментарий от eugine_kosenko

> Пример кода на Питоне:

[(x, y) for x in xrange(0, 100) for y in xrange(0, x) if odd(x + y)]

Я не понимаю синтаксиса и алгоритма этого кода. Разве его нельзя переписать на Паскале?

Паскаль - это реально быстрый язык во на всех этапах: от разработки, до отладки.

yantux
()
Ответ на: комментарий от eugine_kosenko

> Где об этом можно узнать. Ха, Google на «замыкания в Паскале» вообще очень смешные результаты выдает :-).

Взять, да попробовать. Благо Лазарус под любой платформой хорошо работает.

yantux
()
Ответ на: комментарий от anonymous

> Не забудь про время разработки: быстрая разработка и приемлемая

производительность как правило в разы лучше для ынтырпрайза (да и
для хеллоуворлдов), чем быстрая работа и годы на разработку и

> отладку.

Труд хорошего инженера вообще-то стоит дороже труда процессора и
памяти.

Поэтому паскаль лучше питона. Ешё ни ктоне привёл примера кода, который лучше на Питоне, чем на паскале. У Паскаля - Лазару, free pascal одни приемущества перед питоном. С и С++ нужны в самых крайних случаях.

yantux
()
Ответ на: комментарий от yantux

Ешё ни ктоне привёл примера кода, который лучше на Питоне, чем на паскале.

во-первых обратного тоже никто не видел, а во-вторых чего Вы с ним (Лазарем Моисеевичем) носитесь как дурень с писаной торбой, приложений и библиотек как не было так и нет, в нормальных объёмах

У Паскаля - Лазару, free pascal одни приемущества перед питоном.

и чтобы не быть голословным - список в студию

shty ★★★★★
()
Ответ на: комментарий от yantux

Я не понимаю синтаксиса и алгоритма этого кода. Разве его нельзя переписать на Паскале? Паскаль - это реально быстрый язык во на всех этапах: от разработки, до отладки.

Я попробую вам объяснить на пальцах (если напутаю, прошу поправить). Этот алгоритм выдаёт список (по вашему --- динамический массив) из кортежей (статических неизменяемых массивов длиною в данном случае 2). Перебор осуществляется по всем от 0 до 99 включительно числам для x и по всем от 0 дл x (невключительно) для y. Пара чисел включается в динамический маасив только, если их сумма нечётна.

Кстати, у меня пример не заработал, т.к. мой Python 2.5 не знает зарезервированного слова odd, пришлось исправить и написать:

[(x, y) for x in xrange(0, 100) for y in xrange(0, x) if (x + y)%2] 
Vudod ★★★★★
()
Ответ на: комментарий от Vudod

> Кстати, у меня пример не заработал, т.к. мой Python 2.5 не знает зарезервированного слова odd, пришлось исправить и написать:

Этот код не реально написать на паскале?

yantux
()
Ответ на: комментарий от yantux

> Этот код не реально написать на паскале?

Нереально. Опровергни меня, если сможешь.

anonymous
()
Ответ на: комментарий от yantux

Вы либо тролль, либо глупы, а вероятнее всего - и то и то. Оба языка - Тьюринг-полные. Но Python более высокоуровневый, что дает возможность строить на нем абстракции более высокого уровня ценой значительно меньших усилий.

P.S. А тот код, в который вы там «Я не понимаю синтаксиса и алгоритма этого кода.», является практически калькой математической записи операции над множеством общего вида S = { f(x) | x ∈ N , g(x)}, где N - исходное множество, f - вычисляемая функция, g - условие. Так что делайте выводы о своем образовании.

WC
()
Ответ на: комментарий от Gukl

Дык если написать в виде замыкания, и так понятно любому школьнику (по крайней мере, если он алгебру не косил). А с этими вложенными циклами, пожалуй, ещё и комментов придётся писать больше чем кода.

yet_another_anon
()
Ответ на: комментарий от anonymous

Я не настолько хорошо знаю паскаль (если честно, я его вообще не знаю, только троллю им). Но вот на какой-нибудь джаве это будет выглядеть как-нибудь так:

 
public LinkedList array(x){ 
 LinkedList<Tuple<int,int>> list = new LinkedList<Tuple<int,int>>; 
 for(int i=0;i<=x;i++){ 
  for(int j=0; j<=i;j++){ 
   if((i+j)%2==1){ 
    list.add(new Tuple(i,j)); 
   } 
  } 
 } 
 return list; 
} 

Я думаю, что-то подобное можно набыдлокодить и на паскале. Но в виде замыкания красивее и читаемее, тут уж не поспоришь.

yet_another_anon
()
Ответ на: комментарий от Vudod

> [(x, y) for x in xrange(0, 100) for y in xrange(0, x) if (x + y)%2]

Такие случаи нужны один раз на пару сотен, а то тысяч строк кода (если, конечно, мы пишем не math-related мусор), подобные примеры, оторванные от практики, как вещь в себе, ничего не показывают абсолютно. Общим количеством абсолютно одинакового по семантике кода мы выравняем эту примочку до малопригодной.

Это как примеры на Хаскеле, где приводится сортировка хаскелем и сяхой. Искусственные примеры всё. На практике, чтобы написать что-то более стоящее на Хаскеле, чем сложение двух нечётных чисел, нужно прорываться через монадные костыли и воротить то, что мало походит на читаемость и понятность и компактность. Для математической байды не спорю, кавай. Но не всё в ней заключается, зачастую это всё-таки старый-добрый быдляцкий перебор кирпичиков, как выражался vsl.

ubuntulover
()
Ответ на: комментарий от ubuntulover

>Такие случаи нужны один раз на пару сотен, а то тысяч строк кода (если, конечно, мы пишем не math-related мусор),

наверное так и есть - если речь о мусорном коде типа поддержки списков через указатели, выделение и освобождение памяти и другом бреде которым приходится заниматься на си...

anonymous
()
Ответ на: комментарий от yantux

> и нафиг нужно это замыкание?

Замыкания это способ инкапсуляции данных. Если в ОО подходе данные инкапсулируются в объектах, замыкание это инкапсуляция данных в функции. Функция «замыкает» внешние данные в момент своего объявления и при последующих вызовах работает с ними.

Нужны они потому, что удобны своей лаконичностью. Позволяют жить без писанины классов на каждый чих, существенно уменьшая объём кода.

Reaper ★★
()
Ответ на: комментарий от yantux

Нет, как выяснилось, это не замыкания. Советую последний вопрос набрать в поисковой строке google.com. Вы умеете им пользоваться?

eugine_kosenko ★★★
()
Ответ на: комментарий от shty

Не-не-не! Руки прочь! Это мой тролль, и только я буду его кормить!

eugine_kosenko ★★★
()
Ответ на: комментарий от Vudod

Это не зарезервированное слово, это функция :-). Если честно, писал по памяти, рыться в справочниках было лень.

eugine_kosenko ★★★
()
Ответ на: комментарий от ubuntulover

Ну наконец-то тема выведена в нужное направление. Как бы еще к этому всему Лисп прикрутить?

eugine_kosenko ★★★
()
Ответ на: комментарий от yet_another_anon

Ладно, согласен, вопрос стиля ;) ИМХО, когда комментариев больше чем кода - хорошо!

Gukl ★★★
()
Ответ на: комментарий от Gukl

Gukl> Вы гениально продемонстрировали, что миф о великой удобочитаемости Питона - не более чем миф. Не надо писать такие примеры кода, ни на чем.

Лучше пойди и удавись. Если для тебя краткие и удобные записи не удобочитаемы, значит ты умственно неполноценен.

Quasar ★★★★★
()
Ответ на: комментарий от Gukl

Gukl> Представь простыню, в которой таких строк сотня. И написал их не ты.

Пример из _реального использования_ в студию. А то, видишь ли, я могу нечитабельные конструкции из любого языка взять, и наворотить говнокод. При этом говнокод рабочий, но нафиг никому не нужный, так как реальные задачи он не решает.

Quasar ★★★★★
()
Ответ на: комментарий от Quasar

Мы обсуждали конкретную строку, приведеннув качестве примера, не более того. За примерами из жизни сходите на govnokod.ru

Gukl ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.