Пользовательские функции Определение функции имеет вид

advertisement
Пользовательские функции
Определение функции имеет вид
def имя_функции(список аргументов):
Тело функции
Если функция возвращает значение , то последний оператор в теле имеет вид
return найденное_значение. Функция может возвращать несколько значения. Для этого в
команде
return
эти
значения
разделяются
запятой,
а
функция
возвращает
последовательность.
Определение функции предшествует ее использованию. В качестве аргумента можно
передавать список или последовательность, но в развернутом виде. Развертка аргумента
производится помещением * перед аргументом. При этом число элементов в списке
должно совпадать с числом формальных параметров в определении функции.
Наберите текст 1
def fun1(x):
return x**3+1
print 'fun1',fun1(2)
def fun2(a,b):
print 'first arg',a
print 'inside of fun2',fun1(b)
lst=['a',2]
tpl=('c',4)
fun2(*lst)
fun2(*tpl)
Все переменные, определенные внутри функции, локализованы внутри этой функции.
Однако, если переменная определена перед определением функции, вне ее, то к ней
возможен доступ для чтения внутри функции. Для изменения такой переменной внутри
функции, эта переменная должна быть определена внутри функции через модификатор
global
Наберите текст 2
a=3
b=8
def fun(x):
global a
a=a+1
return a+x+b
print fun(-5)
print ‘new a’,a
Сохраните этот файл под именем
ExMod.py
на диске в собственной папке. Он
понадобится позже.
Модули
Наряду со встроенными функциями, часть функций сосредоточена в модулях. Кроме того,
пользователь может создавать собственные модули, содержащие его функции. Для
подключения модуля с именем my_mod, содержащего функцию my_fun, надо вставить
оператор
import my_mod
Обращение к функции производится в форме
my_mod.my_fun(список аргументов)
Если есть уверенность, что функция my_fun присутствует только в одном подключенном
модуле, подключение производят в форме
from my_mod import my_fun
В этом случае обращение к функции производится в форме
my_fun(список аргументов)
Если нужно импортировать все функции из модуля, используют оператор
from my_mod import *
Наберите текст 3
import math
from math import sqrt,tan
pi=math.pi
print 'sin', math.sin(pi*0.5)
print 'sqrt',sqrt(pi)
print 'tan',tan(pi/4)
Если модуль содержит исполняемые операторы, то после импортирования все
исполняемые операции будут выполнены. Откройте в текстовом редакторе файл
ExMod.py. В новом окне наберите текст
Наберите текст 4
import ExMod
print ExMod.fun(3)
Это позволяет предварительно произвести нужные вычисления.
Работа с OpenGL внутри системы Blender
Система Blender позволяет вызывать функции из OpenGL и просматривать результат
работы на экране. Возможности Blender перекрывают основные функции стандартной
системы glut: обработку прерываний от мыши и клавиатуры и перехватывать нажатия
рисованных кнопок.. Основная программа пишется на языке Python с использованием
модулей BGL и Draw. Первый из них содержит функции из OpenGL, а второй позволяет
рисовать кнопки и выводить текст на экран и организует основной цикл для работы в
интерактивном режиме.
Шаблон программы
Модуль Draw
Модуль позволяет создавать объекты в интерактивном режиме. Он предназначен для
создания окон,
с помощью которых осуществляется ввод параметров, кнопок,
управляющих вызовом функций, выводить текст в основное окно. . Модуль содержит
константы, соответствующие нажатию на клавишу. Все они имеют вид: AKEY, BKEY,…,
нажатие на специальные клавиши ESCKEY, -нажатие на цифровую клавишу ONEKEY,….
Клавиши
мыши:
LEFTMOUSE.RIGHTMOUSE,
MIDDLEMOUSE,
функциональные
клавиши и другие. Функции, перехватывающие прерывания от клавиатуры, мыши, и
функции, рисующие на экране, должны быть зарегистрированы. Это делается с помощью
функции Draw.Register(a,b,c). Вызов этой функции стартует основной цикл обработки.
Здесь «а» - имя функции рисования, «в» - имя функции для обработки прерываний от
клавиатуры или мыши, «с» - имя функции для обработки нажатия на нарисованную
кнопку.. Рассмотрим следующий пример
import Blender
from Blender import Draw, BGL
mystring = ""
mymsg = ""
toggle = 0
def event(evt, val):
# эта функция обрабатывает прерывания от клавиатуры и
мыши
global mystring, mymsg
if not val: # val = 0: реакция на отпускание клавиши или кнопки мыши
Если val=1, то это означает, что клавиша или кнопка мыши нажаты
if evt in [Draw.LEFTMOUSE, Draw.MIDDLEMOUSE, Draw.RIGHTMOUSE]:
mymsg = "You released a mouse button."
Draw.Redraw(1) # Вызов Draw.Redraw(1) для вывода сообщения на экран
return
if evt == Draw.ESCKEY:
Draw.Exit()
return
# выход из скрипта
elif Draw.AKEY <= evt <= Draw.ZKEY: mystring += chr(evt)
# это срабатывает при нажатие на символьную клавишу. chr(evt) преобразует
символ клавиши в соответствующий символ
elif evt == Draw.SPACEKEY: mystring += ' '
elif evt == Draw.BACKSPACEKEY and len(mystring):
mystring = mystring[:-1]
else: return # no need to redraw if nothing changed
Draw.Redraw(1)
def button_event(evt): # обработка нажатия на кнопку
global mymsg, toggle
if evt == 1: # значение evt == 1 позволяет выделить нужную кнопку из
множества созданных
mymsg = "You pressed the toggle button."
toggle = 1 - toggle
Draw.Redraw(1)
def gui():
# function drawing in screen
global mystring, mymsg, toggle
if len(mystring) > 90: mystring = ""
BGL.glClearColor(0,0,1,1)
BGL.glClear(BGL.GL_COLOR_BUFFER_BIT)
BGL.glColor3f(1,1,1)
Draw.Toggle("Toggle", 1, 10, 10, 55, 20, toggle,"A toggle button")
# создание кнопки типа Toggle. Значение 1 – уникальный параметр кнопки. Далее
– положение кнопки на экране, значение toggle – текущее значение кнопкинажатое или нет. Последний параметр надпись, когда курсор помещается на
кнопку
BGL.glRasterPos2i(72, 16) # позиция последующего вывода текста
if toggle: toggle_state = "down"
else: toggle_state = "up"
Draw.Text("The toggle button is %s." % toggle_state, "small")# Вывод текста
по формату С. Последний параметр – размер текста
BGL.glRasterPos2i(10, 230)
Draw.Text("Type letters from a to z, ESC to leave.")
BGL.glRasterPos2i(20, 200)
Draw.Text(mystring)
BGL.glColor3f(1,0.4,0.3)
BGL.glRasterPos2i(340, 70)
Draw.Text(mymsg, "tiny")
Draw.Register(gui, event, button_event)
основного цикла
# регистрация функций и начало
Заметим, что все координаты отнесены к левому нижнему углу специального окна для
отображения вывода скриптов
Download