Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> ВИДЕОКУРС Python Разработчик

Best Practice по решению прикладных задач и освоению инструментов, применяемых при разработке, веб-приложений.

>> ОНЛАЙН ТЕСТ Сможешь обучить робота?

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

Общие вопросы

Подписаться на эту рубрику по RSS

Разные вопросы и ответы которые волнуют начинающих Python 3 программистов

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход. Python поддерживает множественное наследование, переопределение инфиксных операторов, причем можно переопределить операцию как для левого операнда, так и для правого; в версии 2.1 есть полное переопределение операторов сравнения (механизм rich comparison для объектов, поддерживающих частичное упорядочивание, например, матриц).

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

Из современных языков Python можно сравнить в первую очередь с Java и Perl. Python выполняет все обещания, которые дала, но не выполнила Java. Python очень хорошо переносим. Он работает на всех платформах, на которых есть Java, и еще на многих. Мало найдется таких платформ, на которые Python не перенесен. Я не говорю про UNIX и Windows, конечно - с точки зрения переносимости куда интереснее такие платформы как Mac, Amiga, Palm, RiscOS, AS/400 и многие другие. Для особых любителей Java есть Jython. Он состоит из двух частей: во-первых, это интерпретатор Pyhon, написанный на Java, а во-вторых это компилятор Python в байт-код Java. В сравнении с Perl - Python как язык ему совершенно равномощен, но избавлен от великого множества неприятностей и неудобств, присущих Perl. Python обладает богатой стандартной библиотекой, плюс великим множеством модулей, доступных в Интернете. Для пользователей Windows есть пакет win32, из которого доступны практически все функции Windows API, DDE, COM.

Далее...

При сборе статистики посещения web-страниц часто собирается информация о количестве посетителей из разных стран. Как правило, страну определяют по домену первого уровня. Но такая информация не всегда соответствует действительности, особенное учитывая нынешнюю тендецию использовать национальные домены co, tv не по назначению. Кроме того, как быть с доменами общего пользования net, org, com и др.? С IP-адресами, для которых нет записей в реверсной зоне? Ну и, наконец, определение доменного имени отнимает заметное количество времени.

Приведенный в статье код распространяется под лицензией в стиле Python, то есть может быть использован для любых (в том числе коммерческих целей) при условии сохранения замечания об авторском праве Copyright © 2002, Denis S. Otkidach .

Данные о регистрации диаппазонов IP-адресов хранятся в базах данных whois. Чтобы предоставить возможность общественности анализировать трафик, RIPE NCC, ARIN и APNIC не реже, чем раз в месяц, делают сокращенные "снимки" своих баз данных. Именно из этих данных мы и составим локальную базу.

Но сначала нужно эффективно оргазовать хранение данных для диаппазонов IP-адресов, чтобы обеспечить к ним быстрый доступ. За основу возмем BTree базу BerkleyDB, доступ к которой обеспечивает функция btopen() из стандартного модуля bsddb. В качестве ключей будем использовать начало диаппазона IP-адресов, а в качестве значений — его конец и дополнительную информацию. Ключи и значения в bsddb должны быть строками. Кроме того, необходимо обеспечить упорядоченность ключей. Для этого очень хорошо подходит функции inet_aton и inet_ntoa из модуля socket.

Далее...

Remote debugging: PyCharm, pydev, rsync, django, postgisВ своей работе я использую PyCharm — отличную среду разработки, которая много всего умеет, упрощает рутину(чем сильно повышает продуктивность разработчика) и вообще не заменима для Django-devелоперов.

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

  • На рабочей машине(Mac) разрабатываю под PyCharm
  • В PyCharm как правило постоянно включена удаленная отладка.
  • Для работы удаленной отладки в код проекта, необходимо внести 2 строки кода для запуска отладки и положить 1 файл, доступный в python-path.
  • После внесения изменений в код, я на рабочей машине запускаю скрипт, который закачиваюет изменения на сервер с помощью rsync и перезагружает сервер проекта.

