воскресенье, 31 октября 2010 г.

Python: списки




Обойти вниманием такой тип данных языка Python нельзя.
Списки это последовательность элементов. Данный тип данных относится к изменяемым. Фактически список это структура данных которая реализует хорошол известную структуру данных в программировании: связный список.
Список как структура данных Python поддерживает следующие операции:
append (a)--вставка элемента любого типа в конец списка    
extended(a)--присоединяет в конец  списка другой список переданный параметром функции
count(a)--подсчитывает количество элементов c значением a
index(a)--возвращает индекс искомого элемента или возбуждает исключение ValueError
insert(i,a)--вставить объект  a произвольного типа в позицию i
remove(a)--удаляем элемент со значением a
pop()--удаляем у списка последний элемент и считываем его в переменную имитируя поведение стека.
reverse-переворачивает список, т.е. первый элемент меняется местами с последним и т.д.
sort-сортируем список
Еще список позволяет брать срезы:
a=range(10)#генерируем список из 10 значений от 0 до 10(исключая 10)

 a[1:5]#берем срез с 1 по 5 элемент
[1, 2, 3, 4]
 a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Обратим внимание что первый элемент имеет индекс 0, а не 1!
Кроме того мы можем брать срезы с определенным шагом:
 a[1:5:2]#выбираем каждый второй элемент начиная с 1-го и до 5-го
[1, 3]
А если хотим получить весь список:
 a[:]#выбираем все элементы списка
Все элементы начиная с 1-го
 a[1:]#выбираем все элементы списка начиная с 1(по умолчанию шаг 1)
 [1, 2, 3, 4, 5, 6, 7, 8, 9]
Все элементы с шагом 2:
 a[::2]
[0, 2, 4, 6, 8]
Но Python предоставляет нам дзен-возможности: отрицательные индексы:)
выберем последний элемент:
a[-1]
9
А такой срез нам даст пред предпоследний и предпоследний:
a[-3:-1]
[7, 8]
Ну и весь список в обратном порядке:

a[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Пара слов о срезах. Срезы это общий инструмент для всех последовательностей. Срез это независимый объект от первоначального, точнее копия выбранной части. Проверим это:
a=range(10)
asl=a[0:3]
for i in xrange(0,len(asl)): #здесь применена функция xrange, которая возвращает нам #итератор по объекту xrange. Хrange генерирует цифру только во время обращения, чем #экономится память и время выполнения
asl[i]=asl[i]*3

asl
[0, 9, 6]

a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Как видим изменения внесенные в срез никоим образом не затронули исходный объект.
А вот если мы присвоим двум переменным одинаковый список таким образом:

 a=b=range(10)
 a[1]=a[1]*10
 a[1]
10
 a
[0, 10, 2, 3, 4, 5, 6, 7, 8, 9]
 b
[0, 10, 2, 3, 4, 5, 6, 7, 8, 9]
Этот интересный результат связан с тем что в данном случае произошло так называемое поверхностное копирование объектов. Так как в python все переменные это на самом деле ссылки, то когда python обрабатывает присвоения вида: a=b=4 то он прост связывает с именами a и b одну и ту же ссылку
А если мы напишем так:  


a=range(10)
b=range(10)
a[1]=a[1]*10
a
[0, 10, 2, 3, 4, 5, 6, 7, 8, 9]
b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


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

понедельник, 25 октября 2010 г.

Python: типы данных.

Здесь я решил собирать небольшие записки путешествия по миру python +примеры. И начнем мы его с типов данных. Python это язык типизированный, но сама система типизации в нем динамическая. Что это для нас значит?   Это значит что в одной и той же переменной мы можем совершенно спокойно хранить: числа, строки,кортежи, списки и ваши собственные типы данных. Кошмар:)И например такие строки совершенно нормально воспримет интерпретатор:
 a='Stroka'
