Você está na página 1de 109

azevedolab.

net 1
Strings em Python
www.python.org

A linguagem de programação Python tem um arsenal de métodos para manipulação


de strings. O conceito de string é simples, uma string é um conjunto de caracteres,
que pode conter números, letras e símbolos especiais. Toda leitura de informação
via teclado, com a função input(), considera que o que está sendo digitado é uma
string. Como vimos, para que o programa considere a informação digitada, como um
número inteiro, temos que usar a função int(), antes da função input(), que converte a
string para inteiro, como indicado abaixo.

my_var = int(input(“Type an integer =>"))

Vimos, também, que podemos usar uma entrada de dados de ponto flutuante, a partir
da função float(), que converte de string, ou de inteiro, para float, como indicado
abaixo.

my_var = float(input(“Type a float =>"))

2
Strings em Python
www.python.org

Quando não indicamos as funções float() ou int(), antes da função input(), o


interpretador Python assume que a informação sendo digitada é uma string, como
indicado no trecho de código a seguir.

my_var = input(“Type a string =>")

Variáveis em Python fazem referencia às posições na memória, onde estão


armazenados dados, como no exemplo das strings, indicadas abaixo.
my_var1 = “Here we have a string"
my_var2 = “Here we have a new string with 1 e 2"
my_var3 = "11235813213455"
Usamos aspas duplas para indicar a string em Python, podemos usar, também,
aspas simples, a única exigência é que, uma vez iniciado com um tipo de aspa,
esta deve está no final, como no exemplo abaixo.

my_var = input(‘Type a string =>')


3
Strings em Python
www.python.org

As variáveis, para as quais foram atribuídas strings, podem ser mostradas na tela
com a função print(), como no exemplo a seguir.

my_var = “A new string"


print(my_var)

Podemos usar a função print() para mostrar resultados compostos na tela, onde
strings, inteiros, floats e sequências de escape aparecem numa única linha, o código
a seguir, showStrings1.py, ilustra a situação.

my_var1 = "My string"


my_var2 = 112358
my_var3 = 3.14159
print("String: ",my_var1,", Integer: ",my_var2,", Float: ",my_var3,"\n\n")

Ao executarmos o código showStrings1.py, temos o seguinte resultado.

String: My string , Integer: 112358 , Float: 3.14159

4
Strings em Python
www.python.org

Vamos olhar alguns detalhes importantes do código showStrings1.py. A primeira linha


traz a atribuição do conteúdo da memória “My string” à variável my_var1. Usamos
aspas duplas, poderíamos ter usado aspas simples, o resultado seria o mesmo (veja
exercício de programação 2.1). A segunda linha traz a variável my_var2, veja que
não usamos aspas, o interpretador Python considera a variável my_var2 como inteira,
sem necessidade que explicitemos com a função int(). Para a variável my_var3,
temos situação similar, só que agora a presença do ponto decimal indica que o dado
é do tipo float. A função print() traz conteúdo entre aspas, as variáveis e a sequência
de escape \n. Veja que separamos por vírgulas os conteúdos a serem mostrados na
tela. Se omitirmos a vírgula, que separa, por exemplo, o primeiro conteúdo entre
aspas e a variável my_var1, teremos um erro de execução do programa, também
chamado de erro de sintaxe.
my_var1 = "My string"
my_var2 = 112358
my_var3 = 3.14159
print("String: ",my_var1,", Integer: ",my_var2,", Float: ",my_var3,"\n\n")

Veja, ainda, que as vírgulas inseridas entre aspas são caracteres de uma string, por
isso são mostradas na tela.
5
Strings em Python
www.python.org

Exercício de programação 2.1. Modifique o código fonte do programa


showStrings1.py, use aspas simples para a variável my_var1. Salve o novo programa
com o nome showStrings2.py. Rode o programa. Houve diferenças nos resultados?

Exercício de programação 2.2. Modifique o código fonte do programa


showStrings1.py, crie um nova variável, a variável my_var4, que recebe o resultado
da divisão da variável my_var2 pela my_var3 (my_var4 = my_var2/my_var3).
Insira a variável my_var4 na função print(), mas antes coloque uma informação que o
resultado mostrado é a divisão (sem acento, por exemplo, Division). Salve o novo
programa com o nome showStrings3.py. Rode o programa. Nota: Não use acentos
nas strings. Abaixo temos o resultado esperado

String: My string , Integer: 112358 , Float: 3.14159 Division: 35764.69240098167

Exercício de programação 2.3. Modifique o código fonte do programa


showStrings3.py, e coloque aspas simples nos conteúdos atribuídos às variáveis
my_var2 e my_var3. Mantenha a variável my_var4 inalterada. Salve o novo programa
com o nome showStrings4.py. Rode o programa. O que aconteceu?
6
Strings em Python
www.python.org

Vimos o uso de funções internas em Python (Python’s built-in functions) para


manipulação de strings, como as funções print(), input(), float() e int(). Temos,
também, duas funções adicionais para strings, são elas as funções len() e str(). A
função len() retorna o tamanho de uma string que é dada como argumento, ou seja, o
número de caracteres da string. A função str() converte o argumento para string, por
exemplo, de inteiro para string. Vejamos um exemplo simples onde as duas funções
aparecem. O código showStrings5.py converte um inteiro para string e, depois,
mostra o número de caracteres da string.
myInt = int(input("Type an integer => ")) # Reads an integer and assigns it to the variable myInt
myString = str(myInt) # Converts to string
countChar = len(myString) # Counts characters in myString
print("Number of characters of ",myString," is ",countChar) # Shows results

Ao executarmos o código acima, temos o resultado mostrado abaixo.

Type an integer => 12345


Number of characters of 12345 is 5

7
Strings em Python
www.python.org

Como vimos, há diversos tipos de valores que podem ser usados como argumentos
das funções internas da linguagem Python. Contudo, a maioria das funções, aplica-se
a um tipo específico de dados, por exemplo, às strings. Tais recursos da linguagem
Python, específicos para um tipo de dado, são chamados de métodos. A
chamada de um método em Python, ocorre de forma similar às funções, exceto que o
primeiro argumento aparece antes do nome do método, seguido por um ponto (.).
Esta forma de chamar um método é denominada de notação dot. Vejamos, como
exemplo, o método .count(), que retorna o número de vezes que uma dada string,
fornecida como argumento, aparece na string, myString.

myString.count(“I”)

Argumento do método
Método aplicado à string do lado esquerdo

Ponto indicador da notação “dot”

String sobre a qual será aplicado o método 8


Strings em Python
www.python.org

O programa, showStrings6.py, conta o número de vezes que o caractere “I” aparece


na string atribuída à variável myString.

myString = input("Type a string => ") # Reads a string and assigns it to variable myString
# .count("I") method to count the number of times its argument appears in the string
countI = myString.count("I")
print("I appears ",countI, "time(s)") # Shows results

Ao executarmos o código, temos o resultado abaixo.

Type a string => BIOINFORMATICS


I appears 3 time(s)

Veja que o código é sensível ao tipo de letras, maiúsculas ou minúsculas, dizemos


ser “case sensitive”.

9
Concatenação de trechos de DNA
www.python.org

Com a explosão de informações sobre


sequência de genomas completos, as
bases de dados passaram a armazenar
tal informação como strings de bases
nitrogenadas, como a mostrada abaixo,
onde temos 18 bases. Usando-se o
código de uma letra das bases
nitrogenadas, para representar a estrutura
primária do DNA, temos uma forma
condensada de armazenar tal informação.

CGATATCGAATTCCGGAT Representação artística do genoma humano, com uma


molécula de DNA o homem vitruviano. Disponível em: <
http://www.sciencephoto.com/media/408761/enlarge >. .
Acesso em: 23 de novembro de 2016.

Adenina = A
Guanina = G
Citosina = C
Timina = T 10
Concatenação de trechos de DNA
www.python.org

Um dos métodos rotineiros em Bioinformática, é a manipulação de fragmentos de


DNA. Vamos considerar um programa em Python (concaDNASeq1.py) para
concatenar (juntar) dois fragmentos de DNA. Apresentaremos o código fonte pronto e
discutiremos os principais aspectos de cada linha do programa.

# Program to concatenate DNA Sequences


seq1 = "CGATATCGAATTCCGGAT"
seq2 = "AAAAAAAAAATTTTTTCG"

print("DNA sequences")
print("Sequence 1: ",seq1)
print("Sequence 2: ",seq2)

# + operator to concatenate strings


seq3 = seq1+seq2
print("\nConcatenated sequences (method 1): ",seq3)

# .join() method to concatenate strings


seq3 = ''.join([seq1,seq2])
print("\nConcatenated sequences (method 2): ",seq3) 11
Concatenação de trechos de DNA
www.python.org

Antes de começarmos a descrição linha por linha do programa, gostaria de destacar


alguns aspectos. Veja no código que temos linhas de comentários, iniciadas por #, em
diversas partes, além do início do código. Como já destacado, tal inserção visa
documentar o programa, o que facilita seu entendimento para posteriores
modificações.

# Program to concatenate DNA Sequences


seq1 = "CGATATCGAATTCCGGAT"
seq2 = "AAAAAAAAAATTTTTTCG"

print("DNA sequences")
print("Sequence 1: ",seq1)
print("Sequence 2: ",seq2)

# + operator to concatenate strings


seq3 = seq1+seq2
print("\nConcatenated sequences (method 1): ",seq3)

# .join() method to concatenate strings


seq3 = ''.join([seq1,seq2])
print("\nConcatenated sequences (method 2): ",seq3) 12
Concatenação de trechos de DNA
www.python.org

O código abaixo está com indicação dos números de linhas, para facilitar a explicação.
Quando formos digitar o programa, não inserimos os números das linhas. A linha 1
apresenta comentários. As linhas 2 e 3 trazem as variáveis (seq1 e seq2), que serão
usadas para strings, ou seja, letras, números, símbolos etc.

1# Program to concatenate DNA Sequences


2seq1 = "CGATATCGAATTCCGGAT"
3seq2 = "AAAAAAAAAATTTTTTCG"
4
5print("DNA sequences")
6print("Sequence 1: ",seq1)
7print("Sequence 2: ",seq2)
8
9# + operator to concatenate strings
10seq3 = seq1+seq2
11print("\nConcatenated sequences (method 1): ",seq3)
12
13# .join() method to concatenate strings
14seq3 = ''.join([seq1,seq2])
15print("\nConcatenated sequences (method 2): ",seq3) 13
Concatenação de trechos de DNA
www.python.org

As aspas duplas “”, para a sequência de DNA, indicam que o conteúdo entre aspas é
a string a ser atribuída a uma variável. A linha 4 está em branco, tais inserções são
usadas para facilitar a leitura do programa por humanos, não são consideradas pelo
interpretador Python.

1# Program to concatenate DNA Sequences


2seq1 = "CGATATCGAATTCCGGAT"
3seq2 = "AAAAAAAAAATTTTTTCG"
4
5print("DNA sequences")
6print("Sequence 1: ",seq1)
7print("Sequence 2: ",seq2)
8
9# + operator to concatenate strings
10seq3 = seq1+seq2
11print("\nConcatenated sequences (method 1): ",seq3)
12
13# .join() method to concatenate strings
14seq3 = ''.join([seq1,seq2])
15print("\nConcatenated sequences (method 2): ",seq3) 14
Concatenação de trechos de DNA
www.python.org

As linhas 5, 6 e 7 indicam mensagens a serem mostradas na tela, inclusive as


sequências de DNA. Podemos usar aspas simples ‘ ‘ para indicar a string a ser
mostrada na tela, não há diferença entre o uso das aspas simples e das duplas em
Python, como destacamos anteriormente.

1# Program to concatenate DNA Sequences


2seq1 = "CGATATCGAATTCCGGAT"
3seq2 = "AAAAAAAAAATTTTTTCG"
4
5print("DNA sequences")
6print("Sequence 1: ",seq1)
7print("Sequence 2: ",seq2)
8
9# + operator to concatenate strings
10seq3 = seq1+seq2
11print("\nConcatenated sequences (method 1): ",seq3)
12
13# .join() method to concatenate strings
14seq3 = ''.join([seq1,seq2])
15print("\nConcatenated sequences (method 2): ",seq3) 15
Concatenação de trechos de DNA
www.python.org

A linha 8 está em branco. A linha 9 é um comentário. A linha 10 concatena as duas


strings, a partir do operador “+”, que atua colando as duas sequências atribuídas às
variáveis seq1 e seq2. O resultado da concatenação é atribuído à nova variável, seq3.
A linha 11 mostra o resultado na tela. A linha 12 está em branco.

1# Program to concatenate DNA Sequences


2seq1 = "CGATATCGAATTCCGGAT"
3seq2 = "AAAAAAAAAATTTTTTCG"
4
5print("DNA sequences")
6print("Sequence 1: ",seq1)
7print("Sequence 2: ",seq2)
8
9# + operator to concatenate strings
10seq3 = seq1+seq2
11print("\nConcatenated sequences (method 1): ",seq3)
12
13# .join() method to concatenate strings
14seq3 = ''.join([seq1,seq2])
15print("\nConcatenated sequences (method 2): ",seq3) 16
Concatenação de trechos de DNA
www.python.org

A linha 13 é comentário. A linha 14 traz o método join, que concatena os conteúdos


atribuídos às variáveis seq1 e seq2, o resultado é atribuído à variável seq3. As aspas
simples, antes do método join, indicam que as strings não apresentarão espaços, ou
qualquer outro símbolo entre elas. A linha 15 mostra o resultado na tela.

1# Program to concatenate DNA Sequences


2seq1 = "CGATATCGAATTCCGGAT"
3seq2 = "AAAAAAAAAATTTTTTCG"
4
5print("DNA sequences")
6print("Sequence 1: ",seq1)
7print("Sequence 2: ",seq2)
8
9# + operator to concatenate strings
10seq3 = seq1+seq2
11print("\nConcatenated sequences (method 1): ",seq3)
12
13# .join() method to concatenate strings
14seq3 = ''.join([seq1,seq2])
15print("\nConcatenated sequences (method 2): ",seq3) 17
Concatenação de trechos de DNA
www.python.org

Vamos ao resultado do programa. Chamamos o programa de concaDNASeq1.py.


Vemos que os resultados da concatenação são exatamente idênticos para os 2
métodos.

DNA sequences
Sequence 1: CGATATCGAATTCCGGAT
Sequence 2: AAAAAAAAAATTTTTTCG

Concatenated sequences (method 1):


CGATATCGAATTCCGGATAAAAAAAAAATTTTTTCG

Concatenated sequences (method 2):


CGATATCGAATTCCGGATAAAAAAAAAATTTTTTCG

18
Concatenação de trechos de DNA
www.python.org

Se tivéssemos colocado um caractere qualquer entre as aspas, antes do método join,


este seria inserido entre as duas sequências. Como no pequeno trecho de código
mostrado abaixo. Veja a nova linha 14.

14seq3 = ‘-'.join([seq1,seq2])

19
Concatenação de trechos de DNA
www.python.org

Exercício de programação 2.4. Modifique as duas sequências de DNA e rode o


programa.

Exercício de programação 2.5. Modifique o programa concaDNASeq1.py. Insira


diferentes símbolos entre as aspas simples da linha 14 e rode o programa para
verificar o resultado.

20
Complemento reverso do DNA
www.python.org

Uma fita isolada de DNA é lida do terminal


5’ para o terminal 3’. Ao formarem Leitura da esquerda para direita
fragmentos de DNA, o terminal 5’ de um
nucleotídeo, liga-se ao terminal 3’ do
fragmento em formação. Quando duas 5’ 3’
fitas de DNA unem-se, para formar a CGATATCGAATTCCGGAT
hélice dupla de DNA, uma fita com
sentido de leitura do 5’ para o 3’ liga-se 3’ 5’
por meio de ligações de hidrogênio entre GCTATAGCTTAAGGCCTA
os pares de bases, a outra fita no sentido
oposto, ou seja, do 3’ para o 5’, seguindo
a ordem CG e AT. As sequências ao lado
Leitura da direita para esquerda
ilustram tal complementaridade entre as
fitas. Visto que, os pares de bases sempre
combinam A com T e C com G e a
orientação das fitas é invertida, uma com
relação à outra, usamos o termo
complemento reverso (reverse
complement em inglês) para descrever a
relação de bases das duas fitas. 21
Complemento reverso do DNA
www.python.org

Na figura abaixo, à esquerda, temos a estrutura 3D de um trecho da molécula de DNA.


A figura da direita é um zoom da parte superior da molécula, onde vemos o início da
fita esquerda com a posição 5’, que faz par com a fita à direita que emparelha com a
posição 3’. O3’

O5’

22
Complemento reverso do DNA
www.python.org

Abaixo temos a montagem da fita dupla do DNA, com uma fita servindo de molde para
a montagem do complemento reverso. Essa reação é catalisada pela enzima DNA
polimerase.

Figura disponível em: < http://www2.chemistry.msu.edu/faculty/reusch/virttxtjml/nucacids.htm >.


Acesso em: 23 de novembro de 2016.

23
Complemento reverso do DNA
www.python.org

Vamos ilustrar a transformação da informação codificada numa fita de DNA, para sua
complementar (complementar reverso). Usaremos um pequeno trecho de DNA com 12
nucleotídeos. A informação está armazenada num arquivo no formato FASTA, usado
para guardar informações sobre a estrutura primária de ácidos nucleicos e proteínas.

>DNA:A|PDBID|CHAIN|SEQUENCE Arquivo no formato FASTA com a sequência de nucleotídeos. A primeira linha inicia com
CGCGAATTCGCG o símbolo > e traz a identificação do sequência. As bases começam na segunda linha.
Complemento reverso

>DNA:B|PDBID|CHAIN|SEQUENCE
CGCGAATTCGCG Arquivo no formato FASTA com a sequência de nucleotídeos do complemento reverso,
o sentido de leitura é do terminal 5’ para o 3’, veja que a complementaridade dos pares
de bases ocorre da última base do arquivo original para a primeira base do arquivo do
complemento reverso e assim sucessivamente.

24
Complemento reverso do DNA
www.python.org

Vamos considerar um programa em Python (reverseCompDNA1.py), que gera o


complemento reverso de um fragmento de DNA. Apresentamos o código fonte pronto
e discutiremos os principais aspectos. Acredito que podemos nos concentrar no que
há de novo no código abaixo.
# Program to generate reverse complement for a DNA sequence
seqIn = "ATGCGCGAATTCGCGGAAGCGGCGTTAGCTCGCCGCGCAGGG"

print("DNA sequence:\t\t",seqIn)

# First we change each base, using the uppercase/lowercase as a trick, in order to not apply
#.replace method to the same base
dna = seqIn.replace("A","t")
dna = dna.replace("T","a")
dna = dna.replace("C","g")
dna = dna.replace("G","c")

# Generates uppercase sequence


DNA = dna.upper()

# Changes to a list
DNAlist = list(DNA)

# Inverts list
DNAlist.reverse()

# Changes from a list to string


seqOut=''.join(DNAlist)
25
print("\nReverse complement:\t",seqOut)
Complemento reverso do DNA
www.python.org

Na primeira linha vermelha temos o print(), já visto em detalhes. A novidade é o uso


da sequência de escape “\t”, que tem a função de tabulação. Assim, o “\t” moverá o
cursor um “tab” antes de mostrar o próximo conteúdo na tela, que no caso é a string
atribuída à variável seqIn.
# Program to generate reverse complement for a DNA sequence
seqIn = "ATGCGCGAATTCGCGGAAGCGGCGTTAGCTCGCCGCGCAGGG"

print("DNA sequence:\t\t",seqIn)

# First we change each base, using the uppercase/lowercase as a trick, in order to not apply
#.replace method to the same base
dna = seqIn.replace("A","t")
dna = dna.replace("T","a")
dna = dna.replace("C","g")
dna = dna.replace("G","c")

# Generates uppercase sequence


DNA = dna.upper()

# Changes to a list
DNAlist = list(DNA)

# Inverts list
DNAlist.reverse()

# Changes from a list to string


seqOut=''.join(DNAlist)
26
print("\nReverse complement:\t",seqOut)
Complemento reverso do DNA
www.python.org

O método replace(“string 1”,”string 2”) troca a string 1 pela string 2, atribuindo o


resultado à variável à esquerda, que no caso é a variável dna. Veja que trocamos por
uma base com letra minúscula, tal truque evita que troquemos as bases que já foram
trocadas.
# Program to generate reverse complement for a DNA sequence
seqIn = "ATGCGCGAATTCGCGGAAGCGGCGTTAGCTCGCCGCGCAGGG"

print("DNA sequence:\t\t",seqIn)

# First we change each base, using the uppercase/lowercase as a trick, in order to not apply
#.replace method to the same base
dna = seqIn.replace("A","t")
dna = dna.replace("T","a")
dna = dna.replace("C","g")
dna = dna.replace("G","c")

# Generates uppercase sequence


DNA = dna.upper()

# Changes to a list
DNAlist = list(DNA)

# Inverts list
DNAlist.reverse()

# Changes from a list to string


seqOut=''.join(DNAlist)
27
print("\nReverse complement:\t",seqOut)
Complemento reverso do DNA
www.python.org

Abaixo temos um detalhamento da aplicação do método replace(). O recurso de


trocarmos uma base de letra maiúscula, por uma de letra minúscula, evita que o “T”
que foi obtido de “A” volte para “A”. O Python diferencia maiúsculas de minúsculas
(case sensitive).

dna = seqIn.replace("A","t")
dna = dna.replace("T","a")
dna = dna.replace("C","g")
dna = dna.replace("G","c")
Base Base

A t
T a
C g
G c 28
Complemento reverso do DNA
www.python.org

Para voltarmos a ter uma string com letras maiúsculas, usamos o método .upper(). Na
implementação abaixo, atribuímos a string com letras maiúsculas à variável DNA.

# Program to generate reverse complement for a DNA sequence


seqIn = "ATGCGCGAATTCGCGGAAGCGGCGTTAGCTCGCCGCGCAGGG"

print("DNA sequence:\t\t",seqIn)

# First we change each base, using the uppercase/lowercase as a trick, in order to not apply
#.replace method to the same base
dna = seqIn.replace("A","t")
dna = dna.replace("T","a")
dna = dna.replace("C","g")
dna = dna.replace("G","c")

# Generates uppercase sequence


DNA = dna.upper()

# Changes to a list
DNAlist = list(DNA)

# Inverts list
DNAlist.reverse()

# Changes from a list to string


seqOut=''.join(DNAlist)
29
print("\nReverse complement:\t",seqOut)
Complemento reverso do DNA
www.python.org

Agora convertemos a string atribuída à variável DNA em uma lista, como o método list.
Uma lista apresenta dados, strings ou números, com índices, ou seja, podemos
acessar cada elemento da lista chamando especificamente a posição da lista, no caso
abaixo a string é decomposta e cada letra agora é um elemento da lista.
# Program to generate reverse complement for a DNA sequence
seqIn = "ATGCGCGAATTCGCGGAAGCGGCGTTAGCTCGCCGCGCAGGG"

print("DNA sequence:\t\t",seqIn)

# First we change each base, using the uppercase/lowercase as a trick, in order to not apply
#.replace method to the same base
dna = seqIn.replace("A","t")
dna = dna.replace("T","a")
dna = dna.replace("C","g")
dna = dna.replace("G","c")

# Generates uppercase sequence


DNA = dna.upper()

# Changes to a list
DNAlist = list(DNA)

# Inverts list
DNAlist.reverse()

# Changes from a list to string


seqOut=''.join(DNAlist)
30
print("\nReverse complement:\t",seqOut)
Complemento reverso do DNA
www.python.org

Uma lista tem a vantagem de apresentar a informação de forma indexada, cada trecho
da informação é chamado elemento da lista. Por exemplo, podemos criar uma lista
com os 10 primeiros elementos da sequência de Fibonacci, como indicado abaixo.

my_list = [1,1,2,3,5,8,13,21,34,55]

Para nos referirmos diretamente a um elemento da lista, chamamos a ordem do


elemento, tendo em mente que em Python usamos o índice “0” para o primeiro
elemento. Assim, a lista my_list tem a seguinte distribuição.

my_list[0] my_list[1] my_list[2] my_list[3] my_list[4] my_list[5] my_list[6] my_list[7] my_list[8] my_list[9]

my_list 1 1 2 3 5 8 13 21 34 55

31
Complemento reverso do DNA
www.python.org

O trecho de código abaixo cria a lista my_list e imprime o elemento 7 da lista, ou seja,
o oitavo elemento da lista.

my_list = [1,1,2,3,5,8,13,21,34,55]
print(my_list[7])

O resultado das linhas de código acima, cria a lista, e imprime o elemento “7” da lista,
indicado no diagrama abaixo.

my_list[0] my_list[1] my_list[2] my_list[3] my_list[4] my_list[5] my_list[6] my_list[7] my_list[8] my_list[9]

my_list 1 1 2 3 5 8 13 21 34 55

32
Complemento reverso do DNA
www.python.org

A partir da lista podemos usar métodos para sua manipulação, como o método
reverse, que inverte a sequência dos elementos originais. Os métodos para
manipulação de listas, como o .reverse(), são chamados usando-se a notação dot (.),
onde o ponto (.) é colocado após a lista, o resultado é que a lista é invertida.
# Program to generate reverse complement for a DNA sequence
seqIn = "ATGCGCGAATTCGCGGAAGCGGCGTTAGCTCGCCGCGCAGGG"

print("DNA sequence:\t\t",seqIn)

# First we change each base, using the uppercase/lowercase as a trick, in order to not apply
#.replace method to the same base
dna = seqIn.replace("A","t")
dna = dna.replace("T","a")
dna = dna.replace("C","g")
dna = dna.replace("G","c")

# Generates uppercase sequence


DNA = dna.upper()

# Changes to a list
DNAlist = list(DNA)

# Inverts list
DNAlist.reverse()

# Changes from a list to string


seqOut=''.join(DNAlist)
33
print("\nReverse complement:\t",seqOut)
Complemento reverso do DNA
www.python.org

Podemos voltar a ter uma string, com o método join, que une os elementos da lista
numa string. Por último usamos o print() para mostrar os resultados.

# Program to generate reverse complement for a DNA sequence


seqIn = "ATGCGCGAATTCGCGGAAGCGGCGTTAGCTCGCCGCGCAGGG"

print("DNA sequence:\t\t",seqIn)

# First we change each base, using the uppercase/lowercase as a trick, in order to not apply
#.replace method to the same base
dna = seqIn.replace("A","t")
dna = dna.replace("T","a")
dna = dna.replace("C","g")
dna = dna.replace("G","c")

# Generates uppercase sequence


DNA = dna.upper()

# Changes to a list
DNAlist = list(DNA)

# Inverts list
DNAlist.reverse()

# Changes from a list to string


seqOut=''.join(DNAlist)
34
print("\nReverse complement:\t",seqOut)
Complemento reverso do DNA
www.python.org

A variável seqOut tem a string obtida da conversão da lista DNAlist, mostramos o


resultado na tela chamando a função print().

# Program to generate reverse complement for a DNA sequence


seqIn = "ATGCGCGAATTCGCGGAAGCGGCGTTAGCTCGCCGCGCAGGG"

print("DNA sequence:\t\t",seqIn)

# First we change each base, using the uppercase/lowercase as a trick, in order to not apply
#.replace method to the same base
dna = seqIn.replace("A","t")
dna = dna.replace("T","a")
dna = dna.replace("C","g")
dna = dna.replace("G","c")

# Generates uppercase sequence


DNA = dna.upper()

# Changes to a list
DNAlist = list(DNA)

# Inverts list
DNAlist.reverse()

# Changes from a list to string


seqOut=''.join(DNAlist)
35
print("\nReverse complement:\t",seqOut)
Complemento reverso do DNA
www.python.org

Vimos no programa reverseCompDNA1.py, a implementação de como gerar o


complemento reverso de um fragmento de DNA. Se fossemos usar este programa
para a conversão de outra sequência de DNA, teríamos que editar o código fonte e
inserir a nova sequência. Vamos aperfeiçoar o programa reverseCompDNA1.py,
inserindo a possibilidade de lermos a sequência contida num arquivo externo. Antes
de mostrarmos o novo código, vamos ver o resultado de rodarmos o programa
reverseCompDNA1.py.

DNA sequence: ATGCGCGAATTCGCGGAAGCGGCGTTAGCTCGCCGCGCAGGG

Reverse complement: CCCTGCGCGGCGAGCTAACGCCGCTTCCGCGAATTCGCGCAT

36
Complemento reverso do DNA
www.python.org

A função para abertura de arquivos em Python é open(), vamos destacar abaixo, as


principais características da função open() para leitura de arquivos pré-existentes.
Usamos a linha de comando abaixo, para leitura do arquivo my_file, como segue:

my_info = open(my_file,’r’)

my_file é uma variável para a qual foi atribuída o nome do arquivo, a informação ‘r’, é
chamada de modo de acesso ao arquivo, no caso indica que será realizada uma
operação de leitura do conteúdo do arquivo my_file. A informação, contida no arquivo
de entrada, será referenciada à variável my_info. Resumindo, usaremos a variável
my_info para manipularmos o conteúdo lido do arquivo my_file. Por exemplo,
consideremos que a informação do nosso arquivo de entrada está contida numa linha
de texto, por exemplo a sequência de um DNA. Para lermos essa informação, usamos
o comando,
my_line = my_info.readline()

.readline() é um método que lerá uma linha da variável my_info e atribuirá à variável
my_line. O método .readline() é aplicado à variável my_info.
37
Complemento reverso do DNA
www.python.org

Antes de irmos para um programa completo, vejamos um programa simples, que só lê


o conteúdo de um arquivo e mostra o resultado na tela, o programa
readFileAndShow1.py. A primeira linha em vermelho, indica a leitura do nome do
arquivo de entrada. Nesta versão, não estamos nos precavendo da possibilidade do
usuário digitar um nome de arquivo que não existe. Veremos, mais adiante no curso,
como prevenir tais situações. A segunda linha vermelha, traz a abertura do arquivo,
bem como a atribuição do conteúdo à variável my_info, como mostrado abaixo. A
opção ‘r’ é o modo de abertura, ou seja, indica que realizaremos a leitura do arquivo.
# Program to demonstrate open() function in Python
my_file = input("Enter file name = >")

# Opens input file


my_info = open(my_file,'r')

# Reads one line of the input file


my_line = my_info.readline()

# Closes file
my_info.close()

# Shows file content on screen


38
print(my_line)
Complemento reverso do DNA
www.python.org

A terceira linha em vermelho traz a atribuição do conteúdo à variável my_line. Tal


passagem pode parecer desnecessária, mas veja que à variável my_info foi
referenciado o conteúdo do arquivo, mas para manipularmos o conteúdo, temos que
atribuí-lo a uma nova variável, no caso a my_line. O método usado é o .readline(), que
é aplicado à variável my_info. Uma vez que o conteúdo foi atribuído a uma variável,
podemos fechar o arquivo, com o método .close(), aplicado ao my_info. Por último,
mostramos o conteúdo atribuído à variável my_line na tela, com a função print().
Algumas linguagens, como Perl, chamam variáveis como my_info de filehandle.
# Program to demonstrate open() function in Python
my_file = input("Enter file name = >")

# Opens input file


my_info = open(my_file,'r')

# Reads one line of the input file


my_line = my_info.readline()

# Closes file
my_info.close()

# Shows file content on screen


39
print(my_line)
Complemento reverso do DNA
www.python.org

A partir do filehandle my_info, podemos Arquivo my_file


manipular o arquivo de entrada, contudo,
para acessar seu conteúdo de forma
específica, temos que atribuí-lo a uma
variável, como a my_line do programa. O
fluxograma ao lado ilustra os principais Abertura do arquivo
my_file, conteúdo my_info = open(my_file,’r’)
conceitos na abertura e leitura de um
referenciado ao
arquivo com Python. Inicialmente temos o filehandle my_info.
arquivo my_file, que será aberto com a
função open() e seu conteúdo
referenciado ao filehandle my_info. A linha
de comando para a tarefa, está indicada Primeira linha é my_line = my_info.readline()
abaixo: atribuída à variável
my_info = open(my_file, ‘r’) my_line, com o
método .readline()
A seguir, a primeira linha do arquivo, via
filehandle é atribuída à variável my_line,
Arquivo de entrada my_info.close()
com a aplicação do método .readline(),
my_line = my_info.readline() é fechado com o
Podemos fechar o arquivo como método close()
40
my_info.close().
Complemento reverso do DNA
www.python.org

Rodaremos o programa readFileAndShow1.py e usaremos o arquivo dnafile1.fasta


como entrada. O resultado está mostrado abaixo.

Enter file name => dnafile1.fasta


ATGCGCGAATTCGCGGAAGCGGCGTTAGCTCGCCGCGCAGGG

41
Complemento reverso do DNA
www.python.org

A abertura de um arquivo em Python usa a função open(), que tem como argumento o
nome do arquivo a ser aberto, ou uma variável com o nome. Assim, antes de abrirmos
o arquivo, o programa tem que perguntar o nome do arquivo. Abaixo temos o código
reverseCompDNA2.py .
# Program to generate reverse complement for a DNA sequence, using a sequence read from an input file
dnaFileIn = input("Enter DNA sequence file => ")
fh = open(dnaFileIn,'r') # Opens input file
seqIn = fh.readline() # Assigns file content to seqIn
fh.close() # Closes file
print("DNA sequence:\t\t",seqIn)

# First we change each base, using the uppercase/lowercase as a trick, in order to not apply .replace
# method to the same base
dna = seqIn.replace("A","t")
dna = dna.replace("T","a")
dna = dna.replace("C","g")
dna = dna.replace("G","c")

# Generates uppercase sequences


DNA = dna.upper()

# Changes to a list
DNAlist = list(DNA)

# Inverts list
DNAlist.reverse()

# Changes from a list to string


seqOut=''.join(DNAlist)
print("\nReverse complement:\t",seqOut) 42
Complemento reverso do DNA
www.python.org

A primeira linha vermelha lê o nome do arquivo de entrada, que será atribuído à


variável dnaFileIn. Esta variável será o argumento da função open(). O open() cria um
filehandle, que é usado para fazer referência ao arquivo aberto.

# Program to generate reverse complement for a DNA sequence, using a sequence read from an input file
dnaFileIn = input("Enter DNA sequence file => ")
fh = open(dnaFileIn,'r') # Opens input file
seqIn = fh.readline() # Assigns file content to seqIn
fh.close() # Closes file
print("DNA sequence:\t\t",seqIn)

# First we change each base, using the uppercase/lowercase as a trick, in order to not apply .replace
# method to the same base
dna = seqIn.replace("A","t")
dna = dna.replace("T","a")
dna = dna.replace("C","g")
dna = dna.replace("G","c")

# Generates uppercase sequences


DNA = dna.upper()

# Changes to a list
DNAlist = list(DNA)

# Inverts list
DNAlist.reverse()

# Changes from a list to string


seqOut=''.join(DNAlist)
print("\nReverse complement:\t",seqOut) 43
Complemento reverso do DNA
www.python.org

No código abaixo, o filehandle é o fh, assim qualquer operação com o arquivo aberto,
deve ser realizada sobre o filehandle fh.

# Program to generate reverse complement for a DNA sequence, using a sequence read from an input file
dnaFileIn = input("Enter DNA sequence file => ")
fh = open(dnaFileIn,'r') # Opens input file
seqIn = fh.readline() # Assigns file content to seqIn
fh.close() # Closes file
print("DNA sequence:\t\t",seqIn)

# First we change each base, using the uppercase/lowercase as a trick, in order to not apply .replace
# method to the same base
dna = seqIn.replace("A","t")
dna = dna.replace("T","a")
dna = dna.replace("C","g")
dna = dna.replace("G","c")

# Generates uppercase sequences


DNA = dna.upper()

# Changes to a list
DNAlist = list(DNA)

# Inverts list
DNAlist.reverse()

# Changes from a list to string


seqOut=''.join(DNAlist)
print("\nReverse complement:\t",seqOut) 44
Complemento reverso do DNA
www.python.org

O conteúdo do arquivo é lido fazendo-se referência ao filehandle fh, usando-se o


método .readline(). O conteúdo do arquivo, no caso uma linha somente, é atribuído à
variável seqIn.

# Program to generate reverse complement for a DNA sequence, using a sequence read from an input file
dnaFileIn = input("Enter DNA sequence file => ")
fh = open(dnaFileIn,'r') # Opens input file
seqIn = fh.readline() # Assigns file content to seqIn
fh.close() # Closes file
print("DNA sequence:\t\t",seqIn)

# First we change each base, using the uppercase/lowercase as a trick, in order to not apply .replace
# method to the same base
dna = seqIn.replace("A","t")
dna = dna.replace("T","a")
dna = dna.replace("C","g")
dna = dna.replace("G","c")

# Generates uppercase sequences


DNA = dna.upper()

# Changes to a list
DNAlist = list(DNA)

# Inverts list
DNAlist.reverse()

# Changes from a list to string


seqOut=''.join(DNAlist)
print("\nReverse complement:\t",seqOut) 45
Complemento reverso do DNA
www.python.org

Depois fechamos o arquivo, com close(), a ser aplicado ao filehandle fh. O restante do
código é idêntico ao programa reverseCompDNA1.py, visto que já temos a sequência
de DNA na variável seqIn.

# Program to generate reverse complement for a DNA sequence, using a sequence read from an input file
dnaFileIn = input("Enter DNA sequence file => ")
fh = open(dnaFileIn,'r') # Opens input file
seqIn = fh.readline() # Assigns file content to seqIn
fh.close() # Closes file
print("DNA sequence:\t\t",seqIn)

# First we change each base, using the uppercase/lowercase as a trick, in order to not apply .replace
# method to the same base
dna = seqIn.replace("A","t")
dna = dna.replace("T","a")
dna = dna.replace("C","g")
dna = dna.replace("G","c")

# Generates uppercase sequences


DNA = dna.upper()

# Changes to a list
DNAlist = list(DNA)

# Inverts list
DNAlist.reverse()

# Changes from a list to string


seqOut=''.join(DNAlist)
print("\nReverse complement:\t",seqOut) 46
Complemento reverso do DNA
www.python.org

Vamos considerar o arquivo (dnafile1.fasta), com uma sequência de DNA mostrada


abaixo.
ATGCGCGAATTCGCGGAAGCGGCGTTAGCTCGCCGCGCAGGG
Ao rodarmos o programa reverseCompDNA2.py, temos o seguinte resultado.

Enter DNA sequence file => dnafile1.fasta


DNA sequence: ATGCGCGAATTCGCGGAAGCGGCGTTAGCTCGCCGCGCAGGG

Reverse complement: CCCTGCGCGGCGAGCTAACGCCGCTTCCGCGAATTCGCGCAT

O complemento reverso da sequência foi gerado com sucesso.

47
Complemento reverso do DNA
www.python.org

Vamos criar mais um aperfeiçoamento. Tal tarefa ilustra uma abordagem comum em
programação, criamos um protótipo e vamos aperfeiçoando. Vamos escrever o
complemento reverso num arquivo de saída. O código vai ficar mais extenso, de forma
que não caberá num slide. O novo programa chama-se reverseCompDNA3.py. Neste
programa lemos, também, o nome do arquivo de saída (primeira linha vermelha), que
será atribuído à variável dnaFileOut. O filehandle fw será usado para fazer referência
ao arquivo de saída, com o open(dnaFileOut,’w’) indicando que é um arquivo para
escrita. O ‘w’ é o parâmetro indicativo que será um arquivo para escrita.
# Program to generate reverse complement for a DNA sequence, using a sequence read from an input
# file.
# Reverse complement will be written in an output file
dnaFileIn = input("Enter DNA sequence file => ") # Reads input file name
dnaFileOut = input("Enter output file => ") # Reads output file name

fh = open(dnaFileIn,'r') # Opens input file


fw = open(dnaFileOut,'w') # Opens output file
seqIn = fh.readline() # Assigns file content to seqIn
fh.close() # Closes file

print("DNA sequence:\t\t",seqIn) # Shows sequence on screen

# First we change each base, using the uppercase/lowercase as a trick, in order to not apply
# .replace method to the same base
dna = seqIn.replace("A","t")
dna = dna.replace("T","a")
dna = dna.replace("C","g") 48
dna = dna.replace("G","c")
Complemento reverso do DNA
www.python.org

Destacando-se só as novidades do código, temos que escrever o complemento


reverso no arquivo de saída. Para isto usamos o filehandle fw e o método write(). Por
último fechamos o arquivo de saída com close().

DNA = dna.upper() # Generates uppercase sequences


DNAlist = list(DNA) # Changes to a list
DNAlist.reverse() # Inverts list
seqOut=''.join(DNAlist) # Changes from a list to string

print("\nReverse complement:\t",seqOut) # Shows reverse complement sequence

fw.write(seqOut) # writes sequence into output file


fw.close() # Closes file

49
Complemento reverso do DNA
www.python.org

Vamos considerar o arquivo (dnafile1.fasta), mostrado abaixo.


ATGCGCGAATTCGCGGAAGCGGCGTTAGCTCGCCGCGCAGGG

Ao rodarmos o programa reverseCompDNA3.py temos o seguinte resultado.

Enter DNA sequence file => dnafile1.fasta


Enter output file => test.fasta
DNA sequence: ATGCGCGAATTCGCGGAAGCGGCGTTAGCTCGCCGCGCAGGG

Reverse complement: CCCTGCGCGGCGAGCTAACGCCGCTTCCGCGAATTCGCGCAT

O complemento reverso da sequência foi gerado com sucesso e escrito no arquivo


test.fasta.

50
Complemento reverso do DNA
www.python.org

Além de mostrar na tela o resultado do complemento reverso, o programa armazena a


sequência de DNA no arquivo test.fasta, mostrado abaixo.

CCCTGCGCGGCGAGCTAACGCCGCTTCCGCGAATTCGCGCAT

Temos agora os comandos básicos para ler arquivos existentes e criarmos novos
arquivos. Os procedimentos de manipulação de arquivos serão usados no curso para
leitura de arquivos com dados.

51
Método associados à manipulação de strings
www.python.org

Há diversos métodos em Python para manipulação de strings, o código


methods4Strings1.py traz alguns deles aplicados à string “GATTACA”. Os próximos
slides destacam em vermelho o trecho de código discutido.

# Program to handle strings, using string methods available in Python 3 (part 1)


seqIn = "GATTACA" # Initial sequence
print("\nInitial sequence:\t\t",seqIn)
# s.lower() method to generate lowercase characters for string s
seqOut = seqIn.lower()
print("\nSequence in lowercase:\t\t",seqOut)
# s.upper() method to generate uppercase characters for string s
seqOut = seqOut.upper()
print("\nSequence in uppercase:\t\t",seqOut)
# len(s) method to show the length of the string s
countBases = len(seqOut) # len(seqOut) is assigned to countBases
print("\nNumber of bases:\t\t",countBases)
# s.count("X") method to count substring "X" in string s, used to calculate percentage of CG
countC = seqOut.count("C") # Number of substrings "C" is assigned to countC
countG = seqOut.count("G") # Number of substrings "G" is assigned to countG
perCG = float(100*(countC+countG)/len(seqOut)) # Calculates percentage of C+G in the sequence
print("\nPorcentage of CG:\t\t",perCG)
# s.replace("X","Y") method to replace substring "X" for "Y" in the string s
seqOut = seqOut.replace("T","U")
print("\nSequence after replacing (t->U):",seqOut)
# s.find("X") method to return position of substring "X" in the string s
posA = seqOut.find("A")
print("\nPosition of substring A:\t",posA)
posUU = seqOut.find("UU")
print("\nPosition of substring UU:\t",posUU)
posU = seqOut.find("U") # Returns the position of first "U" found in the string 52
print("\nPosition of first substring U:\t",posU)
Método associados à manipulação de strings
www.python.org

O método s.lower() transforma a string s para letras minúsculas e o s.upper() para


letras maiúsculas. Ambos resultados são mostrados na tela com a função print().

# Program to handle strings, using string methods available in Python 3 (part 1)


seqIn = "GATTACA" # Initial sequence
print("\nInitial sequence:\t\t",seqIn)
# s.lower() method to generate lowercase characters for string s
seqOut = seqIn.lower()
print("\nSequence in lowercase:\t\t",seqOut)
# s.upper() method to generate uppercase characters for string s
seqOut = seqOut.upper()
print("\nSequence in uppercase:\t\t",seqOut)
# len(s) method to show the length of the string s
countBases = len(seqOut) # len(seqOut) is assigned to countBases
print("\nNumber of bases:\t\t",countBases)
# s.count("X") method to count substring "X" in string s, used to calculate percentage of CG
countC = seqOut.count("C") # Number of substrings "C" is assigned to countC
countG = seqOut.count("G") # Number of substrings "G" is assigned to countG
perCG = float(100*(countC+countG)/len(seqOut)) # Calculates percentage of C+G in the sequence
print("\nPorcentage of CG:\t\t",perCG)
# s.replace("X","Y") method to replace substring "X" for "Y" in the string s
seqOut = seqOut.replace("T","U")
print("\nSequence after replacing (t->U):",seqOut)
# s.find("X") method to return position of substring "X" in the string s
posA = seqOut.find("A")
print("\nPosition of substring A:\t",posA)
posUU = seqOut.find("UU")
print("\nPosition of substring UU:\t",posUU)
posU = seqOut.find("U") # Returns the position of first "U" found in the string 53
print("\nPosition of first substring U:\t",posU)
Método associados à manipulação de strings
www.python.org

O método len(s) mostra o número de caracteres na string s e o método s.count(“X”)


conta o número de vezes que a substring “X” aparece na string s.

# Program to handle strings, using string methods available in Python 3 (part 1)


seqIn = "GATTACA" # Initial sequence
print("\nInitial sequence:\t\t",seqIn)
# s.lower() method to generate lowercase characters for string s
seqOut = seqIn.lower()
print("\nSequence in lowercase:\t\t",seqOut)
# s.upper() method to generate uppercase characters for string s
seqOut = seqOut.upper()
print("\nSequence in uppercase:\t\t",seqOut)
# len(s) method to show the length of the string s
countBases = len(seqOut) # len(seqOut) is assigned to countBases
print("\nNumber of bases:\t\t",countBases)
# s.count("X") method to count substring "X" in string s, used to calculate percentage of CG
countC = seqOut.count("C") # Number of substrings "C" is assigned to countC
countG = seqOut.count("G") # Number of substrings "G" is assigned to countG
perCG = float(100*(countC+countG)/len(seqOut)) # Calculates percentage of C+G in the sequence
print("\nPorcentage of CG:\t\t",perCG)
# s.replace("X","Y") method to replace substring "X" for "Y" in the string s
seqOut = seqOut.replace("T","U")
print("\nSequence after replacing (t->U):",seqOut)
# s.find("X") method to return position of substring "X" in the string s
posA = seqOut.find("A")
print("\nPosition of substring A:\t",posA)
posUU = seqOut.find("UU")
print("\nPosition of substring UU:\t",posUU)
posU = seqOut.find("U") # Returns the position of first "U" found in the string 54
print("\nPosition of first substring U:\t",posU)
Método associados à manipulação de strings
www.python.org

A partir do conteúdo atribuído às variáveis countC e countG, é calculada a


porcentagem de C + G na sequência.

# Program to handle strings, using string methods available in Python 3 (part 1)


seqIn = "GATTACA" # Initial sequence
print("\nInitial sequence:\t\t",seqIn)
# s.lower() method to generate lowercase characters for string s
seqOut = seqIn.lower()
print("\nSequence in lowercase:\t\t",seqOut)
# s.upper() method to generate uppercase characters for string s
seqOut = seqOut.upper()
print("\nSequence in uppercase:\t\t",seqOut)
# len(s) method to show the length of the string s
countBases = len(seqOut) # len(seqOut) is assigned to countBases
print("\nNumber of bases:\t\t",countBases)
# s.count("X") method to count substring "X" in string s, used to calculate percentage of CG
countC = seqOut.count("C") # Number of substrings "C" is assigned to countC
countG = seqOut.count("G") # Number of substrings "G" is assigned to countG
perCG = float(100*(countC+countG)/len(seqOut)) # Calculates percentage of C+G in the sequence
print("\nPorcentage of CG:\t\t",perCG)
# s.replace("X","Y") method to replace substring "X" for "Y" in the string s
seqOut = seqOut.replace("T","U")
print("\nSequence after replacing (t->U):",seqOut)
# s.find("X") method to return position of substring "X" in the string s
posA = seqOut.find("A")
print("\nPosition of substring A:\t",posA)
posUU = seqOut.find("UU")
print("\nPosition of substring UU:\t",posUU)
posU = seqOut.find("U") # Returns the position of first "U" found in the string 55
print("\nPosition of first substring U:\t",posU)
Método associados à manipulação de strings
www.python.org

O método replace(“X”,”Y”) troca a substring “X” pela substring “Y”.

# Program to handle strings, using string methods available in Python 3 (part 1)


seqIn = "GATTACA" # Initial sequence
print("\nInitial sequence:\t\t",seqIn)
# s.lower() method to generate lowercase characters for string s
seqOut = seqIn.lower()
print("\nSequence in lowercase:\t\t",seqOut)
# s.upper() method to generate uppercase characters for string s
seqOut = seqOut.upper()
print("\nSequence in uppercase:\t\t",seqOut)
# len(s) method to show the length of the string s
countBases = len(seqOut) # len(seqOut) is assigned to countBases
print("\nNumber of bases:\t\t",countBases)
# s.count("X") method to count substring "X" in string s, used to calculate percentage of CG
countC = seqOut.count("C") # Number of substrings "C" is assigned to countC
countG = seqOut.count("G") # Number of substrings "G" is assigned to countG
perCG = float(100*(countC+countG)/len(seqOut)) # Calculates percentage of C+G in the sequence
print("\nPorcentage of CG:\t\t",perCG)
# s.replace("X","Y") method to replace substring "X" for "Y" in the string s
seqOut = seqOut.replace("T","U")
print("\nSequence after replacing (t->U):",seqOut)
# s.find("X") method to return position of substring "X" in the string s
posA = seqOut.find("A")
print("\nPosition of substring A:\t",posA)
posUU = seqOut.find("UU")
print("\nPosition of substring UU:\t",posUU)
posU = seqOut.find("U") # Returns the position of first "U" found in the string 56
print("\nPosition of first substring U:\t",posU)
Método associados à manipulação de strings
www.python.org

O método s.find(“X”) retorna a posição da substring “X”. O primeiro caractere da string


tem posição zero “0”, o segundo caractere tem posição “1”, e assim sucessivamente.

# Program to handle strings, using string methods available in Python 3 (part 1)


seqIn = "GATTACA" # Initial sequence
print("\nInitial sequence:\t\t",seqIn)
# s.lower() method to generate lowercase characters for string s
seqOut = seqIn.lower()
print("\nSequence in lowercase:\t\t",seqOut)
# s.upper() method to generate uppercase characters for string s
seqOut = seqOut.upper()
print("\nSequence in uppercase:\t\t",seqOut)
# len(s) method to show the length of the string s
countBases = len(seqOut) # len(seqOut) is assigned to countBases
print("\nNumber of bases:\t\t",countBases)
# s.count("X") method to count substring "X" in string s, used to calculate percentage of CG
countC = seqOut.count("C") # Number of substrings "C" is assigned to countC
countG = seqOut.count("G") # Number of substrings "G" is assigned to countG
perCG = float(100*(countC+countG)/len(seqOut)) # Calculates percentage of C+G in the sequence
print("\nPorcentage of CG:\t\t",perCG)
# s.replace("X","Y") method to replace substring "X" for "Y" in the string s
seqOut = seqOut.replace("T","U")
print("\nSequence after replacing (t->U):",seqOut)
# s.find("X") method to return position of substring "X" in the string s
posA = seqOut.find("A")
print("\nPosition of substring A:\t",posA)
posUU = seqOut.find("UU")
print("\nPosition of substring UU:\t",posUU)
posU = seqOut.find("U") # Returns the position of first "U" found in the string 57
print("\nPosition of first substring U:\t",posU)
Método associados à manipulação de strings
www.python.org

Ao executarmos o código methods4Strings1.py, temos os resultados mostrados


abaixo.

Initial sequence: GATTACA

Sequence in lowercase: gattaca

Sequence in uppercase: GATTACA

Number of bases: 7

Porcentage of CG: 28.571428571428573

Sequence after replacing (t->U): GAUUACA

Position of substring A: 1

Position of substring UU: 2

Position of first substring U: 2 58


Método associados à manipulação de strings
www.python.org

Exercício de programação 2.6. Modifique o código fonte do programa


methods4Strings1.py, de forma que a nova versão leia a sequência a partir de um
arquivo de entrada. Salve o novo programa com o nome methods4Strings2.py. Rode
o programa.

59
Método associados à manipulação de strings
www.python.org

O código methods4Strings3.py traz outros métodos aplicados à string “GaTTaCa”,


como segue.
# Program to handle strings, using string methods available in Python 3 (part 2).
seqIn = "GaTTaCa"
print("\nInitial sequence:\t\t",seqIn)
# s.swapcase() method to change from uppercase to lowercase and vice-versa in the string s
seqOut = seqIn.swapcase()
print("\nSwapped sequence:\t\t",seqOut)
# New initial sequence
seqIn = " GATTACA "
print("\nNew initial sequence:\t\t",seqIn)
# s.strip() method to get rid of spaces, tabs, and newlines in the string s
seqOut = seqIn.strip()
print("\nSequence without spaces:\t",seqOut)
# list(s) method to separate the string s in elements of a list
seqList = list(seqIn)
print("\nSequence as a list: \t\t",seqList)
# ''.join() method to merge all elements of a list in one string
seqIn = ''.join(seqIn)
print("\nThe sequence is back:\t\t",seqIn)
# s.split() method to separate the string s in words, where each word is an element
darthVader = "You don't know the power of the dark side"
c3po = darthVader.split()
print("\nOriginal message:\t\t",darthVader)
print("\nMessage after .split():\t\t",c3po)
# Applying ''.join() method after .split method
darthVader = ' '.join(c3po) # With ' '
print("\nMessage after ' '.join():\t\t",darthVader)
darthVader = '-'.join(c3po) # With '-' 60
print("\nMessage after '-'.join():\t\t",darthVader)
Método associados à manipulação de strings
www.python.org

O método s.swapcase() troca de maiúscula para minúscula e vice-versa.

# Program to handle strings, using string methods available in Python 3 (part 2).
seqIn = "GaTTaCa"
print("\nInitial sequence:\t\t",seqIn)
# s.swapcase() method to change from uppercase to lowercase and vice-versa in the string s
seqOut = seqIn.swapcase()
print("\nSwapped sequence:\t\t",seqOut)
# New initial sequence
seqIn = " GATTACA "
print("\nNew initial sequence:\t\t",seqIn)
# s.strip() method to get rid of spaces, tabs, and newlines in the string s
seqOut = seqIn.strip()
print("\nSequence without spaces:\t",seqOut)
# list(s) method to separate the string s in elements of a list
seqList = list(seqIn)
print("\nSequence as a list: \t\t",seqList)
# ''.join() method to merge all elements of a list in one string
seqIn = ''.join(seqIn)
print("\nThe sequence is back:\t\t",seqIn)
# s.split() method to separate the string s in words, where each word is an element
darthVader = "You don't know the power of the dark side"
c3po = darthVader.split()
print("\nOriginal message:\t\t",darthVader)
print("\nMessage after .split():\t\t",c3po)
# Applying ''.join() method after .split method
darthVader = ' '.join(c3po) # With ' '
print("\nMessage after ' '.join():\t\t",darthVader)
darthVader = '-'.join(c3po) # With '-' 61
print("\nMessage after '-'.join():\t\t",darthVader)
Método associados à manipulação de strings
www.python.org

O método s.strip() elimina espaços em branco, tabs e newlines no início e final da


string.
# Program to handle strings, using string methods available in Python 3 (part 2).
seqIn = "GaTTaCa"
print("\nInitial sequence:\t\t",seqIn)
# s.swapcase() method to change from uppercase to lowercase and vice-versa in the string s
seqOut = seqIn.swapcase()
print("\nSwapped sequence:\t\t",seqOut)
# New initial sequence
seqIn = " GATTACA "
print("\nNew initial sequence:\t\t",seqIn)
# s.strip() method to get rid of spaces, tabs, and newlines in the string s
seqOut = seqIn.strip()
print("\nSequence without spaces:\t",seqOut)
# list(s) method to separate the string s in elements of a list
seqList = list(seqIn)
print("\nSequence as a list: \t\t",seqList)
# ''.join() method to merge all elements of a list in one string
seqIn = ''.join(seqIn)
print("\nThe sequence is back:\t\t",seqIn)
# s.split() method to separate the string s in words, where each word is an element
darthVader = "You don't know the power of the dark side"
c3po = darthVader.split()
print("\nOriginal message:\t\t",darthVader)
print("\nMessage after .split():\t\t",c3po)
# Applying ''.join() method after .split method
darthVader = ' '.join(c3po) # With ' '
print("\nMessage after ' '.join():\t\t",darthVader)
darthVader = '-'.join(c3po) # With '-' 62
print("\nMessage after '-'.join():\t\t",darthVader)
Método associados à manipulação de strings
www.python.org

O método list(s) transforma uma string numa lista, com vírgulas separando cada
caractere da string, inclusive espaços, tab e newlines existentes.
# Program to handle strings, using string methods available in Python 3 (part 2).
seqIn = "GaTTaCa"
print("\nInitial sequence:\t\t",seqIn)
# s.swapcase() method to change from uppercase to lowercase and vice-versa in the string s
seqOut = seqIn.swapcase()
print("\nSwapped sequence:\t\t",seqOut)
# New initial sequence
seqIn = " GATTACA "
print("\nNew initial sequence:\t\t",seqIn)
# s.strip() method to get rid of spaces, tabs, and newlines in the string s
seqOut = seqIn.strip()
print("\nSequence without spaces:\t",seqOut)
# list(s) method to separate the string s in elements of a list
seqList = list(seqIn)
print("\nSequence as a list: \t\t",seqList)
# ''.join() method to merge all elements of a list in one string
seqIn = ''.join(seqIn)
print("\nThe sequence is back:\t\t",seqIn)
# s.split() method to separate the string s in words, where each word is an element
darthVader = "You don't know the power of the dark side"
c3po = darthVader.split()
print("\nOriginal message:\t\t",darthVader)
print("\nMessage after .split():\t\t",c3po)
# Applying ''.join() method after .split method
darthVader = ' '.join(c3po) # With ' '
print("\nMessage after ' '.join():\t\t",darthVader)
darthVader = '-'.join(c3po) # With '-' 63
print("\nMessage after '-'.join():\t\t",darthVader)
Método associados à manipulação de strings
www.python.org

O método ‘X’.join(ls) transforma uma lista ls numa string, inserindo o argumento X


entre os elementos da lista na composição da string.
# Program to handle strings, using string methods available in Python 3 (part 2).
seqIn = "GaTTaCa"
print("\nInitial sequence:\t\t",seqIn)
# s.swapcase() method to change from uppercase to lowercase and vice-versa in the string s
seqOut = seqIn.swapcase()
print("\nSwapped sequence:\t\t",seqOut)
# New initial sequence
seqIn = " GATTACA "
print("\nNew initial sequence:\t\t",seqIn)
# s.strip() method to get rid of spaces, tabs, and newlines in the string s
seqOut = seqIn.strip()
print("\nSequence without spaces:\t",seqOut)
# list(s) method to separate the string s in elements of a list
seqList = list(seqIn)
print("\nSequence as a list: \t\t",seqList)
# ''.join() method to merge all elements of a list in one string
seqIn = ''.join(seqIn)
print("\nThe sequence is back:\t\t",seqIn)
# s.split() method to separate the string s in words, where each word is an element
darthVader = "You don't know the power of the dark side"
c3po = darthVader.split()
print("\nOriginal message:\t\t",darthVader)
print("\nMessage after .split():\t\t",c3po)
# Applying ''.join() method after .split method
darthVader = ' '.join(c3po) # With ' '
print("\nMessage after ' '.join():\t\t",darthVader)
darthVader = '-'.join(c3po) # With '-' 64
print("\nMessage after '-'.join():\t\t",darthVader)
Método associados à manipulação de strings
www.python.org

O método s.split() divide uma string s em palavras, formando uma lista.

# Program to handle strings, using string methods available in Python 3 (part 2).
seqIn = "GaTTaCa"
print("\nInitial sequence:\t\t",seqIn)
# s.swapcase() method to change from uppercase to lowercase and vice-versa in the string s
seqOut = seqIn.swapcase()
print("\nSwapped sequence:\t\t",seqOut)
# New initial sequence
seqIn = " GATTACA "
print("\nNew initial sequence:\t\t",seqIn)
# s.strip() method to get rid of spaces, tabs, and newlines in the string s
seqOut = seqIn.strip()
print("\nSequence without spaces:\t",seqOut)
# list(s) method to separate the string s in elements of a list
seqList = list(seqIn)
print("\nSequence as a list: \t\t",seqList)
# ''.join() method to merge all elements of a list in one string
seqIn = ''.join(seqIn)
print("\nThe sequence is back:\t\t",seqIn)
# s.split() method to separate the string s in words, where each word is an element
darthVader = "You don't know the power of the dark side"
c3po = darthVader.split()
print("\nOriginal message:\t\t",darthVader)
print("\nMessage after .split():\t\t",c3po)
# Applying ''.join() method after .split method
darthVader = ' '.join(c3po) # With ' '
print("\nMessage after ' '.join():\t\t",darthVader)
darthVader = '-'.join(c3po) # With '-' 65
print("\nMessage after '-'.join():\t\t",darthVader)
Método associados à manipulação de strings
www.python.org

No final do programa temos a inserção de espaço ‘ ‘ e traço ‘-’ entre os elementos da


lista ls, com os métodos ‘ ‘.join(ls) e ‘-’.join(ls), respectivamente.
# Program to handle strings, using string methods available in Python 3 (part 2).
seqIn = "GaTTaCa"
print("\nInitial sequence:\t\t",seqIn)
# s.swapcase() method to change from uppercase to lowercase and vice-versa in the string s
seqOut = seqIn.swapcase()
print("\nSwapped sequence:\t\t",seqOut)
# New initial sequence
seqIn = " GATTACA "
print("\nNew initial sequence:\t\t",seqIn)
# s.strip() method to get rid of spaces, tabs, and newlines in the string s
seqOut = seqIn.strip()
print("\nSequence without spaces:\t",seqOut)
# list(s) method to separate the string s in elements of a list
seqList = list(seqIn)
print("\nSequence as a list: \t\t",seqList)
# ''.join() method to merge all elements of a list in one string
seqIn = ''.join(seqIn)
print("\nThe sequence is back:\t\t",seqIn)
# s.split() method to separate the string s in words, where each word is an element
darthVader = "You don't know the power of the dark side"
c3po = darthVader.split()
print("\nOriginal message:\t\t",darthVader)
print("\nMessage after .split():\t\t",c3po)
# Applying ''.join() method after .split method
darthVader = ' '.join(c3po) # With ' '
print("\nMessage after ' '.join():\t\t",darthVader)
darthVader = '-'.join(c3po) # With '-' 66
print("\nMessage after '-'.join():\t\t",darthVader)
Método associados à manipulação de strings
www.python.org

Ao executarmos o código methods4Strings3.py, temos os resultados mostrados


abaixo.

Initial sequence: GaTTaCa

Swapped sequence: gAttAcA

New initial sequence: GATTACA

Sequence without spaces: GATTACA

Sequence as a list: [' ', ' ', 'G', 'A', 'T', 'T', 'A', 'C', 'A', ' ']

The sequence is back: GATTACA

Original message: You don't know the power of the dark side

Message after .split(): ['You', "don't", 'know', 'the', 'power', 'of', 'the',
'dark', 'side']

Message after ' '.join(): You don't know the power of the dark side

Message after '-'.join(): You-don't-know-the-power-of-the-dark-side


67
Método associados à manipulação de strings
www.python.org

Uma lista completa dos métodos usados para manipulação de strings em Python pode
ser encontrada em:

http://www.tutorialspoint.com/python/python_strings.htm

Acesso em: 23 de novembro de 2016.

68
Módulo random
www.python.org

Vamos usar alguns programas simples na aula de hoje, para o estudo de números
aleatórios e loops. Os programas estão disponíveis no site:
http://www.delmarlearning.com/companions/content/1435455002/downloads/index.asp
?isbn=1435455002, acesso em: 23 de novembro 2016. Esses programas são
discutidos no livro: DAWSON, Michael. Python Programming, for the absolute
beginner. 3ed. Boston: Course Technology, 2010. 455 p.
Considere o programa craps_roller.py, mostrado abaixo. Vamos analisar cada linha de
código nos próximos slides. O programa simula o lançamento de dois dados, como
num jogo de cassino chamado “Craps Roller”, quem tiver interesse em saber quais
são as chances de ganhar no “Craps Roller”, veja o site:
http://www.math.uah.edu/stat/games/Craps.html, acesso em: 23 de novembro 2016.

# Craps Roller
# Demonstrates random number generation
import random

# generate random numbers 1 - 6


d1 = random.randint(1, 6)
d2 = random.randrange(6) + 1

total = d1 + d2 69
print("You rolled a", d1, "and a", d2, "for a total of", total)
Módulo random
www.python.org

A primeira linha importa o módulo random. Já vimos na aula anterior, que o comando
import é usado para carregar um arquivo com código previamente preparado. O
código carregado, com o comando import, passa a fazer parte do programa que o
chama. Assim, podemos chamar uma função específica do módulo carregado.
Normalmente, os módulos são preparados dentro de um tema, por exemplo, o módulo
random traz funções relacionadas à geração de números aleatórios. Na verdade, o
termo aleatório deveria ser substituído por “pseudoaleatório”, visto que o interpretador
Python usa uma equação para gerar os números ditos aleatórios, assim não podem
ser considerados aleatórios no sentido restrito da palavra. Para termos números
aleatórios, devemos usar fenômenos naturais, tais como decaimento de partículas
alfa, para, desta forma, obtermos uma sequência de números aleatórios. Mais
informações em: http://www.fourmilab.ch/hotbits/ , acesso em: 23 de novembro de
2016.
# Craps Roller
# Demonstrates random number generation
import random

# generate random numbers 1 - 6


d1 = random.randint(1, 6)
d2 = random.randrange(6) + 1

total = d1 + d2 70
print("You rolled a", d1, "and a", d2, "for a total of", total)
Módulo random
www.python.org

Para gerarmos os números com o módulo random, chamamos as funções


necessárias. Por exemplo, a função randint(), destacada em vermelho no código
abaixo. Para chamarmos a função, usamos a notação dot, vista anteriormente.
Especificamente, random.randint(1,6) retorna um número entre 1 e 6, incluindo os
extremos. Esse número é atribuído à variável d1. Se chamássemos a função
diretamente, com randint(1,6), teríamos uma mensagem de erro, especificamente, um
erro de sintaxe ou execução. Assim, a regra para o uso das funções presentes nos
módulos, é colocar o nome do módulo, ao qual pertence a função, seguido do
ponto “.” e o nome da função, como indicado no quadro abaixo.

modulo.função(argumento(s))

# Craps Roller
# Demonstrates random number generation
import random

# generate random numbers 1 - 6


d1 = random.randint(1, 6)
d2 = random.randrange(6) + 1

total = d1 + d2 71
print("You rolled a", d1, "and a", d2, "for a total of", total)
Módulo random
www.python.org

A função randrange(6) gera um número entre 0 e 5, ou seja, o número indicado como


argumento da função, não faz parte do conjunto de números pseudoaleatórios a
serem gerados pela função. Assim, se usarmos a função randrange() para gerar um
número pseudoaleatório entre 1 e 6, temos que somar “1” ao resultado, como
mostrado na linha de código em vermelho abaixo. Veja, como na função randint(), os
números gerados são inteiros, a diferença é que na função randrange() não
precisamos especificar o limite inferior, é assumido ser zero “0”. É usada a notação
dot, e o resultado atribuído à variável d2.

# Craps Roller
# Demonstrates random number generation
import random

# generate random numbers 1 - 6


d1 = random.randint(1, 6)
d2 = random.randrange(6) + 1

total = d1 + d2 72
print("You rolled a", d1, "and a", d2, "for a total of", total)
Módulo random
www.python.org

Como os números pseudoaleatórios foram atribuídos às variáveis d1 e d2, podemos


operar com os valores. A linha em destaque abaixo, realiza a soma dos valores
atribuídos às variáveis d1 e d2 e atribui o resultado à variável total. A linha seguinte
mostra o resultado na tela.

# Craps Roller
# Demonstrates random number generation
import random

# generate random numbers 1 - 6


d1 = random.randint(1, 6)
d2 = random.randrange(6) + 1

total = d1 + d2 73
print("You rolled a", d1, "and a", d2, "for a total of", total)
Comando if
www.python.org

Vimos, já na primeira aula, o comando if e seu uso na ramificação da execução de um


código em Python. Se não tivéssemos a possibilidade de ramificação da execução do
código, os programas seguiriam seu caminho definido, do primeiro ao último comando,
sem a possibilidade de ramificações. O comando if tem esta qualidade, ramificar a
execução, vinculado a um teste que, dependendo do resultado, tomará um caminho
ou outro. Vimos até o momento o if isolado, bem como o if com o else. Além desses
citados, temos o elif, o quadro no próximo slide ilustra o uso do if, else e elif.

74
Comando if
www.python.org

Comando Descrição
If condição : O comando if testa a condição, e, caso seja verdadeira, executa
bloco... o bloco de comandos. Caso seja falsa, pula o bloco de
comandos.
If condição: O comando if testa a condição, e, caso seja verdadeira, executa
bloco 1 o bloco 1 de comandos. Caso seja falsa, executa o bloco 2 de
else: comandos, vinculado ao else.
bloco 2
If condição 1: O comando if testa a condição 1, e, caso seja verdadeira,
bloco 1 executa o bloco 1 de comandos e ignora os elif e else, mesmo
elif condição 2: que esses tenham condições verdadeiras. Caso seja falsa, testa
bloco 2 a condição 2, se verdadeira, executa o bloco 2 e ignora os outros
elif condição 3: elif e else, se presentes. Essa abordagem é seguida pelos outros
bloco 3 elif e else, se presentes. Veja, uma vez que uma das condições é
.... satisfeita, o bloco referente a esta condição é executado e o
elif condição N: programa ignora os outros elif e else, se presentes.
bloco N
else:
bloco N + 1 75
Comando if
www.python.org

Veremos o programa mood_computer.py, disponível no site:


http://www.delmarlearning.com/companions/content/1435455002/downloads/index.asp
?isbn=1435455002, acesso em: 23 de novembro de 2016. Como o código tem mais
de 50 linhas, mostraremos por trechos. O programa é uma simulação de um teste de
humor. Não se preocupe, não teremos eletrodos colocados na sua cabeça para
testarmos o seu humor. O humor mostrado será resultado de um número
pseudoaleatório. Só para ilustrarmos o uso do comando if. Nas décadas de 1970 e
1980 era comum as pessoas usarem um anel de humor que, conforme a sua
coloração, poderíamos inferir o humor. Na verdade o suposto “anel do humor” era
simplesmente uma bijuteria, onde a pedra do anel tinha um líquido que mudava de cor
conforme a temperatura, nada relacionado ao humor da pessoa.

76
Comando if
www.python.org

No primeiro trecho, temos o comando import, onde o módulo random é chamado.


Depois temos duas funções print(), que mostram mensagens referentes à simulação
do humor. Em seguida, temos a chamada da função randint(1,3), que gera um número
pseudoaleatório inteiro entre 1 e 3. Temos, então, o teste da primeira condição com o
comando if, que caso seja “1”, mostra uma face feliz.
import random

print("I sense your energy. Your true emotions are coming across my screen.")
print("You are...")

mood = random.randint(1, 3)

if mood == 1:
# happy
print( \
"""
-----------
| |
| O O |
| < |
| |
| . . |
| `...` |
----------- 77
""")
Comando if
www.python.org

No segundo trecho, temos o elif, onde realizamos o teste da segunda condição, que
caso seja “2”, mostra uma face neutra.

elif mood == 2:
# neutral
print( \
"""
-----------
| |
| O O |
| < |
| |
| ------ |
| |
-----------
""")

78
Comando if
www.python.org

No terceiro trecho, temos o último elif, onde realizamos o teste da terceira condição,
que caso seja “3”, mostra uma face triste.

elif mood == 3:
# sad
print( \
"""
-----------
| |
| O O |
| < |
| |
| .'. |
| ' ' |
-----------
""")

79
Comando if
www.python.org

Em seguida temos o else, que neste caso é desnecessário, visto que todas as
possibilidades já foram testadas, mas é uma boa política deixarmos como uma
cláusula de segurança, onde se números que não estivessem entre 1 e 3 surgissem, a
situação seria tratada. Em um código relativamente simples como este, pode parecer
excesso de zelo, mas imagine um programa com 10 mil linhas de código, com
centenas de ramificações. Tal zelo pode evitar resultados catastróficos. Depois do
bloco do else, temos uma função print().

else:
print("Illegal mood value! (You must be in a really bad mood).")

print("...today.")

80
Comando if
www.python.org

Vamos ao resultado do programa.

I sense your energy. Your true emotions are coming across my screen.
You are...

-----------
| |
| O O |
| < |
| |
| . . |
| `...` |
-----------

...today.

81
Loop for
www.python.org

Vamos considerar o programa showCharacters.py, que mostra cada caractere de uma


string, um por vez. Temos neste programa um comando para repetição de um trecho
de código, chamado loop for. O loop for está destacado nas linhas vermelhas. O loop
for atribui cada caractere contido na string myString à variável char, no loop for temos
a função print(char), que será repetida enquanto houver caracteres na string myString.
Cada caractere é mostrado numa linha. Veja que a função print() está recuada para
direita, este recurso é obrigatório quando usamos o loop for, delimita o bloco que será
executado no loop for. Veja, também, que finalizamos a linha onde está o loop for com
: , esta parte também é obrigatória para o uso do loop for.

# Program to show the characters in a string, one in each line


myString = "Python"

# Looping through the string


for char in myString:
print(char)

82
Loop for
www.python.org

Abaixo temos o resultado da execução do programa showCharacters.py, vemos que


cada caractere da string “Python” é mostrado numa linha. O loop for caminha sobre a
string myString, um caractere por vez, este processo é chamada iteração, tem a ideia
de repetição. Em inglês é usado o termo “iteration”. Outro ponto a ser destacado, o
loop for usa o recurso do recuo, em inglês “indentation”, para destacar o bloco que
será executado no loop. Especificamente, o bloco tem somente a função print().

P
y
t
h
o
n

83
Loop for
www.python.org

O loop for pode varrer listas, como vemos no código showElements.py, que mostra os
elementos na lista myList. A lógica de programação é mesma do programa
showCharacters.py, só trocamos a string por lista. O resultado é que o loop for mostra
agora um elemento da lista por vez, um em cada linha. O loop for está destacado em
vermelho. Veja que cada elemento da lista myList é uma string. Separamos os
elementos da lista por vírgulas, como mostrado para a lista na definição da lista
myList, na segunda linha do programa abaixo.

# Program to show the elements in a list, one in each line


myList = ["Python","is","cool"]

# Looping through the list


for elements in myList:
print(elements)

Ao executarmos o programa showElements.py, temos o resultado abaixo


Python
is
cool
84
Loop for
www.python.org

Vejamos um outro exemplo do loop for, agora com o comando range(). O range()
define uma faixa de números inteiros que pode ser varrida por um loop for. O código
showNumbers1.py está mostrado abaixo. O range(10) gera uma lista de números
inteiros que inicia em zero e termina em 9. O loop for abaixo repete o bloco de
comando, no caso o print(i) o número de vezes definido no range().

# Program to show numbers


for i in range(10):
print(i)

Ao executarmos o programa showNumbers1.py, temos o resultado abaixo.


0
1
2
3
4
5
6
7
8
9
85
Loop for
www.python.org

O range() também pode definir o número inicial e final da lista, bem como o passo.
Abaixo temos um exemplo no código showNumbers2.py, o range() inicia em 1 e
termina em 19, com passo 2.

# Program to show numbers


for i in range(1,20,2):
print(i)

Ao executarmos o programa showNumbers2.py, temos o resultado abaixo.


1
3
5
7
9
11
13
15
17
19
86
Loop while
www.python.org

Outro tipo de loop é o while, que executa um bloco de código, enquanto uma
determinada condição for satisfeita. Uma vez que a condição não seja mais satisfeita,
o programa sai do loop while. Abaixo temos a estrutura geral do loop while.

while condição:
bloco vinculado à condição

O loop while assemelha-se ao comando if, o bloco de código é executado se a


condição for satisfeita. A diferença reside que o loop while executa o bloco de forma
repetida, até que a condição não seja mais satisfeita. Isto pode levar a uma situação
onde a condição nunca seja satisfeita, o que chamamos de loop infinito. A condição,
testada no início, é testada depois da execução do bloco de código, assim, espera-se
que tenhamos uma variável, que durante uma dada execução do bloco, irá mudar,
para que a condição não seja mais satisfeita e a execução do bloco vinculada à
condição do loop while seja encerrada.

87
Loop while
www.python.org

Abaixo temos o código showNumbers3.py que usa um loop while para gerar números
entre 0 e 9. Veja que inicialmente é atribuído zero à variável i. No loop while a variável
i é testada, caso seja menor que 10 o bloco relacionado ao while é executado, no
caso o print(i) seguido de i+= 1. Esta última linha indica que será somado um à
variável i. Em seguida a condição (i<10) é testada novamente. O loop é repetido até
que a variável i atinja o valor 10, quando o loop será finalizado. A variável i no loop
while é chamada variável sentinela, pois seu estado que sinaliza quando o loop deve
encerrar.

# Program to show numbers


i = 0
while i < 10:
print(i)
i += 1

88
Loop while
www.python.org

Ao executarmos o programa showNumbers3.py, temos o resultado abaixo

0
1
2
3
4
5
6
7
8
9

89
Comandos break e continue
www.python.org

Os loops infinitos podem ser considerados erros de lógica, mas podemos ter um loop
potencialmente infinito que tenha uma condição de saída, conseguida com o comando
break. Podemos, ainda, ter a necessidade de omitirmos a execução de parte de um
bloco de um loop, voltando para o topo do bloco do loop. Isto é conseguido com o
comando continue. Veremos o programa skip_7.py que mostra na tela uma contagem
de 1 até 10, mas omite o número 7. O código chama-se skip_7.py, indicado abaixo.

count = 0
while True :
count += 1
# end loop if count greater than 10
if count > 10:
break
# skip 7
if count == 7:
continue
print(count) 90
Comandos break e continue
www.python.org

A primeira linha do código é a atribuição de zero à variável count, que será usada
como contador de iterações do loop. Em seguida temos o início do loop while, veja
que a condição é sempre verdadeira, while True: gera um loop infinito, que será
interrompido com o teste de uma condição de saída. Antes dessa condição, somamos
1 ao valor atribuído à variável count e atribuímos o resultado ao contador count, com
count += 1. Cada passagem do loop teremos “1” somado e atribuído à variável count.

count = 0
while True :
count += 1
# end loop if count greater than 10
if count > 10:
break
# skip 7
if count == 7:
continue
print(count) 91
Comandos break e continue
www.python.org

Depois testamos se o contador é maior que 10, com o comando if, caso seja maior
que 10, o bloco do if é executado. Neste bloco temos o comando break, que faz
exatamente isto, quebra a sequência de execução do bloco associado ao while e sai
do loop. Em seguida testamos se o contador é 7, caso seja, o bloco do if é executado,
onde temos o comando continue, que pula para o início do loop while e testa a
condição do loop, e como é sempre verdadeira, continua a execução. O resultado
líquido é que o número 7 não é mostrado na tela.

count = 0
while True :
count += 1
# end loop if count greater than 10
if count > 10:
break
# skip 7
if count == 7:
continue
print(count) 92
Comandos break e continue
www.python.org

Vamos ao resultado do programa.

1
2
3
4
5
6
8
9
10

93
Programa guess_my_number.py
www.python.org

Veremos a aplicação dos conceitos vistos hoje num programa de jogo, onde você
tenta adivinhar um número pseudoaleatório entre 1 e 100 gerado pelo computador, o
programa chama-se guess_my_number.py. Veremos a execução do programa antes
de vermos seu código.

Welcome to 'Guess My Number'!

I'm thinking of a number between 1 and 100.


Try to guess it in as few attempts as possible.

Take a guess: 50
Lower...
Take a guess: 25
Higher...
Take a guess: 38
Higher...
Take a guess: 44
You guessed it! The number was 44
And it only took you 4 tries!

94
Programa guess_my_number.py
www.python.org

O programa guess_my_number.py está mostrado abaixo. A primeira linha importa o


módulo random, que tem as funções para gerarmos números pseudoaleatórios.

import random
print("\tWelcome to 'Guess My Number'!")
print("\nI'm thinking of a number between 1 and 100.")
print("Try to guess it in as few attempts as possible.\n")
the_number = random.randint(1, 100)
guess = int(input("Take a guess: "))
tries = 1
while guess != the_number: # guessing loop
if guess > the_number:
print("Lower...")
else:
print("Higher...")
guess = int(input("Take a guess: "))
tries += 1
print("You guessed it! The number was", the_number)
print("And it only took you", tries, "tries!\n") 95
Programa guess_my_number.py
www.python.org

As três linhas seguintes são funções print() que mostram uma mensagem de boas-
vindas e informações sobre o jogo.

import random
print("\tWelcome to 'Guess My Number'!")
print("\nI'm thinking of a number between 1 and 100.")
print("Try to guess it in as few attempts as possible.\n")
the_number = random.randint(1, 100)
guess = int(input("Take a guess: "))
tries = 1
while guess != the_number: # guessing loop
if guess > the_number:
print("Lower...")
else:
print("Higher...")
guess = int(input("Take a guess: "))
tries += 1
print("You guessed it! The number was", the_number)
print("And it only took you", tries, "tries!\n") 96
Programa guess_my_number.py
www.python.org

Depois usamos a função randint(1,100) do módulo random, para gerar um número


pseudoaleatório entre 1 e 100. O número gerado será atribuído à variável the_number.

import random
print("\tWelcome to 'Guess My Number'!")
print("\nI'm thinking of a number between 1 and 100.")
print("Try to guess it in as few attempts as possible.\n")
the_number = random.randint(1, 100)
guess = int(input("Take a guess: "))
tries = 1
while guess != the_number: # guessing loop
if guess > the_number:
print("Lower...")
else:
print("Higher...")
guess = int(input("Take a guess: "))
tries += 1
print("You guessed it! The number was", the_number)
print("And it only took you", tries, "tries!\n") 97
Programa guess_my_number.py
www.python.org

O programa agora pergunta ao usuário pelo o número que ele acha que foi escolhido
pelo computador, e atribui esse número à variável guess. O número 1 é atribuído à
variável tries, que indica o número de tentativas que o jogador fez.

import random
print("\tWelcome to 'Guess My Number'!")
print("\nI'm thinking of a number between 1 and 100.")
print("Try to guess it in as few attempts as possible.\n")
the_number = random.randint(1, 100)
guess = int(input("Take a guess: "))
tries = 1
while guess != the_number: # guessing loop
if guess > the_number:
print("Lower...")
else:
print("Higher...")
guess = int(input("Take a guess: "))
tries += 1
print("You guessed it! The number was", the_number)
print("And it only took you", tries, "tries!\n") 98
Programa guess_my_number.py
www.python.org

A condição do loop while, é que o valor atribuído à variável guess seja diferente do
atribuído à variável the_number, ou seja, o bloco do loop while será executado,
enquanto os números forem diferentes.

import random
print("\tWelcome to 'Guess My Number'!")
print("\nI'm thinking of a number between 1 and 100.")
print("Try to guess it in as few attempts as possible.\n")
the_number = random.randint(1, 100)
guess = int(input("Take a guess: "))
tries = 1
while guess != the_number: # guessing loop
if guess > the_number:
print("Lower...")
else:
print("Higher...")
guess = int(input("Take a guess: "))
tries += 1
print("You guessed it! The number was", the_number)
print("And it only took you", tries, "tries!\n") 99
Programa guess_my_number.py
www.python.org

No bloco do loop temos o comando if, que testa se o valor atribuído à variável guess é
maior que ao atribuído à variável the_number, caso seja, o programa mostra a
mensagem “Lower...”, indicando que o jogador deve digitar um número menor.

import random
print("\tWelcome to 'Guess My Number'!")
print("\nI'm thinking of a number between 1 and 100.")
print("Try to guess it in as few attempts as possible.\n")
the_number = random.randint(1, 100)
guess = int(input("Take a guess: "))
tries = 1
while guess != the_number: # guessing loop
if guess > the_number:
print("Lower...")
else:
print("Higher...")
guess = int(input("Take a guess: "))
tries += 1
print("You guessed it! The number was", the_number)
print("And it only took you", tries, "tries!\n") 100
Programa guess_my_number.py
www.python.org

Caso o valor atribuído à variável guess, não seja maior que o atribuído à variável
the_number, é mostrada a mensagem “Higher ...”, para que o jogador digite um
número mais alto.

import random
print("\tWelcome to 'Guess My Number'!")
print("\nI'm thinking of a number between 1 and 100.")
print("Try to guess it in as few attempts as possible.\n")
the_number = random.randint(1, 100)
guess = int(input("Take a guess: "))
tries = 1
while guess != the_number: # guessing loop
if guess > the_number:
print("Lower...")
else:
print("Higher...")
guess = int(input("Take a guess: "))
tries += 1
print("You guessed it! The number was", the_number)
print("And it only took you", tries, "tries!\n") 101
Programa guess_my_number.py
www.python.org

Depois é lido um novo valor para o número e atribuído à variável guess. É somado 1
ao valor atribuído à variável tries. O bloco de comandos é executado, até que a
condição do while não seja mais satisfeita, ou seja, o jogador achou o número.

import random
print("\tWelcome to 'Guess My Number'!")
print("\nI'm thinking of a number between 1 and 100.")
print("Try to guess it in as few attempts as possible.\n")
the_number = random.randint(1, 100)
guess = int(input("Take a guess: "))
tries = 1
while guess != the_number: # guessing loop
if guess > the_number:
print("Lower...")
else:
print("Higher...")
guess = int(input("Take a guess: "))
tries += 1
print("You guessed it! The number was", the_number)
print("And it only took you", tries, "tries!\n") 102
Programa guess_my_number.py
www.python.org

Como o programa só sairá do bloco do loop while, quando o jogador acertar o número,
colocamos, logo após os comandos do loop while, duas funções print() com as
informações sobre o número encontrado e o número de tentativas necessárias.

import random
print("\tWelcome to 'Guess My Number'!")
print("\nI'm thinking of a number between 1 and 100.")
print("Try to guess it in as few attempts as possible.\n")
the_number = random.randint(1, 100)
guess = int(input("Take a guess: "))
tries = 1
while guess != the_number: # guessing loop
if guess > the_number:
print("Lower...")
else:
print("Higher...")
guess = int(input("Take a guess: "))
tries += 1
print("You guessed it! The number was", the_number)
print("And it only took you", tries, "tries!\n") 103
Estrutura de Dados em Python (Tuple)
www.python.org

Um tuple é similar a uma lista, e é representado entre parênteses, como mostrado


abaixo.

my_tuple = ("P","y","t","h","o","n")

Assim, se quisermos mostrar todo o conteúdo atribuído à variável my_tuple, basta


usarmos um loop for e colocarmos uma função print(), como mostrado abaixo.
for char in my_tuple:
print(char)

A execução do código mostrará uma letra por linha, o arquivo showTuple.py tem o
código do programa.

104
Estrutura de Dados em Python (Tuple)
www.python.org

Até agora tuple parece bem similar com a lista. Uma das principais diferenças é que
um tuple ocupa menos memória e tem acesso mais rápido. Para programas com listas
extensas é vantajoso o uso de tuple.
Outras diferenças estão mostradas na tabela abaixo.

Lista Tuple
Mutável Imutável
[elemento1,....] (elemento1,....)

105
Programa: holodeck.py
www.python.org

Holodeck

Programa: holodeck.py

Resumo
O holodeck é um sistema de simulação computacional de realidade virtual,
mostrado na série de ficção científica Star Trek. O presente programa simula
uma situação onde você se encontra aprisionado no holodeck e tem acesso a
um terminal de computador. Do terminal você prepara um código em Python,
que permite que você gere um arquivo de saída (mensagem.txt) com seu pedido
de socorro.

106
Programa: holodeck.py
www.python.org

Programa: holodek.py
Você está preso no holodeck da nave
USS Enterprise, sem ter como sair ou se
comunicar pelas vias usuais.
Aparentemente os romulanos tomaram a
Enterprise. Em todo caso, você acessa
um terminal de computador, que por uma
falha na segurança, permite o envio de
uma mensagem, via um programa em
Python. Que sorte a sua que você sabe
Python!
Prepare um programa em Python que cria
Visão do holodeck da USS Enterprise.
um arquivo chamado mensagem.txt e Disponível em:
armazena a mensagem em texto que <
http://techspecs.acalltoduty.com/images/galaxy/holodeck
você digitará. .jpg
>
Acesso em: 23 de novembro de 2016.

107
Exercícios de Programação
www.python.org

Exercício de programação 2. Escreva um programa que simula um biscoito da sorte


chinês. O programa deve mostrar uma entre cinco previsões, de forma aleatória, cada
vez que é executado. Nome do programa: fortune_cookie.py.

Exercício de programação 3. Escreva um programa que simula o lançamento de


uma moeda 100 vezes. Depois o programa mostra o número de vezes que deu cara e
que deu coroa. Nome do programa: flip_a_coin.py .

Exercício de programação 4. Modifique o programa guess_my_number.py, de forma


que o jogador tenha um número limitado de tentativas. Se o jogador não consegue
acertar o número gerado pelo computador, num número definido de tentativas, serão
mostradas na tela o número certo e uma mensagem para o jogador. Nome do
programa: limited_guess_my_number.py .

Exercício de programação 5. Escreva um programa, onde o jogador troca de lugar


com o computador. Isto é, o jogador escolhe um número aleatório entre 1 e 100 e o
computador tenta que adivinhar que número é esse. Nome do programa:
robot_guess_game.py . 108
Referências
www.python.org

ALBERTS, B. et al. Biologia Molecular da Célula. 4a edição. Porto Alegre: Artmed editora, Porto Alegre, 2004.

-BRESSERT, Eli. SciPy and NumPy. Sebastopol: O’Reilly Media, Inc., 2013. 56 p.

-DAWSON, Michael. Python Programming, for the absolute beginner. 3ed. Boston: Course Technology, 2010. 455 p.

-HETLAND, Magnus Lie. Python Algorithms. Mastering Basic Algorithms in the Python Language. Nova York: Springer
Science+Business Media LLC, 2010. 316 p.

-IDRIS, Ivan. NumPy 1.5. An action-packed guide dor the easy-to-use, high performance, Python based free open source
NumPy mathematical library using real-world examples. Beginner’s Guide. Birmingham: Packt Publishing Ltd., 2011. 212 p.

-KIUSALAAS, Jaan. Numerical Methods in Engineering with Python. 2ed. Nova York: Cambridge University Press, 2010. 422
p.

-LANDAU, Rubin H. A First Course in Scientific Computing: Symbolic, Graphic, and Numeric Modeling Using Maple, Java,
Mathematica, and Fortran90. Princeton: Princeton University Press, 2005. 481p.

-LANDAU, Rubin H., PÁEZ, Manuel José, BORDEIANU, Cristian C. A Survey of Computational Physics. Introductory
Computational Physics. Princeton: Princeton University Press, 2008. 658 p.

-LUTZ, Mark. Programming Python. 4ed. Sebastopol: O’Reilly Media, Inc., 2010. 1584 p.

-MODEL, Mitchell L. Bioinformatics Programming Using Python. Sebastopol: O’Reilly Media, Inc., 2011. 1584 p.

-TOSI, Sandro. Matplotlib for Python Developers. Birmingham: Packt Publishing Ltd., 2009. 293 p.

Última atualização 23 de novembro de 2016. 109

Você também pode gostar