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