txt:Клик – Вовед во програмирање – Python
Во претходниот број видовме како може да креирате едноставна GUI апликација со помош на C++ фремворкот Qt. Овојпат ќе видиме како може лесно да креирате програми со помош на динамички испишаниот (dynamic typed) јазик Python. Концептот на динамички јазици е ист речиси во сите имплементации кај овој тип на јазици. Имате едноставна синтакса која ја применувате за создавање на бараниот резултат па врз основа на обработени податоци се структуираат други делови и сегменти од апликацијата која ја пишувате. Кога станува збор за динамички јазици, терминот динамички впрочем се однесува на начинот на кој се дефинираат променливите и методите во склоп на апликацијата. Кај динамичките јазици нема примитивни типови на податоци. Најчесто сѐ е објект од некоја класа (пр. ‘int’ не е примитивен тип на податок, туку класа).
Програмскиот јазик е динамички, кога најголем дел од проверките за типови податоци се врши за време на извршувањето на апликацијата, за разлика од статичките јазици каде тоа се прави за време на компајлирањето. При динамичко програмирање вредностите имаат тип но не и променливите. Динамички јазици од овој тип се Erlang, Groovy, JavaScript, Lisp, Lua, Objective-C, Perl (во однос на кориснички дефинирани типови, но не и вграден типови), PHP, Prolog, Python, Ruby, Tcl и Smalltalk. Во споредба со статичкото програмирање, при динамичкото програмирање можете да напишете пофлексибилен код (на пример, дозволено е да се креираат програми кои ќе генерираат типови и чија функционалност ќе се темели на run-time податоците кои ќе ги добие). Тоа е затоа што динамичкиот инпут кај динамичкиот јазик прифаќа и се обидува да изврши сегменти од код кои можат да се отфрлат како валидни кај статичките програмски јазици. Терминот „динамичен јазик“ подразбира нешто различно („динамика при извршување“) и динамичкиот јазик не секогаш е динамички испишан.
Динамички испишаните јазици во споредба со нивните статички паралели прават помалку проверки на изворниот код при компајлирање (но ќе проверат, на пример, дали програмата е синтаксички точна). Проверките при извршување може да бидат многу понапредни, со оглед на тоа што може да користат динамички информации како и било кои други информации кои се присутни за време на компајлирањето. Од друга страна, проверка при извршување ги отфрла тие услови во одреден сегмент од извршувањето на програмата и овие проверки се повторуваат при секое извршување на програмата. Развој при користење на динамички испишани јазици најчесто е поддржано од шеми за дизајн и програмирање како што се unit-тестови. Овие тестови се клучен сегмент при професионалното развивање на софтвер и е особено важно кај динамичките јазици. Во пракса, тестирањето се врши за да се осигура точното извршување и добивање на очекувани резултати од апликацијата, како и полесна детекција на извршени промени, регресии итн.
Кога станува збор за динамички јазици, еден од најголемите претставници на овој тип јазици е Python. Во продолжение ќе разгледаме како овој јазик функционира, која е неговата синтакса и употребливост, каде сѐ се користи и кои се придобивките при неговото користење од страна на почетници.
Python (се чита Пајтон) претставува динамички програмски јазик развиен од Guido van Rossum во раните 90ти години. Јазикот денес се применува насекаде за скрипти, па се до апликации за извршување комплексни операции. Неговата едноставност лежи во тоа што јазикот е динамички, програмерот не е толку ограничен во пишувањето на кодот и не мора да се држи до строги правила како што е случај со другите статички испишани програмски јазици. Во Python динамичноста дозволува интерпретерот да открие каква вредност се крие зад таа променлива. Покрај тие поедноставувања Python има уште редица други кои на програмерот му овозможуваат побрзо работење и завршување на некои задачи и заштеда на време.
Python е јазик од високо ниво. Неговата философија за дизајн ја нагласува читливоста на кодот. Python „нѐ учи“ дека комбинирањето на извонредна моќ со многу јасна синтакса е секогаш клучно при пишувањето на успешни софтверски апликации, а имајќи во предвид дека јазикот е нашироко употребуван и издаден како слободен софтвер, има „дебела“ стандардна библиотека на функционалности кои може да се применат за добивање сакани резултати. Едно битно својство на овој јазик е индентацијата или вовлекувањето на кодот. Практично секој блок во апликацијата започнува со нова дополнителна индентација (најчесто 8 празни места, колку што е и Tab). Python подржува неколку програмски парадигми (првенствено објектно-ориентирана, императивна, но и функционална) и располага со целосно динамичен систем на типови и автоматско управување со меморија, слична на она кај Perl, Ruby, Scheme, и Tcl. Како и другите динамички јазици, Пајтон често се користи како јазик за скриптирање. Јазикот е отворен, потпомогнат во голема мера од заедницата, што доаѓа како развоен модел раководен од страна на непрофитната Python Software Foundation.
Прво Python искуство
Во Ubuntu особено новите верзии, нема потреба од инсталирање на Python како посебен пакет (името на пакетот е python), доаѓа стандардно со Ubuntu инсталацијата. Тоа што е потребно е да пуштите терминал и да почнете да ги следите упатствата за кодирање дадени или од официјалната Python документација или од некоја друга книга која сметате дека е прикладна за вас. Најпрво ќе ве запознаеме со интерактивниот интерпретер на Python. Овде, битно да се спомене е дека Python е интерпретиран јазик, што значи дека таму каде што се случува маѓијата впрочем е измеѓу вашето повикување на апликацијата и добивањето на бајт-код кој подоцна се извршува на виртуелна машина. За илустрација, откако ќе напишете Python апликација и ја извршите, се вклучува процесот за добивање на бајт-код, при што се добива датотека со .pyc екстензија, таа датотека потоа се извршува од виртуелната машина на јазикот. Можеби сето ова ќе го сфатите многу поедноставно доколку се вклучите во интерпретирањето на командите и сфаќањето на стандардната синтакса на Python. Пуштете терминал и едноставно напишете:
# python
Интерактивната „школка“ изгледа нешто како:
Python 2.6.4 (r264:75706, Dec 7 2009, 18:45:15)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
Околината на ваквата школка (не само кај Python) уште се вика и REPL, како кратенка од Read-Evaluate-Print-Loop (Читање – пресметување – печатење – циклус). Откако ќе се пушти, може да почнете да пишувате Python „команди“ интерактивно. За почеток почнете со проста аритметика, напишете 1+2, 3+4, 1.0 + 2.3 и ќе видите дека излезните резултати се добиваат веднаш после аритметичката операција. Резултатите зависат од тоа какви типови внесувате, дали е децимален број, дали е целоброен итн. Исто така, може да видите дека аритметичките операции можат да се применуваат и за други типови податоци, пр (‘aleks’ + ‘andar’ ќе даде излез од ‘aleksandar’). Но за тоа подоцна. Основните операции се вклучени во стандарната библиотека и нема потреба да вклучувате дополнителни модули (имплементации на функционалности), за нивно искористување. Но доколку сакате да имате нешто покомплексни операции, потребно е да го вметнете (import-ирате) соодветниот модул. Еве еден пример.
За пресметување на квадрат на два броја, може да се користи операторот ** (две ѕвезди), пр:
>>> 2 ** 3
8
Тоа е резултат од операцијата „на два на трета“. Но ако сакате да пресметате квадратен корен на некој број, ќе треба да вклучите дополнителен модул кој се вика едноставно ‘math’. Тоа се прави преку командата import. Целата операција за добивање на квадратен корен на 9 би изгледала вака:
>>> import math
>>> math.sqrt(9)
3
Кога се работи пак за стандарден излез кај Python, најчесто се користи ‘print’, па така ако сакаме да испечатиме “Hello World” стринг, користиме:
>>> print “Hello World”
И со тоа ја имаме првата “Hello World” програма во Python.
Во Python коментарите започнуваат со # (тараба), нешто што најверојатно е наследено од интерактивните школки од типот на SH, BASH, ZSH итн.
Типови променливи
Променливите содржат одредена вредност која може да биде искористена или променета во подоцнежното извршување на кодот. Во Python практично се покриени сите типови на податоци, но наверојатно вие за тоа нема да се грижите ни малку. Нема експлицитно да потенцирате дека се работи за целоброен тип на податоци (int), ќе го користите само операторот за доделување на вредност:
>>> a = 3
Со тоа ‘a’ станува интеџер. Ако сакаме да му доделиме String (текстуална низа) вредност, користиме:
>>> a = “string”
Сетете се дека во Python сѐ е објект на некоја класа, па така ‘a’ станува string објект (инстанца од класа ’str’).
Од друга страна пак, ако сакаме да печатиме и стринг и интеџер, може да го направиме преку едноставно одделување на типовите со запирка:
>>> print “This is integer:”, a, “ and this is string:“, b
Каде ‘a’ е цел број, додека ‘b’ е стринг.
Доколку сакаме да видиме од кој тип на податоци е одредеена променлива, можеме или да го користиме методот type или може да се користи атрибутот __class__ (долните црти ќе ги објасниме подоцна) кој се повикува за саканата променлива (во двата случаи резултатот е ист):
>>> b.__class__
Буловите променливи и операции постојат исто како и кај другите јазици. Но за проверка на вредноста на овие променливи или конструкција при извршувањето, потребни ви е условна конструкција (if – then – else):
Ако – тогаш – инаку
Услов е конструкција во која одреден сегмент од кодот ќе се изврши само ако е задоволен одреден критериум. Што би значело, ако сакаме да провериме дали ‘a’ е точна или неточна вредност (true/false), тогаш ја имаме оваа конструкција:
if a:
print 'a is true'
else:
print 'a is false'
Овде исто така постои и ‘elif’ конструкцијата, што би значело, ако некој услов не е задоволен, тогаш – ако друг услов е задоволен:
a = 3
if a == 1:
print 'a is 1'
elif a == 3
print 'a is 3'
Така стигаме до повторливоста на одредени делови на код. Што можеме да одредиме дали некој дел од кодот е таков каков што ние очекуваме, тогаш би можеле и да му кажеме тој код да се извршува онолку пати колку што е потребно за да се задоволи условот (секако ако тоа ни е потребно).
Циклуси
Во Python може да ги користите познатите циклус конструкции како и кај другите јазици. Замислете дека ви е потребно одредено извршување 20тина пати во текот на извршувањето на апликацијата. Што би направиле? Може да копирате и пастирате одреден код 20 пати, што дизајнерски е глупаво и неоправдано, а и „скапо“ по цена на извршувањето, или пак може да користите циклуси кои ќе извршат одреден процес онолку пати колку што ќе биде кажано, се додека не биде задоволен одреден услов.
Користењето на ‘while’ циклус е многу лесно и тоа го правите на тој начин што дефинирате услов кој треба да биде постигнат непосредно пред резервираниот збор ‘while’ во вашата Python апликација:
>>> a = 0
>>> while a < 100:
a = a + 1
print a
Ова ќе го ја испечати вредноста на 'a' од 0 до 100. Му кажуваме, сѐ додека 'a' е помало од 100, зголемувај ја неговата вредност. Кога ќе биде стигната 100ката, излези од циклусот. За почетниците, ова е „замка“ во која извршувањето влегува сѐ додека не се задоволи некој критериум. Доколку имате конструкција каде извршувањето влегува во циклус, а не е задоволен некој критериум, станува збор за бескраен циклус (infinite loop).
Потоа го имам познатиот 'for' циклус, кој би одел нешто како:
name = “Tralalala”
for a in name:
print a
Ова ќе ги испечати сите знаци од кои се состои зборот ‘name’ (една под друга). Така во даден момент имаме по еден знак како вредност на ‘a’. Со тоа може да одредиме дали се работи за буквата ‘a’ во зборот name:
name = “Tralalala”
i = 0
for a in name:
if a = 'a':
i = i+1
print i
Тоа ќе ги испечати вкупниот број на „а“ во зборот “Tralalala” (4).
При користење на циклусната конструкција ‘for’ во Python може да се користи и вградената функција ‘range()’ со која се дава опсег на вредности во аритметичка прогресија. Пр.
for a in range(0, 100):
print a
Ова ќе ги испечати сите броеви од 0 до 100. Доколку сакаме да ја направиме ситуацијата барем малку покомплексна може да вметнеме и услов со кој ќе кажеме, печати ги сите вредности од 0 до 100 каде модулот со 3 е еднаков на 0 (оператор за остаток при делење е процентот (%)):
for a in range(0, 100):
if (a%3) == 0:
print a
Со ова ги покриваме почетоците на програмирање со Python. Секако, не секогаш е прикладно да се користи Python како програмски јазик, тоа најчесто важи она што се бара од самата апликација, но имајќи во предвид дека голем број на сервиси и производи за своето API имаат и Python имплементација може слободно да кажеме дека овој јазик денес е еден од најкористените и најпрактичните програмски јазици. Голем број на софтверски компании го користат за развој на своите услуги и производи, Python е во сржта на производите на Google (па дури и авторот Guido Van Rossum е вработен во Google), што ни укажува на важноста од негово познавање во ситуации кога се бавиме со јазици од пониско ниво. Ова го потенцирам поради можноста за решавање на едноставни проблеми кои би вклучиле скриптирање и автоматизација на развој во крупни проекти кои можат да го вклучат Python како јазик. Денес постојат многу проширувања за овој јазик, па така на лесен начин може од C++ код да се добие Python модул кој потоа ќе биде импортиран во нашата апликација и користен како таков.
Во иднина ќе разгледаме можности за користење на Python за завршување на понапредни задачи, работа со датотеки и парсирање на текст, па се до можност за користење на веб и GUI фрејмворци базирани на Python. Дотогаш строго препорачлива литература која е пожелно да ја прелистате се наоѓа на онлајн книгата за учење на Python.
Од неодамна во Хаклаб КИКА (www.hacklab.sk) со динамика од секој втор четврток во месецот, се одржуваат „Пајтон Вечери“ во кои корисниците споделуваат знаење за можностите на овој програмски јазик.
Забелешка: текстот во целина е првично објавен во мартовскиот број на магазинот за компјутерска технологија „Клик“.