a=1
a=[4,3]
Как такое возможно ? Вся тонкость в том чтобы понять что такое переменная в python: это не жестко статически выделенная область памяти, а динамически распределяемая область памяти, которая реализована за счет не типизированных указателей С. Именно поэтому python может свободно жонглировать типами данных, приводя переменную к нужному типу данных по мере необходимости.
А зачем же типы? А они нужны затем, что для каждого типа данных определен свой собственный набор операций и то что например вполне корректно для числа будет совсем некорректно для списка или кортежа.
Так же важно помнить, что python делит все типы данных на две категории:
1. Изменяемые
2. Неизменяемые
На всякий случай поясню: если мы создаем объект первого типа, то мы можем его изменять целиком или отдельные части и мы будем работать все с тем же объектом.
А вот со вторым типом объектов такие штучки не пройдут.
Продемонстрируем это на примере работы с двумя одинаковыми по содержанию коллекциями, но одна из них это список (изменяемый тип данных), а вторая кортеж (неизменяемые объекты).
am=[1,2,3,4]
aim=(1,2,3,4)
for i in xrange(0,len(am)-1):
     am[i]=7*am[i]
 print am           
В результате нам спокойно покажут:
>>>
[7, 14, 21, 4]
Но стоит нам добавить такие строки в скрипт:
 for i in xrange(0,len(am)-1):
     aim[i]=7*aim[i]
print aim
Как Python нам сообщит:
Traceback (most recent call last):
  File "/home/abc/блог/PyMutInmut.py", line 7, in
    aim[i]=7*aim[i]
TypeError: 'tuple' object does not support item assignment  
Собственно и произошло то о чем говорилось ранее: нельзя в неизменяемых объектах менять отдельные части,
Зачем так было придумано? Логика в этом есть и неплохая между прочим, неизменяемость объектов позволяет легче реализовывать, быстрее доступ к таким объектам на чтение но не на запись.Кроме того неизменяемые объекты нужны для функционального программирования, где воздействия на аргументы кроме возврата результата функции не допускаются.  
Здесь есть одна тонкость: неизменяемые объекты можно изменять!) Как ?Ну например так:
stri='hel'
stri=stri+'hel'
Произойдет прозаическая конкатенация строк. Однако заглянем за кулисы:
1) Python возьмет копию исходной строки+вторая
2) Пометит а потом и утилизирует (то есть уничтожит в памяти) исходную строку
3) Присвоит идентификатор новой строке.
То есть видите любая операция с неизменяемым объектом где он меняется порождает новый объект . Но на самом деле список и другие изменяемые структуры могут легко решить ваши проблемы по скорости записи и уступают по скорости чтения не намного.        

пятница, 22 октября 2010 г.

Gedit+FASM

Редактор Gedit я думаю в особых представлениях не нуждается:) И кроме всего прочего (а про прочее можно прочесть здесь) он позволяет подсвечивать синтаксис разных языков программирования. Чтобы включить этот режим достаточно выбрать:
Вид->Подсветка синтаксиса->...(нужный язык)
Итак что же мы имеем? Имеем мы много чего кроме ассемблера. Я остановил свой выбор на FASM(Flat Assembler). И заглянув на форум FASM-community обнаружил следующее: http://board.flatassembler.net/topic.php?t=6365 
Тем в топике не так уж и мало что вдохновляло, а с подсветкой синтаксиса FASM для Gedit была связана эта:http://board.flatassembler.net/topic.php?t=8523
Итак качаем файлики из темы. Это описания в формате xml лексем для ассемблера разновидности fasm. Эти файлы нужны для GTKSourceView. Это в свою очередь С-библиотека расширение для GTK, которое позволяет осуществлять многострочное редактирование текста, операции redo/undo   неограниченной глубины,регистронезависимый  поиск в тексте с кодировкой UTF-8, и прочие вещи специфичные для редакторов исходных текстов. Именно на этой библиотеке работает например Gedit,Anjuta(среда разработки для GNOME). Так вот, чтобы добавить возможности   подсветки нового синтаксиса в Gedit нам нужно распакавать файлики из темы, после чего кидаем в папку GTKSourceView по адресу: /usr/share или /usr/local/share или /user/gnome/share или /usr/X11R6/gnome/share  (у меня сработал первый путь ). Но здесь нас ждет засада: usr относится к системным папкам, которые Linux абы кому модифицировать не дает поэтому root спешит нам на помощь=)
И здесь есть два пути (точнее 3:)):
1) Пойти истинным Unix-way и копировать все командой sudo cp /path/to/your/file  /usr/share/ GTKSourceView/language-specs/asembly.lang
2)запустить nautilus из командной строки sudo nautilus
3) или его же запустить но немного иначе gksu nautilus
Далее когда вы скопируете файл asembly.lang  в language-specs,а в styles   oblivion2.xml останется только перезапустить gedit и возрадоваться.
    
 

