associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Revisão 2e 2008-02-24 03:26:39

Excluir mensagem

Tutorial_Python

  <div class="titlepage">
    <div class='center'>
      <p><b>Guido van Rossum</b></p>
      <p>Python Software Foundation<br />
      Email: <span class="email">docs@python.org</span> <strong>Python Brasil</strong><br />
      <a class="url" href="http://pythonbrasil.com.br">http://pythonbrasil.com.br</a></p>
      <p><i>Fred L. Drake, Jr., editor</i></p>
      <p><strong>Release 2.4.2</strong><br />
      <strong>23. Fevereiro 2008</strong></p>
      <p>Tradu&#231;&#227;o: Python Brasil</p>
    </div>
  </div>
  <h1>  Front Matter</h1>
  <p>Copyright &#169; 2001-2004 Python Software Foundation. All rights reserved.</p>
  <p>Copyright &#169; 2000 BeOpen.com. All rights reserved.</p>
  <p>Copyright &#169; 1995-2000 Corporation for National Research Initiatives. All rights reserved.</p>
  <p>Copyright &#169; 1991-1995 Stichting Mathematisch Centrum. All rights reserved.</p>
  <p>Tradu&#231;&#227;o: Pedro Werneck, Osvaldo Santana Neto, Jos&#233; Alexandre Nalon, Felipe Lessa, Pedro de
  Medeiros, Rafael Almeida, Renata Palazzo, Rodrigo Senra e outros.</p>
  <p>Revis&#227;o: Pedro Werneck, Osvaldo Santana Neto, Pedro de Medeiros.</p>
  <p>Veja a parte final deste documento para informa&#231;&#245;es mais completas sobre licen&#231;as e
  permiss&#245;es.</p>
  <h3>Resumo:</h3>
  <div class="ABSTRACT">
    <p>Python &#233; uma linguagem de programa&#231;&#227;o poderosa e de f&#225;cil aprendizado. Ela possui estruturas
    de dados de alto-n&#237;vel eficientes, bem como adota uma abordagem simples e efetiva para a programa&#231;&#227;o
    orientada a objetos. Sua sintaxe elegante e tipagem din&#226;mica, em adi&#231;&#227;o &#224; sua natureza
    interpretada, tornam Python ideal para scripting e para o desenvolvimento r&#225;pido de aplica&#231;&#245;es em
    diversas &#225;reas e na maioria das plataformas.</p>
    <p>O interpretador de Python e sua extensa biblioteca padr&#227;o est&#227;o dispon&#237;veis na forma de
    c&#243;digo fonte ou bin&#225;rio para a maioria das plataformas a partir do site, <a class="url" href=
    "http://www.python.org/">http://www.python.org/</a>, e deve ser distribu&#237;dos livremente. No mesmo s&#237;tio
    est&#227;o dispon&#237;veis distribui&#231;&#245;es e refer&#234;ncias para diversos m&#243;dulos, programas,
    ferramentas e documenta&#231;&#227;o adicional contribu&#237;dos por terceiros.</p>
    <p>O interpretador de Python &#233; facilmente extens&#237;vel incorporando novas fun&#231;&#245;es e tipos de
    dados implementados em C ou C++ (ou qualquer outra linguagem acess&#237;vel a partir de C). Python tamb&#233;m se
    adequa como linguagem de extens&#227;o para customizar aplica&#231;&#245;es.</p>
    <p>Este tutorial introduz o leitor informalmente aos conceitos b&#225;sicos e aspectos do sistema e linguagem
    Python. &#201; aconselh&#225;vel ter um interpretador Python dispon&#237;vel para se poder ``por a m&#227;o na
    massa'', por&#233;m todos os exemplos s&#227;o auto-contidos, assim o tutorial tamb&#233;m pode ser lido sem que
    haja a necessidade de se estar on-line.</p>
    <p>Para uma descri&#231;&#227;o dos m&#243;dulos e objetos padr&#227;o, veja o documento <em class=
    "citetitle"><a href="../lib/lib.html" title="Refer&#234;ncia da Biblioteca Python">Refer&#234;ncia da Biblioteca
    Python</a></em>. O <em class="citetitle"><a href="../ref/ref.html" title="Manual de Refer&#234;ncia Python">Manual
    de Refer&#234;ncia Python</a></em> oferece uma defini&#231;&#227;o formal da linguagem. Para se escrever
    extens&#245;es em C ou C++, leia <em class="citetitle"><a href="../ext/ext.html" title=
    "Extendendo e Embutindo o Interpretador Python">Extendendo e Embutindo o Interpretador Python</a></em> e <em class=
    "citetitle"><a href="../api/api.html" title="Manual de Refer&#234;ncia da API Python/C">Manual de Refer&#234;ncia
    da API Python/C</a></em>. Existem tamb&#233;m diversos livros abordando Python em maior profundidade.</p>
    <p>Este tutorial n&#227;o almeja ser abrangente ou abordar todos os aspectos, nem mesmo todos os mais frequentes.
    Ao inv&#233;s disso, ele introduz muitas das caracter&#237;sticas dignas de nota em Python, e fornecer&#225; a
    voc&#234; uma boa id&#233;ia sobre o estilo e o sabor da linguagem. Ap&#243;s a leitura, voc&#234; deve ser capaz
    de ler e escrever programas e m&#243;dulos em Python, e estar&#225; pronto para aprender mais sobre os diversos
    m&#243;dulos de biblioteca descritos na <em class="citetitle"><a href="../lib/lib.html" title=
    "Refer&#234;ncia da Biblioteca Python">Refer&#234;ncia da Biblioteca Python</a></em></p>
    <p>A tradu&#231;&#227;o original do tutorial da vers&#227;o 2.1 foi patrocinada pela GPr Sistemas Ltda
    (http://www.gpr.com.br).</p>
    <p>A atualiza&#231;&#227;o do tutorial para esta vers&#227;o foi realizada por volunt&#225;rios do projeto
    PythonDoc-Brasil. (http://www.pythonbrasil.com.br/moin.cgi/PythonDoc)</p>
  </div>
  <h1>  1. Abrindo o Apetite</h1>Se alguma vez voc&#234; j&#225; escreveu um extenso script de shell, provavelmente se sentiu
  assim: voc&#234; adoraria adicionar mais uma caracter&#237;stica, mas j&#225; est&#225; t&#227;o lento, e t&#227;o
  grande, e t&#227;o complicado; ou a nova caracter&#237;stica implica numa chamada de sistema ou fun&#231;&#227;o
  s&#243; acess&#237;vel a partir do C... Tipicamente o problema em quest&#227;o n&#227;o &#233; s&#233;rio o
  suficiente para motivar a re-escrita do script em C; talvez o problema exija cadeias de caracteres de comprimento
  vari&#225;vel ou tipos (como listas ordenadas de nomes de arquivos) que s&#227;o f&#225;cilmente manipul&#225;veis na
  shell, por&#233;m demandam muito esfor&#231;o de implementa&#231;&#227;o em C, ou talvez voc&#234; nem esteja
  suficientemente familiarizado com C.
  <p>Outra situa&#231;&#227;o: suponha que voc&#234; tenha que trabalhar com diversas bibiotecas em C, e o t&#237;pico
  ciclo escreve/compila/testa/re-compila seja muito lento. Voc&#234; precisa desenvolver software de uma forma mais
  &#225;gil. Ou, suponha que voc&#234; escreveu um programa que precise fazer uso de uma linguagem de extens&#227;o, e
  voc&#234; n&#227;o quer projetar a linguagem, implementar e depurar um interpretador para ela, para s&#243;
  ent&#227;o estabelecer o v&#237;nculo com sua aplica&#231;&#227;o original.</p>
  <p>Nestes casos, Python possivelmente &#233; exatamente do que voc&#234; est&#225; precisando. Python &#233; simples
  de usar, sem deixar de ser uma linguagem de programa&#231;&#227;o de verdade, oferecendo muito mais
  estrutura&#231;&#227;o e suporte para programas extensos do que shell scripts oferecem. Por outro lado, Python
  tamb&#233;m oferece melhor verifica&#231;&#227;o de erros do que C, e por ser uma <em>linguagem de alto
  n&#237;vel</em>, ela possui tipos nativos de alto n&#237;vel: dicion&#225;rios e vetores (<em>arrays</em>)
  flex&#237;veis que lhe custariam dias para obter uma implementa&#231;&#227;o eficiente em C. Devido ao suporte nativo
  a tipos gen&#233;ricos, Python &#233; aplic&#225;vel a um dom&#237;nio de problemas muito mais vasto do que
  <em>Awk</em> ou at&#233; mesmo <em>Perl</em>, ainda assim Python &#233; t&#227;o f&#225;cil de usar quanto essas
  linguagens sob diversos aspectos.</p>
  <p>Python permite que voc&#234; organize seu programa em m&#243;dulos que podem ser reutilizados em outros programas
  escritos em Python. A linguagem prov&#234; uma vasta cole&#231;&#227;o de m&#243;dulos que podem ser utilizados como
  base para sua aplica&#231;&#227;o -- ou como exemplos para estudo e aprofundamento. Alguns desses m&#243;dulos
  implementam manipula&#231;&#227;o de arquivos, chamadas do sistema, sockets, e at&#233; mesmo acesso a bibiotecas de
  constru&#231;&#227;o de interfaces gr&#225;ficas, como Tk.</p>
  <p>Python &#233; uma linguagem interpretada, que pode fazer com que voc&#234; economize um tempo consider&#225;vel,
  uma vez que n&#227;o h&#225; necessidade de compila&#231;&#227;o e vincula&#231;&#227;o(<em>linking</em>) durante o
  desenvolvimento. O interpretador pode ser usado interativamente, o que torna f&#225;cil experimentar diversas
  caracter&#237;sticas da linguagem, escrever programas ``descart&#225;veis'', ou testar fun&#231;&#245;es em um
  desenvolvimento <em>bottom-up</em>. &#201; tamb&#233;m uma &#250;til calculadora de mesa.</p>
  <p>Python permite a escrita de programas compactos e leg&#237;veis. Programas escritos em Python s&#227;o tipicamente
  mais curtos do que seus equivalentes em C ou C++, por diversas raz&#245;es:</p>
  <ul>
    <li>os tipos de alto-n&#237;vel permitem que voc&#234; expresse opera&#231;&#245;es complexas em uma &#250;nico
    comando (<em>statement</em>);</li>
    <li>a defini&#231;&#227;o de bloco &#233; feita por identa&#231;&#227;o ao inv&#233;s de marcadores de in&#237;cio
    e fim de bloco;</li>
    <li>n&#227;o h&#225; necessidade de declara&#231;&#227;o de vari&#225;veis ou par&#226;metros formais;</li>
  </ul>
  <p>Python &#233; extens&#237;vel: se voc&#234; sabe como programar em C, &#233; f&#225;cil adicionar
  fun&#231;&#245;es ou m&#243;dulos diretamente no interpretador, seja para desempenhar opera&#231;&#245;es
  cr&#237;ticas em m&#225;xima velocidade, ou para vincular programas Python a bibliotecas que s&#243; estejam
  dispon&#237;vies em formato bin&#225;rio (como uma bibloteca gr&#225;fica de terceiros). Uma vez que voc&#234; tenha
  sido fisgado, voc&#234; pode vincular o interpretador Python a uma aplica&#231;&#227;o escrita em C e utiliz&#225;-la
  como linguagem de comandos ou extens&#227;o para esta aplica&#231;&#227;o.</p>
  <p>A prop&#243;sito, a linguagem foi batizada a partir do famoso show da BBC ``Monty Python's Flying Circus'' e
  n&#227;o tem nada a ver com repulsivos r&#233;pteis. Fazer refer&#234;ncias &#224; cita&#231;&#245;es do show na
  documenta&#231;&#227;o n&#227;o &#233; s&#243; permitido, como tamb&#233;m &#233; encorajado!</p>
  <p>Agora que voc&#234; est&#225; entusiasmado com Python, vai desejar examin&#225;-la com maior detalhe. Partindo do
  princ&#237;pio que a melhor maneira de aprender uma linguagem &#233; usando-a, voc&#234; est&#225; agora convidado a
  faz&#234;-lo com este tutorial.</p>
  <p>No pr&#243;ximo cap&#237;tulo, a mec&#226;nica de utiliza&#231;&#227;o do interpretador &#233; explicada. Essa
  informa&#231;&#227;o, ainda que mundana, &#233; essencial para a experimenta&#231;&#227;o dos exemplos apresentados
  mais tarde.</p>
  <p>O resto do tutorial introduz diversos aspectos do sistema e linguagem Python por interm&#233;dio de exemplos.
  Ser&#227;o abordadas express&#245;es simples, comandos, tipos, fun&#231;&#245;es e m&#243;dulos. Finalmente,
  ser&#227;o explicados alguns conceitos avan&#231;ados como exce&#231;&#245;es e classes definidas pelo
  usu&#225;rio.</p>
  <h1>  2. Utilizando o Interpretador Python</h1>
  <h1>  2.1 Disparando o Interpretador</h1>
  <p>O interpretador &#233; freq&#252;entemente instalado como <span class="file">/usr/local/bin/python</span> nas
  m&#225;quinas em que &#233; disponibilizado; adicionando <span class="file">/usr/local/bin</span> ao caminho de busca
  (<em>search path</em>) da shell de seu <span class="Unix">Unix</span> torna-se poss&#237;vel inici&#225;-lo
  digitando:</p>
  <div class="verbatim">
    <pre>
python
</pre>
  </div>
  <p>na shell. Considerando que a escolha do diret&#243;rio de instala&#231;&#227;o &#233; uma op&#231;&#227;o de
  instala&#231;&#227;o, outras localiza&#231;&#245;es s&#227;o poss&#237;veis; verifique com seu guru local de Python
  ou com o administrador do sistema. (Ex., <span class="file">/usr/local/python</span> &#233; uma alternativa popular
  para instala&#231;&#227;o.)</p>
  <p>Em computadores com Windows, Python &#233; instalado geralmente em <span class="file">C:\Python24</span>, apesar
  de voc&#234; poder mudar isso enquanto est&#225; executando o instalador. Para adicionar esse diret&#243;rio ao
  <em>path</em>, voc&#234; pode digitar o seguinte comando no DOS:</p>
  <div class="verbatim">
    <pre>
set path=%path%;C:\python24
</pre>
  </div>
  <p>Digitando um caracter EOF() (<kbd>Control-D</kbd> on <span class="Unix">Unix</span>, <kbd>Control-Z</kbd> no
  Windows) diretamente no prompt for&#231;a o interpretador a sair com status de sa&#237;da zero. Se isso n&#227;o
  funcionar, voce pode sair do interpretador atrav&#233;s da digita&#231;&#227;o do seguinte: "<tt class="samp">import
  sys; sys.exit()</tt>".</p>
  <p>As caracter&#237;sticas de edi&#231;&#227;o de linha n&#227;o s&#227;o muito sofisticadas. Sobre <span class=
  "Unix">Unix</span>, seja l&#225; quem for que tenha instalado o interpretador talvez tenha habilitado o suporte
  &#224; biblioteca readline da GNU, que adiciona facilidades mais elaboradas de edi&#231;&#227;o e hist&#243;rico de
  comandos. Teclar <kbd>Control-P</kbd> no primeiro prompt oferecido pelo Python &#233;, provavelmente, a maneira mais
  r&#225;pida de verificar se a edi&#231;&#227;o de linha de comando &#233;e suportada. Se houver um beep, voc&#234;
  possui edi&#231;&#227;o de linha de comando; veja o Ap&#234;ndice <a href="#interacting">A</a> para uma
  introdu&#231;&#227;o as teclas especiais. Se nada acontecer, ou se <code>P</code> aparecer na tela, a op&#231;&#227;o
  de edi&#231;&#227;o n&#227;o est&#225; dispon&#237;vel; voc&#234; apenas ser&#225; capaz de usar o <em>backspace</em>
  para remover caracteres da linha corrente.</p>
  <p>O interpretador trabalha de forma semelhante a uma shell de <span class="Unix">Unix</span>: quando disparado com a
  sa&#237;da padr&#227;o conectadaa um console de terminal (tty device), ele l&#234; e executa comandos
  interativamente; quando disparado com um nome de arquivo como par&#226;metro ou com redirecionamento da entrada
  padr&#227;o para um arquivo, o interpretador ir&#225; ler e executar o <em>script</em> contido em tal arquivo.</p>
  <p>Uma segunda forma de disparar o interpretador &#233; "<tt class="samp"><b class="program">python</b> <b class=
  "programopt">-c</b> <var>command</var> [arg] ...</tt>", que executa o(s) comando(s) especificados na
  posi&#231;&#227;o command, analogamente &#224; op&#231;&#227;o de shell <b class="programopt">-c</b>. Considerando
  que comandos Python possuem freq&#252;entemente espa&#231;os em branco (ou outros caracteres que sejam especiais para
  a shell) &#233; aconselh&#225;vel que o comando especificado em <var>command</var> esteja dentro de aspas duplas.</p>
  <p>Alguns m&#243;dulos Python s&#227;o tamb&#233;m &#250;teis como scripts. Estes podem ser chamados usando
  "<tt class="samp"><b class="program">python</b> <b class="programopt">-m</b> <var>module</var> [arg] ...</tt>", que
  executa o arquivo fonte para <var>module</var> como se voc&#234; tivesse digitado seu caminho completo na linha de
  comando.</p>
  <p>Observe que h&#225; uma diferen&#231;a entre "<tt class="samp">python file</tt>" e "<tt class="samp">python
  &lt;file</tt>". No &#250;ltimo caso, chamadas do tipo <tt class="function">input()</tt> e <tt class=
  "function">raw_input()</tt> ser&#227;o satisfeitas a partir de <em>file</em>. Uma vez que file j&#225; foi
  inteiramente lido antes de que o script Python entrasse em execu&#231;&#227;o, o programa encontrar&#225; o fim de
  arquivo (EOF) imediatamente. J&#225; no primeiro caso, que &#233; o mais frequente (provavelmente o que voc&#234;
  quer), a entrada de dados ser&#225; fornecida pelo dispositivo vinculado &#224; entrada padr&#227;o do
  interpretador.</p>
  <p>Quando um arquivo de script &#233; utilizado, as vezes &#233; &#250;til ser capaz de execut&#225;-lo para logo em
  seguida entrar em modo interativo. Este efeito pode ser obtido pela adi&#231;&#227;o do par&#226;metro -<b class=
  "programopt">i</b> antes do nome do script. (Observe que isto n&#227;o ir&#225; funcionar se o script for lido a
  partir da entrada padr&#227;o, pelas mesmas raz&#245;es explicadas no par&#225;grafo anterior.)</p>
  <h2>  2.1.1 Passagem de Argumentos</h2>
  <p>Quando s&#227;o de conhecimento do interpretador, o nome do script e subseq&#252;entes par&#226;metros da linha de
  comando da shell s&#227;o acess&#237;veis ao pr&#243;prio script atrav&#233;s da vari&#225;vel <code>sys.argv</code>,
  que &#233; uma lista de strings. Essa lista tem sempre ao menos um elemento; quando nenhum script ou par&#226;metro
  forem passados para o interpretador, <code>sys.argv[0]</code> ser&#225; uma lista vazia. Quando o nome do script for
  <code>'-'</code> (significando entrada padr&#227;o), o conte&#250;do de <code>sys.argv[0]</code> ser&#225;
  <code>'-'</code>. Quando for utilizado <b class="programopt">-c</b> <var>command</var>, <code>sys.argv[0]</code>
  conter&#225; <code>'-c'</code>. Quando for utilizado <b class="programopt">-m</b> <var>module</var>,
  <code>sys.argv[0]</code> conter&#225; o caminho completo do m&#243;dulo localizado. Op&#231;&#245;es especificadas
  ap&#243;s <b class="programopt">-c</b> <var>command</var> n&#227;o ser&#227;o consumidas pelo interpretador mas
  armazenadas em <code>sys.argv</code>.</p>
  <h2>  2.1.2 Modo Interativo</h2>
  <p>Quando os comandos s&#227;o lidos a partir do console (<em>tty</em>), diz-se que o interpretador est&#225; em
  <em>modo interativo</em>. Nesse modo ele requisita por um pr&#243;ximo comando atrav&#233;s do <em>prompt
  prim&#225;rio</em>, tipicamente tr&#234;s sinais de maior-que ("<tt class=
  "samp">&gt;<code>&gt;</code>&gt;&nbsp;</tt>"); para linhas de continua&#231;&#227;o do comando corrente, o <em>prompt
  secund&#225;rio</em> default s&#227;o tr&#234;s pontos ("<tt class="samp">...&nbsp;</tt>"). O interpretador imprime
  uma mensagem de boas vindas, informando seu n&#250;mero de vers&#227;o e uma nota legal de copyright antes de
  oferecer o primeiro prompt:</p>
  <div class="verbatim">
    <pre>
python
Python 1.5.2b2 (#1, Feb 28 1999, 00:02:06)  [GCC 2.8.1] on sunos5
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
&gt;&gt;&gt;
</pre>
  </div>
  <p>Linhas de continua&#231;&#227;o s&#227;o necess&#225;rias em constru&#231;&#245;es multi-linha. Como exemplo,
  d&#234; uma olhada nesse comando <tt class="keyword">if</tt>:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; o_mundo_eh_plano = 1
&gt;&gt;&gt; if o_mundo_eh_plano:
...     print "Cuidado para n&#227;o cair fora dele!"
... 
Cuidado para n&#227;o cair fora dele!
</pre>
  </div>
  <h1>  2.2 O Interpretador e seu Ambiente</h1>
  <h2>  2.2.1 Tratamento de Erros</h2>
  <p>Quando ocorre um erro, o interpretador imprime uma mensagem de erro e a situa&#231;&#227;o da pilha (daqui em
  diante <em>stack trace</em>). No modo interativo, retorna-se ao prompt prim&#225;rio; quando a entrada vem de um
  arquivo, o interpretador aborta sua execu&#231;&#227;o com status de erro diferente de zero ap&#243;s imprimir o
  <em>stack trace</em> (Exce&#231;&#245;es tratadas por um <tt class="keyword">except</tt> num bloco <tt class=
  "keyword">try</tt> n&#227;o s&#227;o consideradas erros neste contexto). Alguns erros s&#227;o incondicionalmente
  fatais e causam a sa&#237;da com status diferente de zero; isto se aplica a inconsist&#234;ncias internas e alguns
  casos de exaust&#227;o de mem&#243;ria. Todas as mensagens de erro s&#227;o escritas na sa&#237;da de erros
  padr&#227;o (<em>standard error</em>), enquanto a sa&#237;da dos demais comandos &#233; direcionada para a sa&#237;da
  padr&#227;o.</p>
  <p>Teclando o caracter de interrup&#231;&#227;o (tipicamente Control-C ou DEL) no prompt prim&#225;rio ou
  secund&#225;rio cancela a entrada de dados corrente e retorna-se ao prompt prim&#225;rio. <a name="tex2html1" href=
  "#foot143"><sup>2.1</sup></a> Provocando uma interrup&#231;&#227;o enquanto um comando est&#225; em
  execu&#231;&#227;o levanta a exce&#231;&#227;o <tt class="exception">KeyboardInterrupt</tt>, a qual pode ser tratada
  em um bloco <tt class="keyword">try</tt>.</p>
  <h2>  2.2.2 Scripts Execut&#225;veis em Python</h2>
  <p>Em sistemas <span class="Unix">Unix</span>BSD, scripts Python podem ser transformados em execut&#225;veis, como
  shell scripts, pela inclus&#227;o do cabe&#231;alho</p>
  <div class="verbatim">
    <pre>
#! /usr/bin/env python
</pre>
  </div>
  <p>(Assumindo que o interpretador foi inclu&#237;do do caminho de busca do usu&#225;rio (<a class="envvar" id='l2h-1'
  xml:id='l2h-1'>PATH</a>)) e que o script tenha a permiss&#227;o de acesso habilitada para execu&#231;&#227;o. O
  "<tt class="samp">#!</tt>" deve estar no in&#237;cio do arquivo .Em algumas plataformas esta linha inicial deve ser
  finalizada no estilo <span class="Unix">Unix</span>-style com ("<tt class="character">\n</tt>"), ao inv&#233;s do
  estlo Mac OS ("<tt class="character">\r</tt>") ou mesmo a termina&#231;&#227;o t&#237;pica do Windows ("<tt class=
  "character">\r\n</tt>"). Observe que o caracter "<tt class="character">#</tt>" designa coment&#225;rios em
  Python.</p>
  <p>Para atribuir permiss&#227;o de execu&#231;&#227;o (plataforma Unix) ao seu script Python, utilize o comando
  <b class="program">chmod</b>:</p>
  <div class="verbatim">
    <pre>
$ chmod +x meuscript.py
</pre>
  </div>
  <h2><a name="SECTION004230000000000000000">2.2.3 Codifica&#231;&#227;o em Arquivos de C&#243;digo-fonte</a></h2>
  <p>&#201; poss&#237;vel usar codifica&#231;&#227;o diferente de ASCII() em arquivos de c&#243;digo Python. A melhor
  maneira de faz&#234;-lo &#233; atrav&#233;s de um coment&#225;rio adicional logo ap&#243;s a linha
  <code>#!</code>:</p>
  <div class="verbatim">
    <pre>
<tt>
 # -*- coding: <var>encoding</var> -*- 
 </tt>
</pre>
  </div>
  <p>Com essa declara&#231;&#227;o, todos os caracteres no c&#243;digo-fonte ser&#227;o tratados como
  <var>encoding</var>, mas ser&#225; poss&#237;vel escrever strings Unicode diretamente. A lista de
  codifica&#231;&#245;es poss&#237;veis pode ser encontrada na <em class="citetitle"><a href="../lib/lib.html" title=
  "Refer&#234;ncia da Biblioteca Python">Refer&#234;ncia da Biblioteca Python</a></em>, na se&#231;&#227;o <a class=
  "ulink" href="../lib/module-codecs.html"><tt class="module">codecs</tt></a>.</p>
  <p>Por exemplo, para escrever strings unicode incluindo o s&#237;mbolo monet&#225;rio para o Euro, ISO-8859-15 pode
  ser usado, com o s&#237;mbolo tendo o valor 164. Este script exibir&#225; o valor 8364 (Unicode correspondente ao
  s&#237;mbolo do Euro) e retornar:</p>
  <div class="verbatim">
    <pre>
<tt>
 # -*- coding: iso-8859-15 -*-
 
 currency = u"&#8364;"
 print ord(currency)
 </tt>
</pre>
  </div>
  <p>Se o seu editor &#233; capaz de salvar arquivos <code>UTF-8</code> com um <em>byte order mark</em> (conhecido como
  BOM), voc&#234; pode us&#225;-lo ao inv&#233;s da declara&#231;&#227;o de codifica&#231;&#227;o. O IDLE &#233; capaz
  de fazer isto se <code>Options/General/Default Source Encoding/UTF-8</code> estiver habilitado. Note que esta
  assinatura n&#227;o &#233; reconhecida por vers&#245;es antigas (Python 2.2 e anteriores), e pelo sistema operacional
  para arquivos com a declara&#231;&#227;o <code>#!</code> (usada somente em sistemas <span class=
  "Unix">Unix</span>).</p>
  <p>Usando UTF-8 (seja atrav&#233;s da assinatura ou de uma declara&#231;&#227;o de codifica&#231;&#227;o), caracteres
  da maioria das l&#237;nguas do mundo podem ser usados simultaneamente em strings e coment&#225;rios. N&#227;o &#233;
  poss&#237;vel usar caracteres n&#227;o-ASCII em identificadores. Para exibir todos esses caracteres adequadamente,
  seu editor deve reconhecer que o arquivo &#233; UTF-8, e deve usar uma fonte que tenha todos os caracteres usados no
  arquivo.</p>
  <h2>  2.2.4 O Arquivo de Inicializa&#231;&#227;o para Modo Interativo</h2>
  <p>Quando voc&#234; for utilizar Python interativamente, pode ser &#250;til adicionar uma s&#233;rie de comandos a
  serem executados por default antes de cada sess&#227;o de utiliza&#231;&#227;o do interpretador. Isto pode ser obtido
  pela configura&#231;&#227;o da vari&#225;vel de ambiente <a class="envvar" id='l2h-2' xml:id=
  'l2h-2'>PYTHONSTARTUP</a> para indicar o nome do arquivo script que cont&#233;m o script de inicializa&#231;&#227;o.
  Essa caracter&#237;stica assemelha-se aos arquivos <span class="file">.profile</span> de shells <span class=
  "Unix">Unix</span>.</p>
  <p>O arquivo s&#243; &#233; processado em sess&#245;es interativas, nunca quando Python l&#234; comandos de um script
  especificado como par&#226;metro, nem tampouco quando <span class="file">/dev/tty</span> &#233; especificado como a
  fonte de leitura de comandos (caso contr&#225;rio se comportaria como uma sess&#227;o interativa). O script de
  inicializa&#231;&#227;o &#233; executado no mesmo contexto (doravante <em>namespace</em>) em que os comandos da
  sess&#227;o interativa ser&#227;o executados, sendo assim, os objetos definidos e m&#243;dulos importados podem ser
  utilizados sem qualifica&#231;&#227;o durante a sess&#227;o interativa. &#201; poss&#237;vel tamb&#233;m redefinir os
  prompts <code>sys.ps1</code> e <code>sys.ps2</code> atrav&#233;s deste arquivo.</p>
  <p>Se for necess&#225;rio ler um script adicional de inicializa&#231;&#227;o a partir do diret&#243;rio corrente,
  voc&#234; pode programar isso a partir do script de inicializa&#231;&#227;o global, por exemplo "<tt class="samp">if
  os.path.isfile('.pythonrc.py'): execfile('.pythonrc.py')</tt>". Se voc&#234; deseja utilizar o script de
  inicializa&#231;&#227;o em outro script, voc&#234; deve faz&#234;-lo explicitamente da seguinte forma:</p>
  <div class="verbatim">
    <pre>
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
</pre>
  </div>
  <h1>  3. Uma Introdu&#231;&#227;o Informal a Python</h1>
  <p>Nos exemplos seguintes, pode-se distinguir a entrada da sa&#237;da pela presen&#231;a ou aus&#234;ncia dos prompts
  ("<tt class="samp">&gt;<code>&gt;</code>&gt;&nbsp;</tt>" and "<tt class="samp">...&nbsp;</tt>"): para repetir o
  exemplo, voc&#234; deve digitar tudo ap&#243;s o prompt, quando o mesmo aparece; linhas que n&#227;o come&#231;arem
  com o prompt s&#227;o na verdade as sa&#237;das geradas pelo interpretador.</p>
  <p>Observe que existe um segundo prompt indicando a linha de continua&#231;&#227;o de um comando com m&#250;ltiplas
  linhas, o qual pode ser encerrado pela digita&#231;&#227;o de um linha em branco.</p>
  <p>Muitos dos exemplos neste manual, at&#233; mesmo aqueles digitados interativamente, incluem coment&#225;rios.
  Coment&#225;rios em Python s&#227;o delimitados pelo caracter "<tt class="character">#</tt>", e se extendem at&#233;
  o final da linha. Um coment&#225;rio pode aparecer no in&#237;cio da linha, depois de um espa&#231;o em branco ou
  c&#243;digo, mas nunca dentro de uma string (literal). O delimitar de coment&#225;rio dentro de uma string &#233;
  interpretado como o pr&#243;prio caracter.</p>
  <p>Alguns exemplos:</p>
  <div class="verbatim">
    <pre>
# primeiro coment&#225;rio
SPAM = 1                 # e esse &#233; o segundo coment&#225;rio
                         # ... e ainda um terceiro !
STRING = "# Este n&#227;o &#233; um coment&#225;rio."
</pre>
  </div>
  <h1>  3.1 Utilizando Python Como Uma Calculadora</h1>
  <p>Vamos tentar alguns comandos simples em Python. Inicie o interpretador e aguarde o prompt prim&#225;rio,
  "<tt class="samp">&gt;<code>&gt;</code>&gt;&nbsp;</tt>". (N&#227;o deve demorar muito.)</p>
  <h2>  3.1.1 N&#250;meros</h2>
  <p>O interpretador atua como uma calculadora bem simples: voc&#234; pode digitar uma express&#227;o e o valor
  resultando ser&#225; apresentado ap&#243;s a avalia&#231;&#227;o da express&#227;o. A sintaxe da express&#227;o
  &#233; a usual: operadores <code>+</code>, <code>-</code>, <code>*</code> e <code>/</code> funcionam da mesma forma
  que em outras linguagens tradicionais (por exemplo, Pascal ou C); par&#234;nteses podem ser usados para definir
  agrupamentos. Por exemplo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; 2+2
4
&gt;&gt;&gt; # Isso &#233; um coment&#225;rio
... 2+2
4
&gt;&gt;&gt; 2+2  # e um coment&#225;rio na mesma linha de um comando
4
&gt;&gt;&gt; (50-5*6)/4
5
&gt;&gt;&gt; # Divis&#227;o inteira retorna com aredondamento para base
... 7/3
2
&gt;&gt;&gt; 7/-3
-3
</pre>
  </div>
  <p>O sinal de igual ("<tt class="character">=</tt>") &#233; utilizado para atribui&#231;&#227;o de um valor a uma
  vari&#225;vel. Nenhum resultado &#233; exibido at&#233; o pr&#243;ximo <em>prompt</em> interativo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; width = 20
&gt;&gt;&gt; height = 5*9
&gt;&gt;&gt; width * height
900
</pre>
  </div>
  <p>Um valor pode ser atribu&#237;do a diversas vari&#225;veis simultaneamente:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; x = y = z = 0  # Zero x, y e z
&gt;&gt;&gt; x
0
&gt;&gt;&gt; y
0
&gt;&gt;&gt; z
0
</pre>
  </div>
  <p>H&#225; total suporte para ponto-flutuante; operadores com operandos de diferentes tipos convertem o inteiro para
  ponto-flutuante:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; 3 * 3.75 / 1.5
7.5
&gt;&gt;&gt; 7.0 / 2
3.5
</pre>
  </div>
  <p>N&#250;meros complexos tamb&#233;m s&#227;o suportados; n&#250;meros imagin&#225;rios s&#227;o escritos com o
  sufixo "<tt class="samp">j</tt>" ou "<tt class="samp">J</tt>". N&#250;meros complexos com parte real n&#227;o nula
  s&#227;o escritos como "<tt class="samp">(<var>real</var>+<var>imag</var>j)</tt>", ou podem ser criados pela chamada
  de fun&#231;&#227;o "<tt class="samp">complex(<var>real</var>, <var>imag</var>)</tt>".</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; 1j * 1J
(-1+0j)
&gt;&gt;&gt; 1j * complex(0,1)
(-1+0j)
&gt;&gt;&gt; 3+1j*3
(3+3j)
&gt;&gt;&gt; (3+1j)*3
(9+3j)
&gt;&gt;&gt; (1+2j)/(1+1j)
(1.5+0.5j)
</pre>
  </div>
  <p>N&#250;meros complexos s&#227;o sempre representados por dois n&#250;meros ponto-flutuante, a parte real e a parte
  imagin&#225;ria. Para extrair as partes de um n&#250;mero <var>z</var>, utilize <code><var>z</var>.real</code> e
  <code><var>z</var>.imag</code>.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; a=1.5+0.5j
&gt;&gt;&gt; a.real
1.5
&gt;&gt;&gt; a.imag
0.5
</pre>
  </div>
  <p>As fun&#231;&#245;es de convers&#227;o para ponto-flutuante e inteiro (<tt class="function">float()</tt>,
  <tt class="function">int()</tt> e <tt class="function">long()</tt>) n&#227;o funcionam para n&#250;meros complexos --
  n&#227;o existe maneira correta de converter um n&#250;mero complexo para um n&#250;mero real. Utilize
  <code>abs(<var>z</var>)</code> para obter sua magnitude (como ponto-flutuante) ou <code>z.real</code> para obter sua
  parte real.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; a=3.0+4.0j
&gt;&gt;&gt; float(a)
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in ?
TypeError: can't convert complex to float; use abs(z)
&gt;&gt;&gt; a.real
3.0
&gt;&gt;&gt; a.imag
4.0
&gt;&gt;&gt; abs(a)
5.0
</pre>
  </div>
  <p>No modo interativo, a &#250;ltima express&#227;o a ser impressa &#233; atribu&#237;da a vari&#225;vel
  <code>_</code>. Isso significa que ao utilizar Python como uma calculadora, &#233; muitas vezes mais f&#225;cil
  prosseguir com os c&#225;lculos da seguinte forma:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; tax = 12.5 / 100
&gt;&gt;&gt; price = 100.50
&gt;&gt;&gt; price * tax
12.5625
&gt;&gt;&gt; price + _
113.0625
&gt;&gt;&gt; round(_, 2)
113.06
</pre>
  </div>
  <p>Essa vari&#225;vel especial deve ser tratada somente para leitura pelo usu&#225;rio. Nunca lhe atribua
  explicitamente um valor - do contr&#225;rio, estaria se criando uma outra vari&#225;vel (hom&#244;nima) independente,
  que mascararia o comportamento m&#225;gico da vari&#225;vel especial.</p>
  <h2>  3.1.2 Strings</h2>
  <p>Al&#233;m de n&#250;meros, Python tamb&#233;m pode manipular strings, que podem ser expressas de diversas formas.
  Elas podem ser delimitadas pos aspas simples ou duplas:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; 'spam eggs'
'spam eggs'
&gt;&gt;&gt; 'doesn\'t'
"doesn't"
&gt;&gt;&gt; "doesn't"
"doesn't"
&gt;&gt;&gt; '"Yes," he said.'
'"Yes," he said.'
&gt;&gt;&gt; "\"Yes,\" he said."
'"Yes," he said.'
&gt;&gt;&gt; '"Isn\'t," she said.'
'"Isn\'t," she said.'
</pre>
  </div>
  <p>Strings que cont&#233;m mais de uma linha podem ser constru&#237;das de diversas maneiras. Terminadores de linha
  podem ser embutidos na string com barras invertidas, ex.:</p>
  <div class="verbatim">
    <pre>
oi = "Esta eh uma string longa contendo\n\
diversas linhas de texto assim como voce faria em C.\n\
    Observe que os espa&#231;os em branco no inicio da linha s&#227;o \
 significativos."
print oi
</pre>
  </div>
  <p>Observe que terminadores de linha ainda precisam ser embutidos na string usando <code>\n</code>; a quebra de linha
  ap&#243;s a &#250;ltima barra de escape seria ignorada. Este exemplo produziria o seguinte resultado:</p>
  <div class="verbatim">
    <pre>
Esta eh uma string longa contendo
diversas linhas de texto assim como voce faria em C.
    Observe que os espa&#231;os em branco no inicio da linha s&#227;o significativos.
</pre>
  </div>
  <p>No entanto, se a tornarmos uma string ``crua'' (<em>raw</em>), as sequ&#234;ncias de <code>\n</code> n&#227;o
  s&#227;o convertidas para quebras de linha. Tanto a barra invertida quanto a quebra de linha no c&#243;digo-fonte
  s&#227;o inclu&#237;dos na string como dados. Portanto, o exemplo:</p>
  <div class="verbatim">
    <pre>
oi = r"Esta eh uma string longa contendo\n\
diversas linhas de texto assim como voce faria em C.\n\
    Observe que os espa&#231;os em branco no inicio da linha s&#227;o \
 significativos."
print oi
</pre>
  </div>
  <p>teria como resultado:</p>
  <div class="verbatim">
    <pre>
Esta eh uma string longa contendo\n\
diversas linhas de texto assim como voce faria em C.\n\
    Observe que os espa&#231;os em branco no inicio da linha s&#227;o \
 significativos
</pre>
  </div>
  <p>Ou, strings podem ser delimitadas por pares de aspas tr&#237;plices: <code>"</code> ou <code>'''</code>. Neste
  caso n&#227;o &#233; necess&#225;rio embutir terminadores de linha, pois o texto da string ser&#225; tratado
  verbatim.</p>
  <div class="verbatim">
    <pre>
print """
Usage: thingy [OPTIONS] 
     -h                        Display this usage message
     -H hostname               Hostname to connect to
"""
</pre>
  </div>
  <p>produz a seguinte sa&#237;da:</p>
  <div class="verbatim">
    <pre>
Usage: thingy [OPTIONS] 
     -h                        Display this usage message
     -H hostname               Hostname to connect to
</pre>
  </div>
  <p>O interpretador imprime o resultado de opera&#231;&#245;es sobre strings da mesma forma que as strings s&#227;o
  formatadas na digita&#231;&#227;o: dentro de aspas, e com caracteres especiais embutidos em <em>escape
  sequences</em>, para mostar seu valor com precis&#227;o. A string ser&#225; delimitada por aspas duplas se ela
  cont&#233;m um &#250;nico caracter de aspas simples e nenhum de aspas duplas, caso contr&#225;rio a string ser&#225;
  delimitada por aspas simples. ( O comando <tt class="keyword">print</tt>, descrito posteriormente, pode ser utilizado
  para escrever strings sem aspas ou <em>escape sequences</em>.)</p>
  <p>Strings podem ser concatenadas (coladas) com o operador <code>+</code>, e repetidas com <code>*</code>:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; word = 'Help' + 'A'
&gt;&gt;&gt; word
'HelpA'
&gt;&gt;&gt; '&lt;' + word*5 + '&gt;'
'&lt;HelpAHelpAHelpAHelpAHelpA&gt;'
</pre>
  </div>
  <p>Duas strings literais justapostas s&#227;o automaticamente concatenadas; a primeira linha do exemplo anterior
  poderia ter sido escrita como "<tt class="samp">word = 'Help''A'</tt>"; isso funciona somente com strings literais,
  n&#227;o com express&#245;es arbitr&#225;rias:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; 'str' 'ing'                #  &lt;-  This is ok
'string'
&gt;&gt;&gt; str.strip('str') + 'ing'   #  &lt;-  This is ok
'string'
&gt;&gt;&gt; str.strip('str') 'ing'     #  &lt;-  This is invalid
  File "&lt;stdin&gt;", line 1
    str.strip('str') 'ing'
                            ^
SyntaxError: invalid syntax
</pre>
  </div>
  <p>Strings podem ser indexadas; como em C, o primeiro &#237;ndice da string &#233; o 0. N&#227;o existe um tipo
  separado para caracteres; um caracter &#233; simplesmente uma string unit&#225;ria. Assim como na linguagem Icon,
  substrings podem ser especificadas atrav&#233;s da nota&#231;&#227;o <em>slice</em> (N.d.T: fatiar): dois
  &#237;ndices separados por dois pontos.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; word[4]
'A'
&gt;&gt;&gt; word[0:2]
'He'
&gt;&gt;&gt; word[2:4]
'lp'
</pre>
  </div>
  <p>&#205;ndices de fatias <em>slice</em> seguem uma padroniza&#231;&#227;o &#250;til; a omiss&#227;o do primeiro
  &#237;ndice equivale a zero, a omiss&#227;o do segundo &#237;ndice equivale ao tamanho da string sendo fatiada.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; word[:2]    # Os dois primeiros caracteres
'He'
&gt;&gt;&gt; word[2:]    # Tudo exceto os dois primeiros caracteres
'lpA'
</pre>
  </div>
  <p>Diferentemente de C, strings n&#227;o podem ser alteradas em Python. Atribuir para uma posi&#231;&#227;o
  (&#237;ndice) dentro de uma string resultar&#225; em erro:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; word[0] = 'x'
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in ?
TypeError: object doesn't support item assignment
&gt;&gt;&gt; word[:1] = 'Splat'
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in ?
TypeError: object doesn't support slice assignment
</pre>
  </div>
  <p>Entretanto, criar uma nova string com o conte&#250;do combinado &#233; f&#225;cil e eficiente:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; 'x' + word[1:]
'xelpA'
&gt;&gt;&gt; 'Splat' + word[4]
'SplatA'
</pre>
  </div>
  <p>Aqui est&#225; um invariante interessante relacionado a opera&#231;&#245;es de slice: <code>s[:i] + s[i:]</code>
  equals <code>s</code>.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; word[:2] + word[2:]
'HelpA'
&gt;&gt;&gt; word[:3] + word[3:]
'HelpA'
</pre>
  </div>
  <p>&#205;ndices de slice degenerados s&#227;o tratados ``graciosamente''&nbsp;(N.d.T: este termo indica robustez no
  tratamento de erros): um &#237;ndice muito maior que o comprimento &#233; trocado pelo comprimento, um limitante
  superior que seja menor que o limitante inferior produz uma string vazia como resultado.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; word[1:100]
'elpA'
&gt;&gt;&gt; word[10:]
''
&gt;&gt;&gt; word[2:1]
''
</pre>
  </div>
  <p>&#205;ndices podem ser n&#250;meros negativos, para iniciar a contagem a partir da direita ao inv&#233;s da
  esquerda. Por exemplo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; word[-1]     # O &#250;tlimo caracter
'A'
&gt;&gt;&gt; word[-2]     # O pen&#250;ltimo caracter
'p'
&gt;&gt;&gt; word[-2:]    # Os dois &#250;ltimos caracteres 
'pA'
&gt;&gt;&gt; word[:-2]    # Tudo exceto os dois &#250;ltimos caracteres
'Hel'
</pre>
  </div>
  <p>Observe que -0 &#233; o mesmo que 0, logo neste caso n&#227;o se conta a partir da direita!</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; word[-0]     # ( -0 ==  0)
'H'
</pre>
  </div>
  <p>Intervalos fora dos limites da string s&#227;o truncados, mas n&#227;o tente isso em indexa&#231;&#245;es com um
  &#250;nico &#237;ndice (que n&#227;o seja um slice):</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; word[-100:]
'HelpA'
&gt;&gt;&gt; word[-10]    # error
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1
IndexError: string index out of range
</pre>
  </div>
  <p>A melhor maneira de lembrar como slices funcionam &#233; pensar nos &#237;ndices como ponteiros para os
  espa&#231;os entre caracteres, onde a beirada esquerda do primeiro caracter &#233; 0. Logo a beirada direita do
  &#250;ltimo caracter de uma string de comprimento <var>n</var> tem &#237;ndice <var>n</var>, por exemplo:</p>
  <div class="verbatim">
    <pre>
 +---+---+---+---+---+ 
 | H | e | l | p | A |
 +---+---+---+---+---+ 
 0   1   2   3   4   5 
-5  -4  -3  -2  -1
</pre>
  </div>
  <p>A primeira fileira de n&#250;meros indica a posi&#231;&#227;o dos &#237;ndices 0..5 na string; a segunda fileira
  indica a posi&#231;&#227;o dos respectivos &#237;ndices negativos. Um slice de <var>i</var> at&#233; <var>j</var>
  consiste em todos os caracteres entre as beiradas <var>i</var> e <var>j</var>, respectivamente.</p>
  <p>Para &#237;ndices positivos, o comprimento do slice &#233; a diferen&#231;a entre os &#237;ndices, se ambos
  est&#227;o dentro dos limites da string, ex, o comprimento de <code>word[1:3]</code> &#233; 2.</p>
  <p>A fun&#231;&#227;o interna (N.d.T: interna == <em>built-in</em>) <tt class="function">len()</tt> devolve o
  comprimento de uma string:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; s = 'supercalifragilisticexpialidocious'
&gt;&gt;&gt; len(s)
34
</pre>
  </div>
  <div class="seealso">
    <p class="heading">See Also:</p>
    <dl compact="compact" class="seetitle">
      <dt><em class="citetitle"><a href="../lib/typesseq.html">Sequ&#234;ncias</a></em></dt>
      <dd>Strings, e strings Unicode, descritas na pr&#243;xima se&#231;&#227;o, s&#227;o exemplos de
      <em>sequ&#234;ncias</em> e suportam as opera&#231;&#245;es comuns associadas com esses objetos.</dd>
    </dl>
    <dl compact="compact" class="seetitle">
      <dt><em class="citetitle"><a href="../lib/string-methods.html">M&#233;todos de Strings</a></em></dt>
      <dd>Tanto strings comuns quanto Unicode suportam um grande n&#250;mero de m&#233;todos para busca e
      transforma&#231;&#227;o.</dd>
    </dl>
    <dl compact="compact" class="seetitle">
      <dt><em class="citetitle"><a href="../lib/typesseq-strings.html">Opera&#231;&#245;es de Formata&#231;&#227;o de
      Strings</a></em></dt>
      <dd>As opera&#231;&#245;es de formata&#231;&#227;o em que strings 8-bits e Unicode s&#227;o o operando &#224;
      esquerda do operador <code>%</code> s&#227;o descritas em mais detalhes aqui.</dd>
    </dl>
  </div>
  <h2>  3.1.3 Strings Unicode</h2>
  <p>A partir de Python 2.0 um novo tipo foi introduzido: o objeto Unicode. Ele pode ser usado para armazenar e
  manipular dados Unicode (veja <a class="url" href="http://www.unicode.org/">http://www.unicode.org/</a>) e se integra
  bem aos demais objetos strings pr&#233;-existentes, de forma a realizar auto-convers&#245;es quando
  necess&#225;rio.</p>
  <p>Unicode tem a vantagem de prover um &#250;nico n&#250;mero ordinal para cada caracter usado em textos modernos ou
  antigos. Previamente, havia somente 256 n&#250;meros ordinais. Logo, mapeamentos entre conjuntos de caracteres e os
  256 n&#250;meros ordinais precisavam ser indexados por c&#243;digos de p&#225;gina. Isso levou a uma enorme
  confus&#227;o especialmente no &#226;mbito da internacionaliza&#231;&#227;o (tipicamente escrito como "<tt class=
  "samp">i18n</tt>" - "<tt class="character">i</tt>" + 18 caracteres + "<tt class="character">n</tt>") de software.
  Unicode resolve esses problemas ao definir um &#250;nico c&#243;digo de p&#225;gina para todos os conjuntos de
  caracteres.</p>
  <p>Criar strings Unicode em Python &#233; t&#227;o simples quanto criar strings normais:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; u'Hello World !'
u'Hello World !'
</pre>
  </div>
  <p>O pequeno "<tt class="character">u</tt>" antes das aspas indica a cria&#231;&#227;o de uma string Unicode . Se
  voc&#234; desejar incluir caracteres especiais na string, voc&#234; pode faz&#234;-lo atrav&#233;s da
  codifica&#231;&#227;o Python <em>Unicode-Escape</em>.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; u'Hello\u0020World !'
u'Hello World !'
</pre>
  </div>
  <p>O c&#243;digo de escape <code>\u0020</code> indica a inser&#231;&#227;o do caracter Unicode com valor ordinal
  0x0020 (o espa&#231;o em branco) na posi&#231;&#227;o determinada.</p>
  <p>Os outros caracteres s&#227;o interpretados atrav&#233;s de seus respectivos valores ordinais diretamente para os
  valores ordinais em Unicode. Se voc&#234; possui strings literais na codifica&#231;&#227;o padr&#227;o Latin-1 que
  &#233; utilizada na maioria do oeste europeu, voc&#234; achar&#225; conveniente que os 256 caracteres inferiores do
  Unicode coincidem com os 256 caracteres inferiores do Latin-1.</p>
  <p>Para experts, existe ainda um modo cru (N.d.T: sem processamento de caracteres escape) da mesma forma que existe
  para strings normais. Basta prefixar a string com 'ur' para utilizar a codifica&#231;&#227;o Python
  <em>Raw-Unicode-Escape</em>. S&#243; ser&#225; aplicado a convers&#227;o <code>\ uXXXX</code> se houver um
  n&#250;mero &#237;mpar de barras invertidas antes do escape 'u'.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; ur'Hello\u0020World !'
u'Hello World !'
&gt;&gt;&gt; ur'Hello\\u0020World !'
u'Hello\\\\u0020World !'
</pre>
  </div>
  <p>O modo cru (N.d.T: <em>raw</em>) &#233; muito &#250;til para evitar excesso de barras invertidas, por exemplo, em
  express&#245;es regulares.</p>
  <p>Al&#233;m dessas codifica&#231;&#245;es padr&#227;o, Python oferece um outro conjunto de maneiras de se criar
  strings Unicode sobre uma codifica&#231;&#227;o padr&#227;o.</p>
  <p>A fun&#231;&#227;o interna <tt class="function">unicode()</tt><a id='l2h-3' xml:id='l2h-3'></a> prov&#234; acesso
  a todos os Unicode codecs registrados (COders and DECoders).</p>
  <p>Alguns dos mais conhecidos codecs s&#227;o : <em>Latin-1</em>, <em>ASCII</em>, <em>UTF-8</em>, and
  <em>UTF-16</em>. Os dois &#250;ltimos s&#227;o codifica&#231;&#245;es de tamanho vari&#225;vel para armazenar cada
  caracter Unicode em um ou mais bytes. A codifica&#231;&#227;o default &#233; ASCII, que trata normalmente caracteres
  no intervalo de 0 a 127 mas rejeita qualquer outro com um erro. Quando uma string Unicode &#233; impressa, escrita em
  arquivo ou convertida por <tt class="function">str()</tt>, a codifica&#231;&#227;o padr&#227;o &#233; utilizada.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; u"abc"
u'abc'
&gt;&gt;&gt; str(u"abc")
'abc'
&gt;&gt;&gt; u"&#228;&#246;&#252;"
u'\xe4\xf6\xfc'
&gt;&gt;&gt; str(u"&#228;&#246;&#252;")
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in ?
UnicodeEncodeError: 'ascii' codec can't encode characters in position
0-2: ordinal not in range(128)
</pre>
  </div>
  <p>Para se converter uma string Unicode em uma string 8-bits usando uma codifica&#231;&#227;o espec&#237;fica, basta
  invocar o m&#233;todo <tt class="function">encode()</tt> de objetos Unicode passando como par&#226;metro o nome da
  codifica&#231;&#227;o destino. &#201; prefer&#237;vel utilizar nomes de codifica&#231;&#227;o em letras
  min&#250;sculas.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; u"&#228;&#246;&#252;".encode('utf-8')
'\xc3\xa4\xc3\xb6\xc3\xbc'
</pre>
  </div>
  <p>Tamb&#233;m pode ser utilizada a fun&#231;&#227;o <tt class="function">unicode()</tt> para efetuar a
  conver&#231;&#227;o de um string em outra codifica&#231;&#227;o. Neste caso, o primeiro par&#226;metro &#233; a
  string a ser convertida e o segundo o nome da codifica&#231;&#227;o almejada. O valor de retorno da fun&#231;&#227;o
  &#233; a string na nova codifica&#231;&#227;o.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; unicode('\xc3\xa4\xc3\xb6\xc3\xbc', 'utf-8')
u'\xe4\xf6\xfc'
</pre>
  </div>
  <h2>  3.1.4 Listas</h2>
  <p>Python possui diversas estruturas de dados nativas, utilizadas para agrupar outros valores. A mais vers&#225;til
  delas &#233; a lista (<em>list</em>), que pode ser escrita como uma lista de valores separados por v&#237;rgula e
  entre colchetes. Mais importante, os valores contidos na lista n&#227;o precisam ser do mesmo tipo.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; a = ['spam', 'eggs', 100, 1234]
&gt;&gt;&gt; a
['spam', 'eggs', 100, 1234]
</pre>
  </div>
  <p>Da mesma forma que &#237;ndices de string, &#237;ndices de lista come&#231;am do 0, listas tamb&#233;m podem ser
  concatenadas e sofrer o operador de <em>slice</em>.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; a[0]
'spam'
&gt;&gt;&gt; a[3]
1234
&gt;&gt;&gt; a[-2]
100
&gt;&gt;&gt; a[1:-1]
['eggs', 100]
&gt;&gt;&gt; a[:2] + ['bacon', 2*2]
['spam', 'eggs', 'bacon', 4]
&gt;&gt;&gt; 3*a[:3] + ['Boo!']
['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam', 'eggs', 100, 'Boo!']
</pre>
  </div>
  <p>Diferentemente de strings, que s&#227;o imut&#225;veis, &#233; poss&#237;vel mudar elementos individuais da
  lista:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; a
['spam', 'eggs', 100, 1234]
&gt;&gt;&gt; a[2] = a[2] + 23
&gt;&gt;&gt; a
['spam', 'eggs', 123, 1234]
</pre>
  </div>
  <p>Atribui&#231;&#227;o &#224; fatias (<em>slices</em>) &#233; poss&#237;vel, e isso pode at&#233; alterar o tamanho
  da lista:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; # Replace some items:
... a[0:2] = [1, 12]
&gt;&gt;&gt; a
[1, 12, 123, 1234]
&gt;&gt;&gt; # Remove some:
... a[0:2] = []
&gt;&gt;&gt; a
[123, 1234]
&gt;&gt;&gt; # Insert some:
... a[1:1] = ['bletch', 'xyzzy']
&gt;&gt;&gt; a
[123, 'bletch', 'xyzzy', 1234]
&gt;&gt;&gt; a[:0] = a     # Insert (a copy of) itself at the beginning
&gt;&gt;&gt; a
[123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234]
</pre>
  </div>
  <p>A fun&#231;&#227;o interna <tt class="function">len()</tt> tamb&#233;m se aplica a lista:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; len(a)
8
</pre>
  </div>
  <p>&#201; poss&#237;vel aninhar listas (criar listas contendo outras listas), por exemplo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; q = [2, 3]
&gt;&gt;&gt; p = [1, q, 4]
&gt;&gt;&gt; len(p)
3
&gt;&gt;&gt; p[1]
[2, 3]
&gt;&gt;&gt; p[1][0]
2
&gt;&gt;&gt; p[1].append('xtra')     # See section 5.1
&gt;&gt;&gt; p
[1, [2, 3, 'xtra'], 4]
&gt;&gt;&gt; q
[2, 3, 'xtra']
</pre>
  </div>
  <p>Observe que no &#250;ltimo exemplo, <code>p[1]</code> e <code>q</code> na verdade se referem ao mesmo objeto! Mais
  tarde retornaremos a sem&#226;ntica do objeto.</p>
  <h1>  3.2 Primeiros Passos em Dire&#231;&#227;o &#224; Programa&#231;&#227;o</h1>
  <p>Naturalmente, n&#243;s podemos utilizar Python para tarefas mais complicadas do que somar dois n&#250;meros. A
  t&#237;tulo de exemplifica&#231;&#227;o, n&#243;s podemos escrever o in&#237;cio da sequ&#234;ncia de
  <em>Fibonacci</em> assim:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; # Serie de Fibonacci :
... # A soma de dois elementos define o proximo
... a, b = 0, 1
&gt;&gt;&gt; while b &lt; 10:
...       print b
...       a, b = b, a+b
... 
1
1
2
3
5
8
</pre>
  </div>
  <p>Este exemplo introduz diversas caracter&#237;sticas ainda n&#227;o mencionadas.</p>
  <ul>
    <li>A primeira linha cont&#233;m uma atribui&#231;&#227;o m&#250;ltipla: as vari&#225;veis <code>a</code> e
    <code>b</code> simultaneamente recebem os novos valores 0 e 1. Na &#250;ltima linha h&#225; outro exemplo de
    atribui&#231;&#227;o m&#250;ltipla demonstrando que express&#245;es do lado direito s&#227;o sempre avaliadas
    primeiro, antes da atribui&#231;&#227;o. As express&#245;es do lado direito s&#227;o avaliadas da esquerda para a
    direita.</li>
    <li>O la&#231;o <tt class="keyword">while</tt> executa enquanto a condi&#231;&#227;o (aqui:<code>b &lt; 10</code>)
    permanecer verdadeira. Em Python, como em C, qualquer valor inteiro n&#227;o nulo &#233; considerado verdadeiro
    (valor <em>true</em>), zero tem valor <em>false</em>. A condi&#231;&#227;o pode ser ainda uma lista ou string, na
    verdade qualquer sequ&#234;ncia; qualquer coisa com comprimento n&#227;o nulo tem valor <em>true</em> e
    sequ&#234;ncias vazias tem valor <em>false</em>. O teste utilizado no exemplo &#233; uma simples
    compara&#231;&#227;o. Os operadores padr&#227;o para compara&#231;&#227;o s&#227;o os mesmos de C:
    <code>&lt;</code> (menor que), <code>&gt;</code> (maior que), <code>==</code> (igual), <code>&lt;=</code> (menor ou
    igual), <code>&gt;=</code> (maior ou igual) and <code>!=</code> (diferente).</li>
    <li>O corpo do la&#231;o &#233; identado: identa&#231;&#227;o em Python &#233; a maneira de agrupar comandos.
    Python (ainda!) n&#227;o possui facilidades autom&#225;ticas de edi&#231;&#227;o de linha. Na pr&#225;tica
    voc&#234; ir&#225; preparar scripts Python complexos em um editor de texto; a maioria dos editores de texto possui
    facilidades de identa&#231;&#227;o autom&#225;tica. Quando comandos compostos forem alimentados ao interpretador
    interativamente, devem ser encerrados por uma linha em branco (j&#225; que o <em>parser</em> n&#227;o tem como
    adivinhar qual &#233; a &#250;ltima linha do comando). Observe que toda linha de um mesmo bloco de comandos deve
    possuir a mesma identa&#231;&#227;o.</li>
    <li>O comando <tt class="keyword">print</tt> escreve o valor da express&#227;o dada. Ele difere de apenas escrever
    a express&#227;o no interpretador (como foi feito no exemplo da calculadora) ao aceitar m&#250;ltiplas
    express&#245;es e strings. Strings s&#227;o impressas sem aspas, um espa&#231;o &#233; inserido entre itens de
    forma a formatar o resultado assim:
      <div class="verbatim">
        <pre>
&gt;&gt;&gt; i = 256*256
&gt;&gt;&gt; print 'The value of i is', i
The value of i is 65536
</pre>
      </div>
      <p>Uma v&#237;rgula ao final evita a quebra de linha:</p>
      <div class="verbatim">
        <pre>
&gt;&gt;&gt; a, b = 0, 1
&gt;&gt;&gt; while b &lt; 1000:
...     print b,
...     a, b = b, a+b
... 
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
</pre>
      </div>
      <p>Note que o interpretador insere uma quebra de linha antes de imprimir o pr&#243;ximo prompt se a &#250;ltima
      linha n&#227;o foi completada.</p>
    </li>
  </ul>
  <h1>  4. Mais Ferramentas de Controle de Fluxo</h1>
  <p>Al&#233;m do <tt class="keyword">while</tt> rec&#233;m apresentado, Python possui as estruturas usuais de controle
  de fluxo conhecidas em outras linguagens, com algumas varia&#231;&#245;es:</p>
  <h1>  4.1 Constru&#231;&#227;o <tt class="keyword">if</tt></h1>
  <p>Provavelmente uma das mais conhecidas constru&#231;&#245;es &#233; o <tt class="keyword">if</tt>. Por exemplo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; x = int(raw_input("Por favor entre com um numero inteiro: "))
&gt;&gt;&gt; if x &lt; 0:
...      x = 0
...      print 'Negativo mudou para zero'
... elif x == 0:
...      print 'Zero'
... elif x == 1:
...      print 'Um'
... else:
...      print 'Mais'
...
</pre>
  </div>
  <p>Pode haver zero ou mais se&#231;&#245;es <tt class="keyword">elif</tt>. A se&#231;&#227;o <tt class=
  "keyword">else</tt> &#233; opcional. A palavra-chave `<tt class="keyword">elif</tt>' &#233; uma abrevia&#231;&#227;o
  para `else if', e &#233; &#250;til para evitar identa&#231;&#227;o excessiva. Uma sequ&#234;ncia <tt class=
  "keyword">if</tt> ... <tt class="keyword">elif</tt> ... <tt class="keyword">elif</tt> ... substitui as
  constru&#231;&#245;es <tt class="keyword">switch</tt> e <tt class="keyword">case</tt> encontradas em outras
  linguagens.</p>
  <h1>  4.2 Constru&#231;&#227;o <tt class="keyword">for</tt></h1>
  <p>A constru&#231;&#227;o <tt class="keyword">for</tt><a id='l2h-4' xml:id='l2h-4'></a> em Python difere um pouco do
  que se est&#225; acostumado em C ou Pascal. Ao inv&#233;s de se iterar sobre progress&#245;es aritim&#233;ticas (como
  em Pascal), ou fornecer ao usu&#225;rio a habilidade de definir tanto o passo da itera&#231;&#227;o quanto a
  condi&#231;&#227;o de parada (como em C), o <tt class="keyword">for</tt><a id='l2h-5' xml:id='l2h-5'></a> de Python
  itera sobre os itens de uma sequ&#234;ncia (uma lista ou uma string), na ordem em que aparecem na sequ&#234;ncia. Por
  exemplo :</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; # Medindo algumas strings:
... a = ['gato', 'janela', 'defenestrar']
&gt;&gt;&gt; for x in a:
...     print x, len(x)
... 
gato 4
janela 6
defenestrar 11
</pre>
  </div>
  <p>N&#227;o &#233; seguro modificar a sequ&#234;ncia sobre a qual se baseia o la&#231;o de itera&#231;&#227;o (isto
  s&#243; pode acontecer se a sequ&#234;ncia for mut&#225;vel, isto &#233;, uma lista). Se voc&#234; precisar modificar
  a lista sobre a qual se est&#225; iterando, por exemplo, para duplicar itens selecionados, voc&#234; deve iterar
  sobre uma c&#243;pia da lista ao inv&#233;s da pr&#243;pria. A nota&#231;&#227;o de <em>slice</em> &#233; bastante
  conveniente para isso:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; for x in a[:]: # faz uma c&#243;pia da lista inteira
...    if len(x) &gt; 6: a.insert(0, x)
... 
&gt;&gt;&gt; a
['defenestrar', 'gato', 'janela', 'defenestrar']
</pre>
  </div>
  <h1>  4.3 A Fun&#231;&#227;o <tt class="function">range()</tt></h1>
  <p>Se voc&#234; precisar iterar sobre sequ&#234;ncias num&#233;ricas, a fun&#231;&#227;o interna <tt class=
  "function">range()</tt> &#233; a resposta. Ela gera listas contendo progress&#245;es aritim&#233;ticas, por
  exemplo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
</pre>
  </div>
  <p>O ponto de parada fornecido nunca &#233; gerado na lista; <code>range(10)</code> gera uma lista com 10 valores,
  exatamente os &#237;ndices v&#225;lidos para uma sequ&#234;ncia de comprimento 10. &#201; poss&#237;vel iniciar o
  intervalo em outro n&#250;mero, ou alterar a raz&#227;o da progres&#227;o (inclusive com passo negativo):</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; range(5, 10)
[5, 6, 7, 8, 9]
&gt;&gt;&gt; range(0, 10, 3)
[0, 3, 6, 9]
&gt;&gt;&gt; range(-10, -100, -30)
[-10, -40, -70]
</pre>
  </div>
  <p>Para iterar sobre os &#237;ndices de uma sequ&#234;ncia, combine <tt class="function">range()</tt> e <tt class=
  "function">len()</tt> da seguinte forma:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; a = ['Mary', 'had', 'a', 'little', 'lamb']
&gt;&gt;&gt; for i in range(len(a)):
...     print i, a[i]
... 
0 Mary
1 had
2 a
3 little
4 lamb
</pre>
  </div>
  <h1>  4.4 Cl&#225;usulas <tt class="keyword">break</tt>, <tt class="keyword">continue</tt> e <tt class="keyword">else</tt>
  em La&#231;os</h1>
  <p>O <tt class="keyword">break</tt>, como no C, quebra o la&#231;o mais interno de um <tt class="keyword">for</tt> ou
  <tt class="keyword">while</tt>.</p>
  <p>O <tt class="keyword">continue</tt>, tamb&#233;m emprestado do C, continua o pr&#243;ximo passo do la&#231;o mais
  interno.</p>
  <p>La&#231;os podem ter uma cl&#225;usula <code>else</code>, que &#233; executada sempre que o la&#231;o se encerra
  por exaust&#227;o da lista (no caso do <tt class="keyword">for</tt>) ou quando a condi&#231;&#227;o se torna falsa
  (no caso do <tt class="keyword">while</tt>), mas nunca quando o la&#231;o &#233; encerrado por um <tt class=
  "keyword">break</tt>. Isto &#233; exemplificado no pr&#243;ximo exemplo que procura n&#250;meros primos:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...            print n, 'equals', x, '*', n/x
...            break
...     else:
...          # loop fell through without finding a factor
...          print n, 'is a prime number'
... 
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
</pre>
  </div>
  <h1>  4.5 Constru&#231;&#227;o <tt class="keyword">pass</tt></h1>
  <p>A constru&#231;&#227;o <tt class="keyword">pass</tt> n&#227;o faz nada. Ela pode ser usada quando a sintaxe exige
  um comando mas a sem&#226;ntica do programa n&#227;o requer nenhuma a&#231;&#227;o. Por exemplo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; while True:
...       pass # Busy-wait para interrup&#231;&#227;o de teclado
...
</pre>
  </div>
  <h1>  4.6 Definindo Fun&#231;&#245;es</h1>
  <p>N&#243;s podemos criar uma fun&#231;&#227;o que escreve a s&#233;rie de Fibonacci at&#233; um limite
  arbitr&#225;rio:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; def fib(n):    # escreve  a serie de Fibonacci ate n
...     """Print a Fibonacci series up to n"""
...     a, b = 0, 1
...     while b &lt; n:
...         print b,
...         a, b = b, a+b
... 
&gt;&gt;&gt; # Agora invoca a fun&#231;ao que acabamos de definir
... fib(2000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
</pre>
  </div>
  <p>A palavra-reservada <tt class="keyword">def</tt> serve para definir uma fun&#231;&#227;o. Ela deve ser seguida do
  nome da fun&#231;&#227;o, da lista formal de par&#226;metros entre par&#234;nteses e dois pontos.</p>
  <p>O corpo da fun&#231;&#227;o deve come&#231;ar na linha seguinte e deve ser identado. Opcionalmente, a primeira
  linha do corpo da fun&#231;&#227;o pode ser uma string literal, cujo prop&#243;sito &#233; documentar a
  fun&#231;&#227;o. Se presente, essa string chama-se <i class="dfn">docstring</i>. <a id='l2h-6' xml:id=
  'l2h-6'></a></p>
  <p>Existem ferramentas que utilizam docstrings para produzir automaticamente documenta&#231;&#227;o impressa,
  on-line, ou ainda permitir que o usu&#225;rio navegue interativamente pelo c&#243;digo. &#201; uma boa pr&#225;rica
  incluir sempre docstrings em suas fun&#231;&#245;es, portanto, tente fazer disto um h&#225;bito.</p>
  <p>A execu&#231;&#227;o da fun&#231;&#227;o gera uma nova tabela de s&#237;mbolos utilizada para as vari&#225;veis
  locais da fun&#231;&#227;o, mais precisamente, toda atribui&#231;&#227;o a vari&#225;vel dentro da fun&#231;&#227;o
  armazena o valor na tabela de s&#237;mbolos local. Refer&#234;ncias a vari&#225;veis s&#227;o buscadas primeiramente
  na tabela local, ent&#227;o na tabela de s&#237;mbolos global e finalmente na tabela de s&#237;mbolos interna
  (<em>built-in</em>). Portanto, n&#227;o se pode atribuir diretamente um valor a uma vari&#225;vel global dentro de
  uma fun&#231;&#227;o (a menos que se utilize a declara&#231;&#227;o <tt class="keyword">global</tt> antes), ainda que
  vari&#225;veis globais possam ser referenciadas livremente.</p>
  <p>Os par&#226;metros reais (argumentos) de uma chamada de fun&#231;&#227;o s&#227;o introduzidos na tabela de
  s&#237;mbolos local da fun&#231;&#227;o chamada, portanto, argumentos s&#227;o passados por valor (onde valor &#233;
  sempre uma refer&#234;ncia para objeto, n&#227;o o valor do objeto)<a name="tex2html2" href=
  "#foot1805"><sup>4.1</sup></a> Quando uma fun&#231;&#227;o chama outra, uma nova tabela de s&#237;mbolos &#233;
  criada para tal chamada.</p>
  <p>Uma defini&#231;&#227;o de fun&#231;&#227;o introduz o nome da fun&#231;&#227;o na tabela de s&#237;mbolos
  corrente. O valor do nome da fun&#231;&#227;o possui um tipo que &#233; reconhecido pelo interpretador como uma
  fun&#231;&#227;o definida pelo usu&#225;rio. Esse valor pode ser atribu&#237;do para outros nomes que tamb&#233;m
  podem ser usados como fun&#231;&#245;es. Esse mecanismo serve para renomear fun&#231;&#245;es:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; fib
&lt;function fib at 10042ed0&gt;
&gt;&gt;&gt; f = fib
&gt;&gt;&gt; f(100)
1 1 2 3 5 8 13 21 34 55 89
</pre>
  </div>
  <p>Voc&#234; pode afirmar que <code>fib</code> n&#227;o &#233; uma fun&#231;&#227;o, mas um procedimento. Em Python,
  assim como em C, procedimentos s&#227;o apenas fun&#231;&#245;es que n&#227;o retornam valores. Na verdade, falando
  tecnicamente, procedimentos retornam um valor, ainda que meio chato. Esse valor &#233; chamado <code>None</code>
  (&#233; um nome interno). A escrita do valor None &#233; supressa pelo interpretador se ele estiver sozinho.
  Voc&#234; pode verificar isso se quiser.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; print fib(0)
None
</pre>
  </div>
  <p>&#201; muito simples escrever uma fun&#231;&#227;o que retorna a lista da s&#233;rie de Fibonacci, ao inv&#233;s
  de imprimi-la:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; def fib2(n): 
...     """Retorna a lista contendo a serie de Fibonacci ate n"""
...     result = []
...     a, b = 0, 1
...     while b &lt; n:
...         result.append(b)    # veja abaixo
...         a, b = b, a+b
...     return result
... 
&gt;&gt;&gt; f100 = fib2(100)    # invoca
&gt;&gt;&gt; f100                # escreve resultado
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
</pre>
  </div>
  <p>Este exemplo, como sempre, demonstra algumas caracter&#237;sticas novas:</p>
  <ul>
    <li>A palavra-chave <tt class="keyword">return</tt> termina a fun&#231;&#227;o retornando um valor. Se <tt class=
    "keyword">return</tt> n&#227;o for seguido de nada, ent&#227;o retorna o valor <code>None</code>. Se a
    fun&#231;&#227;o chegar ao fim sem o uso expl&#237;cito do <tt class="keyword">return</tt>, ent&#227;o tamb&#233;m
    ser&#225; retornado o valor <code>None</code>.</li>
    <li>O trecho <code>result.append(b)</code> chama um m&#233;todo do objeto lista <code>result</code>. Um m&#233;todo
    &#233; uma fun&#231;&#227;o que pertence a um objeto e &#233; chamada atrav&#233;s de <code>obj.methodname</code>,
    onde <code>obj</code> &#233; um objeto qualquer, e <code>methodname</code> &#233; o nome de um m&#233;todo que foi
    definido pelo tipo do objeto. Tipos diferentes definem m&#233;todos diferentes. Sobretudo, m&#233;todos de
    diferentes tipos podem ser hom&#244;nimos sem ambiguidade (&#233; poss&#237;vel definir seus pr&#243;prios tipos de
    objetos e m&#233;todos, utilizando <em>classes</em>, como ser&#225; discutido mais tarde neste tutorial).
      <p>O m&#233;todo <tt class="method">append()</tt> mostrado no exemplo, &#233; definido para todos objetos do tipo
      lista. Este m&#233;todo permite a adi&#231;&#227;o de novos elementos &#224; lista. Neste exemplo, ele &#233;
      equivalente a "<tt class="samp">result = result + [b]</tt>", s&#243; que <tt class="method">append()</tt> ainda
      &#233; mais eficiente.</p>
    </li>
  </ul>
  <h1>  4.7 Mais sobre Defini&#231;&#227;o de Fun&#231;&#245;es</h1>
  <p>Ainda &#233; poss&#237;vel definir fun&#231;&#245;es com um n&#250;mero vari&#225;vel de argumentos. Existem
  tr&#234;s formas que podem ser combinadas.</p>
  <h2>  4.7.1 Par&#226;metros com Valores Default</h2>
  <p>A mais &#250;til das tr&#234;s &#233; especificar um valor default para um ou mais argumentos. Isso cria uma
  fun&#231;&#227;o que pode ser invocada com um n&#250;mero menor de argumentos do que quando foi definida.</p>
  <div class="verbatim">
    <pre>
def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
    while 1:
        ok = raw_input(prompt)
        if ok in ('y', 'ye', 'yes'): return True
        if ok in ('n', 'no', 'nop', 'nope'): return False
        retries = retries - 1
        if retries &lt; 0: raise IOError, 'refusenik user'
        print complaint
</pre>
  </div>
  <p>Essa fun&#231;&#227;o pode ser chamada de duas formas: <code>ask_ok('Do you really want to quit?')</code> ou como
  <code>ask_ok('OK to overwrite the file?', 2)</code>.</p>
  <p>Este exemplo tamb&#233;m introduz a keyword <tt class="keyword">in</tt>, que verifica se uma sequ&#234;ncia
  cont&#233;m ou n&#227;o um determinado valor.</p>
  <p>Os valores default s&#227;o avaliados durante a defini&#231;&#227;o da fun&#231;&#227;o, e no escopo em que a
  fun&#231;&#227;o foi definida:</p>
  <div class="verbatim">
    <pre>
i = 5
def f(arg = i): 
    print arg
i = 6
f()
</pre>
  </div>
  <p>ir&#225; imprimir <code>5</code>.</p>
  <p><strong>Aviso importante:</strong> Valores default s&#227;o avaliados apenas uma vez. Isso faz diferen&#231;a
  quando o valor default &#233; um objeto mut&#225;vel como uma lista ou dicion&#225;rio. Por exemplo, a
  fun&#231;&#227;o a seguir acumula os argumentos passados em chamadas subsequentes:</p>
  <div class="verbatim">
    <pre>
def f(a, L=[]):
    L.append(a)
    return L
print f(1)
print f(2)
print f(3)
</pre>
  </div>
  <p>Isso ir&#225; imprimir:</p>
  <div class="verbatim">
    <pre>
[1]
[1, 2]
[1, 2, 3]
</pre>
  </div>
  <p>Se voc&#234; n&#227;o quiser que o valor default seja compartilhado entre chamadas subsequentes, pode reescrever a
  fun&#231;&#227;o assim:</p>
  <div class="verbatim">
    <pre>
def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L
</pre>
  </div>
  <h2>  4.7.2 Par&#226;metros na Forma Chave-Valor</h2>
  <p>Fun&#231;&#245;es tamb&#233;m podem ser chamadas passando argumentos no formato chave-valor como "<tt class=
  "samp"><var>keyword</var> = <var>value</var></tt>". Por exemplo:</p>
  <div class="verbatim">
    <pre>
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
    print "-- This parrot wouldn't", action,
    print "if you put", voltage, "volts through it."
    print "-- Lovely plumage, the", type
    print "-- It's", state, "!"
</pre>
  </div>
  <p>poderia ser chamada em qualquer uma das seguintes maneiras:</p>
  <div class="verbatim">
    <pre>
parrot(1000)
parrot(action = 'VOOOOOM', voltage = 1000000)
parrot('a thousand', state = 'pushing up the daisies')
parrot('a million', 'bereft of life', 'jump')
</pre>
  </div>
  <p>por&#233;m, existem maneiras inv&#225;lidas:</p>
  <div class="verbatim">
    <pre>
parrot()                     # par&#226;metro exigido faltando
parrot(voltage=5.0, 'dead')  # par&#226;metro n&#227;o-chave-valor depois de par&#226;metro chave-valor
parrot(110, voltage=220)     # valor duplicado para mesmo par&#226;metro
parrot(actor='John Cleese')  # par&#226;metro desconhecido
</pre>
  </div>
  <p>Em geral, uma lista de argumentos tem que apresentar todos argumentos posicionais antes de qualquer um dos seus
  argumentos chave-valor, onde as chaves t&#234;m que ser escolhidas a partir dos nomes formais dos argumentos.
  N&#227;o &#233; importante se um dado argumento j&#225; possuia valor default ou n&#227;o. Nenhum argumento deve
  receber um valor mais do que uma &#250;nica vez. Nomes de par&#226;metros formais correspondendo a argumentos
  posicionais n&#227;o podem ser usados na forma chave-valor em uma mesma chamada. O pr&#243;ximo exemplo ilustra essa
  limita&#231;&#227;o.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; def function(a):
...     pass
... 
&gt;&gt;&gt; function(0, a=0)
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in ?
TypeError: function() got multiple values for keyword argument 'a'
</pre>
  </div>
  <p>Quando o &#250;ltimo par&#226;metro formal for <code>**<var>name</var></code>, ele armazenar&#225; todos os
  par&#226;metros efetivamente passados para a fun&#231;&#227;o, exceto aqueles que n&#227;o correspondiam a
  par&#226;metros formais. Isto pode ser combinado com o par&#226;metro formal <code>*<var>name</var></code> (descrito
  na pr&#243;xima sub-se&#231;&#227;o) que recebe a lista contendo todos argumentos posicionais que n&#227;o
  correspondiam a par&#226;metros formais. O importante &#233; que (<code>*<var>name</var></code> deve ser declarado
  antes de <code>**<var>name</var></code>.) Siga o exemplo:</p>
  <div class="verbatim">
    <pre>
def cheeseshop(kind, *arguments, **keywords):
    print "-- Do you have any", kind, '?'
    print "-- I'm sorry, we're all out of", kind
    for arg in arguments: print arg
    print '-'*40
    keys = keywords.keys()
    keys.sort()
    for kw in keys: print kw, ':', keywords[kw]
</pre>
  </div>
  <p>Poderia ser chamado assim:</p>
  <div class="verbatim">
    <pre>
cheeseshop('Limburger', "It's very runny, sir.",
           "It's really very, VERY runny, sir.",
           client='John Cleese',
           shopkeeper='Michael Palin',
           sketch='Cheese Shop Sketch')
</pre>
  </div>
  <p>e, naturalmente, produziria:</p>
  <div class="verbatim">
    <pre>
-- Do you have any Limburger ?
-- I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
----------------------------------------
client : John Cleese
shopkeeper : Michael Palin
sketch : Cheese Shop Sketch
</pre>
  </div>
  <p>Note que o m&#233;todo <tt class="method">sort()</tt> da lista de chaves em <em>keywords</em> &#233; chamado antes
  de exibir o conte&#250;do do dicion&#225;rio; se isso n&#227;o fosse feito, eles seriam exibidos em ordem
  arbitr&#225;ria.</p>
  <h2>  4.7.3 Listas Arbitr&#225;rias de Argumentos</h2>
  <p>Finalmente, a op&#231;&#227;o menos frequentemente usada &#233; chamar a fun&#231;&#227;o com um n&#250;mero
  arbitr&#225;rio de argumentos. Esses argumentos ser&#227;o encapsulados em uma sequ&#234;ncia (tupla). Antes do
  n&#250;mero vari&#225;vel de argumentos, zero ou mais argumentos normais podem estar presentes.</p>
  <div class="verbatim">
    <pre>
def fprintf(file, format, *args):
    file.write(format % args)
</pre>
  </div>
  <h2>  4.7.4 Desempacotando Listas de Argumentos</h2>
  <p>A situa&#231;&#227;o inversa ocorre quando os argumentos j&#225; est&#227;o numa lista ou tupla mas &#233;
  necess&#225;rio que elas sejam desempacotadas para uma chamada de fun&#231;&#227;o que requer argumentos separados.
  Por exemplo, a fun&#231;&#227;o <tt class="function">range()</tt> espera argumentos separados, <var>start</var> e
  <var>stop</var>. Se eles n&#227;o estiverem dispon&#237;veis separadamente, escreva a chamada de fun&#231;&#227;o com
  o operador <code>*</code> para retir&#225;-los da lista ou tupla:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; range(3, 6)             # normal call with separate arguments
[3, 4, 5]
&gt;&gt;&gt; args = [3, 6]
&gt;&gt;&gt; range(*args)            # call with arguments unpacked from a list
[3, 4, 5]
</pre>
  </div>
  <h2>  4.7.5 Fun&#231;&#245;es Lambda</h2>
  <p>Dada a demanda do p&#250;blico, algumas caracter&#237;sticas encontradas em linguagens de programa&#231;&#227;o
  funcionais (como Lisp) foram adicionadas a Python. Com a palavra-chave <tt class="keyword">lambda</tt>,
  fun&#231;&#245;es curtas e an&#244;nimas podem ser criadas.</p>
  <p>Aqui est&#225; uma fun&#231;&#227;o que devolve a soma de seus dois argumentos: "<tt class="samp">lambda a, b:
  a+b</tt>". Fun&#231;&#245;es Lambda podem ser utilizadas em qualquer lugar que exigiria uma fun&#231;&#227;o
  tradicional. Sintaticamente, fun&#231;&#245;es Lambda est&#227;o restritas a uma &#250;nica express&#227;o.
  Semanticamente, ela s&#227;o apenas a&#231;&#250;car sint&#225;tico para a defini&#231;&#227;o de fun&#231;&#245;es
  normais. Assim como defini&#231;&#245;es de fun&#231;&#245;es aninhadas, fun&#231;&#245;es lambda n&#227;o podem
  referenciar vari&#225;veis de um escopo mais externo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; def make_incrementor(n):
...     return lambda x: x + n
...
&gt;&gt;&gt; f = make_incrementor(42)
&gt;&gt;&gt; f(0)
42
&gt;&gt;&gt; f(1)
43
</pre>
  </div>
  <h2>  4.7.6 Strings de Documenta&#231;&#227;o</h2>
  <p>H&#225; uma conven&#231;&#227;o sobre o conte&#250;do e formato de strings de documenta&#231;&#227;o. <a id=
  'l2h-7' xml:id='l2h-7'></a></p>
  <p>A primeira linha deve ser sempre curta, representando um consiso sum&#225;rio do prop&#243;sito do objeto. Por
  brevidade, n&#227;o deve explicitamente se referir ao nome ou tipo do objeto, uma vez que estas informa&#231;&#245;es
  est&#227;o dispon&#237;vies por outros meios (exceto se o nome da fun&#231;&#227;o for o pr&#243;prio verbo que
  descreve a finalidade da fun&#231;&#227;o). Essa linha deve come&#231;ar com letra mai&#250;scula e terminar com
  ponto.</p>
  <p>Se existem m&#250;ltiplas linhas na string de documenta&#231;&#227;o, a segunda linha deve estar em branco,
  visulamente separando o sum&#225;rio do resto da descri&#231;&#227;o. As linhas seguintes devem conter um ou mais
  par&#225;grafos descrevendo as conven&#231;&#245;es de chamada ao objeto, seus efeitos colaterais, etc.</p>
  <p>O parser do Python n&#227;o toca na identa&#231;&#227;o de coment&#225;rios multi-linha. Portanto, ferramentas que
  processem strings de documenta&#231;&#227;o precisam lidar com isso (se desejado). Existe uma conven&#231;&#227;o
  para isso. A primeira linha n&#227;o nula ap&#243;s a linha de sum&#225;rio determina a identa&#231;&#227;o para o
  resto da string de documenta&#231;&#227;o. A partir da&#237;, espa&#231;os em branco podem ser removidos de todas as
  linhas da string.</p>
  <p>Aqui est&#225; um exemplo de uma docstring multi-linha:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; def my_function():
...     """Do nothing, but document it.
... 
...     No, really, it doesn't do anything.
...     """
...     pass
... 
&gt;&gt;&gt; print my_function.__doc__
Do nothing, but document it.
    No, really, it doesn't do anything.
</pre>
  </div>
  <h1>  5. Estruturas de Dados</h1>
  <p>Este cap&#237;tulo descreve alguns pontos j&#225; abordados, por&#233;m com mais detalhes, e ainda adiciona outros
  pontos in&#233;ditos.</p>
  <h1>  5.1 Mais sobre Listas</h1>
  <p>O tipo <em>list</em> possui mais m&#233;todos. Aqui est&#227;o todos os m&#233;todos dispon&#237;vies em um objeto
  lista.</p>
  <dl>
    <dd>
      <table cellpadding="0" cellspacing="0">
        <tr valign="baseline">
          <td><nobr><b><tt id='l2h-8' xml:id='l2h-8' class="method">append</tt></b>(</nobr></td>
          <td><var>x</var>)</td>
        </tr>
      </table>
    </dd>
    <dd>Adiciona um item ao fim da lista; equivalente a <code>a[len(a):] = [<var>x</var>]</code>.</dd>
  </dl>
  <dl>
    <dd>
      <table cellpadding="0" cellspacing="0">
        <tr valign="baseline">
          <td><nobr><b><tt id='l2h-9' xml:id='l2h-9' class="method">extend</tt></b>(</nobr></td>
          <td><var>L</var>)</td>
        </tr>
      </table>
    </dd>
    <dd>Extende a lista adicionando no fim todos os elementos da lista passada como par&#226;metro; equivalente a
    <code>a[len(a):] = <var>L</var></code>.</dd>
  </dl>
  <dl>
    <dd>
      <table cellpadding="0" cellspacing="0">
        <tr valign="baseline">
          <td><nobr><b><tt id='l2h-10' xml:id='l2h-10' class="method">insert</tt></b>(</nobr></td>
          <td><var>i, x</var>)</td>
        </tr>
      </table>
    </dd>
    <dd>Insere um item em uma posi&#231;&#227;o especificada. O primeiro argumento &#233; o &#237;ndice do elemento
    anterior ao que est&#225; para ser inserido, assim <code>a.insert(0, <var>x</var>)</code> insere no in&#237;cio da
    lista, e <code>a.insert(len(a), <var>x</var>)</code> &#233; equivalente a <code>a.append(<var>x</var>)</code>.</dd>
  </dl>
  <dl>
    <dd>
      <table cellpadding="0" cellspacing="0">
        <tr valign="baseline">
          <td><nobr><b><tt id='l2h-11' xml:id='l2h-11' class="method">remove</tt></b>(</nobr></td>
          <td><var>x</var>)</td>
        </tr>
      </table>
    </dd>
    <dd>Remove o primeiro item da lista cujo valor &#233; <var>x</var>. &#201; gerado um erro se este valor n&#227;o
    existir.</dd>
  </dl>
  <dl>
    <dd>
      <table cellpadding="0" cellspacing="0">
        <tr valign="baseline">
          <td><nobr><b><tt id='l2h-12' xml:id='l2h-12' class="method">pop</tt></b>(</nobr></td>
          <td><big>[</big><var>i</var><big>]</big>)</td>
        </tr>
      </table>
    </dd>
    <dd>Remove o item na posi&#231;&#227;o dada e o retorna. Se nenhum item for especificado, <code>a.pop()</code>
    remove e retorna o &#250;ltimo item na lista. (Os colchetes ao redor de <var>i</var> indicam que o par&#226;metro
    &#233; opcional, n&#227;o que voc&#234; deva digit&#225;-los naquela posi&#231;&#227;o. Voc&#234; ver&#225; essa
    nota&#231;&#227;o com frequ&#234;ncia na <em class="citetitle"><a href="../lib/lib.html" title=
    "Refer&#234;ncia da Biblioteca Python">Refer&#234;ncia da Biblioteca Python</a></em>.)</dd>
  </dl>
  <dl>
    <dd>
      <table cellpadding="0" cellspacing="0">
        <tr valign="baseline">
          <td><nobr><b><tt id='l2h-13' xml:id='l2h-13' class="method">index</tt></b>(</nobr></td>
          <td><var>x</var>)</td>
        </tr>
      </table>
    </dd>
    <dd>Retorna o &#237;ndice do primeiro item cujo valor &#233; igual ao argumento fornecido em <var>x</var>, gerando
    erro se este valor n&#227;o existe</dd>
  </dl>
  <dl>
    <dd>
      <table cellpadding="0" cellspacing="0">
        <tr valign="baseline">
          <td><nobr><b><tt id='l2h-14' xml:id='l2h-14' class="method">count</tt></b>(</nobr></td>
          <td><var>x</var>)</td>
        </tr>
      </table>
    </dd>
    <dd>Retorna o n&#250;mero de vezes que o valor <var>x</var> aparece na lista.</dd>
  </dl>
  <dl>
    <dd>
      <table cellpadding="0" cellspacing="0">
        <tr valign="baseline">
          <td><nobr><b><tt id='l2h-15' xml:id='l2h-15' class="method">sort</tt></b>(</nobr></td>
          <td>)</td>
        </tr>
      </table>
    </dd>
    <dd>Ordena os itens da lista sem gerar uma nova lista.</dd>
  </dl>
  <dl>
    <dd>
      <table cellpadding="0" cellspacing="0">
        <tr valign="baseline">
          <td><nobr><b><tt id='l2h-16' xml:id='l2h-16' class="method">reverse</tt></b>(</nobr></td>
          <td>)</td>
        </tr>
      </table>
    </dd>
    <dd>Inverte a ordem dos elementos na lista sem gerar uma nova lista.</dd>
  </dl>
  <p>Um exemplo que utiliza a maioria dos m&#233;todos:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; a = [66.25, 333, 333, 1, 1234.5]
&gt;&gt;&gt; print a.count(333), a.count(66.25), a.count('x')
2 1 0
&gt;&gt;&gt; a.insert(2, -1)
&gt;&gt;&gt; a.append(333)
&gt;&gt;&gt; a
[66.25, 333, -1, 333, 1, 1234.5, 333]
&gt;&gt;&gt; a.index(333)
1
&gt;&gt;&gt; a.remove(333)
&gt;&gt;&gt; a
[66.25, -1, 333, 1, 1234.5, 333]
&gt;&gt;&gt; a.reverse()
&gt;&gt;&gt; a
[333, 1234.5, 1, 333, -1, 66.25]
&gt;&gt;&gt; a.sort()
&gt;&gt;&gt; a
[-1, 1, 66.25, 333, 333, 1234.5]
</pre>
  </div>
  <h2>  5.1.1 Usando Listas como Pilhas</h2>
  <p>Os m&#233;todos de lista tornam muito f&#225;cil utilizar listas como pilhas, onde o item adicionado por
  &#250;ltimo &#233; o primeiro a ser recuperado (pol&#237;tica ``&#250;ltimo a entrar, primeiro a sair''). Para
  adicionar um item ao topo da pilha, use <tt class="method">append()</tt>. Para recuperar um item do topo da pilha use
  <tt class="method">pop()</tt> sem nenhum &#237;ndice. Por exemplo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; stack = [3, 4, 5]
&gt;&gt;&gt; stack.append(6)
&gt;&gt;&gt; stack.append(7)
&gt;&gt;&gt; stack
[3, 4, 5, 6, 7]
&gt;&gt;&gt; stack.pop()
7
&gt;&gt;&gt; stack
[3, 4, 5, 6]
&gt;&gt;&gt; stack.pop()
6
&gt;&gt;&gt; stack.pop()
5
&gt;&gt;&gt; stack
[3, 4]
</pre>
  </div>
  <h2>  5.1.2 Usando Listas como Filas</h2>
  <p>Voc&#234; pode tamb&#233;m utilizar uma lista como uma fila, onde o primeiro item adicionado &#233; o primeiro a
  ser recuperado (pol&#237;tica ``primeiro a entrar, primeiro a sair''). Para adicionar um elemento ao fim da fila
  utiliza <tt class="method">append()</tt>. Para recuperar um elemento do in&#237;cio da fila use <tt class=
  "method">pop()</tt> com <code>0</code> no &#237;ndice. Por exemplo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; queue = ["Eric", "John", "Michael"]
&gt;&gt;&gt; queue.append("Terry")           # Terry arrives
&gt;&gt;&gt; queue.append("Graham")          # Graham arrives
&gt;&gt;&gt; queue.pop(0)
'Eric'
&gt;&gt;&gt; queue.pop(0)
'John'
&gt;&gt;&gt; queue
['Michael', 'Terry', 'Graham']
</pre>
  </div>
  <h2>  5.1.3 Ferramentas para Programa&#231;&#227;o Funcional</h2>
  <p>Existem tr&#234;s fun&#231;&#245;es internas que s&#227;o muito &#250;teis sobre listas: <tt class=
  "function">filter()</tt>, <tt class="function">map()</tt>, e <tt class="function">reduce()</tt>.</p>
  <p>"<tt class="samp">filter(<var>function</var>, <var>sequence</var>)</tt>" retorna uma sequ&#234;ncia consistindo
  dos itens pertencentes a sequ&#234;ncia para os quais <code><var>function</var>(<var>item</var>)</code> &#233;
  verdadeiro. If se a sequ&#234;ncia for <tt class="class">string</tt> ou <tt class="class">tuple</tt>, o resultado
  ser&#225; sempre do mesmo tipo; caso contr&#225;rio, ser&#225; sempre uma lista. Por exemplo, para computar
  n&#250;meros primos:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; def f(x): return x % 2 != 0 and x % 3 != 0
...
&gt;&gt;&gt; filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]
</pre>
  </div>
  <p>"<tt class="samp">map(<var>function</var>, <var>sequence</var>)</tt>" aplica
  <code><var>function</var>(<var>item</var>)</code> para cada item da sequ&#234;ncia e retorna a lista de valores
  retornados a cada aplica&#231;&#227;o. Por exemplo, para computar quadrados:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; def cube(x): return x*x*x
...
&gt;&gt;&gt; map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
</pre>
  </div>
  <p>Mais de uma sequ&#234;ncia pode ser passada; a fun&#231;&#227;o a ser aplicada deve possuir tantos par&#226;metros
  formais quantas sequ&#234;ncias forem alimentadas para "<tt class="samp">map</tt>", e &#233; chamada com o item
  correspondente de cada sequ&#234;ncia (ou <code>None</code> caso se uma sequ&#234;ncia for menor que a outra). Se
  <code>None</code> for passado no lugar da fun&#231;&#227;o, ent&#227;o ser&#225; aplicada uma fun&#231;&#227;o que
  apenas devolve os argumentos recebidos.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; seq = range(8)
&gt;&gt;&gt; def square(x, y): return x+y
...
&gt;&gt;&gt; map(add, seq, seq)
[0, 2, 4, 6, 8, 10, 12, 14]
</pre>
  </div>
  <p>"<tt class="samp">reduce(<var>function</var>, <var>sequence</var>)</tt>" retorna um &#250;nico valor
  constru&#237;do a partir da sucessiva aplica&#231;&#227;o da fun&#231;&#227;o bin&#225;ria <var>function</var> a
  todos os elementos da lista fornecida, dois de cada vez. Por exemplo, para computar a soma dos 10 primeiros
  n&#250;meros inteiros:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; def add(x,y): return x+y
...
&gt;&gt;&gt; reduce(add, range(1, 11))
55
</pre>
  </div>
  <p>Se apenas houver um &#250;nico elemento na sequ&#234;ncia fornecida como par&#226;metro, ent&#227;o seu valor
  ser&#225; retornado. Se a sequ&#234;ncia for vazia uma exce&#231;&#227;o ser&#225; levantada.</p>
  <p>Um terceiro argumento pode ser passado para indicar o valor inicial. Neste caso, redu&#231;&#227;o de
  sequ&#234;ncias vazias retornar&#225; o valor inicial. Se a sequ&#234;ncia n&#227;o for vazia, a redu&#231;&#227;o se
  iniciar&#225; a partir do valor inicial.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; def sum(seq):
...     def add(x,y): return x+y
...     return reduce(add, seq, 0)
... 
&gt;&gt;&gt; sum(range(1, 11))
55
&gt;&gt;&gt; sum([])
0
</pre>
  </div>
  <p>N&#227;o use este exemplo de fun&#231;&#227;o para somar: como somar n&#250;meros &#233; uma necessidade comum,
  fornecemos uma fun&#231;&#227;o <code>sum(<var>sequence</var>)</code> que funciona exatamente como essa. <span class=
  "versionnote">New in version 2.3.</span></p>
  <h2><a name="SECTION007140000000000000000">5.1.4 Abrang&#234;ncia de Lista (<em>List Comprehensions</em>)</a></h2>
  <p>Abrang&#234;ncia de listas (ou <em>list comprehensions</em>) permitem a cria&#231;&#227;o de listas de forma
  concisa sem apelar para o uso de <tt class="function">map()</tt>, <tt class="function">filter()</tt> e/ou <tt class=
  "keyword">lambda</tt>. A defini&#231;&#227;o resultante tende a ser mais clara do que o uso das constru&#231;&#245;es
  funcionais citadas anteriormente. Cada abrang&#234;ncia de lista consiste numa express&#227;o seguida da
  cl&#225;usula <tt class="keyword">for</tt>, e ent&#227;o zero ou mais cl&#225;usulas <tt class="keyword">for</tt> ou
  <tt class="keyword">if</tt>. O resultado ser&#225; uma lista proveniente da avalia&#231;&#227;o da express&#227;o no
  contexto das cl&#225;usulas <tt class="keyword">for</tt> e <tt class="keyword">if</tt> subsequentes. Se a
  express&#227;o gerar uma tupla, a mesma deve ser inserida entre par&#234;nteses.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']
&gt;&gt;&gt; [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']
&gt;&gt;&gt; vec = [2, 4, 6]
&gt;&gt;&gt; [3*x for x in vec]
[6, 12, 18]
&gt;&gt;&gt; [3*x for x in vec if x &gt; 3]
[12, 18]
&gt;&gt;&gt; [3*x for x in vec if x &lt; 2]
[]
&gt;&gt;&gt; [[x,x**2] for x in vec]
[[2, 4], [4, 16], [6, 36]]
&gt;&gt;&gt; [x, x**2 for x in vec]  # erro - parenteses requerido para tuplas
  File "&lt;stdin&gt;", line 1 in ?
    [x, x**2 for x in vec]
               ^
SyntaxError: invalid syntax
&gt;&gt;&gt; [(x, x**2) for x in vec]
[(2, 4), (4, 16), (6, 36)]
&gt;&gt;&gt; vec1 = [2, 4, 6]
&gt;&gt;&gt; vec2 = [4, 3, -9]
&gt;&gt;&gt; [x*y for x in vec1 for y in vec2]
[8, 6, -18, 16, 12, -36, 24, 18, -54]
&gt;&gt;&gt; [x+y for x in vec1 for y in vec2]
[6, 5, -7, 8, 7, -5, 10, 9, -3]
&gt;&gt;&gt; [vec1[i]*vec2[i] for i in range(len(vec1))]
[8, 12, -54]
</pre>
  </div>
  <p>Abrang&#234;ncia de listas &#233; muito mais flex&#237;vel do que <tt class="function">map()</tt> e pode ser
  aplicada a express&#245;es complexas e fun&#231;&#245;es aninhadas:</p>
  <h1>  5.2 O comando <tt class="keyword">del</tt></h1>
  <p>Existe uma maneira de remover um item de uma lista a partir de seu &#237;ndice, ao inv&#233;s de seu valor: o
  comando <tt class="keyword">del</tt>. Ele difere do m&#233;todo <tt class="method">pop</tt>, que retorna o item
  removido. Ele tamb&#233;m pode ser utilizado para remover fatias (<em>slices</em>) da lista. Por exemplo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; a = [-1, 1, 66.25, 333, 333, 1234.5]
&gt;&gt;&gt; del a[0]
&gt;&gt;&gt; a
[1, 66.25, 333, 333, 1234.5]
&gt;&gt;&gt; del a[2:4]
&gt;&gt;&gt; a
[1, 66.25, 1234.5]
</pre>
  </div>
  <p><tt class="keyword">del</tt> tamb&#233;m pode ser utilizado para apagar vari&#225;veis:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; del a
</pre>
  </div>
  <p>Referenciar a vari&#225;vel <code>a</code> posteriormente a sua remo&#231;&#227;o constitui erro (pelo menos
  at&#233; que seja feita uma nova atribui&#231;&#227;o para ela). N&#243;s encontraremos outros usos para o comando
  <tt class="keyword">del</tt> mais tarde.</p>
  <h1>  5.3 Tuplas e Sequ&#234;ncias</h1>
  <p>N&#243;s vimos que listas e strings possuem muitas propriedades em comum como indexa&#231;&#227;o e
  opera&#231;&#245;es de <em>slicing</em>. Elas s&#227;o dois dos exemplos poss&#237;veis de <a class="ulink" href=
  "../lib/typesseq.html"><em>sequ&#234;ncias</em></a>. Como Python &#233; uma linguagem em evolu&#231;&#227;o, outros
  tipos de sequ&#234;ncias podem ser adicionados. Existe ainda um outro tipo de sequ&#234;ncia j&#225; presente na
  linguagem: a tupla (<em>tuple</em>).</p>
  <p>Uma tupla consiste em uma sequ&#234;ncia imut&#225;vel de valores separados por v&#237;rgulas.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; t = 12345, 54321, 'hello!'
&gt;&gt;&gt; t[0]
12345
&gt;&gt;&gt; t
(12345, 54321, 'hello!')
&gt;&gt;&gt; # Tuplas podem ser aninhadas:
... u = t, (1, 2, 3, 4, 5)
&gt;&gt;&gt; u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))
</pre>
  </div>
  <p>Como voc&#234; pode ver no trecho acima, tuplas s&#227;o sempre envolvidas por par&#234;nteses. Na
  cria&#231;&#227;o, tuplas podem ser envolvidas ou n&#227;o por par&#234;nteses, desde que o contexto n&#227;o exija
  os par&#234;nteses (como no caso da tupla pertencer a uma express&#227;o maior).</p>
  <p>Tuplas podem ser usadas de diversas formas: pares ordenados, registros de empregados em uma base de dados, etc.
  Tuplas, assim como strings, s&#227;o imut&#225;veis. N&#227;o &#233; poss&#237;vel atribuir valores a itens
  individuais de uma tupla (voc&#234; pode simular o mesmo efeito atrav&#233;s de opera&#231;&#245;es de fatiamento e
  concatena&#231;&#227;o). Tamb&#233;m &#233; poss&#237;vel criar tuplas contendo objetos mut&#225;veis, como
  listas.</p>
  <p>Um problema especial &#233; a cria&#231;&#227;o de tuplas contendo 0 ou 1 itens: a sintaxe tem certos truques para
  acomodar estes casos. Tuplas vazias s&#227;o constru&#237;das por uma par de par&#234;nteses vazios. E uma tupla
  unit&#225;ria &#233; constru&#237;da por um &#250;nico valor e uma v&#237;rgula entre par&#234;nteses (sem a
  v&#237;rgula a tupla n&#227;o ser&#225; gerada!). Feio, mas efetivo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; empty = ()
&gt;&gt;&gt; singleton = 'hello',    # &lt;-- observe a v&#237;rgula extra
&gt;&gt;&gt; len(empty)
0
&gt;&gt;&gt; len(singleton)
1
&gt;&gt;&gt; singleton
('hello',)
</pre>
  </div>
  <p>O comando <code>t = 12345, 54321, 'hello!'</code> &#233; um exemplo de empacotamento em tupla (<em>tuple
  packing</em>): os valores <code>12345</code>, <code>54321</code> e <code>'hello!'</code> s&#227;o empacotados juntos
  em uma tupla. A opera&#231;&#227;o inversa tamb&#233;m &#233; poss&#237;vel:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; x, y, z = t
</pre>
  </div>
  <p>Isto &#233; chamado de desempacotamento de sequ&#234;ncia (<em>sequence unpacking</em>), e requer que a lista de
  vari&#225;veis do lado esquerdo corresponda ao comprimento da sequ&#234;ncia &#224; direita. Sendo assim, a
  atribui&#231;&#227;o m&#250;ltipla &#233; um caso de empacotamento e desempacotamento de tupla.</p>
  <p>Existe ainda uma certa assimetria aqui: empacotamento de m&#250;ltiplos valores sempre cria tuplas, mas o
  desempacotamento funciona para qualquer sequ&#234;ncia.</p>
  <h1>  5.4 Sets</h1>
  <p>Python tamb&#233;m inclui um tipo de dados para conjuntos (<em>sets</em>). Um conjunto &#233; uma
  cole&#231;&#227;o desordenada de dados, sem elementos duplicados. Usos comuns para isso incluem
  verifica&#231;&#245;es da exist&#234;ncia de objetos em outros sequ&#234;ncias e elimina&#231;&#227;o de items
  duplicados. Conjuntos tamb&#233;m suportam opera&#231;&#245;es matem&#225;ticas como uni&#227;o,
  interse&#231;&#227;o, diferen&#231;a e diferen&#231;a sim&#233;trica.</p>
  <p>Uma pequena demonstra&#231;&#227;o:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
&gt;&gt;&gt; fruits = set(basket)               # create a set without duplicates
&gt;&gt;&gt; fruits
set(['orange', 'pear', 'apple', 'banana'])
&gt;&gt;&gt; 'orange' in fruits                 # fast membership testing
True
&gt;&gt;&gt; 'crabgrass' in fruits
False
&gt;&gt;&gt; # Demonstrate set operations on unique letters from two words
...
&gt;&gt;&gt; a = set('abracadabra')
&gt;&gt;&gt; b = set('alacazam')
&gt;&gt;&gt; a                                  # unique letters in a
set(['a', 'r', 'b', 'c', 'd'])
&gt;&gt;&gt; a - b                              # letters in a but not in b
set(['r', 'd', 'b'])
&gt;&gt;&gt; a | b                              # letters in either a or b
set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])
&gt;&gt;&gt; a &amp; b                              # letters in both a and b
set(['a', 'c'])
&gt;&gt;&gt; a ^ b                              # letters in a or b but not both
set(['r', 'd', 'b', 'm', 'z', 'l'])
</pre>
  </div>
  <h1>  5.5 Dicion&#225;rios</h1>
  <p>Outra estrutura de dados interna de Python, e muito &#250;til, &#233; o <a class="ulink" href=
  "../lib/typesmapping.html"><em>dicion&#225;rio</em></a>. Dicion&#225;rios s&#227;o tamb&#233;m chamados de
  ``mem&#243;ria associativa'', ou ``vetor associativo'' . Diferentemente de sequ&#234;ncias que s&#227;o indexadas por
  inteiros, dicion&#225;rios s&#227;o indexados por chaves (<em>keys</em>), que podem ser de qualquer tipo
  imut&#225;vel (como strings e inteiros). Tuplas tamb&#233;m podem ser chaves se contiverem apenas strings, inteiros
  ou outras tuplas. Se a tupla contiver, direta ou indiretamente, qualquer valor mut&#225;vel n&#227;o poder&#225; ser
  chave. Listas n&#227;o podem ser usadas como chaves porque s&#227;o mut&#225;veis.</p>
  <p>O melhor modelo mental de um dicion&#225;rio &#233; um conjunto n&#227;o ordenado de pares chave-valor, onde as
  chaves s&#227;o &#250;nicas em uma dada inst&#226;ncia do dicion&#225;rio.</p>
  <p>Dicion&#225;rios s&#227;o delimitados por : <code>{}</code>. Uma lista de pares <em>chave:valor</em> separada por
  v&#237;rgulas dentro desse delimitadores define a constitui&#231;&#227;o inicial do dicion&#225;rio. Dessa forma
  tamb&#233;m ser&#225; impresso o conte&#250;do de um dicion&#225;rio em uma se&#231;&#227;o de
  depura&#231;&#227;o.</p>
  <p>As principais opera&#231;&#245;es em um dicion&#225;rio s&#227;o armazenar e recuperar valores a partir de chaves.
  Tamb&#233;m &#233; poss&#237;vel remover um par <em>chave:valor</em> com o comando <code>del</code>. Se voc&#234;
  armazenar um valor utilizando uma chave j&#225; presente, o antigo valor ser&#225; substitu&#237;do pelo novo. Se
  tentar recuperar um valor dada uma chave inexistente ser&#225; gerado um erro.</p>
  <p>O m&#233;todo <tt class="method">keys()</tt> do dicion&#225;rio retorna a lista de todas as chaves presentes no
  dicion&#225;rio, em ordem arbitr&#225;ria (se desejar orden&#225;-las basta aplicar o m&#233;todo <tt class=
  "method">sort()</tt> na lista devolvida). Para verificar a exist&#234;ncia de uma chave, utilize o m&#233;todo
  <tt class="method">has_key()</tt> do dicion&#225;rio ou a keyword <tt class="keyword">in</tt>.</p>
  <p>A seguir, um exemplo de uso do dicion&#225;rio:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; tel = {'jack': 4098, 'sape': 4139}
&gt;&gt;&gt; tel['guido'] = 4127
&gt;&gt;&gt; tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
&gt;&gt;&gt; tel['jack']
4098
&gt;&gt;&gt; del tel['sape']
&gt;&gt;&gt; tel['irv'] = 4127
&gt;&gt;&gt; tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
&gt;&gt;&gt; tel.keys()
['guido', 'irv', 'jack']
&gt;&gt;&gt; tel.has_key('guido')
True
&gt;&gt;&gt; 'guido' in tel
True
</pre>
  </div>
  <p>A construtora <tt class="function">dict()</tt> produz dicion&#225;rios diretamente a partir de uma lista de
  chaves-valores, armazenadas como tuplas. Quando os pares formam um padr&#227;o, <em>list comprehensions</em> podem
  especificar a lista de chaves-valores de forma mais compacta.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}
&gt;&gt;&gt; dict([(x, x**2) for x in (2, 4, 6)])     # use a list comprehension
{2: 4, 4: 16, 6: 36}
</pre>
  </div>
  <p>Mais adiante no tutorial aprenderemos sobre Geradores, que s&#227;o ainda mais adequados para fornecer os pares
  chave-valor para <tt class="function">dict()</tt>.</p>
  <p>Quando chaves s&#227;o apenas strings, &#233; mais f&#225;cil especificar os pares usando argumentos
  chave-valor:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}
</pre>
  </div>
  <h1>  5.6 T&#233;cnicas de La&#231;o</h1>
  <p>Ao percorrer um dicion&#225;rio com um la&#231;o, a chave e o valor correspondente podem ser obtidos
  simultaneamente com o m&#233;todo <tt class="method">iteritems()</tt>.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; knights = {'gallahad': 'the pure', 'robin': 'the brave'}
&gt;&gt;&gt; for k, v in knights.iteritems():
...     print k, v
...
gallahad the pure
robin the brave
</pre>
  </div>
  <p>Ao percorrer uma sequ&#234;ncia qualquer, o &#237;ndice da posi&#231;&#227;o atual e o valor correspondente podem
  ser obtidos simultaneamente usando a fun&#231;&#227;o <tt class="function">enumerate()</tt>.</p>
  <div class="verbatim">
    <pre>
 
&gt;&gt;&gt; for i, v in enumerate(['tic', 'tac', 'toe']):
...     print i, v
...
0 tic
1 tac
2 toe
</pre>
  </div>
  <p>Para percorrer duas ou mais sequ&#234;ncias simultaneamente com o la&#231;o, os items podem ser agrupados com a
  fun&#231;&#227;o <tt class="function">zip()</tt>.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; questions = ['name', 'quest', 'favorite color']
&gt;&gt;&gt; answers = ['lancelot', 'the holy grail', 'blue']
&gt;&gt;&gt; for q, a in zip(questions, answers):
...     print 'What is your %s?  It is %s.' % (q, a)
...     
What is your name?  It is lancelot.
What is your quest?  It is the holy grail.
What is your favorite color?  It is blue.
</pre>
  </div>
  <p>Para percorrer uma sequ&#234;ncia em ordem reversa, chame a fun&#231;&#227;o <tt class="function">reversed()</tt>
  com a sequ&#234;ncia na ordem original.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; for i in reversed(xrange(1,10,2)):
...     print i
...
9
7
5
3
1
</pre>
  </div>
  <p>Para percorrer uma sequ&#234;ncia de maneira ordenada, use a fun&#231;&#227;o <tt class="function">sorted()</tt>,
  que retorna uma lista ordenada com os items, mantendo o original inalterado.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
&gt;&gt;&gt; for f in sorted(set(basket)):
...     print f
...     
apple
banana
orange
pear
</pre>
  </div>
  <h1>  5.7 Mais sobre Condi&#231;&#245;es</h1>
  <p>As condi&#231;&#245;es de controle utilizadas no <code>while</code> e <code>if</code> podem conter quaisquer
  operadores, n&#227;o apenas compara&#231;&#245;es.</p>
  <p>Os operadores de compara&#231;&#227;o <code>in</code> e <code>not in</code> verificam se um valor ocorre (ou
  n&#227;o ocorre) em uma dada sequ&#234;ncia. Os operadores <code>is</code> e <code>is not</code> comparam se dois
  objetos s&#227;o na verdade o mesmo objetos; o que s&#243; &#233; significativo no contexto de objetos mut&#225;veis,
  como listas. Todos operadores de compara&#231;&#227;o possuem a mesma preced&#234;ncia, que &#233; menor do que a
  prioridade dos operadores num&#233;ricos.</p>
  <p>Compara&#231;&#245;es podem ser encadeadas: Por exemplo <code>a &lt; b == c</code> testa se <code>a</code> &#233;
  menor que <code>b</code> e ainda por cima se <code>b</code> &#233; igual a <code>c</code>.</p>
  <p>Compara&#231;&#245;es podem ser combinadas atrav&#233;s de operadores booleanos <code>and</code> e
  <code>or</code>, e negados atrav&#233;s de <code>not</code>. Estes possuem menor prioridade que os demais operadores
  de compara&#231;&#227;o. Entre eles, <code>not</code> &#233; o de maior prioridade e <code>or</code> o de menor.
  Dessa forma, a condi&#231;&#227;o <code>A and not B or C</code> &#233; equivalente a <code>(A and (not B)) or
  C</code>. Naturalmente, par&#234;nteses podem ser usados para expressar o agrupamento desejado.</p>
  <p>Os operadores booleanos <code>and</code> and <code>or</code> s&#227;o tamb&#233;m operadores <em>atalhos</em> :
  seus argumentos s&#227;o avaliados da esquerda para a direita, e a avalia&#231;&#227;o p&#225;ra quando o resultado
  se torna conhecido. Por exemplo, se <code>A</code> e <code>C</code> s&#227;o verdadeiros mas <code>B</code> &#233;
  falso, ent&#227;o <code>A and B and C</code> n&#227;o retorna a express&#227;o <code>C</code>. Em geral, quando usado
  sobre valores gen&#233;ricos e n&#227;o como booleanos, o valor de retorno de um operador atalho &#233; o &#250;ltimo
  valor avaliado na express&#227;o.</p>
  <p>&#201; poss&#237;vel atribuir o resultado de uma compara&#231;&#227;o ou outra express&#227;o booleana para uma
  vari&#225;vel. Por exemplo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'
&gt;&gt;&gt; non_null = string1 or string2 or string3
&gt;&gt;&gt; non_null
'Trondheim'
</pre>
  </div>
  <p>Observe que em Python, diferentemente de C, atribui&#231;&#227;o n&#227;o pode ocorrer dentro de uma
  express&#227;o. Programadores C podem resmungar, mas isso evita toda uma classe de problemas frequentemente
  encontrados em programas C: digitar <code>=</code> numa express&#227;o quando a inten&#231;&#227;o era
  <code>==</code>.</p>
  <h1>  5.8 Comparando Sequ&#234;ncias e Outros Tipos</h1>
  <p>Objetos sequ&#234;ncia podem ser comparados com outros objetos sequ&#234;ncia, desde que o tipo das
  sequ&#234;ncias seja o mesmo. A compara&#231;&#227;o utiliza a ordem <em>l&#233;xicografica</em> : primeiramente os
  dois primeiros itens s&#227;o comparados, e se diferirem isto determinar&#225; o resultado da compara&#231;&#227;o,
  caso contr&#225;rio os pr&#243;ximos dois itens ser&#227;o comparados, e assim por diante at&#233; que se tenha
  exaurido alguma das sequ&#234;ncias. Se em uma compara&#231;&#227;o de itens, os mesmos forem tamb&#233;m
  sequ&#234;ncias (aninhadas), ent&#227;o &#233; disparada recursivamente outra compara&#231;&#227;o
  l&#233;xicografica. Se todos os itens da sequ&#234;ncia forem iguais, ent&#227;o as sequ&#234;ncias s&#227;o ditas
  iguais. Se uma das sequ&#234;ncias &#233; uma subsequ&#234;ncia da outra, ent&#227;o a subsequ&#234;ncia &#233; a
  menor (operador &lt;). A compara&#231;&#227;o lexicogr&#225;fica utiliza ASCII para definir a ordena&#231;&#227;o.
  Alguns exemplos de compara&#231;&#245;es entre sequ&#234;ncias do mesmo tipo:</p>
  <div class="verbatim">
    <pre>
(1, 2, 3)              &lt; (1, 2, 4)
[1, 2, 3]              &lt; [1, 2, 4]
'ABC' &lt; 'C' &lt; 'Pascal' &lt; 'Python'
(1, 2, 3, 4)           &lt; (1, 2, 4)
(1, 2)                 &lt; (1, 2, -1)
(1, 2, 3)             == (1.0, 2.0, 3.0)
(1, 2, ('aa', 'ab'))   &lt; (1, 2, ('abc', 'a'), 4)
</pre>
  </div>
  <p>Observe que &#233; permitido comparar objetos de diferentes tipos. O resultado &#233; determin&#237;stico,
  por&#233;m, arbitr&#225;rio: os tipos s&#227;o ordenados pelos seus nomes. Ent&#227;o, uma lista &#233; sempre menor
  do que uma string, uma string &#233; sempre menor do que uma tupla, etc. <a name="tex2html3" href=
  "#foot755"><sup>5.1</sup></a>Tipos num&#233;ricos mistos s&#227;o comparados de acordo com seus valores
  num&#233;ricos, logo 0 &#233; igual a 0.0, etc.</p>
  <h1>  6. M&#243;dulos</h1>
  <p>Se voc&#234; sair do interpretador Python e entrar novamente, todas as defini&#231;&#245;es de fun&#231;&#245;es e
  vari&#225;veis ser&#227;o perdidas. Logo, se voc&#234; desejar escrever um programa que dure &#233; melhor preparar o
  c&#243;digo em um editor de textos. Quando estiver pronto, dispare o interpretador sobre o arquivo-fonte gerado. Isto
  se chama gerar um <em>script</em>.</p>
  <p>A medida que seus programas crescem, pode ser desej&#225;vel dividi-los em v&#225;rios arquivos para facilitar a
  manuten&#231;&#227;o. Talvez voc&#234; at&#233; queira reutilizar uma fun&#231;&#227;o sem copiar sua
  defini&#231;&#227;o a cada novo programa.</p>
  <p>Para permitir isto, Python possui uma maneira de depositar defini&#231;&#245;es em um arquivo e posteriormente
  reutiliz&#225;-las em um script ou se&#231;&#227;o interativa do interpretador. Esse arquivo &#233; denominado
  m&#243;dulo. Defini&#231;&#245;es de um m&#243;dulo podem ser importadas por outros m&#243;dulos ou no m&#243;dulo
  principal.</p>
  <p>Um m&#243;dulo &#233; um arquivo contendo defini&#231;&#245;es e comandos Python. O nome do arquivo recebe o
  sufixo <span class="file">.py</span>. Dentro de um m&#243;dulo, seu nome (uma string) est&#225; dispon&#237;vel na
  vari&#225;vel global <code>__name__</code>. Por exemplo, use seu editor de textos favorito para criar um arquivo
  chamado <span class="file">fibo.py</span> no diret&#243;rio corrente com o seguinte conte&#250;do:</p>
  <div class="verbatim">
    <pre>
# M&#243;dulo Sequ&#234;ncias de Fibonacci 
def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while b &lt; n:
        print b,
        a, b = b, a+b
def fib2(n): # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while b &lt; n:
        result.append(b)
        a, b = b, a+b
    return result
</pre>
  </div>
  <p>Agora inicie o interpretador e importe o m&#243;dulo da seguinte forma:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; import fibo
</pre>
  </div>
  <p>Isso n&#227;o incorpora as fun&#231;&#245;es definidas em <code>fibo</code> diretamente na tabela de s&#237;mbolos
  corrente, apenas coloca o nome do m&#243;dulo l&#225;. Atrav&#233;s do nome do m&#243;dulo voc&#234; pode acessar as
  fun&#231;&#245;es:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; fibo.fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
&gt;&gt;&gt; fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
&gt;&gt;&gt; fibo.__name__
'fibo'
</pre>
  </div>
  <p>Se voc&#234; pretende utilizar uma fun&#231;&#227;o frequentemente, &#233; poss&#237;vel atribuir a ela um nome
  local:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; fib = fibo.fib
&gt;&gt;&gt; fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
</pre>
  </div>
  <h1>  6.1 Mais sobre M&#243;dulos</h1>
  <p>Um m&#243;dulo pode conter tanto comandos como defini&#231;&#245;es. Os comandos servem ao prop&#243;sito de
  inicializar o m&#243;dulo, sendo executados apenas na primeira vez em que o mesmo &#233; importado.<a name=
  "tex2html4" href="#foot771"><sup>6.1</sup></a></p>
  <p>Cada m&#243;dulo possui sua pr&#243;pria tabela de s&#237;mbolos, que &#233; usada como tabela de s&#237;mbolos
  global por todas as fun&#231;&#245;es definidas no pr&#243;prio m&#243;dulo. Portanto, o autor do m&#243;dulo pode
  utilizar vari&#225;veis globais no m&#243;dulo sem se preocupar com colis&#227;o de nomes acidental com as
  vari&#225;veis globais de usu&#225;rio.</p>
  <p>Por outro lado, se voc&#234; sabe o que est&#225; fazendo, &#233; poss&#237;vel o acesso as vari&#225;veis globais
  do m&#243;dulo atrav&#233;s da mesma nota&#231;&#227;o. O que permite o acesso &#224;s fun&#231;&#245;es do
  m&#243;dulo: <code>modname.itemname</code>.</p>
  <p>M&#243;dulos podem ser importados por outros m&#243;dulos. &#201; costume, por&#233;m n&#227;o obrigat&#243;rio,
  colocar todos os comandos de importa&#231;&#227;o (<tt class="keyword">import</tt>) no in&#237;cio do m&#243;dulo (ou
  script, se preferir).</p>
  <p>Existe uma variante do comando <tt class="keyword">import</tt> statement que importa nomes de um dado m&#243;dulo
  diretamente para a tabela do m&#243;dulo importador. Os nomes do m&#243;dulo importado s&#227;o adicionados a tabela
  de s&#237;mbolos global do m&#243;dulo importador. Por exemplo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; from fibo import fib, fib2
&gt;&gt;&gt; fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
</pre>
  </div>
  <p>Isso n&#227;o introduz o nome do m&#243;dulo importado na tabela de s&#237;mbolos local, mas sim o nome da
  fun&#231;&#227;o diretamente.</p>
  <p>Existe ainda uma variante que permite importar diretamente todos os nomes definidos em um dado m&#243;dulo.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; from fibo import *
&gt;&gt;&gt; fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
</pre>
  </div>
  <p>Isso importa todos os nomes exceto aqueles iniciados por um sublinhado (<code>_</code>).</p>
  <h2>  6.1.1 O Caminho de Busca dos M&#243;dulos</h2>
  <p><a id='l2h-17' xml:id='l2h-17'></a> Quando um m&#243;dulo denominado <tt class="module">spam</tt> &#233;
  importado, o interpretador busca por um arquivo chamado <span class="file">spam.py</span> no diret&#243;rio corrente,
  depois na lista de diret&#243;rios especificados pela vari&#225;vel de ambiente <a class="envvar" id='l2h-18' xml:id=
  'l2h-18'>PYTHONPATH</a>. Esta &#250;ltima possui a mesma sintaxe da vari&#225;vel de ambiente <a class="envvar" id=
  'l2h-19' xml:id='l2h-19'>PATH</a>, isto &#233;, uma lista de caminhos. Quando <a class="envvar" id='l2h-20' xml:id=
  'l2h-20'>PYTHONPATH</a> n&#227;o existir, ou o arquivo n&#227;o for achado nesta lista, a busca continua num caminho
  que depende da instala&#231;&#227;o. No caso do <span class="Unix">Unix</span> esse caminho &#233; quase sempre
  <span class="file">.:/usr/local/lib/python</span>.</p>
  <p>De fato, m&#243;dulos s&#227;o buscados pela lista de caminhos especificados na vari&#225;vel
  <code>sys.path</code> inicializada com os caminhos citados acima, o que permite aos programas Python manipularem o
  processo de busca de m&#243;dulos se desejado.</p>
  <p>Note que devido ao fato do diret&#243;rio contendo o script executado estar no caminho de busca, &#233; importante
  que o script n&#227;o tenha o mesmo nome que um m&#243;dulo da biblioteca padr&#227;o, ou Python vai tentar carregar
  o script como tal quando aquele m&#243;dulo for importado. Na maior parte das vezes essa n&#227;o &#233; a
  inten&#231;&#227;o e resultar&#225; em um erro. Veja a se&#231;&#227;o &nbsp;<a href=
  "#standardModules">6.2</a>,``M&#243;dulos Padr&#227;o,'' para mais detalhes.</p>
  <h2><a name="SECTION008120000000000000000">6.1.2 Arquivos Python ``Compilados''</a></h2>
  <p>Um fator que agiliza a carga de programas curtos que utilizam muitos m&#243;dulos padr&#227;o &#233; a
  exist&#234;ncia de um arquivo com extens&#227;o <span class="file">.pyc</span> no mesmo diret&#243;rio do fonte
  <span class="file">.py</span>. O arquivo <span class="file">.pyc</span> cont&#233;m uma vers&#227;o
  ``byte-compilada'' do fonte <span class="file">.py</span>. A data de modifica&#231;&#227;o de <span class=
  "file">.py</span> &#233; armazenada dentro do <span class="file">.pyc</span>, e verificada automaticamente antes da
  utiliza&#231;&#227;o do &#250;ltimo. Se n&#227;o conferir, o arquivo <span class="file">.pyc</span> existente &#233;
  re-compilado a partir do <span class="file">.py</span> mais atual.</p>
  <p>Normalmente, n&#227;o &#233; preciso fazer nada para gerar o arquivo <span class="file">.pyc</span>. Sempre que um
  m&#243;dulo <span class="file">.py</span> &#233; compilado com sucesso, &#233; feita uma tentativa de se escrever sua
  vers&#227;o compilada para o <span class="file">.pyc</span>. N&#227;o h&#225; gera&#231;&#227;o de erro se essa
  tentativa falha. Se por qualquer raz&#227;o o arquivo compilado n&#227;o &#233; inteiramente escrito em disco, o
  <span class="file">.pyc</span> resultante ser&#225; reconhecido como inv&#225;lido e, portanto, ignorado. O
  conte&#250;do do <span class="file">.pyc</span> &#233; independente de plataforma, assim um diret&#243;rio de
  m&#243;dulos Python pode ser compartilhado por diferentes arquiteturas.</p>
  <p>Algumas dicas dos experts:</p>
  <ul>
    <li>Quando o interpretador Python &#233; invocado com a diretiva <b class="programopt">-O</b>, c&#243;digo
    otimizado &#233; gerado e armazenado em arquivos <span class="file">.pyo</span>. O otimizador corrente n&#227;o faz
    muita coisa, ele apenas remove constru&#231;&#245;es <tt class="keyword">assert</tt> e instru&#231;&#245;es
    <code>SET_LINENO</code>. Quando o <b class="programopt">-O</b> &#233; utilizado, <em>todo</em> bytecode &#233;
    otimizado. Arquivos <code>.pyc</code> s&#227;o ignorados e arquivos <code>.py</code> s&#227;o compilados em
    bytecode otimizado.</li>
    <li>Passando dois flags <b class="programopt">-O</b> ao interpretador (<b class="programopt">-OO</b>) ir&#225;
    for&#231;ar o compilador de bytecode a efetuar otimiza&#231;&#245;es arriscadas que poderiam em casos raros
    acarretar o mal funcionamento de programas. Presentemente, apenas strings <code>__doc__</code> s&#227;o removidas
    do bytecode, proporcionando arquivos <span class="file">.pyo</span> mais compactos. Uma vez que alguns programas
    podem supor a exist&#234;ncia das docstrings, &#233; melhor voc&#234; s&#243; se utilizar disto se tiver
    seguran&#231;a de que n&#227;o acarretar&#225; nenhum efeito colateral negativo.</li>
    <li>Um programa n&#227;o executa mais r&#225;pido quando &#233; lido de um arquivo <span class="file">.pyc</span>
    ou de um <span class="file">.pyo</span> em compara&#231;&#227;o a quando &#233; lido de um <span class=
    "file">.py</span>. A &#250;nica diferen&#231;a &#233; que nos dois primeiros casos o tempo de carga do programa
    &#233; menor.</li>
    <li>Quando um script &#233; executado diretamente a partir de seu nome da linha de comando, n&#227;o s&#227;o
    geradas as formas compiladas deste script em arquivos <span class="file">.pyo</span> ou <span class=
    "file">.pyc</span>. Portanto, o tempo de carga de um script pode ser melhorado se transportarmos a maioria de seu
    c&#243;digo para um m&#243;dulo e utilizarmos outro script apenas para o disparo. &#201; poss&#237;vel disparar o
    interpretador diretamente sobre arquivos compilados.</li>
    <li>Na presen&#231;a das formas compiladas (<span class="file">.pyc</span> e<span class="file">.pyo</span>) de um
    script, n&#227;o h&#225; necessidade da presen&#231;a da forma textual(<span class="file">.py</span>). Isto &#233;
    &#250;til na hora de se distribuir bibliotecas Python dificultando pr&#225;ticas de engenharia reversa.</li>
    <li>O m&#243;dulo <a class="ulink" href="../lib/module-compileall.html"><tt class="module">compileall</tt></a>
    <a id='l2h-21' xml:id='l2h-21'></a> pode criar arquivos <span class="file">.pyc</span> (ou <span class=
    "file">.pyo</span> quando &#233; usado <b class="programopt">-O</b>) para todos os m&#243;dulos em um dado
    diret&#243;rio.</li>
  </ul>
  <h1>  6.2 M&#243;dulos Padr&#227;o</h1>
  <p>Python possui um biblioteca padr&#227;o de m&#243;dulos, descrita em um documento em separado, a <em class=
  "citetitle"><a href="../lib/lib.html" title="Python Library Reference">Python Library Reference</a></em> (doravante
  ``Library Reference''). Alguns m&#243;dulos est&#227;o embutidos no interpretador; estes possibilitam acesso a
  opera&#231;&#245;es que n&#227;o s&#227;o parte do n&#250;cleo da linguagem, seja por efici&#234;ncia ou para
  permitir o acesso a chamadas de sistema. O conjunto presente destes m&#243;dulos &#233; configur&#225;vel, por
  exemplo, o m&#243;dulo <tt class="module">amoeba</tt> s&#243; est&#225; dispon&#237;vel em sistemas que suportam as
  primitivas do Amoeba. Existe um m&#243;dulo que requer especial aten&#231;&#227;o: <a class="ulink" href=
  "../lib/module-sys.html"><tt class="module">sys</tt></a><a id='l2h-22' xml:id='l2h-22'></a>, que &#233; embutido em
  qualquer interpretador Python. As vari&#225;veis <code>sys.ps1</code> e <code>sys.ps2</code> definem as strings
  utilizadas como prompt prim&#225;rio e secund&#225;rio:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; import sys
&gt;&gt;&gt; sys.ps1
'&gt;&gt;&gt; '
&gt;&gt;&gt; sys.ps2
'... '
&gt;&gt;&gt; sys.ps1 = 'C&gt; '
C&gt; print 'Yuck!'
Yuck!
C&gt;
</pre>
  </div>
  <p>Essas vari&#225;veis s&#243; est&#227;o definidas se o interpretador est&#225; em modo interativo.</p>
  <p>A vari&#225;vel <code>sys.path</code> cont&#233;m uma lista de strings que determina os caminhos de busca de
  m&#243;dulos conhecidos pelo interpretador. Ela &#233; inicializada para um caminho default determinado pela
  vari&#225;vel de ambiente <a class="envvar" id='l2h-23' xml:id='l2h-23'>PYTHONPATH</a> ou por um valor default
  interno se a vari&#225;vel n&#227;o estiver definida. Voc&#234; pode modific&#225;-la utilizando as
  opera&#231;&#245;es t&#237;picas de lista, por exemplo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; import sys
&gt;&gt;&gt; sys.path.append('/ufs/guido/lib/python')
</pre>
  </div>
  <h1>  6.3 A Fun&#231;&#227;o <tt class="function">dir()</tt></h1>
  <p>A fun&#231;&#227;o interna <tt class="function">dir()</tt> &#233; utilizada para se descobrir que nomes s&#227;o
  definidos por um m&#243;dulo. Ela retorna uma lista ordenada de strings:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; import fibo, sys
&gt;&gt;&gt; dir(fibo)
['__name__', 'fib', 'fib2']
&gt;&gt;&gt; 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']
</pre>
  </div>
  <p>Sem nenhum argumento, <tt class="function">dir()</tt> lista os nomes atualmente definidos:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; a = [1, 2, 3, 4, 5]
&gt;&gt;&gt; import fibo
&gt;&gt;&gt; fib = fibo.fib
&gt;&gt;&gt; dir()
['__builtins__', '__doc__', '__file__', '__name__', 'a', 'fib', 'fibo', 'sys']
</pre>
  </div>
  <p>Observe que ela lista nomes dos mais diversos tipos: vari&#225;veis, m&#243;dulos, fun&#231;&#245;es, etc.</p>
  <p><tt class="function">dir()</tt> n&#227;o lista nomes de fun&#231;&#245;es ou vari&#225;veis internas. Se voc&#234;
  desejar conhec&#234;-los, eles est&#227;o definidos no m&#243;dulo padr&#227;o <tt class=
  "module">__builtin__</tt><a id='l2h-24' xml:id='l2h-24'></a>:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; import __builtin__
&gt;&gt;&gt; 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',
 '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']
</pre>
  </div>
  <h1>  6.4 Pacotes</h1>
  <p>Pacotes s&#227;o uma maneira de estruturar espa&#231;os de nomes para m&#243;dulos utilizando a sintaxe de
  ``separa&#231;&#227;o por ponto''. Como exemplo, o m&#243;dulo <tt class="module">A.B</tt> designa um sub-m&#243;dulo
  chamado "<tt class="samp">B</tt>" num pacote denominado "<tt class="samp">A</tt>". O uso de pacotes permite aos
  autores de grupos de m&#243;dulos (como NumPy ou PIL) n&#227;o terem que se preocupar com colis&#227;o entre os nomes
  de seus m&#243;dulos e os nomes de m&#243;dulos de outros autores.</p>
  <p>Suponha que voc&#234; deseje projetar uma cole&#231;&#227;o de m&#243;dulos (um ``pacote'') para o gerenciamento
  uniforme de arquivos de som. Existem muitos formatos diferentes (normalmente identificados pela extens&#227;o do nome
  de arquivo, por exemplo. <span class="file">.wav</span>, <span class="file">.aiff</span>, <span class=
  "file">.au</span>), de forma que voc&#234; pode precisar criar e manter uma crescente cole&#231;&#227;o de
  m&#243;dulos de convers&#227;o entre formatos. Ainda podem existir muitas opera&#231;&#245;es diferentes
  pass&#237;veis de aplica&#231;&#227;o sobre os arquivos de som (mixagem, eco, equaliza&#231;&#227;o, efeito stereo
  artificial). Logo, possivelmente voc&#234; tamb&#233;m estar&#225; escrevendo uma intermin&#225;vel cole&#231;&#227;o
  de m&#243;dulos para aplicar estas opera&#231;&#245;es.</p>
  <p>Aqui est&#225; uma poss&#237;vel estrutura para o seu pacote (expressa em termos de um sistema hier&#225;rquico de
  arquivos):</p>
  <div class="verbatim">
    <pre>
Sound/                          Top-level package
      __init__.py               Initialize the sound package
      Formats/                  Subpackage for file format conversions
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      Effects/                  Subpackage for sound effects
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      Filters/                  Subpackage for filters
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...
</pre>
  </div>
  <p>Ao importar esse pacote, Python busca pelo subdiret&#243;rio com mesmo nome nos diret&#243;rios listados em
  <code>sys.path</code>.</p>
  <p>Os arquivos <span class="file">__init__.py</span> s&#227;o necess&#225;rios para que Python trate os
  diret&#243;rios como um conjunto de m&#243;dulos. Isso foi feito para evitar diret&#243;rios com nomes comuns, como
  "<tt class="samp">string</tt>", de inadvertidamente esconder m&#243;dulos v&#225;lidos que ocorram a posteriori no
  caminho de busca. No caso mais simples, <span class="file">__init__.py</span> pode ser um arquivo vazio. Por&#233;m,
  ele pode conter c&#243;digo de inicializa&#231;&#227;o para o pacote ou gerar a vari&#225;vel <code>__all__</code>,
  que ser&#225; descrita depois.</p>
  <p>Usu&#225;rios do pacote podem importar m&#243;dulos individuais, por exemplo:</p>
  <div class="verbatim">
    <pre>
import Sound.Effects.echo
</pre>
  </div>
  <p>Assim se carrega um sub-m&#243;dulo <tt class="module">Sound.Effects.echo</tt>. Ele deve ser referenciado com seu
  nome completo, como em:</p>
  <div class="verbatim">
    <pre>
Sound.Effects.echo.echofilter(input, output, delay=0.7, atten=4)
</pre>
  </div>
  <p>Uma alternativa para a importa&#231;&#227;o &#233;:</p>
  <div class="verbatim">
    <pre>
from Sound.Effects import echo
</pre>
  </div>
  <p>Assim se carrega o m&#243;dulo sem necessidade de prefixa&#231;&#227;o na hora do uso. Logo, pode ser utilizado
  como se segue:</p>
  <div class="verbatim">
    <pre>
echo.echofilter(input, output, delay=0.7, atten=4)
</pre>
  </div>
  <p>Tamb&#233;m &#233; poss&#237;vel importar diretamente uma &#250;nica vari&#225;vel ou fun&#231;&#227;o, como
  em:</p>
  <div class="verbatim">
    <pre>
from Sound.Effects.echo import echofilter
</pre>
  </div>
  <p>Novamente, h&#225; carga do sub-m&#243;dulo <tt class="module">echo</tt>, mas a fun&#231;&#227;o <tt class=
  "function">echofilter()</tt> est&#225; acess&#237;vel diretamente sem prefixa&#231;&#227;o:</p>
  <div class="verbatim">
    <pre>
echofilter(input, output, delay=0.7, atten=4)
</pre>
  </div>
  <p>Observe que ao utilizar <code>from <var>package</var> import <var>item</var></code>, o item pode ser um
  sub-pacote, sub-m&#243;dulo, classe, fun&#231;&#227;o ou vari&#225;vel. O comando <code>import</code> primeiro testa
  se o item est&#225; definido no pacote, sen&#227;o assume que &#233; um m&#243;dulo e tenta carreg&#225;-lo. Se
  falhar em encontrar o m&#243;dulo uma exce&#231;&#227;o <tt class="exception">ImportError</tt> &#233; levantada.</p>
  <p>Em oposi&#231;&#227;o, na constru&#231;&#227;o <code>import <var>item.subitem.subsubitem</var></code>, cada item,
  com exce&#231;&#227;o do &#250;ltimo, deve ser um pacote. O &#250;ltimo pode ser tamb&#233;m um pacote ou
  m&#243;dulo, mas nunca uma entidade contida em um m&#243;dulo.</p>
  <h2>  6.4.1 Importando * de Um Pacote</h2>
  <p><a id='l2h-25' xml:id='l2h-25'></a> Agora, o que acontece quando um usu&#225;rio escreve <code>from Sound.Effects
  import *</code> ? Idealmente, poderia se esperar que todos sub-m&#243;dulos presentes no pacote fossem importados.
  Infelizmente, essa opera&#231;&#227;o n&#227;o funciona muito bem nas plataformas Mac ou Windows, onde n&#227;o
  existe distin&#231;&#227;o entre mai&#250;sculas ou min&#250;sculas nos sistema de arquivos. Nestas plataformas
  n&#227;o h&#225; como saber como importar o arquivo <span class="file">ECHO.PY</span>, deveria ser com o nome
  <tt class="module">echo</tt>, <tt class="module">Echo</tt> ou <tt class="module">ECHO</tt> (por exemplo, o Windows 95
  tem o irritante h&#225;bito de colocar a primeira letra em mai&#250;scula). A restri&#231;&#227;o de nomes de arquivo
  em DOS com o formato 8+3 adiciona um outro problema na hora de se utilizar arquivos com nomes longos.</p>
  <p>A &#250;nica solu&#231;&#227;o &#233; o autor do pacote fornecer um &#237;ndice expl&#237;cito do pacote. O
  comando de importa&#231;&#227;o utiliza a seguinte conven&#231;&#227;o: se o arquivo <span class=
  "file">__init__.py</span> do pacote define a lista chamada <code>__all__</code>, ent&#227;o esta lista indica os
  nomes dos m&#243;dulos a serem importados quando o comando <code>from <var>package</var> import *</code> &#233;
  encontrado.</p>
  <p>Fica a cargo do autor do pacote manter esta lista atualizada, inclusive fica a seu crit&#233;rio excluir
  inteiramente o suporte a importa&#231;&#227;o direta de todo o pacote atrav&#233;s do <code>from <var>package</var>
  import *</code>. Por exemplo, o arquivo <span class="file">Sounds/Effects/__init__.py</span> poderia conter
  apenas:</p>
  <div class="verbatim">
    <pre>
__all__ = ["echo", "surround", "reverse"]
</pre>
  </div>
  <p>Isso significaria que <code>from Sound.Effects import *</code> iria importar apenas os tr&#234;s sub-m&#243;dulos
  especificados no pacote <tt class="module">Sound</tt>.</p>
  <p>Se <code>__all__</code> n&#227;o estiver definido, o comando <code>from Sound.Effects import *</code> n&#227;o
  importar&#225; todos os sub-m&#243;dulos do pacote <tt class="module">Sound.Effects</tt> no espa&#231;o de nomes
  corrente. H&#225; apenas garantia que o pacote <tt class="module">Sound.Effects</tt> foi importado (possivelmente
  executando qualquer c&#243;digo de inicializa&#231;&#227;o em <span class="file">__init__.py</span>) juntamente com
  os nomes definidos no pacote. Isso inclui todo nome definido em <span class="file">__init__.py</span> bem como em
  qualquer sub-m&#243;dulo importado a partir deste. Considere o c&#243;digo abaixo:</p>
  <div class="verbatim">
    <pre>
import Sound.Effects.echo
import Sound.Effects.surround
from Sound.Effects import *
</pre>
  </div>
  <p>Neste exemplo, os m&#243;dulos <em>echo</em> e <em>surround</em> s&#227;o importados no espa&#231;o de nomes
  corrente, pois est&#227;o definidos no pacote <tt class="module">Sound.Effects</tt>. O que tamb&#233;m funciona
  quando <code>__all__</code> estiver definida.</p>
  <p>Em geral, a pr&#225;tica de importar <code>*</code> de um dado m&#243;dulo &#233; desaconselhada, principalmente
  por prejudicar a legibilidade do c&#243;digo. Contudo, &#233; recomendada em sess&#245;es interativas para evitar
  excesso de digita&#231;&#227;o.</p>
  <p>Lembre-se que n&#227;o h&#225; nada de errado em utilizar <code>from Package import specific_submodule</code>! De
  fato, essa &#233; a nota&#231;&#227;o recomendada a menos que o m&#243;dulo efetuando a importa&#231;&#227;o precise
  utilizar sub-m&#243;dulos hom&#244;nimos em diferentes pacotes.</p>
  <h2><a name="SECTION008420000000000000000">6.4.2 Refer&#234;ncias em Um Mesmo Pacote</a></h2>
  <p>Os sub-m&#243;dulos frequentemente precisam referenciar uns aos outros. Por exemplo, o m&#243;dulo <tt class=
  "module">surround</tt> talvez precise utilizar o m&#243;dulo <tt class="module">echo</tt>. De fato, tais
  refer&#234;ncias s&#227;o t&#227;o comuns que o comando <tt class="keyword">import</tt> primeiro busca m&#243;dulos
  dentro do pacote antes de utilizar o caminho de busca padr&#227;o. Portanto, o m&#243;dulo <tt class=
  "module">surround</tt> pode usar simplesmente <code>import echo</code> ou <code>from echo import echofilter</code>.
  Se o m&#243;dulo importado n&#227;o for encontrado no pacote corrente (o pacote do qual o m&#243;dulo corrente &#233;
  sub-m&#243;dulo), ent&#227;o o comando <tt class="keyword">import</tt> procura por um m&#243;dulo de mesmo nome no
  escopo global.</p>
  <p>Quando pacotes s&#227;o estruturados em sub-pacotes (como no exemplo <tt class="module">Sound</tt>), n&#227;o
  existe atalho para referenciar sub-m&#243;dulos de pacotes irm&#227;os - o nome completo do pacote deve ser
  utilizado. Por exemplo, se o m&#243;dulo <tt class="module">Sound.Filters.vocoder</tt> precisa utilizar o m&#243;dulo
  <tt class="module">echo</tt> no pacote <tt class="module">Sound.Effects</tt>, &#233; preciso import&#225;-lo como
  <code>from Sound.Effects import echo</code>.</p>
  <h2><a name="SECTION008430000000000000000">6.4.3 Packages in Multiple Directories</a></h2>
  <p>Pacotes suportam mais um atributo especiai, <tt class="member">__path__</tt>. Este &#233; inicializado como uma
  lista contendo o nome do diret&#243;rio com o arquivo <span class="file">__init__.py</span> do pacote, antes do
  c&#243;digo naquele arquivo ser executado. Esta vari&#225;vel pode ser modificada; isso afeta a busca futura de
  m&#243;dulos e subpacotes contidos no pacote.</p>
  <p>Apesar de n&#227;o ser muito usado, pode ser usado para extender o conjunto de m&#243;dulos usado num pacote.</p>
  <h1>  7. Entrada e Sa&#237;da</h1>
  <p>Existem diversas maneiras de se apresentar a sa&#237;da de um programa. Dados podem ser impressos em forma
  imediatamente leg&#237;vel, ou escritos em um arquivo para uso futuro. Este cap&#237;tulo vai discutir algumas das
  possibilidades.</p>
  <h1>  7.1 Refinando a Formata&#231;&#227;o de Sa&#237;da</h1>
  <p>At&#233; agora n&#243;s encontramos duas maneiras de escrever valores: atrav&#233;s de <em>express&#245;es</em> e
  pelo comando <tt class="keyword">print</tt> (uma terceira maneira &#233; utilizar o m&#233;todo <tt class=
  "method">write()</tt> de objetos de arquivo; a sa&#237;da padr&#227;o pode ser referenciada como
  <code>sys.stdout</code>). Veja o documento <em>Library Reference</em> para mais informa&#231;&#245;es sobre este
  t&#243;pico.</p>
  <p>Frequentemente voc&#234; desejar&#225; mais controle sobre a formata&#231;&#227;o de sa&#237;da do que
  simplesmente imprimindo valores separados por espa&#231;os. Existem duas formas. A primeira &#233; voc&#234; mesmo
  manipular a string atrav&#233;s de recortes (<em>slicing</em>) e concatena&#231;&#227;o. O m&#243;dulo padr&#227;o
  <tt class="module">string</tt><a id='l2h-26' xml:id='l2h-26'></a> cont&#233;m algumas rotinas &#250;teis a esta
  finalidade. A segunda maneira &#233; utilizar o operador <code>%</code>.</p>
  <p>O operador <code>%</code> interpreta seu argumento &#224; esquerda como uma string de formata&#231;&#227;o de um
  <tt class="cfunction">sprintf()</tt> aplicada ao argumento &#224; direita do operador. O resultado &#233; uma string
  formatada.</p>
  <p>Permanece a quest&#227;o: como converter valores para strings? Por sorte, Python possui maneiras de converter
  qualquer valor para uma string: basta submet&#234;-lo a fun&#231;&#227;o <tt class="function">repr()</tt> ou
  <tt class="function">str()</tt>. Aspas reversas (<code>``</code>) s&#227;o equivalentes a <tt class=
  "function">repr()</tt>, mas n&#227;o s&#227;o mais usadas com frequ&#234;ncia e provavelmente ser&#227;o retiradas de
  futuras vers&#245;es da linguagem.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; s = 'Hello, world.'
&gt;&gt;&gt; str(s)
'Hello, world.'
&gt;&gt;&gt; repr(s)
"'Hello, world.'"
&gt;&gt;&gt; str(0.1)
'0.1'
&gt;&gt;&gt; repr(0.1)
'0.10000000000000001'
&gt;&gt;&gt; x = 10 * 3.25
&gt;&gt;&gt; y = 200 * 200
&gt;&gt;&gt; s = 'The value of x is ' + repr(x) + ', and y is ' + repr(y) + '...'
&gt;&gt;&gt; print s
The value of x is 32.5, and y is 40000...
&gt;&gt;&gt; # The repr() of a string adds string quotes and backslashes:
... hello = 'hello, world\n'
&gt;&gt;&gt; hellos = repr(hello)
&gt;&gt;&gt; print hellos
'hello, world\n'
&gt;&gt;&gt; # The argument to repr() may be any Python object:
... repr((x, y, ('spam', 'eggs')))
"(32.5, 40000, ('spam', 'eggs'))"
&gt;&gt;&gt; # reverse quotes are convenient in interactive sessions:
... `x, y, ('spam', 'eggs')`
"(32.5, 40000, ('spam', 'eggs'))"
</pre>
  </div>
  <p>A seguir, duas maneiras de se escrever uma tabela de quadrados e cubos:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; for x in range(1, 11):
...     print repr(x).rjust(2), repr(x*x).rjust(3),
...     # Observe a v&#237;rgula final na linha anterior
...     print repr(x*x*x).rjust(4)
...
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000
&gt;&gt;&gt; for x in range(1,11):
...     print '%2d %3d %4d' % (x, x*x, x*x*x)
... 
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000
</pre>
  </div>
  <p>Note que os espa&#231;os adicionados entre as colunas se devem a forma de funcionamento do comando <tt class=
  "keyword">print</tt> : ele sempre adiciona espa&#231;o entre seus argumentos.</p>
  <p>Este exemplo demonstra o m&#233;todo <tt class="method">rjust()</tt> de strings, que justifica uma string &#224;
  direita gerando espa&#231;os adicionais &#224; esquerda. Existem m&#233;todos an&#225;logas <tt class=
  "method">ljust()</tt> e <tt class="method">center()</tt>. Esses m&#233;todos apenas retornam a string formatada. Se a
  entrada extrapolar o comprimento exigido a string original &#233; devolvida sem modifica&#231;&#227;o. A raz&#227;o
  para isso &#233; n&#227;o apresentar um valor potencialmente corrompido por truncamento (se for desejado truncar o
  valor pode-se utilizar opera&#231;&#245;es de recorte como em "<tt class="samp">x.ljust(n)[0:n]</tt>").</p>
  <p>Existe ainda o m&#233;todo <tt class="method">zfill()</tt> que preenche uma string num&#233;rica com zeros &#224;
  esquerda. Ele entende sinais positivos e negativos.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; '12'.zfill(5)
'00012'
&gt;&gt;&gt; '-3.14'.zfill(7)
'-003.14'
&gt;&gt;&gt; '3.14159265359'.zfill(5)
'3.14159265359'
</pre>
  </div>
  <p>Um exemplo de uso do operador <code>%</code>:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; import math
&gt;&gt;&gt; print 'The value of PI is approximately %5.3f.' % math.pi
The value of PI is approximately 3.142.
</pre>
  </div>
  <p>Se h&#225; mais do que um formato, ent&#227;o o argumento &#224; direita deve ser uma tupla com os valores de
  formata&#231;&#227;o. Exemplo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
&gt;&gt;&gt; for name, phone in table.items():
...     print '%-10s ==&gt; %10d' % (name, phone)
... 
Jack       ==&gt;       4098
Dcab       ==&gt;       7678
Sjoerd     ==&gt;       4127
</pre>
  </div>
  <p>A maioria dos formatos funciona da mesma maneira que em C, e exigem que voc&#234; passe o tipo apropriado.
  Entretanto, em caso de erro ocorre uma exce&#231;&#227;o e n&#227;o uma falha do sistema operacional. O formato
  <code>%s</code> &#233; mais relaxado: se o argumento correspondente n&#227;o for um objeto string, ent&#227;o ele
  &#233; convertido para string pela fun&#231;&#227;o interna <tt class="function">str()</tt>.</p>
  <p>H&#225; suporte para o modificador <code>*</code> determinar o comprimento ou precis&#227;o num argumento inteiro
  em separado. Os formatadores (em C) <code>%n</code> e <code>%p</code> tamb&#233;m s&#227;o suportados.</p>
  <p>Se voc&#234; possuir uma string de formata&#231;&#227;o muito longa, seria bom referenciar as vari&#225;veis de
  formata&#231;&#227;o <em>por nome</em>, ao inv&#233;s de <em>por posi&#231;&#227;o</em>. Isso pode ser obtido
  passando um dicion&#225;rio como argumento &#224; direita e prefixando campos na string de formata&#231;&#227;o com
  <code>%(name)format</code>. Veja o exermplo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
&gt;&gt;&gt; print 'Jack: %(Jack)d; Sjoerd: %(Sjoerd)d; Dcab: %(Dcab)d' % table
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
</pre>
  </div>
  <p>Isso &#233; particularmente &#250;til em combina&#231;&#227;o com a nova fun&#231;&#227;o interna <tt class=
  "function">vars()</tt>, que retorna um dicion&#225;rio contendo todas as vari&#225;veis locais.</p>
  <h1>  7.2 Leitura e Escrita de Arquivos</h1>
  <p>A fun&#231;&#227;o <tt class="function">open()</tt><a id='l2h-27' xml:id='l2h-27'></a> retorna um objeto de
  arquivo<a id='l2h-28' xml:id='l2h-28'></a>, e &#233; frequentemente usada com dois argumentos: "<tt class=
  "samp">open(<var>filename</var>, <var>mode</var>)</tt>".</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; f=open('/tmp/workfile', 'w')
&gt;&gt;&gt; print f
&lt;open file '/tmp/workfile', mode 'w' at 80a0960&gt;
</pre>
  </div>
  <p>O primeiro argumento &#233; uma string contendo o nome do arquivo. O segundo argumento &#233; outra string
  contendo alguns caracteres que descrevem o modo como o arquivo ser&#225; usado. O par&#226;metro <var>mode</var> pode
  assumir valor <code>'r'</code> quando o arquivo ser&#225; s&#243; de leitura, <code>'w'</code> quando for s&#243; de
  escrita (se o arquivo j&#225; existir seu conte&#250;do pr&#233;vio ser&#225; apagado), e <code>'a'</code> para abrir
  o arquivo para adi&#231;&#227;o; qualquer escrita ser&#225; adicionada ao final do arquivo. A op&#231;&#227;o
  <code>'r+'</code> abre o arquivo tanto para leitura como para escrita. O par&#226;metro <var>mode</var> &#233;
  opcional, em caso de omiss&#227;o ser&#225; assumido <code>'r'</code>.</p>
  <p>No Windows e no Macintosh, <code>'b'</code> adicionado a string de modo indica que o arquivo ser&#225; aberto no
  formato bin&#225;rio. Sendo assim, existem os modos compostos : <code>'rb'</code>, <code>'wb'</code>, e
  <code>'r+b'</code>. O Windows faz distin&#231;&#227;o entre arquivos texto e bin&#225;rios: os caracteres
  terminadores de linha em arquivos texto s&#227;o levemente alterados em leituras e escritas. Essa mudan&#231;a
  por-tr&#225;s-do-pano &#233; &#250;til em arquivos texto ASCII, mas ir&#225; corromper um arquivo bin&#225;rio como
  no caso de arquivos <span class="file">JPEG</span> ou <span class="file">EXE</span>. Seja muito cuidadoso em usar o
  modo bin&#225;rio ao manipular tais arquivos.</p>
  <h2>  7.2.1 M&#233;todos de Objetos de Arquivos</h2>
  <p>A t&#237;tulo de simplifica&#231;&#227;o, o resto dos exemplos nesta se&#231;&#227;o ir&#225; assumir que o objeto
  de arquivo chamado <code>f</code> j&#225; foi criado.</p>
  <p>Para ler o conte&#250;do de um arquivo chame <code>f.read(<var>size</var>)</code>, que l&#234; um punhado de dados
  retornando-os como string. O argumento num&#233;rico <var>size</var> &#233; opcional. Quando <var>size</var> for
  omitido ou negativo, todo o conte&#250;do do arquivo ser&#225; lido e retornado. &#201; problema seu se o
  conte&#250;do do arquivo &#233; o dobro da mem&#243;ria dispon&#237;vel na m&#225;quina. Caso contr&#225;rio, no
  m&#225;ximo <var>size</var> bytes ser&#227;o lidos e retornados. Se o fim do arquivo for atingido,
  <code>f.read()</code> ir&#225; retornar uma string vazia (<code>''</code>).</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; f.read()
'Esse &#233; todo o conte&#250;do do arquivo.\n'
&gt;&gt;&gt; f.read()
''
</pre>
  </div>
  <p><code>f.readline()</code> l&#234; uma &#250;nica linha do arquivo. O caracter de retorno de linha
  (<code>\n</code>) &#233; deixado ao final da string, s&#243; sendo omitido na &#250;ltima linha do arquivo se ele
  j&#225; n&#227;o estiver presente l&#225;. Isso elimina a ambiguidade no valor de retorno. Se
  <code>f.readline()</code> retornar uma string vazia, ent&#227;o o arquivo acabou. Linhas em branco s&#227;o
  representadas por <code>'\n'</code>: uma string contendo unicamente o terminador de linha.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; f.readline()
'Essa &#233; a primeira linha do arquivo.\n'
&gt;&gt;&gt; f.readline()
'Segunda linha do arquivo\n'
&gt;&gt;&gt; f.readline()
''
</pre>
  </div>
  <p><code>f.readlines()</code> retorna uma lista contendo todas as linhas do arquivo. Se for fornecido o
  par&#226;metro opcional <var>sizehint</var>, ser&#225; lida a quantidade especificada de bytes e mais o suficiente
  para completar uma linha. Frequentemente, esta opera&#231;&#227;o &#233; utilizada para ler arquivos muito grandes
  sem ter que ler todo o arquivo para a mem&#243;ria de uma s&#243; vez. Apenas linhas completas ser&#227;o
  retornadas.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; f.readlines()
['Essa &#233; a primeira linha do arquivo.\n', 'Segunda linha do arquivo\n']
</pre>
  </div>
  <p>Uma maneira alternativa de ler linhas do arquivo &#233; usando um la&#231;o diretamente com o objeto arquivo.
  &#201; mais eficiente, r&#225;pido e resulta em c&#243;digo mais simples:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; for line in f:
        print line,
        
Esta &#233; a primeira linha do arquivo.
Segunda linha do arquivo.
</pre>
  </div>
  <p>Essa alternativa &#233; bem mais simples, mas n&#227;o oferece tanto controle. Como as duas alternativas s&#227;o
  um pouco diferentes internamente, no gerenciamento de <em>buffers</em>, elas n&#227;o devem ser misturadas.</p>
  <p><code>f.write(<var>string</var>)</code> escreve o conte&#250;do da <var>string</var> para o arquivo, retornando
  <code>None</code>.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; f.write('Isso &#233; um teste.\n')
</pre>
  </div>
  <p>Ao escrever algo que n&#227;o seja uma string, &#233; necess&#225;rio convert&#234;-lo antes:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; value = ('a resposta', 42)
&gt;&gt;&gt; s = str(value)
&gt;&gt;&gt; f.write(s)
</pre>
  </div>
  <p><code>f.tell()</code> retorna um inteiro que indica a posi&#231;&#227;o corrente de leitura ou escrita no arquivo,
  medida em bytes desde o in&#237;cio do arquivo. Para mudar a posi&#231;&#227;o utilize "<tt class=
  "samp">f.seek(<var>offset</var>, <var>from_what</var>)</tt>". A nova posi&#231;&#227;o &#233; computada pela soma do
  <var>offset</var> a um ponto de refer&#234;ncia, que por sua vez &#233; definido pelo argumento <var>from_what</var>.
  O argumento <var>from_what</var> pode assumir o valor 0 para indicar o in&#237;cio do arquivo, 1 para indicar a
  posi&#231;&#227;o corrente e 2 para indicar o fim do arquivo. Este par&#226;metro pode ser omitido, quando &#233;
  assumido o valor default 0.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; f = open('/tmp/workfile', 'r+')
&gt;&gt;&gt; f.write('0123456789abcdef')
&gt;&gt;&gt; f.seek(5)     # Vai para o sexto byte
&gt;&gt;&gt; f.read(1)        
'5'
&gt;&gt;&gt; f.seek(-3, 2) # Vai para o terceiro byte antes do fim
&gt;&gt;&gt; f.read(1)
'd'
</pre>
  </div>
  <p>Quando acabar de utilizar o arquivo, chame <code>f.close()</code> para fech&#225;-lo e liberar recursos. Qualquer
  tentativa de acesso ao arquivo depois dele ter sido fechado implicar&#225; em falha.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; f.close()
&gt;&gt;&gt; f.read()
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in ?
ValueError: I/O operation on closed file
</pre>
  </div>
  <p>Objetos de arquivo podem ter m&#233;todos adicionais, tais como <tt class="method">isatty()</tt> e <tt class=
  "method">truncate()</tt> que s&#227;o usados com menos frequ&#234;ncia, consulte a <em>Library Reference</em> para
  obter maiores informa&#231;&#245;es.</p>
  <h2>  7.2.2 O M&#243;dulo <tt class="module">pickle</tt></h2><a id='l2h-29' xml:id='l2h-29'></a>
  <p>Strings podem ser facilmente escritas e lidas de um arquivo. N&#250;meros exigem um pouco mais de esfor&#231;o,
  uma vez que o m&#233;todo <tt class="method">read()</tt> s&#243; trabalha com strings. Portanto, pode ser utilizada a
  fun&#231;&#227;o <tt class="function">int()</tt>, que recebe uma string <code>'123'</code> e a converte para o
  respectivo valor inteiro. Entretanto, quando estruturas de dados mais complexas (listas, dicion&#225;rios,
  inst&#226;ncias de classe,etc) est&#227;o envolvidas, o processo se torna mais complicado.</p>
  <p>Para que n&#227;o seja necess&#225;rio que usu&#225;rios estejam constantemente escrevendo e depurando c&#243;digo
  que torna estruturas de dados persistentes, Python oferece o m&#243;dulo padr&#227;o <a class="ulink" href=
  "../lib/module-pickle.html"><tt class="module">pickle</tt></a>. Este m&#243;dulo permite que praticamente qualquer
  objeto Python (at&#233; mesmo c&#243;digo!) seja convertido para uma representa&#231;&#227;o string. Este processo
  &#233; denominado <i class="dfn">pickling</i>. E <i class="dfn">unpickling</i> &#233; o processo reverso de
  reconstruir o objeto a partir de sua representa&#231;&#227;o string. Enquanto estiver representado como uma string, o
  objeto pode ser armazenado em arquivo, transferido pela rede, etc.</p>
  <p>Se voc&#234; possui um objeto qualquer <code>x</code>, e um objeto arquivo <code>f</code> que foi aberto para
  escrita, a maneira mais simples de utilizar este m&#243;dulo &#233;:</p>
  <div class="verbatim">
    <pre>
pickle.dump(x, f)
</pre>
  </div>
  <p>Para desfazer, se <code>f</code> for agora um objeto de arquivo pronto para leitura:</p>
  <div class="verbatim">
    <pre>
x = pickle.load(f)
</pre>
  </div>
  <p>Existem outras varia&#231;&#245;es desse processo &#250;teis quando se precisa aplicar sobre muitos objetos ou o
  destino da representa&#231;&#227;o string n&#227;o &#233; um arquivo. Consulte a documenta&#231;&#227;o para
  <a class="ulink" href="../lib/module-pickle.html"><tt class="module">pickle</tt></a> na <em class=
  "citetitle"><a href="../lib/" title="Refer&#234;ncia da Biblioteca Python">Refer&#234;ncia da Biblioteca
  Python</a></em> para obter informa&#231;&#245;es detalhadas.</p>
  <p>Utilizar o m&#243;dulo <a class="ulink" href="../lib/module-pickle.html"><tt class="module">pickle</tt></a> &#233;
  a forma padr&#227;o de tornar objetos Python persistentes, permitindo a reutiliza&#231;&#227;o dos mesmos entre
  diferentes programas, ou pelo mesmo programa em diferentes sess&#245;es de utiliza&#231;&#227;o. A
  representa&#231;&#227;o string dos dados &#233; tecnicamente chamada <i class="dfn">objeto persistente</i>, como
  j&#225; foi visto. Justamente porque o m&#243;dulo <a class="ulink" href="../lib/module-pickle.html"><tt class=
  "module">pickle</tt></a> &#233; amplamente utilizado, v&#225;rios autores que escrevem extens&#245;es para Python
  tomam o cuidado de garantir que novos tipos de dados sejam compat&#237;veis com esse processo.</p>
  <h1>  8. Erros e Exce&#231;&#245;es</h1>
  <p>At&#233; agora mensagens de erro foram apenas mencionadas, mas se voc&#234; testou os exemplos, talvez tenha
  esbarrado em algumas. Existem pelo menos dois tipos distintos de erros: <em>erros de sintaxe</em> e
  <em>exce&#231;&#245;es</em>.</p>
  <h1>  8.1 Erros de Sintaxe</h1>
  <p>Erros de sintaxe, tamb&#233;m conhecidos como erros de parse, s&#227;o provavelmente os mais frequentes entre
  aqueles que ainda est&#227;o aprendendo Python:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; while True print 'Hello world'
  File "&lt;stdin&gt;", line 1, in ?
    while True print 'Hello world'
                ^
SyntaxError: invalid syntax
</pre>
  </div>
  <p>O parser repete a linha inv&#225;lida e apresenta uma pequena `flecha' apontando para o ponto da linha em que o
  erro foi encontrado. O erro &#233; detectado pelo token que precede a flecha. No exemplo, o erro foi detectado na
  palavra-reservada <tt class="keyword">print</tt>, uma vez que o dois-pontos ("<tt class="character">:</tt>")
  est&#225; faltando. Nome de arquivo e n&#250;mero de linha s&#227;o impressos para que voc&#234; possa rastrear o
  erro no texto do script.</p>
  <h1>  8.2 Exce&#231;&#245;es</h1>
  <p>Mesmo que um comando ou express&#227;o estejam sintaticamente corretos, talvez ocorra um erro na hora de sua
  execu&#231;&#227;o. Erros detectados durante a execu&#231;&#227;o s&#227;o chamados <em>exce&#231;&#245;es</em> e
  n&#227;o s&#227;o necessariamente fatais. Logo veremos como trat&#225;-las em programas Python. A maioria das
  exce&#231;&#245;es n&#227;o s&#227;o tratadas e acabam resultando em mensagens de erro:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; 10 * (1/0)
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in ?
ZeroDivisionError: integer division or modulo by zero
&gt;&gt;&gt; 4 + spam*3
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in ?
NameError: name 'spam' is not defined
&gt;&gt;&gt; '2' + 2
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects
</pre>
  </div>
  <p>A &#250;ltima linha da mensagem de erro indica o que aconteceu. Exce&#231;&#245;es surgem com diferentes tipos, e
  o tipo &#233; impresso como parte da mensagem . Os tipos no exemplo s&#227;o: <tt class=
  "exception">ZeroDivisionError</tt>, <tt class="exception">NameError</tt> e <tt class="exception">TypeError</tt>. A
  string impressa como sendo o tipo da exce&#231;&#227;o &#233; o nome interno da exce&#231;&#227;o que ocorreu. Isso
  &#233; verdade para todas exce&#231;&#245;es pr&#233;-definidas em Python, mas n&#227;o &#233; necessariamente
  verdade para exce&#231;&#245;es definidas pelo usu&#225;rio.</p>
  <p>O resto da linha &#233; um detalhamento que depende do tipo da exce&#231;&#227;o ocorrida e sua causa.</p>
  <p>A parte anterior da mensagem de erro apresenta o contexto onde ocorreu a exce&#231;&#227;o. Essa
  informa&#231;&#227;o &#233; denominada <em>stack traceback</em> (N.d.T: rastreamento da pilha para tr&#225;s). Em
  geral, cont&#233;m uma lista de linhas do c&#243;digo fonte, sem apresentar, no entanto, valores lidos da entrada
  padr&#227;o.</p>
  <p>O documento <em class="citetitle"><a href="../lib/module-exceptions.html" title=
  "Refer&#234;ncia da Biblioteca Python">Refer&#234;ncia da Biblioteca Python</a></em> lista as exce&#231;&#245;es
  pr&#233;-definidas e seus significados.</p>
  <h1>  8.3 Tratamento de Exce&#231;&#245;es</h1>
  <p>&#201; poss&#237;vel escrever programas que tratam exce&#231;&#245;es espec&#237;ficas. Observe o exemplo
  seguinte, que pede dados ao usu&#225;rio at&#233; que um inteiro v&#225;lido seja fornecido, ainda permitindo que o
  programa seja interrompido (utilizando <kbd>Control-C</kbd> ou seja l&#225; o que for que o sistema operacional
  suporte). Note que uma interrup&#231;&#227;o gerada pelo usu&#225;rio ser&#225; sinalizada pela exce&#231;&#227;o
  <tt class="exception">KeyboardInterrupt</tt>.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; while True:
...     try:
...         x = int(raw_input("Entre com um n&#250;mero: "))
...         break
...     except ValueError:
...         print "Opa! Esse n&#250;mero n&#227;o &#233; v&#225;lido. Tente de novo..."
...
</pre>
  </div>
  <p>A constru&#231;&#227;o <tt class="keyword">try</tt> funciona da seguinte maneira:</p>
  <ul>
    <li>Primeiramente, a cl&#225;usula <em>try</em> (o conjunto de comandos entre as palavras-reservadas <tt class=
    "keyword">try</tt> e <tt class="keyword">except</tt> ) &#233; executado.</li>
    <li>Se n&#227;o for gerada exce&#231;&#227;o, a cl&#225;usula <em>except</em> &#233; ignorada e termina a
    execu&#231;&#227;o da constru&#231;&#227;o <tt class="keyword">try</tt>.</li>
    <li>Se uma execu&#231;&#227;o ocorre durante a execu&#231;&#227;o da cl&#225;usula <tt class="keyword">try</tt>, os
    comandos remanescentes na cl&#225;usula s&#227;o ignorados. Se o tipo da exce&#231;&#227;o ocorrida tiver sido
    previsto junto &#224;lguma palavra-reservada <tt class="keyword">except</tt>, ent&#227;o essa cl&#225;usula
    ser&#225; executada. Ao fim da cl&#225;usula tamb&#233;m termina a execu&#231;&#227;o do <tt class=
    "keyword">try</tt> como um todo.</li>
    <li>Se a exce&#231;&#227;o ocorrida n&#227;o foi prevista em nenhum tratador <tt class="keyword">except</tt> da
    constru&#231;&#227;o <tt class="keyword">try</tt> em que ocorreu, ent&#227;o ela &#233; entregue a uma
    constru&#231;&#227;o <tt class="keyword">try</tt> mais externa. Se n&#227;o existir nenhum tratador previsto para
    tal exce&#231;&#227;o (chamada <em>unhandled exception</em>), a execu&#231;&#227;o encerra com uma mensagem de
    erro.</li>
  </ul>
  <p>A constru&#231;&#227;o <tt class="keyword">try</tt> pode ter mais de uma cl&#225;usula <tt class=
  "keyword">except</tt> para especificar m&#250;ltiplos tratadores para diferentes exce&#231;&#245;es. No m&#225;ximo
  um &#250;nico tratador ser&#225; ativado. Tratadores s&#243; s&#227;o sens&#237;veis as exce&#231;&#245;es levantadas
  no interior da cl&#225;usula <tt class="keyword">try</tt>, e n&#227;o que tenha ocorrido no inteiror de outro
  tratador num mesmo <tt class="keyword">try</tt>. Um tratador pode ser sens&#237;vel a m&#250;ltiplas
  exce&#231;&#245;es, desde que as especifique em uma tupla:</p>
  <div class="verbatim">
    <pre>
... except (RuntimeError, TypeError, NameError): ...  pass
</pre>
  </div>
  <p>A &#250;ltima cl&#225;usula <tt class="keyword">except</tt> pode omitir o nome da exce&#231;&#227;o, servindo como
  uma m&#225;scara gen&#233;rica. Utilize esse recurso com extrema cautela, uma vez que isso pode esconder errors do
  programador e do usu&#225;rio. Tamb&#233;m pode ser utilizado para imprimir uma mensagem de erro, ou re-levantar
  (<em>re-raise</em>) a exce&#231;&#227;o de forma que um ``chamador'' tamb&#233;m possa trat&#225;-la.</p>
  <div class="verbatim">
    <pre>
import sys
try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except IOError, (errno, strerror):
    print "I/O error(%s): %s" % (errno, strerror)
except ValueError:
    print "Could not convert data to an integer."
except:
    print "Unexpected error:", sys.exc_info()[0]
    raise
</pre>
  </div>
  <p>A constru&#231;&#227;o <tt class="keyword">try</tt> ... <tt class="keyword">except</tt> possui uma cl&#225;usula
  <em>else</em> opcional, que quando presente, deve ser colocada depois de todas as outras cl&#225;usulas. &#201;
  &#250;til para um c&#243;digo que precisa ser executado se nenhuma exce&#231;&#227;o foi levantada. Por exemplo:</p>
  <div class="verbatim">
    <pre>
for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print 'cannot open', arg
    else:
        print arg, 'has', len(f.readlines()), 'lines'
        f.close()
</pre>
  </div>
  <p>Este recurso &#233; melhor do que simplesmente adicionar o c&#243;digo do <tt class="keyword">else</tt> ao corpo
  da cl&#225;usula <tt class="keyword">try</tt>, pois mant&#233;m as exce&#231;&#245;es levantadas no <tt class=
  "keyword">else</tt> num escopo diferente de tratamento das exce&#231;&#245;es levantadas na cl&#225;usula <tt class=
  "keyword">try</tt>.</p>
  <p>Quando uma exce&#231;&#227;o ocorre, ela pode estar associada a um valor chamado <em>argumento</em> da
  exce&#231;&#227;o. A presen&#231;a e o tipo do argumento dependem do tipo da exce&#231;&#227;o.</p>
  <p>A cl&#225;usula except pode especificar uma vari&#225;vel depois do nome (ou da tupla de nomas) exce&#231;&#227;o.
  A vari&#225;vel &#233; ligada &#224; inst&#226;ncia dela com os argumentos armazenados em <code>instance.args</code>.
  Por conveni&#234;ncia, a inst&#226;ncia define os m&#233;todos <tt class="method">__getitem__</tt> e <tt class=
  "method">__str__</tt> para que os argumentos possam ser acessados sem necessidada de recorrer a
  <code>.args</code>.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; try:
...    raise Exception('spam', 'eggs')
... except Exception, inst:
...    print type(inst)     # the exception instance
...    print inst.args      # arguments stored in .args
...    print inst           # __str__ allows args to printed directly
...    x, y = inst          # __getitem__ allows args to be unpacked directly
...    print 'x =', x
...    print 'y =', y
...
&lt;type 'instance'&gt;
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
</pre>
  </div>
  <p>Se uma exce&#231;&#227;o possui argumento, ele &#233; impresso ao final do detalhamento de express&#245;es
  n&#227;o tratadas (<em>unhandled exceptions</em>).</p>
  <p>Al&#233;m disso, tratadores de exce&#231;&#227;o s&#227;o capazes de capturar exce&#231;&#245;es que tenham sido
  levantadas no interior de fun&#231;&#245;es invocadas na cl&#225;usula <tt class="keyword">try</tt>. Por exemplo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; def this_fails():
...     x = 1/0
... 
&gt;&gt;&gt; try:
...     this_fails()
... except ZeroDivisionError, detail:
...     print 'Handling run-time error:', detail
... 
Handling run-time error: integer division or modulo by zero
</pre>
  </div>
  <h1>  8.4 Levantando Exce&#231;&#245;es</h1>
  <p>A palavra-reservada <tt class="keyword">raise</tt> permite ao programador for&#231;ar a ocorr&#234;ncia de um
  determinado tipo de exce&#231;&#227;o. Por exemplo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; raise NameError, 'HiThere'
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in ?
NameError: HiThere
</pre>
  </div>
  <p>O primeiro argumento de <tt class="keyword">raise</tt> &#233; o nome da exce&#231;&#227;o a ser levantada. O
  segundo argumento, opcional, &#233; o argumento da exce&#231;&#227;o. O c&#243;digo acima pode ser escrito como
  <code>raise NameError('HiThere)</code>. Qualquer forma funciona bem, mas parece haver uma prefer&#234;ncia crescente
  pela &#250;ltima.</p>
  <p>Caso voc&#234; precise determinar se uma exce&#231;&#227;o foi levantada ou n&#227;o, mas n&#227;o quer manipular
  o erro, uma forma simples de <tt class="keyword">raise</tt> permite que voc&#234; levante-a novamente.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; try:
...     raise NameError, 'HiThere'
... except NameError:
...     print 'An exception flew by!'
...     raise
...
An exception flew by!
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 2, in ?
NameError: HiThere
</pre>
  </div>
  <h1>  8.5 Exce&#231;&#245;es Definidas pelo Usu&#225;rio</h1>
  <p>Programas podem definir novos tipos de exce&#231;&#245;es, atrav&#233;s da cria&#231;&#227;o de uma nova classe.
  Devem ser subclasses da classe <tt class="exception">Exception</tt>, direta ou indiretamente. Por exemplo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; class MyError(Exception):
...     def __init__(self, value):
...         self.value = value
...     def __str__(self):
...         return repr(self.value)
... 
&gt;&gt;&gt; try:
...     raise MyError(2*2)
... except MyError, e:
...     print 'My exception occurred, value:', e.value
... 
My exception occurred, value: 4
&gt;&gt;&gt; raise MyError, 'oops!'
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in ?
__main__.MyError: 'oops!'
</pre>
  </div>
  <p>Neste exemplo, o m&#233;todo <tt class="method">__init__</tt> de <tt class="class">Exception</tt> foi redefinido.
  O novo comportamento simplesmente cria o atributo <var>value</var>. Isto substitui o comportamento padr&#227;o de
  criar o atributo <var>args</var>.</p>
  <p>Classes para exce&#231;&#245;es podem ser definidas para fazer qualquer coisa que qualquer outra classe faz, mas
  em geral s&#227;o bem simples, freq&#252;entemente oferecendo apenas alguns atributos que fornecem
  informa&#231;&#245;es sobre o erro que ocorreu. Ao criar um m&#243;dulo que pode gerar diversos erros, uma
  pr&#225;tica comum &#233; criar uma classe base para as exce&#231;&#245;es definidas por aquele m&#243;dulo, e as
  classes espec&#237;ficas para cada condi&#231;&#227;o de erro como subclasses dela:</p>
  <div class="verbatim">
    <pre>
class Error(Exception):
    """Base class for exceptions in this module."""
    pass
class InputError(Error):
    """Exception raised for errors in the input.
    Attributes:
        expression -- input expression in which the error occurred
        message -- explanation of the error
    """
    def __init__(self, expression, message):
        self.expression = expression
        self.message = message
class TransitionError(Error):
    """Raised when an operation attempts a state transition that's not
    allowed.
    Attributes:
        previous -- state at beginning of transition
        next -- attempted new state
        message -- explanation of why the specific transition is not allowed
    """
    def __init__(self, previous, next, message):
        self.previous = previous
        self.next = next
        self.message = message
</pre>
  </div>
  <p>Muitas exce&#231;&#245;es s&#227;o definidas com nomes que terminam em ``Error,'' , de forma semelhante ao estilo
  usado com as exce&#231;&#245;es padr&#227;o da linguagem.</p>
  <p>Muitos m&#243;dulos padr&#227;o se utilizam disto para reportar erros que ocorrem no interior das
  fun&#231;&#245;es que definem. Mais informa&#231;&#245;es sobre esse mecanismo ser&#227;o descritas no cap&#237;tulo
  <a href="#classes">9</a>, ``Classes.''</p>
  <h1>  8.6 Definindo A&#231;&#245;es de Limpeza</h1>
  <p>A constru&#231;&#227;o <tt class="keyword">try</tt> possui outra cl&#225;usula opcional, cuja finalidade &#233;
  permitir a implementa&#231;&#227;o de a&#231;&#245;es de limpeza, que sempre devem ser executadas independentemente
  da ocorr&#234;ncia de exce&#231;&#245;es. Como no exemplo:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; try:
...     raise KeyboardInterrupt
... finally:
...     print 'Goodbye, world!'
... 
Goodbye, world!
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 2, ?
KeyboardInterrupt
</pre>
  </div>
  <p>A cl&#225;usula <em>finally</em> &#233; executada sempre, ocorrendo ou n&#227;o uma exce&#231;&#227;o. Quando
  ocorre a exce&#231;&#227;o, &#233; como se a exce&#231;&#227;o fosse sempre levantada ap&#243;s a execu&#231;&#227;o
  do c&#243;digo na cl&#225;usula <em>finally</em>. Mesmo que haja um <tt class="keyword">break</tt> ou <tt class=
  "keyword">return</tt> dentro do <tt class="keyword">try</tt>, ainda assim o <tt class="keyword">finally</tt>
  ser&#225; executado.</p>
  <p>O c&#243;digo na cl&#225;usula <em>finally</em> &#233; &#250;til para liberar recursos externos (como arquivos e
  conex&#245;es de rede), n&#227;o importando se o uso deles foi bem sucedido.</p>
  <p>A constru&#231;&#227;o <tt class="keyword">try</tt> pode ser seguida da cl&#225;usula <tt class=
  "keyword">finally</tt> ou de um conjunto de cl&#225;usulas <tt class="keyword">except</tt>, mas nunca ambas (n&#227;o
  ficaria muito claro qual deve ser executada primeiro).</p>
  <h1>  9. Classes</h1>
  <p>O mecanismo de classes em Python foi adicionado &#224; linguagem de forma a minimizar a sobrecarga sint&#225;tica
  e sem&#226;ntica. &#201; uma mistura de mecanismos equivalentes encontrados em C++ e Modula-3. Assim como &#233;
  v&#225;lido para m&#243;dulos, classes em Python n&#227;o imp&#245;e barreiras entre o usu&#225;rio e a
  defini&#231;&#227;o. Contudo, dependem da ``cordialidade'' do usu&#225;rio para n&#227;o quebrar a
  defini&#231;&#227;o. Todavia, as caracter&#237;sticas mais importantes de classes foram asseguradas: o mecanismo de
  heran&#231;a permite m&#250;ltiplas classes base, uma classe derivada pode sobrescrever quaisquer m&#233;todos de uma
  classe ancestral, e um m&#233;todo pode invocar outro m&#233;todo hom&#244;nimo de uma classe ancestral. E mais,
  objetos podem armazenar uma quantidade arbitr&#225;ria de dados privados.</p>
  <p>Na terminologia de C++, todos os membros de uma classe (incluindo dados) s&#227;o <em>public</em>, e todos as
  fun&#231;&#245;es membro s&#227;o <em>virtual</em>. N&#227;o existem construtores ou destrutores especiais.</p>
  <p>Como em Modula-3, n&#227;o existem atalhos para referenciar membros do objeto de dentro dos seus m&#233;todos. Um
  m&#233;todo (fun&#231;&#227;o de classe) &#233; declarado com um primeiro argumento expl&#237;cito representando o
  objeto (inst&#226;ncia da classe) , que &#233; fornecido implicitamente pela invoca&#231;&#227;o.</p>
  <p>Como em Smalltalk (e em Java), classes s&#227;o objetos. Mas em Python, todos os tipos de dados s&#227;o objetos.
  Isso fornece uma sem&#226;ntica para importa&#231;&#227;o e renomeamento. Ao contr&#225;rio de C++ ou Modula-3, tipos
  pr&#233;-definidos podem ser utilizados como classes base para extens&#245;es de usu&#225;rio por heran&#231;a. Como
  em C++, mas diferentemente de Modula-3, a maioria dos operadores (aritim&#233;ticos, indexa&#231;&#227;o,etc) podem
  ser redefinidos para inst&#226;ncias de classe.</p>
  <h1>  9.1 Uma Palavra Sobre Terminologia</h1>
  <p>Na falta de uma terminologia de classes universalmente aceita, eu irei ocasionalmente fazer uso de termos comuns a
  Smalltalk ou C++(eu usaria termos de Modula-3 j&#225; que sua sem&#226;ntica &#233; muito pr&#243;xima a de Python,
  mas tenho a impress&#227;o de que poucos usu&#225;rios j&#225; ouviram falar dessa linguagem).</p>
  <p>Objetos tem individualidade, e podem estar vinculados a m&#250;ltiplos nomes (em diferentes escopos). Essa
  facilidade &#233; chamada <em>aliasing</em> em outras linguagens. &#192; primeira vista n&#227;o &#233; muito
  apreciada, e pode ser seguramente ignorada ao lidar com tipos imut&#225;veis (n&#250;meros, strings, tuplas).
  Entretanto, <em>aliasing</em> tem um efeito intencional sobre a sem&#226;ntica de c&#243;digo em Python envolvendo
  objetos mut&#225;veis como listas, dicion&#225;rios, e a maioria das entidades externas a um programa como arquivos,
  janelas, etc. Alias (N.d.T: sin&#244;nimos) funcionam de certa forma como ponteiros, em benef&#237;cio do
  programamdor. Por exemplo, passagem de objetos como par&#226;metro &#233; barato, pois s&#243; o ponteiro &#233;
  passado na implementa&#231;&#227;o. E se uma fun&#231;&#227;o modifica um objeto passado como argumento, o chamador
  vai ver a mudan&#231;a - o que elimina a necessidade de um duplo mecanismo de passagem de par&#226;metros como em
  Pascal.</p>
  <h1>  9.2 Escopos e Espa&#231;os de Nomes em Python</h1>
  <p>Antes de introduzir classes, &#233; preciso falar das regras de escopo em Python. Defini&#231;&#245;es de classe
  empregam alguns truques com espa&#231;os de nomes. Portanto, &#233; preciso entender bem de escopos e espa&#231;os de
  nomes antes. Esse conhecimento &#233; muito &#250;til para o programador avan&#231;ado em Python.</p>
  <p>Iniciando com algumas defini&#231;&#245;es.</p>
  <p>Um espa&#231;o de nomes &#233; um mapeamento entre nomes e objetos. Presentemente, s&#227;o implementados como
  dicion&#225;rios, isso n&#227;o &#233; percept&#237;vel (a n&#227;o ser pelo desempenho) e pode mudar no futuro.
  Exemplos de espa&#231;os de nomes s&#227;o: o conjunto de nomes pr&#233;-definidos (fun&#231;&#245;es como <tt class=
  "function">abs()</tt> e exce&#231;&#245;es), nomes globais em m&#243;dulos e nomes locais em uma fun&#231;&#227;o. De
  uma certa forma, os atributos de um objeto tamb&#233;m formam um espa&#231;o de nomes. O que h&#225; de importante
  para saber &#233; que n&#227;o existe nenhuma rela&#231;&#227;o entre nomes em espa&#231;os distintos. Por exemplo,
  dois m&#243;dulos podem definir uma fun&#231;&#227;o de nome ``maximize'' sem confus&#227;o - usu&#225;rios dos
  m&#243;dulos devem prefixar a fun&#231;&#227;o com o nome do m&#243;dulo para evitar colis&#227;o.</p>
  <p>A prop&#243;sito, eu utilizo a palavra <em>atributo</em> para qualquer nome depois de um ponto. Na express&#227;o
  <code>z.real</code>, por exemplo, <code>real</code> &#233; um atributo do objeto <code>z</code>. Estritamente
  falando, refer&#234;ncias para nomes em m&#243;dulos s&#227;o atributos: na express&#227;o
  <code>modname.funcname</code>, <code>modname</code> &#233; um objeto m&#243;dulo e <code>funcname</code> &#233; seu
  atributo. Neste caso, existe um mapeamento direto entre os os atributos de um m&#243;dulo e os nomes globais
  definidos no m&#243;dulo: eles compartilham o mesmo espa&#231;o de nomes. <a name="tex2html5" href=
  "#foot1881"><sup>9.1</sup></a></p>
  <p>Atributos podem ser somente de leitura ou n&#227;o. Atributos de m&#243;dulo s&#227;o pass&#237;veis de
  atribui&#231;&#227;o, voc&#234; pode escrever "<tt class="samp">modname.the_answer = 42</tt>", e remo&#231;&#227;o
  pelo comando <tt class="keyword">del</tt> ("<tt class="samp">del modname.the_answer</tt>").</p>
  <p>Espa&#231;os de nomes s&#227;o criados em momentos diferentes e possuem diferentes longevidades. O espa&#231;o de
  nomes que cont&#233;m os nomes pr&#233;-definidos &#233; criado quando o interpretador inicializa e nunca &#233;
  removido. O espa&#231;o de nomes global &#233; criado quando uma defini&#231;&#227;o de m&#243;dulo &#233; lida, e
  normalmente duram at&#233; a sa&#237;da do interpretador.</p>
  <p>Os comandos executados pela invoca&#231;&#227;o do interpertador, ou pela leitura de um script, ou interativamente
  s&#227;o parte do m&#243;dulo chamado <tt class="module">__main__</tt>, e portanto possuem seu pr&#243;prio
  espa&#231;o de nomes (os nomes pr&#233;-definidos possuem seu pr&#243;prio espa&#231;o de nomes no m&#243;dulo
  chamado <tt class="module">__builtin__</tt>).</p>
  <p>O espa&#231;o de nomes local para uma fun&#231;&#227;o &#233; criado quando a fun&#231;&#227;o &#233; chamada, e
  removido quando a fun&#231;&#227;o retorna ou levanta uma exce&#231;&#227;o que n&#227;o &#233; tratada na
  pr&#243;pria fun&#231;&#227;o. Naturalmente, chamadas recursivas de uma fun&#231;&#227;o possuem seus pr&#243;prios
  espa&#231;os de nomes.</p>
  <p>Um escopo &#233; uma regi&#227;o textual de um programa Python onde um espa&#231;o de nomes &#233; diretamente
  acess&#237;vel. Onde ``diretamente acess&#237;vel'' significa que uma refer&#234;ncia sem qualificador especial
  permite o acesso ao nome.</p>
  <p>Ainda que escopos sejam determinados estaticamente, eles s&#227;o usados dinamicamente. A qualquer momento durante
  a execu&#231;&#227;o, existem no m&#237;nimo tr&#234;s escopos diretamente acess&#237;veis: o escopo interno (que
  &#233; procurado primeiro) contendo nomes locais, o escopo intermedi&#225;rio (com os nomes globais do m&#243;dulo) e
  o escopo externo (procurado por &#250;ltimo) contendo os nomes pr&#233;-definidos.</p>
  <p>Se um nome &#233; declarado como global, ent&#227;o todas as refer&#234;ncias e atribui&#231;&#245;es de valores
  v&#227;o diretamente para o escopo intermedi&#225;rio que cont&#233;m os nomes do m&#243;dulo. Caso contr&#225;rio,
  todas as vari&#225;veis encontradas fora do escopo interno s&#227;o apenas para leitura (a tentativa de atribuir
  valores a essas vari&#225;veis ir&#225; simplesmente criar uma vari&#225;vel local, no escopo interno, n&#227;o
  alterando nada na vari&#225;vel de nome id&#234;ntico fora dele).</p>
  <p>Normalmente, o escopo local referencia os nomes locais da fun&#231;&#227;o corrente. Fora de fun&#231;&#245;es, o
  escopo local referencia os nomes do escopo global (espa&#231;o de nomes do m&#243;dulo). Defini&#231;&#245;es de
  classes adicionam um espa&#231;o de nomes ao escopo local.</p>
  <p>&#201; importante perceber que escopos s&#227;o determinados textualmente. O escopo global de uma fun&#231;&#227;o
  definida em um m&#243;dulo &#233; o espa&#231;o de nomes deste m&#243;dulo, sem importar de onde ou de que alias
  (N.d.T. sin&#244;nimo) a fun&#231;&#227;o &#233; invocada. Por outro lado, a efetiva busca de nomes &#233;
  din&#226;mica, ocorrendo durante a execu&#231;&#227;o. A evolu&#231;&#227;o da linguagem est&#225; caminhando para
  uma resolu&#231;&#227;o de nomes est&#225;tica, em tempo de compila&#231;&#227;o, que n&#227;o dependa de
  resolu&#231;&#227;o din&#226;mica de nomes. (de fato, vari&#225;veis locais j&#225; s&#227;o resolvidas
  estaticamente.)</p>
  <p>Um detalhe especial &#233; que atribui&#231;&#245;es s&#227;o sempre vinculadas ao escopo interno.
  Atribui&#231;&#245;es n&#227;o copiam dados, simplesmente vinculam objetos a nomes. O mesmo &#233; verdade para
  remo&#231;&#245;es. O comando "<tt class="samp">del x</tt>" remove o v&#237;nculo de <code>x</code> do espa&#231;o de
  nomes referenciado pelo escopo local. De fato, todas opera&#231;&#245;es que introduzem novos nomes usam o escopo
  local. Em particular, comandos <tt class="keyword">import</tt> e defini&#231;&#245;es de fun&#231;&#227;o vinculam o
  m&#243;dulo ou a fun&#231;&#227;o ao escopo local (a palavra-reservada <tt class="keyword">global</tt> pode ser usada
  para indicar que certas vari&#225;veis residem no escopo global ao inv&#233;s do local).</p>
  <h1>  9.3 Primeiro Contato com Classes</h1>
  <p>Classes introduzem novidades sint&#225;ticas, tr&#234;s novos tipos de objetos, e tamb&#233;m sem&#226;ntica
  nova.</p>
  <h2>  9.3.1 Sintaxe de Defini&#231;&#227;o de Classe</h2>
  <p>A forma mais simples de definir uma classe &#233;:</p>
  <div class="verbatim">
    <pre>
class NomeDaClasse:
    &lt;comando-1&gt;
    .
    .
    .
    &lt;comando-N&gt;
</pre>
  </div>
  <p>Defini&#231;&#245;es de classes, como defini&#231;&#245;es de fun&#231;&#245;es (comandos <tt class=
  "keyword">def</tt>) devem ser executados antes que tenham qualquer efeito. Voc&#234; pode colocar uma
  defini&#231;&#227;o de classe ap&#243;s um teste condicional <tt class="keyword">if</tt> ou dentro de uma
  fun&#231;&#227;o.</p>
  <p>Na pr&#225;tica, os comandos dentro de uma classe ser&#227;o defini&#231;&#245;es de fun&#231;&#245;es, mas
  existem outros comandos que s&#227;o permitidos. Defini&#231;&#245;es de fun&#231;&#227;o dentro da classe possuem um
  lista peculiar de argumentos determinada pela conven&#231;&#227;o de chamada a m&#233;todos.</p>
  <p>Quando se fornece uma defini&#231;&#227;o de classe, um novo espa&#231;o de nomes &#233; criado. Todas
  atribui&#231;&#245;es de vari&#225;veis s&#227;o vinculadas a este escopo local. Em particular, defini&#231;&#245;es
  de fun&#231;&#227;o tamb&#233;m s&#227;o armazenadas neste escopo.</p>
  <p>Quando termina o processamento de uma defini&#231;&#227;o de classe (normalmente, sem erros), um objeto de classe
  &#233; criado. Este objeto encapsula o conte&#250;do do espa&#231;o de nomes criado pela defini&#231;&#227;o da
  classe. O escopo local ativo antes da defini&#231;&#227;o da classe &#233; restaurado, e o objeto classe &#233;
  vinculado a este escopo com o nome dado a classe.</p>
  <h2>  9.3.2 Objetos de Classe</h2>
  <p>Objetos de Classe suportam dois tipos de opera&#231;&#245;es: refer&#234;ncias a atributos e
  instancia&#231;&#227;o.</p>
  <p><em>Refer&#234;ncias a atributos</em> de classe utilizam a sintaxe padr&#227;o utilizada para quaisquer
  refer&#234;ncias a atributos em Python: <code>obj.name</code>. Atributos v&#225;lidos s&#227;o todos os nomes
  presentes no espa&#231;o de nomes da classe quando o objeto classe foi criado. Portanto, se a defini&#231;&#227;o da
  classe era:</p>
  <div class="verbatim">
    <pre>
class MyClass:
    "Um exemplo simples de classe"
    i = 12345
    def f(self):
        return 'hello world'
</pre>
  </div>
  <p>ent&#227;o <code>MyClass.i</code> e <code>MyClass.f</code> s&#227;o refer&#234;ncias a atributos v&#225;lidos,
  retornando um inteiro e um objeto fun&#231;&#227;o, respectivamente. Atributos de classe podem receber
  atribui&#231;&#245;es, logo voc&#234; pode mudar o valor de <code>MyClass.i</code> por atribui&#231;&#227;o.
  <tt class="member">__doc__</tt> &#233; tamb&#233;m um atributo v&#225;lido, que retorna a docstring pertencente a
  classe: <code>"Um exemplo simples de classe"</code>.</p>
  <p><em>Instancia&#231;&#227;o de Classe</em> tamb&#233;m utiliza uma nota&#231;&#227;o de fun&#231;&#227;o. Apenas
  finja que o objeto classe n&#227;o possui par&#226;metros e retorna uma nova inst&#226;ncia da classe. Por
  exemplo:</p>
  <div class="verbatim">
    <pre>
x = MyClass()
</pre>
  </div>
  <p>cria uma nova <em>inst&#226;ncia</em> da classe e atribui o objeto resultante a vari&#225;vel local
  <code>x</code>.</p>
  <p>A opera&#231;&#227;o de instancia&#231;&#227;o (``calling'' um objeto de classe) cria um objeto vazio. Muitas
  classes preferem criar um novo objeto em um estado inicial pr&#233;-determinado. Para tanto, existe um m&#233;todo
  especial que pode ser definido pela classe, <tt class="method">__init__()</tt>, veja:</p>
  <div class="verbatim">
    <pre>
    def __init__(self):
        self.data = []
</pre>
  </div>
  <p>Quando uma classe define um m&#233;todo <tt class="method">__init__()</tt>, o processo de
  inst&#226;ncia&#231;&#227;o autom&#225;ticamente invoca <tt class="method">__init__()</tt> sobre a rec&#233;m-criada
  inst&#226;ncia de classe. Neste exemplo, uma nova int&#226;ncia j&#225; inicializada pode ser obtida por:</p>
  <div class="verbatim">
    <pre>
x = MyClass()
</pre>
  </div>
  <p>Naturalmente, o m&#233;todo <tt class="method">__init__()</tt> pode ter argumentos para aumentar sua
  flexibilidade. Neste caso, os argumentos passados para a instancia&#231;&#227;o de classe ser&#227;o delegados para o
  m&#233;todo <tt class="method">__init__()</tt>. Como ilustrado em:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; class Complex:
...     def __init__(self, realpart, imagpart):
...         self.r = realpart
...         self.i = imagpart
... 
&gt;&gt;&gt; x = Complex(3.0, -4.5)
&gt;&gt;&gt; x.r, x.i
(3.0, -4.5)
</pre>
  </div>
  <h2>  9.3.3 Inst&#226;ncias</h2>
  <p>Agora, o que podemos fazer com inst&#226;ncias ? As &#250;nicas opera&#231;&#245;es reconhecidas por
  inst&#226;ncias s&#227;o refer&#234;ncias a atributos. Existem dois tipos de nomes de atributos v&#225;lidos:
  atributos de dados e m&#233;todos.</p>
  <p><em>Atributos-de-dados</em>, que correspondem a ``vari&#225;veis de inst&#226;ncia'' em Smalltalk, e a ``membros''
  em C++. Atributos-de-dados n&#227;o n&#227;o precisam ser declarados. Assim como vari&#225;veis locais, eles passam a
  existir na primeira vez em que &#233; feita uma atribui&#231;&#227;o. Por exemplo, se <code>x</code> &#233; uma
  inst&#226;ncia de <tt class="class">MyClass</tt> criada acima, o pr&#243;ximo trecho de c&#243;digo ir&#225; imprimir
  o valor <code>16</code>, sem deixar rastro (por causa do <tt class="keyword">del</tt>):</p>
  <div class="verbatim">
    <pre>
x.counter = 1
while x.counter &lt; 10:
    x.counter = x.counter * 2
print x.counter
del x.counter
</pre>
  </div>
  <p>O outro tipo de refer&#234;ncias a atributos s&#227;o <em>m&#233;todos</em>. Um m&#233;todo &#233; uma
  fun&#231;&#227;o que ``pertence a'' uma inst&#226;ncia (em Python, o termo m&#233;todo n&#227;o &#233; aplicado
  exclusivamente a inst&#226;ncias de classes definidas pelo usu&#225;rio: outros tipos de objetos tamb&#233;m podem
  ter m&#233;todos; por exemplo, objetos listas possuem os m&#233;todos: append, insert, remove, sort, etc).</p>
  <p>Nomes de m&#233;todos v&#225;lidos de uma inst&#226;ncia dependem de sua classe. Por defini&#231;&#227;o, todos
  atributos de uma classe que s&#227;o fun&#231;&#245;es equivalem a um m&#233;todo presente nas inst&#226;ncias. No
  nosso exemplo, <code>x.f</code> &#233; uma refer&#234;ncia de m&#233;todo v&#225;lida j&#225; que
  <code>MyClass.f</code> &#233; uma fun&#231;&#227;o, enquanto <code>x.i</code> n&#227;o &#233;, j&#225; que
  <code>MyClass.i</code> n&#227;o &#233; fun&#231;&#227;o. Entretanto, <code>x.f</code> n&#227;o &#233; o mesmo que
  <code>MyClass.f</code> -- o primeiro &#233; um m&#233;todo de objeto <a id='l2h-30' xml:id='l2h-30'></a>, o segundo
  &#233; um objeto fun&#231;&#227;o.</p>
  <h2>  9.3.4 M&#233;todos de Objeto</h2>
  <p>Normalmente, um m&#233;todo &#233; chamado imediatamente:</p>
  <div class="verbatim">
    <pre>
x.f()
</pre>
  </div>
  <p>No exemplo com <tt class="class">MyClass</tt> o resultado ser&#225; a string <code>'hello world'</code>. No
  entanto, n&#227;o &#233; obrigat&#243;tio chamar o m&#233;todo imediatamente: como <code>x.f</code> &#233;
  tamb&#233;m um objeto (tipo m&#233;todo), ele pode ser armazenado e invocado a posteriori. Por exemplo:</p>
  <div class="verbatim">
    <pre>
xf = x.f
while True:
    print xf()
</pre>
  </div>
  <p>continuar&#225; imprimindo "<tt class="samp">hello world</tt>" at&#233; o final dos tempos.</p>
  <p>O que ocorre precisamente quando um m&#233;todo &#233; chamado&nbsp;? Voc&#234; deve ter notado que
  <code>x.f()</code> foi chamado sem nenhum par&#226;metro, por&#233;m a defini&#231;&#227;o da fun&#231;&#227;o
  <tt class="method">f</tt> especificava um argumento. O que aconteceu com o argumento&nbsp;? Certamente Python
  levantaria uma exce&#231;&#227;o se o argumento estivesse faltando...</p>
  <p>Talvez voc&#234; j&#225; tenha advinhado a resposta: o que h&#225; de especial em m&#233;todos &#233; que o objeto
  (a qual o m&#233;todo pertence) &#233; passado como o primeiro argumento da fun&#231;&#227;o. No nosso exemplo, a
  chamada <code>x.f()</code> &#233; exatamente equivalente a <code>MyClass.f(x)</code>. Em geral, chamar um m&#233;todo
  com uma lista de <var>n</var> argumentos &#233; equivalente a chamar a fun&#231;&#227;o na classe correspondente
  passando a inst&#226;ncia como o primeiro argumento antes dos demais argumentos.</p>
  <p>Se voc&#234; ainda n&#227;o entendeu como m&#233;todos funcionam, talvez uma olhadela na implementa&#231;&#227;o
  sirva para clarear as coisas. Quando um atributo de inst&#226;ncia &#233; referenciado e n&#227;o &#233; um atributo
  de dado, a sua classe &#233; procurada. Se o nome indica um atributo de classe v&#225;lido que seja um objeto
  fun&#231;&#227;o, um objeto m&#233;todo &#233; criado pela composi&#231;&#227;o da inst&#226;ncia alvo e do objeto
  fun&#231;&#227;o. Quando o m&#233;todo &#233; chamado com uma lista de argumentos, ele &#233; desempacotado, uma nova
  lista de argumentos &#233; criada a partir da inst&#226;ncia original e da lista original de argumentos do
  m&#233;todo. Finalmente, a fun&#231;&#227;o &#233; chamada com a nova lista de argumentos.</p>
  <h1>  9.4 Observa&#231;&#245;es Aleat&#243;rias</h1>
  <p>Atributos de dados sobrescrevem atributos m&#233;todos hom&#244;nimos. Para evitar conflitos de nome acidentais,
  que podem gerar bugs de dif&#237;cil rastreio em programas extensos, &#233; s&#225;bio utilizar algum tipo de
  conven&#231;&#227;o que minimize a chance de conflitos. Algumas id&#233;ias incluem colocar nomes de m&#233;todos com
  inicial mai&#250;scula, prefixar atributos de dados com uma string &#250;nica (quem sabe ``_''), ou simplesmente
  utilizar substantivos para atributos e verbos para m&#233;todos.</p>
  <p>Atributos de dados podem ser referenciados por m&#233;todos da pr&#243;pria inst&#226;ncia, bem como por qualquer
  outro usu&#225;rio do objeto. Em outras palavras, classes n&#227;o servem para implementar tipos puramente abstratos
  de dados. De fato, nada em Python torna poss&#237;vel assegurar o encapsulamento de dados. Tudo &#233;
  conven&#231;&#227;o. Por outro lado, a implementa&#231;&#227;o Python, escrita em C, pode esconder completamente
  detalhes de um objeto ou regular seu acesso se necess&#225;rio. Isto pode ser utilizado por extens&#245;es a Python
  escritas em C.</p>
  <p>Clientes devem utilizar atributos de dados com cuidado, pois podem bagun&#231;ar invariantes mantidos pelos
  m&#233;todos ao esbarrar nos seus atributos. Portanto, clientes podem adicionar &#224; vontade atributos de dados
  para uma inst&#226;ncia sem afetar a validade dos m&#233;todos, desde que seja evitado o conflito de nomes.
  Novamente, uma conven&#231;&#227;o de nomenclatura poupa muita dor de cabe&#231;a.</p>
  <p>N&#227;o existe atalho para referenciar atributos de dados (ou m&#233;todos) de dentro de um m&#233;todo. Isso na
  verdade aumenta a legibilidade dos m&#233;todos: n&#227;o h&#225; como confundir uma vari&#225;vel local com uma
  inst&#226;ncia global ao dar uma olhadela em um m&#233;todo desconhecido.</p>
  <p>Frequentemente, o primeiro argumento de qualquer m&#233;todo &#233; chamado <code>self</code>. Isso n&#227;o
  &#233; nada mais do que uma conven&#231;&#227;o, <code>self</code> n&#227;o possui nenhum significado especial em
  Python (observe que ao seguir a conven&#231;&#227;o seu c&#243;digo se torna leg&#237;vel por uma grande comunidade
  de desenvolvedores Python e potencialmente poder&#225; se beneficiar de ferramentas feitas por outr&#233;m que se
  baseie na conven&#231;&#227;o).</p>
  <p>Qualquer fun&#231;&#227;o que &#233; tamb&#233;m atributo de classe, define um m&#233;todo nas inst&#226;ncias
  desta classe. N&#227;o &#233; necess&#225;rio que a defini&#231;&#227;o da fun&#231;&#227;o esteja textualmente
  embutida na defini&#231;&#227;o da classe. Atribuir um objeto fun&#231;&#227;o a uma vari&#225;vel local da classe
  &#233; v&#225;lido. Por exemplo:</p>
  <div class="verbatim">
    <pre>
# Fun&#231;&#227;o definida fora da classe
def f1(self, x, y):
    return min(x, x+y)
class C:
    f = f1
    def g(self):
        return 'hello world'
    h = g
</pre>
  </div>
  <p>Agora <code>f</code>, <code>g</code> e <code>h</code> s&#227;o todos atributos da classe <tt class="class">C</tt>
  que referenciam fun&#231;&#245;es, e consequentemente s&#227;o todos m&#233;todos de inst&#226;ncias da classe
  <tt class="class">C</tt>, onde <code>h</code> &#233; equivalente a <code>g</code>. No entanto, essa pr&#225;tica pode
  confundir o leitor do programa.</p>
  <p>M&#233;todos podem chamar outros m&#233;todos utilizando o argumento <code>self</code> :</p>
  <div class="verbatim">
    <pre>
class Bag:
    def __init__(self):
        self.data = []
    def add(self, x):
        self.data.append(x)
    def addtwice(self, x):
        self.add(x)
        self.add(x)
</pre>
  </div>
  <p>M&#233;todos podem referenciar nomes globais da mesma forma que fun&#231;&#245;es ordin&#225;rias. O escopo global
  associado a um m&#233;todo &#233; o m&#243;dulo contendo sua defini&#231;&#227;o de classe (a classe propriamente
  dita nunca &#233; usada como escopo global!). Ainda que seja raro encontrar a necessidade de utilizar dados globais
  em um m&#233;todo, h&#225; diversos usos leg&#237;timos do escopo global. Por exemplo, fun&#231;&#245;es e
  m&#243;dulos importados no escopo global podem ser usados por m&#233;todos, bem como as fun&#231;&#245;es e classes
  definidas no pr&#243;prio escopo global. Provavelmente, a classe contendo o m&#233;todo em quest&#227;o tamb&#233;m
  foi definida neste escopo global. Na pr&#243;xima se&#231;&#227;o veremos um conjunto de raz&#245;es pelas quais um
  m&#233;todo desejaria referenciar sua pr&#243;pria classe.</p>
  <h1>  9.5 Heran&#231;a</h1>
  <p>Obviamente, uma caracter&#237;stica de linguagem n&#227;o seria digna do nome ``classe'' se n&#227;o suportasse
  heran&#231;a. A sintaxe para uma classe derivada se parece com:</p>
  <div class="verbatim">
    <pre>
class DerivedClassName(BaseClassName):
    &lt;statement-1&gt;
    .
    .
    .
    &lt;statement-N&gt;
</pre>
  </div>
  <p>O nome <tt class="class">BaseClassName</tt> deve estar definido em um escopo contendo a defini&#231;&#227;o da
  classe derivada. No lugar do nome da classe base, tamb&#233;m s&#227;o aceitas outras express&#245;es. Isso &#233;
  muito &#250;til, por exemplo, quando a classe base &#233; definida em outro m&#243;dulo:</p>
  <div class="verbatim">
    <pre>
class DerivedClassName(modname.BaseClassName):
</pre>
  </div>
  <p>Execu&#231;&#227;o de uma defini&#231;&#227;o de classe derivada procede da mesma forma que a de uma classe base.
  Quando o objeto classe &#233; constru&#237;do, a classe base &#233; lembrada. Isso &#233; utilizado para resolver
  refer&#234;ncias a atributos. Se um atributo requisitado n&#227;o for encontrado na classe, ele &#233; procurado na
  classe base. Essa regra &#233; aplicada recursivamente se a classe base por sua vez for derivada de outra.</p>
  <p>N&#227;o existe nada de especial sobre instancia&#231;&#227;o de classes derivadas.
  <code>DerivedClassName()</code> cria uma nova inst&#226;ncia da classe. Refer&#234;ncias a m&#233;todos s&#227;o
  resolvidas da seguinte forma: o atributo correspondente &#233; procurado atrav&#233;s da cadeia de
  deriva&#231;&#227;o, e refer&#234;ncias a m&#233;todos s&#227;o v&#225;lidas desde que produzam um objeto do tipo
  fun&#231;&#227;o.</p>
  <p>Classes derivadas podem sobrescrever m&#233;todos das suas classes base. Uma vez que m&#233;todos n&#227;o possuem
  privil&#233;gios especiais quando invocam outros m&#233;todos no mesmo objeto, um m&#233;todo na classe base que
  invocava um outro m&#233;todo da mesma classe base, pode efetivamente acabar invocando um m&#233;todo sobreposto por
  uma classe derivada. Para programadores C++ isso significa que todos os m&#233;todos em Python s&#227;o efetivamente
  <tt class="keyword">virtual</tt>.</p>
  <p>Um m&#233;todo que sobrescreva outro em uma classe derivada pode desejar na verdade estender, ao inv&#233;s de
  substituir, o m&#233;todo sobrescrito de mesmo nome na classe base. A maneira mais simples de implementar esse
  comportamento &#233; chamar diretamente a classe base "<tt class="samp">BaseClassName.methodname(self,
  arguments)</tt>". O que pode ser &#250;til para os usu&#225;rios da classe tamb&#233;m. Note que isso s&#243;
  funciona se a classe base for definida ou importada diretamente no escopo global.</p>
  <h2>  9.5.1 Heran&#231;a M&#250;ltipla</h2>
  <p>Python tamb&#233;m suporta uma forma limitada de heran&#231;a m&#250;ltipla. Uma defini&#231;&#227;o de classe que
  herda de v&#225;rias classes base &#233;:</p>
  <div class="verbatim">
    <pre>
class DerivedClassName(Base1, Base2, Base3):
    &lt;statement-1&gt;
    .
    .
    .
    &lt;statement-N&gt;
</pre>
  </div>
  <p>A &#250;nica regra que precisa ser explicada &#233; a sem&#226;ntica de resolu&#231;&#227;o para as
  refer&#234;ncias a atributos de classe. &#201; feita uma busca em profundidade da esquerda para a direita. Logo, se
  um atributo n&#227;o &#233; encontrado em <tt class="class">DerivedClassName</tt>, ele &#233; procurado em <tt class=
  "class">Base1</tt>, e recursivamente nas classes bases de <tt class="class">Base1</tt>, e apenas se n&#227;o for
  encontrado l&#225; a busca prosseguir&#225; em <tt class="class">Base2</tt>, e assim sucessivamente.</p>
  <p>Para algumas pessoas a busca em largura - procurar antes em <tt class="class">Base2</tt> e <tt class=
  "class">Base3</tt> do que nos ancestrais de <tt class="class">Base1</tt> -- parece mais natural. Entretanto, seria
  preciso conhecer toda a hierarquia de <tt class="class">Base1</tt> para evitar um conflito com um atributo de
  <tt class="class">Base2</tt>. Enquanto a busca em profundidade n&#227;o diferencia o acesso a atributos diretos ou
  herdados de <tt class="class">Base1</tt>.</p>
  <p>&#201; sabido que o uso indiscriminado de heran&#231;a m&#250;ltipla &#233; o pesadelo da manuten&#231;&#227;o,
  sobretudo pela confian&#231;a de Python na ado&#231;&#227;o de uma conven&#231;&#227;o de nomenclatura para evitar
  conflitos. Um problema bem conhecido com heran&#231;a m&#250;ltipla &#233; quando h&#225; uma classe derivada de
  outras que por sua vez possuem um ancestral em comum. Ainda que seja perfeitamente claro o que acontecer&#225; (a
  inst&#226;ncia possuir&#225; uma &#250;nica c&#243;pia dos atributos de dados do ancestral comum), n&#227;o est&#225;
  claro se a sem&#226;ntica &#233; &#250;til.</p>
  <h1>  9.6 Vari&#225;veis Privadas</h1>
  <p>Existe um suporte limitado a identificadores privados em classes. Qualquer identificador no formato
  <code>__spam</code> (no m&#237;nimo dois caracteres `_' no prefixo e no m&#225;ximo u m como sufixo) &#233;
  substitu&#237;do por <code>_classname__spam</code>, onde <code>classname</code> &#233; o nome da classe corrente.
  Essa constru&#231;&#227;o independe da posi&#231;&#227;o sint&#225;tica do identificador, e pode ser usada para
  tornar privadas: inst&#226;ncias, vari&#225;veis de classe e m&#233;todos. Pode haver truncamento se o nome combinado
  extrapolar 255 caracteres. Fora de classes, ou quando o nome da classe s&#243; tem `_', n&#227;o se aplica esta
  constru&#231;&#227;o.</p>
  <p>Este procedimento visa oferecer a classes uma maneira f&#225;cil de definir vari&#225;veis de inst&#226;ncia e
  m&#233;todos ``privados'', sem ter que se preocupar com outras vari&#225;veis de inst&#226;ncia definidas em classes
  derivadas ou definidas fora da classe. Apesar da regra de nomenclatura ter sido projetada para evitar ``acidentes'',
  ainda &#233; poss&#237;vel o acesso e a manipula&#231;&#227;o de entidades privadas. O que &#233; &#250;til em
  determinadas circunst&#226;ncias, como no caso de depuradores, talvez a &#250;nica raz&#227;o pela qual essa
  caracter&#237;stica ainda n&#227;o tenha sido suprimida (detalhe: derivar uma classe com o mesmo nome da classe base
  torna poss&#237;vel o uso de seus membros privados! Isso pode ser corrigido em vers&#245;es futuras).</p>
  <p>Observe que c&#243;digo passado para <code>exec</code>, <code>eval()</code> ou <code>evalfile()</code> n&#227;o
  considera o nome da classe que o invocou como sendo a classe corrente. O modificador <code>global</code> funciona de
  maneira semelhante, quando se est&#225; restrito ao c&#243;digo que foi byte-compilado em conjunto. A mesma
  restri&#231;&#227;o se aplica aos comandos <code>getattr()</code>, <code>setattr()</code> e <code>delattr()</code>, e
  a manipula&#231;&#227;o direta do dicion&#225;rio <code>__dict__</code>.</p>
  <h1>  9.7 Particularidades</h1>
  <p>&#192;s vezes, &#233; &#250;til ter um tipo semelhante ao ``record'' de Pascal ou ao ``struct'' de C. Uma
  defini&#231;&#227;o de classe vazia atende esse prop&#243;sito:</p>
  <div class="verbatim">
    <pre>
class Employee:
    pass
john = Employee() # Cria um registro vazio de Empregado
# Preenche os campos do registro
john.name = 'John Doe'
john.dept = 'computer lab'
john.salary = 1000
</pre>
  </div>
  <p>Um trecho de c&#243;digo Python que espera um tipo abstrato de dado em particular, pode receber ao inv&#233;s do
  tipo abstrato uma classe (que emula os m&#233;todos que aquele tipo suporta). Por exemplo, se voc&#234; tem uma
  fun&#231;&#227;o que formata dados em um objeto arquivo, voc&#234; pode definir uma classe com os m&#233;todos
  <tt class="method">read()</tt> e <tt class="method">readline()</tt> que utiliza um buffer ao inv&#233;s do arquivo
  propriamente dito.</p>
  <p>M&#233;todos de inst&#226;ncia s&#227;o objetos, e podem possuir atributos tamb&#233;m: <code>m.im_self</code>
  &#233; o objeto ao qual o m&#233;todo est&#225; ligado, e <code>m.im_func</code> &#233; o objeto fun&#231;&#227;o
  correspondente ao m&#233;todo.</p>
  <h2>  9.7.1 Exce&#231;&#245;es Tamb&#233;m S&#227;o Classes</h2>
  <p>Exce&#231;&#245;es definidas pelo usu&#225;rio s&#227;o identificadas por classes. Atrav&#233;s deste mecanismo
  &#233; poss&#237;vel criar hierarquias extens&#237;veis de exce&#231;&#245;es.</p>
  <p>Existem duas novas sem&#226;nticas v&#225;lidas para o comando <tt class="keyword">raise</tt>:</p>
  <div class="verbatim">
    <pre>
raise Class, instance
raise instance
</pre>
  </div>
  <p>Na primeira forma, <code>instance</code> deve ser uma inst&#226;ncia de <tt class="class">Class</tt> ou de uma
  classe derivada dela. A segunda forma &#233; um atalho para:</p>
  <div class="verbatim">
    <pre>
raise instance.__class__, instance
</pre>
  </div>
  <p>Uma classe em uma cl&#225;usula de exce&#231;&#227;o &#233; compat&#237;vel com a exce&#231;&#227;o se &#233; a
  mesma classe prevista na cl&#225;usula ou ancestral dela (n&#227;o o contr&#225;rio, se na cl&#225;usula estiver uma
  classe derivada n&#227;o haver&#225; casamento com exce&#231;&#245;es base levantadas). No exemplo a seguir ser&#225;
  impresso B, C, D nessa ordem:</p>
  <div class="verbatim">
    <pre>
class B:
    pass
class C(B):
    pass
class D(C):
    pass
for c in [B, C, D]:
    try:
        raise c()
    except D:
        print "D"
    except C:
        print "C"
    except B:
        print "B"
</pre>
  </div>
  <p>Se a ordem das cl&#225;usulas fosse invertida (B no in&#237;cio), seria impresso B, B, B - sempre a primeira
  cl&#225;usula v&#225;lida &#233; ativada.</p>
  <p>Quando uma mensagem de erro &#233; impressa para uma exce&#231;&#227;o n&#227;o tratada, o nome da classe da
  exce&#231;&#227;o &#233; impresso, e depois a inst&#226;ncia da exce&#231;&#227;o &#233; convertida para string pela
  fun&#231;&#227;o <tt class="function">str()</tt> e &#233; tamb&#233;m impressa (ap&#243;s um espa&#231;o e uma
  v&#237;rgula).</p>
  <h1>  9.8 Iteradores</h1>
  <p>Voc&#234; j&#225; deve ter notado que pode usar la&#231;os com a maioria das cont&#234;ineres usando um comando
  <tt class="keyword">for</tt>:</p>
  <div class="verbatim">
    <pre>
for element in [1, 2, 3]:
    print element
for element in (1, 2, 3):
    print element
for key in {'one':1, 'two':2}:
    print key
for char in "123":
    print char
for line in open("myfile.txt"):
    print line
</pre>
  </div>
  <p>Este estilo de acesso &#233; limpo, conciso e muito conveniente. O uso de iteradores promove uma
  unifica&#231;&#227;o ao longo de toda a linguagem. Por tr&#225;s dos bastidores, o comando <tt class=
  "keyword">for</tt> chama <tt class="function">iter()</tt> no cont&#234;iner. Essa fun&#231;&#227;o retorna um
  iterador que define o m&#233;todo <tt class="method">next()</tt>, que acessa os elementos da sequ&#234;ncia um por
  vez. Quando acabam os elementos, <tt class="method">nex()</tt> levanta a exce&#231;&#227;o <tt class=
  "exception">StopIteration</tt>, indicando que o la&#231;o <tt class="keyword">for</tt> deve encerrar. Este exemplo
  mostra como tudo funciona:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; s = 'abc'
&gt;&gt;&gt; it = iter(s)
&gt;&gt;&gt; it
&lt;iterator object at 0x00A1DB50&gt;
&gt;&gt;&gt; it.next()
'a'
&gt;&gt;&gt; it.next()
'b'
&gt;&gt;&gt; it.next()
'c'
&gt;&gt;&gt; it.next()
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in ?
    it.next()
StopIteration
</pre>
  </div>
  <p>Vendo o mecanismo por tr&#225;s do protocolo usado pelos iteradores, torna-se f&#225;cil adicionar esse
  comportamento &#224;s suas classes. Defina uma m&#233;todo <tt class="method">__iter__()</tt> que retorna um objeto
  com um m&#233;todo <tt class="method">next()</tt>. Se a classe definir <tt class="method">next()</tt>, ent&#227;o
  <tt class="method">__iter__()</tt> pode simplesmente retornar <code>self</code>:</p>
  <div class="verbatim">
    <pre>
class Reverse:
    "Iterator for looping over a sequence backwards"
    def __init__(self, data):
        self.data = data
        self.index = len(data)
    def __iter__(self):
        return self
    def next(self):
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.data[self.index]
&gt;&gt;&gt; for char in Reverse('spam'):
...     print char
...
m
a
p
s
</pre>
  </div>
  <h1>  9.9 Geradores</h1>
  <p>Geradores s&#227;o uma maneira f&#225;cil e poderosa de criar iteradores. Eles s&#227;o escritos como uma
  fun&#231;&#227;o normal, mas usam o comando <tt class="keyword">yield()</tt> quando desejam retornar dados. Cada vez
  que <tt class="method">next()</tt> &#233; chamado, o gerador continua a partir de onde parou (sempre mantendo na
  mem&#243;ria os valores e o &#250;ltimo comando executado). Um exemplo mostra como geradores podem ser muito
  f&#225;ceis de criar:</p>
  <div class="verbatim">
    <pre>
def reverse(data):
    for index in range(len(data)-1, -1, -1):
        yield data[index]
        
&gt;&gt;&gt; for char in reverse('golf'):
...     print char
...
f
l
o
g
</pre>
  </div>
  <p>Qualquer coisa feita com geradores tamb&#233;m pode ser feita com iteradores baseados numa classe, como descrito
  na se&#231;&#227;o anterior. O que torna geradores t&#227;o compactos &#233; que os m&#233;todos <tt class=
  "method">__iter__()</tt> e <tt class="method">next()</tt> s&#227;o criados automaticamente.</p>
  <p>Outro ponto chave &#233; que as vari&#225;veis locais e o estado da execuca&#231;&#227;o s&#227;o memorizados
  automaticamente entre as chamadas. Isto torna a fun&#231;&#227;o mais f&#225;cil de escrever e muito mais clara do
  que uma abordagem usando vari&#225;veis como <code>self.index</code> and <code>self.data</code>.</p>
  <p>Al&#233;m disso, quando geradores terminam, eles levantam <tt class="exception">StopIteration</tt>
  automaticamente. Combinados, todos estes aspectos tornam a cria&#231;&#227;o de iteradores t&#227;o f&#225;cil quanto
  a de uma fun&#231;&#227;o normal.</p>
  <h1>  9.10 Express&#245;es Geradoras</h1>
  <p>Alguns geradores simples podem ser escritos sucintamente como express&#245;es usando uma sintaxe similar a de
  abrang&#234;ncia de listas, mas com par&#234;nteses ao inv&#233;s de colchetes. Essas express&#245;es s&#227;o
  destinadas a situa&#231;&#245;es em que o gerador &#233; usado imediatamente por uma fun&#231;&#227;o.
  Express&#245;es geradoras tendem a ser mais compactas, por&#233;m menos vers&#225;teis do que uma defini&#231;&#227;o
  completa de um gerador, e tendem a ser muito mais amig&#225;veis no consumo de mem&#243;ria do que uma
  abrang&#234;ncia de lista equivalente.</p>
  <p>Exemplos:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; sum(i*i for i in range(10))                 # sum of squares
285
&gt;&gt;&gt; xvec = [10, 20, 30]
&gt;&gt;&gt; yvec = [7, 5, 3]
&gt;&gt;&gt; sum(x*y for x,y in zip(xvec, yvec))         # dot product
260
&gt;&gt;&gt; from math import pi, sin
&gt;&gt;&gt; sine_table = dict((x, sin(x*pi/180)) for x in range(0, 91))
&gt;&gt;&gt; unique_words = set(word  for line in page  for word in line.split())
&gt;&gt;&gt; valedictorian = max((student.gpa, student.name) for student in graduates)
&gt;&gt;&gt; data = 'golf'
&gt;&gt;&gt; list(data[i] for i in range(len(data)-1,-1,-1))
['f', 'l', 'o', 'g']
</pre>
  </div>
  <h1>  10. Um Breve Passeio Pela Biblioteca Padr&#227;o</h1>
  <h1>  10.1 Interface Com o Sistema Operacional</h1>
  <p>O m&#243;dulo <a class="ulink" href="../lib/module-os.html"><tt class="module">os</tt></a> fornece d&#250;zias de
  f&#250;n&#231;&#245;es para interagir com o sistema operacional:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; import os
&gt;&gt;&gt; os.system('time 0:02')
0
&gt;&gt;&gt; os.getcwd()      # Retorna o diret&#243;rio de trabalho atual
'C:\\Python24'
&gt;&gt;&gt; os.chdir('/server/accesslogs')
</pre>
  </div>
  <p>Tome cuidado para usar a forma "<tt class="samp">import os</tt>" ao inv&#233;s de "<tt class="samp">from os import
  *</tt>". Isto evitar&#225; que <tt class="function">os.open()</tt> oculte a fun&#231;&#227;o <tt class=
  "function">open()</tt> que opera de forma muito diferente.</p>
  <p><a id='l2h-31' xml:id='l2h-31'></a>As fun&#231;&#245;es internas <tt class="function">dir()</tt> e <tt class=
  "function">help()</tt> s&#227;o &#250;teis como um sistema de ajuda interativa pra lidar com m&#243;dulos grandes
  como <tt class="module">os</tt>:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; import os
&gt;&gt;&gt; dir(os)
&lt;returns a list of all module functions&gt;
&gt;&gt;&gt; help(os)
&lt;returns an extensive manual page created from the module's docstrings&gt;
</pre>
  </div>
  <p>Para tarefas de gerenciamento di&#225;rio de arquivos e diret&#243;rios, o m&#243;dulo <a class="ulink" href=
  "../lib/module-shutil.html"><tt class="module">shutil</tt></a> fornece uma interface de alto n&#237;vel bem que
  &#233; mais simples de usar:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; import shutil
&gt;&gt;&gt; shutil.copyfile('data.db', 'archive.db')
&gt;&gt;&gt; shutil.move('/build/executables', 'installdir')
</pre>
  </div>
  <h1>  10.2 Caracteres Coringa</h1>
  <p>O m&#243;dulo <a class="ulink" href="../lib/module-glob.html"><tt class="module">glob</tt></a> fornece uma
  fun&#231;&#227;o para criar listas de arquivos a partir de buscas em diret&#243;rios usando caracteres coringa:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; import glob
&gt;&gt;&gt; glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']
</pre>
  </div>
  <h1>  10.3 Argumentos da Linha de Comando</h1>
  <p>Scripts geralmente precisam processar argumentos passados na linha de comando. Esses argumentos s&#227;o
  armazenados como uma lista no atributo <var>argv</var> do m&#243;dulo <a class="ulink" href=
  "../lib/module-sys.html"><tt class="module">sys</tt></a>. Por exemplo, ter&#237;amos a seguinte sa&#237;da executando
  "<tt class="samp">python demo.py um dois tres</tt>" na linha de comando:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; import sys
&gt;&gt;&gt; print sys.argv
['demo.py', 'um', 'dois', 'tres']
</pre>
  </div>
  <p>O m&#243;dulo <a class="ulink" href="../lib/module-getopt.html"><tt class="module">getopt</tt></a> processa os
  argumentos passados em <var>sys.argv</var> usando as conven&#231;&#245;es da fun&#231;&#227;o <span class=
  "Unix">Unix</span> <tt class="function">getopt()</tt>. Outros recursos de processamento mais poderosos e
  flex&#237;veis est&#227;o dispon&#237;veis no m&#243;dulo <a class="ulink" href=
  "../lib/module-optparse.html"><tt class="module">optparse</tt></a>.</p>
  <h1>  10.4 Redirecionamento de Erros e Encerramento do Programa</h1>
  <p>O m&#243;dulo <a class="ulink" href="../lib/module-sys.html"><tt class="module">sys</tt></a> tamb&#233;m possui
  atributos para <var>stdin</var>, <var>stdout</var>, e <var>stderr</var> (entrada e sa&#237;da de dados padr&#227;o,
  sa&#237;da de erros, respectivamente). O &#250;ltimo &#233; usado para emitir avisos e mensagens de erro
  vis&#237;veis mesmo quando <var>stdout</var> foi redirecionado:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; sys.stderr.write('Warning, log file not found starting a new one\n')
Warning, log file not found starting a new one
</pre>
  </div>
  <p>A forma mais direta de encerrar um script &#233; usando "<tt class="samp">sys.exit()</tt>".</p>
  <h1>  10.5 Reconhecimento de Padr&#245;es em Strings</h1>
  <p>O m&#243;dulo <a class="ulink" href="../lib/module-re.html"><tt class="module">re</tt></a> fornece ferramentas
  para lidar processamento de strings atrav&#233;s de express&#245;es regulares. Para reconhecimento de padr&#245;es
  complexos e manipula&#231;&#245;es elaboradas, express&#245;es regulares oferecem uma solu&#231;&#227;o sucinta e
  eficiente:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; import re
&gt;&gt;&gt; re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
&gt;&gt;&gt; re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'
</pre>
  </div>
  <p>Quando as exig&#234;ncias s&#227;o simples, m&#233;todos de strings s&#227;o prefer&#237;veis por serem mais
  f&#225;ceis de ler e depurar:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; 'tea for too'.replace('too', 'two')
'tea for two'
</pre>
  </div>
  <h1>  10.6 Matem&#225;tica</h1>
  <p>O m&#243;dulo <a class="ulink" href="../lib/module-math.html"><tt class="module">math</tt></a> oferece acesso
  &#224;s fun&#231;&#245;es da biblioteca C para matem&#225;tica e ponto flutuante:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; import math
&gt;&gt;&gt; math.cos(math.pi / 4.0)
0.70710678118654757
&gt;&gt;&gt; math.log(1024, 2)
10.0
</pre>
  </div>
  <p>O m&#243;dulo <a class="ulink" href="../lib/module-random.html"><tt class="module">random</tt></a> fornece
  ferramentas para gerar sele&#231;&#245;es aleat&#243;rias:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; import random
&gt;&gt;&gt; random.choice(['apple', 'pear', 'banana'])
'apple'
&gt;&gt;&gt; random.sample(xrange(100), 10)   # sampling without replacement
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
&gt;&gt;&gt; random.random()    # random float
0.17970987693706186
&gt;&gt;&gt; random.randrange(6)    # random integer chosen from range(6)
4
</pre>
  </div>
  <h1>  10.7 Acesso &#224; Internet</h1>
  <p>H&#225; diversos m&#243;dulos para acesso e processamento de protocolos da internet. Dois dos mais simples
  s&#227;o <a class="ulink" href="../lib/module-urllib2.html"><tt class="module">urllib2</tt></a> para efetuar
  <em>download</em> de dados a partir de urls e <a class="ulink" href="../lib/module-smtplib.html"><tt class=
  "module">smtplib</tt></a> para enviar mensagens de correio eletr&#244;nico:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; import urllib2
&gt;&gt;&gt; for line in urllib2.urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'):
...     if 'EST' in line:      # look for Eastern Standard Time
...         print line
    
&lt;BR&gt;Nov. 25, 09:43:32 PM EST
&gt;&gt;&gt; import smtplib
&gt;&gt;&gt; server = smtplib.SMTP('localhost')
&gt;&gt;&gt; server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
"""To: jcaesar@example.org
From: soothsayer@example.org
Beware the Ides of March.
""")
&gt;&gt;&gt; server.quit()
</pre>
  </div>
  <h1>  10.8 Data e Hora</h1>
  <p>O m&#243;dulo <a class="ulink" href="../lib/module-datetime.html"><tt class="module">datetime</tt></a> fornece
  classes para manipula&#231;&#227;o de datas e horas nas mais variadas formas. Apesar da disponibilidade de
  aritm&#233;tica com data e hora, o foco da implementa&#231;&#227;o &#233; na extra&#231;&#227;o eficiente dos membros
  para formata&#231;&#227;o e manipula&#231;&#227;o. O m&#243;dulo tamb&#233;m oferece objetos que levam os fusos
  hor&#225;rios em considera&#231;&#227;o.</p>
  <div class="verbatim">
    <pre>
# dates are easily constructed and formatted
&gt;&gt;&gt; from datetime import date
&gt;&gt;&gt; now = date.today()
&gt;&gt;&gt; now
datetime.date(2003, 12, 2)
&gt;&gt;&gt; now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'
# dates support calendar arithmetic
&gt;&gt;&gt; birthday = date(1964, 7, 31)
&gt;&gt;&gt; age = now - birthday
&gt;&gt;&gt; age.days
14368
</pre>
  </div>
  <h1>  10.9 Compress&#227;o de Dados</h1>
  <p>Formatos comuns de arquivamento e compress&#227;o de dados est&#227;o dispon&#237;veis diretamente atrav&#233;s de
  alguns m&#243;dulos, entre eles: <a class="ulink" href="../lib/module-zlib.html"><tt class="module">zlib</tt></a>,
  <a class="ulink" href="../lib/module-gzip.html"><tt class="module">gzip</tt></a>, <a class="ulink" href=
  "../lib/module-bz2.html"><tt class="module">bz2</tt></a>, <a class="ulink" href=
  "../lib/module-zipfile.html"><tt class="module">zipfile</tt></a> e <a class="ulink" href=
  "../lib/module-tarfile.html"><tt class="module">tarfile</tt></a>.</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; import zlib
&gt;&gt;&gt; s = 'witch which has which witches wrist watch'
&gt;&gt;&gt; len(s)
41
&gt;&gt;&gt; t = zlib.compress(s)
&gt;&gt;&gt; len(t)
37
&gt;&gt;&gt; zlib.decompress(t)
'witch which has which witches wrist watch'
&gt;&gt;&gt; zlib.crc32(s)
226805979
</pre>
  </div>
  <h1>  10.10 Medi&#231;&#227;o de Desempenho</h1>
  <p>Alguns usu&#225;rios de Python desenvolvem um interesse profundo pelo desempenho relativo de diferentes abordagens
  para o mesmo problema. Python oferece uma ferramenta de medi&#231;&#227;o que esclarecem essas d&#250;vidas
  rapidamente.</p>
  <p>Por exemplo, pode ser tentador usar empacotamento e desempacotamento de tuplas ao inv&#233;s da abordagem
  tradicional de permutar os argumentos. O m&#243;dulo <a class="ulink" href="../lib/module-timeit.html"><tt class=
  "module">timeit</tt></a> rapidamente mostra uma modesta vantagem de desempenho:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; from timeit import Timer
&gt;&gt;&gt; Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
&gt;&gt;&gt; Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791
</pre>
  </div>
  <p>Em contraste com o alto n&#237;vel de granularidade oferecido pelo m&#243;dulo <tt class="module">timeit</tt>, os
  m&#243;dulos <a class="ulink" href="../lib/module-profile.html"><tt class="module">profile</tt></a> e <tt class=
  "module">pstats</tt> disponibilizam ferramentas para identificar os trechos mais cr&#237;ticas em grandes blocos de
  c&#243;digo.</p>
  <h1>  10.11 Controle de Qualidade</h1>
  <p>Uma das abordagens usadas no desenvolvimento de software de alta qualidade &#233; escrever testes para cada
  fun&#231;&#227;o &#224; medida que &#233; desenvolvida e executar esses testes frequentemente durante o processo de
  desenvolvimento.</p>
  <p>O m&#243;dulo <a class="ulink" href="../lib/module-doctest.html"><tt class="module">doctest</tt></a> oferece uma
  ferramenta para realizar um trabalho de varredura e valida&#231;&#227;o de testes escritos nas strings de
  documenta&#231;&#227;o (<em>docstrings</em>) de um programa. A constru&#231;&#227;o dos testes &#233; t&#227;o
  simples quanto copiar uma chamada t&#237;pica juntamente dos seus resultados e col&#225;-los na docstring. Isto
  aprimora a documenta&#231;&#227;o, fornecendo ao usu&#225;rio um exemplo real, e permite que o m&#243;dulo doctest
  verifique que o c&#243;digo continua fiel &#224; documenta&#231;&#227;o.</p>
  <div class="verbatim">
    <pre>
def average(values):
    """Computes the arithmetic mean of a list of numbers.
    &gt;&gt;&gt; print average([20, 30, 70])
    40.0
    """
    return sum(values, 0.0) / len(values)
import doctest
doctest.testmod()   # automatically validate the embedded tests
</pre>
  </div>
  <p>O m&#243;dulo <a class="ulink" href="../lib/module-unittest.html"><tt class="module">unittest</tt></a> n&#227;o
  &#233; t&#227;o simples de usar quanto o m&#243;dulo <tt class="module">doctest</tt>, mas permite que um conjunto
  muito maior de testes seja mantido em um arquivo separado:</p>
  <div class="verbatim">
    <pre>
import unittest
class TestStatisticalFunctions(unittest.TestCase):
    def test_average(self):
        self.assertEqual(average([20, 30, 70]), 40.0)
        self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
        self.assertRaises(ZeroDivisionError, average, [])
        self.assertRaises(TypeError, average, 20, 30, 70)
unittest.main() # Calling from the command line invokes all tests
</pre>
  </div>
  <h1>  10.12 Baterias Inclu&#237;das</h1>
  <p>Python tem uma filosofia de ``baterias inclu&#237;das''. Isto fica mais evidente atrav&#233;s da
  sofistica&#231;&#227;o e robustez dos seus maiores pacotes. Por exemplo:</p>
  <ul>
    <li>Os m&#243;dulos <a class="ulink" href="../lib/module-xmlrpclib.html"><tt class="module">xmlrpclib</tt></a> e
    <a class="ulink" href="../lib/module-SimpleXMLRPCServer.html"><tt class="module">SimpleXMLRPCServer</tt></a> tornam
    a implementa&#231;&#227;o de chamadas remotas (<em>remote procedure calls</em>) uma tarefa quase trivial. Apesar
    dos nomes dos m&#243;dulos, nenhum conhecimento ou manipula&#231;&#227;o de XML &#233; necess&#225;rio.</li>
    <li>O pacote <a class="ulink" href="../lib/module-email.html"><tt class="module">email</tt></a> &#233; uma
    biblioteca para gerenciamento de mensagens de correio eletr&#244;nico, incluindo MIME e outros baseados no RFC
    2822. Diferentemente dos m&#243;dulos <tt class="module">smtplib</tt> e <tt class="module">poplib</tt> que apenas
    enviam e recebem mensagens, o pacote email tem um conjunto completo de ferramentas para construir ou decodificar
    estruturas complexas de mensagens (incluindo anexos) e para implementa&#231;&#227;o de protocolos de
    codifica&#231;&#227;o e cabe&#231;alhos.</li>
    <li>Os pacotes <a class="ulink" href="../lib/module-xml.dom.html"><tt class="module">xml.dom</tt></a> e <a class=
    "ulink" href="../lib/module-xml.sax.html"><tt class="module">xml.sax</tt></a> oferecem uma implementa&#231;&#227;o
    robusta deste popular formato de troca de dados. De maneira semelhante, o m&#243;dulo <a class="ulink" href=
    "../lib/module-csv.html"><tt class="module">csv</tt></a> permite ler e escrever diretamente num formato comum de
    bancos de dados. Juntos, estes m&#243;dulos e pacotes simplificam muito a troca de dados entre aplica&#231;&#245;es
    em Python e outras ferramentas.</li>
    <li>Internacionaliza&#231;&#227;o &#233; dispon&#237;vel atrav&#233;s de diversos m&#243;dulos, como <a class=
    "ulink" href="../lib/module-gettext.html"><tt class="module">gettext</tt></a>, <a class="ulink" href=
    "../lib/module-locale.html"><tt class="module">locale</tt></a>, e o pacote <a class="ulink" href=
    "../lib/module-codecs.html"><tt class="module">codecs</tt></a>.</li>
  </ul>
  <h1>  11. Um Breve Passeio Pela Biblioteca Padr&#227;o - Parte II</h1>
  <p>Este segundo passeio cobre alguns m&#243;dulos mais avan&#231;ados que cobrem algumas necessidades de
  programa&#231;&#227;o profissional. Estes m&#243;dulos raramente aparecem em scripts pequenos.</p>
  <h1>  11.1 Formatando Sa&#237;da</h1>
  <p>O m&#243;dulo <a class="ulink" href="../lib/module-repr.html"><tt class="module">repr</tt></a> oferece uma
  vers&#227;o da fun&#231;&#227;o <tt class="function">repr()</tt> customizada para abreviar a exibi&#231;&#227;o
  cont&#234;ineres grandes ou aninhados muito profundamente:</p>
  <div class="verbatim">
    <pre>
    &gt;&gt;&gt; import repr   
    &gt;&gt;&gt; repr.repr(set('supercalifragilisticexpialidocious'))
    "set(['a', 'c', 'd', 'e', 'f', 'g', ...])"
</pre>
  </div>
  <p>O m&#243;dulo <a class="ulink" href="../lib/module-pprint.html"><tt class="module">pprint</tt></a> oferece
  controle mais sofisticada na exibi&#231;&#227;o de tanto objetos internos quanto aqueles definidos pelo usu&#225;rio
  de uma maneira leg&#237;vel atrav&#233;s do interpretador. Quando o resultado &#233; maior do que uma linha, o
  ``pretty printer'' acrescenta quebras de linha e indenta&#231;&#227;o para revelar as estruturas de dados de maneira
  mais clara:</p>
  <div class="verbatim">
    <pre>
    &gt;&gt;&gt; import pprint
    &gt;&gt;&gt; t = [[[['black', 'cyan'], 'white', ['green', 'red']], [['magenta',
    ...     'yellow'], 'blue']]]
    ...
    &gt;&gt;&gt; pprint.pprint(t, width=30)
    [[[['black', 'cyan'],
       'white',
       ['green', 'red']],
      [['magenta', 'yellow'],
       'blue']]]
</pre>
  </div>
  <p>O m&#243;dulo <a class="ulink" href="../lib/module-textwrap.html"><tt class="module">textwrap</tt></a> formata
  par&#225;grafos de texto de forma que caibam em uma dada largura de tela:</p>
  <div class="verbatim">
    <pre>
    &gt;&gt;&gt; import textwrap
    &gt;&gt;&gt; doc = """The wrap() method is just like fill() except that it returns
    ... a list of strings instead of one big string with newlines to separate
    ... the wrapped lines."""
    ...
    &gt;&gt;&gt; print textwrap.fill(doc, width=40)
    The wrap() method is just like fill()
    except that it returns a list of strings
    instead of one big string with newlines
    to separate the wrapped lines.
</pre>
  </div>
  <p>O m&#243;dulo <a class="ulink" href="../lib/module-locale.html"><tt class="module">locale</tt></a> acessa um banco
  de dados de formatos de dados espec&#237;ficos &#224; determinada cultura. O atributo <em>grouping</em> da
  fun&#231;&#227;o <em>format</em>, oferece uma forma simples de formatar n&#250;meros com separadores:</p>
  <div class="verbatim">
    <pre>
    &gt;&gt;&gt; import locale
    &gt;&gt;&gt; locale.setlocale(locale.LC_ALL, 'English_United States.1252')
    'English_United States.1252'
    &gt;&gt;&gt; conv = locale.localeconv()          # get a mapping of conventions
    &gt;&gt;&gt; x = 1234567.8
    &gt;&gt;&gt; locale.format("%d", x, grouping=True)
    '1,234,567'
    &gt;&gt;&gt; locale.format("%s%.*f", (conv['currency_symbol'],
    ...       conv['frac_digits'], x), grouping=True)
    '\$1,234,567.80'
</pre>
  </div>
  <h1>  11.2 Templating</h1>
  <p>The <a class="ulink" href="../lib/module-string.html"><tt class="module">string</tt></a> module includes a
  versatile <tt class="class">Template</tt> class with a simplified syntax suitable for editing by end-users. This
  allows users to customize their applications without having to alter the application.</p>
  <p>The format uses placeholder names formed by "<tt class="samp">$</tt>" with valid Python identifiers (alphanumeric
  characters and underscores). Surrounding the placeholder with braces allows it to be followed by more alphanumeric
  letters with no intervening spaces. Writing "<tt class="samp">$$</tt>" creates a single escaped "<tt class=
  "samp">$</tt>":</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; from string import Template
&gt;&gt;&gt; t = Template('\${village}folk send \$\$10 to \$cause.')
&gt;&gt;&gt; t.substitute(village='Nottingham', cause='the ditch fund')
'Nottinghamfolk send \$10 to the ditch fund.'
</pre>
  </div>
  <p>The <tt class="method">substitute</tt> method raises a <tt class="exception">KeyError</tt> when a placeholder is
  not supplied in a dictionary or a keyword argument. For mail-merge style applications, user supplied data may be
  incomplete and the <tt class="method">safe_substitute</tt> method may be more appropriate -- it will leave
  placeholders unchanged if data is missing:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; t = Template('Return the \$item to \$owner.')
&gt;&gt;&gt; d = dict(item='unladen swallow')
&gt;&gt;&gt; t.substitute(d)
Traceback (most recent call last):
  . . .
KeyError: 'owner'
&gt;&gt;&gt; t.safe_substitute(d)
'Return the unladen swallow to \$owner.\$'
</pre>
  </div>
  <p>Template subclasses can specify a custom delimiter. For example, a batch renaming utility for a photo browser may
  elect to use percent signs for placeholders such as the current date, image sequence number, or file format:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; import time, os.path
&gt;&gt;&gt; photofiles = ['img_1074.jpg', 'img_1076.jpg', 'img_1077.jpg']
&gt;&gt;&gt; class BatchRename(Template):
...     delimiter = '%'
&gt;&gt;&gt; fmt = raw_input('Enter rename style (%d-date %n-seqnum %f-format):  ')
Enter rename style (%d-date %n-seqnum %f-format):  Ashley_%n%f
&gt;&gt;&gt; t = BatchRename(fmt)
&gt;&gt;&gt; date = time.strftime('%d%b%y')
&gt;&gt;&gt; for i, filename in enumerate(photofiles):
...     base, ext = os.path.splitext(filename)
...     newname = t.substitute(d=date, n=i, f=ext)
...     print '%s --&gt; %s' % (filename, newname)
img_1074.jpg --&gt; Ashley_0.jpg
img_1076.jpg --&gt; Ashley_1.jpg
img_1077.jpg --&gt; Ashley_2.jpg
</pre>
  </div>
  <p>Another application for templating is separating program logic from the details of multiple output formats. This
  makes it possible to substitute custom templates for XML files, plain text reports, and HTML web reports.</p>
  <h1>  11.3 Working with Binary Data Record Layouts</h1>
  <p>The <a class="ulink" href="../lib/module-struct.html"><tt class="module">struct</tt></a> module provides
  <tt class="function">pack()</tt> and <tt class="function">unpack()</tt> functions for working with variable length
  binary record formats. The following example shows how to loop through header information in a ZIP file (with pack
  codes <code>"H"</code> and <code>"L"</code> representing two and four byte unsigned numbers respectively):</p>
  <div class="verbatim">
    <pre>
    import struct
    data = open('myfile.zip', 'rb').read()
    start = 0
    for i in range(3):                      # show the first 3 file headers
        start += 14
        fields = struct.unpack('LLLHH', data[start:start+16])
        crc32, comp_size, uncomp_size, filenamesize, extra_size = fields
        start += 16
        filename = data[start:start+filenamesize]
        start += filenamesize
        extra = data[start:start+extra_size]
        print filename, hex(crc32), comp_size, uncomp_size
        start += extra_size + comp_size     # skip to the next header
</pre>
  </div>
  <h1>  11.4 Multi-threading</h1>
  <p>Threading is a technique for decoupling tasks which are not sequentially dependent. Threads can be used to improve
  the responsiveness of applications that accept user input while other tasks run in the background. A related use case
  is running I/O in parallel with computations in another thread.</p>
  <p>The following code shows how the high level <a class="ulink" href="../lib/module-threading.html"><tt class=
  "module">threading</tt></a> module can run tasks in background while the main program continues to run:</p>
  <div class="verbatim">
    <pre>
    import threading, zipfile
    class AsyncZip(threading.Thread):
        def __init__(self, infile, outfile):
            threading.Thread.__init__(self)        
            self.infile = infile
            self.outfile = outfile
        def run(self):
            f = zipfile.ZipFile(self.outfile, 'w', zipfile.ZIP_DEFLATED)
            f.write(self.infile)
            f.close()
            print 'Finished background zip of: ', self.infile
    background = AsyncZip('mydata.txt', 'myarchive.zip')
    background.start()
    print 'The main program continues to run in foreground.'
    
    background.join()    # Wait for the background task to finish
    print 'Main program waited until background was done.'
</pre>
  </div>
  <p>The principal challenge of multi-threaded applications is coordinating threads that share data or other resources.
  To that end, the threading module provides a number of synchronization primitives including locks, events, condition
  variables, and semaphores.</p>
  <p>While those tools are powerful, minor design errors can result in problems that are difficult to reproduce. So,
  the preferred approach to task coordination is to concentrate all access to a resource in a single thread and then
  use the <a class="ulink" href="../lib/module-Queue.html"><tt class="module">Queue</tt></a> module to feed that thread
  with requests from other threads. Applications using <tt class="class">Queue</tt> objects for inter-thread
  communication and coordination are easier to design, more readable, and more reliable.</p>
  <h1>  11.5 Logging</h1>
  <p>The <a class="ulink" href="../lib/module-logging.html"><tt class="module">logging</tt></a> module offers a full
  featured and flexible logging system. At its simplest, log messages are sent to a file or to
  <code>sys.stderr</code>:</p>
  <div class="verbatim">
    <pre>
    import logging
    logging.debug('Debugging information')
    logging.info('Informational message')
    logging.warning('Warning:config file %s not found', 'server.conf')
    logging.error('Error occurred')
    logging.critical('Critical error -- shutting down')
</pre>
  </div>
  <p>This produces the following output:</p>
  <div class="verbatim">
    <pre>
    WARNING:root:Warning:config file server.conf not found
    ERROR:root:Error occurred
    CRITICAL:root:Critical error -- shutting down
</pre>
  </div>
  <p>By default, informational and debugging messages are suppressed and the output is sent to standard error. Other
  output options include routing messages through email, datagrams, sockets, or to an HTTP Server. New filters can
  select different routing based on message priority: <tt class="constant">DEBUG</tt>, <tt class="constant">INFO</tt>,
  <tt class="constant">WARNING</tt>, <tt class="constant">ERROR</tt>, and <tt class="constant">CRITICAL</tt>.</p>
  <p>The logging system can be configured directly from Python or can be loaded from a user editable configuration file
  for customized logging without altering the application.</p>
  <h1>  11.6 Refer&#234;ncias Fracas</h1>
  <p>Python realiza gerenciamento autom&#225;tico de mem&#243;ria (contagem de refer&#234;ncias para a maoria dos
  objetos e <em>coleta de lixo</em> para eliminar ciclos). A mem&#243;ria &#233; liberada logo depois da &#250;ltima
  refer&#234;ncia ser eliminada.</p>
  <p>Essa abordagem funciona bem para a maioria das aplica&#231;&#245;es, mas ocasionalmente surge a necessidade de
  rastrear objetos apenas enquanto est&#227;o sendo usados por algum outro. Infelizmente, rastre&#225;-los atrav&#233;s
  de uma refer&#234;ncia torna-os permanentes. O m&#243;dulo <a class="ulink" href=
  "../lib/module-weakref.html"><tt class="module">weakref</tt></a> oferece ferramentas para rastrear objetos sem criar
  uma refer&#234;ncia. Quando o objeto n&#227;o &#233; mais necess&#225;rio, ele &#233; automaticamente removido de uma
  tabela de refer&#234;ncias fracas e uma chamada (<em>callback</em>) &#233; disparada. Aplica&#231;&#245;es
  t&#237;picas incluem o armazenamento de objetos que s&#227;o muito dispendiosos para criar:</p>
  <div class="verbatim">
    <pre>
    &gt;&gt;&gt; import weakref, gc
    &gt;&gt;&gt; class A:
    ...     def __init__(self, value):
    ...             self.value = value
    ...     def __repr__(self):
    ...             return str(self.value)
    ...
    &gt;&gt;&gt; a = A(10)                   # create a reference
    &gt;&gt;&gt; d = weakref.WeakValueDictionary()
    &gt;&gt;&gt; d['primary'] = a            # does not create a reference
    &gt;&gt;&gt; d['primary']                # fetch the object if it is still alive
    10
    &gt;&gt;&gt; del a                       # remove the one reference
    &gt;&gt;&gt; gc.collect()                # run garbage collection right away
    0
    &gt;&gt;&gt; d['primary']                # entry was automatically removed
    Traceback (most recent call last):
      File "&lt;pyshell#108&gt;", line 1, in -toplevel-
        d['primary']                # entry was automatically removed
      File "C:/PY24/lib/weakref.py", line 46, in __getitem__
        o = self.data[key]()
    KeyError: 'primary'
</pre>
  </div>
  <h1>  11.7 Trabalhando com Listas</h1>
  <p>Muitas das necessidades envolvendo estruturas de dados podem ser alcan&#231;adas com listas. No entanto, as vezes
  surge a necessidade de uma implementa&#231;&#227;o alternativa, com diversos sacrif&#237;cios em nome de melhor
  desempenho.</p>
  <p>O m&#243;dulo <a class="ulink" href="../lib/module-array.html"><tt class="module">array</tt></a> oferece um objeto
  <tt class="class">array()</tt>, semelhante a uma lista, mas que armazena apenas dados homog&#234;neos e de maneira
  mais compacta. O exemplo a seguir mostra um vetor de n&#250;meros armazenados como n&#250;meros bin&#225;rios de dois
  bytes sem sinal (typecode <code>"H"</code>) ao inv&#233;s do usual 16 bytes por item nas listas normais de objetos
  int:</p>
  <div class="verbatim">
    <pre>
    &gt;&gt;&gt; from array import array
    &gt;&gt;&gt; a = array('H', [4000, 10, 700, 22222])
    &gt;&gt;&gt; sum(a)
    26932
    &gt;&gt;&gt; a[1:3]
    array('H', [10, 700])
</pre>
  </div>
  <p>O m&#243;dulo <a class="ulink" href="../lib/module-collections.html"><tt class="module">collections</tt></a>
  oferece um objeto <tt class="class">deque()</tt> que comporta-se como uma lista com opera&#231;&#245;es de
  anexa&#231;&#227;o (<em>append()</em>) e remo&#231;&#227;o (<em>pop()</em>) pelo lado esquerdo mais r&#225;pidos, mas
  com buscas mais lentas no centro. Estes objetos s&#227;o adequados para implementa&#231;&#227;o de filas e buscas em
  amplitudade em &#225;rvores de dados (<em>breadth first tree searches</em>):</p>
  <div class="verbatim">
    <pre>
    &gt;&gt;&gt; from collections import deque
    &gt;&gt;&gt; d = deque(["task1", "task2", "task3"])
    &gt;&gt;&gt; d.append("task4")
    &gt;&gt;&gt; print "Handling", d.popleft()
    Handling task1
    unsearched = deque([starting_node])
    def breadth_first_search(unsearched):
        node = unsearched.popleft()
        for m in gen_moves(node):
            if is_goal(m):
                return m
            unsearched.append(m)
</pre>
  </div>
  <p>Al&#233;m de implementa&#231;&#245;es alternativas de listas, a biblioteca tamb&#233;m oeferece outras ferramentas
  como o m&#243;dulo <a class="ulink" href="../lib/module-bisect.html"><tt class="module">bisect</tt></a> com
  fun&#231;&#245;es para manipula&#231;&#245;es de listas ordenadas:</p>
  <div class="verbatim">
    <pre>
    &gt;&gt;&gt; import bisect
    &gt;&gt;&gt; scores = [(100, 'perl'), (200, 'tcl'), (400, 'lua'), (500, 'python')]
    &gt;&gt;&gt; bisect.insort(scores, (300, 'ruby'))
    &gt;&gt;&gt; scores
    [(100, 'perl'), (200, 'tcl'), (300, 'ruby'), (400, 'lua'), (500, 'python')]
</pre>
  </div>
  <p>O m&#243;dulo <a class="ulink" href="../lib/module-heapq.html"><tt class="module">heapq</tt></a> oferece
  fun&#231;&#245;es para implementa&#231;&#227;o de heaps baseadas em listas normais. O valor mais baixo &#233; sempre
  mantido na posi&#231;&#227;o zero. Isso &#233; &#250;til para aplica&#231;&#245;es que acessam repetidamente o menor
  elemento, mas n&#227;o querem reordenar a lista toda a cada acesso:</p>
  <div class="verbatim">
    <pre>
    &gt;&gt;&gt; from heapq import heapify, heappop, heappush
    &gt;&gt;&gt; data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
    &gt;&gt;&gt; heapify(data)                      # rearrange the list into heap order
    &gt;&gt;&gt; heappush(data, -5)                 # add a new entry
    &gt;&gt;&gt; [heappop(data) for i in range(3)]  # fetch the three smallest entries
    [-5, 0, 1]
</pre>
  </div>
  <h1>  11.8 Decimal Floating Point Arithmetic</h1>
  <p>The <a class="ulink" href="../lib/module-decimal.html"><tt class="module">decimal</tt></a> module offers a
  <tt class="class">Decimal</tt> datatype for decimal floating point arithmetic. Compared to the built-in <tt class=
  "class">float</tt> implementation of binary floating point, the new class is especially helpful for financial
  applications and other uses which require exact decimal representation, control over precision, control over rounding
  to meet legal or regulatory requirements, tracking of significant decimal places, or for applications where the user
  expects the results to match calculations done by hand.</p>
  <p>For example, calculating a 5% tax on a 70 cent phone charge gives different results in decimal floating point and
  binary floating point. The difference becomes significant if the results are rounded to the nearest cent:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; from decimal import *       
&gt;&gt;&gt; Decimal('0.70') * Decimal('1.05')
Decimal("0.7350")
&gt;&gt;&gt; .70 * 1.05
0.73499999999999999
</pre>
  </div>
  <p>The <tt class="class">Decimal</tt> result keeps a trailing zero, automatically inferring four place significance
  from multiplicands with two place significance. Decimal reproduces mathematics as done by hand and avoids issues that
  can arise when binary floating point cannot exactly represent decimal quantities.</p>
  <p>Exact representation enables the <tt class="class">Decimal</tt> class to perform modulo calculations and equality
  tests that are unsuitable for binary floating point:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; Decimal('1.00') % Decimal('.10')
Decimal("0.00")
&gt;&gt;&gt; 1.00 % 0.10
0.09999999999999995
       
&gt;&gt;&gt; sum([Decimal('0.1')]*10) == Decimal('1.0')
True
&gt;&gt;&gt; sum([0.1]*10) == 1.0
False
</pre>
  </div>
  <p>The <tt class="module">decimal</tt> module provides arithmetic with as much precision as needed:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; getcontext().prec = 36
&gt;&gt;&gt; Decimal(1) / Decimal(7)
Decimal("0.142857142857142857142857142857142857")
</pre>
  </div>
  <h1>  12. E agora?</h1>
  <p>Espera-se que a leitura deste manual tenha agu&#231;ado seu interesse em utilizar Python. Agora onde voc&#234;
  deve ir para aprender mais ?</p>
  <p>This tutorial is part of Python's documentation set. Some other documents in the set are:</p>
  <ul>
    <li>
      <em class="citetitle"><a href="../lib/lib.html" title="Python Library Reference">Python Library
      Reference</a></em>:
      <p>You should browse through this manual, which gives complete (though terse) reference material about types,
      functions, and the modules in the standard library. The standard Python distribution includes a <em>lot</em> of
      additional code. There are modules to read <span class="Unix">Unix</span> mailboxes, retrieve documents via HTTP,
      generate random numbers, parse command-line options, write CGI programs, compress data, and many other tasks.
      Skimming through the Library Reference will give you an idea of what's available.</p>
    </li>
    <li><em class="citetitle"><a href="../inst/inst.html" title="Installing Python Modules">Installing Python
    Modules</a></em> explains how to install external modules written by other Python users.</li>
    <li><em class="citetitle"><a href="../ref/ref.html" title="Language Reference">Language Reference</a></em>: A
    detailed explanation of Python's syntax and semantics. It's heavy reading, but is useful as a</li>
  </ul>
  <p>More Python resources:</p>
  <ul>
    <li><a class="url" href="http://www.python.org">http://www.python.org</a>: The major Python Web site. It contains
    code, documentation, and pointers to Python-related pages around the Web. This Web site is mirrored in various
    places around the world, such as Europe, Japan, and Australia; a mirror may be faster than the main site, depending
    on your geographical location.</li>
    <li><a class="url" href="http://docs.python.org">http://docs.python.org</a>: Fast access to Python's
    documentation.</li>
    <li><a class="url" href="http://cheeseshop.python.org">http://cheeseshop.python.org</a>: The Python Package Index,
    nicknamed the Cheese Shop, is an index of user-created Python modules that are available for download. Once you
    begin releasing code, you can register it here so that others can find it.</li>
    <li><a class="url" href=
    "http://aspn.activestate.com/ASPN/Python/Cookbook/">http://aspn.activestate.com/ASPN/Python/Cookbook/</a>: The
    Python Cookbook is a sizable collection of code examples, larger modules, and useful scripts. Particularly notable
    contributions are collected in a book also titled <em class="citetitle">Python Cookbook</em> (O'Reilly &amp;
    Associates, ISBN 0-596-00797-3.)</li>
  </ul>
  <p>Para quest&#245;es relacionadas a Python e notifica&#231;&#227;o de problemas, voc&#234; pode enviar uma mensagem
  para o newsgroup <a class="newsgroup" href="news:comp.lang.python">comp.lang.python</a>, ou para a lista de e-mail
  <span class="email">python-list@python.org</span>. Ambos est&#227;o vinculados e tanto faz mandar atrav&#233;s de um
  ou atrav&#233;s de outro que o resultado &#233; o mesmo. Existem em m&#233;dia 120 mensagens por dia (com picos de
  v&#225;rias centenas), perguntando e respondendo quest&#245;es, sugerindo novas funcionalidades, e anunciando novos
  m&#243;dulos. Antes de submeter, esteja certo que o que voc&#234; procura n&#227;o consta na Frequently Asked
  Questions (tamb&#233;m conhecida por FAQ), em <a class="url" href=
  "http://www.python.org/doc/FAQ.html">http://www.python.org/doc/FAQ.html</a>, ou procure no diret&#243;rio
  <span class="file">Misc/</span> da distribui&#231;&#227;o (c&#243;digo fonte). Os arquivos da lista de discuss&#227;o
  est&#227;o dispon&#237;veis em <a class="url" href=
  "http://www.python.org/pipermail/">http://www.python.org/pipermail/</a>. A FAQ responde muitas das quest&#245;es
  reincidentes na lista, talvez l&#225; esteja a solu&#231;&#227;o para o seu problema.</p>
  <h1>  A. Edi&#231;&#227;o de Entrada Interativa e Substitui&#231;&#227;o por Hist&#243;rico</h1>
  <p>Algumas vers&#245;es do interpretador Python suportam facilidades de edi&#231;&#227;o e substitui&#231;&#227;o
  semelhantes as encontradas na Korn shell ou na GNU Bash shell. Isso &#233; implementado atrav&#233;s da biblioteca
  <em>GNU Readline</em>, que suporta edi&#231;&#227;o no estilo Emacs ou vi. Essa biblioteca possui sua pr&#243;pria
  documenta&#231;&#227;o, que n&#227;o ser&#225; duplicada aqui. Por&#233;m os fundamentos s&#227;o f&#225;ceis de
  serem explicados. As facilidades aqui descritas est&#227;o dispon&#237;vies nas vers&#245;es <span class=
  "Unix">Unix</span> e Cygwin do interpretador.</p>
  <p>Este cap&#237;tulo n&#227;o documenta as facilidades de edi&#231;&#227;o do pacote PythonWin de Mark Hammond, ou
  do ambiente IDLE baseado em Tk e distribu&#237;do junto com Python.</p>
  <h1>  A.1 Edi&#231;&#227;o de Linha</h1>
  <p>Se for suportado, edi&#231;&#227;o de linha est&#225; ativa sempre que o interpretador imprimir um dos prompts
  (prim&#225;rio ou secund&#225;rio). A linha corrente pode ser editada usando comandos t&#237;picos do Emacs. Os mais
  imoportantes s&#227;o: <kbd>C-A</kbd> (Control-A) move o cursor para o in&#237;cio da linha, <kbd>C-E</kbd> para o
  fim, <kbd>C-B</kbd> move uma posi&#231;&#227;o para &#224; esquerda, <kbd>C-F</kbd> para a direita. Backspace apaga o
  caracter &#224; esquerda, <kbd>C-D</kbd> apaga o da direita. <kbd>C-K</kbd> apaga do cursor at&#233; o resto da linha
  &#224; direita, <kbd>C-Y</kbd> cola a linha apagada. <kbd>C-underscore</kbd> &#233; o undo e tem efeito
  cumulativo.</p>
  <h1>  A.2 Substitui&#231;&#227;o de Hist&#243;rico</h1>
  <p>Funciona da seguinte maneira: todas linhas n&#227;o vazias s&#227;o armazenadas em um buffer (hist&#243;rico).
  <kbd>C-P</kbd> volta uma posi&#231;&#227;o no hist&#243;rico, <kbd>C-N</kbd> avan&#231;a uma posi&#231;&#227;o.
  Pressionando <kbd>Return</kbd> a linha corrente &#233; alimentada para o interpretador. <kbd>C-R</kbd> inicia uma
  busca para tr&#225;s no hist&#243;rico, e <kbd>C-S</kbd> um busca para frente.</p>
  <h1>  A.3 Vincula&#231;&#227;o de Teclas</h1>
  <p>A vincula&#231;&#227;o de teclas e outros par&#226;metros da biblioteca Readline podem ser personalizados por
  configura&#231;&#245;es colocadas no arquivo <span class="file">~/.inputrc</span>. Vincula&#231;&#227;o de teclas tem
  o formato:</p>
  <div class="verbatim">
    <pre>
key-name: function-name
</pre>
  </div>
  <p>ou</p>
  <div class="verbatim">
    <pre>
"string": function-name
</pre>
  </div>
  <p>e op&#231;&#245;es podem ser especificadas com:</p>
  <div class="verbatim">
    <pre>
set option-name value
</pre>
  </div>
  <p>Por exemplo:</p>
  <div class="verbatim">
    <pre>
# Qume prefere editar estilo vi:
set editing-mode vi
# Edi&#231;&#227;o em uma &#250;nica linha:
set horizontal-scroll-mode On
# Redefini&#231;&#227;o de algumas teclas:
Meta-h: backward-kill-word
"\C-u": universal-argument
"\C-x\C-r": re-read-init-file
</pre>
  </div>
  <p>Observe que a vincula&#231;&#227;o default para <kbd>Tab</kbd> em Python &#233; inserir um caracter <kbd>Tab</kbd>
  ao inv&#233;s de completar o nome de um arquivo (default no Readline). Isto pode ser reconfigurado de volta
  atrav&#233;s:</p>
  <div class="verbatim">
    <pre>
Tab: complete
</pre>
  </div>
  <p>no <span class="file">~/.inputrc</span>. Todavia, isto torna mais dif&#237;cil digitar comandos identados em
  linhas de continua&#231;&#227;o se voc&#234; estiver acostumado a usar <kbd>Tab</kbd> para isso.</p>
  <p>Preenchimento autom&#225;tico de nomes de vari&#225;veis e m&#243;dulos est&#227;o opcionalmente dispon&#237;vies.
  Para habilit&#225;-los no modo interativo, adicione o seguinte ao seu arquivo de inicializa&#231;&#227;o: <a name=
  "tex2html6" href="#foot1971"><sup>A.1</sup></a><a id='l2h-33' xml:id='l2h-33'></a></p>
  <div class="verbatim">
    <pre>
import rlcompleter, readline
readline.parse_and_bind('tab: complete')
</pre>
  </div>
  <p>Isso vincula a tecla <kbd>Tab</kbd> para o preenchimento autom&#225;tico de nomes de fun&#231;&#227;o. Assim,
  teclar <kbd>Tab</kbd> duas vezes dispara o preenchimento. Um determinado nome &#233; procurado entre as
  vari&#225;veis locais e m&#243;dulos dispon&#237;veis. Para express&#245;es terminadas em ponto, como em
  <code>string.a</code>, a express&#227;o ser&#225; avaliada at&#233; o &#250;ltimo "<tt class="character">.</tt>"
  quando ser&#227;o sugeridos poss&#237;veis extens&#245;es. Isso pode at&#233; implicar na execu&#231;&#227;o de
  c&#243;digo definido por aplica&#231;&#227;o quando um objeto que define o m&#233;todo <tt class=
  "method">__getattr__()</tt> for parte da express&#227;o.</p>
  <p>Um arquivo de inicializa&#231;&#227;o mais eficiente seria algo como esse exemplo. Note que ele deleta os nomes
  que cria quando n&#227;o s&#227;o mais necess&#225;rios; isso &#233; feito porque o arquivo de
  inicializa&#231;&#227;o &#233; executado no mesmo ambiente do que os comandos interativos, e remover os nomes evita
  criar efeitos colaterais nos ambiente usado interativamente. Voc&#234; pode achar conveniente manter alguns dos
  m&#243;dulos importados, como <a class="ulink" href="../lib/module-os.html"><tt class="module">os</tt></a>, que acaba
  sendo necess&#225;rio na maior parte das sess&#245;es com o interpretador.</p>
  <div class="verbatim">
    <pre>
# Add auto-completion and a stored history file of commands to your Python
# interactive interpreter. Requires Python 2.0+, readline. Autocomplete is
# bound to the Esc key by default (you can change it - see readline docs).
#
# Store the file in ~/.pystartup, and set an environment variable to point
# to it:  "export PYTHONSTARTUP=/max/home/itamar/.pystartup" in bash.
#
# Note that PYTHONSTARTUP does *not* expand "~", so you have to put in the
# full path to your home directory.
import atexit
import os
import readline
import rlcompleter
historyPath = os.path.expanduser("~/.pyhistory")
def save_history(historyPath=historyPath):
    import readline
    readline.write_history_file(historyPath)
if os.path.exists(historyPath):
    readline.read_history_file(historyPath)
atexit.register(save_history)
del os, atexit, readline, rlcompleter, save_history, historyPath
</pre>
  </div>
  <h1>  A.4 Coment&#225;rio</h1>
  <p>Essa facilidade representa um enorme passo em compara&#231;&#227;o com vers&#245;es anteriores do interpretador.
  Todavia, ainda h&#225; caracter&#237;sticas desej&#225;veis deixadas de fora. Seria interessante se a
  indenta&#231;&#227;o apropriada fosse sugerida em linhas de continua&#231;&#227;o, pois o parser sabe se um token de
  identa&#231;&#227;o &#233; necess&#225;rio. O mecanismo de preenchimento poderia utilizar a tabela de s&#237;mbolos
  do interpretador. Tamb&#233;m seria &#250;til um comando para verificar (ou at&#233; mesmo sugerir) o balanceamento
  de par&#234;nteses, aspas, etc.</p>
  <h1>  B. Floating Point Arithmetic: Issues and Limitations</h1>
  <p>Floating-point numbers are represented in computer hardware as base 2 (binary) fractions. For example, the decimal
  fraction</p>
  <div class="verbatim">
    <pre>
0.125
</pre>
  </div>
  <p>has value 1/10 + 2/100 + 5/1000, and in the same way the binary fraction</p>
  <div class="verbatim">
    <pre>
0.001
</pre>
  </div>
  <p>has value 0/2 + 0/4 + 1/8. These two fractions have identical values, the only real difference being that the
  first is written in base 10 fractional notation, and the second in base 2.</p>
  <p>Unfortunately, most decimal fractions cannot be represented exactly as binary fractions. A consequence is that, in
  general, the decimal floating-point numbers you enter are only approximated by the binary floating-point numbers
  actually stored in the machine.</p>
  <p>The problem is easier to understand at first in base 10. Consider the fraction 1/3. You can approximate that as a
  base 10 fraction:</p>
  <div class="verbatim">
    <pre>
0.3
</pre>
  </div>
  <p>or, better,</p>
  <div class="verbatim">
    <pre>
0.33
</pre>
  </div>
  <p>or, better,</p>
  <div class="verbatim">
    <pre>
0.333
</pre>
  </div>
  <p>and so on. No matter how many digits you're willing to write down, the result will never be exactly 1/3, but will
  be an increasingly better approximation of 1/3.</p>
  <p>In the same way, no matter how many base 2 digits you're willing to use, the decimal value 0.1 cannot be
  represented exactly as a base 2 fraction. In base 2, 1/10 is the infinitely repeating fraction</p>
  <div class="verbatim">
    <pre>
0.0001100110011001100110011001100110011001100110011...
</pre>
  </div>
  <p>Stop at any finite number of bits, and you get an approximation. This is why you see things like:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; 0.1
0.10000000000000001
</pre>
  </div>
  <p>On most machines today, that is what you'll see if you enter 0.1 at a Python prompt. You may not, though, because
  the number of bits used by the hardware to store floating-point values can vary across machines, and Python only
  prints a decimal approximation to the true decimal value of the binary approximation stored by the machine. On most
  machines, if Python were to print the true decimal value of the binary approximation stored for 0.1, it would have to
  display</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; 0.1
0.1000000000000000055511151231257827021181583404541015625
</pre>
  </div>
  <p>instead! The Python prompt uses the builtin <tt class="function">repr()</tt> function to obtain a string version
  of everything it displays. For floats, <code>repr(<var>float</var>)</code> rounds the true decimal value to 17
  significant digits, giving</p>
  <div class="verbatim">
    <pre>
0.10000000000000001
</pre>
  </div>
  <p><code>repr(<var>float</var>)</code> produces 17 significant digits because it turns out that's enough (on most
  machines) so that <code>eval(repr(<var>x</var>)) == <var>x</var></code> exactly for all finite floats <var>x</var>,
  but rounding to 16 digits is not enough to make that true.</p>
  <p>Note that this is in the very nature of binary floating-point: this is not a bug in Python, it is not a bug in
  your code either. You'll see the same kind of thing in all languages that support your hardware's floating-point
  arithmetic (although some languages may not <em>display</em> the difference by default, or in all output modes).</p>
  <p>Python's builtin <tt class="function">str()</tt> function produces only 12 significant digits, and you may wish to
  use that instead. It's unusual for <code>eval(str(<var>x</var>))</code> to reproduce <var>x</var>, but the output may
  be more pleasant to look at:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; print str(0.1)
0.1
</pre>
  </div>
  <p>It's important to realize that this is, in a real sense, an illusion: the value in the machine is not exactly
  1/10, you're simply rounding the <em>display</em> of the true machine value.</p>
  <p>Other surprises follow from this one. For example, after seeing</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; 0.1
0.10000000000000001
</pre>
  </div>
  <p>you may be tempted to use the <tt class="function">round()</tt> function to chop it back to the single digit you
  expect. But that makes no difference:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; round(0.1, 1)
0.10000000000000001
</pre>
  </div>
  <p>The problem is that the binary floating-point value stored for "0.1" was already the best possible binary
  approximation to 1/10, so trying to round it again can't make it better: it was already as good as it gets.</p>
  <p>Another consequence is that since 0.1 is not exactly 1/10, summing ten values of 0.1 may not yield exactly 1.0,
  either:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; sum = 0.0
&gt;&gt;&gt; for i in range(10):
...     sum += 0.1
...
&gt;&gt;&gt; sum
0.99999999999999989
</pre>
  </div>
  <p>Binary floating-point arithmetic holds many surprises like this. The problem with "0.1" is explained in precise
  detail below, in the "Representation Error" section. See <em class="citetitle"><a href=
  "http://www.lahey.com/float.htm" title="The Perils of Floating Point">The Perils of Floating Point</a></em> for a
  more complete account of other common surprises.</p>
  <p>As that says near the end, ``there are no easy answers.'' Still, don't be unduly wary of floating-point! The
  errors in Python float operations are inherited from the floating-point hardware, and on most machines are on the
  order of no more than 1 part in 2**53 per operation. That's more than adequate for most tasks, but you do need to
  keep in mind that it's not decimal arithmetic, and that every float operation can suffer a new rounding error.</p>
  <p>While pathological cases do exist, for most casual use of floating-point arithmetic you'll see the result you
  expect in the end if you simply round the display of your final results to the number of decimal digits you expect.
  <tt class="function">str()</tt> usually suffices, and for finer control see the discussion of Python's <code>%</code>
  format operator: the <code>%g</code>, <code>%f</code> and <code>%e</code> format codes supply flexible and easy ways
  to round float results for display.</p>
  <h1>  B.1 Representation Error</h1>
  <p>This section explains the ``0.1'' example in detail, and shows how you can perform an exact analysis of cases like
  this yourself. Basic familiarity with binary floating-point representation is assumed.</p>
  <p><i class="dfn">Representation error</i> refers to the fact that some (most, actually) decimal fractions cannot be
  represented exactly as binary (base 2) fractions. This is the chief reason why Python (or Perl, C, C++, Java,
  Fortran, and many others) often won't display the exact decimal number you expect:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; 0.1
0.10000000000000001
</pre>
  </div>
  <p>Why is that? 1/10 is not exactly representable as a binary fraction. Almost all machines today (November 2000) use
  IEEE-754 floating point arithmetic, and almost all platforms map Python floats to IEEE-754 "double precision". 754
  doubles contain 53 bits of precision, so on input the computer strives to convert 0.1 to the closest fraction it can
  of the form <var>J</var>/2**<var>N</var> where <var>J</var> is an integer containing exactly 53 bits. Rewriting</p>
  <div class="verbatim">
    <pre>
 1 / 10 ~= J / (2**N)
</pre>
  </div>
  <p>as</p>
  <div class="verbatim">
    <pre>
J ~= 2**N / 10
</pre>
  </div>
  <p>and recalling that <var>J</var> has exactly 53 bits (is <code>&gt;= 2**52</code> but <code>&lt; 2**53</code>), the
  best value for <var>N</var> is 56:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; 2**52
4503599627370496L
&gt;&gt;&gt; 2**53
9007199254740992L
&gt;&gt;&gt; 2**56/10
7205759403792793L
</pre>
  </div>
  <p>That is, 56 is the only value for <var>N</var> that leaves <var>J</var> with exactly 53 bits. The best possible
  value for <var>J</var> is then that quotient rounded:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; q, r = divmod(2**56, 10)
&gt;&gt;&gt; r
6L
</pre>
  </div>
  <p>Since the remainder is more than half of 10, the best approximation is obtained by rounding up:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; q+1
7205759403792794L
</pre>
  </div>
  <p>Therefore the best possible approximation to 1/10 in 754 double precision is that over 2**56, or</p>
  <div class="verbatim">
    <pre>
7205759403792794 / 72057594037927936
</pre>
  </div>
  <p>Note that since we rounded up, this is actually a little bit larger than 1/10; if we had not rounded up, the
  quotient would have been a little bit smaller than 1/10. But in no case can it be <em>exactly</em> 1/10!</p>
  <p>So the computer never ``sees'' 1/10: what it sees is the exact fraction given above, the best 754 double
  approximation it can get:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; .1 * 2**56
7205759403792794.0
</pre>
  </div>
  <p>If we multiply that fraction by 10**30, we can see the (truncated) value of its 30 most significant decimal
  digits:</p>
  <div class="verbatim">
    <pre>
&gt;&gt;&gt; 7205759403792794 * 10**30 / 2**56
100000000000000005551115123125L
</pre>
  </div>
  <p>meaning that the exact number stored in the computer is approximately equal to the decimal value
  0.100000000000000005551115123125. Rounding that to 17 significant digits gives the 0.10000000000000001 that Python
  displays (well, will display on any 754-conforming platform that does best-possible input and output conversions in
  its C library -- yours may not!).</p>
  <h1><a name="SECTION0017000000000000000000">C. History and License</a></h1>
  <h1><a name="SECTION0017100000000000000000">C.1 History of the software</a></h1>
  <p>Python was created in the early 1990s by Guido van Rossum at Stichting Mathematisch Centrum (CWI, see <a class=
  "url" href="http://www.cwi.nl/">http://www.cwi.nl/</a>) in the Netherlands as a successor of a language called ABC.
  Guido remains Python's principal author, although it includes many contributions from others.</p>
  <p>In 1995, Guido continued his work on Python at the Corporation for National Research Initiatives (CNRI, see
  <a class="url" href="http://www.cnri.reston.va.us/">http://www.cnri.reston.va.us/</a>) in Reston, Virginia where he
  released several versions of the software.</p>
  <p>In May 2000, Guido and the Python core development team moved to BeOpen.com to form the BeOpen PythonLabs team. In
  October of the same year, the PythonLabs team moved to Digital Creations (now Zope Corporation; see <a class="url"
  href="http://www.zope.com/">http://www.zope.com/</a>). In 2001, the Python Software Foundation (PSF, see <a class=
  "url" href="http://www.python.org/psf/">http://www.python.org/psf/</a>) was formed, a non-profit organization created
  specifically to own Python-related Intellectual Property. Zope Corporation is a sponsoring member of the PSF.</p>
  <p>All Python releases are Open Source (see <a class="url" href=
  "http://www.opensource.org/">http://www.opensource.org/</a> for the Open Source Definition). Historically, most, but
  not all, Python releases have also been GPL-compatible; the table below summarizes the various releases.</p>
  <div class="center">
    <table class="realtable">
      <thead>
        <tr>
          <th class="center">Release</th>
          <th class="center">Derived from</th>
          <th class="center">Year</th>
          <th class="center">Owner</th>
          <th class="center">GPL compatible?</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td class="center" valign="baseline">0.9.0 thru 1.2</td>
          <td class="center">n/a</td>
          <td class="center">1991-1995</td>
          <td class="center">CWI</td>
          <td class="center">yes</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">1.3 thru 1.5.2</td>
          <td class="center">1.2</td>
          <td class="center">1995-1999</td>
          <td class="center">CNRI</td>
          <td class="center">yes</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">1.6</td>
          <td class="center">1.5.2</td>
          <td class="center">2000</td>
          <td class="center">CNRI</td>
          <td class="center">no</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">2.0</td>
          <td class="center">1.6</td>
          <td class="center">2000</td>
          <td class="center">BeOpen.com</td>
          <td class="center">no</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">1.6.1</td>
          <td class="center">1.6</td>
          <td class="center">2001</td>
          <td class="center">CNRI</td>
          <td class="center">no</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">2.1</td>
          <td class="center">2.0+1.6.1</td>
          <td class="center">2001</td>
          <td class="center">PSF</td>
          <td class="center">no</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">2.0.1</td>
          <td class="center">2.0+1.6.1</td>
          <td class="center">2001</td>
          <td class="center">PSF</td>
          <td class="center">yes</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">2.1.1</td>
          <td class="center">2.1+2.0.1</td>
          <td class="center">2001</td>
          <td class="center">PSF</td>
          <td class="center">yes</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">2.2</td>
          <td class="center">2.1.1</td>
          <td class="center">2001</td>
          <td class="center">PSF</td>
          <td class="center">yes</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">2.1.2</td>
          <td class="center">2.1.1</td>
          <td class="center">2002</td>
          <td class="center">PSF</td>
          <td class="center">yes</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">2.1.3</td>
          <td class="center">2.1.2</td>
          <td class="center">2002</td>
          <td class="center">PSF</td>
          <td class="center">yes</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">2.2.1</td>
          <td class="center">2.2</td>
          <td class="center">2002</td>
          <td class="center">PSF</td>
          <td class="center">yes</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">2.2.2</td>
          <td class="center">2.2.1</td>
          <td class="center">2002</td>
          <td class="center">PSF</td>
          <td class="center">yes</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">2.2.3</td>
          <td class="center">2.2.2</td>
          <td class="center">2002-2003</td>
          <td class="center">PSF</td>
          <td class="center">yes</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">2.3</td>
          <td class="center">2.2.2</td>
          <td class="center">2002-2003</td>
          <td class="center">PSF</td>
          <td class="center">yes</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">2.3.1</td>
          <td class="center">2.3</td>
          <td class="center">2002-2003</td>
          <td class="center">PSF</td>
          <td class="center">yes</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">2.3.2</td>
          <td class="center">2.3.1</td>
          <td class="center">2003</td>
          <td class="center">PSF</td>
          <td class="center">yes</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">2.3.3</td>
          <td class="center">2.3.2</td>
          <td class="center">2003</td>
          <td class="center">PSF</td>
          <td class="center">yes</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">2.3.4</td>
          <td class="center">2.3.3</td>
          <td class="center">2004</td>
          <td class="center">PSF</td>
          <td class="center">yes</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">2.3.5</td>
          <td class="center">2.3.4</td>
          <td class="center">2005</td>
          <td class="center">PSF</td>
          <td class="center">yes</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">2.4</td>
          <td class="center">2.3</td>
          <td class="center">2004</td>
          <td class="center">PSF</td>
          <td class="center">yes</td>
        </tr>
        <tr>
          <td class="center" valign="baseline">2.4.1</td>
          <td class="center">2.4</td>
          <td class="center">2005</td>
          <td class="center">PSF</td>
          <td class="center">yes</td>
        </tr>
      </tbody>
    </table>
  </div>
  <p><span class="note"><b class="label">Note:</b> GPL-compatible doesn't mean that we're distributing Python under the
  GPL. All Python licenses, unlike the GPL, let you distribute a modified version without making your changes open
  source. The GPL-compatible licenses make it possible to combine Python with other software that is released under the
  GPL; the others don't.</span></p>
  <p>Thanks to the many outside volunteers who have worked under Guido's direction to make these releases possible.</p>
  <h1><a name="SECTION0017200000000000000000">C.2 Terms and conditions for accessing or otherwise using Python</a></h1>
  <div class="centerline" id="par10628" align="center">
    <strong>PSF LICENSE AGREEMENT FOR PYTHON 2.4.2</strong>
  </div>
  <ol>
    <li>This LICENSE AGREEMENT is between the Python Software Foundation (``PSF''), and the Individual or Organization
    (``Licensee'') accessing and otherwise using Python 2.4.2 software in source or binary form and its associated
    documentation.</li>
    <li>Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive,
    royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative
    works, distribute, and otherwise use Python 2.4.2 alone or in any derivative version, provided, however, that PSF's
    License Agreement and PSF's notice of copyright, i.e., ``Copyright &#169; 2001-2004 Python Software Foundation; All
    Rights Reserved'' are retained in Python 2.4.2 alone or in any derivative version prepared by Licensee.</li>
    <li>In the event Licensee prepares a derivative work that is based on or incorporates Python 2.4.2 or any part
    thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees
    to include in any such work a brief summary of the changes made to Python 2.4.2.</li>
    <li>PSF is making Python 2.4.2 available to Licensee on an ``AS IS'' basis. PSF MAKES NO REPRESENTATIONS OR
    WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY
    REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 2.4.2
    WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.</li>
    <li>PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 2.4.2 FOR ANY INCIDENTAL, SPECIAL, OR
    CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 2.4.2, OR ANY
    DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.</li>
    <li>This License Agreement will automatically terminate upon a material breach of its terms and conditions.</li>
    <li>Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint
    venture between PSF and Licensee. This License Agreement does not grant permission to use PSF trademarks or trade
    name in a trademark sense to endorse or promote products or services of Licensee, or any third party.</li>
    <li>By copying, installing or otherwise using Python 2.4.2, Licensee agrees to be bound by the terms and conditions
    of this License Agreement.</li>
  </ol>
  <div class="centerline" id="par10629" align="center">
    <strong>BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0</strong>
  </div>
  <div class="centerline" id="par10630" align="center">
    <strong>BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1</strong>
  </div>
  <ol>
    <li>This LICENSE AGREEMENT is between BeOpen.com (``BeOpen''), having an office at 160 Saratoga Avenue, Santa
    Clara, CA 95051, and the Individual or Organization (``Licensee'') accessing and otherwise using this software in
    source or binary form and its associated documentation (``the Software'').</li>
    <li>Subject to the terms and conditions of this BeOpen Python License Agreement, BeOpen hereby grants Licensee a
    non-exclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly,
    prepare derivative works, distribute, and otherwise use the Software alone or in any derivative version, provided,
    however, that the BeOpen Python License is retained in the Software, alone or in any derivative version prepared by
    Licensee.</li>
    <li>BeOpen is making the Software available to Licensee on an ``AS IS'' basis. BEOPEN MAKES NO REPRESENTATIONS OR
    WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND DISCLAIMS ANY
    REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE
    WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.</li>
    <li>BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR
    CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY DERIVATIVE
    THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.</li>
    <li>This License Agreement will automatically terminate upon a material breach of its terms and conditions.</li>
    <li>This License Agreement shall be governed by and interpreted in all respects by the law of the State of
    California, excluding conflict of law provisions. Nothing in this License Agreement shall be deemed to create any
    relationship of agency, partnership, or joint venture between BeOpen and Licensee. This License Agreement does not
    grant permission to use BeOpen trademarks or trade names in a trademark sense to endorse or promote products or
    services of Licensee, or any third party. As an exception, the ``BeOpen Python'' logos available at
    http://www.pythonlabs.com/logos.html may be used according to the permissions granted on that web page.</li>
    <li>By copying, installing or otherwise using the software, Licensee agrees to be bound by the terms and conditions
    of this License Agreement.</li>
  </ol>
  <div class="centerline" id="par10631" align="center">
    <strong>CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1</strong>
  </div>
  <ol>
    <li>This LICENSE AGREEMENT is between the Corporation for National Research Initiatives, having an office at 1895
    Preston White Drive, Reston, VA 20191 (``CNRI''), and the Individual or Organization (``Licensee'') accessing and
    otherwise using Python 1.6.1 software in source or binary form and its associated documentation.</li>
    <li>Subject to the terms and conditions of this License Agreement, CNRI hereby grants Licensee a nonexclusive,
    royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative
    works, distribute, and otherwise use Python 1.6.1 alone or in any derivative version, provided, however, that
    CNRI's License Agreement and CNRI's notice of copyright, i.e., ``Copyright &#169; 1995-2001 Corporation for
    National Research Initiatives; All Rights Reserved'' are retained in Python 1.6.1 alone or in any derivative
    version prepared by Licensee. Alternately, in lieu of CNRI's License Agreement, Licensee may substitute the
    following text (omitting the quotes): ``Python 1.6.1 is made available subject to the terms and conditions in
    CNRI's License Agreement. This Agreement together with Python 1.6.1 may be located on the Internet using the
    following unique, persistent identifier (known as a handle): 1895.22/1013. This Agreement may also be obtained from
    a proxy server on the Internet using the following URL: <a class="url" href=
    "http://hdl.handle.net/1895.22/1013">http://hdl.handle.net/1895.22/1013</a>.''</li>
    <li>In the event Licensee prepares a derivative work that is based on or incorporates Python 1.6.1 or any part
    thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees
    to include in any such work a brief summary of the changes made to Python 1.6.1.</li>
    <li>CNRI is making Python 1.6.1 available to Licensee on an ``AS IS'' basis. CNRI MAKES NO REPRESENTATIONS OR
    WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND DISCLAIMS ANY
    REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1
    WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.</li>
    <li>CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR
    CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, OR ANY
    DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.</li>
    <li>This License Agreement will automatically terminate upon a material breach of its terms and conditions.</li>
    <li>This License Agreement shall be governed by the federal intellectual property law of the United States,
    including without limitation the federal copyright law, and, to the extent such U.S. federal law does not apply, by
    the law of the Commonwealth of Virginia, excluding Virginia's conflict of law provisions. Notwithstanding the
    foregoing, with regard to derivative works based on Python 1.6.1 that incorporate non-separable material that was
    previously distributed under the GNU General Public License (GPL), the law of the Commonwealth of Virginia shall
    govern this License Agreement only as to issues arising under or with respect to Paragraphs 4, 5, and 7 of this
    License Agreement. Nothing in this License Agreement shall be deemed to create any relationship of agency,
    partnership, or joint venture between CNRI and Licensee. This License Agreement does not grant permission to use
    CNRI trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any
    third party.</li>
    <li>By clicking on the ``ACCEPT'' button where indicated, or by copying, installing or otherwise using Python
    1.6.1, Licensee agrees to be bound by the terms and conditions of this License Agreement.</li>
  </ol>
  <div class="centerline" id="par10632" align="center">
    ACCEPT
  </div>
  <div class="centerline" id="par10633" align="center">
    <strong>CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2</strong>
  </div>
  <p>Copyright &#169; 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, The Netherlands. All rights reserved.</p>
  <p>Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without
  fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright
  notice and this permission notice appear in supporting documentation, and that the name of Stichting Mathematisch
  Centrum or CWI not be used in advertising or publicity pertaining to distribution of the software without specific,
  written prior permission.</p>
  <p>STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
  WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE FOR ANY
  SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
  OR PERFORMANCE OF THIS SOFTWARE.</p>
  <h1><a name="SECTION0017300000000000000000">C.3 Licenses and Acknowledgements for Incorporated Software</a></h1>
  <p>This section is an incomplete, but growing list of licenses and acknowledgements for third-party software
  incorporated in the Python distribution.</p>
  <h2><a name="SECTION0017310000000000000000">C.3.1 Mersenne Twister</a></h2>
  <p>The <tt class="module">_random</tt> module includes code based on a download from <a class="url" href=
  "http://www.math.keio.ac.jp/~matumoto/MT2002/emt19937ar.html">http://www.math.keio.ac.jp/~matumoto/MT2002/emt19937ar.html</a>.
  The following are the verbatim comments from the original code:</p>
  <div class="verbatim">
    <pre>
A C-program for MT19937, with initialization improved 2002/1/26.
Coded by Takuji Nishimura and Makoto Matsumoto.
Before using, initialize the state by using init_genrand(seed)
or init_by_array(init_key, key_length).
Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
 1. Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.
 2. Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.
 3. The names of its contributors may not be used to endorse or promote
    products derived from this software without specific prior written
    permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Any feedback is very welcome.
http://www.math.keio.ac.jp/matumoto/emt.html
email: matumoto@math.keio.ac.jp
</pre>
  </div>
  <h2><a name="SECTION0017320000000000000000">C.3.2 Sockets</a></h2>
  <p>The <tt class="module">socket</tt> module uses the functions, <tt class="function">getaddrinfo</tt>, and
  <tt class="function">getnameinfo</tt>, which are coded in separate source files from the WIDE Project, <a class="url"
  href="http://www.wide.ad.jp/about/index.html">http://www.wide.ad.jp/about/index.html</a>.</p>
  <div class="verbatim">
    <pre>
      
Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
All rights reserved.
 
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.
3. Neither the name of the project nor the names of its contributors
   may be used to endorse or promote products derived from this software
   without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
GAI_ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
FOR GAI_ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON GAI_ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN GAI_ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
</pre>
  </div>
  <h2><a name="SECTION0017330000000000000000">C.3.3 Floating point exception control</a></h2>
  <p>The source for the <tt class="module">fpectl</tt> module includes the following notice:</p>
  <div class="verbatim">
    <pre>
     ---------------------------------------------------------------------  
    /                       Copyright (c) 1996.                           \ 
   |          The Regents of the University of California.                 |
   |                        All rights reserved.                           |
   |                                                                       |
   |   Permission to use, copy, modify, and distribute this software for   |
   |   any purpose without fee is hereby granted, provided that this en-   |
   |   tire notice is included in all copies of any software which is or   |
   |   includes  a  copy  or  modification  of  this software and in all   |
   |   copies of the supporting documentation for such software.           |
   |                                                                       |
   |   This  work was produced at the University of California, Lawrence   |
   |   Livermore National Laboratory under  contract  no.  W-7405-ENG-48   |
   |   between  the  U.S.  Department  of  Energy and The Regents of the   |
   |   University of California for the operation of UC LLNL.              |
   |                                                                       |
   |                              DISCLAIMER                               |
   |                                                                       |
   |   This  software was prepared as an account of work sponsored by an   |
   |   agency of the United States Government. Neither the United States   |
   |   Government  nor the University of California nor any of their em-   |
   |   ployees, makes any warranty, express or implied, or  assumes  any   |
   |   liability  or  responsibility  for the accuracy, completeness, or   |
   |   usefulness of any information,  apparatus,  product,  or  process   |
   |   disclosed,   or  represents  that  its  use  would  not  infringe   |
   |   privately-owned rights. Reference herein to any specific  commer-   |
   |   cial  products,  process,  or  service  by trade name, trademark,   |
   |   manufacturer, or otherwise, does not  necessarily  constitute  or   |
   |   imply  its endorsement, recommendation, or favoring by the United   |
   |   States Government or the University of California. The views  and   |
   |   opinions  of authors expressed herein do not necessarily state or   |
   |   reflect those of the United States Government or  the  University   |
   |   of  California,  and shall not be used for advertising or product   |
    \  endorsement purposes.                                              / 
     ---------------------------------------------------------------------
</pre>
  </div>
  <h2><a name="SECTION0017340000000000000000">C.3.4 MD5 message digest algorithm</a></h2>
  <p>The source code for the <tt class="module">md5</tt> module contains the following notice:</p>
  <div class="verbatim">
    <pre>
Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
rights reserved.
License to copy and use this software is granted provided that it
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
Algorithm" in all material mentioning or referencing this software
or this function.
License is also granted to make and use derivative works provided
that such works are identified as "derived from the RSA Data
Security, Inc. MD5 Message-Digest Algorithm" in all material
mentioning or referencing the derived work.
RSA Data Security, Inc. makes no representations concerning either
the merchantability of this software or the suitability of this
software for any particular purpose. It is provided "as is"
without express or implied warranty of any kind.
These notices must be retained in any copies of any part of this
documentation and/or software.
</pre>
  </div>
  <h2><a name="SECTION0017350000000000000000">C.3.5 Asynchronous socket services</a></h2>
  <p>The <tt class="module">asynchat</tt> and <tt class="module">asyncore</tt> modules contain the following
  notice:</p>
  <div class="verbatim">
    <pre>
      
 Copyright 1996 by Sam Rushing
                         All Rights Reserved
 Permission to use, copy, modify, and distribute this software and
 its documentation for any purpose and without fee is hereby
 granted, provided that the above copyright notice appear in all
 copies and that both that copyright notice and this permission
 notice appear in supporting documentation, and that the name of Sam
 Rushing not be used in advertising or publicity pertaining to
 distribution of the software without specific, written prior
 permission.
 SAM RUSHING DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
 NO EVENT SHALL SAM RUSHING BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
 OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
 NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</pre>
  </div>
  <h2><a name="SECTION0017360000000000000000">C.3.6 Cookie management</a></h2>
  <p>The <tt class="module">Cookie</tt> module contains the following notice:</p>
  <div class="verbatim">
    <pre>
 Copyright 2000 by Timothy O'Malley &lt;timo@alum.mit.edu&gt;
                All Rights Reserved
 Permission to use, copy, modify, and distribute this software
 and its documentation for any purpose and without fee is hereby
 granted, provided that the above copyright notice appear in all
 copies and that both that copyright notice and this permission
 notice appear in supporting documentation, and that the name of
 Timothy O'Malley  not be used in advertising or publicity
 pertaining to distribution of the software without specific, written
 prior permission.
 Timothy O'Malley DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
 SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
 AND FITNESS, IN NO EVENT SHALL Timothy O'Malley BE LIABLE FOR
 ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
 ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 PERFORMANCE OF THIS SOFTWARE.
</pre>
  </div>
  <h2><a name="SECTION0017370000000000000000">C.3.7 Profiling</a></h2>
  <p>The <tt class="module">profile</tt> and <tt class="module">pstats</tt> modules contain the following notice:</p>
  <div class="verbatim">
    <pre>
 Copyright 1994, by InfoSeek Corporation, all rights reserved.
 Written by James Roskind
 Permission to use, copy, modify, and distribute this Python software
 and its associated documentation for any purpose (subject to the
 restriction in the following sentence) without fee is hereby granted,
 provided that the above copyright notice appears in all copies, and
 that both that copyright notice and this permission notice appear in
 supporting documentation, and that the name of InfoSeek not be used in
 advertising or publicity pertaining to distribution of the software
 without specific, written prior permission.  This permission is
 explicitly restricted to the copying and modification of the software
 to remain in Python, compiled Python, or other languages (such as C)
 wherein the modified or derived code is exclusively imported into a
 Python module.
 INFOSEEK CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
 SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
 FITNESS. IN NO EVENT SHALL INFOSEEK CORPORATION BE LIABLE FOR ANY
 SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
 RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
 CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</pre>
  </div>
  <h2><a name="SECTION0017380000000000000000">C.3.8 Execution tracing</a></h2>
  <p>The <tt class="module">trace</tt> module contains the following notice:</p>
  <div class="verbatim">
    <pre>
 portions copyright 2001, Autonomous Zones Industries, Inc., all rights...
 err...  reserved and offered to the public under the terms of the
 Python 2.2 license.
 Author: Zooko O'Whielacronx
 http://zooko.com/
 mailto:zooko@zooko.com
 Copyright 2000, Mojam Media, Inc., all rights reserved.
 Author: Skip Montanaro
 Copyright 1999, Bioreason, Inc., all rights reserved.
 Author: Andrew Dalke
 Copyright 1995-1997, Automatrix, Inc., all rights reserved.
 Author: Skip Montanaro
 Copyright 1991-1995, Stichting Mathematisch Centrum, all rights reserved.
 Permission to use, copy, modify, and distribute this Python software and
 its associated documentation for any purpose without fee is hereby
 granted, provided that the above copyright notice appears in all copies,
 and that both that copyright notice and this permission notice appear in
 supporting documentation, and that the name of neither Automatrix,
 Bioreason or Mojam Media be used in advertising or publicity pertaining to
 distribution of the software without specific, written prior permission.
</pre>
  </div>
  <h2><a name="SECTION0017390000000000000000">C.3.9 UUencode and UUdecode functions</a></h2>
  <p>The <tt class="module">uu</tt> module contains the following notice:</p>
  <div class="verbatim">
    <pre>
 Copyright 1994 by Lance Ellinghouse
 Cathedral City, California Republic, United States of America.
                        All Rights Reserved
 Permission to use, copy, modify, and distribute this software and its
 documentation for any purpose and without fee is hereby granted,
 provided that the above copyright notice appear in all copies and that
 both that copyright notice and this permission notice appear in
 supporting documentation, and that the name of Lance Ellinghouse
 not be used in advertising or publicity pertaining to distribution
 of the software without specific, written prior permission.
 LANCE ELLINGHOUSE DISCLAIMS ALL WARRANTIES WITH REGARD TO
 THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
 FITNESS, IN NO EVENT SHALL LANCE ELLINGHOUSE CENTRUM BE LIABLE
 FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
 OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 Modified by Jack Jansen, CWI, July 1995:
 - Use binascii module to do the actual line-by-line conversion
   between ascii and binary. This results in a 1000-fold speedup. The C
   version is still 5 times faster, though.
 - Arguments more compliant with python standard
</pre>
  </div>
  <h2><a name="SECTION00173100000000000000000">C.3.10 XML Remote Procedure Calls</a></h2>
  <p>The <tt class="module">xmlrpclib</tt> module contains the following notice:</p>
  <div class="verbatim">
    <pre>
     The XML-RPC client interface is
 Copyright (c) 1999-2002 by Secret Labs AB
 Copyright (c) 1999-2002 by Fredrik Lundh
 By obtaining, using, and/or copying this software and/or its
 associated documentation, you agree that you have read, understood,
 and will comply with the following terms and conditions:
 Permission to use, copy, modify, and distribute this software and
 its associated documentation for any purpose and without fee is
 hereby granted, provided that the above copyright notice appears in
 all copies, and that both that copyright notice and this permission
 notice appear in supporting documentation, and that the name of
 Secret Labs AB or the author not be used in advertising or publicity
 pertaining to distribution of the software without specific, written
 prior permission.
 SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
 TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT-
 ABILITY AND FITNESS.  IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR
 BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
 DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
 ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
 OF THIS SOFTWARE.
</pre>
  </div>
  <h1>  D. Glossary</h1>
  <dl>
    <dd><a id='l2h-34' xml:id='l2h-34'></a></dd>
    <dt><strong><code>&gt;</code>&gt;</strong>&gt;</dt>
    <dd>
      The typical Python prompt of the interactive shell. Often seen for code examples that can be tried right away in
      the interpreter.
      <p><a id='l2h-35' xml:id='l2h-35'></a></p>
    </dd>
    <dt><strong><code>.</code>.</strong>.</dt>
    <dd>
      The typical Python prompt of the interactive shell when entering code for an indented code block.
      <p><a id='l2h-36' xml:id='l2h-36'></a></p>
    </dd>
    <dt><strong>BDFL</strong></dt>
    <dd>
      Benevolent Dictator For Life, a.k.a. <a class="ulink" href="http://www.python.org/~guido/">Guido van Rossum</a>,
      Python's creator.
      <p><a id='l2h-37' xml:id='l2h-37'></a></p>
    </dd>
    <dt><strong>byte code</strong></dt>
    <dd>
      The internal representation of a Python program in the interpreter. The byte code is also cached in
      <code>.pyc</code> and <code>.pyo</code> files so that executing the same file is faster the second time
      (recompilation from source to byte code can be avoided). This ``intermediate language'' is said to run on a
      ``virtual machine'' that calls the subroutines corresponding to each bytecode.
      <p><a id='l2h-38' xml:id='l2h-38'></a></p>
    </dd>
    <dt><strong>classic class</strong></dt>
    <dd>
      Any class which does not inherit from <tt class="class">object</tt>. See <em>new-style class</em>.
      <p><a id='l2h-39' xml:id='l2h-39'></a></p>
    </dd>
    <dt><strong>coercion</strong></dt>
    <dd>
      The implicit conversion of an instance of one type to another during an operation which involves two arguments of
      the same type. For example, <code>int(3.15)</code> converts the floating point number to the integer
      <code>3</code>, but in <code>3+4.5</code>, each argument is of a different type (one int, one float), and both
      must be converted to the same type before they can be added or it will raise a <code>TypeError</code>. Coercion
      between two operands can be performed with the <code>coerce</code> builtin function; thus, <code>3+4.5</code> is
      equivalent to calling <code>operator.add(*coerce(3, 4.5))</code> and results in <code>operator.add(3.0,
      4.5)</code>. Without coercion, all arguments of even compatible types would have to be normalized to the same
      value by the programmer, e.g., <code>float(3)+4.5</code> rather than just <code>3+4.5</code>.
      <p><a id='l2h-40' xml:id='l2h-40'></a></p>
    </dd>
    <dt><strong>complex number</strong></dt>
    <dd>
      An extension of the familiar real number system in which all numbers are expressed as a sum of a real part and an
      imaginary part. Imaginary numbers are real multiples of the imaginary unit (the square root of <code>-1</code>),
      often written <code>i</code> in mathematics or <code>j</code> in engineering. Python has builtin support for
      complex numbers, which are written with this latter notation; the imaginary part is written with a <code>j</code>
      suffix, e.g., <code>3+1j</code>. To get access to complex equivalents of the <tt class="module">math</tt> module,
      use <tt class="module">cmath</tt>. Use of complex numbers is a fairly advanced mathematical feature. If you're
      not aware of a need for them, it's almost certain you can safely ignore them.
      <p><a id='l2h-41' xml:id='l2h-41'></a></p>
    </dd>
    <dt><strong>descriptor</strong></dt>
    <dd>
      Any <em>new-style</em> object that defines the methods <tt class="method">__get__()</tt>, <tt class=
      "method">__set__()</tt>, or <tt class="method">__delete__()</tt>. When a class attribute is a descriptor, its
      special binding behavior is triggered upon attribute lookup. Normally, writing <var>a.b</var> looks up the object
      <var>b</var> in the class dictionary for <var>a</var>, but if <var>b</var> is a descriptor, the defined method
      gets called. Understanding descriptors is a key to a deep understanding of Python because they are the basis for
      many features including functions, methods, properties, class methods, static methods, and reference to super
      classes.
      <p><a id='l2h-42' xml:id='l2h-42'></a></p>
    </dd>
    <dt><strong>dictionary</strong></dt>
    <dd>
      An associative array, where arbitrary keys are mapped to values. The use of <tt class="class">dict</tt> much
      resembles that for <tt class="class">list</tt>, but the keys can be any object with a <tt class=
      "method">__hash__()</tt> function, not just integers starting from zero. Called a hash in Perl.
      <p><a id='l2h-43' xml:id='l2h-43'></a></p>
    </dd>
    <dt><strong>duck-typing</strong></dt>
    <dd>
      Pythonic programming style that determines an object's type by inspection of its method or attribute signature
      rather than by explicit relationship to some type object ("If it looks like a duck and quacks like a duck, it
      must be a duck.") By emphasizing interfaces rather than specific types, well-designed code improves its
      flexibility by allowing polymorphic substitution. Duck-typing avoids tests using <tt class="function">type()</tt>
      or <tt class="function">isinstance()</tt>. Instead, it typically employs <tt class="function">hasattr()</tt>
      tests or <em>EAFP</em> programming.
      <p><a id='l2h-44' xml:id='l2h-44'></a></p>
    </dd>
    <dt><strong>EAFP</strong></dt>
    <dd>
      Easier to ask for forgiveness than permission. This common Python coding style assumes the existence of valid
      keys or attributes and catches exceptions if the assumption proves false. This clean and fast style is
      characterized by the presence of many <tt class="keyword">try</tt> and <tt class="keyword">except</tt>
      statements. The technique contrasts with the <em>LBYL</em> style that is common in many other languages such as
      C.
      <p><a id='l2h-45' xml:id='l2h-45'></a></p>
    </dd>
    <dt><strong>__future__</strong></dt>
    <dd>
      A pseudo module which programmers can use to enable new language features which are not compatible with the
      current interpreter. For example, the expression <code>11/4</code> currently evaluates to <code>2</code>. If the
      module in which it is executed had enabled <em>true division</em> by executing:
      <div class="verbatim">
        <pre>
from __future__ import division
</pre>
      </div>
      <p>the expression <code>11/4</code> would evaluate to <code>2.75</code>. By importing the <a class="ulink" href=
      "../lib/module-future.html"><tt class="module">__future__</tt></a> module and evaluating its variables, you can
      see when a new feature was first added to the language and when it will become the default:</p>
      <div class="verbatim">
        <pre>
&gt;&gt;&gt; import __future__
&gt;&gt;&gt; __future__.division
_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
</pre>
      </div>
      <p><a id='l2h-46' xml:id='l2h-46'></a></p>
    </dd>
    <dt><strong>generator</strong></dt>
    <dd>
      A function that returns an iterator. It looks like a normal function except that values are returned to the
      caller using a <tt class="keyword">yield</tt> statement instead of a <tt class="keyword">return</tt> statement.
      Generator functions often contain one or more <tt class="keyword">for</tt> or <tt class="keyword">while</tt>
      loops that <tt class="keyword">yield</tt> elements back to the caller. The function execution is stopped at the
      <tt class="keyword">yield</tt> keyword (returning the result) and is resumed there when the next element is
      requested by calling the <tt class="method">next()</tt> method of the returned iterator.
      <p><a id='l2h-47' xml:id='l2h-47'></a></p>
    </dd>
    <dt><strong>generator expression</strong></dt>
    <dd>
      An expression that returns a generator. It looks like a normal expression followed by a <tt class=
      "keyword">for</tt> expression defining a loop variable, range, and an optional <tt class="keyword">if</tt>
      expression. The combined expression generates values for an enclosing function:
      <div class="verbatim">
        <pre>
&gt;&gt;&gt; sum(i*i for i in range(10))         # sum of squares 0, 1, 4, ... 81
285
</pre>
      </div>
      <p><a id='l2h-48' xml:id='l2h-48'></a></p>
    </dd>
    <dt><strong>GIL</strong></dt>
    <dd>
      See <em>global interpreter lock</em>.
      <p><a id='l2h-49' xml:id='l2h-49'></a></p>
    </dd>
    <dt><strong>global interpreter lock</strong></dt>
    <dd>
      The lock used by Python threads to assure that only one thread can be run at a time. This simplifies Python by
      assuring that no two processes can access the same memory at the same time. Locking the entire interpreter makes
      it easier for the interpreter to be multi-threaded, at the expense of some parallelism on multi-processor
      machines. Efforts have been made in the past to create a ``free-threaded'' interpreter (one which locks shared
      data at a much finer granularity), but performance suffered in the common single-processor case.
      <p><a id='l2h-50' xml:id='l2h-50'></a></p>
    </dd>
    <dt><strong>IDLE</strong></dt>
    <dd>
      An Integrated Development Environment for Python. IDLE is a basic editor and interpreter environment that ships
      with the standard distribution of Python. Good for beginners, it also serves as clear example code for those
      wanting to implement a moderately sophisticated, multi-platform GUI application.
      <p><a id='l2h-51' xml:id='l2h-51'></a></p>
    </dd>
    <dt><strong>immutable</strong></dt>
    <dd>
      An object with fixed value. Immutable objects are numbers, strings or tuples (and more). Such an object cannot be
      altered. A new object has to be created if a different value has to be stored. They play an important role in
      places where a constant hash value is needed, for example as a key in a dictionary.
      <p><a id='l2h-52' xml:id='l2h-52'></a></p>
    </dd>
    <dt><strong>integer division</strong></dt>
    <dd>
      Mathematical division discarding any remainder. For example, the expression <code>11/4</code> currently evaluates
      to <code>2</code> in contrast to the <code>2.75</code> returned by float division. Also called <em>floor
      division</em>. When dividing two integers the outcome will always be another integer (having the floor function
      applied to it). However, if one of the operands is another numeric type (such as a <tt class="class">float</tt>),
      the result will be coerced (see <em>coercion</em>) to a common type. For example, an integer divided by a float
      will result in a float value, possibly with a decimal fraction. Integer division can be forced by using the
      <code>//</code> operator instead of the <code>/</code> operator. See also <em>__future__</em>.
      <p><a id='l2h-53' xml:id='l2h-53'></a></p>
    </dd>
    <dt><strong>interactive</strong></dt>
    <dd>
      Python has an interactive interpreter which means that you can try out things and immediately see their results.
      Just launch <code>python</code> with no arguments (possibly by selecting it from your computer's main menu). It
      is a very powerful way to test out new ideas or inspect modules and packages (remember <code>help(x)</code>).
      <p><a id='l2h-54' xml:id='l2h-54'></a></p>
    </dd>
    <dt><strong>interpreted</strong></dt>
    <dd>
      Python is an interpreted language, as opposed to a compiled one. This means that the source files can be run
      directly without first creating an executable which is then run. Interpreted languages typically have a shorter
      development/debug cycle than compiled ones, though their programs generally also run more slowly. See also
      <em>interactive</em>.
      <p><a id='l2h-55' xml:id='l2h-55'></a></p>
    </dd>
    <dt><strong>iterable</strong></dt>
    <dd>
      A container object capable of returning its members one at a time. Examples of iterables include all sequence
      types (such as <tt class="class">list</tt>, <tt class="class">str</tt>, and <tt class="class">tuple</tt>) and
      some non-sequence types like <tt class="class">dict</tt> and <tt class="class">file</tt> and objects of any
      classes you define with an <tt class="method">__iter__()</tt> or <tt class="method">__getitem__()</tt> method.
      Iterables can be used in a <tt class="keyword">for</tt> loop and in many other places where a sequence is needed
      (<tt class="function">zip()</tt>, <tt class="function">map()</tt>, ...). When an iterable object is passed as an
      argument to the builtin function <tt class="function">iter()</tt>, it returns an iterator for the object. This
      iterator is good for one pass over the set of values. When using iterables, it is usually not necessary to call
      <tt class="function">iter()</tt> or deal with iterator objects yourself. The <code>for</code> statement does that
      automatically for you, creating a temporary unnamed variable to hold the iterator for the duration of the loop.
      See also <em>iterator</em>, <em>sequence</em>, and <em>generator</em>.
      <p><a id='l2h-56' xml:id='l2h-56'></a></p>
    </dd>
    <dt><strong>iterator</strong></dt>
    <dd>
      An object representing a stream of data. Repeated calls to the iterator's <tt class="method">next()</tt> method
      return successive items in the stream. When no more data is available a <tt class="exception">StopIteration</tt>
      exception is raised instead. At this point, the iterator object is exhausted and any further calls to its
      <tt class="method">next()</tt> method just raise <tt class="exception">StopIteration</tt> again. Iterators are
      required to have an <tt class="method">__iter__()</tt> method that returns the iterator object itself so every
      iterator is also iterable and may be used in most places where other iterables are accepted. One notable
      exception is code that attempts multiple iteration passes. A container object (such as a <tt class=
      "class">list</tt>) produces a fresh new iterator each time you pass it to the <tt class="function">iter()</tt>
      function or use it in a <tt class="keyword">for</tt> loop. Attempting this with an iterator will just return the
      same exhausted iterator object used in the previous iteration pass, making it appear like an empty container.
      <p><a id='l2h-57' xml:id='l2h-57'></a></p>
    </dd>
    <dt><strong>LBYL</strong></dt>
    <dd>
      Look before you leap. This coding style explicitly tests for pre-conditions before making calls or lookups. This
      style contrasts with the <em>EAFP</em> approach and is characterized by the presence of many <tt class=
      "keyword">if</tt> statements.
      <p><a id='l2h-58' xml:id='l2h-58'></a></p>
    </dd>
    <dt><strong>list comprehension</strong></dt>
    <dd>
      A compact way to process all or a subset of elements in a sequence and return a list with the results.
      <code>result = ["0x%02x% x for x in range(256) if x % 2 == 0]</code> generates a list of strings containing hex
      numbers (0x..) that are even and in the range from 0 to 255. The <tt class="keyword">if</tt> clause is optional.
      If omitted, all elements in <code>range(256)</code> are processed.
      <p><a id='l2h-59' xml:id='l2h-59'></a></p>
    </dd>
    <dt><strong>mapping</strong></dt>
    <dd>
      A container object (such as <tt class="class">dict</tt>) that supports arbitrary key lookups using the special
      method <tt class="method">__getitem__()</tt>.
      <p><a id='l2h-60' xml:id='l2h-60'></a></p>
    </dd>
    <dt><strong>metaclass</strong></dt>
    <dd>
      The class of a class. Class definitions create a class name, a class dictionary, and a list of base classes. The
      metaclass is responsible for taking those three arguments and creating the class. Most object oriented
      programming languages provide a default implementation. What makes Python special is that it is possible to
      create custom metaclasses. Most users never need this tool, but when the need arises, metaclasses can provide
      powerful, elegant solutions. They have been used for logging attribute access, adding thread-safety, tracking
      object creation, implementing singletons, and many other tasks.
      <p><a id='l2h-61' xml:id='l2h-61'></a></p>
    </dd>
    <dt><strong>mutable</strong></dt>
    <dd>
      Mutable objects can change their value but keep their <tt class="function">id()</tt>. See also
      <em>immutable</em>.
      <p><a id='l2h-62' xml:id='l2h-62'></a></p>
    </dd>
    <dt><strong>namespace</strong></dt>
    <dd>
      The place where a variable is stored. Namespaces are implemented as dictionaries. There are the local, global and
      builtin namespaces as well as nested namespaces in objects (in methods). Namespaces support modularity by
      preventing naming conflicts. For instance, the functions <tt class="function">__builtin__.open()</tt> and
      <tt class="function">os.open()</tt> are distinguished by their namespaces. Namespaces also aid readability and
      maintainability by making it clear which module implements a function. For instance, writing <tt class=
      "function">random.seed()</tt> or <tt class="function">itertools.izip()</tt> makes it clear that those functions
      are implemented by the <a class="ulink" href="../lib/module-random.html"><tt class="module">random</tt></a> and
      <a class="ulink" href="../lib/module-itertools.html"><tt class="module">itertools</tt></a> modules respectively.
      <p><a id='l2h-63' xml:id='l2h-63'></a></p>
    </dd>
    <dt><strong>nested scope</strong></dt>
    <dd>
      The ability to refer to a variable in an enclosing definition. For instance, a function defined inside another
      function can refer to variables in the outer function. Note that nested scopes work only for reference and not
      for assignment which will always write to the innermost scope. In contrast, local variables both read and write
      in the innermost scope. Likewise, global variables read and write to the global namespace.
      <p><a id='l2h-64' xml:id='l2h-64'></a></p>
    </dd>
    <dt><strong>new-style class</strong></dt>
    <dd>
      Any class that inherits from <tt class="class">object</tt>. This includes all built-in types like <tt class=
      "class">list</tt> and <tt class="class">dict</tt>. Only new-style classes can use Python's newer, versatile
      features like <tt class="method">__slots__</tt>, descriptors, properties, <tt class=
      "method">__getattribute__()</tt>, class methods, and static methods.
      <p><a id='l2h-65' xml:id='l2h-65'></a></p>
    </dd>
    <dt><strong>Python3000</strong></dt>
    <dd>
      A mythical python release, not required to be backward compatible, with telepathic interface.
      <p><a id='l2h-66' xml:id='l2h-66'></a></p>
    </dd>
    <dt><strong>__slots__</strong></dt>
    <dd>
      A declaration inside a <em>new-style class</em> that saves memory by pre-declaring space for instance attributes
      and eliminating instance dictionaries. Though popular, the technique is somewhat tricky to get right and is best
      reserved for rare cases where there are large numbers of instances in a memory-critical application.
      <p><a id='l2h-67' xml:id='l2h-67'></a></p>
    </dd>
    <dt><strong>sequence</strong></dt>
    <dd>
      An <em>iterable</em> which supports efficient element access using integer indices via the <tt class=
      "method">__getitem__()</tt> and <tt class="method">__len__()</tt> special methods. Some built-in sequence types
      are <tt class="class">list</tt>, <tt class="class">str</tt>, <tt class="class">tuple</tt>, and <tt class=
      "class">unicode</tt>. Note that <tt class="class">dict</tt> also supports <tt class="method">__getitem__()</tt>
      and <tt class="method">__len__()</tt>, but is considered a mapping rather than a sequence because the lookups use
      arbitrary <em>immutable</em> keys rather than integers.
      <p><a id='l2h-68' xml:id='l2h-68'></a></p>
    </dd>
    <dt><strong>Zen of Python</strong></dt>
    <dd>Listing of Python design principles and philosophies that are helpful in understanding and using the language.
    The listing can be found by typing ``<code>import this</code>'' at the interactive prompt.</dd>
  </dl>
  <p><br /></p>
  <h4>Notas</h4>
  <dl>
    <dt><a name="foot143">... prim&#225;rio.</a><a href="tut.html#tex2html1"><sup>2.1</sup></a></dt>
    <dd>Um problema com o pacote Readline da GNU evita isso</dd>
    <dt><a name="foot1805">... objeto)</a><a href="tut.html#tex2html2"><sup>4.1</sup></a></dt>
    <dd>De fato, passagem por refer&#234;ncia para objeto seria uma melhor descri&#231;&#227;o, pois quando um objeto
    mut&#225;vel for passado, o <em>chamador</em> ir&#225; perceber as altera&#231;&#245;es feitas pelo
    <em>chamado</em> (como a inser&#231;&#227;o de itens em uma lista).</dd>
    <dt><a name="foot755">... etc.</a><a href="tut.html#tex2html3"><sup>5.1</sup></a></dt>
    <dd>As regras para compara&#231;&#227;o de objetos de tipos diferentes n&#227;o s&#227;o confi&#225;veis; elas
    podem variar em futuras vers&#245;es da linguagem.</dd>
    <dt><a name="foot771">... importado.</a><a href="tut.html#tex2html4"><sup>6.1</sup></a></dt>
    <dd>Na verdade, defini&#231;&#245;es de fun&#231;&#245;es s&#227;o tamb&#233;m ``comandos'' que s&#227;o
    ``executados''. A execu&#231;&#227;o desses comandos &#233; colocar o nome da fun&#231;&#227;o na tabela de
    s&#237;mbolos global do m&#243;dulo.</dd>
    <dt><a name="foot1881">... nomes.</a><a href="tut.html#tex2html5"><sup>9.1</sup></a></dt>
    <dd>Exceto por uma coisa. Objetos M&#243;dulo possuem um atributo de leitura escondido chamado <tt class=
    "member">__dict__</tt> que retorna o dicion&#225;rio utilizado para implementar o espa&#231;o de nomes do
    m&#243;dulo. O nome <tt class="member">__dict__</tt> &#233; um atributo, por&#233;m n&#227;o &#233; um nome global.
    Obviamente, utilizar isto violaria a abstra&#231;&#227;o de espa&#231;o de nomes, portanto seu uso deve ser
    restrito. Um exemplo v&#225;lido &#233; o caso de depuradores <em>post-mortem</em>.</dd>
    <dt><a name="foot1971">... inicializa&#231;&#227;o:</a><a href="tut.html#tex2html6"><sup>A.1</sup></a></dt>
    <dd>Python executar&#225; o conte&#250;do do arquivo identificado pela vari&#225;vel de ambiente <a class="envvar"
    id='l2h-32' xml:id='l2h-32'>PYTHONSTARTUP</a> quando se dispara o interpretador interativamente.</dd>
  </dl>