Python
40 pág.

Python


DisciplinaLógica de Programação e Algoritmos2.853 materiais32.419 seguidores
Pré-visualização7 páginas
e from módulo import *, além de um terceiro método não descrito neste tutorial
[2] The Zen of Python (http:/ / python. org/ dev/ peps/ pep-0020/ ), site python.org
Erros e exceções
Voltar para a página inicial.
Erros são humanos e sempre ocorrem ao escrevermos programas, sejam simples ou complexos, o modo de como as
linguagens de programação nos retornam estes erros é que há mudança. Em Python, podem serem tratados muito
elegantemente.
O erro do Python é chamado de Traceback que é uma pilha criada quando ocorre a exceção. Guido van Rossum
escreveu na documentação oficial que \u201cquando ocorre uma exceção, o interpretador procura por um bloco de
tratamento de exceções e então começa a desempilhar cada elemento da pilha de execução. Então desta forma
saberemos quantos níveis depois do tratador de erros que houve a exceção\u201d. O que condiz com a explicação do
capítulo sobre Análise léxica.
Abaixo alguns erros e seus tracebacks:
>>> a = [5, 4, 3, 2]
>>> print a[5]
Traceback (most recent call last):
File &quot;<stdin>&quot;, line 1, in ?
IndexError: list index out of range
Há a possibilidade de:
>>> a = 'livro'
>>> try:
... print a + 1
... except TypeError, erro:
... print &quot;Um erro ocorreu: %s&quot; % erro
Um erro ocorreu: cannot concatenate 'str' and 'int' objects
Erros e exceções 22
Erros são bem vindos!
Um fato importante sobre o estilo da linguagem Python é que o programa deve, preferencialmente, cometer erros e
tratá-los, ao invés de checar se a operação dará erro.
Assim, se temos um vetor v de tamanho desconhecido, porém que, normalmente, terá mais de 10 elementos, e
queremos modificar (se existir) seu décimo elemento, é possível fazê-lo de duas formas:
 ...
 if len(v) >= 10:
 v[9] = 666
 else:
 print &quot;Erro: v tem menos de dez elementos&quot;
ou:
 ...
 try:
 v[9] = 666
 except:
 print &quot;Erro: v tem menos de dez elementos&quot;
Considera-se que a segunda forma (EAFP, ou it's easier to ask for forgiveness than permission, frase atribuída a
Grace Hopper) é melhor do que a primeira (LBYL, ou look before you leap)[1].
Referências
[1] Glossary (http:/ / docs. python. org/ glossary. html), site docs.python.org
Classes 23
Classes
Voltar para a página inicial.
Criamos o objeto classe com \u201cclass nome:\u201d, ela é composta de atributos que representam este objeto. Quando a classe
é atribuída a outro objeto, este objeto é chamado de instância da classe. Os métodos, que também são definidos para
programação orientada a objetos, são funções dentro de uma classe. Todos os métodos ou atributos da classe são
obrigados a passar por parâmetro ou argumento a palavra self antes de tudo, isso é convencionado pelo próprio
desenvolvedor, por padrão se chama self, o self foi convencionado nos parâmetros dos métodos e atributos devido a
filosofia da linguagem de estar tudo explícito, especificar de onde o valor vem. Assim os métodos são chamados
objeto.metodo (argumento1, argumento2, ...) são definidos iguais a uma função.
Os atributos da classe (ou variável da classe) podem ser instanciados em qualquer lugar da classe, e os atributos de
instância (ou variável de instância) devem ser declarados dentro dos métodos utilizando o parâmetro self.
class Nó:
 esquerda, direita, valor = None, None, 0
 def __init__(self, valor):
 # construtor dos valores
 self.esquerda = None
 self.direita = None
 self.valor = valor
class Ordenação:
 def __init__(self):
 # inicializa a raiz da árvore
 self.root = None
 def AdicionaNo(self, valor):
 return Nó(valor)
 def Inserir(self, raiz, valor):
 # inserir novo valor
 if raiz == None:
 # não há nenhum valor
 return self.AdicionaNo(valor)
 else:
 # já está na árvore
 if valor <= raiz.valor:
 # se os dados forem menores do que os armazenados
 # entra na sub-árvore do lado esquerdo
 raiz.esquerda = self.Inserir (raiz.esquerda, valor)
 else:
 # entra na sub-árvore do lado direito
 raiz.direita = self.Inserir (raiz.direita, valor)
 return raiz
