Python
Python
1. Introdução
2. Abrindo o Apetite
3. Uma introdução ao Mundo Python
i. Por que Python?
ii. Tipagem Dinâmica
iii. Linguagem Interpretada X Linguagem Compiladas
iv. Bloco por Indentação
4. Variáveis e Entradas de Dados
i. Variáveis Numéricas
ii. Variáveis Lógicas
i. Operadores lógicos
iii. Variáveis String
i. Operações com Strings
iv. Entrada de dados
v. Exercícios
5. Condições
i. if
ii. else
iii. elif
iv. Exercícios - Condições
6. Repetições
i. while
ii. for
iii. Exercícios - Repetições
7. Estruturas de dados e Listas
i. Listas
ii. Tuplas
iii. Set
iv. Dicionário
v. Exercícios - Listas
vi. Exercícios - Tuplas
vii. Exercícios - Dicionário
8. Um pouco mais sobre Strings
i. Exercícios - String
9. Funções
10. Exercícios
i. Números Aleatórios
ii. String
Curso de Verão
Python
Este material foi criado com base na documentação oficial e no Livro Introdução à Programação com Python, de Nilo Ney
Coutinho Menezes publicado pela Novatec (ótimas fontes de estudos).
Ele servirá como fonte de estudo no curso de verão 2015 realizado pelo PET CC.
Esperamos que seja util para seus estudos e como fonte de consulta. Os seguintes pontos serão vistos durante o curso:
Abrindo o Apetite
Uma introdução ao Mundo Python
Por que Python?
Tipagem Dinâmica
Linguagem Interpretada X Linguagem Compiladas
Bloco por Indentação
Variáveis e Entradas de Dados
Variáveis Numéricas
Variáveis Lógicas
Operadores lógicos
Variáveis String
Operações com Strings
Entrada de dados
Exercícios
Condições
if
else
elif
Exercícios - Condições
Repetições
while
for
Exercícios - Repetições
Estruturas de dados e Listas
Listas
Tuplas
Set
Dicionário
Exercícios - Listas
Exercícios - Tuplas
Exercícios - Dicionário
Um pouco mais sobre Strings
Exercícios - String
Funções
Exercícios
Números Aleatórios
String
Abrindo o Apetite
FONTE: PyDoc
Se você trabalha muito com computadores, acabará encontrando alguma tarefa que gostaria de automatizar. Por exemplo,
você pode querer fazer busca-e-troca em um grande número de arquivos de texto, ou renomear e reorganizar um monte
de arquivos de fotos de uma maneira complicada. Talvez você gostaria de escrever um pequeno banco de dados
personalizado, ou um aplicativo GUI especializado, ou um jogo simples.
Se você é um desenvolvedor de software profissional, pode ter que trabalhar com várias bibliotecas C/C++/Java, mas o
tradicional ciclo escrever/compilar/testar/recompilar é muito lento. Talvez você esteja escrevendo um conjunto de testes
para uma biblioteca e está achando tedioso codificar os testes. Ou talvez você tenha escrito um programa que poderia
utilizar uma linguagem de extensão, e você não quer conceber e implementar toda uma nova linguagem para sua
aplicação.
Você poderia escrever um script para o shell do Unix ou arquivos em lote do Windows para algumas dessas tarefas, mas
scripts shell são bons para mover arquivos e alterar textos, mas não adequados para aplicações GUI ou jogos. Você
poderia escrever um programa em C/C++/Java, mas pode tomar tempo de desenvolvimento para chegar até um primeiro
rascunho. Python é mais simples, está disponível em Windows, Mac OS X, e sistemas operacionais Unix, e vai ajudá-lo a
fazer o trabalho mais rapidamente.
Python é fácil de usar, sem deixar de ser uma linguagem de programação de verdade, oferecendo muito mais estruturação
e suporte para programas extensos do que shell scripts oferecem. Por outro lado, Python também oferece melhor
verificação de erros do que C, e por ser uma linguagem de muito alto nível, ela possui tipos nativos de alto nível:
dicionários e vetores (arrays) flexíveis. Devido ao suporte nativo a uma variedade de tipos de dados, Python é aplicável a
um domínio de problemas muito mais vasto do que Awk ou até mesmo Perl, ainda assim muitas tarefas são pelo menos
tão fáceis em Python quanto nessas linguagens.
Python permite que você organize seu programa em módulos que podem ser reutilizados em outros programas escritos
em Python. A linguagem provê uma vasta coleção de módulos que podem ser utilizados como base para sua aplicação —
ou como exemplos para estudo e aprofundamento. Alguns desses módulos implementam manipulação de arquivos,
chamadas do sistema, sockets, e até mesmo acesso a bibliotecas de construção de interfaces gráficas, como Tk.
Python é uma linguagem interpretada, por isso você pode economizar um tempo considerável durante o desenvolvimento,
uma vez que não há necessidade de compilação e vinculação (linking). O interpretador pode ser usado interativamente, o
que torna fácil experimentar diversas características da linguagem, escrever programas “descartáveis”, ou testar funções
em um desenvolvimento bottom-up. É também uma útil calculadora de mesa.
Python permite a escrita de programas compactos e legíveis. Programas escritos em Python são tipicamente mais curtos
do que seus equivalentes em C, C++ ou Java, por diversas razões:
os tipos de alto nível permitem que você expresse operações complexas em um único comando;
a definição de bloco é feita por indentação ao invés de marcadores de início e fim de bloco;
não há necessidade de declaração de variáveis ou parâmetros formais;
Python é extensível: se você sabe como programar em C, é fácil adicionar funções ou módulos diretamente no
interpretador, seja para desempenhar operações críticas em máxima velocidade, ou para vincular programas Python a
bibliotecas que só estejam disponíveis em formato binário (como uma biblioteca gráfica de terceiros). Uma vez que você
tenha sido fisgado, você pode vincular o interpretador Python a uma aplicação escrita em C e utilizá-la como linguagem de
comandos ou extensão para esta aplicação.
A propósito, a linguagem foi batizada a partir do famoso show da BBC “Monty Python’s Flying Circus” e não tem nada a ver
com répteis. Fazer referências a citações do show na documentação não é só permitido, como também é encorajado!
Agora que você está entusiasmado com Python, vai querer conhecê-la com mais detalhes. Partindo do princípio que a
melhor maneira de aprender uma linguagem é usando-a, você está agora convidado a fazê-lo com este tutorial.
Uma Introdução ao Mundo Python
O que é Python?
"Python é uma linguagem de programação poderosa e fácil de aprender. Ela possui estruturas de dados de alto
nível e uma simples mas eficiente abordagem da programação orientada a objetos. Sua elegante sintaxe e tipagem
dinâmica juntamente com seu interpretador nativo fazem dela a linguagem ideal para scripting e desenvolvimento
rápido de aplicações em diversas áreas sob várias plataformas."
Bem, achamos está uma ótima definição para o Python, principalmente por ser dado pelo seu próprio criador.
Por que Python?
Até agora você deve ter percebido várias características desta linguagem que a tornam uma ótima opção. Ela é simples,
clara, objetiva. O que não a torna menos poderosa que outras linguagem.
Python também é um software livre, ou seja, está disponível para ser utilizada gratuitamente (agradeça ao Python
Foundation e aos seus vários colaboradores). Além disso, ela não te limita a um sistema operacional ou a uma
arquiterura... mais liberdade.
Se você ainda está se perguntando quem usa Python ou para que vou usar essa linguagem... bem, inteligência artificial,
banco de dados, biotecnologia, animação 3D, aplicativos móveis, jogos, aplicativos web, estas são algumas das utilidades
do Python. Além disso, grandes empresas e aplicativos utilizam a linguagem, como a [Link], Netflix, Google, Amazon
Web Service, etc.
Mas adiante veremos outros motivos para considerar Python uma ótima linguagem de programação tanto para iniciantes
quanto para programadores experiêntes.
Tipagem Dinâmica
Para entender tipagem dinâmica, precisamos ter em mente um dos conceitos básicos de programação, o conceito de
variável. A variável é uma entidade que possui um conjunto de atributos como nome, tipo e valor. Por exemplo se
imaginarmos a memória de um computador como sendo uma estate de um depósito, em que cada compartimento
representa um espaço de memória, podemos também imaginar uma váriável como sendo uma caixa que pode ser
armazenada nessa estante.
Nessa analogia, um pouco surpeficial, dizemos que o nome da váriável é um rótulo que está associado a ela e quando
formos procurar-la temos que buscar por esse rótuno. O tipo é basicamente a especificação de quais informações podem
ser guardadas na caixa, ou em outras palavras, o tipo e tamanho do material que pode ser armazenado nela. Já o valor é
o conteúdo armazenado dentro da caixa. Então, se dermos o nome idade a uma váriável e quisermos atribuir um valor a
ela devemos fazer idade = 19 . Dessa forma estamos dizendo que a variável idade está recebendo o valor 19 que por
sua vez é do tipo inteiro ( int ).
Agora que o conceito de variável está mais claro, quando estamos programando em Python podemos ter variáveis
armazenando valores de diversos tipos, desde valóres numéricos, lógicos, até mesmo caracteres e textos (strings). Alguns
desses tipos serão vistos nas próximas seções por meio de exemplos.
Na linguagem Python, não há a necessidade de declarar o tipo da variável; para criar uma, basta atribuir um valor a ela.
Como em idade . Nesse caso, o tipo da variável pode variar durante a execução do programa.
IMPORTANTE : Como foi dito: a variável possui um tipo. Ao declarar idade = 19 , a variável idade assume o tipo
int . A questão aqui, é que o tipo que a variável assume pode variar ao logo da execução, em função do dado que ela
armazena.
Linguagem Interpretada X Linguagem Compilada
Esse assunto para muitos desenvolvedores ainda é algo um pouco confuso e rende muitas discussões entre várias
comunidades de programadores. É importante falarmos sobre ele para que possamos fazer uma comparação do
desempenho do Python e de outras linguagens, e o processo de interpretação e compilação irá nos ajudar nisso.
No processo de Compilação, programas podem ser traduzidos para linguagem de máquina, que pode ser executada
diretamente no computador. Basicamente, nós teremos o que chamamos de código fonte, esse código será analizado
lexicalmente e sintaticamente na tentativa de encontrar possíveis erros, esse processo gera um código intermediário (não
mais na linguagem do código fonte). Nesse momento, mais uma análise é feita no código intermediário, a análise
semántica. Por fim, o código intermediário passa por uma otimização se transformando na linguagem de máquina. A
vantagem deste método é que a execução se torna bastante rápida, já que o processo de tradução já está completo.
Já no processo de Interpretação, temos uma abordagem diferente. Nesse caso o programa é interpretado por outro
programa chamado interprete. O programa interprete vai agir como uma simulação de uma máquina cujo o ciclo de
execução trata com linguagem de alto nível em vez de instruções de máquina. Essa simulaçao fornece uma máquina
virtual para o linguagem. Uma das vantagens desse método é a detecção de erros, isso por que se houver alguma
inregularidade uma mensagem de erro será exebida em tempo de execução, e irá se referir aquela unidade específica do
código. Porém, uma desvatagem é o tempo gasto no processo se formos compará-lo ao processo da compilação. Isso por
que toda vez que vamos executar nosso programa, ele passará por esse mesmo processo de interpretação.
Bloco por Indentação
Se você tem alguma experiência com Python, então deve saber que diferentes de outras linguagens que utilizam
marcadores para delimitar trechos de códigos, por exemplo:
if (true) {
/* código do bloco */
}
Nele basta você usar a indentação para demarcar os blocos. Como no exemplo:
if (true):
# bloco de código
# (ao fim da seção indentada
# termina o bloco)
# próxima instrução (após o if)
É importante perceber que isso vai "exigir" certos cuidados. Para alguns, utilizar a identação (e deixar de lado as comuns
instruções delimitadoras) pode parecer estranho, e de certa forma desorganizado. Mas com o tempo, você vai notar que o
código vai ficar ainda mais legível e você acabará tendo que ser ainda mais organizado para não gerar erros.
Importante ¹ : É importante convencionar se a indentação será feita por uma tabulação ou por um número determinado de
espaços, já que todas as pessoas editando um programa Python devem usar o mesmo tipo. Uma boa dica que evita
confusão é usar 4 espaços para cada nível.
Variáveis e Entradas de Dados
Até esse ponto, você já entendeu o que é uma variável. Agora, precisamos trabalhar alguns conceitos mais amplos, como
regras para nomear variáveis, ou as características e recursos que as variáveis assumem ao serem tipadas.
Nomes de variáveis
No caso de Python, nomes de variáveis podem conter números, porém é obrigatório que você comece com letra ou com o
símbolo _ .
Na versão 3 do Python, é permitida a utilização de acentos em nomes de variáveis (isso por que os programas são
interpretados utilizando o conjunto de caracteres UTF-8).
Outro ponto importante que devemos chamar atenção é para as palavras reservadas. Palavras reservadas definem as
regras e a estrutura da linguagem e não podem ser usadas como nomes de variáveis ².
Você também pode obter a lista de palavras reservadas com estes comandos: import keyword; print [Link] .
Variáveis Numéricas
Quando uma variável armazena um número inteiro ou ponto flutuante ela pode ser chamada de variável numérica.
>>> largura = 20
>>> algura = 5*9
>>> largura * altura
900
Em operação com operandos de diferentes tipos, há a conversão do inteiro para ponto flutuante:
Números complexos também são suportados; números imaginários são escritos com o sufixo j ou J. Números complexos
com parte real não nula são escritos como (real+imagJ), ou podem ser criados pela chamada de função complex(real,
imag).
>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)
Algumas funções realizam a conversão para float e inteiro, float(), int() e long(), porém no caso dos números complexos
elas não funcionam. Nesse caso use abs(z) para obter sua magnitude (como um float) ou [Link] para obter sua parte real.
>>> a=3.0+4.0j
>>> float(a)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: can't convert complex to float; use abs(z)
>>> [Link]
3.0
>>> [Link]
4.0
>>> abs(a) # sqrt([Link]**2 + [Link]**2)
5.0
No modo interativo (basta abrir o terminal e digitar python ) o valor da última expressão exibida é atribuída a variável _
. Assim, ao utilizar Python como uma calculadora, fica mais fácil prosseguir com os cálculos, por exemplo:
Essa variável especial deve ser tratada como somente para leitura pelo usuário. Nunca lhe atribua explicitamente um valor
— do contrário, estaria criando uma outra variável (homônima) independente, que mascararia a variável especial com seu
comportamento mágico ³.
Variáveis lógicas
Existem situação em que você precisa de uma informação simple sim ou não, falso ou verdadeiro, correto ou incorreto,
etc. Nesses casos existe um tipo de variável chamado booleano (ou lógico). Em python, escrevemos True para
verdadeiro e False para falso (importante perceber que a primeira letra, T e F, são escretas em maiúsculo).
resultado = True
aprovado = False
Operadores
Nós também temos disponível um conjunto de operadores relacionais para realizarmos comparações lógicas.
Operador Operação
== igualdade
! diferente
Note que usamos o símbolo # para representar comentários, o que estiver depois deste símbolo na linha será ignorado
pelo interpretador Python. Já que tocamos no assunto "comentários em código", é importante chamar atenção para o seu
uso durante o desenvolvimento. Tenha e mantanha o costuma de comentar trechos do seu código, não precisa colocar um
comentário a cada linha (a não ser que você queira), mas é interessante deixar pequenas explicações sobre partes do
código para quando você for lê-lo daqui a 1 semana, 1 mês, anos ou para quando alguém for estudá-lo. Também é
indicável que você identifique os programas com seu nome, data em que começou a escrevê-lo e em que fez a última
modificação, além de possíveis fontes e referências que usou para o desenvolvimento.
>>> nota = 9
>>> media = 6
>>> aprovado = nota > media
True
Quiz
Question 1 of 1
Agora, só para conferir se você entendeu bem, marque somente as expressões incorretas: Tomando a = 4, b = 10, c
= 5, d = 0 e f = 5.0
a == b True
a < b True
a < b False
c >= d True
c == f False
a < d False
c != f True
Agora, só para conferir se você entendeu bem, marque somente as expressões incorretas: Tomando a = 4, b = 10, c
= 5, d = 0 e f = 5.0
a == b True
a < b True
a < b False
c >= d True
c == f False
a < d False
c != f True
Operadores Lógicos
Uma forma de agrupar operações com lógica booleana, é utilizando operadores lógicos. Os três operadores portados
básicos pelo Python são: not , and , or . Eles são respectivamente a negação, conjunção e disjunção.
not não
and e
or ou
Operador not
O operador not é um operador unário, pois só é necessário utilizar um operando com ele.
Este operador também é conhecido como "inversão", pois o valor que é verdadeiro negado se torna falso, e vice-versa.
Operador and
O operador and tem resultado verdadeiro apenas quando seus dois operandos forem verdadeiros.
Operador or
No caso do operador or, o resultado será false apenas se seud dois operandos também forem falsos. Caso um deles seja
verdadeiro, ou os dois fores, a resultado será verdadeiro.
As variáveis string vão funcionar como uma sequência de blocos, cada um enumerado e contendo uma letra, um número,
um símbolo ou um espaço em branco:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
A p r e n d e n d o P y t h o n
Quando você quiser identificar o momento em que seu texto começa e termina, é necessário utilizar aspas " .
O fato de cada bloco ser enumerado, permite que possamos acessar caractere a caractere. Esse número inteiro que
representará a posição de cada caracter será chamado de índice, e começará a ser contato pelo 0, como no exemplo
dado no início dessa seção. Para acessar cada caracter, devemos informar o índice ou posição do caractere entre
colchetes [] , começando do 0, até o tamanho da string menos 1.
linguagem = "Python"
>>> print (linguagem[0])
'P'
>>> print (linguagem[1])
'y'
>>> print (linguagem[5])
'n'
>>> print (linguagem[6])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
Além disso, o tamanho da string pode ser obtido através da função len . Como retorno da função, teremos o número de
caracteres da string.
Concatenação
É possível concatenar o conteúdo de variáveis string utilizando o operador de adição + . Então "aprendendo " + "python"
é igual a "aprendendo python" . Uma outra possibilidade para casos de concatenação de uma string várias vezes é usar o
operador de multiplicação, como em "A" * 3 , igual a "AAA" .
>>> s = "ABC"
>>> print (s + "D")
'ABCD'
>>> print (s + "E" * 4)
'ABCEEEE'
Composição
Algumas vezes é necessário compor mensagens com várias informações, por exemplo, se tivermos que exibir uma
mensagem que mostre as vezes que um determinado usuário acessou determinada seção do site. Então teremos as
seguintes variáveis usuario , quantidade_de_acesso , secao , e as informações guardadas nelas serão usadas para compor
a seguinte mensagem: "O usuário Felipe acessou 10 vezes a seção de Esporte .
Bem, se formos fazer isso através da concatenação, não será muito prático. Uma opção é usar a composição de strings
do Python, uma forma bem mais simples e clara:
O símbolo % é usado para indicar a composição da string com o conteúdo da variável idade .O %d é chamado de
marcador de posição, e indica que na posição em que foi colocado, ficará um valor inteiro. Veja os principais tipos de
marcadores suportador pelo Python:
Marcador Tipo
%d Números inteiros
%s Strings
%f Números decimais
Pode acontecer de você ter que representar um número com duas posições, e caso o número só tenha um algorísmo,
você quer completar com zeros a esquerda. Também é possível fazer isso, por exemplo "%04d" %numero . Caso você
queira que o número ocupe quarto espaços (ou menos ou mais) sem ser completado com 0's, basta fazer %4d .
>>> idade = 50
>>> print("[%d]" % idade)
[22]
>>> print("[%03d]" % idade)
[022]
>>> print("[%3d]" % idade)
[ 22]
>>> print("[%-3d]" % idade)
[22 ]
No caso de números decimais, é possível identificar o tamanho do total de caracteres que serão representados e o
número de casas decimais. Por exemplo, em %3.1f o que estamos dizendo é que será impresso um número decimal com
3 posições, sendo um para a parte decimal.
>>> print("%3f"% 3)
3.000000
>>> print("%5.2f" % 5)
5.00
Agora lembando do exemplo dado logo no início: "O usuário Felipe acessou 10 vezes a seção de Esporte e as variáveis
usuario , quantidade_de_acesso , secao . Como poderíamos fazer esse tipo de composição? Talvez seja só agora que você
percebe o poder que a composição realmente tem.
Fatiamento
O fatiamento é extremamente útil e prático, além disso, o nome é altamente sugestivo. O fatiamento funciona com a
utilização de dois índices da string, um que vai indicar quando a fatia que você quer da string inicia e o outro quando a
fatia acaba. Mas é importante notar uma coisa, quando você define os índices, o final da fatia não está incluído. Por
exemplo:
Você também pode omitir um dos índices, e assim estará indicando que a fatia ou vai até o fim ou começa desde o início.
Caso ambos os índices sejam ommitidos, estaremos fazendo uma cópia das strings.
Valores negativos também podem ser usados, nesse caso, eles indicarão posições a partir da direita. Como nos exemplos:
======== O fatiamento é outro recurso importante do Python, e seu nome é extremamente sugestivo. Ele permite
fatiarmos strings usando índices, que indicaram o início da fatia, e o fim. Atenção só para o índice que indica o fim da fatia,
isso por que o fim da fatia não é incluido, por exemplo:
>>> user = "João"
>>> print (user[0:2])
Jo
Perceba que colocamos como índice de início "0" e de fim "2", porém no índice "2" temos o caracter "ã", que não é incluido
na fatia. Também é possível omitir os índices. Caso omita o número da esquedar a fatia começará do primeiro caracter,
caso a omissão seja do número da direta, a fatia irá até o ultimo caractere.
Você também pode também pode usar índecis negativos para indicar uma posição a partir da direita, por exemplo, -2
indicará o penúltimo caractere, -1 será o último.
5f263d6b77e27ea188b9989be1c51b5f3ff479d8
Entrada de dados
Você já deve ter percebido que todos nosso exemplos até agora trabalharam com valores já conhecidos. Nós mesmos
definimos quais dados cada variável teria, mas em muitas situações esses valores vão mudar em função de diferentes
fatores, como por exemplo, a entrada do usuário. Mas para que isso aconteça, é necessário permitimos que os valores
possam ser passados durante a execução do programa.
É ai que entra a entrada de dados, aquele momento em que o programa recebe informações através de um dispositivo de
entrada de dados ou de um arquivo. Uma função muito importante utilizada para solicidar dados do usuário é a função
input . No exemplo a baixo temos uma chamada a função passando como parâmetro a mensagem que será exibida para
o usuário, o retorno será o valor digitado. Vamos usar como exemplo o valor 12.
Agora é importante prestar atenção para o tipo de entrada que você deseja. O input sempre vai retornar valores do tipo
string. Então mesmo que seu usuário digite números, o resultado vai ser sempre string. Para corrigir isso, podemos usar a
função int para converter os valores para inteiro, e a função float para converter para um número decimal.
3. Faça um programa que calcule o aumento de um salário. Ele deve solicitar o valor do salário e a porcentagem do
aumento. Por fim, exiba o valor do aumento e do novo salário.
5. Escreva um programa para calcular a redução do tempo de vida de um fumante. Pergunte a quantidade de cigarros
fumados por dia e quantos anos ele já fumou. Considere que um fumante perde 10 minutos de vida a cada cigarro,
calcule quantos dias de vida um fumante perderá. Exiba o total em dias.
Condições
Por vezes você vai se deparar com situações em que decisões precisam ser tomadas durante a execução do seu
programa. Por exemplo, se um usuário logou no sistema e ele é um usuário administrador, então vai poder ter acesso aos
dados dos funcionários, porém se um funcionário logar, ele terá acesso só as suas informações. Uma outra situação seria
exibir uma mensagem de reprovação caso o aluno não consiga notas na média, ou então só exebir aprovado caso ele
tenha passado.
Nesses casos trechos de código poderão ser executados ou não, para tratar isso necessitaremos de expressões lógicas
para representar essas escolhas. Veremos a seguir tais expressões que farão o controle do fluxo do programa.
if
A ideia por trás das condições é controlar quando um trecho do código deve ser executado ou não. Você vai controlar o
fluxo do seu programa. Em Python, a estrutura usada para decisões é o if . O seu formato é mostrado a baixo.
if (condição):
# bloco de código
Caso a condição seja verdadeira, o bloco de código identificado dentro do if será executado. O if funcionará como um
"se", então "se a condição for verdadeira, faça algo".
Na segunda linha do nosso exemplo, temos a condição idade < 12 . Essa condição será avaliada, e se for verdadeira, a
linha seguinte será executada, imprimindo "Criança" na tela. Caso a condição seja false, a terceira linha será ignorada, e o
código seguinte ao if será executado.
Observe também como indicamos que um bloco estará se iniciando. Veja que na linha do if terminamos com o símbolo
dois pontos (:). Depois dele, teremos o código referente aquela condição identado, indicando que ele só será executado
caso a condição seja verdadeira.
Talvez você já tenha percebido que em nosso exemplo, dependendo da idade, a saida será um pouco estranha. Por
exemplo, se alguém digitar 65 como sua idade, a saida será "Adolescente", "Adulto" e "Idoso". Porém só queríamos que
saisse uma única faixa referente a idade que foi colocada como entrada. Nas próximas sessões veremos uma solução
para esse caso.
else
Em algumas situações, você vai querer que apenas uma condição seja verdadeira. Em Python nós podemos usar a
cláusula else para encaminhar o fluxo da execução caso o resultado das avaliações das condições até aquele momento
tenham sido falsas. Por exemplo:
Observe que quando usamos o else , também usamos o ":" logo após. Isso por que ele também inicia um bloco assim
como o if . E não foi necessário colocar condições, pois só executaremos o que estiver dentro do else caso não haja
if verdadeiro.
elif
Você pode se deparar com códigos que possuam multiplos ifs aninhados. Como no exemplo:
Pode parecer que essas várias condições aninhadas não são um grande problema, mas isso é por que o nosso exemplo é
simples. No caso de grandes projetos em que existem várias condições, esse código ficaria mais complicado de se
entender. Para solucionar isso, Python fornece a cláusula elif , substituindo um else ou um if , e evitando criar um
outro nível na estrutura do código. Reescrevendo o código que fizemos no início da sessão:
Observação: Dizemos que um triângulo é equilátero quando ele possui os três lados iguais, isóceles quando possui
dois lados iguais e escaleno quando não possui nenhum dos lados iguais.
Observação: São bissextos todos os anos divisíveis por 4, excluindo os que sejam divisíveis por 100, porém não os
que sejam divisíveis por 400.
4. Faça um Programa que leia três números e mostre o maior e o menor deles.
5. Escreva um programa para aprovar o empréstimo bancário para compra de uma casa. O programa deve perguntar o
valor da casa a comprar , o salário e a quantidade de anos a pagar. O valor da prestação mensal não pode ser
superior a 30% do salário. Calculo o valor da prestação como sendo o valor da casa a comprar dividido pelo número
de meses a pagar.
6. (Desafio) João Papo-de-Pescador, homem de bem, comprou um microcomputador para controlar o rendimento diário
de seu trabalho. Toda vez que ele traz um peso de peixes maior que o estabelecido pelo regulamento de pesca do
estado de São Paulo (50 quilos) deve pagar uma multa de R$ 4,00 por quilo excedente. João precisa que você faça
um programa que leia a variável peso (peso de peixes) e verifique se há excesso. Se houver, gravar na variável
excesso e na variável multa o valor da multa que João deverá pagar. Caso contrário mostrar tais variáveis com o
conteúdo ZERO.
Repetições
Você já deve ter se deparado com códigos que precisavam ser executados várias vezes em função de alguma condição.
Por exemplo, um código que simula um contador, e a cada 1 hora ele exibe uma mensagem. Um outro exemplo bem mais
simples seria imprimir na tela os números em ordem crescente de 0 a 10. O nosso exemplo pode parecer simples, mas e
se tivéssemos que imprimir números de 0 a 100, ou 1000 registros que estão armazenados no banco de dados?
Uma das estruturas que o Python disponibiliza é o while . Ele vai repetir um bloco de código enquanto uma condição for
verdadeira. Veja a sua estrutura a seguir:
while (condição):
# bloco de código
x = 0
while x <= 10:
print(x)
x = x + 1
Inicialmente atribuimos 0 a variável x . Quando vamos para a segunda linha, o while define uma condição para ser
iniciado, x precisa ser menor ou igual a 10. Caso a condição seja verdadeira, a terceira e quarta linha serão execuradas
enquanto a condição continuar sendo verdadeira.
Interrompendo a repetição
Você deve ter percebido que a estrutura while faz somente uma verificação, que acontece no início de cada repetição. O
problema é que em alguns momentos você talvez precise fazer alguma validação dentro do while e talvez até parar a
repetição. Para isso usamos a instrução break , que interrompe a execução do while .
numero = 0
while True:
numero = int(input("Digite um número positivo: ")
if numero < 0:
break
Nesse exemplo, nós temos no lugar da condição do while o True , isso fará com que o while seja executado "para
sempre". Depois nós temos a requisição de uma informação que será informada pelo usuário, e depois uma validação,
que verificará se o número digitado é menor que 0. Caso seja, o break será ativado e parará com o laço de repetição.
Repetições aninhadas
Também é possível combinar vários while , por exemplo, se você quiser incrementar variáveis em momentos diferentes.
No exemplo que temos a seguir, vamos fazer uma tabuada de multiplicação de 1 a 10.
tabuada = 1
while tabuada <= 10:
num = 1
while num <= 10:
print("%d x %d = %d" % (tabuada, num, tabuada * num))
num += 1
tabuada += 1
Neste exemplo, retirado do livro Introdução a Programação com Python, você pode perceber que temos um primeiro laço
que será repetido enquanto a variável tabuada for menor ou igual a 10. Dentro desse laço temos a variável num eo
segundo while , que será repetido enquanto num for menor ou igual a 10. Então perceba que o segundo laço será
disparado toda fez que ocorrer uma repetição do primeiro.
while
Uma das estruturas que o Python disponibiliza é o while . Ele vai repetir um bloco de código enquanto uma condição for
verdadeira. Veja a sua estrutura a seguir:
while (condição):
# bloco de código
x = 0
while x <= 10:
print(x)
x = x + 1
Inicialmente atribuimos 0 a variável x . Quando vamos para a segunda linha, o while define uma condição para ser
iniciado, x precisa ser menor ou igual a 10. Caso a condição seja verdadeira, a terceira e quarta linha serão execuradas
enquanto a condição continuar sendo verdadeira.
Você deve ter percebido que a estrutura while faz somente uma verificação, que acontece no início de cada repetição. O
problema é que em alguns momentos você talvez precise fazer alguma validação dentro do while e talvez até parar a
repetição. Para isso usamos a instrução break , que interrompe a execução do while .
numero = 0
while True:
numero = int(input("Digite um número positivo: ")
if numero < 0:
break
Nesse exemplo, nós temos no lugar da condição do while o True , isso fará com que o while seja executação "para
sempre". Depois nós temos a requisição de uma informações que será informada pelo usuário, e depois uma validação,
que verificará se o número digitado é menor que 0. Caso seja, o break será ativado e parará com o laço de repetição.
Outra instrução muito útil é o continue , que permite avançar para a próxima iteração do laço mais interno.
for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]:
if i < 5:
print i
else:
continue
Nesse exemplo, você verá que a saida mostrará os números 0, 1, 2, 3, 4. Isso acontece por que para os números menores
que 5 no intervalo de 0 a 10, ocorrerá sua impressão na tela, mas para os números maiores, a repetição pulará para a
próxima iteração.
Já o comando pass não faz muita coisa, na verdade, sua utilidade está em não fazer nada. Ela é util em situações em
que sintaticamente, é necessário um comando, mas semânticamente não é necessária nenhuma ação.
Também podemos usar o pass quando queremos reservar o espaço de um código que ainda vamos implementar em uma
função ou bloco de repetição ou condição. Por exemplo:
class MinhaClasseParaImplementar:
pass # implementar código dessa classe
Repetições aninhadas
Também é possível combinar vários while , por exemplo, se você quiser incrementar variáveis em momentos diferentes.
No exemplo que temos a seguir, vamos fazer uma tabuada de multiplicação de 1 a 10.
tabuada = 1
while tabuada <= 10:
num = 1
while num <= 10:
print("%d x %d = %d" % (tabuada, num, tabuada * num))
num += 1
tabuada += 1
Neste exemplo, retirado do livro Introdução a Programação com Python, você pode perceber que temos um primeiro laço
que será repetido enquanto a variável tabuada for menor ou igual a 10. Dentro desse laço temos a variável num eo
segundo while , que será repetido enquanto num for menor ou igual a 10. Então perceba que o segundo laço será
disparado toda fez que ocorrer uma repetição do primeiro.
for
Se você já entrou em contato com o for em outras linguagens, vai ver algumas diferenças na utilização dele em Python.
Por exemplo, em C, o for é usado para criar uma iteração e definir uma condição de parada. Já no Python, este
comando itera sobre itens de uma sequência (lista ou strings, por exemplo), seguindo a ordem em que aparecem na
sequência.
2. Faça um programa que leia um nome de usuário e a sua senha e não aceite a senha igual ao nome do usuário,
mostrando uma mensagem de erro e voltando a pedir as informações.
3. Supondo que a população de um país "A" seja da ordem de 80.000 habitantes com uma taxa anual de crescimento de
3% e que a po pulação de "B" seja 200.000 habitantes com uma taxa de crescimento de 1.5%. Faça um programa
que calcule e escreva o número de anos necessários para que a população do país "A" ultrapasse ou iguale a
população do país "B", mantidas as taxas de crescimento
4. Escreva um programa que exiba uma lista de opções (menu): adição, subtração, divisão, multiplicação e sair. Imprima
a tabuada da operação escolhida. Repira até que a opção saída seja escolhida.
5. (Desafio) A seqüência de Fibonacci é a seguinte: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ... Sua regra de formação é simples:
os dois primeiros elementos são 1; a partir de então, cada elemento é a soma dos dois anteriores. Faça um algoritmo
que leia um número inteiro apresente a sequência de Fibonacci até este número.
Observação: F1 = 1, F2 = 1, F3 = 2, etc.
Estruturas de dados
Você deve lembrar que nas sessões anteriores vimos alguns tipos básicos em Python, agora nós vamos abordar alguns
tipos diferentes, como listas, sets, dicionários, tuplas, etc.
Listas
Variáveis do tipo Lista, permitem armazenar vários valores e os deixam disponíveis para serem acessados através de
índices. Os valores armazenados em uma lista podem ser do mesmo tipo, de diferentes tipos ou podem ser até mesmo
outras listas.
andares = [ 0, 1, 2, 3, 4 ]
Neste exemplo temos a lista andares , com 5 valores: 0, 1, 2, 3, 4. Dizemos que ela tem 5 elementos, que podem ser
acessados por seus índices, por exemplo, usando a referência andares[0] , poderemos acessar o valor 0, já com
andares[3] , acessaremos o valor 3. Para modificar uma lista, basta fazer a atribuição de um novo valor a uma posição da
lista, por exemplo, andares[2] = 5 . Perceba que quando for tentar acessar o valor de andares[2] , será exibido 5.
Usando como fonte a Documentação Python, aqui estão todos os métodos disponíveis em um objeto lista e no fim, o
exemplo dado na documentação:
[Link](x) : Adiciona um item ao fim da lista; equivale a a[len(a):] = [x] . É importante saber que ainda existe outra
forma de adicionar elementos a uma lista, [Link](1) equivale a a+[1] . Esteja atento a utilização do append com uma
lista sendo passada por parâmetro, [Link]([3, 4]) , em situações como essa você notará que a lista será inteiramente
adicionada, como se fosse um novo elemento, ficaria por exemlpo: [ 1, 2, [3, 4]] .
[Link](L) : Prolonga a lista, adicionando no fim todos os elementos da lista L passada como argumento; equivalente
a a[len(a):] = L . Mesmo que o extend só aceite listas, ele vai ter um resultado diferente de quando usamos o append
com lista como parâmetros. O extend vai "extrair" os elementos passados por parâmetro e inserí-los em nossa lista.
[Link](i, x) : Insere um item em uma posição especificada. O primeiro argumento é o índice do elemento antes do
qual será feita a inserção, assim [Link](0, x) insere no início da lista, e [Link](len(a), x) equivale a [Link](x) .
[Link](x) : Remove o primeiro item encontrado na lista cujo valor é igual a x. Se não existir valor igual, uma exceção
ValueError é levantada.
[Link]([i]) : Remove o item na posição dada e o devolve. Se nenhum índice for especificado, [Link]() remove e
devolve o último item na lista. (Os colchetes ao redor do i indicam que o parâmetro é opcional, não que você deva digitá-
los daquela maneira. Você verá essa notação com frequência na Referência da Biblioteca Python.)
[Link](x) : Devolve o índice do primeiro item cujo valor é igual a x, gerando ValueError se este valor não existe
[Link]() : Inverte a ordem dos elementos na lista in place (sem gerar uma nova lista).
Você também pode usar uma lista como uma fila, mas para isso ela deve obedecer algumas regras com relação a inclusão
e remoção de um elemento. No caso das filas, o primeiro item adicionado é o primeiro a ser recuperado (“primeiro a entrar,
primeiro a sair”, FIFO, "first in first out"), semelhante as filas que fazemos em nosso dia a dia.
Para que uma lista funcione como fila, podemos trabalhar de duas formas diferentes. Se imaginarmos uma fila de clientes
em uma loja, quando um cliente chegar, basta realizar um append para ele ser inserido na fila ( [Link](cliente) ). Já
para retirar um cliente da fila, podemos usar o método pop ( [Link](0) ), que irá retornar o valor e depois excluí-lo.
Os métodos que já temos para a lista fazendo com que seja muito fácil utilizar listas como pilhas. Sua política funciona
basicamente com a adição de um item no topo e a remoção também é feita no topo (política “último a entrar, primeiro a
sair”, LIFO, "Last in First Out). Para adicionar um item ao topo da pilha, use append(). Para recuperar um item do topo da
pilha use pop() sem nenhum índice.
Comando del
Uma outra forma de remover um item de uma lista conhecendo apenas seu índice, ao invés de seu valor é utilizando o
comando del . Ele será diferente do método [Link]() pois devolve o item removido. O comando del também pode
ser utilizado para remover partes (fatias) da lista, ou até a lista toda. Um bom exemplo dados na Documentação Python é
este:
Quando a remoção acontece, note que os índices são reorganizados. del também pode ser usado para remover
totalmente uma variável:
>>> del a
>>> a
Traceback (most recent call last):
...
NameError: name 'a' is not defined
Caso você tente referenciar a variável a depois de sua remoção, esta ação vai gerar um erro (pelo menos até que seja
feita uma nova atribuição para ela).
Tamanho da lista
Uma informação importânte quando se trabalha com listas é o seu tamanho. Usando a função len teremos como retorno
o número de elementos de nossa lista.
>>> lista = [ 1, 2, 3 ]
>>> len(lista)
3
>>> l = []
>>> len(l)
0
Usando o range
A função range com certeza será de grande ajuda em algum momento da sua vida. Basicamente, ela pode gerar listas
simples de forma mais simples ainda. Por exemplo:
Se você executar esse código, vai perceber que a função range gerou números de 0 a 9. Por padrão, ao passar o
parâmetro único, como no exemplo, o range vai gerar números iniciando no zero, até o anterior do parâmetro. Mas nós
também podemos indicar qual é o primeiro número que será gerado, basta passar por parâmetro o número de início e de
fim.
Ainda é possível passar um terceiro argumento, que será o intervalor do salto entre cada número gerado. Por exemplo:
A saida desse código serão os números: 0, 2, 4, 6, 8, 10, 12, 14, 16, 18. O primeiro número do parâmetro diz a partir de
onde o intervalo começará, o segundo número refere-se ao fim do interlado, e o terceiro número ao valor do "pulo" entre
os números gerados pelo range .
Tuplas
Vamos ver agora um novo tipo de sequência, um outro tipo de sequência padrão na linguagem: a tupla (tuple). Uma tupla
consiste em uma sequência de valores separados por vírgulas, podendo ser vista como lista em Python, com a diferença
de ser imutável (assim como strings).
>>> t = 1, 2, 'python'
>>> t[0]
1
>>> t
(1, 2, 'python')
>>> # Podemos aninhar tuplas:
... u = t, (1, 2, 3, 4, 5)
>>> u
((1, 2, 'python'), (1, 2, 3, 4, 5))
No exemplo retirado da Documentação Oficial, as tuplas são sempre envolvidas por parênteses quando aparecem na
saída, a vantagem disso é que quando houverem tuplas aninhadas, a sua leitura será feita corretamente.
Uma das grandes utilidades das Tuplas é para a representação de valores constante, aleḿ disso elas podem ser usadas
de diversas formas: pares ordenados (x, y), registros de funcionário extraídos uma base de dados, etc.
Um ponto interessante é a criação de tuplas contendo 0 ou 1 itens: a sintaxe usa certos truques para acomodar estes
casos. No caso das Tuplas vazias, um par de parênteses vazios é o necessário para construí-la; uma tupla unitária é
construída por um único valor e uma vírgula entre parênteses (não basta colocar um único valor entre parênteses). Um
pouco estranho, mas é assim que funciona:
>>> vazia = ()
>>> upla = 'hello', # aqui está a vírgula no final
>>> len(vazia)
0
>>> len(upla)
1
>>> upla
('hello',)
As tuplas também suportam acesso aos valores através dos índices e maior parte das operações das listas, como
fatiamento. Podemos utilizá-las também com o for :
>>> l = [1, 2, 3]
>>> t = tuple(l)
>>> t
(1, 2, 3)
Mesmo que não possamos fazer alterações na tupla depois de criá-la, podemos concatená-las... mas saiba que isso gera
novas tuplas:
>>> t1 = (1, 2, 3)
>>> t2 = (4, 5, 6)
>>> t1 + t2
(1, 2, 3, 4, 5, 6)
IMPORTANTE: Tuplas podem conter objetos que podem ser alterados, mas as alterações nesses objetos não são
consideradas mudanças na tupla em si, como no exemplo:
Diferente das listas, tuplas, e outras sequências indexadas por inteiros, dicionários são indexados por chaves (keys), que
podem ser de qualquer tipo imutável (como strings). Tuplas também podem ser chaves se contiverem apenas strings,
inteiros ou outras tuplas. Se a tupla contiver, direta ou indiretamente, qualquer valor mutável, não poderá ser chave. Listas
não podem ser usadas como chaves porque podem ser modificadas in place pela atribuição em índices ou fatias, e por
métodos como append() e extend() [PyDoc].
Uma forma de visualizar como dicionários funcionam é vê-los como um conjunto não ordenado de pares chave-valor.
Essas chaves são únicas em uma dada instância do dicionário, caso um valor que já foi atribuido a uma chave seja usado
novamente, o valor associado é alterado para um novo valor, caso não existe, o par chave:valor será adicionado no
dicionário.
Veja a tabela a seguir e como ela pode ser representada como um dicionário:
Produto Valor
Banana 3.00
Maçã 5.00
Uva 8.00
Para acessar as informações do dicionário, devemos utilizar duas chaves. Usando o exemplo que demos, para acessar o
preço da banana devemos usar mercadinho["Banana"] . Além da operação de armazenar, outra operação muito importante
é a de recuperar valores a partir de chaves. Também é possível remover um par chave:valor com o comando del . Se
você armazenar um valor utilizando uma chave já presente, o antigo valor será substituído pelo novo. Se tentar recuperar
um valor usando uma chave inexistente, será gerado um erro do tipo KeyError . Como no exemplo:
O construtor dict() produz dicionários diretamente a partir de uma lista de chaves-valores, armazenadas como duplas
(tuplas de 2 elementos). Quando os pares formam um padrão, uma list comprehensions pode especificar a lista de
chaves-valores de forma mais compacta.
Quando chaves são strings simples, é mais fácil especificar os pares usando argumentos nomeados no construtor:
Caso você tenha ficado em dúvida em que situação usar dicionários ou listas, aqui vai uma dica. Se seus dados não
precisam ser acessados de uma só vez, e se você normalmente usa chaves acessá-los... um dicionário seria mais
interessante. Um outro ponto é a possibilidade de acessar valores através de uma chave rapidamente sem precisar fazer
pesquisas, a implementação interna do docionário permite uma boa velocidade de acesso quando temos muitas chaves.
Porém se você quiser manter a ordem de inserção, use listas. O dicionário não organizar as chaves, ou seja, quando você
insere a primeira chave, não significa que ela manterá a posição de primeira quando você adicionar outras.
Exercícios - Listas
1. Faça um programa que leia uma expressão com parênteses. Usando pilhas, verifique se os parênteses foram abertos
e fechados na orgem correta. Exemplo:
( ( ) ) - OK
( ( ) ) ( ( ) ( ) ) - OK
( ) ) - Erro
Exercícios - Dicionário
1- Crie um dicionário e armazene nele os seus dados: nome, idade, telefone, endereço. Imprima todos os dados usando o
padrão chave: valor.
2 – Crie um programa que, usando dicionário, crie uma agenda de tamanho fornecido inicialmente pelo usuário. Leia os
dados de todos os contatos do usuário de forma que a agenda fique completa e por fim imprima todos os contatos.
Um pouco mais sobre Strings
Vimos logo no início do material algumas informações sobre strings, mas existem bem mais informações sobre elas do
que você imagina. Algo que deve estar lembrado é que strings são imutáveis:
Mas e se você quiser trabalhar com caractere a caractere? Transforme a string em lista:
Python também facilita algumas verificações com strings. Por exemplo, se você quiser saber se uma string começa ou
termina com algum caractere, é possível usar os métodos startswith (verifica os primeiros caracteres) e endswith
(verifica os últimos). Os métodoes retornam True , caso tenha encontrado os caracteres ou False , caso contrário.
Note que estes métodos tratam de forma diferente letras maiúsculas e minúsculas. Um jeito de resolver esse problema é
conver a string para maiúscula ou minúscula antes de fazer a verificação. Os métodos disponíveis para fazer essa
operação é o lower (retorna uma código com todos os caracteres minúsculos), e upper (retorna uma cópia com todos os
caracteres maiúsculos).
Em Python, também é possível verificar se uma string está contida em outra usando in , ou verificar o contrário com not
in . Por exemplo:
Também podemos fazer a contagem de ocorrências de uma letra ou palavra em uma string, para isso basta usar count .
Em situações em que queremos saber se uma string está dentro da outra e a partir de que posição ela se encontra,
podemos usar o método find .
Você também pode passar mais dois argumentos como parâmetro tanto de find como rfind , uma parâmetro para
indicar a posição inicial e para a posição final da pesquisa.
Aqui estão mais alguns métodos que podem ser muito interessantes de serem usados durante o desenvolvimento do seu
código:
center : centraliza a string em número de posições passadas como parâmetro, preenchedo com espaço tanto a esqueda
quando a direita. É possível passa o tamanho e o caractere de preenchimento.
>>> s = "python"
>>> print("X"+[Link](10)+"X")
X python X
>>> print("X"+[Link](10, ".")+"X") #
X..python..X
ljust e rjust : centraliza a string, preenchendo com espaços à esqueda ( ljust ) ou a direita ( just ).
>>> s = "python"
>>> [Link](20)
'python '
>>> [Link](20)
' python'
>>> [Link](20, ".")
'python..............'
>>> [Link](20, ".")
'..............python'
split : quebra uma string a parti de de um caractere passado como parâmetro. O retorno é uma lista com substrings
separadas. Observe que o caractere usado para dividir a string, não é retornado na lista.
replace : substitui trechos de uma string por outros. O primeiro parâmetro é a string a substituir e o segundo, o que
conteúdo que a substituirá. Ainda podemos passar um terceiro parâmetro, que irá limitar quantas vezes queremos realizar
a repetição.
strinp remove espaços em branco do início ou fim da string. Para remover apenas dos caracteres em branco à esqueda,
podemos usar o lstrip , e para remover apenas os da direita rstrip . Você também pode passar um parâmetro para
esses métodos, e então ele será removido da string.
isalnum : retorna verdadeiro se a string não estiver vazia, e se todos os caracteres forem letras e/ou número. Se a string
tiver caracteres como vírgulas, espaços, interrogação, etc, o retorno será False.
isdigit : retorna verdadeiro apenas se todos os caracteres forem números e se a string não estiver vazia
isupper e islower : verifica se todos os caracteres de uma string são letras maiúsculas ou maiúsculas, respectivamente.
isspace : verifica se a string contém apenas caracteres em branco, como espaço, quabra de linhas, etc.
isprintable : verifica se existe algum caractere que não pode ser impresso na string, retornando False.
>>> "\n\t".isprintable()
False
>>> "Oi Mundo".isprintable()
True
format : auxilia na composição de string. Os números entre colchetes são uma referência os parâmetros passados ao
método format .
Também é possível fazer formatação de números, o valor então vai ser impresso com a largura determinada e com zeros
à esqueda para completar o tamanho.
>>> "{0:05}".format(5)
'00005'
Veja algumas outras formas de usar o format mostradas no livro "Introdução à Programação com Python":
>>> "{0:*=7}".format(32)
'*****32'
>>> "{0:*^7}".format(122)
'**122**'
>>> "{0:*<7}".format(122)
'122****'
>>> "{0:*>7}".format(122)
'****122'
>>> #separação de milhas
...
>>> "{0:10,}".format(1234)
' 1,234'
>>> "{0:10.5f}".format(1234)
'1234.00000'
>>> "{0:10.5f}".format(1234.5)
'1234.50000'
>>> "{0:10,.5f}".format(1234.5)
'1,234.50000'
É importante saber que quando se trabalha com formatos numéricos, devemos indicar com uma letra o formato que deve
ser usado para a impressão, essa letra vai decidir como o número será exibido.
Código Descrição
b Binário
c Caractere
d Base 10
n Base 10 local
o Octal
>>> "{:b}".format(123)
'1111011'
>>> "{:c}".format(65)
'A'
>>> "{:d}".format(65)
'65'
>>> "{:n}".format(95)
'95'
>>> "{:o}".format(195)
'303'
>>> "{:x}".format(15)
'f'
>>> "{:X}".format(15)
'F'
Exercícios - String
1. Conta a ocorrência da palavra "tigre" na frase "um tigre, dois tigres, três tigres", e a posição inicial de cada uma delas.
2. Escreva um programa que leia duas strings re uma terceira com os caracteres comuns às duas strings lidas. Exemplo:
1ª String: AAACTBF
2ª String: CBT
Resultado: CBT
A ordem dos caracteres da string rada não é importante, mas deve conter todas as letras comuns a ambas. <<<<<<<
HEAD
3. Jogo da Velha
4. Faça um programa que peça um inteiro positivo e o mostre invertido. Ex.: 1234 gera 4321
5. Dado o texto:
“The Python Software Foundation and the global Python community welcome and encourage participation by
everyone. Our community is based on mutual respect, tolerance, and encouragement, and we are working to help
each other live up to these principles. We want our community to be more diverse: whoever you are, and whatever
your backgrou and, we welcome you.”
Calcule quantas palavras possuem uma das letras “python” e que tenham mais de 4 caracteres. Não se esqueça
detransformar maiúsculas para minúsculas ede remover antes os caracteres especiais.
6. Na pacata vila campestre de Ponteironuloville, todos os telefones têm 6 dígitos. A companhia telefônica estabelece as
seguintes regras sobre os números:
i. Não pode haver dois dígitos consecutivos idênticos, porque isso é chato;
ii. A soma dos dígitos tem que ser par, porque isso é legal;
iii. O último dígito não pode ser igual ao primei ro, porque isso dá azar.
Então, dadas essas regras perfeitamente razoáveis, bem projetadas e maduras, quantos números de telefone na lista
abaixo são válidos?
213752 216732 221063 221545 225583 229133 230648 233222 236043 237330 239636 240138 242123 246224
249183 252936 254711 257200 257607 261424 263814 266794 268649 273050 275001 277606 278997 283331
287104 287953 289137 291591 292559 292946 295180 295566 297529 300400 304707 306931 310638 313595
318449 319021 322082 323796 326266 326880 327249 329914 334392 334575 336723 336734 338808 343269
346040 350113 353631 357154 361633 361891 364889 365746 365749 366426 369156 369444 369689 372896
374983 375223 379163 380712 385640 386777 388599 389450 390178 392943 394742 395921 398644 398832
401149 402219 405364 408088 412901 417683 422267 424767 426613 430474 433910 435054 440052 444630
447852 449116 453865 457631 461750 462985 463328 466458 469601 473108 476773 477956 481991 482422
486195 488359 489209 489388 491928 496569 496964 497901 500877 502386 502715 507617 512526 512827
513796 518232 521455 524277 528496 529345 531231 531766 535067 535183 536593 537360 539055 540582
543708 547492 550779 551595 556493 558807 559102 562050 564962 569677 570945 575447 579937 580112
580680 582458 583012 585395 586244 587393 590483 593112 593894 594293 597525 598184 600455 600953
601523 605761 608618 609198 610141 610536 612636 615233 618314 622752 626345 626632 628889 629457
629643 633673 637656 641136 644176 644973 647617 652218 657143 659902 662224 666265 668010 672480
672695 676868 677125 678315
8cba909cc3a069ae6afe1d4d2d0b5766e201955c
Funções
Você deve ter percebido que usamos funções inúmeras vezes. Mas também temos a possibilidade de criar nossas
próprias funções. Para definir novas funções devemos usar a instrução def , como no exemplo a baixo:
A estrutura é bem simples, temos a instrução def seguida pelo nome da função (soma) e os parâmetros que a função irá
receber. Os comandos referentes a esta função estarão depois dos dois pontos (:) e identados, como o print(a +b) .
As funções são úteis para empacotas uma tarefa espacífica em um trecho de código. A vontagem disso é a reutilização do
código, a solução criada naquela função poderá ser usada sempre que necessária sem precisar que reescreve-la sempre.
Nós ainda podemos definir um retorno para a função, modificando a função da soma, vamos colocá-la para retornar o
valor resultante.
Agora que começamos a criar nossas funções, vamos trabalhar com variáveis locais (ou internas) e variáveis globais
(externas). A grande diferença delas é a visibilidade de cada uma terá.
Quando criamos variáveis locais em uma função, elas existiram apenas dentro daquela estrutura, somente para aquela
função elas estarão disponíveis. Assim, não conseguiremos acesso a elas em um local fora da função em que foi criada.
Para resolver isso, retornamos e passamos valores como parâmetro, para que seja possível a troca de valores entre
diferentes trechos do código.
Já variáveis globais são definidas fora de um função, e são visíveis por todoas as outras funções. Caso um módulo esteja
sendo importado, as suas variáveis globais também estarão disponível no módulo que o importou. Veja o seguinte
exemplo:
>>> peso = 80
>>> tamanho = 1.80
>>> def imc():
... return(peso/(tamanho**2))
...
>>> print(imc())
24.6913580247
Por mais que variáveis globais pareçam facilitar nossas vidas, elas devem ser usadas o mínimo possível em quando
estiver escrevendo seu código. Esse cuidado deve acontecer por que elas dificultam a leitura do seu programa, já que
você vai ter que procurar sua definição e conteúdo fora da função, além disso a variável pode ser alterada por várias
funções, para encontrar qual o local exatado em que ela foi modificada, será um pouco complicado. Fora a legibilidade do
código, ainda existe o comprometimento do encapsulamento da função, isso acontece porque a função dependerá de uma
variável externa, que não é declarada dentro da função nem recebida como parâmetro.
Apesar dos motivos que nos fazem tomar cuidado com variáveis globais, elas também possuem suas vantagens.
Sugerimos que elas sejam utilizadas para armazenas valores constantes ou informações de configurações, que precisam
ser acessíveis para todas as funções do programa.
Uma possibilidade que existe em Python é fazer a passagem de funções como parâmetros. Assim, será possível combinar
várias funções para realizar uma tarefa.
Em Python você também pode empacotar parâmetros em uma lista, como no exemplo:
Quando fazemos a chamada da função soma, passamos *L , esse asterisco irá indicar que queremos desempacotar a
lista L utilizando seus valores como parâmetro para a função soma . No nosso exemplo L[0] será atribuido a a e L[1]
será atribuido a b .
Função Lambda
a = lambda z: x* 2
print(a(3))
Inicialmente definimos uma função lambda que recebe um parâmetro, no caso x, e que retorna o dobre desse número.
Observe que tudo foi feito em apenas uma linha. A função é criada e atribuída a variável a .
Agora que já vimos a teoria sobre python, podemos começar a praticar um pouco. Selecionamos alguns exercícios para
que vocês possam exercitar o que aprenderam durante o curso, a maioria desses exercícios foram retirados do curso
Python para Zumbis, ministrado pelo professor Fernando Masanori, que é um dos grandes "evangelizadores" dessa
linguagem aqui no Brasil.
Números Aleatórios e Estruturas de Dados
1. Escreva um programa que sorteie um número aleatório, peça um número ao suário e verifique se esse número é
igual, maior ou menor ao número sorteado, caso o número seja igual, imprima “Parabéns você acertou!!!”, caso seja
maior ou menor imprima algumas dicas como por exemplo, “é maior” e “é menor” ou “quente” e “frio”.
2. Sorteie 10 inteiros entre 1 e 100 para uma lista e descubra o maior e o menor valor, sem usar as funções max e min.
3. Faça um programa que crie dois vetores com 10 elementos aleatórios entre 1 e 100. Gere um terceiro vetor de 20
elementos, cujos valores deverão ser compostos pelos elementos intercalados dos dois outros vetores. Imprima os
três vetores.
String
1. Faça um programa que peça um inteiro positivo e o mostre invertido. Ex.: 1234 gera 4321
2. Dado o texto:
“The Python Software Foundation and the global Python community welcome and encourage participation by
everyone. Our community is based on mutual respect, tolerance, and encouragement, and we are working to help
each other live up to these principles. We want our community to be more diverse: whoever you are, and whatever
your backgrou and, we welcome you.”
Calcule quantas palavras possuem uma das letras “python” e que tenham mais de 4 caracteres. Não se esqueça
detransformar maiúsculas para minúsculas ede remover antes os caracteres especiais.
3. Na pacata vila campestre de Ponteironuloville, todos os telefones têm 6 dígitos. A companhia telefônica estabelece as
seguintes regras sobre os números:
i. Não pode haver dois dígitos consecutivos idênticos, porque isso é chato;
ii. A soma dos dígitos tem que ser par, porque isso é legal;
iii. O último dígito não pode ser igual ao primei ro, porque isso dá azar.
Então, dadas essas regras perfeitamente razoáveis, bem projetadas e maduras, quantos números de telefone na lista
abaixo são válidos?
213752 216732 221063 221545 225583 229133 230648 233222 236043 237330 239636 240138 242123 246224
249183 252936 254711 257200 257607 261424 263814 266794 268649 273050 275001 277606 278997 283331
287104 287953 289137 291591 292559 292946 295180 295566 297529 300400 304707 306931 310638 313595
318449 319021 322082 323796 326266 326880 327249 329914 334392 334575 336723 336734 338808 343269
346040 350113 353631 357154 361633 361891 364889 365746 365749 366426 369156 369444 369689 372896
374983 375223 379163 380712 385640 386777 388599 389450 390178 392943 394742 395921 398644 398832
401149 402219 405364 408088 412901 417683 422267 424767 426613 430474 433910 435054 440052 444630
447852 449116 453865 457631 461750 462985 463328 466458 469601 473108 476773 477956 481991 482422
486195 488359 489209 489388 491928 496569 496964 497901 500877 502386 502715 507617 512526 512827
513796 518232 521455 524277 528496 529345 531231 531766 535067 535183 536593 537360 539055 540582
543708 547492 550779 551595 556493 558807 559102 562050 564962 569677 570945 575447 579937 580112
580680 582458 583012 585395 586244 587393 590483 593112 593894 594293 597525 598184 600455 600953
601523 605761 608618 609198 610141 610536 612636 615233 618314 622752 626345 626632 628889 629457
629643 633673 637656 641136 644176 644973 647617 652218 657143 659902 662224 666265 668010 672480
672695 676868 677125 678315