Про настройку удаленной отладки в PyCharm

В директорию проекта нужно положить файл из директории PyCharm под названием: pycharm-debug.egg. В Django-проекте я нахожу то место, которое мне нужно отладить и в начале отлаживамого def’а(например) ставлю следующий код:

sys.path.append(‘/home/webmail/src/pycharm-debug.egg’)
from pydev import pydevd
pydevd.settrace(’213.180.204.11′, port=32456, stdoutToServer=True, stderrToServer=True)
IP адрес и порт – это те по которым внешний сервер будет стучаться для того, чтобы найти запущенный PyCharm, которому он выдаваст отладочную информацию. Адрес Необходимо, настроить NAT, чтобы такие запросы попадали на машину разработчика.

Так как я на сервере не использую Django Development Server, а вместо него — nginx+uwsgi, то в параметрах запуска uwsgi я указал 1 процесс. Иначе будут сложности с отладкой, из-за нескольких попыток подключиться к моему компьютеру.

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

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

Далее...

Поднятие объектно-ориентированного программирования на новый уровень

Большинство читателей уже знакомо с концепциями объектно-ориентированного программирования: наследованием, инкапсуляцией, полиморфизмом. Но создание объектов заданного класса с определенными родителями обычно представляется исходно заданной операцией. Оказывается, что ряд новых программных конструкций становится либо более простым, либо вообще хоть сколько-нибудь возможным, если вы можете настраивать процесс создания объектов. Метаклассы разрешают определенные типы "аспектно-ориентированного программирования"; например, можно усилить классы такими характеристиками, как возможности трассировки, объектная персистентность, регистрация исключений и так далее.

Краткий обзор объектно-ориентированного программирования (ООП)

Давайте, потратив полминуты, вспомним, что такое ООП. В языке объектно-ориентированного программирования можно определять классы, задача которых - объединить связанные данные и поведение. Эти классы могут наследовать некоторые или все свойства своих родителей, они также определяют свои собственные атрибуты (данные) или методы (поведение). В результате, классы, как правило, выступают в качестве шаблонов для создания экземпляров (которые время от времени называют просто объектами). Различные экземпляры одного и того же класса обычно имеют разные данные, хотя они будут представлены в одинаковом виде, например, у обоих объектов класса 'Employee' bob и jane есть .salary и .room_number, но значения room (комната) и salary (жалование) у каждого различны.

Яндекс.ДиректВсе объявленияЯ хочу лучше фотографировать! Запишись на бесплатный онлайн-семинар по фотографии и секретам мастерства! webinar.disted.ru

Некоторые объектно-ориентированные языки программирования, включая Python, предусматривают интроспективные (или рефлексивные) объекты. Другими словами, интроспективный объект может сам себя описывать: к какому классу принадлежит этот экземпляр? Кто предки этого класса? Какие методы и атрибуты доступны объекту? Интроспекция позволяет функции или методу, управляющему объектами, принимать решения, основываясь на том, какой вид объекта передается. Даже без интроспекции функции часто ветвятся, опираясь на данные экземпляра - например, маршрут к jane.room_number отличается от пути к bob.room_number, поскольку они в "различных комнатах" (значения room у них различны). С помощью интроспекции также можно безошибочно вычислить bonus (премиальные) jane, пропустив это вычисление для bob, например, потому что у jane есть атрибут .profit_share или из-за того, что bob является экземпляром производного класса Hourly(Employee).

"Метапрограммный" ответ

Базовая система ООП, очерченная выше, является достаточно мощной. Однако, в этом описании один момент не получил должного внимания: в Python (и других языках) сами классы являются объектами, которые можно передавать и подвергать интроспекции. Но поскольку объекты, как отмечалось, создаются с использованием классов в качестве шаблонов, то что же является шаблоном для создания классов? Разумеется, метаклассы.

