01 септември 2008

Първи стъпки в програмирането с Python. част 7.Писна ми да измислям тъпи имена

Index:
1.Интродукция
2.В началото бе словото
3.Ю толкинг ту ми?
4.Ужаст и страхопаника
5.Императорът и дракона
6. Драконът и Императора





7.Писна ми да измислям тъпи имена

Днес бях обещал класове, Всъщност като се замисля май не обещах нищо, така че ще си позволя вместо с класове, днес да се запознаем с функциите генератори, с изразите генератори, и с генератори на списъци. Също ще засегна малко и темата за итераторите. Май стана много.
И така, спомняте си как можем да използваме for за да преминем през всички елементи на дадена последователност, това се нарича итериране. Итераторите са обекти които имат метод next(), т.е. обекти които дават някакъв резултат, когато извикате методът next() върху тях. Не съм обяснявал методите, но на кратко, това са тези неща, които приличан на функций, които следват след даден обект и точка след него, да речем имаме списък x=[1,3,2,4,6,5] и след това напишем x.sort() и ще x ще е преобразуван на [1,2,3,4,5,6], това е различно от функциите, защото методите са вътрешни на обектите(числа, списъци и т.н.), а функциите са външни, в повечето случаи методите променят самия обект, а функциите връщат друг обект като резултат(това не винаги е така). След краткото обяснение на методите, да се върнем на итераторите. Същия този списък x който сега е [1,2,3,4,5,6] ще го направим на итератор, както прави for цикълът.

>>>x=iter(x)

x сега е итератор, можем да използваме методът next() върху него:

>>> x.next()
1
>>> x.next()
2
>>> x.next()
3
>>> x.next()
4
>>> x.next()
5
>>> x.next()
6



както виждате, методът next() връща следващия елемент от итератора, по този начин ако има много елементи в списъкът, for ще е по бърз като изпълнение, защото само по 1 стойност от списъка се обработва на веднъж, вместо целия списък. Това има по общо приложение.

Генераторите са подобни неща, те са функции, които вместо return използват думичката yield. "Само това ли?" ще си кажете вие, и "Не съвсем" ще ви отговоря аз. Тази функция, която използва yield вместо return връща обект генератор, който е като итератора, т.е. можем да минем през него с for и можем да използваме метода next(), всеки път когато бъде повикан този метод, получаваме генерирана стойност. Да видим подобен пример:

def gen(list):
for x in list:
yield x


когато повикаме функцията x=gen([1,2,3,4,5,6]) получаваме x който е генератор:

>>> x.next()
1
>>> x.next()
2
>>> x.next()
3
>>> x.next()
4
>>> x.next()
5
>>> x.next()
6





Същата ситуация. Може да пишете по сложни функций, които да изчисляват нещо и да го връщат при всеки yield, но няма да давам по сложни примери за сега.

Сега ще поговоря малко за list comprehentions или генератори на списъци, и изразите генератори(genrator expretions). Първите се използват по често от вторите, ще ги обясня и двете. Горния примерен х може да бъде получен и по следния начин:

x=(x for x in xrange(1,6))


тук (x for x in xrange(1,6)) е израз генератор, генераторът се слага в кръгли скоби и в него се пише изразът x for x in xrange(1,6), това е малко слошно за обяснение, ето как може да се прочете, за да ви е по ясно, "дай ми x за всяко x във интервала от 1 до 6, и го сложи в генератор. Това ще ви стане по ясно, като обясня генераторите на списъци. Те имат почти същия синтаксис, но се пишат в квадратни скоби вместо в кръгли([]), и връщат списък вместо генератор, ето как:

>>>x=[x for x in xrange(1,6)]
>>>x
[1,2,3,4,5,6]


сега разбирате ли? "Направи списък в който всеки елемент е елемент от обхвата 1 of 6", можем да го направим да създава списък със четни или нечетни числа по следния начин:


>>>x=[x for x in xrange(1,6) if x%2 != 0]
>>>x
[1,3,5]


Този код връща само нечетните числа, чете се "създай списък, в който всеки елемент е елемент от обхвата 1 до 6, ако остатъкът от деление с 2 е различен от 0" Спомнете си делението с остатък, ако разделите 4 на 2 няма остатък, но 3 делно на 2 дава остатък 1, ако сте в 2-ри клас де :D Това прави операторът %. Същото става и със изразите генератори, само че вместо списък ще върнат генератор който има само нечетни елементи.

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

Няма коментари: