livro modulo basico python

59
Python Programando em Python Módulo Básico ANTONIO SÉRGIO NOGUEIRA PRESIDENTE PRUDENTE – SP 2009 1

Upload: gabriel-ferreira

Post on 14-Nov-2015

79 views

Category:

Documents


32 download

DESCRIPTION

Modulo iniciante para aprender python.

TRANSCRIPT

  • Python

    Programando em Python Mdulo Bsico

    ANTONIO SRGIO NOGUEIRA

    PRESIDENTE PRUDENTE SP2009

    1

  • Python

    Sumrio

    Introduo.....................................................................................................03Cap. 1. - O interpretador Python: uso, histria e licena.............................04Cap. 2. - A linguagem Python: Introduo, tipos e comandos bsicos........08Cap. 3. - Controle de Fluxo e Estruturas de Dados em Python...................24Cap. 4. - Funes, Recurso, Exceo, Arquivos e Mdulos......................33Cap. 5. - Biblioteca Padro..........................................................................55

    2

  • Python

    Introduo

    Este texto no tem a pretenso de ser uma bblia da linguagem Python, mas ele aborda a linguagem em sua extenso, mostrando os aspectos mais peculiares como:

    os tipos de alto-nvel que permitem operaes complexas em um nico comando (statement);

    a definio de bloco por identao ao invs de marcadores de incio e fim de bloco; a desnecessria declarao de variveis ou parmetros formais;

    Lanada por Guido van Rossum em 1991, python atualmente possui um modelo de desenvolvimento comunitrio e aberto, gerenciado pela organizao sem fins lucrativos Python Software Foundation. Python simples de usar, e uma verdadeira linguagem de programao que oferece tipos nativos de alto nvel como flexveis arrays e dicionrios. Por ser uma linguagem interpretada de alto nvel, orientada a objetos e de tipagem dinmica e forte, Python muito mais fcil de usar do que as linguagens compiladas e o interpretador pode ser usado interativamente, o que torna fcil experimentar diversas caractersticas da linguagem, escrever e testar programas e funes em um desenvolvimento bottom-up.

    O nome da linguagem no tem nada a ver com os famosos rpteis e sim com o famoso show da BBC Monty Pythons Flying Circus . Mas neste exato momento se voc ainda no se conveceu com a linguagem Python, saiba que a Nasa e a Industrial Light & Magic, a companhia de efeito visual que criou Star Wars, usa Python. Agora que voc j se convenceu, que tal continuar a examinar o texto com maior detalhe e testar o interpretador Python com os exemplos mostrados no texto.

    O Python e sua extensa biblioteca padro esto disponveis na forma de cdigo fonte ou binrio para a maioria das plataformas a partir do site, http://www.python.org/, e deve ser distribudos livremente. No mesmo stio esto disponveis distribuies e referncias para diversos mdulos, programas, ferramentas e documentao adicional contribudos por terceiros. Acesse as documentaes atravs do links: Python Library Reference , Python Reference Manual , Extending and Embedding the Python Interpreter , Python/C API Reference , Python Library Reference.

    3

  • Python

    Captulo 1. O interpretador Python

    1.1 Sua histria No final de 1989 Guido van Rossum criou o Python no Instituto de Pesquisa nacional para Matemtica e Cincia da Computao (CWI), nos Pases Baixos, um sucessor da linguagem chamada de ABC. Tendo como foco principal o aumento de produtividade do programador, em 1991, Guido publicou o cdigo ( verso 0.9.0) no grupo de discusso alt.sources. Em 1994 formou-se o principal frum de discusso do Python, comp.lang.python, isto foi o marco para o crescimento de usurios da linguagem. A verso 1.0 foi lanada em janeiro de 1994. Alm das funcionalidades que j estavam presentes como classes com herana, tratamento de excees, funes e os tipos de dado nativos list, dict, str, sistema de mdulos e assim por diante, esta nova verso inclua ferramentas para programao funcional como lambda, map, filter e reduce. A ltima verso que Guido lanou enquanto estava na CWI foi o Python 1.2. Guido continuou o trabalho, em 1995, no CNRI em Reston, USA, de onde lanou diversas verses. Na verso 1.4 a linguagem ganhou parmetros nomeados (a capacidade de passar parmetro pelo nome e no pela posio na lista de parmetros) e suporte nativo a nmeros complexos, assim como uma forma de encapsulamento, a ltima verso lanada no CNRI foi a verso 1.6.A partir de 2000, o de desenvolvimento da linguagem se mudou para a BeOpen afim de formar o time PythonLabs. O nico lanamento na BeOpen foi o Python 2.0, e aps o lanamento o grupo de desenvolvedores da PythonLabs agrupou-se na Digital Creations. O Python 2.0 implementou list comprehension, uma relevante funcionalidade de linguagens funcionais como SETL e Haskell, e essa verso 2.0 tambm introduziu um sistema coletor de lixo capaz de identificar e tratar ciclos de referncias. A verso 1.61 idntica a anterior a no pela licena que agora era compatvel com a GPL. Na verso 2.1 a licena foi renomeada para Python Foundation License, em 2001. O lanamento incluiu a mudana na especificao para suportar escopo aninhado, assim como outras linguagens com escopo esttico.Uma grande inovao da verso 2.2 foi a unificao dos tipos Python (escritos em C) e classes (escritas em Python) em somente uma hierarquia, com isto o modelo de objetos do Python torna-se consistentemente orientado a objeto e foi adicionado generator, inspirado em Icon. O incremento da biblioteca padro e as escolhas sintticas foram fortemente influenciadas por Java em alguns casos: o pacote logging introduzido na verso 2.3, o analisador sinttico SAX, introduzido na verso 2.0 e a sintaxe de decoradores que usa @, adicionadas na verso 2.4. Em 1 de outubro de 2008 foi lanada a verso 2.6, j visando a transio para a verso 3.0 da linguagem. Entre outras modificaes, foram includas bibliotecas para multiprocessamento, JSON e E/S, alm de uma nova forma de formatao de cadeias de caracteres.Atualmente a linguagem usada em diversas reas, como servidores de aplicao e computao grfica. Est disponvel como linguagem script em aplicaes como OpenOffice (Python UNO Bridge) e pode ser utilizada em procedimentos armazenados no sistema gerenciador de banco de dados PostgreSQL (PL/Python). [WIKIPEDIA 27/11/200]. Existem diversas implementaes do PYTON so elas:Cpython esta a verso original escrita em C.ActivePython - um padro industrial do Python, disponvel para Windows, Linux, Mac OS X, Solaris, AIX e HP-UX.

    4

  • Python

    Jython esta a verso escrita em Java e pode ser usada em implementaes que usam a biblioteca de classes Java. Veja o Website do Jython.Python for .NET usa a implementao Cpython, mas gerenciada por uma aplicao .NET e disponibiliza as bibliotecas .NET. Veja Python for .NETIronPython Diferente do Python .Net , ela uma implementao completa de Python que gera a Linguagem Intermediria, e compila o cdigo Python diretamente para o assembler .NET.PyPy - Uma implementao do python escrita em Python, at o interpretador de bytecode escrito em Python. Ela executada usando o Cpython como um interpretador subjacente. Um dos objetivos do projeto incentivar a experimentao com a linguagem prpria, tornando-a mais fcil de modificar o interpretador (uma vez que escrito em Python). Informao adicional est disponvel na pgina inicial do projeto PyPy .

    1.2 Licena Todos os direitos de propriedade intelectual adicionados deste ponto em diante, comeando com Python 2.1 e suas verses alfa e beta, so de titularidade da Python Software Foundation (PSF), uma associao sem fins lucrativos organizada sob inspirao da Apache Software Foundation (ASF). Veja http://www.python.org/psf/ para mais informaes sobre PSF.

    TERMOS E CONDIES PARA ACESSAR OU DE OUTRA FORMA UTILIZAR PYTHON

    =======================================================================

    CONTRATO DE LICENA PSF

    =======================================================================

    1. Este CONTRATO DE LICENA realiza-se entre Python Software Foundation (PSF) e o Indivduo ou Organizao (Licenciado) acessando ou de outra forma utilizando o programa de computador Python 2.1.1 em forma binria ou cdigo-fonte e sua documentao associada. 2. Nos termos e condies deste Contrato de Licena, PSF outorga ao Licenciado, por este instrumento, uma Licena no-exclusiva, sem encargos patrimoniais (royalties), de abrangncia mundial para reproduzir, analisar, testar, executar ou expor publicamente, preparar obras derivadas, distribuir e de outra forma utilizar Python 2.1.1, isolado ou em qualquer verso derivada, contanto que, porm, este Contrato de Licena PSF e o aviso de direitos autorais PSF, i.e., Copyright 2001 Python Software Foundation, All Rights Reserved sejam includos em Python 2.1.1, isolado ou em qualquer verso derivada preparada pelo Licenciado. 3. Caso o Licenciado prepare uma obra derivada baseada em Python 2.1.1 ou que o incorpore por inteiro ou qualquer trecho seu, e deseje tonar esta obra derivada disponvel a outrem como aqui previsto, ento o Licenciado concorda em incluir em tal obra um breve sumrio das mudanas feitas sobre Python 2.1.1. 4. PSF torna Python 2.1.1 disponvel ao Licenciado COMO EST. PSF NO OFERECE QUAISQUER GARANTIAS OU DECLARAES, EXPRESSAS

    5

  • Python

    OU TCITAS. COMO EXEMPLO, MAS NO LIMITAO, PSF NO OFERECE E SE ISENTA DE QUAISQUER GARANTIAS OU DECLARAES DE COMERCIABILIDADE OU ADEQUAO A FINALIDADES ESPECFICAS, OU DE QUE O USO DE PYTHON 2.1.1 NO VIOLAR QUAISQUER DIREITOS DE TERCEIROS. 5. PSF NO SER RESPONSVEL PERANTE O LICENCIADO OU QUAISQUER OUTROS USURIOS DE PYTHON 2.1.1 POR PERDAS E DANOS, SEJAM INCIDENTAIS, ESPECIAIS OU CONSEQENTES, COMO RESULTADO DE MODIFICAO, DISTRIBUIO, O OUTRA FORMA DE UTILIZAO DE PYTHON 2.1.1, OU QUALQUER DE SUAS OBRAS DERIVADAS, MESMO QUE HOUVESSE SIDO AVISADA DESTA POSSIBILIDADE. 6. Este Contrato de Licena ser automaticamente rescindido em caso de violao material de seus termos e condies. 7. Nada neste Contrato de Licena pode ser interpretado de forma a criar qualquer relao de agncia, parceria ou joint venture entre PSF e o Licenciado. Este Contrato de Licena no outorga permisso para usar marcas ou nomes comerciais de PSF como conjunto distintivo para endossar ou promover produtos ou servios do Licenciado ou de qualquer terceiro. 8. Ao copiar, instalar ou de outra forma utilizar Python 2.1.1, o Licenciado obriga-se aos termos e condies deste Contrato de Licena.

    1.3 Uso do Interpretador Python

    1.3.1 Qual Python usar?O Windows no vem com Python. Mas no se preocupe! H diversas formas fceis

    de entrar no mundo Python usando Windows. Como voc pode ver, Python roda em muitos sistemas operacionais. A lista completa inclui Windows, o Mac OS, o Mac OS X e todos os vrios sistemas gratuitos compatvel com UNIX como o prprio Linux. H tambm verses que rodam no Sun Solaris, AS/400, Amiga, OS/2, BeOS e muitas outras plataformas que voc provavelmente nunca ouviu falar.

    1.3.2 Python em WindowsNo Windows, voc tem diversas escolhas para instalar o Python. A ActiveState tem

    um instalador Python para Windows que inclui a verso completa do Python, um IDE com um editor de cdigo e extenses Windows para o Python que permitem acesso a servios especficos do Windows, suas APIs e o registro.O ActivePython pode ser baixado gratuitamente, mas no open source. Se voc realmente precisa da ltima verso do Python pule para a opo 2.A segunda opo usar o instalador Python oficial, distribudo pelos prprios desenvolvedores doPython. Esse instalador pode ser baixado gratuitamente, tem cdigo fonte aberto e est sempre atualizado.

    1.3.2.1 Opo 1: Instalando o ActivePython1. Baixe o ActivePython em http://www.activestate.com/Products/ActivePython/.2. Se voc usa Windows 95, Windows 98 ou Windows ME, deve instalar o Windows Installer 2.0

    6

  • Python

    antes de continuar.3. D um clique duplo no arquivo ActivePython-2.6.1.1-win32-ix86.msi.4. Siga as instrues na tela.5. Se seu espao em disco for limitado, possvel fazer uma instalao personalizada ("custom") edeixar de instalar a documentao, mas isso no recomendado.6. Aps o trmino da instalao, feche o instalador e abra Iniciar->Programas->ActiveStateActivePython 2.2->PythonWin IDE.

    Example IDE ActivePythonPythonWin 2.2.2 (#37, Nov 26 2002, 10:24:37) [MSC 32 bit (Intel)] on win32.Portions Copyright 1994-2001 Mark Hammond ([email protected]) -see 'Help/About PythonWin' for further copyright information.>>>

    1.3.2.2 Opo 2: Instalando o Python do Python.org1. Baixe o instalador Windows do Python em http://www.python.org/download/releases/2.5.4/2. Execute o arquivo Python-2.5.43. Siga as instrues na tela.4. Aps o trmino da instalao, feche o instalador e abra Iniciar->Programas->Python 2.5->IDLE(Python GUI).

    Example IDLE (GUI Python)Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on win32

    Type "copyright", "credits" or "license()" for more information.****************************************************************Personal firewall software may warn about the connection IDLEmakes to its subprocess using this computer's internal loopbackinterface. This connection is not visible on any externalinterface and no data is sent to or received from the Internet.****************************************************************IDLE 1.2.4>>>

    7

  • Python

    Capitulo 2. A linguagem Python: Introduo, tipos e comandos bsicos

    2.1 Interpretador: Python uma linguagem interpretada, o que significa que o cdigo no precisa ser compilado para que seja executado. Assim, o interpretador l e executa o cdigo diretamente. Linguagens interpretadas, normalmente, funcionam atravs de 'Compilao Just- In-Time' ou 'Interpretao pura ou em Bytecode'. Voc pode criar seu arquivo Python e salv-lo com a extenso .py ou ainda pode executar no modo shell, ou seja, voc digita o cdigo diretamente no interpretador. Python multi plataforma, roda em Windows, Linux, Unix, Macintosh, etc. Pode ser utilizado um ambiente para edio e execuo como o IDLE, que nativo da linguagem e para acess-lo em windows basta ir em INICIAR>PROGRAMAS>PYTHON 2.5>IDLE. Em computadores com Windows, Python instalado geralmente em C:\Python25, apesar de voc poder mudar isso enquanto est executando o instalador. Para adicionar esse diretrio ao path, voc pode digitar o seguinte comando no DOS: set path=%path%;C:\python25

    2.1.2 Palavras Reservadas: So palavras que no podem ser usadas para dar nomes aos objetos. So: and, assert, break, class, continue, del, def, elif, else, except, exec, finally, for, from, global, if, import, in, is, lambda, not, or, pass, print, raise, return, try, while.

    2.2 Digitando comandos no IDLEPodemos usar o IDLE como uma calculadora, visualizando resultados e usando os resultados em clculos futuros.

    >>> a=1>>> b=2>>> a+b>>> a/b>>> a*b

    2.3 Tipos de DadosSo categorias de valores que so processados de forma semelhante. Por exemplo, nmeros inteiros so processados de forma diferente dos nmeros de ponto flutuante(decimais) e dos nmeros complexos.Tipos primitivos: so aqueles j embutidos no ncleo da linguagemSimples: nmeros (int, long, float, complex) e cadeias de caracteres (strings)

    Int: nmeros inteiros de preciso fixa1 , 2 , 15 , 19 Long: nmeros inteiros de preciso arbitrria1L , 10000L , -9999999LFloats: nmeros racionais de preciso varivel1.0 , 10.5 , -19000.00005 , 15e-5Complex: nmeros complexos1+1j , 20j , 1000+100J

    Compostos: listas, dicionrios, tuplas e conjuntosTipos definidos pelo usurio: so correspondentes a classes (orientao objeto)

    8

  • Python

    2.4 Nmeros ponto-flutuante e complexoH total suporte para ponto-flutuante; operadores com operandos de diferentes tipos convertem o inteiro para ponto-flutuante:>>> 3 * 3.75 / 1.57.5>>> 7.0 / 23.5

    Nmeros complexos tambm so suportados; nmeros imaginrios so escritos com o sufixo j ou J. Nmeros complexos com parte real no nula so escritos como (real+imagj), ou podem ser criados pela chamada defuno complex(real, imag).

    >>> 1j * 1J(-1+0j)>>> 1j * complex(0,1)(-1+0j)>>> 3+1j*3(3+3j)>>> (3+1j)*3(9+3j)>>> (1+2j)/(1+1j)(1.5+0.5j)Nmeros complexos so sempre representados por dois nmeros ponto-flutuante, a parte real e a parte imaginria. Para extrair as partes de um nmero z, utilize z.real e z.imag.

    >>> a=1.5+0.5j>>> a.real1.5>>> a.imag0.5

    As funes de converso para ponto-flutuante e inteiro (float(), int() e long()) no funcionam para nmeros complexosno existe maneira correta de converter um nmero complexo para um nmero real. Utilize abs(z) para obter sua magnitude (como ponto-flutuante) ou z.real para obter sua parte real.

    >>> a=3.0+4.0j>>> float(a)Traceback (most recent call last):File "", line 1, in ?TypeError: cant convert complex to float; use abs(z)>>> a.real3.0>>> a.imag4.0>>> abs(a)

    9

  • Python

    5.0

    No modo interativo, a ltima expresso a ser impressa atribuda a varivel _. Isso significa que ao utilizar Python como uma calculadora, muitas vezes mais fcil prosseguir com os clculos da seguinte forma:>>> tax = 12.5 / 100>>> price = 100.50>>> price * tax12.5625>>> price + _113.0625>>> round(_, 2)113.06

    Essa varivel especial deve ser tratada somente para leitura pelo usurio. Nunca lhe atribua explicitamente um valor do contrrio, estaria criando uma outra varivel (homnima) independente, que mascararia o comportamento mgico da varivel especial.

    2.5 StringsAlm de nmeros, Python tambm pode manipular strings(Strings so seqncias de caracteres entre aspas ou apstrofo que no podem ser modificadas, a menos que voc reatribua).So nomes dados a reas de memria:Nomes podem ser compostos de algarismos,letras ou _O primeiro caractere no pode ser um algarismoPalavras reservadas (if, while, etc) so proibidasServem para: Guardar valores intermedirios, Construir estruturas de dadosUma varivel modificada usando o comando de atribuio:Var = expresso possvel tambm atribuir a vrias variveis simultaneamente:var1,var2,...,varN = expr1,expr2,...,exprN

    >>> mais menosmais menos

    >>> doesn\t"doesnt"

    >>> "doesnt""doesnt"

    >>> "Yes," he said."Yes," he said.

    >>> "\"Yes,\" he said.""Yes," he said.

    >>> "Isn\t," she said."Isn\t," she said.

    10

  • Python

    Strings que contm mais de uma linha podem ser construdas de diversas maneiras. Terminadores de linha podem ser embutidos na string com barras invertidas, ex.:

    oi = "Esta eh uma string longa contendo\n\diversas linhas de texto assim como voce faria em C.\n\Observe que os espaos em branco no inicio da linha so \significativos."print oi

    Observe que terminadores de linha ainda precisam ser embutidos na string usando \n; a quebra de linha aps a ltima barra de escape seria ignorada. No entanto, se a tornarmos uma string crua (raw), as sequncias de \n no so convertidas para quebras de linha. Tanto a barra invertida quanto a quebra de linha no cdigo-fonte so includos na string como dados. Portanto, o exemplo:

    oi = r"Esta eh uma string longa contendo\n\diversas linhas de texto assim como voce faria em C.\n\ Observe que os espaos em branco no inicio da linha so \significativos."print oi

    teria como resultado:

    Esta eh uma string longa contendo\n\diversas linhas de texto assim como voce faria em C.\n\ Observe que os espaos em branco no inicio da linha so \significativos.

    No entanto, se a tornarmos uma string crua (raw), as sequncias de \n no so convertidas para quebras de linha. Tanto a barra invertida quanto a quebra de linha no cdigo-fonte so includos na string como dados. Portanto, o exemplo:

    oi = r"Esta eh uma string longa contendo\n\diversas linhas de texto assim como voce faria em C.\n\Observe que os espaos em branco no inicio da linha so \significativos."print oi

    teria como resultado:

    Esta eh uma string longa contendo\n\diversas linhas de texto assim como voce faria em C.\n\Observe que os espaos em branco no inicio da linha so \significativos

    Ou, strings podem ser delimitadas por pares de aspas trplices: " ou . Neste caso

    11

  • Python

    no necessrio embutir terminadores de linha, pois o texto da string ser tratado fielmente como o original.

    print """Usage: thingy [OPTIONS]-h Display this usage message-H hostname Hostname to connect to"""produz a seguinte sada:

    Usage: thingy [OPTIONS]-h Display this usage message-H hostname Hostname to connect to

    O interpretador imprime o resultado de operaes sobre strings da mesma forma que as strings so formatadas na digitao: dentro de aspas, e com caracteres especiais embutidos em escape sequences, para mostra seu valor com preciso. A string ser delimitada por aspas duplas se ela contm um nico caracter de aspas simples e nenhum de aspas duplas, caso contrrio a string ser delimitada por aspas simples ( O comando print, descrito posteriormente, pode ser utilizado para escrever strings sem aspas ou escape sequences.). Strings podem ser concatenadas (coladas) com o operador +, e repetidas com *:

    >>> word = Help + A>>> wordHelpA>>> >>> word ='help' 'oi' # Duas strings literais justapostas so automaticamente concatenadas.>>> wordhelpoi'

    Strings podem ser indexadas; como em C, o primeiro ndice da string o 0. No existe um tipo separado para caracteres; um caracter simplesmente uma string unitria. Assim como na linguagem Icon, substrings podem ser especificadas atravs da notao slice (N.d.T: fatiar): dois ndices separados por dois pontos.

    >>> word[4]o>>> word[0:2]he>>> word[2:4]lp

    ndices de fatias (slice) seguem uma padronizao til; a omisso do primeiro ndice equivale a zero, a omisso do segundo ndice equivale ao tamanho da string que est sendo fatiada.

    12

  • Python

    >>> word[:2] # Os dois primeiros caractereshe>>> word[2:] # Tudo exceto os dois primeiros caractereslpoi>>> x + word[1:]xelpA>>> Splat + word[4]SplatA

    >>> word[-1] # O tlimo caracteri>>> word[-2] # O penltimo caractero>>> word[-2:] # Os dois ltimos caracteresoi>>> word[:-2] # Tudo exceto os dois ltimos caractereshelp

    >>>word[-1::-1] #mostra os caracteres de trs para frente'AtalpS'

    >>>word[0:6:2] #mostra os caracteres incrementando 2'Slt'

    Os principais mtodos das strings so:

    capitalize - transforma o primeiro caracter em maisculacount - conta o nmero de ocorrncias da substringupper - transforma string em maiscula

    >>> a="sergio">>> a.capitalize()'Sergio'>>> a.count('e')1>>> a.upper()'SERGIO'

    2.6 Strings UnicodeA partir de Python 2.0 um novo tipo foi introduzido: o objeto Unicode. Ele pode ser

    usado para armazenar e manipular dados Unicode (veja http://www.unicode.org/) e se integra bem aos demais objetos strings pr-existentes, de forma a realizar auto-converses quando necessrio. Unicode tem a vantagem de prover um nico nmero ordinal para cada caracter usado em textos modernos ou antigos. Criar strings Unicode em Python to simples quanto criar strings normais:

    13

  • Python

    >>> uHello World !uHello World !

    O pequeno u antes das aspas indica a criao de uma string Unicode . Se voc desejar incluir caracteres especiais na string, voc pode faz-lo atravs da codificao Python Unicode-Escape.

    >>> uHello\u0020World !uHello World !

    O cdigo de escape \u0020 indica a insero do caracter Unicode com valor ordinal 0x0020 (o espao em branco) na posio determinada. Alm dessas codificaes padro, Python oferece um outro conjunto de maneiras de se criar strings Unicode sobre uma codificao padro.

    A funo interna unicode() prov acesso a todos os Unicode codecs registrados (COders and DECoders). Alguns dos mais conhecidos codecs so : Latin-1, ASCII, UTF-8, and UTF-16. Os dois ltimos so codificaes de tamanho varivel para armazenar cada caracter Unicode em um ou mais bytes. A codificao default ASCII, que trata normalmente caracteres no intervalo de 0 a 127 mas rejeita qualquer outro com um erro. Quando uma string Unicode impressa, escrita em arquivo ou convertida por str(), a codificao padro utilizada.

    >>> u"abc"uabc>>> str(u"abc")abc>>> u""u\xe4\xf6\xfc>>> str(u"")

    Traceback (most recent call last):File "", line 1, in ?UnicodeEncodeError: ascii codec cant encode characters in position0-2: ordinal not in range(128)

    Para se converter uma string Unicode em uma string 8-bits usando uma codificao especfica, basta invocar omtodo encode() de objetos Unicode passando como parmetro o nome da codificao destino. prefervel utilizar nomes de codificao em letras minsculas.

    >>> u"".encode(utf-8)\xc3\xa4\xc3\xb6\xc3\xbc

    Tambm pode ser utilizada a funo unicode() para efetuar a converso de um string em outra codificao. Neste caso, o primeiro parmetro a string a ser convertida e o segundo o nome da codificao almejada. O valor de retorno da funo a string na nova codificao.

    14

  • Python

    >>> unicode(\xc3\xa4\xc3\xb6\xc3\xbc, utf-8)u\xe4\xf6\xfc

    2.7 ListasA mais verstil estrutura de dados do Python a lista (list), que pode ser escrita

    como uma lista de valores separados por vrgula e entre colchetes. Mais importante, os valores contidos na lista no precisam ser do mesmo tipo e podem ter seus elementos modificados.

    >>> lista = [1,"um",1.0]>>> lista.insert(3,"hum")>>> print lista[1, 'um', 1.0, 'hum']

    Uma varivel chamada lista retorna uma lista com um valor inteiro, uma string e uma valor float. Em seguida, foi inserida no final da lista ( o nmero '3' indica a posio trs comeando do zero) uma outra string. Listas possuem alguns mtodos:

    append() - adiciona um elemento ao fim da lista.count() - retorna o nmero de vezes que um determinado elemento aparece na lista.extend() - estende a lista com novos elementos passados.index() - retorna o ndice (ou posio) de um determinado elemento da lista.insert() - insere um determinado elemento numa especificada posio.pop() - remove o elemento da posio indicada e o retorna.remove() - remove o primeiro elemento da lista.reverse() - inverte a ordem dos elementos da lista.sort() - ordena os elementos da lista.

    >>> l = [10,56,32,89,25,14]>>> l.append(90) #append>>> l[10, 56, 32, 89, 25, 14, 90]

    >>> l.insert(3,50) #insert>>> l[10, 56, 32, 50, 89, 25, 14, 90]

    >>> l.pop(7) #pop90>>> l[10, 56, 32, 50, 89, 25, 14]

    >>> l.index(89) #index4

    >>> a = [15,90,68]

    15

  • Python

    >>> a.extend(l) #extend>>> a[15, 90, 68, 10, 56, 32, 50, 89, 25, 14, '5', '5']

    >>> a.sort() #sort>>> a[10, 14, 15, 25, 32, 50, 56, 68, 89, 90, '5', '5']

    Da mesma forma que ndices de string, ndices de lista comeam do 0, listas tambm podem ser concatenadas e sofrer o operador de slice(fatiadas).

    +---+----+---+---+---+| 10| 14 |15 | 25|32 |....... Este exemplo para entender o slice.+---+----+---+---+---+0 1 2 3 4 5

    >>>A[0:3][10,14,15]

    2.8 Tuplas So objetos como as listas, com a diferena de que tuplas so imutveis como strings. Uma vez criadas, no podem ser modificadas. Usa-se ou no () como delimitador.

    >>> tupla = ("Maria", "Pedro", "Jos")>>> tupla[0]'Maria'>>> tupla[0]="Ftima"

    Traceback (most recent call last):File "", line 1, in tupla[0]="Ftima"TypeError: 'tuple' object does not support item assignment

    >>> tupla= 1,2,3>>>tupla(1,2,3)

    Um problema especial a criao de tuplas contendo 0 ou 1 itens: a sintaxe tem certos truques para acomodar estes casos. Tuplas vazias so construdas por uma par de parnteses vazios. E uma tupla unitria construda por um nico valor e uma vrgula entre parnteses (sem a vrgula a tupla no ser gerada!). Feio, mas efetivo:

    >>> empty = ()>>> singleton = hello, # >> len(empty)0>>> len(singleton)

    16

  • Python

    1>>> singleton(hello,)

    O comando t = 12345, 54321, hello! um exemplo de empacotamento em tupla (tuple packing): os valores 12345, 54321 e hello! so empacotados juntos em uma tupla. A operao inversa tambm possvel desempacotamento de sequncia (sequence unpacking):>>> x, y, z = t

    2.9 DicionriosDicionrios so conjuntos no ordenados de pares, onde o primeiro elemento do

    par, o ndice, chamado de chave e o outro de valor. Um dicionrio, em Python, suporta qualquer tipo de objeto, seja ele uma lista ou at mesmo outros dicionrios e pode ser modificado. Para criar um dicionrio basta declarar pares chave:valor separados por vrgula e delimitados por chaves.

    >>> dic = {1:'um', 2:'dois', 3:'trs'}>>> dic[1]'um'>>> dic[4]='quatro'>>> dic{1: 'um', 2: 'dois', 3: 'tr\xeas', 4: 'quatro'}

    Os dicionrios possuem alguns mtodos, entre eles:

    items() - esse mtodo retorna uma lista de tuplas, ou seja, todos os pares chave:valor na forma de tuplas;

    >>> dic.items()[(1, 'um'), (2, 'dois'), (3, 'tr\xeas'), (4, 'quatro')]

    keys() - esse mtodo retorna somente as chaves;

    >>> dic.keys()[1, 2, 3, 4]

    values() - esse mtodo retorna somente os valores;

    >>> dic.values()['um', 'dois', 'tr\xeas', 'quatro']

    get(chave) - retorna o contedo da chave passada como parmetro;

    >>> dic.get(2)'dois'>>> print dic.get(5)

    17

  • Python

    None

    has_key(chave) - verifica se existe a chave passada como parmetro, retornando true ou false;

    >>> dic.has_key(5)False>>> dic.has_key(2)True

    update(dicionrio) - atualiza um dicionrio com base em outro passado como parmetro. Caso elementos do primeiro dicionrio existam tambm no segundo, esse sobrescreve o primeiro, ou se o segundo conter elementos exclusivos, sero adicionados ao primeiro dicionrio.

    >>> dic = {1:'um', 2:'dois', 3:'trs'}>>> dic2 = {1:'one', 2:'two', 5:'five'}>>> dic.update(dic2)>>> dic{1: 'one', 2: 'two', 3: 'tr\xeas', 5: 'five'}

    dict() - produz dicionrios diretamente a partir de uma lista de chaves-valores, armazenadas como tuplas.

    >>> dict([(sape, 4139), (guido, 4127), (jack, 4098)]){sape: 4139, jack: 4098, guido: 4127}>>> dict([(x, x**2) for x in (2, 4, 6)]) # use a list comprehension{2: 4, 4: 16, 6: 36}

    >>> dict(sape=4139, guido=4127, jack=4098){sape: 4139, jack: 4098, guido: 4127}

    2.10 Doc StringsComo o nome sugere, so strings que servem para documentar cdigo. Basta criar

    a string entre seqncias de trs aspas.

    >>> def m():"""Author : NogueiraData : 23/03/2009Version: 0.0"""print "Minha funo"

    2.11 Operadores Aritmticos+ = adio - = subtrao* = multiplicao

    18

  • Python

    / = diviso% = mdulo** = exponenciao

    Obs.: Os operadores + e * fazem concatenao de strings, listas e tuplas.

    >>> 2**3 # o mesmo que 23 (dois ao cubo).8>>> 2**(3+6) # Dois elevado a 9512

    >>> 7 % 2 # O resto da diviso entre 7 e 21

    # - usado para fazer comentrio em Python, tudo aps este simbolo considerado como comentrio na linha.

    # primeiro comentrioSPAM = 1 # e esse o segundo comentrio# ... e ainda um terceiro !STRING = "# Este no um comentrio."

    O sinal de igual (=) utilizado para atribuio de um valor a uma varivel. Nenhum resultado exibido at oprximo prompt interativo:>>> width = 20>>> height = 5*9>>> width * height900Um valor pode ser atribudo a diversas variveis simultaneamente:>>> x = y = z = 0 # Zero x, y e z>>> x0>>> y0>>> z0

    2.12 Operadores de atribuio

    += = incrementao-+ = decrementao/= = divide pelo valor atribudo*= = multiplica pelo valor atribudo

    >>> a=2>>> b=3>>> a+=b # soma a com b e armazena resultado em a

    19

  • Python

    >>> b3>>> a5>>> a-=b>>> a2>>> a/=b>>> a0>>> a=5>>> b=2>>> a/=b>>> a2>>> a*=b>>> a4>>>

    2.13 Operadores de condio== = igualdade!= = diferente> = maior< = menor>= = maior ou igual>> 5 in (2,3,5)True>>> "m" in "Jorge"False

    >>> a=1>>> b=2>>> a == b # == testa se a igual a bFalse>>> a != b # != testa se a diferente de bTrue>>> a b # tambm testa se a diferente de bTrue>>> a > b # > testa se a maior que bFalse>>> a < b # < testa se a menor que bTrue>>> 2*a >= b # testa se o dobro de a maior ou igual a b

    20

  • Python

    True

    2.14 Operadores lgicos

    and = eor = ounot = no

    Obs.: Em Python, a sintaxe a seguir vlida:>>> if 0> 1==1True>>> 1==2False>>> 1==1 or 1==2True>>> 1==1 and 1==2False>>> 1> not 1>> not 1> not (1> "alo" and 11 >>> "alo" or 1'alo'>>> 0 or 100100>>> False or 100100>>> "abc" or 1'abc'>>> 1 and 22

    21

  • Python

    >>> 0 and 30>>> False and 3False>>> 1 and 2 or 32>>> 0 or 2 and 33>>> 1 and not 0True

    2.14.2 Outros operadores: in , is , is not

    >>>a=5>>>b=a>>>a is bTrue>>>a=5>>>b=6>>>a is bFalse>>>a is not bTrue>>>a=[1,2,3]>>>1 in aTrue>>>a=False>>>b=True>>>c= a and b #armazenar em c o resultado de uma expresso booleana>>>cFalse

    Comparando objetos seqncias de mesmo tipo:

    >>>(1,2,3) < (1,2,4)True

    >>>'ABC'

  • Python

    pode ter diferentes tipos durante a execuo do programa. Embora no seja explcita, ela assume um nico tipo no momento em que atribui um valor a ela.

    >>> var = 3>>> type(var)

    >>> var = "3">>> type(var)

    >>> var = 3.0>>> type(var)

    Para descobrir o tipo da varivel, basta usar a funo type(). Com linguagem dinmica, voc garante a simplicidade e flexibilidade da funo. Em Python, tudo objeto, que possui atributos e mtodos e pode ser atribudo a uma varivel ou passado como argumento de uma funo. Por exemplo, uma varivel que contm uma string um objeto, pois qualquer string possui um mtodo chamado upper que converte a string para maisculo.

    >>> a = "Hello">>> a.upper()'HELLO'

    Os principais tipos de objetos em Python so inteiros, floats(reais), strings(texto), listas, tuplas, dicionrios. Pode-se transformar o tipo original de um objeto para inteiro, float e string por meio de funes int, float e string.

    2.16 Operador %

    Existem trs tipos de formatao:%s substitui strings%d substitui inteiros%f substitui floats

    >>> nome = "Eliane">>> print "Meu nome %s" % nomeMeu nome Eliane

    23

  • Python

    >>> x="abacaxi">>> y="amarelo">>> print 'O %s %s." %(x, y)

    >>> numInt = 19>>> print "Eu tenho %d anos" % numIntEu tenho 19 anos

    >>> numFloat = 1.6>>> print "Altura: %.2f m" % numFloatAltura: 1.60 m

    >>> numFloat = 54.80>>> print "Peso: %10.1f kg" % numFloatPeso: 54.8 kg

    Obs.: %.2f corresponde a duas casas decimais e %10.1, a dez espaos, uma casa decimal.

    24

  • Python

    Captulo 3. Controle de Fluxo e Estrutura de Dados em Python

    3.1 Controle de FluxoAssim como nas outras linguagens, Python possui estruturas de controle de fluxo

    (condio e lao) tambm.

    3.1.1 Instruo: While Repete uma seqncia de comandos enquanto uma dada expresso booleana

    avaliada como verdadeira. Em Python, como em C, qualquer valor inteiro no nulo considerado verdadeiro (valor true), zero tem valor false. A condio pode ser ainda uma lista ou string, na verdade qualquer sequncia; qualquer coisa com comprimento no nulo tem valor true e sequncias vazias tem valor false. Os operadores padro para comparao so os mesmos de C: < (menor que), > (maior que), ==(igual), = (maior ou igual) and != (diferente).Formato:

    while expresso:comando...comando

    Exemplo:

    >>> a = 10>>> while a>8:... print a,... a = a-1...10 9

    Exemplo srie de Fibonacci:

    >>> # Serie de Fibonacci :... # A soma de dois elementos define o proximo>>> a, b = 0, 1>>> while b < 1000:

    print b,a, b = b, a+b

    1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

    O corpo do lao identado: identao em Python a maneira de agrupar comandos. Python (ainda!) no possui facilidades automticas de edio de linha. Na prtica voc ir preparar scripts Python complexos em um editor de texto; a maioria dos editores de texto possui facilidades de identao automtica. Quando comandos compostos forem alimentados ao interpretador interativamente, devem ser encerrados por uma linha em branco (j que o parser no tem como adivinhar qual a ltima linha do comando).

    25

  • Python

    Observe que toda linha de um mesmo bloco de comandos deve possuir a mesma indentao.Como em todo comando de repetio, importante evitar os chamados laos infinitos

    >>> a = 10>>> while a>8:

    print a,a = a+1

    10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 2627 28 29 30 31 32 33 ...Ctrl-C aborta comando IDLE.

    3.1.2 Instruo: forA instruo for interage com uma seqncia, ou seja, requer um objeto lista ou

    qualquer outro de seqncia.

    >>> a = ['Joo', 'Rafael', 'Douglas']>>> a['Jo\xe3o', 'Rafael', 'Douglas']>>> for i in a:

    print i

    JooRafaelDouglas>>> # Medindo algumas strings:>>> a = [gato, janela, defenestrar]>>> for x in a:

    print x, len(x)

    gato 4janela 6defenestrar 11

    A construo for em Python difere um pouco do que se est acostumado em C ou Pascal. Ao invs de se iterar sobre progresses aritimticas (como em Pascal), ou fornecer ao usurio a habilidade de definir tanto o passo da iterao quanto a condio de parada (como em C), o for de Python itera sobre os itens de uma sequncia (uma lista ou uma string), na ordem em que aparecem na sequncia.

    Funo range(x): Se voc precisar iterar sobre sequncias numricas, a funo interna range() a resposta. Ela gera listas contendo progresses aritmticas, por exemplo:

    >>> range(9)[0, 1, 2, 3, 4, 5, 6, 7, 8]

    O ponto de parada fornecido nunca gerado na lista; range(9) gera uma lista com 9

    26

  • Python

    valores, exatamente os ndices vlidos para uma sequncia de comprimento 9. possvel iniciar o intervalo em outro nmero, ou alterar a razo da progresso (inclusive com passo negativo):

    >>> range(5, 10)[5, 6, 7, 8, 9]>>> range(0, 10, 3)[0, 3, 6, 9]>>> range(-10, -100, -30)[-10, -40, -70]

    3.1.3 Clusulas break, continue e else em LaosO break, suspende o lao mais interno de um for ou while. O continue, continua o

    prximo passo do lao mais interno. Laos podem ter uma clusula else, que executada sempre que o lao se encerra por exausto da lista (no caso do for) ou quando a condio se torna falsa (no caso do while), mas nunca quando o lao encerrado por um break. Veja exemplo:

    >>> for n in range(2, 10):for x in range(2, n):

    if n % x == 0:print n, 'igual', x, '*', n/xbreak

    else:# encontrou numero primo

    print n, 'eh um numero primo'

    >>>2 eh um numero primo3 eh um numero primo4 igual 2 * 25 eh um numero primo6 igual 2 * 37 eh um numero primo8 igual 2 * 49 igual 3 * 3

    3.1.4 Instruo ifEm Python, no permitido fazer atribuies em um if, ento

    necessrio usar o operador == quando fizer comparaes. Apalavra elif a abreviao de else if.

    >>> if x < 0:print "Negativo"

    elif x == 0:print "Zero"

    elif x

  • Python

    elif x > while True:pass # Busy-wait para interrupo de teclado

    3.1.6 Tcnicas de Lao

    mtodo iteritems() - para obter chave-valor ao percorrer um dicionrio com lao.

    >>>dicionario={1:'um', 2:'dois', 3:'tres'}>>>for i, j in dicionario.iteritens():

    print i, j

    1 um2 dois

    funo enumerate() - obtem o ndice e o valor correspondente em uma lista.

    28

  • Python

    >>>lista=['um', 'dois', 'tres']>>>for i,j in enumerate(lista):

    print i, j

    0 um1 dois2 tresfuno zip() - percorrer duas sequncias simultaneamente com lao e agrup-los.

    >>> questao = [nome, convite, sapato favorito]>>> resposta = [jose, especial, marrom]>>> for q, a in zip(questao, resposta):

    print Qual seu %s? Eh %s. % (q, a)

    Qual seu nome? Eh sergio.Qual seu convite? Eh especial.Qual seu sapato favorito? Eh marrom.

    funo reversed() - percorrer uma lista em ordem reversa.

    >>>lista=[1,2,3]>>>for i in reversed(lista):

    print i

    321

    funo sorted() - retorna lista na forma ordenada.

    >>>lista=['a','b','e','c']>>>for i in sorted(lista):

    print i,

    a b c e

    3.1.6 Estrutura de Dados

    3.1.6.1 Usando Listas como PilhasO ltimo elemento a entrar o primeiro a sair. Exemplo:

    >>> pilha = [3, 4, 5]>>> pilha.append(6)>>> pilha.append(7)>>> pilha

    29

  • Python

    [3, 4, 5, 6, 7]>>> pilha.pop()7>>> pilha[3, 4, 5, 6]>>> pilha.pop()6>>> pilha.pop()5>>> pilha[3, 4]

    3.1.6.2 Usando Listas como FilasO primeiro elemento que entra o primeiro que sai. Exemplo:

    >>> fila = ["Erica", "Jo", "Miguel"]>>> fila.append("Tereza") # entra Teresa>>> fila.append("Gilson") # entra Gilson>>> fila.pop(0)Erica>>> fila.pop(0)Jo>>> fila[Miguel, Teresa, Gilson]

    3.1.6.3 Funes sobre listas: filter(), map(), e reduce().

    filter(function, sequence) retorna uma sequncia consistindo dos itens pertencentes a sequncia para os quais function(item) verdadeiro. If se a sequncia for string ou tuple, o resultado ser sempre do mesmo tipo; caso contrrio, ser sempre uma lista. Por exemplo, para computar nmeros primos:

    >>> def f(x): return x % 2 != 0 and x % 3 != 0...>>> filter(f, range(2, 25))[5, 7, 11, 13, 17, 19, 23]

    map(function, sequence) aplica function(item) para cada item da sequncia e retorna a lista de valores retornados a cada aplicao. Por exemplo, para computar quadrados:

    >>> def QUADRADO(x): return x*x...>>> map(QUADRADO, range(1, 10))[1, 4, 9, 16, 25, 36, 49, 64, 81]

    Exemplo soma de 2 sequncias:

    >>> seq = range(8)

    30

  • Python

    >>> def square(x, y): return x+y...>>> map(add, seq, seq)[0, 2, 4, 6, 8, 10, 12, 14]

    reduce(function, sequence) retorna um nico valor construdo a partir da sucessiva aplicao da funo binria function a todos os elementos da lista fornecida, dois de cada vez. Por exemplo, para computar a soma dos 10 primeiros nmeros inteiros:

    >>> def soma(x,y): return x+y

    >>> reduce(soma, range(1, 11))55

    Um terceiro argumento pode ser passado para indicar o valor inicial. Neste caso, reduo de sequncias vazias retornar o valor inicial. Se a sequncia no for vazia, a reduo se iniciar a partir do valor inicial.

    3.1.6.4 Abrangncia de Listas(list comprehensions): Cada abrangncia de lista consiste numa expresso seguida da clusula for, e ento zero ou mais clusulas for ou if. O resultado ser uma lista proveniente da avaliao da expresso no contexto das clusulas for e if subsequentes. Se a expresso gerar uma tupla, a mesma deve ser inserida entre parnteses.

    >>> vec = [2, 4, 6]>>> [3*x for x in vec][6, 12, 18]>>> [3*x for x in vec if x > 3][12, 18]>>> [3*x for x in vec if x < 2][]

    >>> [(x, x**2) for x in vec][(2, 4), (4, 16), (6, 36)]>>> vec1 = [2, 4, 6]>>> vec2 = [4, 3, -9]>>> [x*y for x in vec1 for y in vec2][8, 6, -18, 16, 12, -36, 24, 18, -54]>>> [x+y for x in vec1 for y in vec2][6, 5, -7, 8, 7, -5, 10, 9, -3]>>> [vec1[i]*vec2[i] for i in range(len(vec1))][8, 12, -54]

    3.1.6.5 O comando delRemove item da lista a partir de um ndice. Permite tambm fatiar a lista (slice).

    Apaga tambm variveis.

    >>> a = [-1, 1, 66.25, 333, 333, 1234.5]

    31

  • Python

    >>> del a[0]>>> a[1, 66.25, 333, 333, 1234.5]>>> del a[2:4]>>> a[1, 66.25, 1234.5]>>> del a

    3.1.6.6 setsPython tambm inclui um tipo de dados para conjuntos (sets). Um conjunto uma

    coleo desordenada de dados, sem elementos duplicados. Usos comuns para isso incluem verificaes da existncia de objetos em outros sequncias e eliminao de items duplicados. Conjuntos tambm suportam operaes matemticas como unio, interseo, diferena e diferena simtrica.

    >>> basket = [apple, orange, apple, pear, orange, banana]>>> fruits = set(basket) # cria conjunto sem duplicao>>> fruitsset([orange, pear, apple, banana])>>> orange in fruits # teste rpido True>>> crabgrass in fruitsFalse>>> # Demonstracao de operacoes de conjuntos...>>> a = set(abracadabra)>>> a set([a, r, b, c, d]) # set deixa apenas uma letra de cada sem repetio

    >>> b = set(alacazam)>>> bset([a, l','c','z','m'])>>> a - b # letras em a e no em bset([r, d, b])

    >>> a | b # letras em a e em bset([a, c, r, d, b, m, z, l])

    >>> a & b # letras em ambos a e bset([a, c])

    >>> a ^ b #letras em a ou b e no em ambosset([r, d, b, m, z, l])

    32

  • Python

    Captulo 4. Funes, Recurso, Exceo, Arquivos e Mdulos

    4.1 Funes - Funes so blocos de cdigo com um nome; recebem um conjunto de parmetros (ou argumentos) e retornam um valor. Python possui, como seria esperado de uma linguagem de programao completa, suporte a funes. Existem diversas funes pr-definidas pelo interpretador. A sintaxe geral para definir uma funo :

    def nome_funcao(arg_1, arg_2, ..., arg_n): # # bloco de cdigo contendo corpo da funo # return valor_de_retorno # retornar opcional

    Os argumentos so valores fornecidos quando chamada a funo, e que ficam disponveis por meio de variveis locais no corpo da funo. Ao encontrar o comando return, a funo termina imediatamente e o controle do programa volta ao ponto onde a funo foi chamada. Se uma funo chega a seu fim sem nenhum valor de retorno ter sido especificado, o valor de retorno None.O corpo da funoo deve comear na linha seguinte e deve ser identado. Opcionalmente, a primeira linha do corpo da funo pode ser uma string literal, cujo propsito documentar a funo. Se presente, essa string chama-se docstring.>>> def f(): #docstring

    ''' funcao f do sergio'''return

    >>> print f()None>>>f #endereco da funcao na memoria

    >>>f.__doc__'funcao f\n\tdo sergio'

    >>> def f():return "Oi">>> print f()Oi

    >>> def f(nome):return "Oi, "+nome+"!">>> print f("Joao")Oi, Joao!

    Exemplo de programa com funo:def imprime_cardapio (pratos): print "Cardapio para hoje\n"

    33

  • Python

    for p in pratos: imprime_prato(p) print "\nTotal de pratos: %d" % len(pratos)

    def imprime_prato(p): print "%s ........ %10.2f" % (p["nome"], p["preco"])

    # defino dicionrios descrevendo os pratosp1 = {"nome": "Arroz com brocolis", "preco": 9.90}p2 = {"nome": "Soja com legumes", "preco": 7.80}p3 = {"nome": "Lentilhas", "preco": 4.80}lista_pratos = [p1, p2, p3]

    # e chamo uma funo, passando os pratos como argumentoimprime_cardapio(lista_pratos)

    -----------------fim programa-------------------------------------------------

    Escopo das variveis:A execuo da funo gera uma nova tabela de smbolos utilizada para as

    variveis locais da funo, mais precisamente, toda atribuio a varivel dentro da funo armazena o valor na tabela de smbolos local. Referncias a variveis so buscadas primeiramente na tabela local, ento na tabela de smbolos global e finalmente na tabela de smbolos interna (built-in). Portanto, no se pode atribuir diretamente um valor a uma varivel global dentro de uma funo (a menos que se utilize a declarao global antes), ainda que variveis globais possam ser referenciadas livremente.

    >>>v = 0>>>def processa(t): global v v = 1

    Se voc no usar global voc s consegue ler a varivel sem fazer atribuio.

    >>>v=0>>>def p(t):

    x=1print x,v

    >>>p(1)1 0

    34

  • Python

    Funes como parmetro:Nomes de funes podem ser manipulados como variveis emesmo como argumentos de funes. Para saber se um nome se refere a uma funo, use o predicado callable().

    Ex.:>>> def f(g):

    return g(5)

    >>> def h(x):return x*x

    >>> f(h)25>>> m = h>>> callable(m)True>>> f(m)25

    Funo com 2 argumentos:

    >>> def c(x,y):return x+y

    >>>c(1,2) 3>>>c('a','b') #mudana do tipo de varivel durante a execuo'ab'

    Funo com valores padro ou default:

    >>> def aplica_multa(valor, taxa=0.1): return valor + valor * taxa>>>aplica_multa(10)11.0>>>aplica_multa(10,0.5)15.0

    Dica: No utilize como valor padro listas, dicionrios e outros valores mutveis; os valores padro so avaliados apenas uma vez e o resultado obtido no o que intuitivamente se esperaria.

    Funo com argumentos opcionais:

    >>> def somatoria(*argumentos):soma = 0for i in argumentos:

    soma+=i # Voc j sabe: soma+=i o mesmo que soma=soma+i

    35

  • Python

    return soma

    >>> somatoria(1,2,3,4,5)15

    A funo pode receber quantos os argumentos o usurio desejar. Se o argumento no for compatvel retorna um erro.

    >>> somatoria(1,2,3,4,'teste')

    Traceback (most recent call last):File "", line 1, in somatoria(1,2,3,4,'teste')File "", line 4, in somatoriasoma+=iTypeError: unsupported operand type(s) for +=: 'int' and 'str'

    >>> def testa_primo(n):teste=1for i in range(2,n):

    if n % i == 0:teste=teste+1

    if teste != 1:print 'Nmero no primo'

    else:print 'Nmero primo'

    >>> testa_primo(28)Nmero no primo>>> testa_primo(7)Nmero primo

    Funo com conjunto de argumentos nomeados: Estes parmetros especiais devem necessariamente ser os ltimos definidos na lista de parmetros da funo.

    def equipe(diretor, produtor, **atores): for personagem in atores.keys(): print "%s: %s" % (personagem, atores[personagem]) print "-" * 20 #repete o sinal de 20 vezes print "Diretor: %s" % diretor print "Produtor: %s" % produtor

    equipe(diretor="Paul Anderson", produtor="Paul Anderson", Frank="Tom Cruise", Edmund="Pat Healy", Linda="Julianne Moore")

    Funo lambda: Com a palavra-chave lambda, funes curtas e annimas podem ser

    36

  • Python

    criadas. Aqui est uma funo que devolve a soma de seus dois argumentos: lambda a, b: a+b. Funes Lambda podem ser utilizadas em qualquer lugar que exigiria uma funo tradicional. Sintaticamente, funes Lambda esto restritas a uma nica expresso. Semanticamente, ela so apenas acar sinttico para a definio de funes normais. Assim como definies de funes aninhadas, funes lambda no podem referenciar variveis de um escopo mais externo.

    >>> def make_incrementor(n):return lambda x: x + n

    >>> f = make_incrementor(42)>>> f(0)42>>> f(1)43

    4.2 Funes recursivas:Funes recursivas so funes que chamam a si mesma de forma que, para resolver um problema maior, utiliza a recurso para chegar as unidades bsicas do problema em questo e ento calcular o resultado final.

    Fibonacci recursivo:

    # coding: utf-8# fib_recursivo.py

    def fibonacci(indice): if indice == 1: return 0 elif indice == 2: return 1 else: return fibonacci(indice - 1) + fibonacci(indice 2) #chama ela mesma

    for i in range(1,11): print fibonacci(i),

    Busca Binria Recursiva:

    def testa(lista,valor): def busca_binaria(imin,imax): if imin==imax: return imin else: meio=(imax+imin)/2 if valor>lista[meio]: return busca_binaria(meio+1,imax) else: return busca_binaria(imin,meio) i = busca_binaria(0,len(lista)-1) if lista[i]==valor: print valor,"encontrado na posicao",i

    37

  • Python

    else: print valor,"nao encontrado"

    testa([1,2,5,6,9,12],5)

    >>>5 encontrado na posicao 2

    Quando uma funo chamada, um pouco de memria usado para guardar o ponto de retorno, os argumentos e variveis locais. Assim, solues iterativas so normalmente mais eficientes do que solues recursivas equivalentes. Isto no quer dizer que solues iterativas sempre sejam preferveis a solues recursivas. Se o problema recursivo por natureza, uma soluo recursiva mais clara, mais fcil de programar e, freqentemente, mais eficiente.

    4.3 Funes pr-definidas:Python possui uma srie de funes pr-definidas, que j esto disponveis quando executamos o interpretador, sem ter que recorrer a bibliotecas externas. Algumas funes importantes que ainda foram ou no apresentadas no texto seguem:

    range(a,b): recebe dois inteiros, retorna uma lista de inteiros entre a e b, no incluindo b. Esta funo freqentemente utilizada para iterar laos for. >>> print range(1,10) [1, 2, 3, 4, 5, 6, 7, 8, 9]

    len(a): retorna o comprimento da varivel a: para listas, tuplas e dicionrios, retorna o nmero de elementos; para strings, o nmero de caracteres; e assim por diante. >>> print len([1,2,3]) 3

    round(a, n): recebe um float e um nmero; retorna o float arredondado com este nmero de casas decimais. >>> print round(1.2345,2) 1.23

    pow(a, n): recebe dois inteiros; retorna o resultado da exponenciao de a ordem n. equivalente sintaxe a ** n. >>>pow(2,8) 256

    chr(a): recebe um inteiro (entre 0 e 255) como parmetro, retornando o caracter correspondente da tabela ASCII. >>> print chr(97) a

    unichr(a): como chr(), recebe um inteiro (aqui variando entre 0 e 65535), retornando o caracter Unicode correspondente. >>> print unichr(97)

    38

  • Python

    a

    ord(a): recebe um nico caracter como parmetro, retornando o seu cdigo ASCII. >>> print ord("a") 97

    min(a, b): retorna o menor entre a e b, sendo aplicvel a valores de qualquer tipo. >>> print min(5,6) 5

    max(a, b): retorna o maior entre a e b. >>> print max(5,6) 6

    abs(n): retorna o valor absoluto de um nmero. >>> print abs(-1+1j) 1.41421356237

    hex(n) e oct(n): retornam uma string contendo a representao em hexadecimal e octal, respectivamente, de um inteiro. >>> print hex(256) 0X100 >>> print oct(256) 0400 >>> print 5*0400 1280

    H tambm funes de converso explcita de tipo; as mais freqentemente utilizadas incluem:

    float(n): converte um inteiro em um float. >>> print float(1) 1.0

    int(n): converte um float em inteiro. >>> print int(5.5) 5

    str(n): converte qualquer tipo em uma string. Tipos seqencias so convertidos de forma literal, peculiarmente. >>> print str([1,2,3]), str({"a": 1}) [1, 2, 3] {'a': 1}

    list(l) e tuple(l): convertem uma seqencia em uma lista ou tupla, respectivamente.

    39

  • Python

    >>> print list("baco") ['', 'b', 'a', 'c', 'o']

    4.4 Mdulos: A medida que seus programas crescem, pode ser desejvel dividi-los em vrios arquivos para facilitar a manuteno. Talvez voc at queira reutilizar uma funo sem copiar sua definio a cada novo programa. Para permitir isto, Python possui uma maneira de depositar definies em um arquivo e posteriormente reutiliz-las em um script ou seo interativa do interpretador. Esse arquivo denominado mdulo. Definies de um mdulo podem ser importadas por outros mdulos ou no mdulo principal. Um mdulo um arquivo contendo definies e comandos Python. O nome do arquivo recebe o sufixo .py . Dentro de um mdulo, seu nome (uma string) est disponvel na varivel global __name__. O comando reload(mdulo) recarrega mdulo.

    O procedimento para criar um mdulo o mesmo para escrever um programa completo. Abra uma janela nova em IDLE(File>New Window), ou digite Crtl-N. Agora digite as funes e salve com a extenso .py, este programa deve estar no diretrio que esteja no path. Exemplo:

    Descobrindo diretrio:

    >>>import sys #>>>sys.pathMostra todos os diretrios do path: [ 'C:python25' , 'C:\\Python25\\Lib\\idlelib',.....]

    Escreveremos o mdulo funcoes.py e armazenaremos num arquivo de nome funcoes.py.

    #funcoes.py

    def perimetro(r):

    """esta funcao calcula perimetro de um circulo de raio r""" try: r=float(r) return 2*3.14*r

    except: print 'Erro argumento'

    def area(r): r=float(r) """calcula area""" try: r=float(r) return 3.14*(r**2) except: print 'argumento e numero'def nada(): """faz nada so para mostrar

    40

  • Python

    doc strings""" pass

    No shell importaremos o mdulo e veremos o funcionamento, quando o mdulo importado o Python gera o arquivo compilado Python (funcoes.pyc):

    >>>import funcoes>>>dir (funcoes)mostra atributos e mtodos

    >>>print funcoes.__doc__None #no tem documentao

    >>>print funcoes.nada.__doc__faz nada so para mostrardoc strings

    >>>print funcoes.perimetro(4)25.12

    Na hora de execuo devemos informar mdulo.funo(parmetros).

    Outra forma de usar funes import-las diretamente:

    from mdulo import funcao1, funcao2,.....

    form funcoes import area

    >>>print area(4) #use s o nome da funo50.24

    4.4.1 Mdulos padro: Python possui um biblioteca padro de mdulos, descrita em um documento em separado, a Python Library Reference (doravante Library Reference). Alguns mdulos esto embutidos no interpretador; estes possibilitam acesso a operaes que no so parte do ncleo da linguagem, seja por eficincia ou para permitir o acesso a chamadas de sistema. O conjunto presente destes mdulos configurvel, por exemplo, o mdulo amoeba s est disponvel em sistemas que suportam as primitivas do Amoeba. Existe um mdulo que requer especial ateno: sys, que embutido em qualquer interpretador Python. As variveis sys.ps1 e sys.ps2 definem as strings utilizadas como prompt primrio e secundrio:

    >>> import sys>>> sys.ps1>>> >>> sys.ps2... >>> sys.ps1 = C> C> print Yuck!

    41

  • Python

    Yuck!C>Essas variveis s esto definidas se o interpretador est em modo interativo.

    A varivel sys.path contm uma lista de strings que determina os caminhos de busca de mdulos conhecidos pelo interpretador. Ela inicializada para um caminho default determinado pela varivel de ambiente PYTHONPATH ou por um valor default interno se a varivel no estiver definida. Voc pode modific-la utilizando as operaes tpicas de lista, por exemplo:>>> import sys>>> sys.path.append(/ufs/guido/lib/python)

    A funo interna dir() utilizada para se descobrir que nomes so definidos por um mdulo. Ela retorna umalista ordenada de strings:>>> import fibo, sys>>> dir(fibo)[__name__, fib, fib2]>>> dir(sys)[__displayhook__, __doc__, __excepthook__, __name__, __stderr__,__stdin__, __stdout__, _getframe, api_version, argv,builtin_module_names, byteorder, callstats, copyright,displayhook, exc_clear, exc_info, exc_type, excepthook,exec_prefix, executable, exit, getdefaultencoding, getdlopenflags,getrecursionlimit, getrefcount, hexversion, maxint, maxunicode,meta_path, modules, path, path_hooks, path_importer_cache,platform, prefix, ps1, ps2, setcheckinterval, setdlopenflags,setprofile, setrecursionlimit, settrace, stderr, stdin, stdout,version, version_info, warnoptions]Sem nenhum argumento, dir() lista os nomes atualmente definidos:>>> a = [1, 2, 3, 4, 5]>>> import fibo>>> fib = fibo.fib>>> dir()[__builtins__, __doc__, __file__, __name__, a, fib, fibo, sys]Observe que ela lista nomes dos mais diversos tipos: variveis, mdulos, funes, etc.dir() no lista nomes de funes ou variveis internas. Se voc desejar conhec-los, eles esto definidos no mdulo padro __builtin__:

    >>> import __builtin__>>> dir(__builtin__)[ArithmeticError, AssertionError, AttributeError, DeprecationWarning,EOFError, Ellipsis, EnvironmentError, Exception, False,FloatingPointError, FutureWarning, IOError, ImportError,IndentationError, IndexError, KeyError, KeyboardInterrupt,LookupError, MemoryError, NameError, None, NotImplemented,NotImplementedError, OSError, OverflowError, OverflowWarning,PendingDeprecationWarning, ReferenceError, RuntimeError,

    42

  • Python

    RuntimeWarning, StandardError, StopIteration, SyntaxError,SyntaxWarning, SystemError, SystemExit, TabError, True,TypeError, UnboundLocalError, UnicodeDecodeError,UnicodeEncodeError, UnicodeError, UnicodeTranslateError,UserWarning, ValueError, Warning, WindowsError,ZeroDivisionError, _, __debug__, __doc__, __import__,__name__, abs, apply, basestring, bool, buffer,callable, chr, classmethod, cmp, coerce, compile,complex, copyright, credits, delattr, dict, dir, divmod,enumerate, eval, execfile, exit, file, filter, float,frozenset, getattr, globals, hasattr, hash, help, hex,id, input, int, intern, isinstance, issubclass, iter,len, license, list, locals, long, map, max, min,object, oct, open, ord, pow, property, quit, range,raw_input, reduce, reload, repr, reversed, round, set,setattr, slice, sorted, staticmethod, str, sum, super,tuple, type, unichr, unicode, vars, xrange, zip] (Vide: Tutorial Python)

    4.4.2 Pacotes: Pacotes so uma maneira de estruturar espaos de nomes para mdulos utilizando a sintaxe de separao porponto. Como exemplo, o mdulo A.B designa um sub-mdulo chamado B num pacote denominado A. O uso de pacotes permite aos autores de grupos de mdulos (como NumPy ou PIL) no terem que se preocupar com coliso entre os nomes de seus mdulos e os nomes de mdulos de outros autores. Suponha que voc deseje projetar uma coleo de mdulos (um pacote) para o gerenciamento uniforme de arquivos de som. Existem muitos formatos diferentes (normalmente identificados pela extenso do nome de arquivo, por exemplo. .wav, .aiff, .au), de forma que voc pode precisar criar e manter uma crescente coleo de mdulos de converso entre formatos. Ainda podem existir muitas operaes diferentes passveis de aplicao sobre os arquivos de som (mixagem, eco, equalizao, efeito stereo artificial). Logo, possivelmente voc tambm estar escrevendo uma interminvel coleo de mdulos para aplicar estas operaes. Aqui est uma possvel estrutura para o seu pacote (expressa em termos de um sistema hierrquico de arquivos):

    Sound/ Pacote de mais alto nvel__init__.py Inicializa pacote de somFormats/ Subpacote para arquivos de converso de formato

    __init__.pywavread.pywavwrite.pyaiffread.py...

    Effects/ Subpacote de efeito de sons__init__.pyecho.pysurround.pyreverse.py...

    Filters/ Subpacote para filtros

    43

  • Python

    __init__.pyequalizer.pyvocoder.pykaraoke.py...

    Ao importar esse pacote, Python busca pelo subdiretrio com mesmo nome nos diretrios listados em sys.path. Os arquivos __init__.py so necessrios para que Python trate os diretrios como um conjunto de mdulos. Isso foi feito para evitar diretrios com nomes comuns, como string, de inadvertidamente esconder mdulos vlidos que ocorram a posteriori no caminho de busca. No caso mais simples, __init__.py pode ser um arquivo vazio. Porm, ele pode conter cdigo de inicializao para o pacote ou gerar a varivel __all__, que ser descrita depois. Usurios do pacote podem importar mdulos individuais, por exemplo:

    import Sound.Effects.echo

    Assim se carrega um sub-mdulo Sound.Effects.echo. Ele deve ser referenciado com seu nome completo, como em:Sound.Effects.echo.echofilter(input, output, delay=0.7, atten=4)

    Uma alternativa para a importao :from Sound.Effects import echo

    Assim se carrega o mdulo sem necessidade de prefixao na hora do uso. Logo, pode ser utilizado como se segue:echo.echofilter(input, output, delay=0.7, atten=4)

    Tambm possvel importar diretamente uma nica varivel ou funo, como em:

    from Sound.Effects.echo import echofilter

    Novamente, h carga do sub-mdulo echo, mas a funo echofilter() est acessvel diretamente sem prefixao:

    echofilter(input, output, delay=0.7, atten=4)

    Observe que ao utilizar from package import item, o item pode ser um sub-pacote, sub-mdulo, classe, funo ou varivel. O comando import primeiro testa se o item est definido no pacote, seno assume que um mdulo e tenta carreg-lo. Se falhar em encontrar o mdulo uma exceo ImportError levantada. Em oposio, na construo import item.subitem.subsubitem, cada item, com exceo do ltimo, deve ser um pacote. O ltimo pode ser tambm um pacote ou mdulo, mas nunca uma entidade contida em um mdulo. 4.4.3 Importando * de Um Pacote: Agora, o que acontece quando um usurio escreve from Sound.Effects import * ? Idealmente, poderia se esperar que todos sub-mdulos presentes no pacote fossem importados. Infelizmente, essa operao no funciona muito bem nas plataformas Mac ouWindows, onde no existe distino entre maisculas ou

    44

  • Python

    minsculas nos sistema de arquivos. Nestas plataformas no h como saber como importar o arquivo ECHO.PY, deveria ser com o nome echo, Echo ou ECHO (por exemplo, o Windows 95 tem o irritante hbito de colocar a primeira letra em maiscula). A restrio de nomes de arquivo em DOS com o formato 8+3 adiciona um outro problema na hora de se utilizar arquivos com nomes longos. A nica soluo o autor do pacote fornecer um ndice explcito do pacote. O comando de importao utiliza a seguinte conveno: se o arquivo __init__.py do pacote define a lista chamada __all__, ento esta lista indica os nomes dos mdulos a serem importados quando o comando from package import * encontrado. Fica a cargo do autor do pacote manter esta lista atualizada, inclusive fica a seu critrio excluir inteiramente o suporte a importao direta de todo o pacote atravs do from package import *. Por exemplo, o arquivo Sounds/Effects/__init__.py poderia conter apenas:__all__ = ["echo", "surround", "reverse"]Isso significaria que from Sound.Effects import * iria importar apenas os trs sub-mdulos especificados no pacote Sound. Se __all__ no estiver definido, o comando from Sound.Effects import * no importar todos os sub-mdulos do pacote Sound.Effects no espao de nomes corrente. H apenas garantia que o pacote Sound.Effects foi importado (possivelmente executando qualquer cdigo de inicializao em __init__.py) juntamente com os nomes definidos no pacote. Isso inclui todo nome definido em __init__.py bem como em qualquer sub-mdulo importado a partir deste. Considere o cdigo abaixo:

    import Sound.Effects.echoimport Sound.Effects.surroundfrom Sound.Effects import *

    Neste exemplo, os mdulos echo e surround so importados no espao de nomes corrente, pois esto definidos no pacote Sound.Effects. O que tambm funciona quando __all__ estiver definida. Em geral, a prtica de importar * de um dado mdulo desaconselhada, principalmente por prejudicar a legibilidade do cdigo. Contudo, recomendada em sesses interativas para evitar excesso de digitao. Lembre-se que no h nada de errado em utilizar from Package import specific_submodule! De fato, essa a notao recomendada a menos que o mdulo efetuando a importao precise utilizar sub-mdulos homnimos em diferentes pacotes. (Tutorial Python)

    4.4.4 Referncias em Um Mesmo Pacote: Os sub-mdulos frequentemente precisam referenciar uns aos outros. Por exemplo, o mdulo surround talvez precise utilizar o mdulo echo. De fato, tais referncias so to comuns que o comando import primeiro busca mdulos dentro do pacote antes de utilizar o caminho de busca padro. Portanto, o mdulo surround pode usar simplesmente import echo ou from echo import echofilter. Se o mdulo importado no for encontrado no pacote corrente (o pacote do qual o mdulo corrente sub-mdulo), ento o comando import procura por um mdulo de mesmo nome no escopo global. Quando pacotes so estruturados em sub-pacotes (como no exemplo Sound), no existe atalho para referenciar sub-mdulos de pacotes irmos - o nome completo do pacote deve ser utilizado. Por exemplo, se o mdulo Sound.Filters.vocoder precisa utilizar o mdulo echo no pacote Sound.Effects, preciso import-lo como from Sound.Effects import echo. (Tutorial Python).

    4.4.5 Pacotes em mltiplos diretrios: Pacotes suportam mais um atributo especial,

    45

  • Python

    __path__. Este inicializado como uma lista contendo o nome do diretrio com o arquivo __init__.py do pacote, antes do cdigo naquele arquivo ser executado. Esta varivel pode ser modificada; isso afeta a busca futura de mdulos e sub-pacotes contidos no pacote. Apesar de no ser muito usado, pode ser usado para extender o conjunto de mdulos usado num pacote. (Tutorial Python)

    4.4.6 Mdulos Importantes:

    H um grande conjunto de mdulos que se instalam juntamente com o interpretador Python; so descritos nesta seo alguns dos mais interessantes.

    sys: oferece vrias operaes referentes ao prprio interpretador. Inclui: path, uma lista dos diretrios de busca de mdulos do python, argv, a lista de parmetros passados na linha de comando e exit(), uma funo que termina o programa.

    time: oferece funes para manipular valores de tempo. Inclui: time(), uma funo que retorna o timestamp14 atual; sleep(n), que pausa a execuo por n segundos; e strftime(n), que formata um timestamp em uma string de acordo com um formato fornecido.

    os: oferece funes relacionadas ao ambiente de execuo do sistema. Inclui: mkdir(), que cria diretrios; rename(), que altera nomes e caminhos de arquivos; e system, que executa comandos do sistema.

    os.path: oferece funes de manipulao do caminho independente de plataforma. Inclui: isdir(p), que testa se d um diretrio; exists(p), que testa se p existe; join(p,m), que retorna uma string com os dois caminhos p e m concatenados.

    string: oferece funes de manipulao de string (que tambm esto disponveis como mtodos da string). Inclui: split(c, s, p), que divide a string c em at p parties separadas pelo smbolo s, retornando-as em uma lista; lower(c), que retorna a string c convertida em minsculas; e strip(c), que retorna c removendo espaos e quebras de linha do seu incio e fim.

    math: funes matemticas gerais. Inclui funes como cos(x), que retorna o cosseno de x; hypot(x, y); que retorna a distncia euclidiana entre x e y; e exp(x); que retorna o exponencial de x.

    random: gerao de nmeros randmicos. Inclui: random(), que retorna um nmero randmico entre 0 e 1; randrange(m,n), que retorna um randmico entre m e n; choice(s), que retorna um elemento randmico de uma seqncia s.

    getopt: processamento de argumentos de comando de linha; ou seja, os parmetros que passamos para o interpretador na linha de execuo. Inclui: getopt(), que retorna duas listas, uma com argumentos e outra com opes da linha de comando.

    Tkinter: um mdulo que permite a criao de programas com interface grfica, incluindo janelas, botes e campos texto.

    A documentao do Python inclui uma descrio detalhada (e muito boa) de cada um destes mdulos e de seus membros.

    4.5 Funes de entrada e sada: Entrada e sada so operaes de comunicao de um

    46

  • Python

    programa com o mundo externo. Essa comunicao se d usualmente atravs de arquivos. Arquivos esto associados a dispositivos. Por exemplo, disco, impressora, teclado. Em Python, um arquivo pode ser lido/escrito atravs de um objeto da classe file.

    Sempre que um comando print executado, o resultado vai para um arquivo chamado sys.stdout. Sempre que lemos um dado atravs do comando input ou raw_input, na verdade estamos lendo de um arquivo chamado sys.stdin. Mensagens de erro ou de rastreamento de excees so enviadas para um arquivo chamado sys.stderr.

    >>> import sys>>> sys.stdout.write("alo")alo>>> print "alo"alo>>> sys.stdin.readline()sfadfas'sfadfas\n'>>> raw_input()fasdfadsf'fasdfadsf'

    Os arquivos sys.stdin, sys.stdout e sys.stderr normalmente esto associados ao teclado e ao display do terminal sendo usado, mas podem ser reassociados a outros dispositivos.

    Em Unix/Linux e Windows:programa > arquivoExecuta programa redirecionando stdout para arquivoprograma < arquivoExecuta programa redirecionando stdin de arquivoprograma1 | programa2Executa programa1 e programa2 sendo que a sada deprograma1 redirecionada para a entrada de programa2

    Programa de entrada de dados com a funo raw_input() que retorna sempre uma string: >>> x = raw_input('Informe a fase: ')Informe a fase: vapor>>> x'vapor'

    Retornando um inteiro ou float:

    >>> r = float(raw_input('Raio: '))Raio: 4.5>>> type(r)

    >>> a = int(raw_input('Tamanho do lado do quadrado: ')Tamanho do lado do quadrado: 23

    47

  • Python

    >>> type(a)

    funo input() retorna nmero: x=input('No.:').>>>x=input('No.')No. 12>>>x12

    Imprimindo dados com print:>>> b = 1>>> while b < 4:

    if b==1:print '%i dlar vale %.2f reais' %(b,b*2.98) #formatacao %.2f (2 casas dec.)

    else:print '%i dlares valem %.2f reais' %(b,b*2.98)

    b+=1

    1 dlar vale 2.98 reais2 dlares valem 5.96 reais3 dlares valem 8.94 reais

    >>> a = ['Joo', 'Rafael', 'Douglas']>>> a['Jo\xe3o', 'Rafael', 'Douglas']>>> for i in a:

    print i

    JooRafaelDouglas>>> for x in a:

    print '%s tem %i letras' %(x,len(x))

    Joo tem 4 letrasRafael tem 6 letrasDouglas tem 7 letras

    >>> a=[1,2,3]>>> for i in range(len(a)):

    print i

    123

    >>> a=[1,2,3]>>> for i in range(len(a)):

    48

  • Python

    print i,

    1 2 3

    Outros exemplos e funes:

    >>> s = Hello, world.>>> str(s)Hello, world.>>> repr(s) # coloca "Hello, world.">>> str(0.1) # numero string0.1>>> repr(0.1)0.10000000000000001 # string com limite mximo da representao

    >>>for i in range(10):print repr(i).rjust(1), repr(i*2).rjust(5) #atua em cima da string

    0 01 12 4......

    >>>for i in range(5): #executa e veja o que aconteceprint str(i).ljust(1),str(i*2),ljust(2)print str(i).center(1),str(i*2).center(2)

    ..

    >>>'12'.zfill(5) #string com zero a esquerda'00015'

    >>> table = {Sjoerd: 4127, Jack: 4098, Dcab: 7678}>>> for name, phone in table.items():

    print %-10s ==> %10d % (name, phone)

    Jack ==> 4098Dcab ==> 7678Sjoerd ==> 4127

    >>> table = {Sjoerd: 4127, Jack: 4098, Dcab: 8637678}>>> print Jack: %(Jack)d; Sjoerd: %(Sjoerd)d; Dcab: %(Dcab)d % tableJack: 4098; Sjoerd: 4127; Dcab: 8637678

    4.5.1 Operaes com arquivos:Em Python, assim como em outras linguagens, possvel manipular arquivos. Desse modo, o usurio consegue abrir, ler, alterar, gravar e

    49

  • Python

    fechar um arquivo. Tudo o que voc precisa para manipular, corretamente, um arquivo conhecer os mtodos responsveis por cada coisa. A funo open(nome_arquivo,modo,buffer) retorna um objeto arquivo, em outras palavras, abre o arquivo que voc especificar.>>> arq = open('C:\hoje.txt')

    Voc, ainda, tem a opo de passar como parmetro o modo como vai abrir o arquivo. Caso passe um r, seu arquivo ser somente de leitura; se passar a, poder adicionar contedo ao final do arquivo; caso passe w, o arquivo ser apagado e aberto para escrita, no entanto, se ele no existir ser automaticamente criado, etc. A opor+ abre o arquivo tanto para leitura como para escrita. Caso o usurio no passe o segundo parmetro, Python assume o r.No Windows e no Macintosh, b adicionado a string de modo indica que o arquivo ser aberto no formatobinrio. Sendo assim, existem os modos compostos : rb, wb, e r+b. O Windows faz distino entre arquivos texto e binrios: os caracteres terminadores de linha em arquivos texto so levemente alterados em leituras e escritas. Essa mudana por-trs-do-pano til em arquivos texto ASCII, mas ir corromper um arquivo binrio como no caso de arquivos JPEG ou EXE. Buffer indica se vai usar uma memria de buffer para entrada e sada(0-sem buffer/1-buffer default/2 ou mais - nmero de bytes do buffer).

    >>> t = open('C:\meuarquivo.txt','w')>>> print t

    4.5.2 Mtodos do objeto arquivo:

    t.read(size): Para ler o contedo de um arquivo chame t.read(size), que l um punhado de dados retornando-os como string. O argumento numrico size opcional. Quando size for omitido ou negativo, todo o contedo do arquivo ser lido e retornado.Obs: t o objeto gerado quando executamos o comando open. >>> t.read()Esse todo o contedo do arquivo.\n>>> t.read() #final do arquivo atingido

    t.readline(): l uma nica linha do arquivo. O caracter de retorno de linha (\n) deixado ao final da string, s sendo omitido na ltima linha do arquivo se ele j no estiver presente l. Isso elimina a ambiguidade no valor de retorno. Se f.readline() retornar uma string vazia, ento o arquivo acabou. Linhas em branco so representadas por \n: uma string contendo unicamente o terminador de linha.

    >>> t.readline()Essa a primeira linha do arquivo.\n>>> t.readline()Segunda linha do arquivo\n>>> t.readline()

    50

  • Python

    t.readlines(): retorna uma lista contendo todas as linhas do arquivo. Se for fornecido o parmetro opcional sizehint, ser lida a quantidade especificada de bytes e mais o suficiente para completar uma linha.

    >>> for linha in t: # le diretamente as linhas do arquivoprint linha,

    Esta a primeira linha do arquivo.Segunda linha do arquivo.

    t.write(string): escreve o contedo da string para o arquivo, retornando None.

    >>> t.write(Isso um teste.\n)

    Ao escrever algo que no seja uma string, necessrio convert-lo antes:>>> value = (a resposta, 42)>>> s = str(value)>>> t.write(s)

    t.writelines(seqncia): Escreve a lista (ou qualquer seqncia) de strings, uma por uma no arquivo

    t.tell(): retorna um inteiro que indica a posio corrente de leitura ou escrita no arquivo, medida em bytes desde o incio do arquivo. Para mudar a posio utilize f.seek(offset, from_what). A nova posio computada pela soma do offset a um ponto de referncia, que por sua vez definido pelo argumento from_what. O argumento from_what pode assumir o valor 0 para indicar o incio do arquivo, 1 para indicar a posio corrente e 2 para indicar o fim do arquivo. Este parmetro pode ser omitido, quando assumido o valor default 0.

    t = open(testearquivo, r+)t.write(0123456789abcdef)t.seek(5) # Vai para o sexto byteprint t.read(1)t.seek(-3, 2) # Vai para o terceiro byte antes do fimprint t.read(1)print t.tell()t.close() #fecha arquivo

    5d14

    t.close(): fecha arquivo.

    Interao com sistema operacional: Operaes de entrada e sada so na verdade realizadas pelo sistema operacional. O mdulo os possui diversas variveis e funes

    51

  • Python

    que ajudam um programa Python a se adequar ao sistema operacional, por exemplo:

    import os # importa mdulo os

    os.getcwd() - retorna o diretrio correnteos.chdir(dir) - muda o diretrio corrente para diros.sep - uma string com o caractere que separa componentes de um caminho ('/' para Unix, '\\' para Windows)os.path.exists(path)- diz se path se refere ao nome de um arquivo existenteos.system - executa uma string como se fosse uma linha de comando

    a=os.systema('format c:') # cuidado formata o discoos.startfile- executa um arquivo se ele for do tipo .bat ou .exe.

    >>>os.startfile('c.bat')

    Exemplo de um programa instalador, que cria um diretrio na linha 6, copia o programa para o diretrio e abre um arquivo de texto com o bloco de notas.

    #instalar.pyimport oscomando=os.systemcomando('copy a:\meumodulo.py c:\Python23')NOME=raw_input('Seu nome: ') # Linha 4NOME='Python-'+NOMEcomando('md c:\''+NOME) # Linha 6comando('copy a:\meuprograma.py c:\''+NOME)abrir=os.startfileabrir('a:/leiame.txt')

    4.6 Funo vars():O dicionrio obtido com a funo vars() pode ser usado para ter acesso a todas as variveis definidas num escopo. Ex.:

    >>> vars(){'__builtins__': ,'__name__': '__main__', '__doc__': None}>>> def f():

    x = 1print vars()

    >>> vars(){'f': , '__builtins__':, '__name__':'__main__', '__doc__': None}>>> f(){'x': 1}

    52

  • Python

    4.7 Erros e excees: So os dois tipos de erro mais comuns. Um erro de sintaxe ocorre quando voc no respeita a sintaxe, digitando errado ou esquecendo de algo, como :.

    >>> if x < 10SyntaxError: invalid syntax

    Nesse caso, est faltando : no final da condio.

    Como ler uma mensagem de erroA dura realidade que um programador profissional passa boa parte de sua vida caando erros, e por isso fundamental saber extrair o mximo de informaes das mensagens resultantes. A essa altura voc talvez j tenha provocado um erro para ver o que acontece. Vamos fazer isso agora, e aprender a ler as mensagens resultantes. Pode parecer perda de tempo, mas importantssimo saber interpretar as mensagens de erro porque a melhor forma de aprender a programar experimentando, e ao experimentar voc certamente vai provocar muitos erros. Como exemplo, vamos digitar uma expresso aritmtica sem sentido: No interpretador IDLE voc ver apenas o sinal de diviso assinalado em vermelho e a mensagem SyntaxError: invalid syntax, erro de sintaxe invlida. No interpretador de linha de comando voc ver uma mensagem mais longa:>>> 7 + / 2File "", line 17 + / 2^SyntaxError: invalid syntax>>>A primeira linha da mensagem de erro informa o arquivo onde ocorreu o erro: File". Quando voc est usando o interpretador em modo interativo essa informao intil, mas ao trabalhar com programas extensos ela se torna indispensvel. As prximas duas linhas indicam onde ocorreu o erro:7 + / 2^Note que o smbolo ^ est apontando exatamente a posio do sinal /. Foi a partir desse ponto que a expresso deixou de fazer sentido para o interpretador. Agora vamos provocar um outro tipo de erro:>>> 7/0Traceback (innermost last):File "", line 1, in ?7/0ZeroDivisionError: integer division or modulo>>>A parte mais importante a ltima linha, que nesse caso bem fcil de entender: ZeroDivisionError: integer division or modulo. Do lado esquerdo aparece o nome do erro:ZeroDivisionError, ou erro de diviso por zero. Aps o sinal : vem informaes adicionais sobre o contexto onde ocorreu o erro: em uma diviso inteira ou modulo (em ingls, modulo o nome do operador %, que apresentamos acima). O / e o % so os dois operadores que podem causar um ZeroDivisionError.

    53

  • Python

    Tambm pode vir a ocorrer um erro mesmo que seu cdigo esteja, sintaticamente, correto. Nesse caso trata-se de excees. Quando excees ocorrem, o programa para e o interpretador gera uma mensagem de erro. No entanto, possvel resolver esse problema. Para este fim, basta usar duas instrues: try e except. Enquanto a instruo try contm comandos que sero executados, a instruo except executa o tratamento nas possveis excees desses comandos, ou seja, na instruo except voc diz o que para ser feito caso um erro ocorra durante a execuo dos comandos.

    >>> n = int(raw_input("Escolha uma chave: "))Escolha uma chave: 6>>> dic = {1:'um',2:'dois',3:'tres'}>>> try:

    print dic[n]except:

    print "Chave no existe"

    Chave no existe

    Se no houver excees nos comandos, a instruo except ignorada. possvel numa nica instruo try criar diversas except com diferentes tipos de excees, entre eles: ValueError, IndexError, TypeError.

    Existem, ainda, duas outras instrues: raise e finally. No primeiro caso, fora a ocorrncia de um determinado tipo de exceo.Quando existir a instruo finally, seus comandos sero executados independentemente de existir ou no excees, e sero executados antes das excees.A instruo try nunca permite que o usurio use except e finally, simultaneamente. Alm de existir diversos tipos pr-definidos de excees no Python, o usurio tem a liberdade de criar seus prprios tipos de excees atravs de classes.

    >>> while True:try:

    x = int(raw_input("Entre com um nmero: "))break

    except ValueError:print "Opa! Esse nmero no vlido. Tente de novo..."

    A construo try . . . except possui uma clusula else opcional, que quando presente, deve ser colocada depois de todas as outras clusulas. til para um cdigo que precisa ser executado se nenhuma exceo foi levantada.Por exemplo:

    for arg in sys.argv[1:]:try:

    f = open(arg, r)

    54

  • Python

    except IOError:print cannot open, arg

    else:print arg, has, len(f.readlines()), lines

    f.close()

    finally: executada sempre, ocorrendo ou no uma exceo. Quando ocorre a exceo, como se a exceo fosse sempre levantada aps a execuo do cdigo na clusula finally. Mesmo que haja um break ou return dentro do try, ainda assim o finally ser executado. O cdigo na clusula finally til para liberar recursos externos (como arquivos e conexes de rede), no importando se o uso deles foi bem sucedido. A construo try pode ser seguida da clusula finally ou de um conjunto de clusulas except, mas nunca ambas (no ficaria muito claro qual deve ser executada primeiro).

    >>> try:raise KeyboardInterrupt

    finally:print Goodbye, world!

    Goodbye, world!Traceback (most recent call last):File "", line 2, ?KeyboardInterrupt

    Diversos tipos de excees vm pr-definidas pelo interpretador Python; o guia de referncia contm uma lista completa e os casos onde so levantadas. Note tambm que esta introduo a excees no cobre a sua sintaxe completa; consulte a seo Errors and Exceptions do tutorial Python para maiores detalhes.

    55

  • Python

    Captulo 5: Biblioteca Padro

    5.1 Interface com Sistema Operac