В Python всегда были метаклассы. Однако, технология, задействованная в метаклассах, стала гораздо более очевидной с выходом Python 2.2. А именно, в версии 2.2 Python перестал быть языком только с одним специальным (обычно невидимым) метаклассом, который создавал каждый объект класса. Теперь программисты могут наследоваться от встроенного метакласса type и даже динамически генерировать классы с различными метаклассами. Разумеется, только то, что вы можете манипулировать метаклассами на Python 2.2, еще не объясняет, зачем вам это.

Более того, вам не нужно использовать метаклассы, определенные пользователем, чтобы управлять созданием классов. Несколько менее головоломная концепция - фабрика классов (class factory): обыкновенная функция может возвращать класс, который был динамически создан в пределах тела функции. В традиционном синтаксисе Python вы можете написать: Далее...

Ссылки на изменяемые объекты долго живут К изменяемым объектам в Python относятся списки, словари и объекты наследуемые от базового класса object. Будьте крайне внимательны при написании программ, помните что связь на изменяемый объект сохраняется всегда.

class M(object):
    def __init__(self, data):
        self.__data = data
    def data(self):
        return self.__data
init_data = ['php']
m = M(init_data)
print m.data() # ['php']
init_data.append('python')
# объекты init_data и M.__data ссылаются на один и тот же объект
print init_data # ['php', 'python']
print m.data() # ['php', 'python']
data = m.data()
print data # ['php', 'python']
data.append('ruby')
# теперь уже 3 объекта ссылаются на одну и ту же переменную
print data # ['php', 'python', 'ruby']
print init_data # ['php', 'python', 'ruby']
print m.data() # ['php', 'python', 'ruby']

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

M = lambda data: data
init_data = ['php']
m = M(init_data)
m.append('python')
print m # ['php', 'python']
print init_data # ['php', 'python']
print m is init_data # True

Будьте внимательны при написании программ, иногда необходимо чтобы метод класса или функция вернули новый объект, а не ссылку. Создать новый объект например из списка можно - list(lst), из словаря dict(). В остальных случаях поможет модуль copy.Далее...

Декораторы функций в Python

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

class A:
    @staticmethod # декоратор в Python для создания статических методов
    def summ(x,y):
        return x+y
a = A.summ(6,7)
print a
# 13
class B: # альтернативная реализация класса А
    def summ(x,y):
        return x+y
    summ = staticmethod(summ)
b = B.summ(6,7)
print b
# 13
class Counter: # класс как декоратор
    def __init__(self, func): # принимаем в качестве параметра декорируемую функцию
        self.func = func # запоминаем декорируемую функцию
        self.calls = 0
    def __call__(self, *args): # вызов декоратора, *args - аргументы декорируемой функции
        self.calls += 1
        if self.calls >= 3:
            print "function summ call %s" % (self.calls,) # если функция summ была запущена 3 или больше раз
        return self.func(*args)
@Counter
def summ(a,b,c):
    return a+b+c
print summ(5,9,2)
print summ(1,7,2)
print summ(4,9,3)
# 16
# 10
# function summ call 3
# 16
Далее...

Работа с файлами в Python

Файл - области постоянной памяти в вашем компьютере, которыми управляет операционная система. Объект файла создает функция open или file.

При работе с файлами используется буферизация и она включена по умолчанию. При буферизации данные не записываются в файл непосредственно при вызове метода записи. Они записываются, когда все действия с файлом прекращены или вызвана функция close().

