Плагины для VS
— Python
— Code Runner
Установка
https://www.python.org/downloads
Ставим последнюю версию со статусом security
Для 7 винды 3.8.10 — инсталер Windows installer (32-bit) #если не уверен — качай 32 битку
— галку на PATH, Customise inst
— все галки
— все галки, в C:\Python38-32
where.exe python — посмотреть где установлен
Гайд по стилю (рекомендации а не правила)
https://peps.python.org/pep-0008/
Запуск
Можно Open in integrated terminal или Run code
В терминале вводим
Start test.py
или
python test.py
Установка плагинов (после установки перезагружать VC)
pip install graphics.py #установка рисовалки графиков (c:\python38-32\lib\site-packages)
pip list -v #посмотреть список всех плагинов
pip show <package name> #конкретная инфа о плагине
Для распознавания русских символов (сверху кодировку, перед текстом пишем «u» для кодировки в юникоде)
# -*- encoding: utf-8 -*-
import sys
print(sys.version)
print(u'Тест')
input()
raw_input() #в 2.х версии
В запуске через RunCode в 2.х
# -*- encoding: utf-8 -*-
import sys
from imp import reload
reload (sys)
sys.setdefaultencoding("utf8")
print (sys.version)
print (u'Тест')
input()
raw_input() #в 2.х версии
В запуске через RunCode в 3.х (Для Убунты)
# -*- encoding: utf-8 -*-
В VS
Сменить консоль на терминал File — Prefferences — Settings — Extensions — Run code configurations — Run in terminal
Правая кнопка на скрипте — Run code
Внизу справа нажать на кодировку поменять на UTF-8 with BOM
Или просто декодировать ascII
Q = S.encode('utf8')
Декодирование в консоли
os.popen вывод консоли декодирует кодировкой cp1251
консоль Windows по умолчанию работает в кодировке cp866
import os
F = os.popen('dir')
for line in F:
print(line.rstrip().encode('cp1251').decode('cp866'))
Пасхалка
import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly. (Красота лучше чем уродство.)
Explicit is better than implicit. (Явное лучше скрытого.)
Simple is better than complex. (Простое лучше сложного.)
Complex is better than complicated. (Сложное лучше запутанного.)
Flat is better than nested. (Плоское лучше вложенного.)
Sparse is better than dense. (Редкое лучше густого.)
Readability counts. (Читабельность нужна.)
Special cases aren’t special enough to break the rules. (Особые случаи не настолько особые чтобы менять правила.)
Although practicality beats purity. (Так же практичность побеждает чистоту.)
Errors should never pass silently. (Ошибки никогда не должны проходить в тишине.)
Unless explicitly silenced. (Только если не заглушать специально.)
In the face of ambiguity, refuse the temptation to guess. (Столкнувшись с двусмысленностью отказывайся от желания гадать.)
There should be one— and preferably only one —obvious way to do it. (Должен быть один и только один очевидный путь это сделать.)
Although that way may not be obvious at first unless you’re Dutch. (Хотя этот путь может быть не очевиден сначала если только ты не Голандец.) (Monty Python шутка?)
Now is better than never. (Сейчас лучше чем никогда)
Although never is often better than *right* now. (Хотя никогда часто лучше чем прямо сейчас.)
If the implementation is hard to explain, it’s a bad idea. (Если реализацию сложно объяснить, это плохая идея.)
If the implementation is easy to explain, it may be a good idea. (Если реализацию просто объяснить, это возможно хорошая идея.)
Namespaces are one honking great idea — let’s do more of those! (Пространство имён это отличная идея. Давайте делать больше такого.)
Компиляторы в exe (фиксированный двоичный файл)
PyInstaller
Сохранить результаты программы в файл
python ch1.py > save.txt
Перенаправление потока
import sys
sys.stdout.write('hiho bro\n') #то же что и print, но развёрнуто
import sys
sys.stdout = open('log.txt', 'a') #перенаправление прината в файл с добавлением новых данных в новую строку
print('123')
log = open('log.txt', 'a')
print('452342', file = log)
В линуксе
Говорит интерпритатору откуда запускать
which python3 (узнать путь до интерпритатора)
#!/usr/bin/python3
print('The Bright Side ' + 'of Life...')
Чтобы не указывть точный путь
#!/usr/bin/env python3
...здесь находится код сценария...
копируем в usr/local/bin (место откуда линукс запускает исполняемые файлы)
sudo cp brain.py /usr/local/bin
переходим в эту папку
cd /usr/local/bin
сделайте файл скрипта исполняемым
sudo chmod +x brain.py
Если удалить
rm brain.py
Проверить, очистить кеш (где был)
type brain.py
Чтобы убрать расширение — переименовываем
sudo mv brain.py brain
Код для формата чисел
#!python
"""
Файл formats.py
Разнообразные специальные функции для форматирования строк с целью отображения.
Тестирование можно производить с помощью заготовленного текста или аргументов командной строки.
Что сделать: добавить круглые скобки для отрицательных денежных сумм, реализовать больше возможностей.
"""
def commas(N):
"""
Форматирует положительное целое число N для отображения с запятыми, разделяющими группы цифр
"xxx, yyy, zzz".
"""
digits = str(N)
assert digits.isdigit()
result =''
while digits:
digits, last3 = digits[:-3], digits[-3:]
result = (last3 + ','+ result) if result else last3
return result
def monney(N, numwidth = 0, currency ='$'):
"""
Форматирует число N для отображения с запятыми, двумя десятичными цифрами,
ведущим символом $ и знаком, а так же необязательным дополнением:
"$ = xxx, yyy, zz".
numwidth = 0 - отсутствие дополнения пробелами,
currency ='' - опустить символ $
или символ не ASCII для других валют (фунт - u'\xA3' или u'\u00A3').
"""
sign ='-' if N < 0 else ''
N = abs(N)
whole = commas(int(N))
fract = ('%.2f' % N)[-2:]
number = '%s%s.%s' % (sign, whole, fract)
return '%s%*s' % (currency, numwidth, number)
if __name__ == '__main__':
def selftest():
tests = 0, 1 # не проходит -1, 1.23
tests += 12, 123, 1234, 12345, 123456, 1234567
tests += 2 ** 32, 2 ** 100
for test in tests:
print(commas(test))
print('')
tests = 0, 1, -1, 1.23, 1., 1.2, 3.14159
tests += 12.34, 12.344, 12.345, 12.346
tests += 2**32, (2**32 + .2345)
tests += 1.2345, 1.2, 0.2345
tests += -1.2345, -1.2, -0.2345
tests += -(2**32), -(2**32 +.2345)
tests += (2**100), -(2**100)
for test in tests:
print('%s [%s]' % (monney(test, 17), test))
import sys
if len(sys.argv) == 1:
selftest()
else:
print(monney(float(sys.argv[1]), int(sys.argv[2])))
Код для таймера
#Файл timer.py
'''
Любительские инструменты для определения времени выполнения вызовов функций.
Определяют суммарное время, лучшее время и лучшее суммарное время
'''
import time, sys
timer = time.perf_counter() if sys.platform[:3] == 'win' else time.time
def total(reps, func, *pargs, **kargs):
'''
Суммарное время выполнения функции func(), reps раз
Возвращает (суммарное время, последний результат)
'''
repslist = list(range(reps)) #сколько раз запускать функцию, вывести за пределы чтобы не влияло на время (уровнять 3 и 2 версии)
start = time.perf_counter() # или time.process_time()
for i in repslist:
ret = func(*pargs, **kargs) #результат функции
elapsed = time.perf_counter() - start
return (elapsed, ret)
def bestof(reps, func, *pargs, **kargs):
'''
Самая быстрая функция func() среди reps запусков
Возвращает (лучшее время, последний результат)
'''
best = 2 ** 32
for i in range(reps): #сколько раз запускать функцию
start = time.perf_counter()
ret = func(*pargs, **kargs) #результат функции
elapsed = time.perf_counter() - start
if elapsed < best:
best = elapsed
return (best, ret)
def bestoftotal(reps1, reps2, func, *pargs, **kargs):
'''
Лучшее суммарное время:
(лучшее время из reps1 запусков (суммарное время из reps2 запусков func))
'''
return bestof(reps1, total, reps2, func, *pargs, **kargs)
#Файл timer2.py
'''
total(spam, 1, 2, a=3, b=4, _reps=1000) вызывает и хронометрирует spam(1, 2, a=3, b=4)
_reps раз и возвращает суммарное время для всех прогонов с финальным результатом
bestof(spam, 1, 2, a=3, b=4, _reps=5) запускает тест лучшего из N в попытке
избавиться от влияния колебаний загрузки системы и возвращает лучшее время
среди _reps тестов
bestoftotal(spam, 1, 2, a=3, b=4, _reps1=5, reps=1000) запускает тест
лучшего суммарного времени, который берёт лучший из _reps1 прогонов
(суммарного времени reps прогонов)
'''
import time, sys
timer = time.perf_counter() if sys.platform[:3] == 'win' else time.time
def total(func, *pargs, **kargs):
_reps = kargs.pop('_reps', 1000) #сколько передали в _reps или 1000
repslist = list(range(_reps)) #сколько раз запускать функцию, вывести за пределы чтобы не вляло на время (уровнять 3 и 2 версии)
start = time.perf_counter() # или time.process_time()
for i in repslist:
ret = func(*pargs, **kargs) #результат функции
elapsed = time.perf_counter() - start
return (elapsed, ret)
def bestof(func, *pargs, **kargs):
_reps = kargs.pop('_reps', 5)
best = 2 ** 32
for i in range(_reps): #сколько раз запускать функцию
start = time.perf_counter()
ret = func(*pargs, **kargs) #результат функции
elapsed = time.perf_counter() - start
if elapsed < best:
best = elapsed
return (best, ret)
def bestoftotal(func, *pargs, **kargs):
_reps1 = kargs.pop('_reps1', 5)
return min(total(func, *pargs, **kargs) for i in range(_reps1))
Проверка скорости выполнения разных методов для выбора из кодовых альтернатив
# Файл timeseqs.py
'''
Проверка относительной скорости итерационных альтернатив.
'''
import sys, timer
from unittest import result
reps = 10000
replist = list(range(reps))
def forLoop():
res =[]
for x in replist:
res.append(abs(x))
return res
def listComp():
return [abs(x) for x in replist]
def mapCall():
return list(map(abs, replist))
def genExpr():
return list(abs(x) for x in replist)
def genFun():
def gen():
for x in replist:
yield abs(x)
return list(gen())
print(sys.version)
for test in (forLoop, listComp, mapCall, genExpr, genFun):
(bestof, (total, result)) = timer.bestoftotal(5, 1000, test)
print('%-9s: %.5f => [%s...%s]' %
(test.__name__, bestof, result[0], result[-1]))
# Файл timeseqs.py для timer2
'''
Проверка относительной скорости итерационных альтернатив.
'''
import sys, timer2
from unittest import result
reps = 10000
replist = list(range(reps))
def forLoop():
res =[]
for x in replist:
res.append(x + 10)
return res
def listComp():
return [x + 10 for x in replist]
def mapCall():
return list(map((lambda x: x + 10), replist))
def genExpr():
return list(x + 10 for x in replist)
def genFun():
def gen():
for x in replist:
yield x + 10
return list(gen())
print(sys.version)
for test in (forLoop, listComp, mapCall, genExpr, genFun):
(total, result) = timer2.bestoftotal(test, _reps1=5, _reps=1000)
print('%-9s: %.5f => [%s...%s]' %
(test.__name__, total, result[0], result[-1]))
Модуль оценочных испытаний
import timeit
print(min(timeit.repeat(number=1000, repeat=5, stmt="f=open('C:\Python38-32\Lib\pdb.py')\nfor line in f: x=line\nf.close()")))
'''
pybench.py тестирует скорость одной и более версий python
на наборе простых эталонных тестов в виде строк кода.
Функция runner допускает разнообразные операторы в stmts.
Сама система выполняется в python 2.x и 3.x и может
порождать вывод в обеих линейках.
Использует модуль timeit для тестирования либо версии python,
выполняющий этот сценарий, через вызовы API-интерфейса, либо
набора версий python за счёт чтения порожденного вывода командной
строки (os.popen), посредством флага -m интерпретатора python,
позволяющего находить timeit в пути поиска модулей.
Заменяет $listif3 на list в генераторах для Python 3.X и на пустую строку
для Python 2.X, заставляя Python 3.X делать ту же самую работу, что и Python 2.X.
В режиме командной строки многострочные операторы должны разделяться на
отдельные аргументы в кавычках для каждой строки и все символы \t в отступах
должны заменяться четырьмя пробелами ради единообразия.
Предостережения:
Режим командной строки (только) может потерпеть неудачу, если
внутри оператора содержатся двойные кавычки, строка оператора в кавычках
вообще не совместима с командной оболочкой или командная строка превышает предел
длинны в командной оболочке платформы -- применяйте режим вызова API-интерфейса
или любительский таймер; пока не поддерживает оператор настройки:
в том виде, как есть, время всех операторов в stmts учитывается в суммарном времени.
'''
from inspect import trace
import sys, os, timeit
defnum, defrep = 1000, 5
def runner(stmts, pythons=None, tracecmd=False):
'''
Основная логика: запускать тесты на входных списках, режимами использования управляет
вызванный код.
stmts: [(количество?, повторений?, строка-оператора)], заменяет $listif3
в строке оператора
pythons: None = только эта версия python или [(версия-python-3?, путь-к-исполняемому-файлу-Python)]
'''
print (sys.version)
for (number, repeat, stmt) in stmts:
number = number or defnum
repeat = repeat or defrep
if not pythons:
ispy3 = sys.version[0] == '3'
stmt = stmt.replace('$listif3', 'list' if ispy3 else '')
best = min(timeit.repeat(stmt=stmt, number=number, repeat=repeat))
print('%.4f [%r]' % (best, stmt[:70]))
else:
print('-' * 80)
print('[%r]' % stmt)
for (ispy3, python) in pythons:
stmt1 = stmt.replace('$listif3', 'list' if ispy3 else '')
stmt1 = stmt1.replace('\t', '' * 4)
lines = stmt1.split('\n')
args = ' '.join('"%s"' % line for line in lines)
cmd = '%s -m timeit -n %s -r %s %s' % (python, number, repeat, args)
print(python)
if tracecmd: print(cmd)
print('\t' + os.popen(cmd).read().rstrip())
'''
pybench_cases.ру: запускает pybench на наборе версий Python и операторов.
Выбирайте режимы путем редактирования этого сценария либо использования аргументов
командной строки (в sys.argv): например, запускайте C:\python27\python pybench_cases.ру,
чтобы протестировать только одну версию Python из перечисленных в stmts,
pybench_cases.ру -а для тестирования всех версий Python и ру -3 pybench_cases.ру -a -t для
трассировки командных строк.
'''
from inspect import trace
import pybench, sys
pythons = [
(1, 'C:\Python38-32\python'),
(0, 'C:\Python38-32\python')
]
stmts = [
(0, 0, "[x ** 2 for x in range (1000)]"),
(0, 0, "res=[]\nfor x in range (1000): res.append(x ** 2)"),
(0, 0, "$listif3(map(lambda x: x ** 2, range (1000)))"),
(0, 0, "list(x ** 2 for x in range(1000))"),
(0, 0, "s = 'spam' * 2500\nx = [s[i] for i in range(10000)]"),
(0, 0, "s = '?' \nfor i in range (10000): s += '?'"),
]
tracecmd = '-t' in sys.argv
pythons = pythons if '-a' in sys.argv else None
pybench.runner(stmts, pythons, tracecmd)
'''
pybench_cases2.ру: запускает pybench на наборе версий Python и операторов.
Выбирайте режимы путем редактирования этого сценария либо использования аргументов
командной строки (в sys.argv): например, запускайте C:\python27\python pybench_cases.ру,
чтобы протестировать только одну версию Python из перечисленных в stmts,
pybench_cases.ру -а для тестирования всех версий Python и ру -3 pybench_cases.ру -a -t для
трассировки командных строк.
Функции с которыми выигрывает map
'''
from inspect import trace
import pybench, sys
pythons = [
(1, 'C:\Python38-32\python'),
(0, 'C:\Python38-32\python')
]
stmts = [
(0, 0, "[ord(x) for x in 'spam' * 2500]"),
(0, 0, "res=[]\nfor x in 'spam' * 2500: res.append(ord(x))"),
(0, 0, "$listif3(map(ord, 'spam' * 2500))"),
(0, 0, "list(ord(x) for x in 'spam' * 2500)"),
#Множества и словари
(0, 0, "{x ** 2 for x in range(1000)}"),
(0, 0, "s = set()\nfor x in range(1000): s.add(x ** 2)"),
(0, 0, "{x: x ** 2 for x in range(1000)}"),
(0, 0, "d={}\nfor x in range(1000): d[x] = x ** 2"),
#Патологический случай 301030 цифр
(1, 1, "len(str(2**1000000))")
]
tracecmd = '-t' in sys.argv
pythons = pythons if '-a' in sys.argv else None
pybench.runner(stmts, pythons, tracecmd)
Модуль который выводит листинг пространства имен другого модуля
# mydir.py
"""
Модуль который выводит листинг пространства имен другого модуля
"""
from __future__ import print_function
seplen = 60
sepchr = '-'
def listing(module, verbose = True):
sepline = seplen*sepchr
if verbose:
print(sepline)
print('name: ', module.__name__, 'file: ', module.__file__)
print(sepline)
count = 0
for attr in sorted(module.__dict__):
print('%02d %s' % (count, attr), end = ' ')
if attr.startswith('__'):
print('<built-in name>')
else:
print(getattr(module, attr))
count += 1
if verbose:
print(sepline)
print(module.__name__, 'has %d names' % count)
print(sepline)
if __name__ == '__main__':
import mydir
listing(mydir)
Транзитивная перезагрузка модулей
# realodall.py
"""
reloadall.py: транзитивная перезагркзка вложенных модулей.
Вызывайте reload_all с одним и болле объектами импортированных модулей.
"""
import types
from imp import reload
def status(module):
print('reloadig '+ module.__name__)
def tryReload(module):
try:
reload(module)
except:
print('FAILD: %s' % module)
def transitiveReload(module, visited):
if not module in visited:
status(module)
tryReload(module)
visited[module] = True
for attrObj in module.__dict__.values():
if type(attrObj) == types.ModuleType:
transitiveReload(attrObj, visited)
def reloadAll(*args):
visited = {}
for arg in args:
if type(arg) == types.ModuleType:
transitiveReload(arg, visited)
def tester(reloader, modname):
import importlib, sys
if len(sys.argv) > 1: modname = sys.argv[1]
module = importlib.import_module(modname)
reloader(module)
if __name__ == '__main__':
tester(reloadAll, 'reloadall')
# reloadall2.ру
'''
Транзитивная перезагрузка вложенных модулей
(альтернативная версия)
'''
import types
from imp import reload
from reloadall import status, tryReload, tester
def transitiv_reload(objects, visited):
for obj in objects:
if type(obj) == types.ModuleType and obj not in visited:
status(obj)
tryReload(obj)
visited.add(obj)
transitiv_reload(obj.__dict__.values(), visited)
def reload_all(*args):
transitiv_reload(args, set())
if __name__ == '__main__':
tester(reload_all, 'reloadall2')
# reloadall3.ру
'''
Транзитивная перезагрузка вложенных модулей (явный стек)
'''
import types
from imp import reload
from reloadall import status, tryReload, tester
def transitiv_reload(modules, visited):
while modules:
next = modules.pop()
status(next)
tryReload(next)
visited.add(next)
modules.extend(x for x in next.__dict__.values()
if type(x) == types.ModuleType and x not in visited)
def reload_all(*modules):
transitiv_reload(list(modules), set())
if __name__ == '__main__':
tester(reload_all, 'reloadall3')
Уутилиты и инструменты для классов
# classpools.py
'''
Смешанные утилиты и инструменты для классов
'''
class AttrDisplay:
'''
Предоставляет наследуемый метод перегрузки отображения, который показывает
экземпляры с их именами классов и пары имя=значение для каждого атрибута,
сохраненного в самом экземпляре (но не атрибутов, унаследованных от его классов).
Может соединяться с любым классом и будет работать на любом экземпляре.
'''
def gatherAttrs(self):
attrs = []
for key in sorted(self.__dict__):
attrs.append('%s = %s' % (key, getattr(self, key)))
return ', '.join(attrs)
def __repr__(self):
return '[%s: %s]' % (self.__class__.__name__, self.gatherAttrs())
if __name__ == '__main__':
class TopTest(AttrDisplay):
count = 0
def __init__(self):
self.attr1 = TopTest.count
self.attr2 = TopTest.count + 1
TopTest.count += 2
class SudTest(TopTest):
pass
X, Y = TopTest(), SudTest()
print(X)
print(Y)
Нет комментариев.