воскресенье, 17 октября 2010 г.

Python: запускаем скрипты

 Если вы пользователь Linux то скорее всего у вас уже все есть и проверить наличие python довольно просто:откройте командную  строку и наберите: python
На самом деле все вы уже можете писать программы) Каждое ваше действие вы непосредственно передаете интерпретатору и его результаты будут немедленно показаны на экране в командной строке. Можно так же установить IDLE это штатная и очень неплохая среда разработки на python:
apt-get install idle. 
  А если нам захочется немедленнот в консоли проверить команду python? Ответ: 
python -c "print( 'Twest')"
-с заставляет python интерпретировать строку как код. 
Чтобы запустить скрипт в консоли можно написать python имя_скрипта.py 
А если написать в скрипте первой строчкой: #!env/python 
То python будет запущен с этим скриптом автоматом по команде 
./имя_скрипта.py    
./ Так как заставляет искать скрипт не по переменным окружения, а в текущем каталоге   

Что такое copyleft?

Все нам внушают то что собственность это святое и неприкосновенное, и то что за все нужно платить.Производители коммерческого программного обеспечения явно довольно таким положением вещей и всячески его стремятся закрепить.Однако практика развития ИТ показала, что оказывается можно иначе. Как? Окунемся немного в историю OpenSource движения
Первые открытые лицензии это лицензия MIT и BSD. Но это были весьма мягкие лицензии для пропиетарных программ.Но свою пользу они принесли, например система FreeBSD и ей родственные используются и поныне.   главное отличие лицензий MIT и BSD от GPL и сходных с ней лицензий в том, что они не запрещают совмещать открытый код и закрытый и делать весь код закрытым. Пропиетарные дельцы этим пользуются, например продукт LabVIEW использует виртуальную машину LLVM для организации выполнения байт-кода, однако исходные тексты LabVIEW вы не получите:) 
В 1984 году Ричард Столлман выдвинул новый тип лицензии GPL. Ее отличиемот предыдущих лицензий открытого типа была очень жесткая позиция по отношению к закрытым программам, а именно: ни одной строчки кода под GPL не может попасть в закрытый продукт. Для защиты от пропиетарных(закрытых) продуктов GPL-кода от закрытия было выдвинуто 4 права и одно ограничение GPL лицензии. 
Права:

  • Выполнять программу с любыми целями как коммерческого так и некоммерческого характера 
  • Свободно получать исходный текст программы 
  • Модифицировать исходный текст программы 
  • Распространять свою версию программы вместе со всеми   изменениями на условиях той же лицензии с которой вы ее получили 
Именно благодаря последнему пункту мы наблюдаем бурное развитие GPL-софта и его возрождение из пепла даже если разработчики бросили проект. Конечно то что производные работы заставляют то же лицензировать под GPL очень не нравится производителям коммерческого софта и они потому не особо то и хотят участвовать в OpenSource движении.Microsoft кроме того открыто поливает грязью открытый код. 
   Хотя и я уже об этом и говорил, но повторюсь: приучать со школы надо именно к открытым GPL-разработкам, так как они гораздо дешевле государству, либо равны, а часто и лучше своих коммерческих аналогов  по возможностям. Кроме того так как многие открытые программы таят в себе множество возможностей при внимательном изучении и требуют своего изучения, то пользователь приучится читать документацию. 
Теперь посмотрим на это и с другой стороны: государству то же есть немалая выгода в OpenSource, ведь вокруг нужного продукта формируется сообщество, которое может помочь тестированием кодом и т.д. При чем процесс можно вполне контролировать госорганизациям.А реализация научных разработок в рамках открытой модели это и дальновидное решение с точки зрения правительства. Почему? 
1) Открытая форма распространения знаний позволит более эффективно совершенствовать разработку. Если применять GNU/GPL  то и воровать код, чего так боятся, будет невыгодно потому что разработка будет нелегальной и это будет грозить судебными разбирательствами. 
2) Разработка комплекса ПО для исследований с открытым исходным текстом позволит избежать волокиты и высоких затрат для университетов и НИИ страны. Кроме того открытые исходники будучи способствовать более лучшему вовлечению студента в процесс обучения программирования.        
3) Государству и крупным корпорациям будет выгодно распространять часть технологий как открытые стандарты, привязывая тем самым разработчиков к своей инфраструктуре