f1 = open("test") # по умолчанию файл открывается в режиме r(чтение)
f2 = open("test", "w") # файл открывается для записи
f2 = open("test", "w", 0) # отключает буферизацию, данные сразу записываются в файл (например при вызове метода write())
f3 = open("test", "a") # файл открывается для записи в конец
f4 = open("test", "a+") # файл открывается как для чтения так и для записи в конец
f5 = open("test", "ab") # добавляя к режиму символ "b" мы можем работать с файлам как с двоичными данными(интерпритация символа новой строки отключена)
xfile = open("test.txt")
xString = xfile.read() # прочитать весь файл в строку
xString = xfile.read(N) # прочитать N-байтов в строку
xString = xfile.readline() # прочитать текстовую строку включая символ конца строки
xList = xfile.readlines() # прочитать весь файл целиком в список строк
xfile.write(xString) # записать строку в файл
xfile.writelines(xList) # записать строки из списка в файл
xfile.close() # закрытие файла в ручную (выполняется по окончанию работы с файлом)
xfile.flush() # выталкивает выходные буферы на диск, файл остается открытым
xfile.seek(N) # изменяет текущую позицию в файле для следующей операции, смещая ее на N-байтов от начала файла
Пример скрипта который сам создает файлы Python c баш-строкой.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
myfile = open("newfile.py", "w")
myfile.write("#!/usr/bin/env python\n# -*- coding: utf-8 -*-")
myfile.close()
Скачать и сохранить файл, используя Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
url = "http://www.google.ru/index.html"
import urllib
webFile = urllib.urlopen(url)
localFile = open(url.split('/')[-1], 'wb')
localFile.write(webFile.read())
webFile.close()
localFile.close()
Далее...

Работа со строками в Python

В общем говоря над строками нельзя производить такие же действия, что и с числами. Но оператор + работает с текстом и означает сцепление строк.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def primer_3(): # Объявление функции primer_2()
    a='Я'
    b=' программирую на языке'
    f=' Python'
    print (a+b+f+' :)') 
            # сцепляем строковые переменные a, 
         # b, f и 'текст' :)
def main():
    primer_3()
    return 0
 
if __name__ == '__main__':
    main()
Оператор * тоже можно использовать, но при условии, что одним из операндов будет целое число. данный оператор символизирует операцию повторения строки. Пример:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def primer_4(): # Объявление функции primer_4()
    a='Я'
    b=' программирую на языке'
    f=' Python \n' # специальный символ \n
                # означает переход на следующую
                # строку
    g=a+b+f
    print (g * 3) 
               # распечатывам значение
            # переменной g 3 раза
def main():
    primer_4()
    return 0
 
if __name__ == '__main__':
    main()
Здесь будут описаны особенности, расширенные возможности.Далее...

Встроенный Django сервер тормозит на Windows 7

Столкнулся с такой вот проблемой, что встроенный сервер Django очень долго обрабатывает запросы в операционной системе Windows 7. Ситуация примерно такая. Запускаем сервер:
python ./manage.py runserver 127.0.0.1:3333
Заходим на сайт:
http://localhost:3333/
После этого получаем контент только после долгой задержки, что не очень приятно в процессе активной разработки или тестирования сайта. Оказывается, проблема возникает из-за, кто бы подумал, IPv6, так как понятие localhost в контексте наличия разных протоколов уже не такое однозначное. Поэтому делаем 2 шага:
1. Раскомментируем строчки (у кого они не раскомментированы в C:/Windows/System32/drivers/etc/hosts)
127.0.0.1 localhost
#::1 localhost
2. Заходим на сайт не через localhost, а по 127.0.0.1.
Вы любите смотреть фильмы онлайн? Советуем вам топ онлайн кино 2012. Удачного вам просмотра фильмов.

Разработка компьютерной программыРазработка компьютерной программы.

1. Введение

2. Выбор создаваемой программы

3. Написание технического задания

4. Разработка программы

5. Создание справочной системы

6. Тестирование программы

7. Создание установочного пакета и выпуск программы

8. Обновление и улучшение программы.

1. Введение

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

В наше время все изменилось, компьютеры работают быстро, а вот программы не очень. Почему же так? Да все просто, в далекие прошлые временна программы разрабатывались профессионалами своего дела, а сейчас разработать программу может любой желающий. Не каждый начинающий разработчик может, создавать программу нормально, учесть все нюансы ее работы, впоследствии чего программа работает нестабильно. Данная статья покажет ту небольшую часть, которую должен пройти каждый разработчик, создавая компьютерную программу.Далее...