По PEP8 стандард не се користи Таб туку се користи Софт-таб наместен на 4 празни места а не 8. Со среќа питон вечери во Кика, ама земете некој прав пајтонџија да предава, пошо пајтонот не е само интерпретер туку цела филозофија. И ова обавезно да си го прочитате:
http://www.python.org/dev/peps/pep-0008/
Одлично Дејан, повели во Кика секој втор четврток (www.hacklab.sk), може да одржиш предавање за празните места и индентацијата.
поздрав.
Благодарам на поканата. Ако сум со време добар, ќе навратам обавезно.
Еј, вие од Python вечери ако не кодирате Python како што треба, ќе ви пратиме полиција во хаклабот. :)
Туку, ајде да ја гребнене малку Python филозофијата, кога веќе се инсистира.
“There should be one– and preferably only one –obvious way to do it.”
Дали ова кажува дека Python програмерите се робови на програмскиот јазик и немаат слобода на избор како ќе пристапат кон решавањето на одреден проблем? Дали програмскиот јазик треба да ги присили на решавање на начин кој што е најблизок до начинот на кој размислува неговиот творец (Guido) или пак треба да дозволи секој програмер сам да си го пронајде нему најлогичниот пристап кон решавање на одреден проблем?
Во таа смисла, дали треба компјутерите да не управуваат нас, или ние нив? Ние сме господарите, а тие робовите, што е всушност дел од философијата на Ruby.
Програмерите се различни суштества, различно размислуваат, различно пристапуваат кон решавање на одреден проблем и треба да имаат слобода избор како ќе го направат тоа.
За крај, ајде да ја смириме малку топката. :) Ruby on Rails VS Django
п.с. Да не се разбереме погрешно, правам споредба на философии на програмски јазици, coding conventions е сосема друга тема која исто така треба да се почитува. ;)
полезно…
Концептот на динамички јазици е ист речиси во сите имплементации кај овој тип на[...]…
Далибор,
од реченицата која си ја цитирал до твојот заклучок има планина од простор :)
Прво, реченицата вика „should“ – би требало, а после вика „obvious“ – очигледен.
Значи би требало да има еден очигледен начин на решавање на проблемите.
Не значи дека нема повеќе, но тие може да се неочигледни.
Но во секој случај, The Zen of Python воопшто не се некои закони на Python.
Како што викаат на http://www.python.org/dev/culture/ – Don’t take these 19 aphorisms too seriously — tattooing them on your body is probably a bad idea, for example — but it’s instructive to contemplate them.
А за слободата и експресивноста … тоа е дугачка дискусија.
Можеби не го знаеш Perl – но една од причините зашто Perl го губи „пазарот“ е дека никој не сака да го чита туѓ Perl код :)
И уште нешто референци на темава на кои налетав :)
http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg01587.html
http://stackoverflow.com/questions/234721/what-are-the-biggest-differences-between-python-and-ruby-from-a-philosophical-per
Дамјан,
Според кое правило се одредува кој е очигледниот, а кои неочигледните начини за решавање на проблемот во Python? Некако не ми е логично, експлицитната философија на јазикот, да користи ваква неексплицитна терминологија, ама ајде. :)
Што се однесува до Perl, не сум работел но сум напишал по некоја скрипта колку да видам дека синтаксата, недоволно моќниот ОО модел и слично се основните проблеми, а не “more than one way to do it” философијата. Успат, некако не ми изгледа дека Perl го губи пазарот (1), иако perl-ашиве би требало да научат нешто подобро.
(1) TIOBE Index
е како не, види го падот на Perl од 2005та наваму, 3 пати.
енивеј, културата не е нешто што треба да биде регулирано и затоа the zen of Python не е the law of Python.
Дури сега добивам обратен впечаток – Со инсистирање на стриктно дефинирана култура, дали Ruby Заедницата е таа која не дозволува слобода :)
Од каде па сега дека Ruby има стриктно дефинирана култура кога “more than one way to do it”, јасно зборува за спротивното. За разлика од Python. ;)
Leave your response!
За блогот
Guadalquivirization е блог на кој ги изнесувам своите мислења околу технологијата со која секојдневно се среќавам, како и лични дневно-политички теми и фрустрации со кои се соочувам. Целта пред се ми е да помогнам на корисниците да ја сфатат мојата реалност, не да им ја наметнам туку да ги насочам во работи со кои имам искуство, професионални и приватни.
На блогот може да се најдат и текстовите кои ги објавувам во текот на месецот во дневни или месечни весници и списанија.
Последни коментари
Колумни
Твитам бе!
Delicious линкови
LinkedIn
Социјализација
Други страни
Тагови
Archives