Brincando com instância de classe:
Classes 24
class A:
 a = 1 # atributo publico
 __b = 2 # atributo privado a class A
class B(A):
 __c = 3 # atributo privado
 
 def __init__(self):
 print self.a
 print self.__c
a = A()
print isinstance(a, B) # ''Objeto a'' é uma instância da ''classe B''? 
Falso.
a = B() # Instancía o ''objeto a'' na ''classe B'' e imprime os 
atributos da classe.
print isinstance(a, B) # ''Objeto a'' é uma instância da ''classe 
B''?Verdadeiro.
b = B() # Instancía o ''objeto b'' na ''classe B'' e imprime os 
atributos da classe.
print isinstance(b, B) # ''Objeto b'' é uma instância da ''classe B''? 
Verdadeiro.
b = A() # Instancía o ''objeto b'' na ''classe A''.
print isinstance(b, A) # ''Objeto b'' é uma instância da ''classe A''? 
Verdadeiro.
Encapsulamento 25
Encapsulamento
Voltar para a página inicial.
Encapsulamento é a proteção dos atributos ou métodos de uma classe, em Python existem somente o public e o
private e eles são definidos no próprio nome do atributo ou método.
Atributos ou métodos iniciados por no máximo dois sublinhados e terminados por um sublinhado são privados e
todas as outras formas são públicas.
class A:
 a = 1 # atributo publico
 __b = 2 # atributo privado a class A
class B(A):
 __c = 3 # atributo privado a B
 
 def __init__(self):
 print self.a
 print self.__c
a = A()
print a.a # imprime 1
b = B()
print b.__b # Erro, pois __b é privado a classe A.
print b.__c # Erro, __c é um atributo privado, somente chamado pela 
classe.
print b._B__c # Imprime __c = 3, muito pouco utilizada, mas existe.
Herança e polimorfismo 26
Herança e polimorfismo
Voltar para a página inicial.
Deitel, em &quot;Programando em Java&quot;, diz que &quot;quando utilizamos herança para criar uma classe a partir da classe
existente, a nova classe herda os atributos e comportamentos dessa classe existente, podendo adicionar atributos e
comportamentos para solucionar nossas necessidades&quot;.
O polimorfismo condiz com a reutilização de código: é fato que ocorrem funções semelhantes em várias partes do
software; então definimos estas funções em uma biblioteca, e todas as outras funções que dela precisarem poderão
chamá-la sem a necessidade de reescrevê-la.
class Pessoa:
 def __init__(self, nome ='', idade=0):
 self.nome = nome
 self.idade = idade
 def getIdade(self):
 return self.idade
class PessoaCPF(Pessoa):
 
 def __init__(self, CPF, nome='', idade=0):
 Pessoa.__init__(self, nome, idade)
 self.CPF = CPF
a = Pessoa()
Pessoa.__init__(a, 'Leonardo', 22)
b = PessoaCPF('122.333.332-1', nome='', idade=0)
print a.nome # imprime Leonardo
print a.idade # imprime 22
print b.CPF # imprime 122.333.332-1
Python Avançado 27
Python Avançado
Voltar para a página inicial.
List Comprehensions
>>> lista = [[1,2,3], [4,5,6], [7,8,9]]
>>> print [[r[col] for r in lista] for col in range(len(lista[0]))]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
>>>
>>> list_one = [2, 3, 4]
>>> list_two = [2*i for i in list_one if i > 2]
>>> list_two
[6, 8]
>>>
# somando os números de 1 a 100 :)
>>>sum(x for x in xrange(101))
>>>5050
Expresssões regulares
Python consegue lidar com expressões regulares usando a biblioteca re[1].
Expressões regulares não podem ser usadas diretamente, é preciso criar uma variável que faça a interpretação das
strings. Esta variável é de classe RegexObject. Por exemplo, para se criar uma RegexObject que identifique strings
que comecem com a sequência &quot;abc&quot;, podemos fazer: