Показаны сообщения с ярлыком python. Показать все сообщения
Показаны сообщения с ярлыком python. Показать все сообщения

воскресенье, 9 июля 2017 г.

Сравнить величину с двумя значениями

В python обычную операцию сравнения значения с двумя числами можно сделать красивее.


Задача
Есть переменная a. Напишите метод, который возвращает True, если значение a больше 0 и меньше 100. Иначе метод должен возвращать False.

Решение 1:
def is_in_interval(a):
    return (0 < a) and (a < 100)

В python это сравнение можно сделать элегантнее:

Решение 2:
def is_in_interval(a):
    return 0 < a < 100

понедельник, 21 сентября 2015 г.

Python: как извлечь содержимое html-тега

В этом уроке мы посмотрим, как в Python можно извлечь содержимое тега html-страницы.

Сделаем мы это при помощи регулярого выражения с использованием метода re.findall:
import re
html = '''
<html>
  <head>
    <title>Page</title>
  </head>
  <body>
    <h1>Hello</h1>
    <p>Nice to see you!</p>
  </body>
</html>
'''

re.findall(r'<body.*?>(.*)</body>', text, re.DOTALL)
# Результат: ['\n<h1>Hello</h1>\n<p>Nice to see you!</p>\n']

Флаг re.DOTALL говорит Python-у, что под символом "." в регулярном выражении нужно подразумевать любой символ, включая перенос строки. Без этого флага Python будет считать, что под символом "." подразумевается все, кроме переноса строки.

 

пятница, 5 декабря 2014 г.

PGQ очередь с одним consumer и producer

Установим pgq:
$ sudo pip install pgqueue

Установим pgq-расширение для PostgreSQL:
$ sudo apt-get install postgresql-9.2-pgq3

После этого нужно через консоль подсоединиться к БД и выполнить команду на создание расширения pgq:
my_db=# CREATE EXTENSION IF NOT EXISTS pgq;

Теперь нужно запустить процесс ticker. Если это не сделать, то события будут добавляться в очередь, но не будут отправляться консьюмерам, что приведет к быстрому росту очереди.

Запустим простую питоновскую реализацию ticker:
python -m pgqueue 'host=127.0.0.1 port=5432 user=postgres password=123 dbname=johny'

Создадим скрипт consumer.py:
# encoding: utf-8
import psycopg2
import pgqueue

conn = psycopg2.connect("dbname=johny user=postgres password=123 host=localhost")
conn.autocommit = True
cursor = conn.cursor()

consum_q = pgqueue.Consumer('first_queue', 'consumer_one')
consum_q.register(cursor)

# Получаем события из очереди
conn.autocommit = False
for event in consum_q.next_events(cursor, commit=True):
    print(event)


При запуске этого скрипта события буду забираться из очереди. Но там пока нет событий. Чтобы они там появились, создадим файл publisher.py:
# encoding: utf-8
import psycopg2
import pgqueue

conn = psycopg2.connect("dbname=johny user=postgres password=123 host=localhost")
conn.autocommit = True
cursor = conn.cursor()

# Инициируем очередь
first_q = pgqueue.Queue('first_queue')
first_q.create(cursor, ticker_max_lag='4 seconds')

# Добавляем события в очередь
first_q.insert_event(cursor, 'greeting', 'How are you?')
first_q.insert_event(cursor, 'question', 'What are you doing?')

Чтобы события появились в очереди, запустим скрипт publisher.py:
$ python publisher.py

Теперь попробуем прочитать эти события из очереди, запустив consumer.py:
$ python consumer.py  

Если ответ не пришел, нужно убедиться, что процесс ticker запущен.

вторник, 25 ноября 2014 г.

Дизассемблировать python-программу

Порой бывает интересно, что происходит "под капотом" вашей программы. В python есть замечательный модуль dis, который позволяет посмотреть, как интерпретатор выполняет ваш код.

Создадим файл app.py:
import dis

n = 0

def application(env, start_response):
    global n
    n = n + 1
    response = "%.6d" % n
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return [response]

if '__main__' == __name__:
    print(dis.dis(application))
А теперь в терминале запустите этот файл:
$ python app.py

Программа выведет следующее:
  7           0 LOAD_GLOBAL              0 (n)
              3 LOAD_CONST               1 (1)
              6 BINARY_ADD         
              7 STORE_GLOBAL             0 (n)

  8          10 LOAD_CONST               2 ('%.6d')
             13 LOAD_GLOBAL              0 (n)
             16 BINARY_MODULO      
             17 STORE_FAST               2 (response)

 10          20 LOAD_FAST                1 (start_response)
             23 LOAD_CONST               3 ('200 OK')
             26 LOAD_CONST               6 (('Content-Type', 'text/plain'))
             29 BUILD_LIST               1
             32 CALL_FUNCTION            2
             35 POP_TOP            

 11          36 LOAD_FAST                2 (response)
             39 BUILD_LIST               1
             42 RETURN_VALUE       

Слева приведены строки нашей программы. Здесь видно, что операция инкремента переменной n (строка 7) занимает 4 операции.

среда, 7 мая 2014 г.

Аналог var_dump() в python

Как ни крути, а var_dump() в php очень удобен и интуитивно понятен.
К сожалению, такой простой конструкции в python нет, но ее можно примерно повторить, если сделать следующее:
from inspect import getmembers
from pprint import pprint
pprint(getmembers(yourObject))

понедельник, 17 февраля 2014 г.

Простой web-сервер на python

Создать простой веб-сервер на python несложно. Для этого нам понадобится сокеты (sockets).
Но прежде нужно определить, что мы хотим получить в результате.
А хотим мы получить простую программу на python, которая будет прослушивать какой-то порт нашего локального компьютера и принимать запросы от браузера.
1. Создадим файл my_server.py:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket
import time

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 8080))
serversocket.listen(5)
print 'Server is waiting for connections.'
while True:
    conn, addr = serversocket.accept()
    data = conn.recv(1024)
    
    print 'Connection:', addr
    print '------------------------------'
    print "Request Data from Browser"
    print '------------------------------'
    print data
    
    conn.send(data)
    conn.close()
    # Делаем задержку, чтобы цикл не сильно загружал процессор
    time.sleep(0.1)

2. А теперь запустим этот файл в консоли Windows cmd.exe. Для этого вам нужно открыть командную строку Windows, указать путь к файлу my_server.py и нажать Enter.
Так мы запустили сервер, который ожидает запросы на адрес http://127.0.0.1:8080.

3. Запустим браузер, к примеру Internet Explorer, и перейдем по адресу  http://127.0.0.1:8080/test. В результате в браузере и консоли мы увидим следующее:



 Таким образом, в переменной data нашего скрипта хранится информация о странице, которую пользователь запрашивает. Мы можем дописать код, и сервер будет возвращать в зависимости от запроса контент той или иной html-страницы, хранящейся на сервере.
Далее можно будет сделать так, чтобы содержимое html-страницы строилось на основе данных, хранящихся в базе данных, к примеру, mysql. Однако это тема отдельных постов.

понедельник, 30 декабря 2013 г.

Альтернатива PIL (Python Image Library)

В последнее время у меня стали возникать проблемы с PIL при разработке под Windows. Как только в django я создаю модель с ImageField, возникает ошибка:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xed in position 20: ordinal not in range(128)

Вникать в суть проблемы не стал, вместо PIL установил пакет Pillow.
После установки Pillow под Windows 7 приведенная выше ошибка исчезла и я, наконец, смог создать модель, содержащую ImageField.

среда, 18 декабря 2013 г.

Минификация javascript файлов на python

Одним из методов увеличения скорости загрузки страницы является минификация javascript-файлов, при которой из файла удаляются комментарии, пробелы, переносы строк.
На python есть модуль jsmin, легко позволяющий сделать это. Скачайте этот модуль и достаньте из архива папку jsmin с кодом модуля.

