python (питон)

Описание: Программирование на супер модном мега крутом языке Питон.

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#19 dyvniy » Пн, 2 марта 2015, 22:23:31

compile
http://effbot.org/zone/python-compile.htm
import mymodule

import py_compile
py_compile.compile("mymodule.py")

import compileall
compileall.compile_dir("mylib", force=1)
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#20 dyvniy » Вт, 10 марта 2015, 14:59:55

yield, ленивые вычисления
http://zetblog.ru/programming/201304/python-iterators-generators-yield/
Спойлер
Python: Объяснение работы yield, итераторов и генераторов.
9 Апрель 2013lizzНаписать комментарийК комментариям
Основной источник для этого поста - вопросы и ответы на stackoverflow.

Для понимания что делает "yield", вы должны понимать что такое генераторы. Для понимания что такое генераторы - должны знать об итераторах и итерируемых объектах.


Итерируемые объекты (iterables)
Хочется назвать их неправильным, с точки зрения русского языка, словом "итерабельные" - т.е. те, по которым может происходить итерация. Но, правильнее будет назвать их "итерируемые", хотя лично меня это слово слегка путает.

Когда вы создаёте список (list) вы можете считывать его элементы по одному - это называется итерацией.
>>> lst = [1, 2, 3]

>>> for i in lst:

... print(i)

1

2

3

Lst - итерируемый объект (iterable). Когда вы используете списковые выражения (list comprehensions), вы создаёте список - итерируемый объект:
>>> lst = [x*x for x in xrange(3)]

>>> for i in lst:

... print(i)

0

1

4
Любое объект который вы можете использовать в конструкции "for ... in ..." является итерирумым: списки, строки, файловые объекты и т.п.. Итерирумые объекты достаточно удобны потому что вы можете считывать из них столько данных, сколько вам необходимо, но при этом вы храните все значения последовательности в памяти и это не всегда приемлемо, особенно если вы имеете достаточно большие последовательности.

Генераторы
Генераторы - итерируемые объекты, но, в общем случае, вы можете их использовать только один раз. Это связано с тем, что они не хранят все значения в памяти, а генерируют значения "на лету" - по мере запроса:
>>> generator = (x*x for x in xrange(3))

>>> for i in generator:

... print(i)

0

1

4
Код выглядит почти так же, как и в предыдущем примере, только вместо квадратных скобочек ("[<...>]") были использованы круглые ("(<...>)"). Заметьте, что вы не можете выполнить цикл по generator во второй раз, поскольку ничего в памяти не хранится, попытка пройтись второй раз будет просто проигнорирована, т.к. generator выбросит при первом запросе на получение следующего значения StopIterationError, однако, вы это не заметите, если будете использовать цикл for, это исключение будет перехвачено и интерпретировано как конец цикла). Но вручную это можно проверить:
>>> generator.next()

---------------------------------------------------------------------------

StopIteration Traceback (most recent call last)

in ()

----> 1 generator.next()

StopIteration:

next - это метод для получения следующего значения генератора, если вы его используете не в цикле for.

Yield
Yield - это ключевое слово которое используется так же, как и слово return. Разница в том, что функция при этом начинает возвращать генератор вместо значения.
>>> def generator():

... for i in (1, 2, 3):

... yield i

...

>>> g = generator() # create a generator

>>> print(g)



>>> for i in g:

... print(i)

1

2

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

Для того чтобы до конца освоить оператор yield, вы должны знать, что когда вы вызываете функцию, в теле которой находится yield, выполнение этой функции не происходит. Вместо выполнения, функция вернёт объект-генератор. Выглядит это несколько странно на первый взгляд - функция вызвана, но код не выполнен, но, просто запомните этот факт. Код будет выполнятся при каждой итерации - будь то цикл "for <...> in " или вызов метода .next().

При первом исполнении кода тела функции код будет выполнен с начала и до первого встретившегося оператора yield. После этого будет возвращено первое значение и выполнение тела функции опять приостановлено. Запрос следующего значения у генератора во время итерации заставит код тела функции выполняться дальше (с предыдущего yield’а), пока не встретится следующий yield. Генератор считается "закончившимся" в случае если при очередном исполнении кода тела функции не было встречено ни одного оператора yield.

Управление исполнением генератора
>>> class Bank(object): # создадим банк, который строит банкоматы (ATM)

... crisis = False

... def create_atm(self):

... while not self.crisis:

... yield "$100"

>>> bank = Bank() # когда всё в порядке, банкоматы выдают деньги

>>> atm = bank.create_atm()

>>> print(atm.next())

$100

>>> print(atm.next())

$100

>>> print([atm.next() for cash in range(5)])

['$100', '$100', '$100', '$100', '$100']

>>> bank.crisis = True # пришёл кризис, денег больше нет

>>> print(atm.next())

<type 'exceptions.StopIteration'>

>>> wall_street_atm = bank.create_atm() # это справедливо даже для новых банкоматов

>>> print(wall_street_atm.next())

<type 'exceptions.StopIteration'>

>>> bank.crisis = False # проблема в том, что даже после кризиса в банкоматах нет денег

>>> print(atm.next())

<type 'exceptions.StopIteration'>

>>> new_atm = bank.create_atm() # построим новый банкомат с деньгами

>>> for cash in new_atm:

... print cash

$100

$100

$100

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

Модуль стандартной библиотеки python - itertools
Модуль стандартной библиотеки python itertools содержит специальные функции для создания и работы с итераторами. С помощью этого модуля вы можете: клонировать итератор, объединить в цепочку несколько итераторов, сгруппировать значения вложенных списков в один, использовать версию map/zip на генераторах - imap/izip, на этом список не заканчивается.

Например, давайте вычислим все возможные варианты прихода лошадей в скачках (задача из комбинаторики - перестановки без повторов элементов):
>>> horses = [1, 2, 3]

>>> races = itertools.permutations(horses)

>>> print(list(itertools.permutations(horses)))

[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
Заметьте, что применение list к генератору вычислит все его значения и создаст из них список.

Понимание внутренней механики итерации
Итерация - это процесс подразумевающий итерируемые объекты ("итерабельные", т.е. реализующие метод "__iter__()") и итераторы (реализующие метод "__next__()"). Итерируемые объекты - любые объекты, по которым может проходить итерация. Итераторы - объекты, которые позволяют вам производить итерацию по итерируемым объектам. Шла Саша по шоссе...
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#21 dyvniy » Пн, 16 марта 2015, 11:25:29

Тестирование
http://automated-testing.info/t/avtomaticheskoe-testirovanie-ms-calc-na-python/2321
Спойлер
В данной статье описывается процесс создания автоматического теста простого GUI приложения на примере Microsoft Calc. Целью статьи является описание базовых этапов автоматизации для библиотеки pywinauto языка Python. Статью следует рассматривать как обучающий материал, как пример для автоматизации тестирования Вашего собственного приложения. Условия заведомо упрощены.



Цель теста: проверить правильность сложения и умножения в приложении MS Calc для диапазона целых чисел от -10 до 10.

Платформа: Windows Seven Ultimate 64bit.

Инструменты: Python1 2.7 - 32bit, pywinauto15 0.4.0, SWAPY 0.4.1

Обозначим основные этапы:

Создания кода для автоматических действий.
Написание тела теста с основной проверкой.
Отладка теста.
1. Запись кода автоматических действий
На этом этапе следует определиться что именно нам придется делать с графическим интерфейсом тестируемого приложения и получить рабочий код для этих действий.

Разобьем на под-этапы:

запуск приложения
нажатие на кнопки
чтение результата
Запуск приложения выполним так, как показано в примере к pywinauto:

for op_key, op_funk in OPERATIONS.items():
for a in range(*RANGE):
for b in range(*RANGE):
#clear all
Click('C')

#enter a
type_number(a)

#enter operation
Click(op_key)

#enter b
type_number(b)

#compute
Click('=')

#read result
result = window['Static4'].Texts()[0]

#check result
if int(result) == op_funk(a, b):
print REPORT %(a, op_key, b, result, 'OK')
else:
print REPORT %(a, op_key, b, result, 'ERROR')
exit(1)


Первый же запуск теста на ограниченном диапазоне выявил ошибку:


def type_number(num):
'''
click all digit of a number
'''
is_negative = num &lt; 0
str_num = str(num)
if is_negative:
map(Click, list(str_num[1:]))
Click('+-')
else:
map(Click, list(str_num))


Привожу полный код теста:





import pywinauto
import operator

#key codes
BUTTONS = {'MC': 122, 'MR': 123, 'MS': 124, 'M+': 125, 'M-' : 126,\
'&lt;' : 83, 'CE': 82, 'C' : 81, '+-': 80, 'sqr': 110,\
'7' : 137, '8' : 138, '9' : 139, '/' : 91, '%' : 118,\
'4' : 134, '5' : 135, '6' : 136, '*' : 92, '1/x': 114,\
'1' : 131, '2' : 132, '3' : 133, '-' : 94, '=' : 121,\
'0' : 130, ',' : 84, '+' : 93}

#math operations
OPERATIONS = {'+' : operator.add,\
'*' : operator.mul,}

#num ranges
RANGE = (-10, 10 +1)

#report format
REPORT = '%s%s%s=%s - %s'

def Click(key):
'''
Make a click on a key
'''
c_handle = pywinauto.findwindows.find_window(parent=window.handle, control_id=BUTTONS[key], top_level_only=False)
control = app.window_(handle=c_handle)
control.Click()

def type_number(num):
'''
click all digit of a number
'''
is_negative = num &lt; 0
str_num = str(num)
if is_negative:
map(Click, list(str_num[1:]))
Click('+-')
else:
map(Click, list(str_num))

#start ms calc
app = pywinauto.application.Application()
app.Start_('calc')
window = app.top_window_()

for op_key, op_funk in OPERATIONS.items():
for a in range(*RANGE):
for b in range(*RANGE):
#clear all
Click('C')

#enter a
type_number(a)

#enter operation
Click(op_key)

#enter b
type_number(b)

#compute
Click('=')

#read result
result = window['Static4'].Texts()[0]

#check result
if int(result) == op_funk(a, b):
print REPORT %(a, op_key, b, result, 'OK')
else:
print REPORT %(a, op_key, b, result, 'ERROR')
exit(1)




15


создано
polusok13 июня, 2012
последнее сообщение
arturk24 авг, 2013 2
сообщения
416
просм.
2
пользователи
1
нрав.
4
ссылки
Автоматизация Windows GUI приложений на Python
arturk
arturkat.info starапр 2013
Статья хорошая для начинающих, даже отличная. Но для себя в ней нашел решение проблеммы - шаблон REPORT задали вначале, а потом использовали подстановку. Я в свом коде этого не сделал, ругалось почему-то, но теперь знаю что это возможно. Так что теперь свой сорс автотеста уменьшу раз эдак в 10. Спасибо автору.
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#22 dyvniy » Чт, 19 марта 2015, 15:14:58

Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#23 dyvniy » Пт, 20 марта 2015, 15:26:15

Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#24 dyvniy » Пт, 20 марта 2015, 17:02:37

Изображение


Название раздела: Python
Описание: Программирование на супер модном мега крутом языке Питон.

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения
:) ;) :hihi: :P :hah: :haha: :angel: :( :st: :_( :cool: 8-| :beee: :ham: :rrr: :grr: :* :secret: :stupid: :music: Ещё смайлики…
   

Вернуться в «Python»

Кто сейчас на форуме (по активности за 15 минут)

Сейчас этот раздел просматривают: 3 гостя