Пользовательские функции Определение функции имеет вид 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) основного цикла # регистрация функций и начало Заметим, что все координаты отнесены к левому нижнему углу специального окна для отображения вывода скриптов