Introducao A Linguagem Python
Introducao A Linguagem Python
LINGUAGEM PYTHON
Este curso é dirigido aos alunos do IFG, tanto do ensino médio técnico
quanto do superior (Engenharias). Em nível introdutório, tem7se por
objetivo apresentar a Linguagem de Programação Python. Essa
linguagem tem como principal característica o ecletismo, permitindo
ao usuário o desenvolvimento de aplicativos de toda sorte, desde o
processamento de dados científicos até aplicações comerciais, para
rodar no , ou , envolvendo banco de dados,
servidores via Web ou não, manipulando grande massa de dados
( ).
Goiânia, Fev/2019
Cláudio A. Fleury
Introdução à Linguagem Python
O QUE É PYTHON?
É uma linguagem de programação de alto nível, interpretada, interativa, versátil, de código aberto e
legível aos seres humanos, orientada a objetos/imperativa/funcional/estruturada e de uso geral. Possui
um sistema de tipificação dinâmica de variáveis, gerenciamento automático de memória e uma biblioteca
padrão abrangente. Como outras linguagens dinâmicas, o Python é frequentemente usado como uma
linguagem de , mas também pode ser compilado em programas executáveis.
Nos exemplos a seguir, a entrada e a saída de comandos/respostas são diferenciadas pela presença ou
ausência de (>>> e ...): para reproduzir o exemplo, você deve digitar os comandos após o
>>>. As linhas que não começam com um são geradas pelo interpretador, são as respostas
aos comandos. Observe que um secundário sozinho em uma linha num exemplo significa que você
deve digitar uma linha em branco; isso é usado para encerrar um comando de várias linhas.
Muitos dos exemplos nesta apostila, mesmo aqueles inseridos no interativo, incluem comentários.
Comentários em Python começam com o caractere ‘#’, e se estendem até o final da linha física. Um
comentário pode aparecer no início de uma linha ou após um espaço em branco ou código, mas não
dentro de uma . Um caractere dentro de uma é apenas mais um caractere da . Como
os comentários são para esclarecer o código e não são interpretados pelo Python, eles podem ser
omitidos ao se digitar os exemplos.
>>> # Exemplo de script Python
>>> porta = 1 # porta aberta
>>> texto = "Deixe seu comentario em #comPythonehmaisfacil"
O sinal de igual (=) é usado para atribuir um valor a uma variável. Depois de uma atribuição nenhum
resultado é exibido antes do próximo :
Se uma variável não for "definida" (atribuída um valor), tentar usá7la causará um erro:
>>> n # tentativa de acessar uma variável não definida
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'n' is not defined
>>>
HISTÓRICO
A linguagem Python começou a ser desenvolvida por ! ""
em 1989 (lançada oficialmente em 1999) na Centrum Wiskunde &
Informatica (CWI), Holanda, como sucessora da linguagem ABC (inspirada
na SETL1) que era capaz de lidar com exceções e interagir com o sistema
operacional que ele estava ajudando a desenvolver.
Guido era fã do grupo humorístico # , criador do programa
de comédia na televisão inglesa BBC (19697
1974). Ele quis homenagear o grupo dando o nome Python à linguagem.
Então, a denominação da linguagem não é devida à serpente Python,
embora o ícone utilizado para representação sejam duas cobras estilizadas.
Linha do tempo do lançamento das versões:
Fonte: http://www.trytoprogram.com/python7programming/history7of7python/
1Linguagem de programação de "altíssimo nível", baseada na teoria matemática de conjuntos. Foi originalmente
desenvolvida por Jacob Theodore Schwartz no na NYU no fim dos anos 1960.
Lambert Meertens passou um ano com o grupo SETL na NYU antes de finalizar o projeto da ling. ABC.
CARACTERÍSTICAS
Em vez de ter todas as suas funcionalidades incorporadas em seu núcleo, o Python foi projetado para ser
facilmente extensível. Essa modularidade compacta tornou7a popular, pois se pode adicionar interfaces
programáveis a aplicativos existentes. A intenção de era projetar uma linguagem com um pequeno
núcleo, uma grande biblioteca padrão e um interpretador facilmente extensível... Isso foi resultado de suas
frustrações com a ling. ABC, que adotava uma abordagem oposta.
Fonte: https://www.programiz.com/python7programming/keyword7list
Este é o site oficial da linguagem Python. A página detectará o sistema operacional instalado no seu
computador, e recomendará a versão adequada a ser baixada. Como estou usando o Windows764 no
meu , foram dadas as opções de para 34 e 35 para Windows.
Neste curso usaremos a versão 2.7 da ling. Python, portanto recomendo que você baixe a versão mais
recente do 34 (à época da escrita desse texto era a versão 467689 7 ver figura anterior).
As etapas de instalação são bem simples. Você só precisa escolher o diretório para instalação e clicar
para avançar nas próximas etapas: botão [! " #].
Para abandonar o interpretador Python, use o atalho de teclado [Ctrl7Z]+[ ] ou a função exit()
(finalize a entrada com a tecla [ ]).
PACOTES
15. Numpy
16. Scipy
17. Matplotlib
18. Pandas
1. Variáveis e Operações:
Um sinal de igual ‘=’ é usado para atribuir (armazenar) um valor a uma variável, como ocorre na
grande maioria das linguagens de programação de computadores.
Sempre que pressionarmos qualquer tecla numérica, letra ou instrução no console do Python
seguida da tecla [ ], a resposta do interpretador Python será mostrada na linha seguinte. Mas,
se atribuirmos um valor a uma variável, à esquerda do sinal de igual ‘=’, e pressionarmos [ ],
nenhuma informação será exibida na linha seguinte. Em vez disso, a informação digitada do lado
direito do sinal de igual será armazenada na variável.
Uma variável é como uma pequena caixa na memória do computador, na qual se armazena
qualquer informação. Quando declaramos uma variável, o computador aloca determinada
memória para armazenar essa variável. O endereço de memória de cada variável é único.
& ". : ) ": soma (+), subtração (7), multiplicação (*), divisão (/), resto da divisão
inteira (%), divisão inteira (//), potenciação (**). A prioridade de execução segue os padrões
matemáticos. Usando parênteses pode7se definir que parte da operação será feita antes da
operação.
>>> 12-4*9
-24
>>> (12-4)*9
72
>>> 12-(4*9)
-24
Atenção: divisão com valores inteiros apresenta resultado também inteiro. Para obter resultado
fracionário um dos operandos deve ser do tipo real ( ).
>>> 8/6
1
>>> 8./6
1.3333333333333333
>>> 12.5/3
4.166666666666667
>>> 12.5//3
4.0
>>> 13 % 5
3
>>> 2 ** 10
1024
>>>
Dados em Python podem ser um dos cinco tipos a seguir: Números, None, Sequências (listas,
tuplas), Conjuntos ou Mapeamentos.
Conversão de Tipo significa converter variáveis de um tipo de dado em outro. O Python possui
algumas funções internas para conversão de tipos. Até agora vimos exemplos de variáveis de
tipos de dados inteiros, reais (ponto flutuante) e de (cadeias de caracteres). Para converter
estes tipos, as funções são, respectivamente 7 int(), float(), str().
Observe que se a não resultar num valor inteiro então uma mensagem de erro de valor será
mostrado ao se solicitar a conversão de tipo para inteiro.
! " & : Use a função " => sem qualquer restrição para gerar uma cadeia de
caracteres.
! " & ": A função => é usada para converter de ou inteiros em valores
reais.
As são usadas para armazenar informações de texto, tais como nome, endereço,
mensagens etc. O Python monitora todos os elementos da como uma sequência de
caracteres. Por exemplo, o Python entende que a "IFG" é uma sequência de letras numa
ordem específica. Isso significa que poderemos usar a indexação para capturar letras específicas
(como a primeira ou a última letra).
índices positivos 0 1 2 3 4 5
índices negativos 76 75 74 73 72 71
Para criar uma em Python você precisa usar aspas simples ou aspas duplas.
Por exemplo (usando comentário na primeira linha):
>>> # palavra única
... 'IFG'
'IFG'
>>> # uma frase
... 'Bem-vindos ao Curso de Extensão do IFG 2019-1'
'Bem-vindos ao Curso de Extensão do IFG 2019-1'
>>> # erro de sintaxe
... 'Valor de 'x' no programa?'
File "<stdin>", line 2
'Valor de 'x' no programa?'
^
SyntaxError: invalid syntax
>>>
•
Usar a sequência de caracteres ( ) no (>>>) do interpretador mostrará
automaticamente seu valor, mas a maneira correta de exibir as na sua saída é usar a
instrução de impressão: .
• $ % & ' (
Na versão 2 a impressão é realizada por uma instrução (sentença, comando) enquanto que na
versão 3 é uma função que faz a impressão: .
Uma instrução é uma diretiva para o compilador de que um módulo específico deve ser
compilado usando sintaxe ou semântica que estará disponível em uma versão futura do
Python. A declaração destina7se a facilitar a migração para versões futuras do Python
que introduzem alterações incompatíveis à linguagem. Ela permite o uso dos novos recursos por
módulo antes do lançamento no qual o recurso se torna padrão.
É como dizer "Como esse é o Python v2.7, use essa função diferente que também foi
adicionada ao Python v2.7, depois que ela foi adicionada no Python 3. Então, meu 'print' não
será mais uma instrução ( por exemplo ) mas uma função (por exemplo,
. Dessa forma, quando meu código é executado em Python 3, não irá
quebrar o programa (dar pau!).
Também podemos usar uma função chamada % => para verificar o tamanho de uma string.
• " %&
Sabemos que são sequências de caracteres, o que significa que o Python pode usar
índices para acessar partes da sequência.
Observe o primeiro fatiamento acima: "AB;5C. Aqui estamos dizendo ao Python para acessar
os caracteres de ", do índice 0 até 3, não incluindo o índice 3 (quarta posição). Você notará
esse comportamento muitas vezes em Python, onde as declarações geralmente estão no
contexto "até, mas não incluindo".
Também podemos usar a notação de índice e fatia para capturar elementos de uma
sequência com um determinado incremento (o padrão é passo unitário). Por exemplo, podemos
usar dois dois7pontos em uma linha e, em seguida, um número especificando a frequência para
acessar os elementos. Por exemplo:
Observe como o erro nos diz diretamente o que não podemos fazer: não admite atribuição do
item!
Algo que podemos fazer é concatenar !
• ) ! *
Objetos em Python geralmente possuem métodos internos. Esses métodos são funções
associadas ao objeto (aprenderemos sobre isso com muito mais profundidade posteriormente)
que podem executar ações ou comandos no próprio objeto.
Nós acessamos os métodos de um objeto usando um ponto ‘.’ e depois o nome do método:
,D 6 : =& E ">, onde os parâmetros são argumentos extras que podemos passar
ao método. Não se preocupe com os detalhes se não fizeram sentido agora. Mais tarde
• %& &
Como os elementos não são representados por algo tão descritivo quanto um nome, esse estilo
simples deve ser usado apenas para formatar uma quantidade relativamente pequena de
elementos.
Com a nova formatação de estilo, é possível (e obrigatório no Python 2.6) dar aos espaços
reservados um índice posicional explícito. Isso permite reorganizar a ordem de exibição sem
alterar os argumentos. Esta operação não está disponível na formatação antiga.
Código pythônico:
4. Intervalo
O tipo (intervalo de valores> representa uma sequência imutável de números e é comumente
usado para repetir um determinado número de vezes em laços de repetição .
Os argumentos para o construtor de devem ser inteiros (seja o nativo ou qualquer outro
objeto que implemente o método especial ). Se o argumento passo for omitido, o
padrão será 1 (um). Se o argumento início for omitido, o padrão será 0 (zeros). Se o passo for
zero, um erro será gerado.
Comparação de objetos do tipo para igualdade (==) ou diferença (!=) são realizados
como na comparação de sequências. Ou seja, dois objetos de intervalo são considerados iguais se
eles representam a mesma sequência de valores. Observe que dois objetos de intervalo que se
comparam como iguais podem ter diferentes atributos de início, final e passo, por exemplo:
range(0) == range(2,1,3) ou range(0,3,2) == range(0,4,2).
5. Lista:
As listas " ) % F " ,D " < ", os quais podem ser de qualquer tipo, inclusive
outras listas. As listas podem ser homogêneas (dados de um mesmo tipo) ou heterogêneas, o que
as tornam ferramentas muito poderosas no Python. Uma única lista pode conter dados de qualquer
tipo, tais como: números inteiros, números reais (ponto flutuante), , ou qualquer outro objeto.
As listas também são muito úteis na implementação de pilhas e filas. As listas são mutáveis e,
portanto, podem ser alteradas mesmo após sua criação.
• , - .
>>> lista_vazia = []
>>> print lista_vazia
[]
>>>
• , / 0 1
>>> mix = [3.141592653589, -5, 'Tudo certo?', True, '*']
>>> print mix
[3.141592653589, -5, 'Tudo certo?', True, '*']
>>>
• , '$
>>> lista2D = [['12',3, True],
[0.1, 'ok',22],
[-5, 'Tudo certo?', True]]
>>> print lista2D
[['12',3, True],[0.1, 'ok',22],[-5, 'Tudo certo?', True]]
>>> print lista2D[0][1]
3
>>> for linha in lista2D:
... for elem in linha:
... print elem,
... print
...
12 3 True
0.1 ok 22
-5 Tudo certo? True
>>>
• ,
>>> num = range(1,10)
>>> print num
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print num[0:3] # acessa do 1o. ao 3o. elementos
[1, 2, 3]
>>> print num[2:-2] # acessa do 3o. ao penúltimo elementos
[3, 4, 5, 6, 7]
>>>
• !2 , / 1
O interpretador Python indica erro para a tentativa de somar elemento do tipo ‘str’ com ‘int’.
Prevenindo7se do referido erro:
>>> pesos = [56, 73, 92, 'ok', 32, 45, True, "vida"]
>>> soma = 0
>>> for peso in pesos:
... if type(peso) == int: # verificação do conteúdo do elemento
... soma += peso
...
>>> print 'Soma dos Pesos: ', soma
Soma dos Pesos: 298
• %& , % %& / 1
>>> cores = ["azul","amarelo","vermelho","verde","roxo"]
>>> for cor in cores:
... print cor
... if cor == "amarelo":
... print "Amarelo é a minha cor favorita!"
...
azul
amarelo
Amarelo é minha cor favorita!
vermelho
verde
roxo
>>>
Exercícios:
1. Criar uma lista com os números inteiros positivos múltiplos de 7, de 7 a 70. Mostrar os
elementos da lista separados, um por linha.
2. Idem, porém mostrar apenas os elementos cuja soma de dígitos seja ímpar.
3. Idem, porém para múltiplos até 700, mostrados em sequência.
4. Idem, porém para múltiplos até N (entrada do usuário).
• %& ,
>>> pesos = [56, 73, 92, 'ok', 32, 45, True, "vida"]
• " ,
>>> pesos = [56, 73, 92, 'ok', 32, 45, True, "vida"]
>>> pesos.insert(2,"alegria")
>>> print pesos
[56, 73, 'alegria', 92, 'ok', 32, 45, True, "vida"]
>>> pesos.remove(45)
>>> pesos
[56, 73, 'alegria', 92, 'ok', 32, True, "vida"]
>>> del pesos[1]
>>> pesos
[56, 'alegria', 92, 'ok', 32, True, "vida"]
>>> ultimo = pesos.pop() # retorna último elemento, retirando-o da lista
>>> print pesos, '\n', ultimo
[56, 'alegria', 92, 'ok', 32, True]
"vida"
>>>
• , 5 *
>>> lista_carros
['focus’, ‘jetta’, ‘408’, ‘cruze’, ‘civic’, ‘corolla’, ‘mercedes c180’, ‘sentra’,
‘cerato']
>>> lista_carros.reverse()
>>> lista_carros
['cerato', 'sentra', 'mercedes c180', 'corolla', 'civic', 'cruze', '408', 'jetta',
'focus']
Além das operações de sequência e os métodos da classe , o Python inclui uma operação mais
avançada chamada de abrangência de lista ( ). Trata7se de uma maneira rápida
de filtrar uma lista com base em um ou mais critérios estabelecidos pelo usuário.
Leia7se: é o conjunto formado por todos os números do conjunto dos números naturais divididos
por 2, desde que o número seja maior ou igual a zero e menor ou igual a 5.
>>> r = [x/2 for x in range(6)]
>>> r
[0, 0, 1, 1, 2, 2]
>>>
, permite criar listas usando notação mais compacta do que seria possível usando
laços de repetição com o comando . Tenha cuidado, no entanto, pois nem
sempre é resposta para tudo. É fácil se deixar levar e escrever complexas e
difíceis de ler. Às vezes, escrever mais código é melhor, especialmente se isso ajudar na
legibilidade. Lembre7se: simples é melhor que complexo, e legibilidade importa!
>>> range(11)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> faixa = range(-10,11)
>>> faixa
[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> R = [x/2 for x in faixa if x >= 0 and x <= 5]
>>> R
[0, 0, 1, 1, 2, 2]
>>> R = [x/2. for x in faixa if x >= 0 and x <= 5]
>>> R
[0.0, 0.5, 1.0, 1.5, 2.0, 2.5]
Exemplo:
>>> letras = ['a', 'b', 'c', 'd']
>>> print letras
['a', 'b', 'c', 'd']
>>> letras_maiusc = []
>>> for letra in letras:
... letras_maiusc.append(letra.upper())
...
>>> print letras_maiusc
['A', 'B', 'C', 'D']
>>>
Filtrando alguns valores, por exemplo: não incluir as letras maiúsculas 'A' e 'E'.
>>> letras = ['a', 'b', 'c', 'd']
>>> letras_maiusc = [x.upper() for x in letras if x not in ['a','e']]
>>> print letras_maiusc
['B', 'C', 'D']
>>>
Gerar uma lista de sedans com nome do modelo em maiúsculas e começando com 'c':
Agora usando o método capitalize() da classe String para colocar em maiúscula a primeira letra:
>>> [x.capitalize() for x in lista_carros if x[0]=='c']
['Cruze', 'Civic', 'Corolla', 'Cerato']
>>>
Operador :
Código pythônico:
>>> cidade = 'Paris'
>>> achou = cidade in ['Nairobi', 'Kampala', 'Paris']
>>> print achou
True
>>>
Outro exemplo:
6. Tupla:
Uma tupla é uma sequência imutável de objetos Python. Tuplas são sequências, assim como as
listas. As diferenças entre tuplas e listas são: as tuplas não podem ser alteradas diferentemente
das listas, e as tuplas usam parênteses como delimitadores enquanto as listas usam colchetes. Criar
uma tupla é tão simples quanto colocar diferentes valores separados por vírgulas e delimitados
por parênteses.
A construção de uma tupla usa ( ) com elementos separados por vírgulas. Por exemplo:
Assim como para as listas, a quantidade de elementos pode ser obtida com a função % =>:
• ) 67 3
Tuplas têm métodos embutidos, mas não tantos quanto aos métodos disponíveis para listas.
Só relembrando, as tuplas são imutáveis, não se pode modificar uma tupla depois que ela já
estiver definida...
• 8
Você pode estar se perguntando: "Por que se preocupar em usar tuplas quando elas têm menos
métodos disponíveis?" Para ser honesto, as tuplas não são usadas tão frequentemente quanto as
listas, mas são usadas quando a imutabilidade é necessária. Se no seu programa você está
passando um objeto e precisa ter certeza de que ele não será alterado, então a tupla será a
solução. Ela fornece uma forma conveniente de se obter integridade de dados.
7. Conjunto:
• 9
Podemos usar a função ou um par de chaves H I para criar um conjunto vazio, ou podemos
ainda criá7los com elementos a partir de outras estruturas iteráveis (lista, tupla, dicionário etc).
• /1 9 :
>>> A.add('ok')
>>> A
set(['ok'])
>>>
>>> A.add(1)
>>> A.add(1)
>>> A
set([1, 'ok'])
>>>
>>> A.add(-8)
>>> A
set([-8, 1, 'ok'])
>>> A.add(5)
>>> A # coleção não ordenada
set([-8, 1, 'ok', 5])
Observe que os elementos não guardam qualquer ordem no conjunto e que elementos já existentes
não são repetidos ao serem adicionados mais de uma vez ao conjunto.
• * /1 9
>>> A = {3,4,5}
>>> A
set([3, 4, 5])
>>> B = {4,5,6}
>>> print A | B # união dos conjuntos A e B
set([3, 4, 5, 6])
>>>
>>> print A.union(B) # união dos conjuntos A e B
set([3, 4, 5, 6])
>>>
• %& 9
• $ % 9
• $ % ) 9
>>> A.symmetric_difference(B)
set([3, 6])
>>> print A ^ B, B ^ A
set([3, 6]) set([3, 6])
>>>
>>> familia ^ empregado
set(['Matheus', 'Camila', 'Ana'])
>>> familia - empregado
set(['Matheus', 'Camila', 'Ana'])
>>>
• 9 :
Diferentemente das estruturas Lista e Tupla, os elementos do Conjunto não podem ser acessados
via indexação:
>>> B
set([4, 5, 6])
>>> B[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'set' object does not support indexing
>>> for elem in B:
... print elem,
...
4, 5, 6
>>>
Funções incorporadas para conjuntos: all(), any(), enumerate(), len(), max(), min(), sorted() e sum().
• 9 7* :
Conjuntos não podem ser usados como chaves de dicionário, por serem mutáveis. Por outro lado, os
* L " " podem ser usados como chaves de um dicionário. Podem ser criados usando a função
* L " =>.
>>> A = frozenset([1, 2, 3, 4])
>>> B = frozenset([3, 4, 5, 6])
>>> A, B
(frozenset([1, 2, 3, 4]), frozenset([3, 4, 5, 6]))
>>> A ^ B, A | B
frozenset([1, 2, 5, 6]), frozenset([1, 2, 3, 4, 5, 6])
>>> A.add(5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add'
>>>
8. Dicionário:
O dicionário é uma coleção não ordenada de itens. Enquanto outros tipos de dados compostos
(arranjos) têm apenas um valor para cada índice, um dicionário tem um par ) ! ;! % . Os
dicionários são otimizados para recuperar valores quando a ) ! for conhecida.
Se você estiver familiarizado com outras linguagens, pode pensar em dicionários como tabelas de
espalhamento ( ).
• Criando um Dicionário
Um dicionário em Python consiste de uma chave e um valor associado. Esse valor pode ser
praticamente qualquer objeto do Python.
Criar um dicionário é tão simples quanto colocar itens separados por vírgula entre chaves { }.
Um item tem uma ) ! e um ! % correspondente, e é expresso como um par ) ! ; ! % .
Embora os valores possam ser de qualquer tipo de dado e possam se repetir, as chaves devem ser
do tipo imutável ( , número ou tupla) e devem ser exclusivas.
Nós também podemos criar chaves via operador de atribuição. Por exemplo, se começássemos
com um dicionário vazio, poderíamos adicionar elementos continuamente:
>>> d = { } # dicionário vazio
>>> d['animal'] = 'gato' # acrescenta o elemento 'animal':'gato'
>>> d['idade'] = 6 # acrescenta o elemento 'idade':6
>>> d
{'idade': 6, 'animal': 'gato'}
>>>
• $ 7
Dicionário são estruturas mutáveis. Podemos adicionar novos itens ou alterar o valor dos itens
existentes usando o operador de atribuição. Se a chave já estiver presente, o valor será
atualizado, caso contrário, um novo par ) ! ;! % será adicionado ao dicionário.
• " $ 7
O método pode ser usado para remover e retornar um item arbitrário (chave, valor) do
dicionário. Todos os itens podem ser removidos de uma vez usando o método . Também
podemos usar a função incorporada => para remover itens individuais ou o dicionário inteiro.
>>> y
{5: 'ok', 'notas': [6, 7, 4], 'nome': 'Maria'}
>>> y.pop(5)
'ok'
>>> y
{'notas': [6, 7, 4], 'nome': 'Maria'}
>>> del y['notas']
>>> y
{'nome': 'Maria'}
>>>
>>> d
{'idade': 5, 'cor': 'branco', 'animal': 'gato', 'nome': 'Teo'}
>>> del d
>>> d
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'd' is not defined
>>>
Outros tantos métodos estão disponíveis para uso com dicionários: clear(), copy(),
fromkeys(seq[, v]), get(key[,d]), items(), keys(), pop(key[,d]), popitem(),update([other]), values().
>>> notas = {}.fromkeys(['matematica','espanhol','portugues'],0)
>>> notas
{'portugues': 0, 'espanhol': 0, 'matematica': 0}
>>> for disciplina in notas.items():
... print disciplina
...
('portugues', 0)
('espanhol', 0)
('matematica', 0)
>>> list(sorted(notas.keys()))
['espanhol', 'matematica', 'portugues']
>>>
O Python é poderoso com sua flexibilidade de aninhar objetos e na chamada de métodos. Vamos
ver um dicionário aninhado dentro de outro dicionário:
>>> d = {'chave1':{'ch_aninh':{'ch_sub_aninh':1000}}}
>>> d
{'chave1': {'ch_aninh': {'ch_sub_aninh': 1000}}}
>>>
>>> d['chave1']['ch_aninh']['ch_sub_aninh']
1000
>>>
Identificação: 1
idade : 25
sexo : Fem.
nome : Maria
Identificação: 2
idade : 35
sexo : Masc.
nome : Luiz
Identificação: 3
idade : 19
sexo : Fem.
casada : False
nome : Ana
• 0 $ 7
Podemos testar se uma chave está num dicionário ou não usando a palavra7chave . Observe que
o teste de associação é válido somente para chaves, não para valores.
>>> print quadrados_impares
{1: 1, 3: 9, 9: 81, 5: 25, 7: 49}
>>>
>>> print 1 in quadrados_impares
True
>>> print 2 in quadrados_impares
False
>>> print 25 in quadrados_impares
False
>>>
• $ 7
• %< ) $ 7
Funções incorporadas, tais como, %%(), (), % (), ) &(), " () etc, são comumente usadas com
o dicionário para realizar diferentes tarefas.
Método Descrição
) & => Retorna uma cópia profunda do dicionário, um novo objeto é criado na
memória contendo todos os pares do dicionário fonte da cópia
* N "=> Retorna um novo dicionário cujas chaves são os elementos de lista (prim.
Parâmetro) e cujos valores são todos iguais a valor (seg. parâmetro)
& => Atualiza um dicionário com os elementos de outro. Os itens do outro dic são
adicionados um a um ao dicionário original
Exemplos:
• . $ 7
Uma representação dessa matriz usando uma lista terá muitos zeros:
Uma alternativa para economizar memória é usarmos um dicionário. Para as chaves, nós podemos
usar tuplas que contêm os índices da linha e da coluna:
>>> esparsa = {(0,3): 1, (2, 1): 2, (4, 3): 3}
Nós precisamos apenas de três pares ) ! ;! % , para armazenar os valores diferente de zero
da matriz. Cada chave é uma tupla, e cada valor é um número inteiro.
Mas temos um problema com essa alternativa... Se tentarmos buscar um elemento zero, obteremos
um erro, pois não existe uma entrada no dicionário para a chave especificada, 0 (zero):
>>> matriz[1][3]
0
>>> esparsa[0,3]
1
>>> esparsa[1,3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: (1,3)
>>>
O primeiro parâmetro do => é a chave buscada, e o segundo parâmetro é o valor que =>
retornará caso a chave não exista no dicionário. Exemplo:
>>> esparsa.get((1,3),0) for i in range(5):
... for j in range(5):
0
... print esparsa.get((i,j), 0),
>>> ... print= x**2
- )$) ";
1. Dada uma palavra, só com letras minúsculas, digitada pelo usuário, mostre a quantidade de
letras na palavra.
2. Dada uma palavra, só com letras minúsculas, digitada pelo usuário, mostre a ocorrência de
cada letra da palavra (histograma = contagem de frequência), usando % " .
3. Dada uma palavra, só com letras minúsculas, digitada pelo usuário, mostre a ocorrência de
cada letra da palavra (histograma = contagem de frequência), usando ) ( .
9. Entrada de Dados
Python fornece funções nativas que pegam entradas realizadas via teclado. A mais simples é
chamada 1K & =>. Ao executar esta função, o programa para e espera o usuário digitar
alguma coisa. Quando o usuário finaliza a entrada de dados ao pressionar a tecla [ ], o
programa prossegue e a função 1K & => retorna a digitação do usuário sempre como :
Antes de usar 1K & => é bom exibir uma mensagem para o usuário dizendo o que ele deve
digitar. Esta mensagem é como se fosse uma pergunta ( ):
>>> nome = raw_input("Qual é o seu nome? ")
Qual é o seu nome? Arthur, Rei dos Bretões!
>>> print nome
Arthur, Rei dos Bretões!
Se a entrada esperada for um valor numérico inteiro, então podemos usar a função =>.
A função do Python também lê dados informados pelo usuário via teclado. Se a informação
a ser entrada pelo usuário for uma então a informação deve ser digitada com os
delimitadores de (par de aspas ou apostrofes), mas se a informação for numérica então
nenhum delimitador será necessário.
>>> nome = input('Digite o seu sobrenome: ')
Digite o seu sobrenome: 'Fleury'
>>> idade = input('Digite a sua idade: ')
Digite a sua idade: 19
>>> print nome, 'tem', idade, 'anos.'
Fleury tem 19 anos.
>>>
Atente7se para o fato de que devem ser delimitadas por aspas (") ou apóstrofos (') na
entrada de dados com a função & =>.
Se o usuário digitar uma de números, ela será convertida num inteiro e atribuída à variável
! % ) . Infelizmente, se o usuário digitar um caractere que não seja um dígito numérico, o
programa trava:
>>> velocidade = input(pergunta)
Qual... é a velocidade de vôo de uma andorinha?
De qual você fala, uma andorinha Africana ou uma Europeia?
SyntaxError: invalid syntax
Para evitar esse tipo de erro, geralmente é bom usar 1K & => para pegar uma e,
então, usar funções de conversão para outros tipos de dados: int(), float(), long().
) %
Para poder escrever programas úteis, quase sempre precisamos da habilidade de checar
condições e mudar o comportamento do programa de acordo com elas. As instruções condicionais
oferecem essa habilidade. A forma mais simples é a instrução (se):
if x > 0:
print x, "é positivo"
Não existe limite para a quantidade de instruções que podem aparecer aninhadas numa instrução
. Ocasionalmente, é útil ter um corpo sem nenhuma instrução (usualmente, como um delimitador de
espaço para código que você ainda escreverá!). Nesse caso, você pode usar o comando , que
indica ao Python: “passe por aqui sem fazer nada” ou "siga em frente...".
if a < b:
pass
print a, b
...
Simples:
if condição:
comando(s) # executados se condição é True
Composta:
if condição:
comando(s) # executados se condição é True
else:
comando(s) # executados se condição é False
2 Recuar o texto em relação à margem esquerda da folha; inserir espaços entre a margem e o começo da linha de um parágrafo.
Exemplo:
if a < b:
print a, "é menor que", b
elif a > b:
print a, "é maior que", b
else:
print a, "e", b, "são iguais"
A expressão é uma abreviação de “ ” (“senão se”). No Python não existe uma instrução
do tipo ") % O) " ( = = , na ling. C/C++), mas pode7se usar:
if escolha == 'A':
funcao_A()
elif escolha == 'B':
funcao_B()
elif escolha == 'C':
funcao_C()
else:
print "Escolha não disponível."
Nesse caso o(s) comando(s) a serem repetidos são colocados de forma indentada após o
caractere ':', e podem ser executados nenhuma ou várias vezes, enquanto a condição for
verdadeira ( ).
Inicialização
while condição:
comando(s)
No Python, todas as instruções recuadas pela mesma quantidade de caracteres espaços após uma
construção de programação ':' são consideradas parte de um único bloco de código. Python usa
recuo (endentação) como método de agrupar instruções.
Exemplo:
Usar um índice para percorrer um conjunto de valores é uma tarefa comum em programação, de
modo que o Python oferece uma sintaxe alternativa simplificada 7 o laço de repetição * :
>>> curso = 'Python'
>>> for letra in curso:
... print letra,' ',
...
P y t h o n
>>>
Função é um grupo de instruções relacionadas que executam uma tarefa específica. As funções
ajudam a dividir os programas em partes menores e modulares. À medida que o programa se
torna maior, as funções o tornam mais organizado e gerenciável, além de evitar a repetição de
comandos e gerar códigos reutilizáveis.
def nome_funcao(parametros):
""" string documental para descrever o que faz a funcao """
comando(s) indentado(s)
A primeira após o cabeçalho da função é chamada de )" . Ela é usada para resumir
o que faz a função. Embora opcional, a documentação é uma boa prática de programação.
Geralmente, usamos aspas triplas para que a possa se estender por várias linhas. Esta
estará disponível para nós como atributo KK )KK da função.
A instrução é usada para encerrar a função e voltar para o local de onde foi chamada.
Exemplo:
import math
def polar(x, y):
""" converte a coordenada retangular (x,y) em polar (mod,fase) """
mod = math.sqrt(x*x + y*y)
z,teta = polar(4, 4)
print "4 + j4 = %.2f|_%.1f (grau)" % (z, teta)
Funções que definimos para executar determinada tarefa específica são referidas como * F "
* " & % " ( . A maneira como definimos e chamamos funções em Python já é discutida.
Funções que vêm prontas com o Python são chamadas de * F " " (ou incorporadas).
def minha_funcao():
x = 10
print "Valor de 'x' dentro da funcao:", x
x = 20
minha_funcao()
print "Valor de 'x' fora da funcao:", x
x = [1,2,3,4,5]
y = [3,4,5,6,7,9]
z = range(0,50,5)
print "Comum entre x e y:", comum(x,y)
print "Comum entre x, y e z:", comum(comum(x,y),z)
>>> runfile('E:/python/apostila2.py', wdir=r'E:/python')
Comum entre x e y: [3, 4, 5]
Comum entre x, y e z: [5]
Exercícios:
1. Calcule e mostre o mínimo múltiplo comum (mmc) de dois números (menor inteiro positivo que é
perfeitamente divisível pelos dois números dados).
2. Calcule e mostre o máximo divisor comum (mdc) de dois números (maior inteiro positivo que é
perfeitamente divisível pelos dois números dados)
O interpretador Python possui várias * F " ) & " que estão sempre disponíveis – não
dependem de importações (carga prévia). Elas estão listadas em ordem alfabética a seguir:
Funções Incorporadas
abs() divmod() input() open() staticmethod()
all() enumerate() int() ord() str()
any() eval() isinstance() pow() sum()
basestring() execfile() issubclass() print() super()
bin() file() iter() property() tuple()
bool() filter() len() range() type()
bytearray() float() list() raw_input() unichr()
callable() format() locals() reduce() unicode()
chr() frozenset() long() reload() vars()
classmethod() getattr() map() repr() xrange()
cmp() globals() max() reversed() zip()
Fonte: docs.python.org/2/library/functions.html#
- )$) ";
1. Dada uma lista de chamada dos alunos (máx. 99 alunos) de uma turma, pede7se mostrar a
lista com a seguinte aparência:
01 7 JOAO
02 7 ANA
03 7 RUBENS
04 7 OTACILIO
05 7 ...
3. Considere uma lista de preços de frutas e verduras em reais, de uma feira de rua:
["Pepino",5.5,"Tomate",8.3,"Banana",4.5,"Laranja",3.0,"Café Jacú",990.5,...]. Mostre a lista
com preços convertidos para dólar americano (use câmbio R$ 3,80/US$) com a seguinte
aparência:
01 Pepino 1.33
02 Tomate 2.43
03 Banana 1.21
04 Laranja 0.91
05 Café Jacú 20.23
enumerate(iterable, start=0)
3 : substantivo feminino. 1. ato de iterar; repetição. 2. ÁLGEBRA: processo de resolução de uma equação mediante
operações em que sucessivamente o objeto de cada uma é o resultado da que a precede. 3. COMPUT.: é o processo de
repetição de uma ou mais ações; cada iteração se refere a apenas uma instância da ação.
Outro exemplo:
>>> frutas = ('manga', 'banana', 'laranja')
>>> for cont, fruta in enumerate(frutas,10):
... print "Fruta %d: %s" % (cont,fruta)
...
Fruta 10: manga
Fruta 11: banana
Fruta 12: laranja
>>>
Outro exemplo:
>>> diasSemana = ["Segunda", "Terça", "Quarta", "Quinta", "Sexta"]
>>> for i, dia in enumerate(diasSemana,1):
... print("{}-feira é o {}o. dia útil da semana".format(dia, i))
...
Segunda-feira é o 1o. dia útil da semana
Terça-feira é o 2o. dia útil da semana
Quarta-feira é o 3o. dia útil da semana
Quinta-feira é o 4o. dia útil da semana
Sexta-feira é o 5o. dia útil da semana
>>>
filter(funcao, iteravel)
A função * % => cria uma lista a partir dos elementos da estrutura de dados ! %, para os
quais a aplicação da * ) retorna . O parâmetro iterável pode ser uma sequência, um
contêiner que suporta iteração ou um iterador. Se ! % for uma ou uma tupla, o resultado
também será desse mesmo tipo; caso contrário, será uma lista. Se o parâmetro * ) não for
especificado ou for ! , a função => é assumida, ou seja, todos os elementos iteráveis que
forem ' %" não serão considerados.
>>> lista = [8, 9, -1, -3, 3, -5, -4, 5, -4, 2, 5, 91, -11, 5, 10, 93, -75]
>>> positivos = []
>>> for item in lista:
... if item > 0:
... positivos.append(item)
...
>>> print positivos
Agora vamos mostrar o ‘jeito Python’ de fazer a mesma coisa, mas de uma forma pouco mais
compacta, usando uma função definida pelo usuário e denominada & " =>:
>>> lista = [8, 9, -1, -3, 3, -5, -4, 5, -4, 2, 5, 91, -11, 5, 10, 93, -75]
>>> def positivo(x): # função retorna True para x positivo
... return x > 0
...
>>> positivos = filter(positivo, lista)
>>> positivos
[8, 9, 3, 5, 2, 5, 91, 5, 10, 93]
>>>
Ao chamar a função &= 6"Q 2 % " 8>, estamos solicitando ao interpretador para que
execute a função 6"Q ( 4 + do inglês: raiz quadrada) usando como entrada cada um
dos elementos da lista Q , e inserindo o resultado na lista retornada como resultado da função
map(), a lista " % .
Expressões lambda
" é uma função anônima composta apenas de expressões. As funções são expressas
apenas numa linha, e podem ter o resultado atribuído a uma variável. Funções são muito
usadas em programação funcional.
No exemplo da função * % =>, tivemos que definir uma nova função (& " ! ) para ser usada só
dentro da função * % =>, sendo chamada uma vez para cada elemento filtrado. Ao invés de
definir uma nova função de usuário com a instrução *, podemos definir uma função válida
somente enquanto durar a execução do * % =>. Não é necessário nem nomear tal função, sendo,
portanto chamada de função anônima ou função .
Definimos uma função anônima que recebe um parâmetro de entrada (a variável -) e retorna o
resultado da operação relacional - R B: ou ' %" .
Podemos também usar uma função no exemplo mostrado para a função ) =>;
No código acima, definimos uma função anônima que recebe dois parâmetros de entrada e
retorna a soma deles.
É claro que, para realizar a soma de todos os elementos de uma sequência, é muito mais simples
utilizarmos a função " =>:
# Calcula o fatorial de n
>>> def fatorial(n):
... return reduce(lambda x,y: x*y, range(1,n+1))
...
>>> print fatorial(6)
720
>>>
Função que retorna um iterador de tuplas. Iteraveis podem ser listas, strings, dicionários e
definições do usuário (objetos com o método __iter__).
Exemplo:
Desembrulhando as tuplas: vimos como compactar valores, agora vamos descompactá7los, usando
o caractere * com a função L &=>.
>>> z = zip([1,2,3],['a','b','c'],['#','*','$'])
>>> a,b,c = zip(*z)
>>> a,b,c
((1, 2, 3), (‘a’, ‘b’, ‘c’), (‘#’, ‘*’, ‘$’))
>>>
Exercício:
1. Defina uma função Python * , )) = > para calcular e mostrar a série de Fibonacii com
termos até n, não usando/usando expressões % , .
Retornam iteradores
&
&
&
A maneira mais simples de produzir uma saída na tela é usando a instrução & , na qual se pode
passar zero ou mais expressões separadas por vírgulas. Essa função converte as expressões numa
e grava o resultado na saída padrão, da seguinte forma:
>>> print "Python é uma grande linguagem de programação, ", "não é mesmo?"
Isso produz o seguinte resultado em seu dispositivo padrão de saída de dados (tela):
O Python também fornece duas funções internas para ler uma linha de texto da entrada de dados
padrão (teclado). Essas funções são: 1K & => e & => (vistas anteriormente).
Até agora fizemos leituras e escritas em entrada e saída padrões. Agora, vamos usar arquivos de
dados reais. O Python fornece funções básicas e métodos necessários para manipular arquivos.
Podemos fazer a maior parte da manipulação de arquivos usando um objeto de arquivo (* % ).
Atributos do objeto * % : Depois que um arquivo é aberto tem7se um objeto * % , pelo qual se pode
obter várias informações relacionadas ao arquivo aberto.
Métodos do objeto * % :
O método )% " => libera qualquer informação não escrita e fecha o objeto * % , após o qual
nenhuma escrita mais pode ser feita. O Python fecha automaticamente um arquivo quando o
objeto de referência de um arquivo é reatribuído a outro arquivo. É uma boa prática usar o
método )% " => para fechar um arquivo.
objeto_arq.close()
Exemplo:
Resultado:
O método 1 => grava qualquer num arquivo aberto. É importante observar que as
Python podem ter dados binários e não apenas texto. O método 1 => não adiciona um
caractere de nova linha ('\n') ao final da .
objeto_arq.write(string)
Exemplo:
# abre um arquivo
fo = open("qq.txt", "wb")
fo.write("Python é uma grande linguagem.\nNão é mesmo?\n")
# fecha o arquivo aberto
fo.close()
O método % => lê a primeira linha de um arquivo (isto é, até encontrar um caracter linha7
nova ( ) ou um caracter EOF ( >5 > ) no caso do arquivo ter apenas uma linha, e
retorna uma .
varstr = objeto_arq.read(quantidade_bytes)
varstr = objeto_arq.readline([quantidade_bytes])
Exemplo:
fo = open("qq.txt", "r+") # abre o arquivo "qq.txt" p/ leitura e
gravação
msg = fo.read(25)
print "String lida: ", msg
fo.close() # fecha arquivo aberto
String lida: Python é uma grande ling
O método %%=> informa a posição atual dentro do arquivo. Em outras palavras, a próxima leitura
ou gravação ocorrerá naquela quantidade de bytes a partir do início do arquivo.
O método " N= **" [, * ]> altera a posição atual do arquivo. O parâmetro **" indica o
número de bytes a serem movidos. O parâmetro * especifica a posição de referência de onde
os bytes devem ser movidos: B (padrão) significa usar o início do arquivo como posição de
referência; 8 significa usar a posição atual como a posição de referência e; 4, significa que a
referência será o final do arquivo.
objeto_arq.tell()
objeto_arq.seek(100)
Exemplo:
fo = open("qq.txt", "r+")
msg = fo.read(10) # lê apenas 10 bytes
print "String lida: ", msg
posicao = fo.tell() # verifica a posição corrente
print "Posição corrente no arquivo: ", posicao
# Reposiciona o ponteiro no início do arquivo novamente
posicao = fo.seek(0)
msg = fo.read(50)
print "Denovo, a String lida: ", msg
# Close opend file
fo.close() # fecha arquivo aberto
Exercícios:
1. Fazer um programa para criar uma agenda de compromissos: evento, dia, horário, local, obs
devem ser cadastrados para cada compromisso. Usuário deve conseguir inserir, alterar, excluir
e visualizar compromisso(s) do dia, da semana e do mês.
2. Fazer um programa para cadastrar ofertas de produtos de supermercados, armazenando:
supermercado, produto (categoria, descrição, quantidade, unidade de medida, preço), data.
Usuário deve inserir, alterar, excluir e visualizar oferta(s) do dia, classificadas por categoria.
14. Exceções
Existem pelo menos dois tipos distintos de erros: erros de
sintaxe e exceções.
Erros de sintaxe (ou erros de análise de comandos) são
talvez o tipo mais comum de queixa que você recebe
enquanto ainda está aprendendo Python...
Exemplo:
>>> while True print 'Hello world'
File "<stdin>", line 1
while True print 'Hello world'
^
SyntaxError: invalid syntax
No exemplo anterior, o erro é detectado na palavra7chave print, já que estão faltando dois
pontos (':') depois da constante True.
Mesmo se uma instrução ou expressão estiver sintaticamente correta, ela poderá causar um erro
quando for executada. " ) " - ) são chamados de -) F " e não
são incondicionalmente fatais. A maioria das exceções não é tratada pelos programas, e
resultam em mensagens de erro:
>>> 10 * (1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>>> 4 + spam*3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
-)
É um evento que ocorre durante a execução de um programa e que interrompe o fluxo normal de
execução das instruções do programa. Em geral, quando o interpretador Python encontra uma
situação com a qual ele não pode lidar, ele gera uma exceção. Uma exceção é um objeto Python
que representa um erro. Quando um Python provoca uma exceção, ele deve manipular a
exceção imediatamente, pois caso contrário, ele será encerrado.
-)
Se seu tiver algum código suspeito que possa provocar uma -) , então você pode
defender seu programa colocando o código suspeito em um bloco ;. Depois desse bloco inclua
uma instrução -) & ;, seguida por um bloco de código que manipula o problema da maneira
mais elegante possível.
try:
operação suspeita de provocar erro(s) do seu script
....
except Exception1:
se existir Exception1, então execute este bloco.
except Exception2:
se existir Exception2, então execute este bloco.
....
else:
se não for nenhuma das exceções anteriores, então execute este bloco.
....
- &% :
while True:
try:
x = int(raw_input("Entre um valor numérico inteiro: "))
break
except ValueError:
print "Oops! Isso não é um número inteiro. Tente novamente..."
- &% : Tentativa de abrir um arquivo inexistente para leitura, para gerar uma exceção.
try:
arq = open("arqfantasma.txt", "r")
arq.read(10)
except IOError:
print "Erro: não pode encontrar arquivo, ou os dados de leitura."
else:
print "Conteúdo lido do arquivo com sucesso."
arq.close()
Esse tipo de instrução 3 -) & captura todas as exceções que ocorrem. A utilização desse tipo
de instrução 3 -) & não é considerada uma boa prática de programação, justamente por ela
capturar todas as exceções, e não ajudar o programador a identificar a causa do problema que
está ocorrendo...
Você pode usar um bloco * %% : junto com um bloco ;. O bloco * %% é o lugar para se
colocar qualquer código que deve ser executado de qualquer forma, quer o bloco de teste ( )
tenha gerado uma exceção ou não.
try:
arq = open("arqteste.txt", "w")
arq.write("Teste de gravação em arquivo p/ tratamento de exceção!!")
finally:
print "Erro: arquivo ou dados não localizados!!"
Quando uma exceção é lançada por uma instrução dentro do bloco , a execução passa
imediatamente para o bloco * %% e depois a exceção é levantada novamente e é tratada nas
instruções -) & se presentes na próxima camada superior da instrução 3 -) & .
try:
arq = open("arqteste.txt", "w")
try:
arq.write("Teste de grav. em arquivo p/ tratamento de exceção!!")
finally:
print "Indo fechar o arquivo..."
arq.close()
except IOError:
print "Erro: não pode encontrar arquivo, ou os dados de leitura."
Você pode gerar exceções arbitrariamente, ou seja, quando você precisar, e de várias maneiras
usando a instrução " .
raise [exc [, args [, traceback]]]
Exc é o tipo de exceção (por exemplo, ! ) e args são os possíveis argumentos da exceção
(opcionais 7 se não for fornecido, o argumento da exceção será ! ). O argumento final,
traceback, também é opcional (e raramente usado na prática) e, se presente, é o objeto #
usado na exceção.
- &% : Uma exceção pode ser uma , uma classe ou um objeto. A maioria das exceções
que o núcleo do Python gera são classes, com um argumento que é uma instância da classe. Definir
novas exceções é muito fácil e pode ser feito da seguinte maneira:
def nomeFuncao(nivel):
if nivel < 1:
raise Exception("Nível não permitido!")
# O código abaixo disto não será executado se a exceção for gerada
6 -) # ! ) < )
1 -) & Classe base para todas as exceções
2 StopIteration O método - => de um iterador não aponta para nenhum objeto.
3 SystemExit Função " "6 - =>.
4 Classe base para todas as exceções internas, exceto & e
" - .
5 . ) Classe base para todos os erros que ocorrem no cálculo numérico.
6 OverflowError Um cálculo excede o limite máximo de um tipo numérico.
7 FloatingPointError Um cálculo de ponto flutuante falha.
8 ZeroDivisionError Uma divisão ou módulo por zero (para todos os tipos numéricos).
9 AssertionError Em caso de falha da declaração do ."" .
10 AttributeError Em caso de falha de referência a atributo.
11 EOFError Não há entrada para função 1K & => ou & => e o final do arquivo
é atingido.
12 ImportError Uma declaração de importação falha.
13 KeyboardInterrupt O usuário interrompe a execução do programa: [Ctrl]+[C].
14 N & Classe base para todos os erros de pesquisa.
15 IndexError Um índice não é encontrado em uma sequência.
16 KeyError A chave especificada não é encontrada no dicionário.
17 NameError Um identificador não é encontrado no espaço de nomes local/global.
18 UnboundLocalError Ao tentar acessar uma variável local em uma função ou método, mas
nenhum valor foi atribuído a ela.
19 ! Classe base p/ todas exceções que ocorrem fora do ambiente Python.
20 IOError Uma operação de entrada/saída falha, como a instrução & ou a
função & => ao tentar abrir um arquivo que não existe.
21 IOError Por erros relacionados ao sistema operacional.
22 SyntaxError Há um erro na sintaxe do Python.
23 IndentationError O recuo não é especificado corretamente.
24 SystemError O interpretador encontra um problema interno, mas quando esse erro é
encontrado, o interpretador Python não sai.
25 SystemExit O interpretador Python é encerrado usando a função " "6 - =>. Se não
for tratado no código, faz com que o intérprete saia.
26 TypeError Uma operação/função tentada é inválida para o tipo de dado indicado
27 ValueError A função interna de um tipo de dado possui o tipo válido de
argumentos, mas os argumentos têm valores inválidos especificados.
28 RuntimeError Um erro gerado não se enquadra em nenhuma categoria.
29 NotImplementedError Um método abstrato de uma classe herdada não foi implementado.
As afirmações são executadas pela instrução "" , a mais nova palavra7chave para o Python,
introduzida na versão 1.5. Os programadores costumam colocar afirmações no início de uma
função para verificar se há uma entrada válida e depois de uma chamada de função para
verificar se a saída é válida.
Quando uma declaração de afirmação ( "" expressão) é encontrada, o Python avalia sua
expressão (espera7se que o resultado dessa avaliação seja ! para que o fluxo de
execução siga normalmente). Se a expressão for * %" , o Python gerará a exceção $ .
As exceções $ podem ser capturadas e tratadas como qualquer outra exceção usando
a instrução 3 -) & , mas se não forem tratadas, elas encerrarão o programa e produzirão um
#.
- &% : Dado uma função que converte temperatura de graus Kelvin para graus Fahrenheit.
Como zero grau Kelvin é definido como a temperatura mais baixa, a função não deve aceitar
uma temperatura negativa.
def Kelvin2Fahrenheit(Temperature):
assert (Temperature >= 0),"Mais frio que o zero absoluto?!"
return ((Temperature-273)*1.8)+32
print Kelvin2Fahrenheit(273)
print int(Kelvin2Fahrenheit(505.78))
print Kelvin2Fahrenheit(-5)
- &% :
def div(p,q):
assert q!=0
return p/q
>>> div(2,3)
0.6666666666666666
>>> div(2,0)
Traceback (most recent call last):
File “<pyshell#7>”, line 1, in <module>
div(2,0)
File “<pyshell#5>”, line 2, in div
assert q!=0
AssertionError
>>>
- )$) ":
1. Crie uma função que converta temperaturas em Kelvin para Celsius, tal como no exemplo
anterior.
2. Crie uma função que calcule a velocidade média de um automóvel, dados a distância (m) e o
tempo (s) gasto para percorrê7la. Use afirmação.
Podemos acessar esses elementos usando a sintaxe do ponto “.” para separar os nomes do módulos de
seus componentes. Alguns desses elementos referem7se a simples valores (constantes), tal como 6& ,
6 , enquanto outros elementos referem7se a funções, tal como 6% =>2 6"Q =>2 666:
Se você não souber o que faz uma determinada função, então peça ajuda ao interpretador, usando a
função %&=>:
>>> help(math.log)
Help on built-in function log in module math:
log(...)
log(x[, base])
% &(
Se soubermos os nomes das funções em que serão usadas com frequência, podemos importá7las com
um (apelido) mais curto para economizar digitação (embora nesse caso o módulo " " já seja uma
palavra bem curta).
Não seria ótimo se pudéssemos nos referir a todas as variáveis do módulo usando apenas os nomes
delas? Ou seja, se pudéssemos nos referir ao número pi apenas citando & em vez de 6& ou 6& ?
Boas notícias: podemos fazer isso. Veja um exemplo disso a seguir:
O comando & T torna todas as variáveis do módulo acessíveis diretamente (sem qualquer prefixo
com ponto). Más notícias: alguns puristas podem reclamar de você por fazer isso.
Esse tipo de "importação com estrela (asterisco)" pode ocasionalmente levar a situações estranhas e
difíceis de depurar (corrigir).
O problema neste caso específico é que os módulos e & têm funções de logaritmo com o
mesmo nome: % , porém com semânticas diferentes. Porque nós importamos & por último, sua função
% sobrescreveu a função % importada do módulo .
Um boa prática de programação, adotada pelos profissionais da área, é importar apenas as variáveis
(constantes e funções) específicas de cada módulo que serão necessárias no seu código ( ):
Então, se nós importamos & como acima, então para chamar uma função no "submódulo"
será preciso o uso de dois pontos:
*
No item anterior vimos que ao chamar uma função & sempre teremos um arranjo ( ) como
retorno. Nós nunca vimos algo assim antes (não neste curso de qualquer forma). Mas não entre em pânico:
temos três funções incorporadas para nos ajudar nessa questão.
>>> type(lancamentos)
<type 'numpy.ndarray'>
>>>
ravel(...)
a.ravel([order]) --> Return a flattened array.
Refer to 'numpy.ravel' for full documentation.
See Also
--------
numpy.ravel : equivalent function
ndarray.flat : a flat iterator on the array.
>>>
>>> # Ok, o que há para saber sobre numpy.ndarray
>>> help(lançamentos)
Help on ndarray object:
class ndarray(builtins.object)
| ndarray(shape, dtype=float, buffer=None, offset=0,
| strides=None, order=None)
|
| An array object represents a multidimensional, homogeneous array
| of fixed-size items. An associated data-type object describes the
...
>>>
O é um pacote fundamental para computação científica com o Python. Ele contém, entre
outras coisas:
• Um poderoso objeto de D 3 " %
• Funções sofisticadas ( )
• Ferramentas para )/ " O SS '
• Pacotes de funções para X% , , "* ' e geração de G "
% / ".
Além do óbvio uso científico, o também pode ser usado como um contêiner
multidimensional eficiente para dados genéricos. Tipos de dados arbitrários podem ser definidos.
Isso permite ao fácil e rápida integração a uma ampla variedade de bancos de dados. A
seguir veremos como usar o pacote & para manipulação básica de arranjos ( ).
Primeiro, precisamos importar & , para só então poder usar suas classes, funções e demais
recursos.
>>> import numpy as np
>>>
Agora, vamos alterar a forma do vetor na memória (a função " . " altera a forma da matriz na
memória, ao contrário de " " que só muda a forma na apresentação da informação).
>>> x.resize(5,3)
>>> x
array([[ 1. , 1.5, 2. ],
[ 2.5, 3. , 3.5],
[ 4. , 4.5, 5. ],
[ 5.5, 6. , 6.5],
[ 7. , 7.5, 8. ]])
>>>
>>> y = np.ones((4,4))
>>> y
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
>>> z = np.zeros((3,2))
>>> z
array([[ 0., 0.],
[ 0., 0.],
[ 0., 0.]])
>>>
Criando um + via repetição de lista e outro usando função & => (de repetição):
>>> r1 = np.array([1,2,3]*6)
>>> a = np.random.rand(2,3)
>>> a
array([[ 0.15472392, 0.11692319, 0.35272142],
[ 0.84370634, 0.43836276, 0.5290161 ]])
>>> b = np.random.rand(2,3)
>>> b
array([[ 0.88079953, 0.85233273, 0.9430226 ],
[ 0.34204979, 0.30754441, 0.98637748]])
>>>
Agora, horizontalmente:
>>> a
array([[1, 2],
[3, 4]])
>>> b = -a
>>> b
array([[-1, -2],
[-3, -4]])
>>> a + b
array([[0, 0],
[0, 0]])
>>> a * b
array([[ -1, -4],
Multiplicação matricial:
>>> a.dot(b)
array([[ -7, -10],
[-15, -22]])
>>>
Transposição matricial:
>>> a.T
array([[1, 3],
[2, 4]])
>>>
>>> a.dtype
dtype('int32')
>>> b.dtype
dtype('int32')
>>>
>>> c = a.astype('f')
>>> c
array([[ 1., 2.],
[ 3., 4.]], dtype=float32)
>>> print c
[[ 1. 2.]
[ 3. 4.]]
>>>
Agora, vamos ver algumas funções matemáticas aplicadas aos elementos de uma matriz,
começando pela soma, depois valores máximo e mínimo, e por fim a média:
>>> a.sum()
10
>>> a.max()
4
>>> a.min()
1
>>> a.mean()
2.5
>>>
>>> d = np.arange(25)
>>> d
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24])
>>> d.reshape(5,5)
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
>>> d.shape
(25,)
>>>
>>> d = np.arange(25)
>>> d
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24])
>>> d.resize(5,5)
>>> d
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
>>> d.shape
(5,5)
>>>
Acessando a quarta e quinta colunas da quarta linha da matriz . Observe que a numeração das
linhas e colunas começam em 0 (zero):
>>> d[3,3:5]
array([18, 19])
>>>
Criando uma matriz 3x3 preenchida com números inteiros aleatórios entre 5 e 20:
>>> e = np.random.randint(5,20,(3,3))
>>> e
array([[14, 5, 18],
[19, 18, 10],
[18, 5, 19]])
>>>
Muito bem, até agora vimos como criar, como acessar e como manipular arranjos numéricos
(vetores e matrizes) em & . Na próxima seção, veremos os pacotes SCIPY, MATPLOTLIB e
PANDAS, todos construídos a partir do pacote & .
O pacote # &% % , é um pacote que permite a apresentação de dados na forma gráfica. Possui
uma extensa gama de tipos de gráficos, muito útil também na exibição de sinais contínuos e
discretos.
O pacote " facilita muito a manipulação e análise de dados em Python, além de oferecer
estruturas de dados e operações para tabelas numéricas e séries temporais.
1 1 2
- )$) : Dada a seguinte matriz A, gere sub_A e a inversa de A (A71): = 3 5 8
13 21 34
Sub_A
Para processar a fase use a função % e 1 &. Além disso, as funções % "& ) e % "& )
retornam amostras igualmente espaçadas em uma escala linear ou logarítmica.
Por fim, é útil estar ciente dos recursos de indexação do & . Deve7se mencionar a função
" % ) que estende a funcionalidade do 1 para incluir várias condições e várias opções.
>>> select(listacond, listaescolha, default = 0).
" % ) é uma forma vetorizada da declaração * múltipla. Permite a construção rápida de uma
função que retorna uma matriz de resultados com base em uma lista de condições. Cada elemento
>>> y = np.r_[-2:5]
>>> x
array([-2, -1, 0, 1, 2, 3, 4])
>>> np.select([y > 3, y >= 0], [-3, y+2])
array([ 0, 0, 2, 3, 4, 5, -3])
>>>
Algumas outras funções úteis também podem ser encontradas no módulo ") & 6 "). Por exemplo:
* ) % e ) , que calculam o fatorial %! e a quantidade de combinações (sem considerar a
%!
ordem dos elementos) '(,) = * , =
+
2 usando aritmética inteira exata (graças ao objeto
-!.%/-0!
inteiro , ) ou usando a precisão de ponto flutuante e a função Gama.
Simples
Permutação
Com
Todos
repetição
Organizar
elementos Arranjo A.B.C≠A.B.C≠
diferentes (com ordem) B.C.A≠C.B.A...
Alguns
Combinação A.B.C=A.B.C=
(sem ordem) B.C.A=C.B.A...
- &% 38: Seja o conjunto Z = {A, B, C, D}. Quantos grupos podem ser formados agrupandos os
elementos de Z, de 2 em 2, sem levar em consideração a ordem dos elementos (os grupos não
podem ter os mesmos elementos, ainda em que em posições distintas).
4 4! 4.3.2! 12
'1,2 = * , = = = = 6 grupos
2 2! .4 3 20! 2! 2! 2
>>> import scipy.misc as sm
>>> print sm.comb(4,2)
6.0
>>>
- &% 34: Quantas apostas de seis números da MegaSena são necessárias para garantir a
premiação (acerto das seis dezenas)?
60! 60.59.58.57.56.55.54!
'=>,= = * ,
60
50.063.860 apostas
6 6! .60 3 60! 6! 54!
Existem algumas instâncias de classe que fazem uso especial da funcionalidade do fatiamento
( ) para fornecer meios eficientes na construção de arranjos (vetores, matrizes). Vamos ver a
operação das funções &6 , &6 , &6 K e &6)K na construção rápida de arranjos.
Essa forma facilita a digitação e torna o código mais legível. Observe como os objetos são
concatenados e a sintaxe de fatiamento é usada para construir intervalos. Outro termo que
merece explicação é o número complexo 8BD usado como o tamanho do passo na sintaxe do
fatiamento. Esse uso não padrão permite que o número seja interpretado como o G
& " a serem produzidos no intervalo, ao invés de um & "" . Esse uso não padrão
pode ser desagradável para alguns, mas dá ao usuário a capacidade de construir rapidamente
vetores complicados de uma forma muito legível. Quando o número de pontos é especificado
dessa maneira, o ponto final é inclusivo.
A letra " " significa ) ) % ( ,), porque se os objetos entre vírgulas forem
matrizes bidimensionais, eles serão empilhados por linhas (e, portanto, devem ter colunas
proporcionais). Existe um comando equivalente )K que empilha arrays bidimensionais por colunas
() ) ) % ( )), mas funciona de forma idêntica ao K para arranjos
unidimensionais.
# % "= ">
Uma instância da classe nd_grid, A C2 no seu caso mais simples, é usada para construir
intervalos de faixas unidimensionais como substituta conveniente à função . Também usa
números complexos na indicação do tamanho do passo para indicar o número de pontos a serem
colocados entre os pontos inicial e final (inclusivos). O propósito real dessa função, entretanto, é o
de produzir grades !7dimensionais que forneçam matrizes de coordenadas para um volume !7
dimensional. A maneira mais fácil de entender isso é com um exemplo de uso da função:
>>> np.mgrid[0:5,0:5]
array([[[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[2, 2, 2, 2, 2],
[3, 3, 3, 3, 3],
[4, 4, 4, 4, 4]],
[[ 0. , 1.66666667, 3.33333333, 5. ],
[ 0. , 1.66666667, 3.33333333, 5. ],
[ 0. , 1.66666667, 3.33333333, 5. ],
[ 0. , 1.66666667, 3.33333333, 5. ]]])
>>>
Ter matrizes de malha como esta é, por vezes, muito útil. No entanto, nem sempre é necessário
avaliar algumas funções !7dimensionais numa grade, devido às regras de transmissão de arranjos
do & e do ) . Se este for o único propósito da geração de uma grade de malha, então
você deve usar a outra instância da classe nd_grid, A C que gera uma grade “aberta”
(esparsa) usando 1 - " para criar ! matrizes !7dimensionais, onde somente uma dimensão em
cada arranjo tem comprimento maior que 1. Isso economiza memória e produz o mesmo resultado
se a única finalidade da grade de malha for gerar pontos de amostra para avaliação de uma
função !7dimensional.
% Y "
A outra maneira de lidar com polinômios é como vetor de coeficientes, com o primeiro elemento da
matriz fornecendo o coeficiente de maior potência, usando o submódulo % % do &
(forma mais recente). Existem funções explícitas para adicionar, subtrair, multiplicar, dividir,
integrar, diferenciar e avaliar polinômios representados como sequências de coeficientes.
O fornece uma classe vetorizada para converter uma função Python comum, que aceita
escalares e retorna escalares, em uma “* ! L ” com as mesmas regras de transmissão
que outras funções & (ou seja, as funções Universais ou * )"). Por exemplo, suponha que
você tenha uma função Python chamada " " , definida como:
>>> def somasubtrai(a,b):
... if a > b:
... return a - b
... else:
... return a + b
>>>
que define uma função que atua em duas variáveis escalares e retorna um resultado escalar. A
classe ! ) L pode ser usada para “vetorizar” esta função:
>>> vec_somasubtrai = np.vectorize(somasubtrai)
Retorna uma função que recebe argumentos matriciais e retorna um resultado matricial:
>>> vec_somasubtrai([0,3,6,9],[1,3,5,7])
array([1, 6, 1, 2])
>>>
Esta particular função poderia ter sido escrita em forma vetorial sem o uso de ! ) L . No
entanto, funções que empregam rotinas de otimização ou integração provavelmente só podem ser
vetorizadas usando ! ) L .
Observe a diferença entre &6 ") &% -/ &6 " % e &6 ") &% - ,D/ &6 " % ,D. As funções
&6 ") &% -/ &6 " % são baseadas em matrizes e retornam matrizes de uns e zeros fornecendo
o resultado do teste elementar. As funções &6 ") &% - ,D/ &6 " % ,D são baseadas em
objetos e retornam um escalar descrevendo o resultado do teste em todo o objeto.
Para verificar se um número é ou não escalar ((% ) , *% ,) &% - ou matriz de rank470) use
a função &6 "") % que retorna 1 ou 0.
Para garantir que objetos sejam do tipo & existe um dicionário de funções no )
específicas para isto: &6) " . As chaves do dicionário são os tipos de dados para os quais se
deseja a conversão e os valores do dicionário armazenam funções para executar as conversões.
>>> np.pi
4 Posto ou Característica de uma matriz 7 número de linhas ou colunas linearmente independentes da matriz.
- )$) : Criar uma matriz 4x4 e rotacioná7la para direita e para baixo.
from numpy import arange, roll, copy
# Solução Perigosa: desenvolver código para a tarefa
def rotacDir(A):
ult = A.shape[1]-1 # qtde de colunas
vc = copy(A[:,ult]) # preserva a última coluna
for i in range(ult,0,-1):
A[:,i] = A[:,i-1] # coluna à direita recebe coluna à esquerda
A[:,0] = vc # primeira coluna recebe últ. coluna preservada
return A
def rotacAbaixo(A):
ult = A.shape[0]-1 # qtde de linhas
vl = copy(A[ult,:]) # preserva a última linha
for i in range(ult,0,-1):
A[i,:] = A[i-1,:] # linha debaixo recebe linha acima
A[0,:] = copy(vl) # primeira linha recebe última linha preservada
return A
% " , ":
Funções:
- array()
- arange(), linspace()
- zeros(), ones(), eye()
- repeat()
- vstack(), hstack()
- roll()
- poly1d()
Atributos:
- shape
- dtype
- T
Métodos:
- reshape()
- resize()
- dot()
- astype()
- sum(), min(), max(), mean()
- transpose()
Subpacote:
Funções:
- random.rand()
- random.randint()
L )&
,& ) ")
)% " Algoritmos de agrupamento
) " " Constantes físicas e matemáticas
** & )N Rotinas de transformada rápida de Fourier
Integração e solucionadores de equação diferencial ordinária
& % Interpolação e suavização Splines
Entrada e saída
% % Álgebra Linear
") Funções diversas: factorial, comb, lena, ...
Processamento de imagem N7dimensional
Regressão de distância ortogonal
& L Rotinas de optimização e localização de raízes
" % Processamento de sinais
"& " Rotinas de matrizes esparsas e associadas
"& % Algoritmos de estruturas de dados espaciais
"& ) % Funções especiais
" " Funções e distribuições estatísticas
O submódulo ") tem funções diversas, inclusive uma função que retorna uma imagem comum
usada no processamento de imagens: % .
A análise de Fourier é um método usado para expressar um sinal como uma soma de componentes
periódicas e para recuperar o sinal desses componentes. Quando o sinal e sua transformada de
Fourier são substituídos por contrapartes discretizadas, ela é chamada de "* ")
' (DFT).
A DFT se tornou um dos pilares da computação numérica, em parte devido a um algoritmo muito
rápido de calculo, chamado ' " ' "* (FFT)5, que já era conhecido por Gauss (1805)
e foi trazido à luz, em sua forma atual, por Cooley e Tukey (1965).
5 Usuários para quem a velocidade das rotinas FFT é crítica devem considerar a instalação do pacote PyFFTW.
Filtragem
Filtragem é um nome genérico dado à operação realizada por qualquer sistema que modifica um
sinal de entrada de alguma forma. No ) & um sinal pode ser visto como um arranjo ( )
& (vetor ou matriz).
Existem diferentes tipos de filtros para diferentes tipos de operações e, em geral, eles estão
divididos em duas grandes categorias de operação de filtragem: linear e não linear. ' % "
% " podem sempre ser reduzidos a uma multiplicação de matrizes & achatadas (todos
os elementos da matriz são colocados numa única linha) por uma matriz resultante apropriada em
outra matriz & achatada.
É claro que isto não é usualmente a melhor forma para calcular o filtro, pois as matrizes e vetores
envolvidos podem ser enormes. Por exemplo, a filtragem de uma imagem 512x512 com este
método precisaria da multiplicação de uma matriz 5122x5122 por um vetor de 5122 elementos.
Apenas o armazenamento dessa matriz Numpy padrão, seriam necessários 68.719.476.736
elementos (68 bilhões). Usando armazenamento de 4 bytes por elemento (valor de precisão
simples) seriam necessários mais de 256 GB de memória. Na maioria das aplicações os elementos
dessa matriz são nulos e um método diferente para cálculo da saída deve ser empregado.
Convolução/Correlação
L = E + . ℎ[ − +]
)K/N
L[ ] = E [+]. ℎ[ − +]
)KRVW((/X,>)
O flag permite especificar qual parte do sinal de saída será retornada. O valor padrão
* %% retorna o resultado cheio, ou seja, todos os valores calculados na convolução (inclusive nulos).
Se o for " , somente os O valores centrais serão retornados, começando em
O segundo flag "método", opcional, determina como a convolução é computada, seja através da
abordagem da transformada de Fourier com ** ) ! %! ou através do método direto.
Normalmente é selecionado o método esperado mais rápido. O método da transformada de
Fourier tem ordem \(D. ] D) enquanto o método direto tem ordem \(D 2 ). Dependendo da
constante \ e do valor de D, um desses métodos pode ser mais rápido. O valor padrão "auto"
executa um cálculo aproximado e escolhe o método esperado mais rápido, enquanto os valores
"direto" e "fft" forçam a computação com os outros dois métodos. O código abaixo mostra um
exemplo simples de convolução de 2 sequências:
>>> x = np.array([1.0, 2.0, 3.0])
>>> h = np.array([0.0, 1.0, 0.0, 0.0, 0.0])
>>> signal.convolve(x, h)
array([ 0., 1., 2., 3., 0., 0., 0.])
>>> signal.convolve(x, h, 'same')
array([ 2., 3., 0.])
Essa mesma função ) ! %! pode, na verdade, usar matrizes !7dimensionais como entradas e
retornar a convolução !7dimensional das duas matrizes, conforme mostrado no exemplo seguinte.
Os mesmos de entrada também estão disponíveis para esse caso.
>>> x = np.array([[1.,1.,0.,0.],[1.,1.,0.,0.],[0.,0.,0.,0.],[0.,0.,0.,0.]])
>>> h = np.array([[1.,0.,0.,0.],[0.,0.,0.,0.],[0.,0.,1.,0.],[0.,0.,0.,0.]])
>>> signal.convolve(x, h)
array([[ 1., 1., 0., 0., 0., 0., 0.],
[ 1., 1., 0., 0., 0., 0., 0.],
[ 0., 0., 1., 1., 0., 0., 0.],
[ 0., 0., 1., 1., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0.]])
A correlação é muito semelhante à convolução, troca7se apenas o sinal de menos por um mais.
Portanto, a correlação cruzada dos sinais e L, é dada por:
N
^[ ] = E L[+]. [ + +]
)K/N
Para sinais de comprimento finito com L[ ] = 0 fora do intervalo [0, O] e [ ] = 0 fora do
intervalo [0, Q], o somatório seria:
^[ ] = E L[+]. [ + +]
)KRVW((/X,>)
A função ") & 6) % => implementa a correlação. equivalentes aos da função ) ! %! =>
estão disponíveis para esta operação para retornar a sequência completa de comprimento
O + Q + 1 (* %%) ou uma sequência com o mesmo tamanho da maior sequência iniciando em
^[−O + ⌊Q − 1⌋⁄2] (" ) ou uma sequência onde os valores dependem de todos os valores da
menor sequência (! % ). Esta opção final retorna os K − M + 1 valores da sequência ^[Q − O]
até ^[0], inclusive.
Quando D = 2, correlacionar e/ou convoluir pode ser usado para construir filtros de imagem
arbitrários para executar ações como desfoque, melhoramento e detecção de borda para uma
imagem.
import numpy as np
from scipy import signal, misc
import matplotlib.pyplot as plt
guaxinim = misc.face(gray=True)
filtro = np.zeros((50, 50))
filtro[0][0] = 1.0
filtro[49][25] = 1.0
guaxfilt = signal.fftconvolve(guaxinim, filtro)
O cálculo da convolução no domínio do tempo, como acima, é usado principalmente para filtrar
quando um dos sinais é muito menor do que o outro (O ≫ Q), caso contrário, a filtragem linear é
calculada com mais eficiência no domínio de frequência, usando a função ** ) ! %! =>. Por
padrão, ) ! %! => estima o método mais rápido usando ) " K) !K ().
import numpy as np
from scipy import signal, misc
import matplotlib.pyplot as plt
imagem = misc.ascent()
filtro = signal.gaussian(10, 10.0)
imgnova = signal.sepfir2d(imagem, filtro, filtro)
plt.figure(); plt.imshow(imagem); plt.gray(); plt.title('Imagem Original')
plt.figure(); plt.imshow(imgnova); plt.gray(); plt.title('Imagem Filtrada')
plt.show()
Trata7se de uma excelente biblioteca para traçado de gráficos de dados científicos em 2D e 3D.
Algumas vantagens desta biblioteca:
• Facilidade de uso e apresentação de dados em forma gráfica;
• Tem suporte a etiquetas e textos formatados em LaTeX;
• Pode7se controlar todos os elementos da figura, incluindo tamanho e DPI6;
• Saída de alta qualidade em vários formatos, incluindo PNG, PDF, SVG, EPS;
• GUI para explorar figuras de modo interativo, e suporte à geração de arquivos de
figuras sem cabeçalhos (útil para trabalhos com de lotes de comandos 7 ).
Uma das principais características do &% % , é que todos os aspectos da figura podem ser
controlados via programação (ou seja, sem precisar usar a GUI). Isso é importante para a
reprodutibilidade, e conveniente quando é necessário regerar a figura com dados atualizados ou
alterar sua aparência.
Visite matplotlib.org/gallery.html para ver diversos gráficos gerados por essa biblioteca.
: ', ))
Modela a criação de coelhos a partir de um casal desses animais.
def fibonacci(n):
seq = zeros(n)
seq[1] = 1
for i in range(2,n):
seq[i] = seq[i-1] + seq[i-2]
return seq
plt.plot(fibonacci(10))
plt.bar(range(10),fibonacci(10))
plt.show()
x = np.linspace(0, 1, 20)
y = np.cos(x) + 0.3*np.random.rand(20)
p = np.poly1d(np.polyfit(x, y, 3))
print p
t = np.linspace(0, 1, 200)
plt.plot(x, y, 'o', t, p(t), '-')
plt.show()
>>>
3 2
0.847 x - 1.371 x + 0.08229 x + 1.211
, / % & &%
Ele fornece uma interface de procedimentos e rotinas para a biblioteca de plotagem orientada a
objetos, &% % ,. Ele é modelado para imitar os comandos gráficos do Matlab™. A maioria dos
comandos em pyplot possui argumentos semelhantes e análogos aos do Matlab™.
import numpy as np
plt.plot(x, s)
plt.plot(x, c)
plt.show()
pi = np.pi
plt.xticks([-pi, -pi/2, 0, pi/2, pi])
plt.yticks([-1, 0, +1])
" - " L % ! ) %( )
Os eixos são linhas que conectam as marcas dos eixos até os limites da área de dados. Eles
podem ser colocados em posições arbitrárias e até agora, eles estavam nas fronteiras da figura.
Vamos colocá7los no meio do gráfico. Como há quatro deles (superior/inferior/esquerda/direita),
descartamos a parte superior e a direita, definindo a cor deles como ? ? (nenhuma). Movemos
a parte inferior e a esquerda para a origem nas coordenadas do espaço de dados.
ax = plt.gca()
# gca é abreviação para 'get current axis'
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom');
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
.) ") %
Vamos inserir uma legenda no canto superior esquerdo, bastando colocar um argumento de
palavra7chave % , % (que será usado na caixa de legendas) aos comandos de plotagem.
plt.legend(loc='upper left')
% "& " (* )
Vamos anotar alguns pontos interessantes usando o
comando . Escolhemos o valor 2π/3 para comentar, tanto na função seno como na
cosseno. Primeiro, desenhamos um marcador na curva e depois uma linha pontilhada. Em seguida,
usamos o comando de anotação para exibir algum texto com uma seta.
t = 2*np.pi/3
plt.plot([t,t], [0,np.cos(t)], color='blue', linewidth=2.5, linestyle="--")
plt.scatter([t,], [np.cos(t),], 50, color='blue')
plt.annotate(r'$sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',
xy=(t, np.sin(t)), xycoords='data',
xytext=(+10, +30), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
plt.annotate(r'$cos(\frac{2\pi}{3})=-\frac{1}{2}$',
xy=(t, np.cos(t)), xycoords='data',
xytext=(-90, -50), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
. " % "
Os rótulos das marcas ficaram pouco visíveis por causa das linhas azul e vermelha. Podemos
aumentá7las e também podemos ajustar suas propriedades de modo que elas sejam renderizadas
em um plano de fundo branco semitransparente. Isso nos permitirá ver os dados e os rótulos.
for rotulo in ax.get_xticklabels() + ax.get_yticklabels():
rotulo.set_fontsize(16)
rotulo.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.65))
Podemos ter mais controle sobre a exibição usando o comando * , " ,&% e - "
explicitamente. Enquanto o " ,&% posiciona os gráficos numa grade regular, o comando - "
permite a colocação livre do gráfico dentro da figura.
Já trabalhamos com figuras e suplots, sem chamá7los explicitamente. Quando usamos &% , o
&% % , chama ) () para obter os eixos atuais, e o comando ) , por sua vez, chama )*()
( ) para obter a figura atual. Se não existir nenhuma figura, ela chama * ()
para criar uma, especificamente falando, para fazer um " ,&% =888>.
' "
Uma figura é a janela na GUI que tem como título “Figure #”. As figuras são numeradas a partir
de 1, em oposição ao modo normal do Python, a partir de 0. Isso mostra claramente o estilo
MATLAB. Existem vários parâmetros que determinam o aspecto da figura:
Assim como acontece com outros objetos, pode7se definir propriedades de figura usando " & ou
com os métodos " K % & & . Quando você trabalha com a GUI, você pode fechar
uma figura clicando no [x], no canto superior direito da janela. Mas você pode fechar uma figura
programaticamente chamando o método )% " . Dependendo do argumento, ele fecha:
(1) a figura atual (sem argumento),
(2) uma figura específica (número da figura como argumento) ou
(3) todas as figuras (" %%" como argumento).
plt.close(1) # fecha a figura 1
- "
Os eixos são semelhantes aos , mas permitem a colocação de gráficos em qualquer local
na figura. Então, se quisermos colocar um gráfico menor dentro de um maior, fazemos isso com os
eixos.
Os localizadores de ticks controlam as posições dos ticks e estão definidos da seguinte maneira:
ax = plt.gca()
ax.xaxis.set_major_locator(eval(locator))
plt.scatter(X,Y)
n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
X, Y = np.meshgrid(x, y)
n = 10
x = np.linspace(-3, 3, 4 * n)
y = np.linspace(-3, 3, 3 * n)
X, Y = np.meshgrid(x, y)
plt.imshow(f(X, Y))
fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
plot(*args, **kwargs)
Plot lines and/or markers to the
:class:`~matplotlib.axes.Axes`. *args* is a variable length
argument, allowing for multiple *x*, *y* pairs with an
optional format string. For example, each of the following is
legal::
Mapas de Cores
O- é uma API7 de análise de dados, orientada a colunas. É uma ótima ferramenta para
manipular e analisar dados de entrada, e é usada por muitos ML8 para tratamento de
dados. Embora uma introdução abrangente à API - certamente teria muitas páginas, os
principais conceitos são bem diretos. Para uma referência mais completa, o site - contém
extensa documentação e muitos tutoriais.
A linha a seguir importa a API Pandas e mostra a versão da API instalada no seu sistema:
'0.15.2'
>>>
Sobre a primeira linha do acima: considerando a versão 2.6+ do Python, você pode
importar a função de impressão do Python73 usando: * KK* KK & & K* ) , com
o objetivo de compatibilizar seu com as futuras versões do Python6
No Python 3, a " de impressão foi alterada para uma * , ou seja, você deve usar:
Isso também funciona no Python 2, desde que você tenha colocado a instrução
* KK* KK & & K* ) no seu script. Lembre7se de que depois dessa instrução a
versão 2.6+ do comando & já não poderá ser mais usada:
Uma maneira de criar uma " é construir um objeto da classe . Por exemplo:
Objetos * podem ser criados passando7se os nomes das colunas numa string de
mapeamento do tipo dicionário ( ) para suas respectivas . Se a série não corresponder em
comprimento, os valores omissos serão preenchidos com valores especiais NA/NaN. Exemplo:
Mas na maioria das vezes, você carrega um arquivo inteiro num * . O exemplo a seguir
carrega um arquivo com dados de habitação da Califórnia. Execute a seguinte célula para
carregar os dados e criar definições de recursos:
median_house_value
count 17000.000000
mean 207300.912353
std 115983.764387
min 14999.000000
25% 119400.000000
50% 180400.000000
75% 265000.000000
max 500001.000000
>>>
O exemplo acima usou ' . ") , => para mostrar estatísticas interessantes sobre um
* . Outra função útil é o ' 6 =>, que exibe os primeiros registros de um
* :
>>> hab_calif_df.head()
longitude latitude housing_median_age total_rooms total_bedrooms \
0 -114.31 34.19 15 5612 1283
1 -114.47 34.40 19 7650 1901
2 -114.56 33.69 17 720 174
3 -114.57 33.64 14 1501 337
4 -114.57 33.57 20 1454 326
Lembrete:
# : substantivo feminino
1. GEOMETRIA: segmento de reta que liga o vértice de um
triângulo retângulo ao meio do lado oposto.
2. ESTATÍSTICA: valor que divide um conjunto de valores
ordenados em partes iguais (o valor do meio de um
conjunto de dados).
>>> hab_calif_df.hist('housing_median_age')
array([[<matplotlib.axes._subplots.AxesSubplot object
at 0x0988C4D0>]], dtype=object)
>>>
Além disso, o - oferece uma API extremamente rica para seleção e indexação avançada
que é muito extensa para ser abordada aqui.
# & % "
Você pode aplicar as operações aritméticas básicas do Python a uma . Por exemplo:
>>> populacao
0 852469
1 1015785
2 485199
dtype: int64
>>> populacao/1000.
0 852.469
1 1015.785
2 485.199
dtype: float64
>>>
Uma " pode ser usada como argumento para a maioria das funções do :
Para transformações mais complexas em coluna única, você pode usar o método "6 &&% .
Assim como a função & do Python, o método "6 &&% aceita como argumento uma função
, que é aplicada a cada valor. O exemplo abaixo cria uma nova que indica se a
população da cidade é superior a um milhão:
- )$) ;
Modifique a tabela de cidades adicionando uma nova coluna booleana que seja verdade (3 )
se, e somente se, as duas opções forem verdadeiras:
A cidade recebeu o nome de um santo.
A cidade tem uma área maior que 50 milhas quadradas.
: As séries booleanas são combinadas usando os operadores bit a bit, em vez dos tradicionais
booleanos. Por exemplo, ao executar a lógica ‘ [ use \ em vez de .
Solução:
] ) "
>>> cidades.index
Int64Index([0, 1, 2], dtype='int64')
>>>
Chame a função ' 6 -=> para reorganizar manualmente as linhas. Por exemplo, o
seguinte comando tem o mesmo efeito da classificação por nome da cidade:
>>> cidades
Nome Cidade Populacao Densidade Populacional Area (milhas2) \
0 Sao Francisco 852469 18187.945381 46.87
1 Sao Jose 1015785 5754.177760 176.53
2 Sacramento 485199 4955.055147 97.92
>>> cidades.reindex(np.random.permutation(cidades.index))
Nome Cidade Populacao Densidade Populacional Area (milhas2) \
1 Sao Jose 1015785 5754.177760 176.53
2 Sacramento 485199 4955.055147 97.92
0 Sao Francisco 852469 18187.945381 46.87
- )$) ;
1. O método de reindexação permite valores de índice que não estão nos valores de índice do
' original. Experimente e veja o que acontece se você usar esses valores! Por que
você acha que isso é permitido?
Solução:
Se o vetor de entrada de reindexação incluir valores que não estão nos valores originais do índice
* , a função - incluirá novas linhas para esses índices "ausentes" e preencherá
todas as colunas correspondentes com valores NaN:
Nesse caso, permitir índices "ausentes" facilita a reindexação usando uma lista externa, já que não
se precisa preocupar7se com a limpeza da entrada.
:== @ =
:== @ = > > > > > >AB ' BCBDEA
:== @ @ = "= @
:== @ = @ = =
:== @ .@ = > = F
:== @ .@ = > = " =
:== @ @ @ = = = ? ? @ F 3 G D H3I-JK
:== @ @ = = > > >A
:== @ @ = = > > " >
:== @ @ = = ? ? @
:== @ @ = = ? " @
:== @ @ = = > > >
:== @ @ = > @
:== @ @ = > > =
:== > @ = = > =
:==9 * @ @ = ? =
:== > @ = = = @ F >
:== > > > @ @ = = = ?LI@ F * > >
> >
M" : -+ $. &
7 POO (classes/objetos)
7 Programação CGI (Web)
7 Acesso a BD
7 Redes
7 Envio de E7mail
7
7 Processamento XML
7 Programação GUI
7 Extensões adicionais ( , C++, Java etc)
Item 8:
1.
# Contando letras de uma palavra
p1 = 'anticonstitucionalissimamente'
p2 = 'pneumoultramicroscopicossilicovulcanoconiótico'
print "Qtde. de letras: p1 = %d, p2 = %d" % (len(p1), len(p2))
2.
# Ocorrências de letras de uma palavra - sol. com lista
ocor = [0]*26
orig = ord('a')
for letra in p1:
ocor[ord(letra) - orig] += 1
for asc,freq in enumerate(ocor):
print "Letra %s = %d" % (chr(asc+ord('a')), freq)
3.