Introdução ao Python scripting
Outubro 28th, 2008 por Brutto AVT
Para aqueles que não tem habilidade nenhuma em programação, recomendo a leitura destes tutoriais antes de começar a aprender Python:
Introdução à programação
Criando um jogo da velha para console
Python é uma linguagem de programação interpretada e de alto nível, o que significa que por ser interpretada, ela não gera arquivos executáveis (extensão “.exe”), então para rodar um programa em Python, você precisa do interpretador de comandos do Python para isso. Uma linguagem de alto nível é aquela que permite que se programe usando uma linguagem próxima à natural (humana), ou seja, longe da linguagem de máquina (opcode) como acontece na linguagem Assembly, que é considerada a mais próxima à linguagem de máquina e que permite o que chamo de “programação para processador.”
Tendo isso em mente, é desejável que você saiba no mínimo lógica de programação, o que pode ser aprendido no meu tutorial de programação que recomendo que leia agora, bem como o tutorial do jogo da velha.
Partindo do princípio de que você leu os tutoriais que mencionei e os compreendeu, vamos ao que interessa: programação em Python. Vamos agora criar uma calculadora simples:
a = float(raw_input("Informe o primeiro valor: "))
b = float(raw_input("Informe o segundo valor: "))
op = 0
while not op in range(1, 4):
print "Escolha a operação: "
print "1- Adição\n2-Subtração\n3-Multiplicação\n4-Divisão"
op = int(raw_input())
if op == 1:
print "Resultado: " + str(a + b)
elif op == 2:
print "Resultado: " + str(a - b)
elif op == 3:
print "Resultado: " + str(a * b)
elif op == 4:
print "Resultado: " + str(a / b)
else:
print "Por favor, informe um número de 1 a 4"
Aqui temos algumas coisas que ainda não vimos, como exemplo a primeira linha. Vamos começar de dentro para fora, a função raw_input(mensagem) serve para que o usuário faça uma entrada de teclado no console, essa função retorna uma string, que é convertida para um valor real com um casting (float(valor)), finalmente o resultado da conversão é guardada na variável a.
A palavra-chave not serve para inverter uma sentença. Nesse caso, verificamos se a variável op não está no intervalo de 1 a 4.
Em Python, a impressão de strings e variáveis só é possível quando essas variáveis também são strings, por isso a conversão.
O que nossa calculadora faz é basicamente ler duas strings do teclado, converte-las em números reais, depois mostrar uma mensagem com as opções de operações disponíveis e pedir que o usuário escolha uma das operações. Caso ele escolha uma operação não suportada, irá receber uma mensagem e ser convidado a escolher outra opção.
Simples, não é? Você deve ter percebido que os blocos em Python são diferentes das demais linguagens. Realmente, em Python, um bloco é definido da seguinte maneira:
if a == b:
print “os números são iguais”
A estrutura de um bloco é a seguinte: usa-se dois pontos (‘:’) para marcar seu início e uma tabulação (‘ ‘) antes dos comandos contidos nele. Quando o interpretador encontra uma instrução com tabulação menor à anterior, o bloco é dado como terminado. Em programação, isso chama-se identação.
O Python também permite múltiplas atribuições, o que significa que podemos fazer coisas como:
#Definindo o valor 0 para a, b e c (modo 1)
a = 0
b = 0
c = 0
#Definindo o valor 0 para a, b e c (modo 2)
a = 0
b = a
c = b
#Definindo o valor 0 para a, b e c (modo 3)
a = 0
b = c = a
#Definindo o valor 0 para a, b e c (modo 4)
a = b = c = 0
#Definindo o valor 0 para a, b e c (modo 5)
a, b, c = 0, 0, 0
O que são aqueles pontos no meio das instruções? Além de todas as vantagens, o Python é uma linguagem orientada a objetos, ou seja, podemos definir classes (grupos) e criar objetos (entidades) dessas classes, está confuso? Vamos então aprender um pouco sobre orientação a objetos começando pelo básico: o objeto. Um objeto é um elemento de um grupo de outros objetos semelhantes a ele, se você pensar bem, você é um objeto da classe humana, então em Python:
class Humano:
nome = None
idade = None
sexo = None
altura = None
peso = None
def __init__(self, novo_nome, nova_idade, novo_sexo, nova_altura, novo_peso):
self.nome = novo_nome
self.idade = nova_idade
self.sexo = novo_sexo
self.altura = nova_altura
self.peso = novo_peso
def mostra_dados(self):
print "Nome: " + self.nome
print "Idade: " + str(self.idade)
print "Sexo: " + self.sexo
print "Altura: " + str(self.altura)
print "Peso: " + str(self.peso)
humano1 = Humano("Fulano", 32, 'M', 1.82, 68)
humano2 = Humano("Ciclana", 22, 'F', 1.67, 58)
humano1.mostra_dados()
humano2.mostra_dados()
O que acabamos de fazer? Criamos a classe “Humano” e dentro dela algumas variáveis, que iniciam com valor nulo, um construtor (__init__) e uma função que mostra os dados, depois criamos dois objetos diferentes da classe “Humano” e chamamos a função “mostra_dados()” de cada uma. Vou explicar mais detalhadamente:
def __init__(self, novo_nome, nova_idade, novo_sexo, nova_altura, novo_peso):
self.nome = novo_nome
O nome “__init__”, em Python, é reservado, ou seja, você não pode escrever uma função com este nome e esperar que ela realize os comandos como uma função qualquer, ela é um construtor, o que significa que é uma função especial, responsável por instanciar (criar novo) um objeto usando os parâmetros que são passados a ela. A palavra self serve para dizer que a instrução será realizada no objeto que está ativo no momento, no caso, o que está sendo instanciado. O ponto serve para acessar atributos (variáveis) e métodos (funções) dentro de um objeto, no exemplo acima estamos definindo o valor do parâmetro “novo_nome” para o atributo “nome” do objeto que estamos instanciando. Quando instanciamos um objeto, o método construtor é chamado para fazer a criação da forma que a definirmos.
def mostra_dados(self):
print "Nome: " + self.nome
Aqui temos uma função sem parâmetros, ou melhor, sem parâmetros definidos por nós. Quando criamos funções dentro de classes, precisamos de pelo menos um parâmetro, que é responsável por dizer à função qual objeto a chamou. A instrução “self.nome” acessa a variável “nome” do objeto que chamou a função.
humano1 = Humano("Fulano", 32, 'M', 1.82, 68)
Para instanciar um objeto, deve-se informar a qual classe ele pertence e, se necessário, os atributos necessários para a instanciação (definidos no construtor). Aqui, criamos a pessoa chamada Fulano, com seus 32 anos, um homem de 1.82m e 68Kg.
humano1.mostra_dados()
Mais adiante, fizemos com que a função “mostra_dados()” do Fulano fosse chamada.
Qualquer humano tem um nome, uma idade, um sexo, um peso, uma altura, ente outros atributos. Com isso em mente, criamos uma classe que agrupa todos os humanos e colocamos esses atributos nela, logo qualquer objeto da classe terá esses atributos, mesmo que nulos (omissão de parâmetros na instanciação), porém cada objeto terá valores diferentes para pelo menos um dos atributos.
Quando programamos para a GE do Blender, temos instruções como esta:
mov_personagem.setDLoc(0, 0.015, 0, 1)
Você deve ter notado que estamos chamando a função “setDLoc()” do objeto “mov_personagem”, certo? Mas como o Python sabe de qual classe é o objeto se o instanciamos de uma forma diferente? O objeto foi criado assim:
import GameLogic as jogo
controlador = jogo.getCurrentController()
atuadores = controlador.getActuators()
mov_personagem = atuadores[0]
Primeiro temos o módulo “GameLogic” que foi renomado para “jogo”, em seguida temos o objeto “controlador” da classe “Controller” (tipo da classe é definido pela função, vide código fonte do módulo GameLogic) que foi conseguido com um método do módulo “GameLogic”. A partir deste objeto da classe “Controller”, temos o objeto “atuadores”, da classe “Actuator” e por fim, “mov_personagem” também é um objeto da classe “Actuator” por ser um elemento de uma lista de objetos (“atuadores”). A resposta para nossa pergunta é a seguinte: além de o módulo GameLogic ter funções que retornam objetos de várias classes diferentes, o Python é dinâmico quanto às variáveis, ou seja, caso você ainda não tenha percebido, não precisamos definir o tipo de uma variável, o próprio interpretador faz esse trabalho por nós baseado no conteúdo da variável, então é perfeitamente possível fazer algo do tipo:
a = 1
a = “string”
Com isso você já deve ter a habilidade de ler scripts em Python, mas agora vem uma questão importante: caso você já tenha programado em C (tutoriais que recomendei) e também baixado o Python (também recomendo) para tentar fazer alguns programinhas simples, vai perceber que o modo de se programar um script é diferente da forma de se programar um aplicativo nessas linguagens. Isso porque, na GE do Blender, os scripts são executados em tempo real, ou seja, quando você programa uma aplicação você programa pensando no que vai acontecer e quando programa scripts, você deve programar pensando no que está acontecendo, lembre-se disto.
Postadd em Tutoriais |