воскресенье, 10 ноября 2013 г.

Изучаем Python на конкретном примере

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


пятница, 27 сентября 2013 г.

Получить json из файла в кодировке utf-8

Если ваш json файл имеет корректный json и вы по-прежнему получаете ошибку "ValueError: No JSON object could be decoded", то, возможно, проблема в кодировке.

1. Создайте файл my_json.txt:
{
    "banks":
    [
        {
            "name": "Trust Bank",
            "atms": 
            [
                {
                    "longitude": "40.1222",
                    "latitude": "22.1222"
                }
                ,
                {
                    "longitude": "42.1222",
                    "latitude": "33.1222"
                }
            ]
        }
        ,
        {
            "name": "Invest Bank",
            "atms": [
                {
                    "longitude": "40.1222",
                    "latitude": "22.1222"
                }
            ]
        }
    ]
}


2. Переведите файл в кодировку utf-8. Если вы используете notepad++, то сделать это можно через меню "Кодировки" > "Преобразовать в UTF-8".
3. Наша задача - получить данные из этого файла, содержащего данные в формате json. В той же директории создадим файл import_json.py:
#-*- coding:utf-8 -*-

import json

json_file = open('my_json.txt')

# Вот эта строка решает проблему с кодировкой
content = json_file.read().decode("utf-8-sig")

data = json.loads(content)

for key in data:
    banks = data[key]
    for bank in banks:
        print bank['name']


4. Запустим файл import_json.py. Программа выведет:
Trust Bank
Invest Bank

В переменной data у нас будет словарь, содержащий данные из файла. Получение данных из json-файла в кодировке utf-8 прошло успешно, т.к. мы сказали python-у, что файл имеет эту кодировку.

пятница, 20 сентября 2013 г.

Вывести список чисел Фибоначчи и проверить unittest-ом

Задача. Напишите функцию, которая принимает на вход индекс числа в ряде Фибоначчи (0, 1, 1, 2, 3, 5, 8, 13, 21, ... - последующее число равно сумме двух предыдущих), а выводит список чисел этого ряда с 0 до указанного индекса включительно.
Пример:
get_fibonacci_list(0) вернет [0]
get_fibonacci_list(1) вернет [0, 1]
get_fibonacci_list(3) вернет [0, 1, 1, 2]

четверг, 16 мая 2013 г.

Декораторы в python

Взгляните на этот чудо-код с декоратором @amazed:
def amazed(func):
    def wrap():
        return func() + 'aaa!'

    return wrap

@amazed  
def hey():
    return 'hey'

print hey() # 'heyaaa!'
Эта запись позволяет заменить следующий код:
def amazed(func):
    # определяем функцию-обертку
    def wrap():
        # выполняем переданную функцию - func(). 
        # К результату подсоединяем строку 'aaa!'
        return func() + 'aaa!'
    # возвращаем объект функции wrap
    return wrap
    
def hey():
    return 'hey'
  
hey = amazed(hey)   

print hey()
Таким образом, декоратор @amazed позволил нам, не тронув кода функции hey(), изменить ее поведение и сделать так, чтобы к слову 'hey' добавлялась строка 'aaa!'

Зачем в python обрабатывать ошибки?

Все познается из практики. Будет ли показано 'hello':
def shout(word=u'yes'):
    return word.capitalize()+'!'
    
scream = shout

del shout
print shout()
print 'Hello'
Переменную shout мы удалили, поэтому будет ошибка. Выполнение скрипта остановится, слово 'hello' показано не будет.
Но в python есть блок try/catch/finally, который позволяет обработать ошибку и дать скрипту шанс выполняться дальше.
def shout(word=u'yes'):
    return word.capitalize()+'!'
    
scream = shout

del shout

# Мы заранее предвидим, что функцию
# shout() мог удалить какой-то касатик
try:
    print shout()
except NameError, e:
    print e
print 'Hello'
В этом случае будет выведено:
name 'shout' is not defined
Hello