Você está na página 1de 51

Bem Vindo

Este tutorial uma traduo do original disponvel em


www.learnpython.org/en/Welcome. Neste site voc, alm de aprender a programar
usando a linguagem Python de forma interativa sem precisar realizar nenhuma instalao
em sua mquina, poder treinar a leitura e compreenso de textos em ingls, portanto eu
recomendo fortemente que voc use o site.
Mas se voc precisa de uma ajudinha para comear, eu traduzi os itens bsicos do
tutorial que so apresentados a seguir, e complementei com alguns exerccios do site
Learn Python The Hard Way (http://learnpythonthehardway.org/book/). Se puder, faa este
tutorial inteiro.
muito importante que voc treine os exerccios para realmente aprender a
programar. No existe programao de computadores terica! Ou voc escreve seus
cdigos e os testa em uma mquina ou nunca vai saber se realmente funcionam.
Programar computadores um exerccio de comunicao e expresso, mas com um
receptor (computador) que no tem a mnima capacidade de "entender o que voc quis
dizer. Para computadores, "meias palavras NO bastam, e "um pingo NUNCA ser um
i!
muito comum cometermos erros de ortografia e sintaxe quando escrevendo
comandos em linguagens de programao, e s se percebe estes erros quando se
submete o cdigo execuo pela mquina. Portanto, no h como fugir: instale o Python
e um bom editor de textos para programao (Sublime, Notepad++, Crimson, etc - que te
ajudaro com as particularidades da linguagem) para realizar seus exerccios. Caso
queira, voc pode usar o Bloco de Notas ou qualquer editor de textos simples (no use
editores de textos mais sofisticados pois eles inserem caracteres especiais de formatao
no texto, que no so entendidos pelo interpretador do Python).
Baixar e instalar o Python fcil (tem aqui: https://www.python.org/downloads/).
Sugiro usar a verso 2.7.6 por questes de compatibilidade com o tutorial original. Depois
que voc dominar os fundamentos da programao Python, v para a verso 3.4.0.
Depois da instalao, voc s vai precisar configurar a varivel de ambiente PATH
do seu Windows para que o sistema operacional encontre o interpretador da linguagem
na pasta onde ele foi instalado. Existem inmeros tutoriais na internet que podem te
ajudar nisso. D uma procurada l no Dr. Google.
importante que voc faa esta configurao para que possa organizar seus
estudos, criando os arquivos de teste em uma pasta prpria do tutorial. Crie j uma pasta,
em local de fcil acesso no disco do seu micro, para usar neste estudo. Eu sugiro que
voc crie uma pasta "PBD dentro da pasta Python27 criada na instalao do Python.
Deve facilitar significativamente sua vida...
Se quiser ser um bom programador, comece desde j a organizar suas coisas. Crie
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
pastas em lugares de fcil acesso, faa SEMPRE backup de seus arquivos (mais de
um!!!!), e documente tudo o que faz, tanto os locais onde guarda seus trabalhos, quanto o
cdigo que escreve (veremos isso durante o tutorial).
Muito bem, dadas as dicas iniciais, este tutorial dirigido a qualquer um que queira
aprender a linguagem de programao Python. O site original oferece um grupo no
Facebook que voc pode se juntar a outros programadores para esclarecer dvidas,
realizar discusses sobre os exerccios e se atualizar. Atualmente, desenvolver software
uma atividade colaborativa onde quem participa desenvolve o princpio do ganha-ganha.
A seguir voc pode conferir a lista de itens que so tratados no site. Neste tutorial
farei a traduo dos Fundamentos da linguagem e te convido a continuar com os temas
avanados l no site em ingls. Olha s com sou camarada: alm de te dar uma
mozinha no comeo, te incentivo a ganhar um bnus treinando tambm o seu ingls.
Lembre-se: ingls para profissionais de Sistemas de nformao no mais diferencial,
commodity, ou voc sabe ou voc sabe!
Tpicos tratados - Aprenda os Fundamentos
. Al, Mundo!
. Variveis e Tipos
. Listas
. Operadores Bsicos
. Formatao de Cadeias
. Operaes Bsicas com Cadeias
. Condies
. Laos
. Funes
. Classes e Objetos
. Dicionrios
. Mdulos e Pacotes
Mos obra: para voc testar as diretivas e comandos Python apresentados a
seguir, execute o Prompt de Comando do Windows de mude para a pasta criada para
seus estudos. Caso ainda no saiba como fazer essas operaes no sistema, v ao Dr.
Google! A essa altura do campeonato voc j percebeu que para ser um programador,
muita coisa voc ter que buscar... Faa este exerccio! Use intensamente a pesquisa no
Dr. Google para, inclusive, melhorar sua performance de procura de soluo para
problemas. No site How To Think Like a Computer Scientist
(http://interactivepython.org/runestone/static/thinkcspy/toc.html) dito que:
"A habilidade mais importante para um cientista da computao a soluo de
pro!lemas. Resolver problemas significa se desenvolver a habilidade de formular
problemas, pensar criativamente sobre possveis solues, e expressar a soluo clara e
precisamente. Com se v, o processo de aprender a programar uma excelente
oportunidade para praticar as habilidades de resolver problemas.
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
(v l dar uma olhada tambm... outra fonte incrvel de contedo para se aprender a
programar com Python).
" Al#$ %undo
Python uma linguagem muito simples, e tem uma sintaxe muito direta. Ela
encoraja programadores a programar sem o uso de cdigos pr-criados. A diretiva
(comando) mais simples do Python "print - ela simplesmente escreve uma linha no
dispositivo de sada (console de comandos do sistema operacional, por exemplo) e j
inclui uma mudana de linha (diferente de outras linguagens como C).
&!s' manterei os exerccios em ingls pois esta uma Boa Prtica indicada para
programao de computadores. Para executar o interpretador Python na console execute
o comando "python. Por exemplo:
C:\sua_pasta>python
sero mostradas informaes relativas ao interpretador e o prompt de comandos Python
">>>.
Na verso adotada aqui (verso 2.7.6) o comando "print no uma funo, como
na verso 3.4.0 e para us-lo, simplesmente escreva, na console:
>>> print "This line will be printed.
ao teclar <ENTER>, a resposta ao comando ser mostrada na linha seguinte na console.
()erc*cios +
Use o comando "print para escrever as linhas:
Al, Mundo!
Hello, World!
Al de Novo.
Hello Again
Eu gosto de digitar isso.
like typing this.
sso legal.
This is fun.
pa!!!! Escrevendo na console.
Yay! Printing.
&!s' para sair do interpretador digite "exit() e tecle <ENTER>.
Indentao
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
Python usa a indentao para definir blocos de cdigo, em vez de outros elementos
(chaves "{ } como Java ou C). Ambos, tabulao e espaos so aceitos, mas a
indentao padro requer que o cdigo padro Python use 4 (quatro) espaos. Por
exemplo:
x = 1
if x == 1:
# indented four spaces
print " x is 1.
&!s' no ambiente trabalhado anteriormente (mikroBasic), no havia necessidade de se
usar indentao, mas em Python ela obrigatria. Se no usar, muita coisa no vai
funcionar!!! CUI,A,&""" Preste ateno-
Variveis e Tipos
Python completamente orientada a objetos, e no "estaticamente tipada (d uma
buscada no Dr. Google sobre isso). Voc no precisa declarar variveis antes de us-las,
ou declarar seus tipos (como em outras linguagens). Toda varivel em Python um
objeto.
Este tutorial tratar de alguns tipos bsicos de variveis.
N.meros
Python suporta dois tipos de nmeros inteiros e nmeros de ponto flutuante
(nmeros reais). (Ela tambm suporta nmeros complexos, que no sero explicados
aqui).
Para definir um inteiro, use a seguinte sintaxe:
>>>myint = 7
Para definir um nmero de ponto flutuante, voc pode usar uma das seguintes notaes:
>>>myfloat = 7.0
>>>myfloat = float(7)
Cadeias (/trin0s)
Cadeias de caracteres (strings) so definidas tanto com aspas simples, quanto com aspas
duplas:
>>>mystring = 'Hello'
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
>>>mystring = "Hello
A diferena entre as duas que usando aspas duplas torna fcil a incluso de
apstrofos (enquanto este iria fechar a cadeia se tivesse sido usada aspa simples para
abrir). Veja o exemplo (em ingls porque no temos o uso em portugus):
>>>mystring = "Don't worry about apostrophes
>>>mystring = "'d much rather you 'not'.
>>>mystring = ' "said do not touch this.'
Existem variaes adicionais para a definio de cadeias que tornam mais fcil a
incluso de coisas como mudanas de linhas (return), barras contrrias (\) e caracteres
Unicode (procure mais sobre estes termos...). Estes recursos esto fora do escopo deste
tutorial, mas so cobertos na Documentao do Python (aqui:
http://www.python.org.br/wiki/DocumentacaoPython).
Operadores simples podem ser executados sobre nmeros e cadeias:
>>>one = 1
>>>two = 2
>>>three = one + two
>>>hello = "hello
>>>world = "world
>>>helloword = hello + " " + word
Atribuies podem ser feitos a mais de uma varivel "simultaneamente numa
mesma linha como:
>>>a, b = 3, 4
Misturar operadores numricos e cadeias no suportado:
# This will not work!
>>>print one + two + hello
&!s' note no exemplo acima que o texto "This will not work! foi precedido do carcter "#.
Ele usado para inserir comentrios dentro do bloco de comandos. Sempre que o
interpretador encontra este carcter, tudo que for digitado aps ele (at o final da linha)
ser desconsiderado como cdigo.
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
()erc*cios 1
O objetivo deste exerccio criar uma string, um inteiro, e um nmero real (float). A
string deve ser chamada mystring e deve conter a palavra "hello. O nmero real deve ser
chamado de myfloat e deve conter o valor 10, e o inteiro deve ser chamado myint e deve
conter o valor 20.
&!s' a partir deste ponto no tutorial, insira o cdigo dos exerccios em arquivos (usando o
editor que voc escolheu) e salve na sua pasta de estudos com a extenso ".py, por
exemplo: exerc2.py. Ento execute o script (outro nome muito usado para designar um
conjunto de comandos) com o comando "python <nome_do_script.py>. Assim:
C:\sua_pasta>python exerc2.py
ndo alm... crie as seguintes variveis:
>>>cars = 100
>>>space_in_a_car = 4.0
>>>drivers = 30
>>>passengers = 90
>>>cars_not_driven = cars drivers
>>>cars_driven = drivers
>>>carpool_capacity = cars_driven * space_in_a_car
>>>average_passengers_per_car = passengers / cars_driven
E imprima as seguintes linhas:
"Existem", cars, "carros disponveis.
"Existem somente, drivers, "motoristas disponiveis.
"Existiro, cars_not_driven, "carros vazios hoje.
"Podemos transportar, carpool_capacity, "pessoas hoje.
"Temos, passengers, "para transportar hoje.
"Precisamos colocar, average_passengers_per_car, "em cada carro.
Procure entender o que foi feito... estude cada varivel, as operaes que foram
realizadas e como foram apresentados os resultados do processamento.
2istas
Listas so muito parecidas com vetores. Eles podem conter qualquer tipo de
variveis, e eles podem conter tantas variveis quantas voc quiser. Listas tambm
podem ser percorridas de uma maneira muito simples. Segue um exemplo de como se
criar uma lista.
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
>>>mylist = []
>>>mylist.append(1)
>>>mylist.append(2)
>>>mylist.append(3)
>>>print mylist[0]
>>>print mylist[1]
>>>print mylist[2]
>>>for x in mylist:
. . . print x
&!s' necessrio comear a linha abaixo do "for com 4 espaos.
Procure entender e explicar o que foi feito no exemplo.
Acessar um ndice que no existe, gera uma exceo (um erro) na interpretao.
Verifique:
>>>mylist = [1,2,3]
>>>print mylist[10]
()erc*cios 3
Neste exerccio, voc ter que inserir nmeros e cadeias s cadeias corretas
usando o mtodo de listas "append. Voc deve inserir os nmeros 1, 2, e 3 a uma lista
"numrica, e as palavras 'hello' e 'world' a lista de strings.
Voc tambm ter que criar uma lista de nomes (names), inserir alguns nomes na
lista, e preencher a varivel second_name com o segundo nome da lista names usando o
operador colchetes "[ ]. Note que o ndice de listas base-zero (0,1,2,3,4,...), ento se
voc quiser acessar o segundo item da lista, o ndice 1.
ndo alm... teste o seguinte cdigo:
>>>the_count = [1, 2, 3, 4, 5]
>>>fruits = ['apples', 'oranges', 'pears', 'apricots']
>>># para percorrer uma lista pode-se usar for-loop
>>>for number in the the-count:
. . . print "Este o valor %d % number
>>>for fruit in fruits:
. . . print "Uma fruta do tipo: %s % fruit
>>># pode-se criar listas, primeiro criando uma lista vazia
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
>>>elements = []
>>># ento usar a funo "range para inserir os nmeros de 0 a 5
>>>for i in range(0, 6):
. . . print "Adicionando %d a lista. % i
. . . elements.append(i)
>>># agora se pode imprimir os contedos
>>>for i in elements:
. . . print "Elemento: %d % i
&!s' os operadores % sero tratados mais a frente, em Formatao de Cadeias.
&peradores Bsicos
Esta sesso explica como usar operadores bsicos em Python.
&peradores Aritm4ticos
Como qualquer outra linguagem de programao operadores de adio, subtrao,
multiplicao, e diviso podem ser usados com nmeros.
>>>number = 1 + 2 * 3 / 4.0
Tente predizer qual ser o resultado da operao. O Python segue a ordem dos
operadores?
Outro operador disponvel o mdulo (%), que retorna o resto da diviso inteira do
dividendo pelo divisor (dividendo % divisor = resto).
>>>reminder = 11 % 3
Usar dois smbolos de multiplicao (*) realiza a operao de potncia.
>>>squared = 7 ** 2
>>>cubed = 2 ** 3
A ordem de precedncia das operaes aritmticas :
1. Exponenciao ou potenciao (**)
2. Multiplicao (*), diviso (/) e mdulo (%)
3. Adio (+) e subtrao (-)
Usando &peradores com Cadeias 5/trin0s6
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
Python suporta a concatenao de cadeias usando o operador de adio:
>>>helloword = 'hello' + ' ' + 'world'
Python tambm suporta a multiplicao de cadeias para formar uma cadeia com
uma sequencia repetida:
>>>lotsofhellos = 'hello' * 10
Usando &peradores com 2istas
Listas podem ser unidas com operadores de adio:
>>>even_numbers = [2,4,6,8]
>>>odd_numbers = [1,3,5,7]
>>>all_numbers = odd_numbers + even_numbers
Da mesma forma que com cadeias, Python suporta a formao de novas listas com
uma sequncia repetida, usando o operador de multiplicao:
>>>print [1,2,3] * 3
()erc*cios 7
O objetivo deste exerccio criar duas listas chamadas x_list e y_list, que contm
10 instncias das variveis x e y, respectivamente. pedido tambm que voc crie uma
lista chamada big_list, que contm as variveis x e y, 10 vezes cada, pela concatenao
das duas listas criadas.
ndo alm... teste o seguinte cdigo:
>>>print "Vou contar minhas galinhas:
>>>print "Galinhas, 25 + 30 / 6
>>>print "Galos, 100 25 * 3 % 4
>>>print "Agora vou contar os ovos:
>>>print 3 + 2 + 1 5 + 4 % 2 1 / 4 + 6
ndo alm... usando lpis e papel, calcule o resultado da expresso abaixo. Em
seguida, execute a mesma expresso no interpretador Python. O resultado foi o mesmo?
Explique porque.
10 % 3 * 10 ** 2 + 1 10 * 4 / 2
Formatando Cadeias
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
Python usa a formatao de cadeias padro-C para criar novas cadeias
formatadas. O operador "% usado para formatar um conjunto de variveis contidas em
uma "tupla (uma lista de tamanho fixo), junto com uma cadeia de formatao, que
contm texto normal junto com "especificadores de argumentos, smbolos especiais
como "%s e "%d.
Digamos que voc tenha uma varivel chamada "name com seu nome de usurio
nela, e voc gostaria de imprimir uma mensagem de boas vindas quele usurio.
>>># Este cdigo ir imprimir "Hello, John!
>>>name = "John
>>>print "Hello, %s! % name
Para usar dois ou mais especificadores de argumento, use uma tupla (entre
parnteses):
>>># Este exemplo imprime "John is 23 years old.
>>>name = "John
>>>age = 23
>>>print "%s is %d years old. % (name, age)
Qualquer objeto que no seja uma cadeia pode ser formatado usando o operador
%s. A cadeia que retorna do mtodo "repr daquele objeto formatada como a cadeia.
Por exemplo:
>>># Este exemplo imprime: A List: [1, 2, 3]
>>>mylist = [1,2,3]
>>>print "A list: %s % mylist
Seguem mais alguns especificadores de argumento que voc deve conhecer:
%s String (ou qualquer objeto com uma representao de cadeia, como nmeros)
%d nteiros
%f Nmeros de ponto flutuante (reais)
%.<number of digits> - Nmeros de ponto flutuante com uma quantidade fixa de
dgitos aps o ponto decimal
%x/%X nteiros com representao hexadecimal (minsculas/maisculas)
()erc*cios 8
Voc precisar escrever uma cadeia formatada que imprima os dados com a
seguinte sintaxe: Hello John Doe. Your current balance is 53.44$
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
ndo alm... escreva os comandos para se calcular o aumento (percentual) do seu
salrio ou mesada. Crie as variveis necessrias (salario e aumento) atribua valores a
elas e em seguida imprima o resultado com a seguinte sintaxe:
Seu novo salario/mesada R$ 9999.99
Calculado com base no salario original de R$ 9999.99
Com o aumento de 99.9 %
&pera9es Bsicas com Cadeias 5/trin0s6
Cadeias (strings) so bits de texto. Elas podem se definidas como qualquer coisa
entre aspas:
>>>astring = "Hello world!
&!s' daqui em diante, irei usar neste tutorial o termo string para designar cadeia, para
que voc se habitue mais facilmente com as funes de manipulao de strings
existentes no Python.
Como voc pode ver, a primeira coisa que voc aprendeu foi imprimir uma
sentena simples. Esta sentena foi armazenada pelo Python como uma string.
Entretanto, em vez de imprimir strings imediatamente, exploraremos as vrias coisas que
se pode fazer com elas.
>>>print len(astring)
Este comando resultou na apresentao de 12, porque "Hello world! uma string
que contm 12 caracteres, incluindo espaos e pontuao.
>>>print astring.index("o)
O resultado neste caso 4, porque a localizao da primeira ocorrncia da letra "o
est na posio 4 a partir do primeiro carcter. Perceba que existem dois "o na frase
este mtodo (.index()) reconhece a primeira ocorrncia.
Mas porque no foi mostrado o valor 5? O primeiro "o no o quinto carcter da
string? Para tornar isso mais simples, Python (e a maioria das outras linguagens de
programao) iniciam as coisas em 0 (zero) em vez de em 1. Ento o ndice do primeiro
"o da string 4.
>>>print astring.count("l)
Para os desavisados, aquela a letra L minscula, no o nmero 1... Este mtodo
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
(.count()) conta o nmero de "l na string. Assim o resultado impresso 3.
>>>print astring[3:7]
Este comando imprime uma faixa da string, iniciando no ndice 3 e terminando no
ndice 6. Mas porque ndice 6 e no 7? Novamente, a maioria das linguagens de
programao fazem isso tornando a realizao de clculos matemticos dentro dos
colchetes mais fcil (quero ver 4 carcteres a partir da posio 3).
Se voc tiver s um nmero dentro dos colchetes, obter o carcter (nico) que
ocupa a posio do ndice. Se tirar o primeiro nmero mantendo os ": e o segundo
nmero, receber como resultado uma faixa comeando no primeiro carcter com a
quantidade de carcteres do nmero que segue o ":. Se voc tirar o segundo nmero,
receber uma faixa iniciando na posio definida pelo nmero antes do ": e terminando
no final da string.
Voc pode at usar nmeros negativos dentro dos colchetes. Eles facilitam
percorrer a string de trs para frente. Assim, -3 significa "o terceiro carcter a partir do
ltimo.
>>>print astring.upper()
>>>print astring.lower()
Estes mtodos criam uma nova string com todas as letras convertidas para caixa
alta (masculas - .upper()) ou caixa baixa (minsculas - .lower()), respectivamente.
>>>print astring.startswith("Hello)
>>>print astring.endswith("asdfasdfasdf)
Estes mtodos so usados para determinar se uma string inicia (.startswith()) com
alguma coisa ou termina (.endswith()) com alguma coisa, respectivamente. O primeiro
exemplo resulta "True (verdade), porque a string comea com "Hello. O segundo resulta
"False (falso) porque a string no termina com aquelas letras.
>>>afewwords = astrng.split(" ")
Este mtodo (.split()) quebra a string em uma poro de strings agrupadas em uma
lista. Como no exemplo foi especificado o espao (" ") como referncia para a quebra, o
primeiro item da lista ser "Hello, e o segundo ser "world!.
()erc*cios :
Corrija o cdigo abaixo para obter a informao correta, mudando a string.
s = "Hey there! what should this string be?"
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
# Length should be 20
print "Length of s = %d" % len(s)
# First occurrence of "a" should be at index 8
print "The first occurrence of the letter a = %d" % s.index("a")
# Number of a's should be 2
print "a occurs %d times" % s.count("a")
# Slicing the string into bits
print "The first five characters are '%s'" % s[:5] # Start to 5
print "The next five characters are '%s'" % s[5:10] # 5 to 10
print "The twelfth character is '%s'" % s[12] # Just number 12
print "The last five characters are '%s'" % s[-5:] # 5th-from-last to end
# Convert everything to uppercase
print "String in uppercase: %s" % s.upper()
# Convert everything to lowercase
print "String in lowercase: %s" % s.lower()
# Check how a string starts
if s.startswith("Str"):
print "String starts with 'Str'. Good!"
# Check how a string ends
if s.endswith("ome!"):
print "String ends with 'ome!'. Good!"
# Split the string into three separate strings,
# each containing only a word
print "Split the words of the string: %s" % s.split(" ")
&!s' a string para execuo correta deve ser: s = "Strings are awesome!"
Indo alm na teoria
Agora a hora de voc comear a aprender lgica. At este ponto voc estudou os
comandos mais bsicos do Python, bem como algumas operaes aritmticas. Voc no
aprender as teorias complexas que os acadmicos adoram estudar mas apenas a lgica
bsica simples que faz com que programas reais funcionem, e que programadores reais
precisam todos os dias.
Aprender lgica tem que vir depois de voc fazer algumas memorizaes. Faa
estes exerccios por uma semana inteira. No vacile. Mesmo que voc esteja com a
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
cabea cheia, continue o exerccio. Ele apresenta um conjunto de tabelas lgicas que
voc deve memorizar para tornar a realizao dos exerccios seguintes mais fcil. bom
avisar que no vai ser muito divertido de incio. Vai chegar a ser sacal e entediante mas
para que voc aprenda uma habilidade muito importante como programador. Voc ter
que ser capaz de memorizar conceitos importantes na sua vida. A maioria destes
conceitos sero excitantes a medida que voc os domina. Voc vai travar uma batalha
contra eles e ento de repente voc ir entend-los. Todo o trabalho de memorizao do
bsico, voc ver, vai ter valido a pena.
Te dou uma dica de como memorizar algo sem ficar maluco: estude por um
pequeno intervalo de tempo, vrias vezes ao dia e anote suas dificuldades. No tente
estudar por duas horas memorizando estas tabelas. Isso no funciona! Seu crebro ir
reter somente o que voc estudou por 15 ou 30 minutos. Assim, o que voc deve fazer
pegar papel de rascunho e escrever as colunas da esquerda de cada tabela em um lado
da folha e as colunas da direita no verso. Voc deve ento ser capaz de, vendo as
combinaes de True ou False da frente, imediatamente dizer quais so True!
Pratique at que tenha destreza.
Assim que conseguir isso, comece a escrever suas prprias tabelas verdade em um editor
de textos. No as copie. Tente escrev-las de memria, e quando voc estiver seguro d
uma rpida olhada nas que esto aqui para refrescar sua memria. Fazendo isso voc
treinar seu crebro a se lembrar da tabela completa.
Os Termos Verdade
Em Python existem os seguintes termos (caracteres e frases) para determinar se
alguma coisa True ou False. Lgica em computadores tem tudo a ver com descobror
se alguma combinao destes caracteres e algumas variveis True em alguma parte
em um programa.
. and
. or
. not
. != (not equal)
. == (equal)
. >= (greater-than-equal)
. <= (less-than-equal)
. True
. False
As Tabelas Verdade
Estes caracteres sero usados para fazer as tabelas verdade que voc precisa
memorizar:
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
N&T True;
Not False True
Not True False
&< True;
True or False True
True or True True
False or True True
False or False False
AN, True;
True and False False
True and True True
False and True False
False and False False
N&T &< True;
Not (True or False) False
Not (True or True) False
Not (False or True) False
Not (False or False) True
N&T AN, True;
Not (True and False) True
Not (True and True) False
Not (False and True) True
Not (False and False) True
-= True;
1 != 0 True
1 != 1 False
0 != 1 True
0 != 0 False
== True;
1 == 0 False
1 == 1 True
0 == 1 False
0 == 0 True
Pronto, voc tem as tabelas. Escreva em rascunho vrias vezes para memoriz-
las. Lembre-se, s depende de voc. Estude tudo o que puder cada dia, e um pouco a
mais...
Praticando 20ica
As combinaes lgicas vistas acima so chamadas expresses lgicas
booleanas. Lgica booleana est e todo lugar em programao. So parte fundamental da
computao e conhec-las muito bem o mesmo que dominar escalas em msica.
Nas sentenas seguintes voc aplicar o que aprendeu na sesso anterior e vai
test-los em Python. Pegue cada um dos exerccios, escreva qual a resposta para cada
um deles. Em cada caso, ser "True ou "False. Assim que tiver as respostas, abra o
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
interpretador Python na console e escreva as sentenas para verificar suas respostas.
/entena True;
True and False
False and True
1 == 1 and 2 == 1
"test == "test
1 == 1 or 2 != 1
True and 1 == 1
False and 0 != 0
True or 1 == 1
"test" == "testing"
1 != 0 and 2 == 1
"test" != "testing"
"test" == 1
not (True and False)
not (1 == 1 and 0 != 1)
not (10 == 1 or 1000 == 1000)
not (1 != 10 or 3 == 4)
not ("testing" == "testing" and "Zed" == "Cool Guy")
1 == 1 and not ("testing" == 1 or 1 == 0)
"chunky" == "bacon" and not (3 == 4 or 3 == 3)
3 == 3 and not ("testing" == "testing" or "Python" == "Fun")
Veja uma dica para te ajudar a resolver as questes mais complicadas. Para
resolver expresses booleanas complexas, siga os seguintes passos:
1. Encontre um teste de igualdade (== ou !=) e substitua por seu resultado ("True ou "False).
2. Encontre cada "and/or dentro de parnteses e resolva as expresses primeiro.
3. Encontre cada "not e o inverta.
4. Encontre os restantes "and/or e resolva-os.
5. Quando completar, voc dever ter como resultado "True ou "False
Seja a expresso: 3 != 4 and not ("testing" != "test" or "Python" == "Python")
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
Vamos aplicar os passos acima at chegarmos ao resultado:
1. Resolver cada teste de igualdade:
. 3 != 4 True True and not ("testing != "test or "Python == "Python)
. "testing != "test True True and not (True or "Pyhton == "Python)
. "Python == "Python True True and not (True or True)
2. Encontre cada "and/or entre parnteses:
. (True or True) True True and not (True)
3. Encontre cada "not e os inverta:
. not (True) False True and False
4. Encontre quaisquer "and/or restantes e resolva-os:
. True and False False Resposta final: False.
Ateno: as mais complicadas podem parecer muito difceis primeira vista. Voc
deve conseguir comear a resolv-las, mas no se preocupe se ainda no conseguir.
Persistindo voc ver que a cada dia tudo fica mais fcil. Anote o que deu errado e no se
preocupe se as coisas ainda no esto ajustadas na sua cabea. Elas ficaro!
Testes Condicionais
Python usa variveis booleanas para avaliar condies. Os valores booleanos
"True e "False so retornados quando uma expresso comparada ou avaliada. Por
exemplo:
>>>x = 2
>>>print x == 2 # imprime True
>>>print x == 3 # imprime False
>>>print x < 3 # imprime True
Perceba que atribuio de contedo a variveis feito usando-se o operador igual
"=, ao passo que a comparao entre duas variveis feita usando-se o operador duplo-
igual "==. O operador diferente (ou no igual) marcado por "!=.
&peradores Booleanos
Os operadores "and ("e) e o "or ("ou) permitem a construo de expresses
booleanas complexas, por exemplo:
>>>name = "John
>>>if name == "John and age == 23:
. . . print "Your name is John, and you are 23 years old.
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
>>>if name == "John or name == "Rick:
. . . print "Your name is either John or Rick.
& &perador >in?
O operador "in deve ser usado para verificar se um objeto especfico existe em um
container de objetos iterativos, como uma lista:
>>>if name in ["John, "Rick]:
. . . print "Your name is either John or Rick.
&!s' lembre-se, sempre, das regras de indentao em Python! Evite problemas!!!!!
Segue um exemplo para uso de comandos "if em Python, usando blocos de
cdigo:
if <statement is true>:
<do something>
.
.
elif <another statement is true>: # same as else if
<do something else>
.
.
else: # case statement is false
<do another thing>
.
.
Por exemplo:
>>>x = 2
>>>if x == 2:
. . . print "x equals two!
. . . else:
. . . print 'x does not equal to two.
&!s' note que existe um ": encerrando a expresso lgica ou o elemento do comando
condicional "else.
Uma expresso avaliada como "True (verdade) se uma das seguintes condies
for satisfeita: 1. A varivel booleana "True fornecida, ou calculada usando uma
expresso, como uma expresso aritmtica. 2. Um objeto considerado no vazio for
passado.
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
Alguns exemplos de objetos vazios: 1. Uma cadeia vazia: "; 2. Uma lista vazia: [];
3. O nmero zero: 0; 4. A varivel booleana falso: False.
& &perador @is@
Ao contrrio do operador de igualdade duplo-igual ("==), o operador "is no
compara os valores das variveis, mas suas instncias propriamente ditas. Por exemplo:
>>>x = [1,2,3]
>>>y = [1,2,3]
>>>print x == y # imprime True
>>>print x is y # imprimr False
& &perador >not?
Usar o not antes de uma expresso booleana a inverte (faz a negao dela):
>>>print not False # imprime True
>>>print (not False) == (False) # imprime False
Exerccios 7
Troque as variveis na primeira sesso, de tal forma que cada comando if resulte
True.
# change this code
number = 10
second_number = 10
first_array = []
second_array = [1,2,3]
if number > 15:
print "1"
if first_array:
print "2"
if len(second_array) == 2:
print "3"
if len(first_array) + len(second_array) == 5:
print "4"
if first_array and first_array[0] == 1:
print "5"
if not second_number:
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
print "6"
ndo alm... resolva as sentenas e depois teste com Python:
people = 20
cats = 30
dogs = 15
if people < cats:
print "Too many cats! The world is doomed!"
if people > cats:
print "Not many cats! The world is saved!"
if people < dogs:
print "The world is drooled on!"
if people > dogs:
print "The world is dry!"
dogs += 5
if people >= dogs:
print "People are greater than or equal to dogs."
if people <= dogs:
print "People are less than or equal to dogs."
if people == dogs:
print "People are dogs."
&!s' o que += significa? O cdigo x += 1 o mesmo que x = x + 1, mas envolve menos
digitao. Este conhecido como o operador "incremento de. O mesmo vale para -= e
vrias outras expresses que sero mostradas adiante.
2aos
Existem dois tipos de laos em Python, "for e "while.
& 2ao >for?
Os laos "for iteram sobre uma dada sequncia. Por exemplo:
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
>>>primes = [2,3,5,7]
>>>for prime in primes:
. . . print prime
Os laos "for podem iterar sobre uma sequncia de nmeros usando a funo
"range. Exemplos:
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(0, 30, 5)
[0, 5, 10, 15, 20, 25]
>>> range(0, 10, 3)
[0, 3, 6, 9]
>>> range(0, -10, -1)
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> range(0)
[]
>>> range(1, 0)
[]
2aos >ABile?
Laos "while repetem um bloco de cdigo enquanto uma condio booleana for
verdadeira. Por exemplo:
>>># imprime 0,1,2,3,4
>>>count = 0
>>>while count < 5:
. . . print count
. . . count += 1
Comandos >!reaC? e >continue?
"break usado para sair de laos "for ou "while, ao passo que "continue usado
para pular o bloco corrente, e retornar para o teste condicional do lao "for ou "while.
Veja os exemplos:
>>># imprime 0,1,2,3,4
>>>count = 0
>>>while True:
. . . print count
. . . count += 1
. . . if count >= 5:
. . . break
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
>>># imprime somente nmeros mpares (odd) 1,3,5,7,9
>>>for x in range(10):
. . . # verifique se x par (even)
. . . if x % 2 == 0:
. . . continue
. . . print x
()erc*cios D
Escreva o cdigo que percorre a lista dada e imprime todos os nmeros pares na
mesma ordem que so recebidos. No imprima quaisquer nmeros que vierem depois de
237 na sequncia.
numbers = [
951, 402, 984, 651, 360, 69, 408, 319, 601, 485, 980, 507, 725, 547, 544,
615, 83, 165, 141, 501, 263, 617, 865, 575, 219, 390, 984, 592, 236, 105, 942,
941, 386, 462, 47, 418, 907, 344, 236, 375, 823, 566, 597, 978, 328, 615, 953,
345, 399, 162, 758, 219, 918, 237, 412, 566, 826, 248, 866, 950, 626, 949, 687,
217, 815, 67, 104, 58, 512, 24, 892, 894, 767, 553, 81, 379, 843, 831, 445, 742,
717, 958, 609, 842, 451, 688, 753, 854, 685, 93, 857, 440, 380, 126, 721, 328,
753, 470, 743, 527
]
ndo alm... teste e procure explicar o que acontece em cada caso:
the_count = [1, 2, 3, 4, 5]
fruits = ['apples', 'oranges', 'pears', 'apricots']
change = [1, 'pennies', 2, 'dimes', 3, 'quarters']
# this first kind of for-loop goes through a list
for number in the_count:
print "This is count d" % number
# same as above
for fruit in fruits:
print "! fruit of type" s" % fruit
# also we can go through mixed lists too
# notice we have to use %r since we don't know what's in it
for i in change:
print "# got r" % i
# we can also build lists, first start with an empty one
elements = []
# then use the range function to do 0 to 5 counts
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
for i in range(0, 6):
print "!dding d to the list." % i
# append is a function that lists understand
elements.append(i)
# now we can print them out too
for i in elements:
print "$lement was" d" % i
e:
i = 0
numbers = []
while i < 6:
print "!t the top i is d" % i
numbers.append(i)
i = i + 1
print "Numbers now" ", numbers
print "!t the bottom i is d" % i
print "The numbers" "
for num in numbers:
print num
FaEendo Per0untas
Agora hora de esquentar um pouco. Voc fez uma srie de exerccios mas que
no so l muito excitantes... O que se quer, agora obter dados externos para
processamento. sso um pouco complicado, porque voc tem que aprender a fazer duas
coisas que podem no fazer sentido imediatamente, mas acredite e toque em frente. Far
sentido daqui a pouco.
A maioria dos programas fazem o seguinte:
1. Recebem algum tipo de entrada de um usurio.
2. Processam esta entrada.
3. mprimem o resultado do processamento.
At agora os exerccios imprimiram os resultados, mas no receberam entradas do
usurio. Ento veja como possvel se fazer isso:
print "%ow old are you&",
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
age = raw_input()
print "%ow tall are you&",
height = raw_input()
print "%ow much do you weigh&",
weight = raw_input()
print "'o( you're r old( r tall and r heavy." % (
age, height, weight)
&!s' perceba que foi colocada uma ", ao final de cada linha de impresso. sso para
que o comando no mude de linha para receber a entrada.
Escreva o programa em um arquivo (exerc9.py, por ex.) e execute algumas vezes
com diferentes dados de entrada.
<efatorando o Cdi0o
Refatorar o cdigo significa literalmente "limp-lo! Programas devem ser escritos
de forma clara, limpa e o mais simples possvel. SEMPRE h uma forma melhor de se
escrever o mesmo programa. Estude mais a fundo cada um dos comandos e funes
usadas e descubra todas as suas caractersticas. Lembre-se sempre de documentar seu
cdigo e torn-lo o mais claro, limpo, e enxuto possvel.
Quer ver como o exerccio anterior pode ser melhorado usando recursos do
mtodo raw_input()? Veja:
age = raw_input("%ow old are you& ")
height = raw_input("%ow tall are you& ")
weight = raw_input("%ow much do you weigh& ")
print "'o( you're r old( r tall and r heavy." % (
age, height, weight)
Percebeu a diferena? No ficou mais bonito???? sso refatorar! Modifique seu
exerccio e teste novamente. Tem que funcionar da mesma forma...
ParFmetros$ ,escompactao$ Variveis
Neste exerccio trataremos de mais um mtodo de entrada que pode ser usado
para passar variveis para um script. Voc j deve estar executando seus programas a
partir do comando "python seu_prog.py. Muito bem, o termo "seu_prog.py na linha de
comando chamado "argumento (ou parmetro). Agora vamos escrever um script que
tambm aceite argumentos. Digite o programa a seguir e vamos examin-lo:
from sys import argv
script, first, second, third = argv
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
print "The script is called"", script
print ")our first variable is"", first
print ")our second variable is"", second
print ")our third variable is"", third
Na primeira linha temos o comando "import. desta forma que se adiciona
recursos aos seus scripts Python. Diz-se que Python uma linguagem com as "baterias
includas como referncia aos brinquedos eletrnicos que no costumam ser vendidos
com as baterias e so uma tremenda fonte de frustraes maioria das crianas que os
ganham! Python vem com uma enorme quantidade de recursos prontos e todos
disposio do programador para serem importados em seus scripts. A nica ao que o
desenvolvedor tem que tomar importar os mdulos que sero usados.
A "argv a varivel argumento, um nome padro em programao usado em
vrias linguagens. Esta varivel recebe os argumentos passados para o script Python
executado. Voc ver como funciona nos exemplos a seguir.
A linha seguinte "descompacta o contedo de "argv de tal forma que cada um seja
associado s variveis declaradas esquerda do sinal de atribuio ("=) - script, first,
second e third. Pode parecer estranho, mas descompactar provavelmente a melhor
palavra para descrever o que feito. Simples assim: pegue o que quer que esteja em
argv, descompacte, e atribua s variveis esquerda, em ordem.
Em seguida o script as imprime como de costume. Crie o arquivo (exerc10.py) e
execute da seguinte forma:
C:\sua_pasta>python exerc10.py arg1 arg2 arg3
Teste outras opes de argumentos. Teste tambm fornecendo s dois argumentos
e veja o que acontece.
C:\sua_pasta>python exerc10.py banana laranja tangerina
C:\sua_pasta>python exerc10.py prego martelo alicate
C:\sua_pasta>python exerc10.py vai bugar!
Vamos agora usar os dois recursos vistos: arg e raw_input para pedir ao usurio
algo especfico. sso ser usado no exerccio seguinte, quando voc ir aprender a ler e
escrever arquivos de dados. Neste exerccio o raw_input ser usado de uma forma um
pouco diferente, apresentando s um sinal de prompt ">. Crie o script com o cdigo a
seguir e salve com o nome exerc11.py.
from sys import argv
script, user_name = argv
prompt = '* '
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
print "%i s( #'m the s script." % (user_name, script)
print "#'d li+e to as+ you a few questions."
print ",o you li+e me s&" % user_name
li+es = raw_input(prompt)
print "-here do you live s&" % user_name
lives = raw_input(prompt)
print "-hat +ind of computer do you have&"
computer = raw_input(prompt)
print """
!lright( so you said r about li+ing me.
)ou live in r. Not sure where that is.
!nd you have a r computer. Nice.
""" % (li+es, lives, computer)
Note que foi criada uma varivel prompt que inicializada com o sinal que se
deseja usar na interface, e o raw_input usou esta varivel em vez de um texto fixo. Agora,
se quiser alterar o sinal de pronto do programa, basta alterar a linha de atribuio de valor
varivel prompt. Em um s lugar... Uma mo na roda!
Execute o script passando como argumento o seu nome:
C:\sua_pasta>python exerc11.py seu_nome
e veja o resultado. Modifique o sinal de pronto e teste. Adicione um outro argumento e
use-o no script.
&!s' veja que foi usado um novo recurso do Python para definir cadeias com mltiplas
linhas: as aspas triplas ("). Pesquise mais sobre este recurso para us-lo com mais
frequncia.
2endo ArGuivos
O que foi estudado sobre raw_input e arg vai permitir comear a ler arquivos de
dados. Voc precisa ir fundo neste exerccio para entender o que vai acontecer, e vai ter
que execut-lo muitas vezes, portanto tenha algum cuidado antes de executar e sempre
verifique o que voc fez, porque trabalhar com arquivos uma forma MUTO fcil de se
apagar e perder o que se fez. Portanto SEJA CUDADOSO!
Este exerccio envolve escrever dois arquivos. Um o usual script do exerccio
(exerc12.py) que ser executado, mas o outro (exerc12_sample.txt) no um script, mas
um arquivo de texto puro, que ser lido pelo script. O contedo dele :
This is stuff # typed into a file.
#t is really cool stuff.
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
.ots and lots of fun to have in here.
No seu editor, digite o texto acima e salve como exerc12_sample.txt na sua pasta de
estudo.
O que se quer fazer "abrir ("open) este arquivo pelo script, ler e imprimir seu
contedo. Entretanto, no para se engessar o script definindo no seu cdigo fonte o
nome do arquivo a ser usado. Ou seja, deve-se pedir que o usurio informe o nome do
arquivo a ser aberto, para inclusive poder usar o mesmo script com outros arquivos de
texto. Para isso, usa-se o arg para pedir ao usurio o nome do arquivo:
from sys import argv
script, filename = argv
t/t = open(filename)
print "%ere's your file r"" % filename
print t/t.read()
print "Type the filename again""
file_again = raw_input("* ")
t/t_again = open(file_again)
print t/t_again.read()
Algumas novidades apareceram por aqui: as duas primeiras linhas so velhas
conhecidas... Na linha seguinte foi usado um novo comando "open. Pesquise o que este
comando faz. Voc tem um recurso legal no Python que executar o comando "pydoc
para receber instrues sobre cada recurso da linguagem. Teste "pydoc open e veja o
que descobre. Aqui o arquivo cujo nome foi informado como argumento do script foi
aberto e atribudo a uma varivel chamada "txt.
Na linha seguinte foi impresso uma mensagem seguida do nome do arquivo
recebido, mas na linha de baixo, algo novo e muito legal foi feito. Foi chamado um mtodo
do objeto "txt (o arquivo obtido do comando "open). Mtodos so executados
associando-os ao nome do objeto com um ponto (".), como no caso: t!t"read#$. O que
isso significa : "Ei txt! Execute o seu comando read sem parmetros!
Existem casos que se pode usar os mtodos de um objeto passando parmetros
como j foi visto com o open e o raw_input.
Agora vamos dedicar um pouco mais de tempo a este exerccio, porque vale a
pena. nvista um tempo fazendo as seguintes atividades:
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
1. Sobre cada linha do script escreva um comentrio sobre o que ela faz.
2. Pesquise os documentos existentes no Python sobre cada um dos comandos usados.
3. Faa uma pesquisa na internet sobre as definies de comando, funo e mtodo. No
se preocupe se as coisas ficarem pior. No incio assim mesmo, mas insista!
4. Elimine as linhas a partir da 6
a
e teste o script de novo.
5. Use somente raw_input e faa novo teste. Pense sobre porque uma forma de se obter
o nome do arquivo melhor do que outra.
6. Execute o "pydoc file e role at encontrar o mtodo "read(). Veja todos os outros que
podem ser usados. Desconsidere aqueles que tenham "__ (dois sublinhados) na frente
do nome. Tente outras opes de comando.
7. Abra a console do Python e execute o mtodo "open. Veja como se pode abrir arquivos
e executar o "read neles.
8. Faa o script do exerccio executar um "close() nas variveis "txt e "txt_again.
MUTO importante fechar os arquivos quando tiver terminado de us-los.
2endo e (screvendo ArGuivos
Se voc fez as atividades propostas no item anterior (se no fez V J FAZER!!!!),
voc deve ter visto vrios mtodos que podem ser executados em arquivos. Refrescando
a memria, segue uma lista:
. close fecha o arquivo.
. read l o contedo do arquivo aberto. Pode-se atribuir o resultado a uma varivel.
. readline l apenas uma linha do arquivo de texto.
. truncate esvazia o arquivo. Tome cuidado ao usar este comando.
. write(stuff) escreve stuff no arquivo.
Por agora estes so os mtodos importantes que sero usados. Alguns requerem
parmetros, mas isso nem tem tanta importncia agora. S preciso lembrar que o
mtodo write requer um parmetro: a string que ser escrita no arquivo.
Vamos usar alguns destes para fazer um simplrrimo editor de textos:
from sys import argv
script, filename = argv
print "-e're going to erase r." % filename
print "#f you don't want that( hit 0T1.20 3405."
print "#f you do want that( hit 1$T61N."
raw_input("&")
print "7pening the file..."
target = open(filename, 'w')
print "Truncating the file. 8oodbye!"
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
target.truncate()
print "Now #'m going to as+ you for three lines."
line9 = raw_input("line 9" ")
line: = raw_input("line :" ")
line; = raw_input("line ;" ")
print "#'m going to write these to the file."
target.write(line9)
target.write("<n")
target.write(line:)
target.write("<n")
target.write(line;)
target.write("<n")
print "!nd finally( we close it."
target.close()
Este um script longo (exerc13.py)! O maior at agora... Ento no tenha pressa,
verifique tudo o que digitou, e faa-o rodar. Uma dica ir fazendo e testando aos poucos.
Faa as cinco primeiras linhas funcionarem, depois mais cinco, depois mais algumas at
que tudo esteja funcionando.
Mais atividades complementares:
1. Se voc estiver confuso, volte e use o truque do comentrio no cdigo para arejar sua
cabea. Escreva o que cada linha faz no cdigo.
2. Escreva um script parecido com o anterior para ler o arquivo criado por este.
3. H muita repetio neste cdigo. Refatore seu scrpit usando "strings, "formats, e
caracteres escape (procure sobre eles na internet e na documentao do Python
caracteres \) para imprimir as variveis line%, line& e line' com um nico (target"write#$)
em vez de seis.
4. Descubra porque necessrio passar um argumento *w* no mtodo open. Dica: open
tenta ser seguro fazendo com que o programador explicite que ele quer escrever em um
arquivo.
5. Se o arquivo foi aberto com o argumento *w*, ento realmente necessrio executar o
target"truncate#$? Leia a documentao do mtodo open do Python e veja se isso
verdade.
%ais um pouco de ArGuivos
Vamos fazer mais algumas coisas com arquivos. Vamos escrever um script Python
para copiar um arquivo para outro. bem rpido, mas vai te dar algumas ideias sobre
outras coisas que podem ser feitas com arquivos.
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
from sys import argv
from os.path import e/ists
script, from_file, to_file = argv
print "0opying from s to s" % (from_file, to_file)
# we could do these two on one line too, how
in_file = open(from_file)
indata = in_file.read()
print "The input file is d bytes long" % len(indata)
print ",oes the output file e/ist& r" % e/ists(to_file)
print "1eady( hit 1$T61N to continue( 0T1.20 to abort."
raw_input()
out_file = open(to_file, 'w')
out_file.write(indata)
print "!lright( all done."
out_file.close()
in_file.close()
Veja que foi importado um outro mdulo chamado e!ists. Ele permite verificar se
uma arquivo existe, retornando "True caso verdade, com base na string passada como
argumento. Ele retorna "False se o arquivo no existir.
Crie o script (exerc14.py) e um outro arquivo "test.txt com qualquer texto e execute
com a sintaxe (passando dois argumentos):
C:\sua_pasta>exerc14.py test.txt new_test.txt
Deve funcionar com quaisquer arquivos. Mas tenha cuidado ao informar os
argumentos. Voc pode perder coisas importantes.
Para complementar os estudos:
1. Leia mais sobre o comando import. Tente importar algumas coisas e veja se consegue.
No se preocupe se no der certo!
2. Este script um pouco irritante, no ? Fica perguntando um monte de coisa e
mostrando um monte de mensagens. Tente torn-lo mais amigvel removendo os
excessos.
3. Tente encurtar ao mximo o script (refator-lo). possvel faz-lo com uma nica linha
(um pouco longa, mas s 1!).
4. Descubra porque necessrio fazer o output"close#$ no script.
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
FUNHI(/
& Gue so fun9es;
Funes so uma maneira conveniente de dividir o cdigo em blocos teis,
permitindo que se ordene o programa, tornando-o mais legvel e reutilizar estas partes
economizando algum tempo de desenvolvimento. Funes tambm so uma tremenda
sacada para definir interfaces de tal forma que programadores possam compartilhar seus
cdigos.
Como se escreve fun9es em PJtBon;
Como visto nos itens anteriores, Python faz uso de blocos de cdigo.
Um bloco uma parte do cdigo escrito como:
block_head:
1st block line
2nd block line
.
Onde uma "block line mais cdigo Python (ou mesmo um outro bloco), e o "block
head algo com o seguinte formato:
block_keyword block_name(argument1,argument2, .)
"block_keyword so expresses do tipo "if, "for, e "while (j vistas).
Funes em Python so definidas usando a +lock_keyword "def, seguida do nome
da funo como o nome do bloco de cdigo. Por exemplo:
>>>def my_function():
. . . print "Hello From My Function!
Funes tambm podem receber argumentos (variveis passadas pelo cdigo que
as chama para execuo). Por exemplo:
>>>def my_function_with_args(username, greeting):
. . . print "Hello, %s, From My Function!, wish you %s % (username, greeting)
Funes podem retornar um valor para o cdigo que as chamou, usando a
keyword "return. Por exemplo:
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
>>>def sum_two_numbers(a, b):
. . . return a + b
Como cBamar fun9es em PJtBon;
Simplesmente escreva o nome da funo seguido de (), colocando quaisquer
argumentos requeridos dentro dos parnteses. Por exemplo, para chamar as funes
acima:
>>># para chamar a funo my_function
>>>my_function()
>>># para chamar a funo my_function_with_args
>>>my_function_with_args("Meu nome, "Bom dia/tarde/noite)
>>># para chamar a funo sum_two_numbers
>>>print sum_two_numbers(15, 67)
()erc*cios +8
Neste exerccio voc usar uma funo existente, e acrescentar seu cdigo para
criar um programa completo.
1. Adicione uma funo chamada list_+enefits#$ que retorne as seguinte lista de strings:
"More organized code, "More readable code, "Easier code reuse, "Allowing
programmers to share and connect code together
2. Adicione uma funo chamada +uild_sentence#info$ que recebe um argumento nico
contendo uma string e retorna a sentena iniciando com a dada string e terminando com a
string " is a benefit of functions!
3. Execute e veja todas as funes trabalhando juntas!.
# Modify this function to return a list of strings as defined above
def list_benefits():
pass
# Modify this function to concatenate to each benefit:
# " is a benefit of functions!"
def build_sentence(benefit):
pass
def name_the_benefits_of_functions():
list_of_benefits = list_benefits()
for benefit in list_of_benefits:
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
print build_sentence(benefit)
name_the_benefits_of_functions()
ndo alm... estude o cdigo a seguir e tente descobrir o que ele faz. Depois de ter
sua resposta, escreva o cdigo em um arquivo e teste no Python.
from sys import e/it
ef gold_room():
print "This room is full of gold. %ow much do you ta+e&"
ne/t = raw_input("* ")
if "=" in ne/t or "9" in ne/t:
how_much = int(ne/t)
el!e:
dead(">an( learn to type a number.")
if how_much < 50:
print "Nice( you're not greedy( you win!"
e/it(0)
el!e:
dead(")ou greedy bastard!")
ef bear_room():
print "There is a bear here."
print "The bear has a bunch of honey."
print "The fat bear is in front of another door."
print "%ow are you going to move the bear&"
bear_moved = ?alse
while True:
ne/t = raw_input("* ")
if ne/t == "ta+e honey":
dead("The bear loo+s at you then slaps your face off.")
elif ne/t == "taunt bear" "n not bear_moved:
print "The bear has moved from the door. )ou can go through it now."
bear_moved = True
elif ne/t == "taunt bear" "n bear_moved:
dead("The bear gets pissed off and chews your leg off.")
elif ne/t == "open door" "n bear_moved:
gold_room()
el!e:
print "# got no idea what that means."
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
ef cthulhu_room():
print "%ere you see the great evil 0thulhu."
print "%e( it( whatever stares at you and you go insane."
print ",o you flee for your life or eat your head&"
ne/t = raw_input("* ")
if "flee" in ne/t:
start()
elif "head" in ne/t:
dead("-ell that was tasty!")
el!e:
cthulhu_room()
ef dead(why):
print why, "8ood @ob!"
e/it(0)
ef start():
print ")ou are in a dar+ room."
print "There is a door to your right and left."
print "-hich one do you ta+e&"
ne/t = raw_input("* ")
if ne/t == "left":
bear_room()
elif ne/t == "right":
cthulhu_room()
el!e:
dead(")ou stumble around the room until you starve.")
start()
Classes e &!Ketos
Objetos so um encapsulamento de variveis e funes em uma entidade nica.
Objetos recebem suas variveis e funes das classes. Classes so essencialmente um
modelo para se criar objetos.
Uma classe bem bsica se pareceria com o seguinte:
>>>class MyClass:
. . . variable = "blah
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
. . . # method defined
. . . def function(self):
. . . print "This is a message inside the class.
A explicao de porque se tem que incluir aquele "self como um parmetro vai ser
feita l nos Tpicos Avanados (no site). Em primeiro lugar, para instanciar a classe
(modelo) acima para um objeto deve-se fazer o seguinte:
>>>myobjectx = MyClass()
Agora a varivel myo+,ect! instanciou um objeto da classe -yClass que contm a
varivel e a funo definidas dentro da classe chamada -yClass.
Acessando Variveis de &!Ketos
Para acessar a varivel dentro do recm criado objeto -y.+,ect faz-se o seguinte:
>>>myobjectx.variable
Ento instanciando o objeto como anteriormente, na execuo abaixo seria
impressa a string "blah:
>>>print myobjectx.variable
Voc pode criar mltiplos objetos diferentes que so da mesma classe (tm a
mesmas variveis e funes definidas). Entretanto, cada objeto contm cpias
independentes das variveis definidas na classe. Por exemplo, se definirmos outro objeto
com a classe -yClass e ento trocarmos a string na varivel acima:
>>>myobjecty = MyClass()
>>>myobject.variable = "yackity
Ento imprimindo os dois valores tem-se:
>>>print myobjectx.variable # this would print "blah
>>>print myobjecty.variable # this would print "yackity
Acessando Fun9es 5ou %4todos6 de &!Ketos
Para acessar uma funo (mtodo) dentro de um objeto usa-se a notao similar
quela para acessar variveis:
>>>myobjectx.function()
O comando acima iria imprimir a mensagem: "This is a message inside the class.
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
()erc*cios +:
Temos a classe definida para veculos. Crie dois novos veculos chamados car1 e
car2. Defina car1 para ser vermelho, conversvel, valendo $ 60.000 com um nome Fer, e o
car2 como azul, uma Van, chamada Jump que vale $ 10.000.
# define the Vehicle class
class Vehicle:
name = ""
kind = "car"
color = ""
value = 100.00
def description(self):
desc_str = "%s is a %s %s worth $%.2f." % (self.name, self.color, self.kind, self.value)
return desc_str
# your code goes here
# test code
print car1.description()
print car2.description()
,icionrios
Um dicionrio um tipo de dado similar aos vetores, mas opera com chaves e
valores em vez de ndices. Cada valor armazenado em um dicionrio pode ser acessado
usando uma chave, que qualquer tipo de objeto (uma string, um nmero, uma lista, etc.)
em vez de um ndice para endere-lo.
Por exemplo, um banco de dados de nmeros telefnicos poderiam ser
armazenados usando um dicionrio como o seguinte:
>>>phonebook = {}
>>>phonebook["John] = 938477566
>>>phonebook["Jack] = 938377264
>>>phonebook["Jill] = 947662781
Alternativamente, um dicionrio pode ser inicializado com os mesmos valores com
a seguinte notao:
>>>phonebook = {
. . . "John : 938477566,
. . . "Jack : 938377264,
. . . "Jill : 947662781
. . .}
Itera9es so!re ,icionrios
Dicionrios pode ser iterados da mesma forma que listas. Entretanto um dicionrio,
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
ao contrrio de uma lista, no mantm a ordem dos valores armazenada neles. Para iterar
sobre os pares chave e valor, use a seguinte sintaxe:
>>>for name, number in phonebook.iteritems():
. . . print "Phone number of %s is %d % (name, number)
<emovendo um Valor
Para remover um valor de uma chave especificada, use uma das seguintes formas:
>>>del phonebook["John]
ou
>>>phonebook.pop("John)
()erc*cios +L
Adicione "Jack agenda de telefones com o nmero 938273443, e remova o Jill
da agenda.
phonebook = {
"John" : 938477566,
"Jack" : 938377264,
"Jill" : 947662781
}
# write your code here
# testing code
if "Jake" in phonebook:
print "Jake is listed in the phonebook."
if "Jill" not in phonebook:
print "Jill is not listed in the phonebook."
%dulos de Pacotes
Mdulos em Python so simples arquivos com a extenso .py, que implementam
um conjunto de funes. Mdulos so importados de outros mdulos usando o comando
import.
Pesquise a lista completa de mdulos da biblioteca padro do Python em
https://docs.python.org/2/library/.
A primeira vez que um mdulo carregado em um script Python, ele inicializado
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
pela execuo do cdigo no mdulo uma vez. Se outro mdulo em seu cdigo importa o
mesmo mdulo, ele no ser carregado duas vezes mas uma nica assim, variveis
locais dentro de um mdulo atuam como um singleton elas so inicializadas uma nica
vez.
Se quisermos importar o mdulo urlli+, que habilita a leitura de dados de URLs, ns
simplesmente importamos o mdulo:
>>># import the library
>>>import urllib
>>># use it
>>>urllib.urlopen(...)
()plorando %dulos Prontos 5built-in6
Duas funes muito importantes so uma "mo na roda quando se explora
mdulos em Python as funes "dir e a "help. Pode-se procurar quais funes so
implementadas em cada mdulo usando a funo "dir:
>>>import urllib
>>>dir(urllib)
(teste esta funo na console).
Quando se encontra a funo que se quer usar no mdulo, pode-se saber mais
sobre ela com a funo "help, pelo interpretador Python:
>>>help(urllib.urlopen)
(screvendo %dulos
Escrever mdulos Python muito simples. Para criar seu prprio mdulo,
simplesmente crie um novo arquivo .py com o nome do mdulo, e ento importe-o usando
o comando import e especificando o nome do mdulo (sem a extenso .py).
(screvendo Pacotes 5Packages6
Pacotes so namespaces que contm mltiplos pacotes e mdulos. Eles so
simples diretrios, mas com uma alterao.
Cada pacote em Python um diretrio que T(% MU( conter uma arquivo especial
chamado "__init__.py. Este arquivo pode ser vazio, e indica que o diretrio contm um
pacote Python, de tal forma que ele pode ser importado da mesma maneira que um
mdulo importado.
Se criarmos um diretrio chamado "foo, que marca o nome do pacote, ento
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
podemos criar um mdulo dentro daquele pacote chamado "bar. No se pode esquecer
de criar o arquivo "__init__.py dentro do diretrio "foo.
Para usar o mdulo "bar, pode-se importar de duas formas:
>>>import foo.bar
ou
>>> from foo import bar
No primeiro mtodo, deve-se usar o prefixo "foo sempre que se for acessar o
mdulo "bar. No segundo mtodo, no necessrio, porque o mdulo foi importado para
o namespace do mdulo.
O arquivo "__init__.py pode tambm decidir quais mdulos o pacote exporta como
a AP, enquanto mantm outros mdulos internos, pela sobreposio da varivel
"__all__, da seguinte forma:
__init__.py:
__all__ = ["bar]
()erc*cios +D
Neste exerccio, voc ter que imprimir uma lista ordenada alfabeticamente, de
todas as funes existentes no mdulo "re, que contenham a palavra "find.
&!s' no conseguiu???? quer saber como fazer? Procure l no www.learnpython.org!
Soluo:
import re
# Your code goes here
find_members = []
for member in dir(re):
if "find" in member:
find_members.append(member)
print sorted(find_members)
Atividades de fi)ao 5avaliao6
1. Converter valores entre bases numricas.
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
,e
Para
,ec5d6 Bin5!6 &ct5o6 Ne)5B6
,ec5d6 XXXXX
Bin5!6 XXXXX
&ct5o6 XXXXX
Ne)5B6 XXXXX
Fazer um script que pergunte ao usurio quais as bases origem (De) e destino
(Para) ser realizada a converso e qual o valor a ser convertido. mprima o resultado da
converso. Procure escrever o algoritmo de converso em vez de usar funes prontas
do Python.
2. Clculo de rea de figuras geomtricas.
Fazer um script que pergunte ao usurio qual figura geomtrica quer usar, e pea
as dimenses para clculo. mprima o resultado apresentando a figura, os dados
fornecidos e a rea calculada. Possveis figuras: tringulo, retngulo, quadrado, losango,
trapzio, e crculo.
3. Verificador de CPF e CNPJ.
Fazer um script que pergunte qual o cdigo deve ser verificado, descubra se um
CPF ou um CNPJ, calcule os dgitos verificadores e informe se o cdigo fornecido vlido
ou no.
%ais e)emplos de pro0ramas simples'
Disponvel em: https://wiki.python.org/moin/SimplePrograms
1 line: Output
print 'Hello, world!'
2 lines: nput, assignment
name = raw_input('What is your name?\n')
print 'Hi, %s.' % name
3 lines: For loop, built-in enumerate function, new style formatting
friends = ['john', 'pat', 'gary', 'michael']
for i, name in enumerate(friends):
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
print "iteration {iteration} is {name}".format(iteration=i, name=name)
4 lines: Fibonacci, tuple assignment
parents, babies = (1, 1)
while babies < 100:
print 'This generation has {0} babies'.format(babies)
parents, babies = (babies, parents + babies)
5 lines: Functions
def greet(name):
print 'Hello', name
greet('Jack')
greet('Jill')
greet('Bob')
6 lines: mport, regular expressions
import re
for test_string in ['555-1212', 'ILL-EGAL']:
if re.match(r'^\d{3}-\d{4}$', test_string):
print test_string, 'is a valid US local phone number'
else:
print test_string, 'rejected'
7 lines: Dictionaries, generator expressions
prices = {'apple': 0.40, 'banana': 0.50}
my_purchase = {
'apple': 1,
'banana': 6}
grocery_bill = sum(prices[fruit] * my_purchase[fruit]
for fruit in my_purchase)
print 'I owe the grocer $%.2f' % grocery_bill
8 lines: Command line arguments, exception handling
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
# This program adds up integers in the command line
import sys
try:
total = sum(int(arg) for arg in sys.argv[1:])
print 'sum =', total
except ValueError:
print 'Please supply integer arguments'
9 lines: Opening files
# indent your Python code to put into an email
import glob
# glob supports Unix style pathname extensions
python_files = glob.glob('*.py')
for file_name in sorted(python_files):
print ' ------' + file_name
with open(file_name) as f:
for line in f:
print ' ' + line.rstrip()
print
10 lines: Time, conditionals, from..import, for..else
from time import localtime
activities = {8: 'Sleeping',
9: 'Commuting',
17: 'Working',
18: 'Commuting',
20: 'Eating',
22: 'Resting' }
time_now = localtime()
hour = time_now.tm_hour
for activity_time in sorted(activities.keys()):
if hour < activity_time:
print activities[activity_time]
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
break
else:
print 'Unknown, AFK or sleeping!'
11 lines: Triple-quoted strings, while loop
REFRAIN = '''
%d bottles of beer on the wall,
%d bottles of beer,
take one down, pass it around,
%d bottles of beer on the wall!
'''
bottles_of_beer = 99
while bottles_of_beer > 1:
print REFRAIN % (bottles_of_beer, bottles_of_beer,
bottles_of_beer - 1)
bottles_of_beer -= 1
12 lines: Classes
class BankAccount(object):
def __init__(self, initial_balance=0):
self.balance = initial_balance
def deposit(self, amount):
self.balance += amount
def withdraw(self, amount):
self.balance -= amount
def overdrawn(self):
return self.balance < 0
my_account = BankAccount(15)
my_account.withdraw(5)
print my_account.balance
13 lines: Unit testing with unittest
import unittest
def median(pool):
copy = sorted(pool)
size = len(copy)
if size % 2 == 1:
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
return copy[(size - 1) / 2]
else:
return (copy[size/2 - 1] + copy[size/2]) / 2
class TestMedian(unittest.TestCase):
def testMedian(self):
self.failUnlessEqual(median([2, 9, 9, 7, 9, 2, 4, 5, 8]), 7)
if __name__ == '__main__':
unittest.main()
14 lines: Doctest-based testing
def median(pool):
'''Statistical median to demonstrate doctest.
>>> median([2, 9, 9, 7, 9, 2, 4, 5, 8])
7
'''
copy = sorted(pool)
size = len(copy)
if size % 2 == 1:
return copy[(size - 1) / 2]
else:
return (copy[size/2 - 1] + copy[size/2]) / 2
if __name__ == '__main__':
import doctest
doctest.testmod()
15 lines: itertools
from itertools import groupby
lines = '''
This is the
first paragraph.
This is the second.
'''.splitlines()
# Use itertools.groupby and bool to return groups of
# consecutive lines that either have content or don't.
for has_chars, frags in groupby(lines, bool):
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
if has_chars:
print ' '.join(frags)
# PRINTS:
# This is the first paragraph.
# This is the second.
16 lines: csv module, tuple unpacking, cmp() built-in
import csv
# write stocks data as comma-separated values
writer = csv.writer(open('stocks.csv', 'wb', buffering=0))
writer.writerows([
('GOOG', 'Google, Inc.', 505.24, 0.47, 0.09),
('YHOO', 'Yahoo! Inc.', 27.38, 0.33, 1.22),
('CNET', 'CNET Networks, Inc.', 8.62, -0.13, -1.49)
])
# read stocks data, print status messages
stocks = csv.reader(open('stocks.csv', 'rb'))
status_labels = {-1: 'down', 0: 'unchanged', 1: 'up'}
for ticker, name, price, change, pct in stocks:
status = status_labels[cmp(float(change), 0.0)]
print '%s is %s (%s%%)' % (name, status, pct)
18 lines: 8-Queens Problem (recursion)
BOARD_SIZE = 8
def under_attack(col, queens):
left = right = col
for r, c in reversed(queens):
left, right = left - 1, right + 1
if c in (left, col, right):
return True
return False
def solve(n):
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
if n == 0:
return [[]]
smaller_solutions = solve(n - 1)
return [solution+[(n,i+1)]
for i in xrange(BOARD_SIZE)
for solution in smaller_solutions
if not under_attack(i+1, solution)]
for answer in solve(BOARD_SIZE):
print answer
20 lines: Prime numbers sieve w/fancy generators
import itertools
def iter_primes():
# an iterator of all numbers between 2 and +infinity
numbers = itertools.count(2)
# generate primes forever
while True:
# get the first number from the iterator (always a prime)
prime = numbers.next()
yield prime
# this code iteratively builds up a chain of
# filters...slightly tricky, but ponder it a bit
numbers = itertools.ifilter(prime.__rmod__, numbers)
for p in iter_primes():
if p > 1000:
break
print p
21 lines: XML/HTML parsing (using Python 2.5 or third-party library)
dinner_recipe = '''<html><body><table>
<tr><th>amt</th><th>unit</th><th>item</th></tr>
<tr><td>24</td><td>slices</td><td>baguette</td></tr>
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
<tr><td>2+</td><td>tbsp</td><td>olive oil</td></tr>
<tr><td>1</td><td>cup</td><td>tomatoes</td></tr>
<tr><td>1</td><td>jar</td><td>pesto</td></tr>
</table></body></html>'''
# In Python 2.5 or from http://effbot.org/zone/element-index.htm
import xml.etree.ElementTree as etree
tree = etree.fromstring(dinner_recipe)
# For invalid HTML use http://effbot.org/zone/element-soup.htm
# import ElementSoup, StringIO
# tree = ElementSoup.parse(StringIO.StringIO(dinner_recipe))
pantry = set(['olive oil', 'pesto'])
for ingredient in tree.getiterator('tr'):
amt, unit, item = ingredient
if item.tag == "td" and item.text not in pantry:
print "%s: %s %s" % (item.text, amt.text, unit.text)
28 lines: 8-Queens Problem (define your own exceptions)
BOARD_SIZE = 8
class BailOut(Exception):
pass
def validate(queens):
left = right = col = queens[-1]
for r in reversed(queens[:-1]):
left, right = left-1, right+1
if r in (left, col, right):
raise BailOut
def add_queen(queens):
for i in range(BOARD_SIZE):
test_queens = queens + [i]
try:
validate(test_queens)
if len(test_queens) == BOARD_SIZE:
return test_queens
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
else:
return add_queen(test_queens)
except BailOut:
pass
raise BailOut
queens = add_queen([])
print queens
print "\n".join(". "*q + "Q " + ". "*(BOARD_SIZE-q-1) for q in queens)
33 lines: "Guess the Number" Game (edited) from http://inventwithpython.com
import random
guesses_made = 0
name = raw_input('Hello! What is your name?\n')
number = random.randint(1, 20)
print 'Well, {0}, I am thinking of a number between 1 and
20.'.format(name)
while guesses_made < 6:
guess = int(raw_input('Take a guess: '))
guesses_made += 1
if guess < number:
print 'Your guess is too low.'
if guess > number:
print 'Your guess is too high.'
if guess == number:
break
if guess == number:
print 'Good job, {0}! You guessed my number in {1}
guesses!'.format(name, guesses_made)
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
else:
print 'Nope. The number I was thinking of was {0}'.format(number)
&utros sites so!re PJtBon Gue valem visita e estudo'
http://www.diveintopython.net/
http://www.pythonchallenge.com/index.php
http://www.lightbird.net/py-by-example/index.html
Tutoriais Avanados
. Geradores (Generators)
. nterpretao de Listas (List Comprehensions)
. Funes de Mltiplos Argumentos (Multiple Function Arguments)
. Expresses Regulares (Regular Expressions)
. Gerenciando Excesses (Exception Handling)
. Conjuntos (Sets)
. Serializao (Serialization)
. Funes Parciais (Partial functions)
. ntrospeco de Cdigo (Code ntrospection)
. Decoradores (Decorators)
Oeradores 5Generators6
Geradores so muito fceis de implementar, mas um tanto quanto difceis de se
entender.
Geradores so usados para criar iteradores (iterators), mas com uma abordagem
diferente. Geradores so funes simples que retornam um conjunto de itens iterativos,
um de cada vez, de uma forma especial.
Quando uma iterao sobre um conjunto de itens iniciada usando o comando
"for, o gerador executado. Quando o cdigo da funo do gerador encontra o comando
"yield, o gerador entrega sua execuo de volta para o lao "for, retornando um novo
valor do conjunto. A funo gerador pode gerar tantos valores (possivelmente infinitos)
quantos quiser, entregando cada um deles na sua vez.
Veja um exmplo simples de uma funo geradora que retorna 7 nmeros inteiros
randmicos:
>>>import random
>>>def lotery():
. . . # returns 6 numbers between 1 and 40
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
. . . for i in xrange(6):
. . . yield random.randint(1, 40)
. . . # returns a 7th number between 1 and 15
. . . yield random.randint(1,15)
>>>for random_number in lottery():
. . . print "And the next number is... %d! % random_number
Esta funo decide como gerar os nmeros aleatrios por si mesma, e executa os
comandos "yield um a cada vez, pausando entre a execuo do "yield e a volta ao lao
"for principal.
()ercicios +P
Escreva uma funo geradora que retorne a srie de Fibonacci. Os valores so
calculados usando a seguinte frmula: os primeiros dois nmeros da srie so sempre
iguais a 1, e cada nmero consecutivo retornado a soma dos dois ltimos nmeros.
Dica: voc pode usar s duas variveis na funo geradora? Lembre-se que atribuies
podem ser feitas simultaneamente. Este cdigo
>>>a = 1
>>>b = 2
>>>a, b = b, a
trocar os valores de a e b simultaneamente!
Continue o exerccio a partir do cdigo seguinte:
# fill in this function
def fib():
pass #this is a null statement which does nothing when executed, useful as a placeholder.
# testing code
import types
if type(fib()) == types.GeneratorType:
print "Good, The fib function is a generator."
counter = 0
for n in fib():
print n
counter += 1
if counter == 10:
break
Soluo:
# fill in this function
def fib():
a, b = 1, 1
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados
while 1:
yield a
a, b = b, a + b
# testing code
import types
if type(fib()) == types.GeneratorType:
print "Good, The fib function is a generator."
counter = 0
for n in fib():
print n
counter += 1
if counter == 10:
break
Prof. Ms. Carlos E F ROLAND (roland@facef.br)
2014
Centro Universitrio de Franca UNI-Facef
Engenharia Civil ntroduo Programao e Uso de Bancos de Dados

Você também pode gostar