Escolar Documentos
Profissional Documentos
Cultura Documentos
Um curso em programação
Per Kraulis
Desenvolvimento interativo
Ambiente (IDE) para Python
****************************************************************
Personal firewall software may warn about the connection IDLE
makes to its subprocess using this computer's internal loopback
interface. This connection is not visible on any external
interface and no data is sent to or received from the Internet.
****************************************************************
IDLE 2.6.5
>>>
Modo interativo:
- Aguarda comandos do usuário
- Os comandos devem ser válidos no código Python
- Útil para testar e mexer
Tentar os comandos:
- copyright
- credits
- license()
Python em Unix
% python
Python 2.3.3 (#51, Dec 18 2003, 20:22:39).
Type "copyright", "credits" or "license()" for more information.
>>> print “Olá Mundo!"
Olá Mundo!
>>>
Use qulquer editor (vi, ed, emacs, gedit...)para editar e executar arquivos de script
Use o IDLE para editar e executar arquivos de script
% python script.py
.result output.
%
>>> n = 12.0
>>> type(n)
<type 'float'>
Números
Integers: 12 0 -12987 0123 0X1A2
- Type 'int'
- Podem ser maiores que 2**31
- Literais octais começam com 0 (0981 é ilegal!)
- Literais hexadecimais começam com 0X, contem 0-9 e A-F
>>> a=12+5
>>> print a
17
>>> b = 12.4 + a # 'a' convertido para “float” automaticamente
>>> b # utiliza função 'repr'
29.399999999999999
>>> print b # utiliza função 'str'
29.4
Expressões booleanas
‘True' ou ' False' são valores pré-definidos; atualmente inteiros 1 e 0
O Valor 0 é considerado falso, e todos os outros valores verdadeiros
Expressões booleanas operadores usuais: not, and, or
>>> 12<13
True
>>> 12>13
False
>>> 12<=12
True
>>> 12!=13
True
String
>>> a = ‘Olá mundo !'
>>> b = “Olá !"
>>> a == b
True
A lista de processamento quase sempre pode ser usada para fazer a manipulação de strings mais eficiente
Métodos de String
Strings têm um conjunto de métodos de construção
Nunca nenhum método muda a string original
Vários métodos produzem novas strings
Uma lista na página 91 em ‘Aprendendo Python'
>>> r[0:3] = [1, 2, 5, 6] # alterar uma parte da lista; pode mudar o seu comprimento
>>> r
[1, 2, 5, 6, 'word']
>>> r[1:3] = [] # Remover itens de parte da configuração para uma lista vazia
>>> r
[1, 6, 'word']
a
>>> a = [1, 3, 2]
>>> b = a [1, 3, 2]
>>> c = b[0:2]
>>> d = b[:] b
c [1, 3]
d [1, 3, 2]
>>> t = (1, 3, 2)
>>> t[1] # acesso pelo index; início em 0 (zero)
3
>>> r = [1, 3, 2]
>>>
itemsdel r[1] # outra forma de remover a lista
>>> r
[1, 2]
Esquecendo coisas: Coleta de lixo
>>> c = 'Python'
>>> n = 11
>>> "This is a %s course with %i students." % (c, n)
'This is a Python course with 11 students.'
Parte 2:
Fluxos de execução básicos
'if' declaração; estrutura do bloco
A estrutura do bloco é determinada pela indentação
"file t2.py"
person = 'Luke'
if person == 'Per':
status = 'Pythonist'
elif person == 'Luke':
status = 'Jedi knight'
else:
status = 'unknown'
>>> a = [1, 2]
>>> b = [1, 2]
>>> a == b # testa se os valores são iguais
True
>>> a is b # teste se objetos são idênticos
False
>>> a.append(3)
>>> a == b # testa valores novamente
False
Dicionário: às vezes melhores que if... elif.
"file t3.py"
int 0 False
Todos os tipos “built-in’’ podem ser usados
-1 True diretamente em declarações 'if'
124 True
Números com valor zero são falsos
float 0.0 False Todos os outros números são verdadedeiros
list [] False
[False] True !
Declaração 'for'
Repetição de um bloco de declarações
Iteração através de uma sequência (list, tuple, string, iterator)
"file t4.py"
s=0
for i in [0, 1, 2, 3, 4, 5, 6, 7, 8]: # walk through list, assign to i
s=s+i
if s > 10:
break # quit 'for' loop, jump to after it
"file t5.py"
r = []
for c in 'this is a string with blanks': # walks through string, char by char
if c == ' ': continue # skip rest of block, continue loop
r.append(c)
print ''.join(r)
Funções“Built-in”: 'range' and 'xrange'
As funções “Built-in” ‘range' e 'xrange' são úteis com 'for'
'range' cria uma lista
Cuidado: pode usar muita memória; ineficiente!
s=0
for i in xrange(100000):
if i % 19 == 0: # remanescente: divisível com 19?
s=s+i
print s
Declaração 'while'
Repetição de um bloco de declarações
Repete até o teste se tornar falso, ou 'break'
"file t7.py"
r = []
n=0
last = 20
"file t8.py"
for i in r:
if i < 0:
print 'input contains negative value!'
break # this skips out of loop, including 'else'
else:
pass # do-nothing statement
else: # do if loop ended normally
print 'input is OK'
"file t9.py"
numbers = []
not_numbers = []
if a_complicated_expression and
another_complicated_expression:
print ‘isso é uma sintaxe ilegal; isso não irá funcionar'
Alt 1: Use o caracter de continuação '\' como o último
if a_complicated_expression and \
another_complicated_expression:
print ‘isso é uma sintaxe válida'
Alt 2: Coloque a expressão em parenteses
- Linhas em parenteses podem ser quebradas
- Também é verdadeiro para [ ] e { }
if (a_complicated_expression and
another_complicated_expression):
print ‘esta é uma sentença válida'
Parte 3:
Funções
Como definir sua própria função
Use a declaração 'def'
Função do corpo segue; indentada!
Essa é uma declaração como outras
- Pode ser substituída basicamente em qualquer lugar
- Required: Define a função antes de chamá-la
"file t10.py"
Uma função definida pelo usuário tem exatamente o mesmo status que uma
função construída, ou uma função de outro módulo
Argumentos de função: fixos
Número fixo de argumentos
Associados por ordem
"file t11.py"
"file t12.py"
"file t13.py"
"file t14.py"
"file t15.py"
"file t16.py"
a = -5
r = [0, 1, 2]
print 'global original', a, r
test_local(a, r)
print 'global changed ', a, r
"file t17.py"
"file t18.py"
print e, pi
print cos(radians(180.0))
print log(10.0)
print exp(-1.0)
2.71828182846 3.14159265359
-1.0
2.30258509299
0.367879441171
Funções são objetos; nomes e referências
Uma função é somente outro tipo de objeto
Nada mágico sobre os nomes deles; podem ser alterados
"file t19.py"
def print_calc(f):
print "log(%s)=%s, exp(%s)=%s" % (f, log(f), f, exp(f))
print_calc(1.0)
log, exp = exp, log # código horrível! troca os objetos e nomes encaminhados
print_calc(1.0)
log(1.0)=0.0, exp(1.0)=2.71828182846
log(1.0)=2.71828182846, exp(1.0)=0.0
Uma função pode ser passada como qualquer argumento para outra função
Uma função pode ser atribuída à uma variável
Função de construção 'map'
Função de construção que funciona em uma lista
'map‘ requer uma função e uma lista
- A função deve aceitar somente um argumento e retornar um valor
- A função é aplicada para cada valor da lista
- Os valores resultantes retornam em uma lista
>>> r = [0, 1, 2, 3, 4, 5, 6]
>>> def sum(x, y):
return x+y
>>> reduce(sum, r) # (((((1+2)+3)+4)+5)+6)
21
Função de construção 'filter'
Função de construção que funciona em uma lista
'filter' requer uma função e uma lista
Usa a função para decidir quais valores colocar na lista resultante
- Cada valor na lista é dado para a a função
- Se a fução retornar True, então o valor é colocado na lista resultante
- Se a função retornar False, então o valor é ignorado
>>> r = [0, 1, 2, 3, 4, 5, 6]
>>> def large(x):
return x>3
>>> filter(large, r)
[4, 5, 6]
Arquivos: Leitura
O objeto de arquivo é criado pela função de construção 'open'
O objeto de arquivos tem um conjunto de métodos
Os métodos 'read‘ obtém dados sequencialmente a partir do arquivo
- 'read': Obtém o arquivo inteiro (ou N bytes) e volta com uma única string
- 'readline': Lê uma linha (até e incluindo novas linhas)
- 'readlines':Lê todas as linhas e volta como uma lista de strings
stuff
more
and even more
Arquivos: lidos pelo laço 'for'
Iteração usando o laço 'for' no arquivo, lê linha por linha
A melhor maneira de fazê-lo
"file t20.py"
line = infile.readline()
while line: # linha estará vazia somente no final do arquivo
do_something(line)
line = infile.readline()
"file t21.py"
seq = 'cgtaacggtcaggttatattt'
print seq
print revseq
cgtaacggtcaggttatattt
aaatataacctgaccgttacg
Tornar o código mais reutilizável
Como fazer o exemplo de código mais reutilizável?
Passo nº 1: Fazer uma função
"file t22.py"
def reverse_complement(seq):
complist = map(complement_map.get, seq)
complist.reverse()
return ''.join(complist)
seq = 'cgtaacggtcaggttatattt'
print seq
print reverse_complement(seq)
Faça um módulo do código
Como tornar o código mais reutilizável?
Passo nº 2: Fazer um módulo fora dele
Na verdade, já é um módulo!
Vamos simplesmente renomeá-lo como 'ntseq.py'
"""file ntseq.py
def reverse_complement(seq):
"Return the reverse complement of an NT sequence."
complist = map(complement_map.get, seq)
complist.reverse()
return ''.join(complist)
seq = 'cgtaacggtcaggttatattt'
print seq
print reverse_complement(seq)
Como usar o módulo: declaração 'import'
A declaração 'import' faz um módulo disponível
O nome do módulo(não o nome do arquivo) é importado: ignora o '.py'
Acessa recursos do módulo através da notação 'dot'
"file t23.py"
import ntseq
seq = 'aaaccc'
print seq
print ntseq.reverse_complement(seq)
cgtaacggtcaggttatattt
aaatataacctgaccgttacg
aaaccc
gggttt
Problema!!!
Primeiras duas linhas: O código de teste no módulo também foi executado
Módulo de código auto-teste: o truque '__name__'
A declaração 'import‘ executa todos os códigos no arquivo de módulo
Como esconder o código auto-teste?
Use a variável predefinida'__name__':
- Se executada como valor principal: valor '__main__'
- Se executada como módulo: algum outro valor
"""file ntseq_mod.py
def reverse_complement(seq):
"Return the reverse complement of an NT sequence."
complist = map(complement_map.get, seq)
complist.reverse()
return ''.join(complist)
"file t24.py"
seq = 'aaaccc'
print seq
print ntseq_mod.reverse_complement(seq) # nota: ntseq_mod!
aaaccc
gggttt
Como os módulos são buscados no 'import'?
'import' busca nos diretórios listados em sys.path
É usado o primeiro arquivo encontrado 'xxx.py' (onde xxx é o nome importado)
"file t25.py"
import sys
"file t26.py"
import ntseq_mod
print 'after import:', dir()
"file t27.py"
www.python.org
- Ponteiros para outros sites
"file geom1.py: Módulo com classes por formas geométricas, 1st try"
import math
def area(self):
"Return the area of the shape."
return math.pi * self.radius**2
Instâncias de classes
Vamos criar algumas instâncias de classes circulares
Observe o atributo 'radius'
Use o método 'area'
"file t28.py"
i1: 1 3.14159265359
i2: 4 50.2654824574
<geom1.Circle instance at 0x009CEA08>
Circle Circle
i1 x=0 i2 x=3
y=2 y=0
radius=1 radius=4
Mudando uma instância: atribuição de atributos
Os valores dos atributos podem ser modificados
Simplismente atribuindo ao atributo um outro valor
"file t29.py"
i1 = Circle(0, 2)
print 'i1:', i1.radius, i1.area()
i1: 1 3.14159265359
i1: 2.5 19.6349540849
Mudando uma instância: referências
Variáveis podem referenciar o mesmo objeto
Mudar um atributo, modifica o objeto, não a referência
i1: 1.75
i2: 4
i3: 1.75
Mudando uma instância: status do atributo
Attributes are local to the instance
Atributos podem programar qualquer coisa
"file t31.py"
i1 = Circle(0, 2, 4)
print 'i1:', i1.radius, i1.area()
i1.radius = -2
print 'i1:', i1.radius, i1.area()
i1.radius = 'garbage'
print 'i1:', i1.radius, i1.area()
i1: 4 50.2654824574
i1: -2 12.5663706144
i1: garbage
Traceback (most recent call last):
File "M:/My Documents/Python course/tests/t31.py", line 10, in -toplevel-
print 'i1:', i1.radius, i1.area()
File "M:/My Documents/Python course/tests\geom1.py", line 15, in area
return math.pi * self.radius**2
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
Mudando uma instância: atribuir add/delete
Um atributo pode ser acrescentado!
And deleted!
"file t32.py"
i1 = Circle(0, 2)
i1: 1 red
has i1 radius? False
i1:
Traceback (most recent call last):
File "M:/My Documents/Python course/tests/t32.py", line 11, in -toplevel-
print 'i1:', i1.area()
File "M:/My Documents/Python course/tests\geom1.py", line 15, in area
return math.pi * self.radius**2
AttributeError: Circle instance has no attribute 'radius'
Inspecionando objetos: dir
Use a função de contrução 'dir' para inspecionar objetos
'__doc__': string de documentação de classe
'__class__': classe para a instância
>>> type(i1)
<type 'instance'>
>>> type(Circle)
<type 'classobj'>
>>> type(i1.radius)
<type 'int'>
>>> type(i1.area)
<type 'instancemethod'>
Métodos especiais em classes
Métodos especiais '__xxx__' em classes
Define comportamento sob medida
"file geom2.py: Module with classes for geometrical shapes, 2nd try"
import math
class Circle:
# ...alguns códigos foram removidos aqui, para esclarecer...
"file t33.py"
i1 = Circle(0, 2.5)
i2 = Circle(3, 4.02, 0)
print str(i1)
print 'is i1 a circle?:', bool(i1)
print 'is i2 a circle?:', bool(i2)
print 'i1 larger than i2?', i1 > i2 # usa __cmp__, se definido
"file t34.py"
"file geom3.py: Module with classes for geometrical shapes, 2nd try"
import math
def is_round(self):
return True
class Blob(Shape):
"An undefined blob."
"file t35.py"
shapes = [Shape(),
Circle(1, -2),
Blob()]
for s in shapes:
print s, 'round?', s.is_round()
class Bioseq:
class Nucleotide(Bioseq):
def translate(self):
pass # code to translate NT seq to AA
return Protein(seq='whatever')
class Protein(Bioseq):
def fetch_seq(acc):
for cls in [Nucleotide, Protein]:
try:
result = cls()
result.fetch(acc)
return result
except IOError:
pass
return None
print fetch_seq('A123')
<bioseq.Nucleotide instance at 0x009CEFA8>
Parte 6:
Módulos de biblioteca padrão
Módulo 're', parte 1
Expressões regulares: padrões avançados de string
Define um padrão
- A sintaxe padrão é muito parecida com Perl or grep
"file t37.py"
import re
seq = "MAKEVFSKRTCACVFHKVHAQPNVGITR"
two_charged = re.compile('[DERK][DERK]')
print two_charged.findall(seq)
['CACVFHKVH']
['KE', 'KR']
Módulo 'sys', parte 1
Variáveis e funções para o interpretador Python
sys.argv
- Lista de argumentos de linhas de comando; sys.argv[0] é um nome script
sys.path
- Lista de nomes de diretórios, onde os módulos são procurados
sys.platform
- String para identificar o tipo de sistema do computador
os.getcwd()
- Retorna ao diretório atual
>>> os.getcwd()
'M:\\My Documents\\Python course\\tests'
os.environ
- Dicionário contendo as variáveis de ambiente atual
TMP C:\DOCUME~1\se22312\LOCALS~1\Temp
COMPUTERNAME WS101778
USERDOMAIN BIOVITRUM
COMMONPROGRAMFILES C:\Program Files\Common Files
PROCESSOR_IDENTIFIER x86 Family 6 Model 9 Stepping 5, GenuineIntel
PROGRAMFILES C:\Program Files
PROCESSOR_REVISION 0905
HOME C:\emacs
...
Módulo 'os', parte 2
os.chdir(path)
- Muda o diretório de trabalho atual para 'path'
os.listdir(path)
- Retorna uma lista de conteúdos do diretório 'path'
os.mkdir(path)
- Cria o diretório 'path'
os.rmdir(path)
- Remove o diretório 'path'
os.remove(path)
- Remove o arquivo chamado 'path'
Module 'os', parte 3
os.system(comando)
- Executa o comando shell (string) em um subprocesso
- Retorna o código de erro como inteiro
os.popen(command, mode='r')
- Executa o comando shell (string)
- Abre uma pipe para o comando, retorna como objeto de arquivo
- Modo é somente leitura, ou escrita; não ambos
os.popen2, os.popen3, os.popen4
- Variações de os.popen, com diferentes objetos de arquivo
os.getpid()
- Retorna o processo ID como inteiro
Módulo 'os.path', parte 1
Path portável manipulação de nome
os.path.abspath(path)
- Retorna ao ‘path’ absoluto para o atribuído 'path’ relativo
>>> d = os.path.abspath('.')
>>> d
'M:\\My Documents\\Python course\\tests'
os.path.dirname(path)
- Retorna a parte do nome do diretório 'path'
>>> os.path.dirname(d)
'M:\\My Documents\\Python course'
Módulo 'os.path', parte 2
os.path.join(path, path, .)
- Agrupa as partes do path inteligentemente para um nome path válido
>>> d = os.path.join(os.getcwd(), 't1.py')
>>> d
'M:\\My Documents\\Python course\\tests\\t1.py'
os.path.split(path)
- Divide-se o path para um nome de diretório e nome de arquivo
- Contrário de 'os.path.join'
>>> os.path.split(d)
('M:\\My Documents\\Python course\\tests', 't1.py')
os.path.splitext(path)
- Divide-se o path para nome de arquivo base e a extensão (se houver alguma)
os.path.isfile(path)
'path‘ é o nome de um arquivo?
os.path.isdir(path)
'path‘ é o nome de um diretório?
>>> os.path.isfile(d)
True
>>> os.path.isdir(d)
False