Learn Scratch 05
Learn Scratch 05
Learn Scratch 05
O interpretador Python pode ser facilmente estendido com novas funções e tipos de
dados implementados em C ou C + + (ou outros idiomas que pode ser chamado de C). Python
também é indicado como uma linguagem de extensão para aplicações personalizável.
Para obter uma descrição de objetos padrão e módulos, consulte o Python Standard
Library. O Python Language Reference dá uma definição mais formal da língua. Para escrever
extensões em C ou C + +, leia Extendendo e incorporação do interpretador Python e Python / C
API Reference Manual. Há também vários livros abrangendo Python em profundidade.
Se você faz muito trabalho em computadores, eventualmente você achar que há alguma tarefa
que você gostaria de automatizar. Por exemplo, talvez você queira realizar uma pesquisa e
substituir por um grande número de arquivos de texto, ou renomear e reorganizar um monte
de arquivos de fotos em um caminho complicado. Talvez você gostaria de escrever um
pequeno banco de dados personalizado, ou um aplicativo GUI especializado, ou um simples
jogo.
Se você for um desenvolvedor de software profissional, você pode ter que trabalhar com
vários C / C bibliotecas / Java, mas encontrar a usual escrever / compile / teste / re-compile
ciclo é muito lento. Talvez você está escrevendo um conjunto de testes para tal uma biblioteca
e encontrar escrever o código de teste uma tarefa tediosa. Ou talvez você tenha escrito um
Você pode escrever um script shell Unix ou Windows arquivos em lote para algumas dessas
tarefas, mas scripts shell são melhores movendo arquivos e alterar dados de texto, não é bem
adequado para aplicações gráficas e jogos. Você pode escrever um C / C / programa em Java,
mas pode levar muito tempo de desenvolvimento para obter ainda um projecto de programa
de primeira. Python é simples de usar, disponível para Windows, Mac OS X e sistemas
operacionais Unix, e vai ajudá-lo a começar o trabalho feito mais rapidamente.
Python é simples de usar, mas é uma linguagem de programação, oferecendo muito mais
estrutura e apoio a grandes programas de shell scripts ou arquivos em lote pode oferecer. Por
outro lado, Python também oferece a verificação de erros muito mais do que C, e sendo uma
linguagem de muito alto nível, tem tipos de dados de alto nível, integrada, tais como matrizes
flexíveis e dicionários. Devido ao seu carácter mais geral de tipos de dados Python é aplicável a
um domínio de problema muito maior do que Awk ou até mesmo Perl, mas muitas coisas são,
pelo menos, tão fácil em Python como em outras línguas.
Python permite dividir seu programa em módulos que podem ser reutilizados em outros
programas Python. Ele vem com uma grande coleção de módulos-padrão que você pode usar
como base de seus programas - ou como exemplos para começar a aprender a programar em
Python. Alguns destes módulos oferecem coisas como arquivo I / O chamadas de sistema,
sockets, e até mesmo interfaces de toolkits de interface gráfica do usuário como Tk.
Python é uma linguagem interpretada, que você pode economizar tempo considerável durante
o desenvolvimento do programa porque não compilação e ligação é necessária. O intérprete
pode ser usado interativamente, o que torna a experiência mais fácil com as características da
linguagem, escrever programas usar e deitar fora, ou para testar as funções durante o
desenvolvimento do programa de baixo para cima. É também uma calculadora de mesa à mão.
Python permite que os programas a serem gravados e lidos de forma compacta. Programas
escritos em Python são tipicamente muito menor do que equivalente C, C, ou de programas
Java, por várias razões:
* Os tipos de alto nível, os dados permitem que você expresse operações complexas em
uma única instrução;
* Agrupamento declaração é feita por identação ao invés de início e término entre
parênteses;
* As declarações nenhuma variável ou argumento são necessárias.
Python é extensível: se você sabe programar em C é fácil adicionar uma nova função interna
ou módulo para o intérprete, seja para desempenhar operações críticas em máxima
velocidade, ou para vincular programas Python a bibliotecas que só poderá ser em formato
By the way, a linguagem é nomeado após o show da BBC "Monty Python's Flying Circus" e não
tem nada a ver com répteis. Fazendo referências a esquetes de Monty Python na
documentação não é apenas permitido, é encorajado!
Agora que você está todo animado sobre Python, você vai querer examiná-lo em alguns
detalhes. Desde que a melhor maneira de aprender uma língua é usá-lo, o tutorial convida-o a
brincar com o interpretador Python que você lê.
python3.1
para o shell. [1] Desde a escolha do diretório onde vive o intérprete é uma opção de
instalação, outros locais são possíveis, verifique com seu guru local de Python ou
administrador do sistema. (Ex.: / usr / local / python é uma localização alternativa popular.)
O intérprete atua tanto como o shell do Unix: quando chamado com entrada padrão
conectado a um dispositivo tty, ele lê e executa comandos interativamente; quando chamado
com um argumento de nome de arquivo ou com um arquivo como entrada padrão, ele lê e
executa um script que arquivo.
Uma segunda maneira de começar o intérprete de comando python-c [arg] ..., que executa a
instrução (s) no comando, análoga à opção c do shell. Uma vez que geralmente contêm
declarações Python espaços ou outros caracteres que são especiais para o shell, que é
geralmente aconselhada para citar comando em sua totalidade com aspas simples.
Alguns módulos Python são também úteis como scripts. Estes podem ser chamados usando o
módulo python-m [arg] ..., que executa o arquivo de origem para o módulo como se você
tivesse escrito o seu nome completo na linha de comando.
Observe que há uma diferença entre o arquivo python e <python arquivo. Neste último caso,
as solicitações de entrada do programa, como chamar sys.stdin.read (), são cumpridos de
arquivo. Uma vez que este arquivo já foi lido até o fim pelo analisador antes de o programa
inicia a execução, o programa vai encontrar fim-de-arquivo imediatamente. No primeiro caso
(que é geralmente o que você quiser) estão satisfeitos a partir de qualquer arquivo ou
dispositivo está conectado à entrada padrão do interpretador Python.
Quando um arquivo de script é utilizado, às vezes é útil para ser capaz de executar o script e
depois entrar em modo interativo. Isso pode ser feito passando-i antes do script. (Isso não
funciona se o script é lida da entrada padrão, pela mesma razão, como explicado no parágrafo
anterior).
2.1.1. Argumento passando
Quando os comandos são lidos a partir de um terminal, o intérprete está a ser dito em modo
interativo. Neste modo, ela pede para o próximo comando do prompt primário, geralmente
três maior do que sinais (>>>); para linhas de continuação pede com o prompt secundário, por
padrão, três pontos (...). O interpretador imprime uma mensagem de boas vindas informando
seu número de versão e um aviso de direitos autorais antes de imprimir o primeiro prompt:
$ Python3.1
Python 3.1 (Py3k, 12 de setembro de 2007, 00:21:02)
[GCC 3.4.6 20060404 (Red Hat 3.4.6-8]) em linux2
Digite "help", "copyright", "credits" ou "licença" para mais informações.
>>>
>> The_world_is_flat> = 1
>>> The_world_is_flat se:
... print ("Tenha cuidado para não cair!")
...
Tenha cuidado para não cair!
Em sistemas Unix BSD'ish, scripts Python podem ser feitas diretamente executáveis, como
shell scripts, colocando a linha
(Assumindo que o intérprete está no PATH do usuário) no início do script e dar o arquivo de
um modo executável. O #! devem ser os dois primeiros caracteres do arquivo. Em algumas
plataformas, essa primeira linha deve terminar com uma linha no estilo Unix final ('\ n'), e não
um Windows ('\ n \ r') que termina linha. Observe que o hash, ou a libra, o caráter, "#", é
usado para iniciar um comentário em Python.
O script pode ser dado um modo executável, ou permissão, usando o comando chmod:
$ Chmod + x myscript.py
Por padrão, os arquivos-fonte em Python são tratados como codificados em UTF-8. Em que a
codificação, os caracteres da maioria das línguas do mundo podem ser usados
simultaneamente em strings literais, os identificadores e comentários - apesar de a biblioteca
padrão usa apenas caracteres ASCII para identificadores, uma convenção que qualquer código
portátil deve seguir. Para exibir todos esses caracteres corretamente, seu editor deve
reconhecer que o arquivo é UTF-8, e deve usar uma fonte que suporta todos os caracteres no
arquivo.
Também é possível especificar uma codificação diferente para os arquivos fonte. Para fazer
isso, coloque mais uma linha de comentário especial direita após o #! linha para definir o
arquivo de origem de codificação:
Com essa declaração, tudo no arquivo de origem será tratado como tendo a codificação em
vez de codificação UTF-8. A lista de codificações possíveis pode ser encontrada na Biblioteca
de Referência Python, na seção codecs.
Por exemplo, se o seu editor de escolha não suporta UTF-8 arquivos codificados e insiste em
usar alguma outra codificação, por exemplo, Windows 1252, você pode escrever:
Este arquivo é somente leitura em sessões interativas, e não quando Python lê comandos de
um script, e não quando o / dev / tty é dado como a fonte explícita de comandos (que de outra
forma se comporta como uma sessão interativa). Ele é executado no mesmo namespace onde
comandos interativos são executadas, de modo que os objetos que ele define ou importação
podem ser usados sem qualificação na sessão interativa. Você também pode alterar as
instruções sys.ps1 e sys.ps2 neste arquivo.
Se você quiser ler um arquivo adicional start-up do diretório atual, você pode programar isso
no global start-up de arquivos usando o código como se os.path.isfile ('. Pythonrc.py): exec
(open (' . pythonrc.py). read ()). Se você quiser usar o arquivo de inicialização em um script,
você deve fazer isso de forma explícita no script:
OS importação
filename = os.environ.get ('PYTHONSTARTUP)
se filename e os.path.isfile (filename):
exec (open (filename). read ())
Notas de Rodapé
[1] Em Unix, o interpretador Python 3.x é instalado por padrão, não com o python executável
nomeado, para que não entre em conflito com o Python 2.x instalado simultaneamente
executável.
[2] Um problema com o pacote GNU Readline pode impedir isso.
Nos exemplos a seguir, a entrada e saída são distinguidos pela presença ou ausência de avisos
(>>> e ...): a repetir o exemplo, você deve digitar tudo após o prompt linhas, quando aparece o
prompt; que não começam estão com uma saída rápida do interpretador. Observe que um
prompt secundário em uma linha por si só em um exemplo significa que você deve digitar uma
linha em branco, o que é usado para terminar um comando multi-linha.
Muitos dos exemplos neste manual, inclusive aqueles inscritos no prompt interativo inclui,
comenta. Comentários em Python começar com o cardinal, #, e se estendem até o final da
linha física. Um comentário pode aparecer no início de uma linha ou na sequência de espaços
em branco ou código, mas não dentro de uma seqüência literal. Um personagem hash dentro
de uma seqüência literal é apenas um personagem de hash. Desde que os comentários são
para esclarecer código e não são interpretados pelo Python, que pode ser omitido quando se
digita em exemplos.
Vamos tentar alguns comandos simples em Python. Inicie o interpretador e aguarde o prompt
primário,>>>. (Não deve demorar muito.)
3.1.1. Números ¶
O interpretador atua como uma calculadora simples: você pode digitar uma expressão para ele
e ele irá escrever o valor. A sintaxe da expressão é simples: os operadores +, -, * e / funcionam
como na maioria dos outros idiomas (por exemplo, Pascal ou C); parênteses podem ser usados
para o agrupamento. Por exemplo:
>>> 2 +2
4
>>> # Este é um comentário
... 2 2
4
>>> 2 +2 # e comentário sobre a mesma linha de código
4
>>> (50-5 * 6) / 4
5,0
Frações>>> 05/08 # não são perdidos quando dividindo inteiros
1,6
Nota: Você não pode ver exatamente o mesmo resultado; resultados de ponto flutuante
podem diferir de uma máquina para outra. Falaremos mais tarde sobre como controlar a
aparência da saída de ponto flutuante. Veja também Floating Point Arithmetic: Problemas e
limitações para uma ampla discussão de algumas das sutilezas de números de ponto flutuante
e suas representações.
Para fazer uma divisão inteira e obter um resultado inteiro, descartando qualquer resultado
fracionário, não há outro operador, / /:
>> Largura> = 20
>> Altura> = 5 * 9
>>> Width * height
900
>>> X = y = z = 0 # Zero x, y e z
>>> X
0
>>> Y
0
>>> Z
0
Variáveis devem ser "definidos" (atribuído um valor) antes que eles possam ser usados, ou um
erro ocorrerá:
Não há suporte completo para ponto flutuante, os operadores com operandos de tipo misto
converter o inteiro operando em ponto flutuante:
Números complexos também são suportados; números imaginários são escritas com um sufixo
de j ou números de J. Complexo com um componente diferente de zero real são escritos como
(real + imagj), ou pode ser criado com o complexo (real, imag função).
>>> 1j * 1J
(-1 0 j)
>>> 1j * complexas (0, 1)
(-1 0 j)
>>> 3 +1 j * 3
Números complexos são sempre representados por dois números de ponto flutuante, a parte
real e imaginária. Para extrair estas peças de um número complexo z, z.real uso e z.imag.
As funções de conversão para ponto flutuante e inteiro (float (), (int)) não funcionam para
números complexos - não existe uma maneira correta de converter um número complexo para
um número real. Use abs (z) para obter sua magnitude (como um float) ou z.real para obter
sua parte real:
No modo interativo, a última expressão impressa é atribuído à variável _. Isto significa que
quando você estiver usando o Python como uma calculadora de mesa, é um pouco mais fácil
para continuar os cálculos, por exemplo:
Além dos números, Python também pode manipular strings, que pode ser expresso de várias
maneiras. Eles podem ser colocados entre aspas simples ou aspas duplas:
spam>>> 'ovos'
Ovos spam '
t \>>> 'não' "
"Não"
>>> "Não"
"Não"
>>> "Sim", disse ele.
"Sim", disse ele.
>>> "\" Sim \ ", disse ele."
"Sim", disse ele.
">>> 'T Isn \'", disse ela.
"Isn t \ '", disse ela.
O interpretador imprime o resultado das operações de string da mesma forma como eles são
digitados para a entrada: aspas dentro, e com aspas e outros caracteres estranhos escapou por
barras invertidas, para mostrar o valor exacto. A corda é colocada entre aspas duplas se a
cadeia contém uma aspa simples e não aspas duplas, então é entre aspas simples. Mais uma
vez, a função print () produz a saída mais legível.
literais String pode abranger várias linhas de várias maneiras. Continuação linhas podem ser
utilizadas, com uma barra invertida como o último caracter da linha, indicando que a próxima
linha é uma continuação lógica da linha:
print (Olá)
Note-se que novas linhas ainda precisam ser embutidos na string usando \ n; a nova linha após
a barra invertida é descartado. Esse exemplo imprime o seguinte:
Se fizermos uma seqüência literal "string" crua, seqüências \ n não são convertidas em novas
linhas, mas a barra invertida ao final da linha, eo caractere de nova linha na fonte, são
incluídos na string como dados. Assim, o exemplo:
print (Olá)
seria de impressão:
Dois literais string próximas umas das outras são automaticamente concatenadas; a primeira
linha acima também poderia ter sido escrito palavra Help = '' A ', o que só funciona com dois
literais, não com expressões de seqüência arbitrária:
Strings podem ser subscritos (indexado); como no C, o primeiro caractere de uma string tem
índice (index) 0. Não há nenhum tipo de caráter independente, um personagem é
simplesmente uma seqüência de caracteres de tamanho único. Como na linguagem de
programação Ícone, substrings podem ser especificadas com a notação de slice: dois índices
separados por dois pontos.
Slice índices têm padrões útil; uma omitido assume primeiro índice a zero, uma omitido
assume segundo índice para o tamanho da string a ser cortado.
Ao contrário de uma string C, strings Python não pode ser mudado. Atribuir para uma posição
indexados nos resultados da seqüência de caracteres em uma mensagem de erro:
No entanto, a criação de uma nova seqüência com o conteúdo combinado é fácil e eficiente:
índices slice degenerados são tratados normalmente: um índice que é muito grande passa a
ter o tamanho da corda, um limite superior menor que o limite inferior retorna uma string
vazia.
Índices podem ser números negativos, para iniciar a contagem a partir da direita. Por exemplo:
Mas observe que -0 é realmente o mesmo que 0, por isso ele não contar da direita!
Out-of-range fatia índices negativos são truncados, mas não tente fazer isso em um único
elemento (fatia ou não) os índices:
+---+---+---+---+---+
||He|p|l|A|
+---+---+---+---+---+
012345
-5 -4 -3 -2 -1
Veja também
Começando com Python 3.0 todas as strings Unicode apoio (ver http://www.unicode.org/).
Unicode tem a vantagem de fornecer um número ordinal para cada personagem em cada
script usado em textos antigos e modernos. Anteriormente, havia apenas 256 caracteres
ordinais possível para script. Textos eram tipicamente vinculados a uma página de código que
mapeou os ordinais para caracteres script. Isso levou à confusão muito especialmente no que
diz respeito à internacionalização (geralmente escrito como i18n - 'i' + 18 caracteres n '+') do
Se você desejar incluir caracteres especiais em uma string, você pode fazer isso usando a
codificação Python Unicode-Escape. O exemplo a seguir mostra como:
A seqüência de escape \ u0020 indica a inserção de caracteres Unicode com valor ordinal
0x0020 (o espaço) na posição determinada.
Outros personagens são interpretados por meio de seus respectivos valores ordinais
diretamente como ordinais em Unicode. Se você possui strings literais na codificação padrão
Latin-1 que é usado em muitos países ocidentais, você vai achar conveniente que a menor de
256 caracteres Unicode são os mesmos que os 256 caracteres Latin-1.
Para além destas codificações padrão, Python oferece um conjunto de outras formas de
criação de cadeias de caracteres Unicode com base em uma codificação conhecido.
Para converter uma string em uma seqüência de bytes utilizando uma codificação específica,
objetos string fornecer um encode (), método que leva um argumento, o nome da codificação.
nomes em minúsculas para codificações são preferidos.
3.1.4. Listas ¶
Python sabe que um número de tipos de dados compostos, utilizadas para agrupar outros
valores. O mais versátil é a lista, que pode ser escrita como uma lista de valores separados por
vírgula (itens) entre colchetes. Os itens da lista não precisa ter todos o mesmo tipo.
Como os índices de string, índices lista começa em 0, e as listas podem ser cortados,
concatenadas e assim por diante:
>>> A [0]
«Spam»
>>> A [3]
1234
>>> A [-2]
Ao contrário de cordas, que são imutáveis, é possível mudar elementos individuais da lista:
>>> A
spam [',' ovos ', 100, 1234]
>>> A [2] = a [2] + 23
>>> A
spam [',' ovos ', 123, 1234]
Atribuição de fatias também é possível, e isso pode até mesmo alterar o tamanho da lista ou
limpá-la inteiramente:
>>> Q = [2, 3]
> P> = [1, q, 4]
>> Len> (p)
3
> P>> [1]
[2, 3]
> P>> [1] [0]
2
Note-se que no último exemplo, p [1] e q realmente se referem ao mesmo objeto! Voltaremos
ao objeto semântica mais tarde.
3.2. Primeiros passos rumo a programação ¶
Naturalmente, nós podemos utilizar Python para tarefas mais complicadas do que somar dois
e dois juntos. Por exemplo, podemos escrever uma primeira sub-seqüência da série de
Fibonacci da seguinte forma:
O laço while é executado enquanto a condição (aqui: b <10) continua a ser verdade. Em
Python, como em C, qualquer valor diferente de zero inteiro é verdade; zero é falso. A
condição também pode ser uma string ou lista de valores, na verdade qualquer sequência
nada, com um comprimento de zero é verdadeiro, seqüências vazias são falsas. O teste
utilizado no exemplo é uma comparação simples. Os operadores de comparação padrão são
escritos da mesma forma como no C: <(menor que),> (maior que), == (igual), <= (menor ou
igual),> = (maior ou igual a) e! = (não igual).
*
O corpo do loop é recuado: recuo Python é a maneira de agrupar comandos. Python não
(ainda!) Fornecer uma facilidade de edição inteligente de entrada de linha, então você tem
que digitar um separador ou espaço (s) para cada linha recuada. Na prática, você vai preparar
a entrada mais complicado para Python com um editor de texto, a maioria dos editores de
texto têm uma facilidade de auto-travessão. Quando uma instrução composta é inserida de
forma interactiva, que deve ser seguido por uma linha em branco para indicar a conclusão
(uma vez que o analisador não é possível adivinhar quando você digitou a última linha). Note
que cada linha dentro de um bloco de base deve ser recuado no mesmo montante.
*
A função print () escreve o valor da expressão (s) é dado. Ela difere de apenas escrever a
expressão que você quer escrever (como fizemos nos exemplos anteriores calculadora) na
forma como ele lida com várias expressões, quantidades ponto flutuante e strings. Strings são
impressas sem aspas, e um espaço é inserido entre itens, para que você possa formatar as
coisas bem, como este:
O fim-chave pode ser usada para evitar a quebra de linha após a saída ou a saída final com
uma seqüência diferente:
>>> A, b = 0, 1
>>> While b <1000:
... print (b, end = ')
... a, b = b, a + b
...
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
Pode haver zero ou mais partes elif, e outra parte é opcional. elif A palavra-chave "é a
abreviação de 'else if', e é útil para evitar identação excessiva. Uma se ... elif ... elif ... seqüência
é um substituto para o switch ou caso as declarações encontradas em outras línguas.
Se você precisa fazer para iterar sobre uma seqüência de números, o built-in função gama ()
vem a calhar. Ele gera progressões aritméticas:
O ponto final dado não faz parte da lista gerada; intervalo (10) gera 10 valores, os índices
legais para os itens de uma seqüência de comprimento 10. É possível deixar iniciar o intervalo
em outro número, ou para especificar um incremento diferente (mesmo negativa, às vezes
isso é chamado de passo "):
Para iterar sobre os índices de uma seqüência, você pode combinar range () e len () como
segue:
Na maioria dos casos, no entanto, é conveniente usar a enumerar () função, consulte Looping
Técnicas.
Em muitas maneiras o objeto retornado por range () se comporta como se fosse uma lista, mas
na verdade não é. É um objeto que retorna os itens sucessivos da seqüência desejada quando
você iterar sobre ele, mas ele realmente não fazer a lista, economizando espaço.
Dizemos que um objeto é iteráveis, ou seja, como um destino adequado para as funções e as
construções que esperam algo de que eles podem obter itens sucessivos até que a oferta está
esgotada. Vimos que a instrução for é como um iterador. A lista () função é outra, que cria
listas de iterables:
Mais tarde veremos mais funções que iterables retorno e tomar iterables como argumento.
4.4. break e continue, e mais cláusulas de Loops ¶
Declarações Loop pode ter uma cláusula else, que é executado quando o laço se encerra por
exaustão da lista (com a) ou quando a condição se torne falsa (com tempo), mas não quando o
laço é encerrado por um comando break. Isto é exemplificado pelo ciclo seguinte, que procura
por números primos:
A declaração de passar não faz nada. Pode ser utilizado quando é necessária uma declaração
sintaticamente, mas o programa não requer nenhuma ação. Por exemplo:
Outra passagem lugar pode ser usado como um lugar é detentor de uma função ou órgão
subordinado quando você está trabalhando no novo código, permitindo-lhe manter-se pensar
em um nível mais abstracto. O passe é ignorado:
Podemos criar uma função que escreve a série de Fibonacci para um limite arbitrário:
A palavra-chave def introduz uma definição de função. Deve ser seguido do nome da função
eo parêntesis lista de parâmetros formais. Os depoimentos que formam o corpo do início da
função na linha seguinte, e deve ser recuado.
A primeira instrução do corpo da função pode ser opcionalmente uma seqüência literal, esta
string é literal string a função de documentação, ou docstring. (Mais sobre docstrings podem
ser encontradas na seção Documentação Strings.) Existem ferramentas que utilizam docstrings
para produzir automaticamente online ou a documentação impressa, ou para permitir que o
usuário navegar interativamente por meio de código, é boa prática incluir docstrings no código
que você escreve, então faça disso um hábito.
A execução de uma função de introduzir uma nova tabela de símbolos utilizados para as
variáveis locais da função. Mais precisamente, olhar todas as atribuições de variáveis em uma
loja de função o valor na tabela de símbolos local, referências Considerando primeira variável
na tabela de símbolos local, em seguida, nas tabelas de símbolo do local que encerram funções
e, em seguida na tabela de símbolos global e, finalmente, no tabela de built-in nomes. Assim,
as variáveis globais não podem ser diretamente atribuído um valor dentro de uma função (a
não ser chamado em uma declaração global), embora possam ser referenciadas.
Os parâmetros reais (argumentos) para uma chamada de função são introduzidos na tabela de
símbolos local da função chamada quando é chamado, portanto, argumentos são passados
usando a chamada por valor (onde o valor é sempre uma referência de objeto, e não o valor da
objeto). [1] Quando uma função chama outra função, a tabela de símbolos do novo local é
criado para esse convite.
>> Fib>
fib <função em 10042ed0>
>>> F = fib
>>> F (100)
0 1 1 2 3 5 8 13 21 34 55 89
Vindo de outras línguas, você pode fib objeto que não é uma função, mas um processo, uma
vez que não retorna um valor. Na verdade, até mesmo funções sem uma declaração de
É muito simples escrever uma função que retorna uma lista dos números da série de Fibonacci,
ao invés de imprimi-lo:
* O retorno instrução retorna com um valor de uma função. retornar sem expressão
Nenhum argumento retorna. Cair no final de uma função também retorna None.
* A declaração result.append (a) chama um método do objeto da lista de resultado. Um
método é uma função que "pertence" a um objeto e é chamada obj.methodname, onde obj é
um objeto (pode ser uma expressão), e methodname é o nome de um método que é definido
pelo tipo do objeto. Diferentes tipos definir métodos diferentes. Métodos de tipos diferentes
podem ter o mesmo nome sem causar ambigüidade. (É possível definir os tipos de objeto e
métodos próprios, utilizando-se classes, consulte Classes) O método append () mostrado no
exemplo está definido para objetos de lista, que acrescenta um novo elemento no final da
lista. Neste exemplo, é equivalente ao resultado = + resultado [a], mas mais eficiente.
Também é possível definir funções com um número variável de argumentos. Existem três
formas, que podem ser combinados.
4.7.1. Valores padrão de argumentos ¶
A forma mais útil é para especificar um valor padrão para um ou mais argumentos. Isso cria
uma função que pode ser chamado com menos argumentos do que é definido para permitir.
ask_ok def (prompt, tentativas = 4, queixa = 'Sim ou não, por favor! "):
enquanto True:
entrada ok = (prompt)
ok se em ('y', vós ',' yes '):
retornar True
ok se em ('n', 'não', nop ',' Não '):
retornar False
tentativas = tentativas - 1
se tentativas 0 <:
levantar IOError ('user refusenik ")
denúncia print ()
* Dando apenas o argumento obrigatório: ask_ok ('Você realmente deseja sair? ")
* Dando um dos argumentos opcionais: ask_ok ('OK para substituir o arquivo? ", 2)
* Ou até mesmo dando a todos os argumentos: ask_ok ('OK para substituir o arquivo? ", 2,'
Come on, apenas sim ou não!)
Este exemplo também introduz a palavra-chave no. Isso testa se uma seqüência contém um
certo valor.
i=5
i=6
(F)
será impresso 5.
AVISO IMPORTANTE: O valor padrão é avaliada apenas uma vez. Isso faz uma diferença
quando o padrão é um objeto mutável como uma lista de dicionários, ou mais instâncias de
classes. Por exemplo, a seguinte função acumula os argumentos passados em chamadas
subsequentes:
def f (a =[]):, L
L.append (a)
retorno L
[1]
[1, 2]
[1, 2, 3]
Se você não quer que o padrão a ser compartilhada entre as chamadas subseqüentes, você
pode escrever a função assim:
Funções também podem ser chamados usando argumentos-chave da chave = valor formulário.
Por exemplo, a função do seguinte:
papagaio def (tensão, estado = 'a duras', a ação voom = ', type = "Blue norueguês"):
print ("- Este papagaio não ação", end = ')
print ("se você colocar" tensão ", volts por ele.")
print ("- Lovely plumagem, o", tipo)
print ("- É", "Estado"! ")
papagaio (1000)
papagaio (action = "VOOOOOM, tensão = 1000000)
parrot ('a' mil, estado = 'empurrando para cima as margaridas ")
parrot ('a' milhões ', desprovida de vida "," salto ")
Quando um parâmetro formal final do formulário ** denominação está presente, ele recebe
um dicionário (veja Mapeamento de Tipos - dict) contendo todos os argumentos-chave, exceto
para aqueles que corresponde a um parâmetro formal. Isto pode ser combinado com um
parâmetro formal do nome * formulário (descrito na próxima subseção), que recebe uma
tupla contendo os argumentos posicionais além da lista de parâmetro formal. (* Nome deve
ocorrer antes ** nome.) Por exemplo, se definir uma função como esta:
Note que a lista de nomes de argumento-chave é criado por ordenar o resultado das palavras-
chave dicionário de teclas () método antes de imprimir o seu conteúdo, se isso não for feito, a
ordem na qual os argumentos são impressos é indefinido.
4.7.3. Listas de argumentos arbitrários ¶
Finalmente, menos freqüentemente usado é opção para especificar que uma função pode ser
chamada com um número arbitrário de argumentos. Esses argumentos serão embrulhados em
uma tupla (ver Tuples e seqüências). Antes do número variável de argumentos, zero ou mais
argumentos normais podem ocorrer.
A situação inversa ocorre quando os argumentos já estão numa lista ou tupla, mas precisa ser
descompactado para uma chamada de função que exige separar argumentos posicionais. Por
exemplo, o built-in range () função espera começar a separar e parar de argumentos. Se eles
não estão disponíveis separadamente, escreva a chamada de função com o operador *- para
descompactar os argumentos de uma lista ou tupla:
> Lista> (gama (3, 6)) # chamada normal com argumentos distintos
[3, 4, 5]
>>> Args = [3, 6]
> Lista> (intervalo (* args)) # chamada com argumentos descompactado a partir de uma lista
[3, 4, 5]
>> Papagaio def> (tensão, estado = 'a duras ", action =" voom "):
... print ("- Este papagaio não ação", end = ')
... print ("se você colocar" tensão ", volts por ele." end = ')
... print ("E", estado! ")
...
>>> D = (tensão ":" quatro milhões "," Estado ":" sangrando "arrendado", "ação": "VOOM")
>> Papagaio> (** d)
- Este papagaio não VOOM se você colocar quatro milhões de volts por ele. demised
sangrando E é!
A primeira linha deve ser sempre um resumo curto e conciso da finalidade do objeto. Para
resumir, não deveria explicitar o nome do objeto ou do tipo, uma vez que estes estão
disponíveis por outros meios (exceto se o nome passa a ser um verbo que descreve a operação
de uma função). Esta linha deve começar com uma letra maiúscula e termina com um ponto.
Se houver mais linhas na string de documentação, a segunda linha deve ser branco,
visualmente separar o resumo do resto da descrição. As linhas a seguir devem ser um ou mais
parágrafos descrevendo as convenções de chamada do objeto, seus efeitos colaterais, etc
Agora que você está prestes a escrever mais, as partes mais complexas do Python, é um bom
momento para falar sobre o estilo de codificação. A maioria das línguas pode ser escrito (ou
mais concisa, formatado), em estilos diferentes, alguns são mais legíveis do que outras. Tornar
mais fácil para os outros a ler o seu código é sempre uma boa idéia, e adotando um estilo
agradável de codificação ajuda tremendamente para isso.
Para Python, PEP 8 emergiu como o guia de estilo que mais aderem a projectos, que promove
uma leitura muito agradável e olhos estilo de codificação. Todo desenvolvedor Python deve lê-
lo em algum momento, aqui estão os pontos mais importantes extraídos para você:
4 espaços são um bom compromisso entre o recuo pequeno (permite uma maior
profundidade de assentamento) e recuo de grande porte (mais fácil de ler). Tabs introduzir
confusão, e é melhor ficar de fora.
Isso ajuda os usuários com telas pequenas e torna possível ter vários arquivos de código
lado a lado em telas maiores.
*
Use linhas em branco para separar as funções e classes, e grandes blocos de código dentro
de funções.
*
Use docstrings.
*
Use espaços em torno de operadores e após uma vírgula, mas não diretamente dentro
bracketing construções: a = f (1, 2) + g (3, 4).
*
Nome suas classes e funções de forma consistente, a convenção é usar CamelCase para
aulas e lower_case_with_underscores para funções e métodos. Sempre use "eu" como o nome
para o argumento primeiro método (ver Um primeiro olhar em classes para mais informações
sobre classes e métodos).
*
Não use fantasia codificações se o seu código é feito para ser usado em ambientes
internacionais. padrão do Python, UTF-8, ou mesmo em ASCII melhor trabalho em qualquer
caso.
*
Notas de Rodapé
[1] Na verdade, chamada por referência de objeto seria uma melhor descrição, pois, se um
objeto mutável é passado, o chamador vai ver todas as mudanças o receptor faz para ele (itens
inseridos em uma lista).
5. Estruturas de Dados
Este capítulo descreve algumas coisas que você já aprendeu em mais detalhes, e adiciona
algumas coisas novas também.
A lista de tipo de dados tem alguns métodos mais. Aqui estão todos os métodos de objetos da
lista:
list.append (x)
Adicionar um item ao fim da lista, equivalente a uma len [(a): [] = x].
list.extend (L)
Estender a lista anexando todos os itens da lista fornecida, equivalente a uma len [(a):] = L.
list.insert (i, x)
Inserir um item em uma determinada posição. O primeiro argumento é o índice do elemento
que antes de inserir, de forma a.insert (0, x) insere na frente da lista, e a.insert (len (a), x) é
equivalente a a.append ( x).
list.remove (x)
Remove o primeiro item da lista cujo valor é x. É um erro se não houver esse item.
list.pop ([i])
Remove o item na posição dada na lista, e devolvê-lo. Se nenhum índice é especificado,
a.pop () remove e retorna o último item na lista. (Os colchetes em torno do eu na assinatura
do método indicam que o parâmetro é opcional, e não que você deve digitar colchetes nessa
posição. Você verá essa notação com frequência na Referência da Biblioteca Python.)
list.index (x)
Retornar ao índice na lista do primeiro item cujo valor é x. É um erro se não houver esse
item.
list.count (x)
Retorna o número de vezes que x aparece na lista.
list.sort ()
Ordenar os itens da lista, no lugar.
list.reverse ()
Reverter os elementos da lista, no lugar.
A lista de métodos de fazê-lo muito fácil de usar uma lista como uma pilha, onde o último
elemento adicionado é o primeiro elemento recuperado ("last-in, first-out"). Para adicionar um
item ao topo da pilha, use append (). Para recuperar um item do topo da pilha use pop () sem
um índice explícito. Por exemplo:
Também é possível usar uma lista como uma fila, onde o primeiro elemento adicionado é o
primeiro elemento recuperado ("first-in, first-out"), no entanto, as listas não são eficientes
para essa finalidade. Enquanto acrescenta e aparece a partir do final da lista são rápidos,
fazendo inserções ou aparece desde o início de uma lista é lenta (porque todos os outros
elementos têm de ser desviado por um).
compreensões Lista fornecem uma maneira concisa para criar listas de seqüências. As
aplicações comuns estão a fazer listas, onde cada elemento é o resultado de algumas
operações aplicadas a cada membro da seqüência, ou criar uma subsequência dos elementos
que satisfazem uma certa condição.
A compreensão lista é constituída de suportes que contém uma expressão seguida de uma
cláusula para, em seguida, zero ou mais para se ou cláusulas. O resultado será uma lista
resultante da avaliação da expressão no contexto da e para as cláusulas que se seguem. Se a
expressão para se avaliar uma tupla, ele deve estar entre parênteses.
Aqui vamos dar uma lista de números e retornar uma lista de três vezes cada número:
Aqui nós aplicamos uma chamada de método para cada item em uma seqüência:
Tuplas podem muitas vezes ser criado sem a sua parênteses, mas não aqui:
>>> [Str (round (355 / 113, i)) for i in range (1, 6)]
['3 .1 ', '3 0,14, 0,142 '3', '3 0,1416, 0,14159 '3 ']
Se você tem estômago para isso, compreensões lista podem ser aninhados. Eles são uma
ferramenta poderosa, mas - como todos os instrumentos poderosos - eles precisam ser usados
com cuidado, se em tudo.
Considere o seguinte exemplo de uma matriz 3x3 realizada como uma lista contendo três
listas, uma lista por linha:
>> Esteira> = [
... [1, 2, 3]
... [4, 5, 6]
... [7, 8, 9]
... ]
>>> Print ([[linha [i] para a linha em] mat for i in [0, 1, 2]])
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Para evitar a apreensão quando compreensões lista de nidificação, lido da direita para a
esquerda.
No mundo real, você deve preferir funções embutidas para demonstrações de fluxo de
complexos. O zip () função seria fazer um grande trabalho para este caso de uso:
Veja Desembalar argumento listas para obter detalhes sobre o asterisco nesta linha.
5.2. A declaração ¶ del
Existe uma maneira de remover um item de uma lista dada o seu índice ao invés de seu valor:
o comando del. Isso difere da pop () método que retorna um valor. A declaração del também
pode ser utilizado para remover fatias de uma lista ou limpar a lista inteira (o que fizemos
anteriormente pela atribuição de uma lista vazia para a fatia). Por exemplo:
Referenciando o nome de um futuro é um erro (pelo menos até que outro valor é atribuído a
ele). Nós vamos encontrar outros usos para del mais tarde.
5.3. Tuplas e Sequências ¶
Nós vimos que listas e strings possuem muitas propriedades comuns, tais como indexação e
operações de slicing. Eles são dois exemplos de tipos de dados sequencial (ver seqüência Tipos
- str, bytes, ByteArray, lista, tupla, intervalo). Desde que Python é uma linguagem em
evolução, tipos de dados de seqüência de outros podem ser adicionados. Existe também um
outro padrão de seqüência tipo de dados: a tupla.
Uma tupla consiste em uma série de valores separados por vírgulas, por exemplo:
Como você vê, em tuplas de saída são sempre colocados entre parênteses, a fim de que tuplas
aninhados são interpretados corretamente, elas podem ser de entrada, com ou sem
parênteses, embora muitas vezes parênteses são necessários de qualquer forma (se a tupla é
parte de uma expressão maior).
Tuplas têm muitos usos. Por exemplo: (x, y) pares de coordenadas, registros de funcionários de
um banco de dados, etc Tuples, como strings, são imutáveis: não é possível atribuir valores a
itens individuais de uma tupla (você pode simular o mesmo efeito com corte e concatenação,
embora). Também é possível criar tuplas que contêm objetos mutáveis, como listas.
>>> Vazio = ()
>> Singleton => 'Olá', # <- note trailing comma
>>> Len (vazio)
0
>> Len> (singleton)
1
>>> X, y, z = t
Python também inclui um tipo de dados para conjuntos. Um conjunto é uma coleção não
ordenada, sem elementos duplicados. utilizações básicas incluem a adesão de ensaio e
eliminar entradas duplicadas. Definir os objetos também apoiar as operações matemáticas
como união, intersecção, diferença e diferença simétrica.
Chaves ou o set () função pode ser usada para criar jogos. Nota: Para criar um conjunto vazio
que você tem que usar set (), não (), o último cria um dicionário vazio, uma estrutura de dados
que vamos discutir na próxima seção.
>> Cesto> = (maçã ',' laranja ', a maçã', 'pêra', laranja ',' banana ')
>>> Print (cesta)
(Laranja ', banana', 'pera, maçã')
]>> Fruta => Apple [',' laranja ', a maçã', 'pêra', laranja ',' banana '
>> Fruta => set (cesta) # criar um jogo sem duplicatas
>> Fruto>
(Laranja ', pêra', 'maçã', banana ')
>> Fruto> = (laranja ',' maçã ') # sintaxe () é equivalente a [] para listas
>> Fruto>
(Laranja ', a maçã')
laranja>>> 'no sector das frutas # teste rápido adesão
Verdadeiro
crabgrass>>> 'no sector das frutas
Falso
5.5. Dicionários ¶
Outro tipo de dados útil construída em Python é o dicionário (veja Mapeamento de Tipos -
dict). Os dicionários são encontrados às vezes em outras línguas como "memórias associativas"
ou "arrays associativos". Ao contrário de seqüências, que são indexados por uma série de
números, dicionários são indexados por chaves, que pode ser de qualquer tipo imutável;
strings e números sempre podem ser as chaves. Tuplas podem ser usadas como chaves se
contiverem apenas strings, números ou tuplas, se uma tupla contém um objeto mutável,
directa ou indirectamente, não pode ser usado como uma chave. Você não pode usar as listas
como chaves, uma vez que as listas podem ser modificadas no local usando as atribuições do
índice, as atribuições fatia, ou métodos como append () e estender ().
É melhor pensar em um dicionário como um conjunto desordenado de-chave: valor pares, com
a exigência de que as chaves são únicas (dentro de um dicionário). Um par de chaves cria um
dicionário vazia: (). Colocar uma lista separada por vírgulas de chaves: pares de valor dentro
das chaves acrescenta chave inicial: valor pares para o dicionário, este é também o caminho
dicionários são escritos na saída.
As principais operações em um dicionário são armazenar um valor com alguns dos principais e
extrair o valor dado a chave. Também é possível apagar uma chave: valor par com del. Se você
armazenar usando uma chave que já está em uso, o antigo valor associado com essa chave é
esquecido. É um erro para extrair um valor usando uma chave inexistente.
lista Performing (d.keys ()) em um dicionário retorna uma lista de todas as teclas usadas no
dicionário, em ordem arbitrária (se você quiser classificados, basta usar classificado (d.keys ())
em vez). [1] Para verificar se uma única chave está no dicionário, use a palavra-chave no.
Além disso, compreensões dict pode ser usado para criar dicionários de chave arbitrária e
expressões de valor:
Quando as chaves são strings simples, às vezes é mais fácil especificar os pares usando
argumentos-chave:
Quando o loop através de uma seqüência, o índice de posição eo valor correspondente pode
ser recuperada, ao mesmo tempo usando a função () enumerar.
Para loop por duas ou mais seqüências ao mesmo tempo, as entradas podem ser emparelhado
com o zip () função.
Para loop em uma seqüência no sentido inverso, em primeiro lugar especificar a seqüência
para a frente e depois chamar a função () invertidas.
Para loop em uma seqüência na ordem de classificação, use o classificado () função que
retorna uma nova lista de classificados, deixando inalterada a fonte.
]>> Cesto> = maçã [',' laranja ', a maçã', 'pêra', laranja ',' banana '
>>> For f in classificado (conjunto (cesta)):
... print (f)
...
Comparações podem ser encadeadas. Por exemplo, a <b == c testa se uma é menor que b e b
resto é igual a c.
Sequência de objetos podem ser comparados a outros objetos com o tipo de seqüência. A
(1, 2, 3) <(1, 2, 4)
[1, 2, 3] <[1, 2, 4]
'ABC' <C '<' 'Pascal' Python '<'
(1, 2, 3, 4) <(1, 2, 4)
(1, 2) <(1, 2, -1)
(1, 2, 3) == (1.0, 2.0, 3.0)
(1, 2, ('aa', 'ab')) <(1, 2, ('ABC', 'a'), 4)
Note que os objetos comparação de diferentes tipos com <e> é legal, desde que os objetos
têm métodos de comparação apropriada. Por exemplo, os tipos numéricos mistos são
comparados de acordo com seu valor numérico, de modo 0 é igual a 0,0, etc Caso contrário, ao
invés de fornecer uma ordenação arbitrária, o intérprete irá levantar uma exceção TypeError.
Notas de Rodapé
[1] d.keys Calling () irá retornar um objeto de exibição dicionário. Ele suporta operações como
teste de adesão e de iteração, mas seu conteúdo não é independente do dicionário original - é
apenas uma exibição.
7. Entrada e Saída ¶
Até agora nós encontramos duas maneiras de gravar valores: declarações expressão ea função
print (). (A terceira maneira é utilizar o método write () de objetos de arquivo, o arquivo de
saída padrão pode ser referenciado como sys.stdout. Consulte a Biblioteca de Referência para
obter mais informações sobre este assunto.)
Muitas vezes você quer mais controle sobre a formatação de sua saída do que simplesmente
imprimindo valores separados por espaços. Existem duas maneiras de formatar a sua saída, a
primeira maneira é fazer tudo a seqüência de tratar-se, usando cordas de corte e
concatenação você pode criar qualquer layout que você pode imaginar. A seqüência padrão
módulo contém algumas operações úteis para cordas estofo para uma largura determinada
O módulo string contém uma classe de modelo que oferece ainda uma outra maneira para
substituir valores em strings.
Uma questão permanece, naturalmente: como você converter valores para strings? Por sorte,
Python possui maneiras de converter qualquer valor em uma string: passá-lo para o repr () ou
str () funções.
A função STR () destina-se a devolver as representações de valores que são bastante legível,
enquanto repr () é utilizado para gerar representações que podem ser lidos pelo interpretador
(ou será uma força SyntaxError se não é a sintaxe equivalente). Para objetos que não têm uma
representação específica para o consumo humano, str () irá retornar o mesmo valor que repr
(). Muitos valores, tais como números ou estruturas como listas e dicionários, têm a mesma
representação usando a função. Strings e números de ponto flutuante, em particular, tem
duas representações distintas.
Alguns exemplos:
(Note que no primeiro exemplo, um espaço entre cada coluna foi acrescentada pelo modo de
impressão () funciona: ele sempre adiciona espaço entre seus argumentos.)
Este exemplo demonstra o rjust () de objetos String, que direito justifica uma string em um
campo de largura dada por preenchimento com espaços à esquerda. Há ljust métodos
semelhantes () e (centro). Esses métodos não escrever nada, basta retornar uma nova
seqüência. Se a seqüência de entrada é muito longo, não truncar, mas devolvê-lo inalterado, o
que vai bagunçar a sua coluna lay-out, mas isso é geralmente melhor do que a alternativa, que
seria mentir sobre um valor. (Se você realmente quiser truncamento você sempre pode
adicionar uma operação de corte, como x.ljust em (n) []: n).
Há um outro método, zfill (), que pastilhas de uma seqüência numérica na esquerda com zeros.
Ela compreende cerca de mais e menos sinais:
>>> Print ("Nós somos o que dizer) (formato "{}!"'. ('cavaleiros', 'Ni'))
Nós somos os cavaleiros que dizem "Ni!"
Os suportes e os personagens dentro deles (campos formato chamado) são substituídos por
objetos que são passados para o método format (). Um número entre parênteses pode ser
usada para se referir à posição do objeto passado para o método format ().
Se os argumentos de palavras-chave são usadas no método format (), seus valores são
referidos usando o nome do argumento.
>>> Print ("A história de (0), (1), e (outra).. Formato (" Bill "," Manfred ",
outros = "Georg '))
A história de Bill, Manfred e Georg.
! Um "(aplicar ascii ()), '!' S (aplicar str ()) e '! R" (aplicar repr ()) pode ser usado para converter
o valor antes de ser formatado:
Um opcional ': especificador e formato pode acompanhar o nome do campo. Isto permite um
maior controle sobre como o valor é formatado. O exemplo a seguir trunca Pi três casas depois
da vírgula.
Passa um número inteiro após a ':' fará com que esse campo deve ser um número mínimo de
caracteres de largura. Isso é útil para fazer tabelas bonita.
>> Tabela> = ('Sjoerd': 4127, 'Jack': 4098 ", BCAD ': 7678)
>>> Para o nome, telefone table.items ():
... print ('(00:10) ==> d (01:10). formato (nome, telefone))
...
Jack ==> 4098
BCAD ==> 7678
Sjoerd ==> 4127
Se você tem uma seqüência de formato realmente muito tempo que você não quer dividir,
seria bom se você pode as variáveis de referência a ser formatado pelo nome em vez de
posição. Isso pode ser feito simplesmente passando o dicionário e usar [] 'entre colchetes' para
ter acesso as chaves
>> Tabela> = ('Sjoerd': 4127, 'Jack': 4098 ", BCAD ': 8637678)
>>> Print ('Jack: (0 [Jack]: d); Sjoerd: (0 [Sjoerd]: d);
"BCAD: (0 [BCAD]: d) 'formato. (Tabela))
Jack: 4098; Sjoerd: 4127; BCAD: 8637678
Isso também pode ser feito passando a tabela como argumentos palavras-chave com o "**"
notação.
>> Tabela> = ('Sjoerd': 4127, 'Jack': 4098 ", BCAD ': 8637678)
>>> Print ('Jack: (Jack: d); Sjoerd: (Sjoerd: d); BCAD: (BCAD: d)' formato. (** Tabela))
Jack: 4098; Sjoerd: 4127; BCAD: 8637678
Isso é particularmente útil em combinação com o novo built-in vars () função, que retorna um
dicionário contendo todas as variáveis locais.
Para uma visão completa da seqüência de formatação com str.format (), consulte Formatar
String Syntax.
7.1.1. Old seqüência de formatação ¶
O operador% também pode ser usado para formatação de string. Ele interpreta o argumento
deixou bem como um sprintf () estilo seqüência de formato a ser aplicado ao argumento de
direito, e retorna a string resultante desta operação de formatação. Por exemplo:
Desde str.format () é muito novo, um monte de código Python ainda usa o operador%. Porém,
como este velho estilo de formatação acabará por ser retirada da linguagem, str.format ()
geralmente deve ser usado.
Mais informações podem ser encontradas na formatação Cadeia Velha seção de Operações.
7,2. Ler e gravar arquivos ¶
open () retorna um objeto de arquivo, e é mais comumente usado com dois argumentos:
nome do arquivo (abrir, mode).
Normalmente, os arquivos são abertos em modo texto, isto é, ler e escrever strings do e para o
arquivo, que são codificados em uma codificação específica (sendo o padrão UTF-8). 'B'
anexado ao modo de abrir o arquivo em modo binário: agora, os dados são lidos e escritos na
forma de objetos de bytes. Este modo deve ser usado para todos os arquivos que não contêm
texto.
O restante dos exemplos nesta seção irá assumir que um arquivo chamado f objeto já foi
criado.
Para ler o conteúdo de um arquivo, chamado f.read (tamanho), que tem uma certa quantidade
de dados e retorna como uma seqüência de bytes ou objeto. tamanho é um argumento
numérico opcional. Quando o tamanho for omitido ou negativo, todo o conteúdo do arquivo
será lido e retornado, que é o seu problema se o arquivo é o dobro de memória da sua
máquina. Caso contrário, a maioria dos bytes de tamanho são lidos e devolvidos. Se o final do
arquivo foi atingido, f.read () irá retornar uma string vazia ('').
>> F.read> ()
f.readline () lê uma única linha do arquivo, um caractere de nova linha (\ n) é deixado no final
da cadeia, e só é omitida na última linha do arquivo se o arquivo não termine em uma nova
linha . Isso faz com que o valor de retorno inequívoca, se f.readline () retorna uma string vazia,
o fim do arquivo foi atingido, enquanto uma linha em branco é representado por '\ n', uma
string contendo apenas uma única newline.
>> F.readline> ()
"Esta é a primeira linha do arquivo. \ N '
>> F.readline> ()
"Segunda linha do arquivo \ n"
>> F.readline> ()
''
f.readlines () retorna uma lista contendo todas as linhas de dados no arquivo. Se lhe for dada
uma sizehint parâmetro opcional, lê-se que muitos bytes do arquivo e mais o suficiente para
completar uma linha e retorna as linhas a partir daí. Isto é frequentemente usado para
permitir a leitura eficiente de um arquivo grande de linhas, mas sem ter que carregar o arquivo
inteiro na memória. Apenas linhas completas serão devolvidos.
>> F.readlines> ()
Esse ['é a primeira linha do arquivo. \ N "," Segunda linha do arquivo \ n']
A alternativa é simples, mas não prevê como controle de grão fino. Uma vez que as duas
abordagens gerir linha buffering diferente, eles não devem ser misturados.
Para escrever algo diferente de uma string, ele precisa ser convertido para uma string em
f.tell () retorna um inteiro que a posição atual do arquivo objeto no arquivo, medida em bytes
desde o início do arquivo. Para alterar a posição do objeto arquivo, f.seek uso (offset,
from_what). A posição é calculado a partir adicionar offset a um ponto de referência, o ponto
de referência é selecionado pelo argumento from_what. Um valor de 0 from_what medidas
desde o início do arquivo, um usa a posição do arquivo corrente, e 2 usa o final do arquivo
como ponto de referência. from_what pode ser omitido e padrões a 0, com o início do arquivo
como ponto de referência.
Em arquivos de texto (que foram abertos sem ab na seqüência mode), apenas procura em
relação ao início do arquivo são permitidos (com a exceção de busca para o arquivo final com
muito procurar (0, 2)).
Quando você é feito com um arquivo, f.close call () para fechá-lo e liberar os recursos do
sistema ocupado pelo arquivo aberto. Depois de chamar f.close (), tenta usar o objeto de
arquivo automaticamente falhar.
>>> F.close ()
>> F.read> ()
Traceback (chamada mais recente passada):
Arquivo "<stdin>", line 1, in?
ErroNumeroRuim: operação de E / S em arquivo fechado
É uma boa prática de usar a palavra-chave com ao lidar com objetos de arquivo. Isto tem a
vantagem de que o arquivo é fechado corretamente após a conclusão da sua suite, mesmo se
uma exceção é levantada no caminho. Também é muito menor do que a escrita equivalente
try-finally blocos:
objetos de arquivo tem alguns métodos adicionais, tais como isatty () e truncate () que são
utilizados com menos frequência, consulte a Referência da Biblioteca de um guia completo
para o arquivo de objetos.
7.2.2. O pickle Módulo ¶
Strings podem ser facilmente escritas e lidas de um arquivo. Números demorar um pouco mais
de esforço, já que o método read () retorna apenas strings, que terão de ser passados para
uma função como int (), que recebe uma string como '123 'e retorna seu valor numérico 123.
No entanto, quando você deseja salvar os tipos de dados mais complexos, como listas,
dicionários, ou instâncias de classe, as coisas ficam muito mais complicadas.
Se você tem um objeto x, e um objeto arquivo f que foi aberto para escrita, a maneira mais
simples de picles do objeto em apenas uma linha de código:
pickle.dump (x, f)
Para unpickle o objeto novamente, se f é um objeto de arquivo que foi aberto para leitura:
pickle.load x = (f)
(Há outras variantes deste, quando utilizado de decapagem muitos objetos ou quando você
não quiser gravar os dados em conserva em um arquivo, consulte a documentação completa
para a salmoura na Biblioteca de Referência Python).
pickle é a forma padrão de tornar objetos Python que podem ser armazenados e reutilizados
por outros programas ou por uma invocação futura do mesmo programa, o termo técnico para
isso é um objeto persistente. Porque pickle é tão amplamente utilizado, vários autores que
escrevem extensões Python tomar cuidado para garantir que novos tipos de dados, tais como
as matrizes podem ser adequadamente conservado e unpickled.
Até agora, as mensagens de erro não ter sido mais do que o indicado, mas se você já tentou os
exemplos que você provavelmente já viu algum. Existem (pelo menos) dois tipos distintos de
erros: erros de sintaxe e exceções.
8.1. Erros de sintaxe ¶
erros de sintaxe, também conhecida como análise de erros, são talvez o tipo mais comum de
queixa que você começa quando você ainda está aprendendo Python:
O parser repete a linha de falta e exibe uma pequena seta "apontando para o primeiro ponto
na linha onde o erro foi detectado. O erro é causado por (ou pelo menos detectado em) o
token anterior a seta: no exemplo, o erro é detectado na função print (), uma vez que (':')
cólon está faltando antes. Nome do arquivo eo número da linha são impressos para que você
saiba onde procurar em caso de entrada veio de um script.
8.2. Exceções ¶
Mesmo que uma declaração ou expressão está sintaticamente correta, pode causar um erro
quando uma tentativa é feita para executá-lo. Os erros detectados durante a execução são
chamados exceções e não são incondicionalmente fatais: em breve você vai aprender como
lidar com eles em programas Python. A maioria das exceções não são tratadas por programas,
no entanto, resultar em mensagens de erro como mostrado aqui:
>>> 10 * (1 / 0)
Traceback (chamada mais recente passada):
Arquivo "<stdin>", line 1, in?
ZeroDivisionError: int divisão por zero ou modulo
>>> 4 * 3 + spam
Traceback (chamada mais recente passada):
Arquivo "<stdin>", line 1, in?
NameError spam: 'nome' não está definido
>>> 2 "+ 2
Traceback (chamada mais recente passada):
Arquivo "<stdin>", line 1, in?
TypeError: Não é possível converter 'int' objeto str implicitamente
A última linha da mensagem de erro indica o que aconteceu. As exceções vêm em diferentes
tipos, eo tipo é impresso como parte da mensagem: os tipos no exemplo são
ZeroDivisionError, NameError e TypeError. A seqüência de caracteres impressos como o tipo
O resto da linha de base fornece detalhes sobre o tipo de exceção e que o causou.
A parte anterior da mensagem de erro apresenta o contexto onde a exceção aconteceu, sob a
forma de uma stack. Em geral, contém uma stack anúncio linhas de código, no entanto, não vai
exibir as linhas de leitura da entrada padrão.
É possível escrever programas que tratam exceções selecionado. Veja o exemplo a seguir, que
pede ao usuário para a entrada até que um inteiro válido tenha sido inscrito, mas permite que
o usuário interrompa o programa (usando Control-C ou qualquer que seja o sistema
operacional suporte); nota que uma interrupção gerada pelo usuário é sinalizado aumentando
a exceção KeyboardInterrupt.
* Em primeiro lugar, a cláusula de tentar (a declaração (s) entre a tentar exceto palavras-
chave) é executado.
* Se nenhuma exceção ocorrer, a cláusula de exceção é ignorado e execução da instrução é
tentar terminar.
* Se ocorrer uma exceção durante a execução da cláusula try, o restante da cláusula é
ignorado. Então, se seu tipo de jogos a exceção nomeado após a palavra, exceto, a cláusula de
exceção é executado, e, em seguida, a execução continua após o try.
* Se ocorrer uma exceção que não coincide com a exceção nomeado na cláusula, exceto, é
passada para tentar exterior declarações, se nenhum manipulador for encontrado, ele é uma
exceção não tratada ea execução pára com uma mensagem como mostrado acima.
A instrução try pode ter mais de uma cláusula de exceção, para especificar manipuladores para
exceções diferentes. No máximo um manipulador será executado. Manipuladores de apenas
lidar com exceções que ocorrem na cláusula tentar correspondente, e não em outros
manipuladores de tentar mesmo comunicado. Uma cláusula except pode nomear várias
A última cláusula except pode omitir o nome da exceção (s), para servir como um curinga. Use
isto com extrema cautela, pois é fácil para mascarar um verdadeiro erro de programação desse
jeito! Também pode ser usado para imprimir uma mensagem de erro e, em seguida, re-raise a
exceção (que permite que um chamador para tratar a exceção como bem):
import sys
tente:
f = open (myfile.txt ')
s = f.readline ()
int i = (s.strip ())
exceto IOError como errar:
print ("erro de I / O: (0)". format (err))
exceto ErroNumeroRuim:
print ("Não foi possível converter dados para um número inteiro.")
exceto:
print ("Erro inesperado", sys.exc_info () [0])
levantar
A tentativa ... exceto declaração tem uma cláusula else opcional, que, quando presentes,
devem seguir todas as cláusulas de excepção. É útil para o código que deve ser executado se a
cláusula de tentar não levantar uma exceção. Por exemplo:
A utilização da cláusula else é melhor do que adicionar código adicional para a cláusula try,
pois evita a captura acidentalmente uma exceção que não foi suscitada pelo código que está
sendo protegida pela tentativa ... exceto declaração.
Quando uma exceção ocorre, ela pode ter um valor associado, também conhecido como
argumento da exceção. A presença eo tipo do argumento depende do tipo de exceção.
A cláusula except pode especificar uma variável depois do nome da exceção. A variável é
>>> Tente:
... aumentar a Exception ('spam', 'ovos')
... salvo exceções como inst:
... print (tipo (inst)) # a instância de exceção
... print (inst.args) # argumentos armazenados em arquivos. args
... inst print () # __str__ permite args a ser impresso diretamente,
... # Mas pode ser substituído em subclasses de exceção
... x, y = inst.args descompactar args #
... print ('x =', x)
... print ('y =', y)
...
'Exception'> <class
(Spam ',' ovos ')
(Spam ',' ovos ')
x = spam
y = ovos
Se uma exceção tem argumentos, eles são impressos como a última parte («pormenor») da
mensagem para exceções não tratadas.
manipuladores de exceção não apenas lidar com exceções, se ocorrer de imediato na cláusula
try, mas também quando eles ocorrem dentro de funções que são chamados (mesmo que
indiretamente) da cláusula try. Por exemplo:
O comando raise permite que o programador forçar uma exceção especificada ocorrer. Por
exemplo:
O único argumento para aumentar indica a exceção a ser levantada. Este deve ser um
exemplo, uma exceção ou uma classe de exceção (uma classe que deriva de Exception).
Se você precisa determinar se uma exceção foi levantada, mas não pretendem lidar com isso,
uma forma mais simples de elevar a declaração permite que você re-raise a exceção:
>>> Tente:
... levantar NameError ('HiThere)
... exceto NameError:
... print ('Uma excepção voaram!')
... levantar
...
Uma excepção voaram!
Traceback (chamada mais recente passada):
Arquivo "<stdin>", line 2, in?
NameError: HiThere
Os programas podem nomear seus próprios exceções, criando uma nova classe de exceção
(ver classes para classes mais sobre Python). Exceções devem ser tipicamente derivada da
classe Exception, direta ou indiretamente. Por exemplo:
classes de exceção pode ser definido o que fazer alguma coisa nenhuma outra classe pode
fazer, mas geralmente são mantidos simples, muitas vezes, apenas oferecendo uma série de
atributos que permitem que a informação sobre o erro para ser extraído por manipuladores de
exceção. Ao criar um módulo que pode levantar vários erros distintos, uma prática comum é
criar uma classe base para exceções definidas por aquele módulo, e subclasse que criar classes
de exceção específica para as condições de erro diferentes:
Atributos:
expressão - expressão de entrada em que ocorreu o erro
mensagem - explicação do erro
"" "
Atributos:
estado anterior - no início da transição
próximo estado - tentaram de novo
explicação mensagem - por que a transição específica não é permitida
"" "
A maioria das exceções são definidas com nomes que terminam em "erro", semelhante à
nomeação de exceções padrão.
Muitos módulos padrão definir suas próprias exceções para relatar erros que possam ocorrer
A instrução try possui outra cláusula opcional que se destina a definir as acções de limpeza que
deve ser executado em todas as circunstâncias. Por exemplo:
>>> Tente:
... levantar KeyboardInterrupt
... finalmente:
... print ('Adeus, mundo!')
...
Adeus, mundo!
KeyboardInterrupt
A cláusula finally é sempre executado antes de deixar a instrução try, se uma exceção ocorreu
ou não. Quando uma exceção ocorreu na tentativa cláusula e não tem sido tratado por uma
cláusula de exceção (ou que tenha ocorrido em uma cláusula de excepção ou outra), é re-raise
após a cláusula finally foi executado. A cláusula finally também é executado "na maneira para
fora", quando qualquer outra cláusula do try é deixada por uma pausa, continuar ou voltar
comunicado. Um exemplo mais complicado:
Em aplicações do mundo real, a cláusula finally é útil para a liberação de recursos externos
(como arquivos ou conexões de rede), independentemente da utilização do recurso foi bem
sucedida.
8.7. Predefinidos Clean-up Ações ¶
Alguns objetos definir padrão de limpeza ações a serem realizadas quando o objeto não é mais
necessária, independentemente de haver ou não a operação utilizando o objeto sucedido ou
não. Veja o exemplo a seguir, que tenta abrir um arquivo e impressão do seu conteúdo para a
tela.
O problema com este código é que ele deixa o arquivo aberto por um período de tempo
indeterminado após esta parte do código é executado. Esta não é uma questão em scripts
simples, mas pode ser um problema para as aplicações maiores. A declaração permite com
objetos como arquivos para ser usado de uma forma que garante que eles estão sempre
limpos rapidamente e corretamente.
Após a instrução é executada, o arquivo f está sempre fechada, mesmo que um problema foi
encontrado ao processar as linhas. Objetos que, como arquivos, fornecer pré-limpeza ações
indicam isso em sua documentação.
9. Classes ¶
mecanismo classe Python's adiciona classes para o idioma com um mínimo de nova sintaxe e
semântica. É uma mistura de mecanismos equivalentes encontrados em C + + e Modula-3.
Como é verdadeiro para os módulos, classes em Python não colocar uma barreira absoluta
entre definição e usuário, mas sim contar com a gentileza do usuário para não "quebrar a
definição." As características mais importantes das classes são mantidos com plenos poderes,
porém: o mecanismo de herança de classe permite múltiplas classes base, uma classe derivada
pode substituir os métodos de sua classe ou classes base, e um método pode chamar o
método de uma classe base com o mesmo nome. Os objetos podem conter uma quantidade
arbitrária de dados.
(Sem universalmente aceite terminologia para falar sobre as aulas, vou fazer uso ocasional de
Smalltalk e os termos C + +. Gostaria de usar Modula-3 termos, uma vez que sua semântica
orientada a objetos estão mais próximos aos do Python do C + +, mas eu espero que alguns
leitores ter ouvido falar dele.)
9.1. Uma palavra sobre nomes e objetos ¶
Objetos tem individualidade e vários nomes (em vários âmbitos) pode ser vinculado ao mesmo
objeto. Isto é conhecido como aliasing em outras línguas. Isso geralmente não é apreciado em
um primeiro olhar sobre Python, e pode ser ignorada quando se trata de tipos básicos
imutáveis (números, strings, tuplas). Entretanto, aliasing tem um efeito possivelmente
surpreendente sobre a semântica do código Python envolvendo objetos mutáveis como listas,
dicionários, ea maioria dos outros tipos. Isso geralmente é usado para o benefício do
programa, uma vez que se comportam como aliases ponteiros em alguns aspectos. Por
exemplo, passando um objeto é mais barato uma vez que apenas um ponteiro é passado pela
aplicação, e se a função modifica um objeto passado como argumento, o chamador vai ver a
mudança - isso elimina a necessidade de dois argumentos diferentes mecanismos de passagem
como em Pascal .
9.2. Scopes e Python Namespaces ¶
Antes de introduzir classes, primeiro eu tenho que lhe dizer algo sobre as regras do Python
alcance. As definições de classe jogar alguns truques com namespaces, e você precisa saber
como âmbitos e espaços para o trabalho para entender completamente o que está
acontecendo. Aliás, o conhecimento sobre este assunto é útil para qualquer programador
avançado em Python.
By the way, eu uso a palavra atributo para qualquer nome que se segue um ponto - por
exemplo, no z.real expressão real, é um atributo do objeto z. Estritamente falando, referências
para nomes em módulos são referências a atributos: na expressão modname.funcname,
modname é um objeto módulo e funcname é um atributo do mesmo. Neste caso, não
acontece de ser um simples mapeamento entre os atributos do módulo e os nomes globais
definidos no módulo: eles compartilham o mesmo espaço para nome! [1]
Atributos podem ser somente leitura ou escrita. Neste último caso, a atribuição de atributos é
possível. Módulo atributos são graváveis: você pode escrever modname.the_answer = 42.
gravável atributos também podem ser excluídos com o comando del. Por exemplo, del
modname.the_answer irá remover o the_answer atributo do objeto nomeado por modname.
Namespaces são criados em momentos diferentes e têm vidas diferentes. O namespace que
contém os nomes de built-in é criado quando o interpretador Python é iniciado, e nunca é
excluída. O espaço para nome global para um módulo é criado quando a definição de módulo
for lido, normalmente, namespaces módulo também durar até o interpretador sai. Os
comandos executados pela invocação de nível superior do intérprete, quer ler de um arquivo
script ou interativamente, são considerados parte de um módulo chamado __main__, então
eles têm o seu próprio namespace global. (O sistema de nomes realmente vivem também em
um módulo, o que é chamado builtins).
O espaço local para uma função é criada quando a função é chamada, e apagado quando a
função retorna ou levanta uma exceção que não é tratado dentro da função. (Na verdade, o
esquecimento seria a melhor maneira de descrever o que realmente acontece). Naturalmente,
chamadas recursivas cada um tem seu próprio namespace local.
* O âmbito mais íntimo, que é procurado em primeiro lugar, contém os nomes de locais
* Os escopos das funções de inclusão, que procurou iniciar com o âmbito mais próximo,
juntando, contém não-local, mas também nomes de não-global
* O alcance próximo para a última contém nomes globais do módulo atual
* O alcance ultraperiféricas (procurou passado) é o namespace que contém embutido em
nomes
Normalmente, o escopo local referencia os nomes locais da função (textualmente) atual. Fora
as funções, as referências de âmbito local, o mesmo namespace como o escopo global:
namespace do módulo. As definições de classe ainda espaço para um outro local no âmbito
local.
É importante perceber que escopos são determinados textualmente: o alcance global de uma
função definida em um módulo que é namespace módulo, não importa de onde ou por que
alias a função é chamada. Por outro lado, a busca para os nomes reais é feito dinamicamente,
em tempo de execução - no entanto, a definição da linguagem está evoluindo para a resolução
de nomes estáticos, em "compilar" o tempo, portanto, não dependem de resolução de nome
dinâmico! (Na verdade, as variáveis locais já estão determinadas estaticamente).
A declaração global pode ser usado para indicar que as variáveis especial ao vivo no âmbito
global e deve ser rebote lá, a declaração indica que as variáveis não-locais particular viver em
um escopo delimitador e deve ser rebote lá.
9.2.1. Scopes e Namespaces ¶ Exemplo
Este é um exemplo que demonstra como fazer referência a diferentes âmbitos e espaços para
nome, e como global e não local afetar obrigatório variável:
scope_test ()
print ("Em âmbito global: spam"),
Note como a atribuição de local (que é o padrão) não se alterou scope_test de ligação de
spam. A atribuição nonlocal mudou scope_test de ligação de spam, ea atribuição global mudou
o nível de módulo de ligação.
Você também pode ver que não havia nenhuma ligação anterior de spam antes da atribuição
global.
9.3. Um primeiro olhar em Classes ¶
Classes introduzir um pouco da nova sintaxe, três novos tipos de objetos e uma semântica
nova.
9.3.1. Definição de classe ¶ Syntax
ClassName classe:
<statement-1>
.
.
.
<statement-N>
As definições de classe, como definições de função (declarações def) devem ser executados
antes que tenham qualquer efeito. (Você pode conseguir colocar uma definição de classe em
um galho de uma instrução if ou dentro de uma função.)
Quando uma definição de classe é deixada normalmente (via o fim), um objeto da classe é
criada. Este é basicamente um invólucro em torno do conteúdo do espaço criado pela
definição da classe, nós vamos aprender mais sobre os objetos da classe na próxima seção. O
escopo original local (o que na prática, pouco antes da definição da classe foi inscrito) é
reintegrado, eo objeto classe é ligado aqui para o nome da classe indicado no cabeçalho de
definição de classe (ClassName no exemplo).
9.3.2. Objetos da classe ¶
referências atributo usar a sintaxe padrão utilizada para todas as referências a atributos em
Python: obj.name. nomes de atributos válidos são todos os nomes que estavam no namespace
da classe quando o objeto classe foi criada. Assim, se a definição da classe era assim:
Classe MyClass:
"" "Um exemplo simples de classe" ""
i = 12345
def m (self):
return 'Olá Mundo'
instanciação da classe usa a notação de função. Basta fingir que o objeto de classe é uma
função sem parâmetros, que retorna uma nova instância da classe. Por exemplo (assumindo
que a classe acima):
x = MyClass ()
cria uma nova instância da classe e atribui a esse objeto para a variável local x.
A operação de instanciação ("calling" um objeto de classe) cria um objeto vazio. Muitas classes
preferem criar objetos personalizados com as instâncias de um determinado estado inicial.
Portanto, uma classe pode definir um método especial chamado __init__ (), como este:
x = MyClass ()
Naturalmente, o __init__ () método pode ter argumentos para uma maior flexibilidade. Nesse
caso, os argumentos para a instanciação de classe são passadas para __init__ (). Por exemplo,
Agora o que podemos fazer com objetos exemplo? As operações só compreendida por
exemplo, os objetos são referências a atributos. Existem dois tipos de nomes de atributos
válidos, atributos de dados e métodos.
x.counter = 1
enquanto x.counter <10:
x.counter x.counter = 2 *
x.counter print ()
del x.counter
nomes de método válido de um objeto instância dependem de sua classe. Por definição, todos
os atributos de uma classe que são objetos de função correspondente definir métodos de suas
x.f ()
No exemplo MinhaClasse, irá retornar a string 'Olá Mundo'. No entanto, não é necessário
chamar um método imediatamente: XF é um objeto do método, e pode ser guardado e
chamado em um momento posterior. Por exemplo:
xf = x.f
enquanto True:
print (xf ())
O que exatamente acontece quando um método é chamado? Você pode ter notado que xf ()
foi chamado sem um argumento acima, embora a definição da função de f () Foi especificado
um argumento. O que aconteceu com o argumento? Certamente Python levanta uma exceção
quando uma função que requer um argumento é chamado sem nenhuma - nem mesmo se o
argumento é usado realmente ...
Na verdade, você pode ter adivinhado a resposta: o que há de especial sobre os métodos é
que o objeto é passado como primeiro argumento da função. No nosso exemplo, a chamada xf
() é exatamente equivalente a MyClass.f (x). Em geral, chamar um método com uma lista de n
argumentos é equivalente a chamar a função correspondente com uma lista de argumentos
que é criado através da inserção de objeto do método antes do primeiro argumento.
Se você ainda não entendo como os métodos de trabalho, um olhar sobre a implementação
talvez possa esclarecer a questão. Quando um atributo de instância é referenciado que os
dados não é um atributo, sua classe é procurada. Se o nome indica um atributo de classe
válido que seja um objeto função, um objeto método é criado por embalagem (ponteiros para)
o objeto de instância e apenas a função de objeto encontradas juntas em um objeto abstrato:
é o objeto do método. Quando o objeto método é chamado com uma lista de argumentos,
uma lista de argumento novo é construído a partir do objeto de instância e a lista de
argumentos, eo objeto função é chamada com a lista argumento novo.
9.4. Observações Random ¶
Dados atributos substituir atributos do método com o mesmo nome, para evitar conflitos de
nomes acidentais, que possam causar difícil de encontrar falhas em programas grandes, é
aconselhável usar algum tipo de convenção que minimize a possibilidade de conflitos.
convenções possíveis incluem nomes de capitalização método, prefixando dados de nomes de
Atributos de dados podem ser referenciados por métodos, bem como por usuários comuns
("clientes") de um objeto. Em outras palavras, as classes não servem para implementar tipos
puramente abstratos de dados. De fato, nada em Python torna possível executar ocultar dados
- é tudo baseado em convenção. (Por outro lado, a implementação Python, escrita em C, pode
esconder completamente detalhes de implementação e controle de acesso a um objeto, se
necessário, o que pode ser utilizado por extensões a Python escritas em C.)
Clientes devem utilizar atributos de dados com cuidado - os clientes podem bagunçar
invariantes mantidos pelos métodos utilizados para carimbar sobre os atributos dos seus
dados. Observe que os clientes podem adicionar dados atributos próprios de uma instância de
objeto sem afetar a validade dos métodos, desde que sejam evitados conflitos de nome - de
novo, uma convenção de nomeação pode poupar muitas dores de cabeça aqui.
Não existe atalho para referenciar atributos de dados (ou outros métodos!) A partir de
métodos. Acho que isso realmente aumenta a legibilidade dos métodos: não há chance de
confundir as variáveis locais e variáveis de instância quando olhando através de um método.
Muitas vezes, o primeiro argumento de um método é chamado self. Isto nada mais é do que
uma convenção: a auto-nome não tem absolutamente nenhum significado especial em
Python. Note, no entanto, que por não seguir a convenção de seu código pode ser menos
legível para outros programadores de Python, e também é concebível que um programa
navegador de classe pode ser escrito que depende de uma convenção desse tipo.
Qualquer objeto função que é um atributo de classe define um método para instâncias da
classe. Não é necessário que a definição da função é textualmente incluído na definição de
classe: a atribuição de um objeto função a uma variável local da classe também está ok. Por
exemplo:
Classe C:
f = f1
g def (self):
return 'Olá Mundo'
h=g
Saco de classe:
def __init__ (self):
self.data = []
def add (self, x):
self.data.append (x)
def addtwice (self, x):
self.add (x)
self.add (x)
Métodos podem referenciar nomes globais da mesma forma que funções ordinárias. O escopo
global associado a um método é o módulo que contém a definição de classe. (A classe em si
nunca é usado como um âmbito global.) Apesar de raramente se encontra um bom motivo
para utilizar dados globais em um método, existem muitos usos legítimos do escopo global:
por um lado, as funções e módulos importados no escopo global podem ser usados por
métodos, bem como funções e classes definidas no mesmo. Normalmente, a classe que
contém o método é definido em si mesmo neste âmbito global, e na próxima seção, vamos
encontrar algumas boas razões para que um método que deseja referenciar sua própria classe.
Cada valor é um objeto e, portanto, tem uma classe (também chamado de seu tipo). É
armazenado como object.__class__.
9.5. Herança ¶
Naturalmente, um recurso de linguagem não seria digna desse nome "classe" sem o apoio de
herança. A sintaxe para uma definição de classe derivada se parece com isto:
Execução de uma definição de classe derivada procede da mesma para uma classe base.
Quando o objeto da classe é construído, a classe base é lembrada. Isto é usado para resolver
referências de atributo: se um atributo requisitado não for encontrado na classe, o produto de
busca para procurar na classe base. Essa regra é aplicada recursivamente se a classe base é
As classes derivadas podem substituir os métodos de suas classes base. Porque os métodos
não têm privilégios especiais quando invocam outros métodos do mesmo objeto, um método
de uma classe base que chama um outro método definido na classe base mesmo pode acabar
chamando um método de uma classe derivada que substitui-lo. (Para os programadores C + +:
todos os métodos em Python são efetivamente virtual).
Um método de substituição de uma classe derivada pode, de facto, querem estender ao invés
de simplesmente substituir o método de classe base do mesmo nome. Há uma maneira
simples para chamar o método da classe base diretamente: basta ligar
BaseClassName.methodname (self, arguments). Esta é ocasionalmente útil para os clientes
também. (Note que isto só funciona se a classe base é acessível BaseClassName como no
âmbito global.)
* Use isinstance () para verificar se uma instância do tipo: isinstance (OBJ, int) será
verdadeiro somente se obj.__class__ está int ou alguma classe derivada de int.
* Use issubclass () para verificar a herança de classe: issubclass (bool, int) é verdade, pois
bool é uma subclasse de int. No entanto, issubclass (float, int) é falsa, já que flutuam não é
uma subclasse de int.
Python suporta uma forma de herança múltipla também. A definição de classe com múltiplas
classes base parecido com este:
Para a maioria dos fins, nos casos mais simples, você pode pensar na busca de atributos
herdados de uma classe-mãe, em profundidade, da esquerda para a direita, não procura duas
vezes na mesma classe em que existe uma sobreposição na hierarquia. Assim, se um atributo
não é encontrado em DerivedClassName, é procurado em Base1, então (recursivamente) nas
classes de base de Base1, e se ele não foi encontrado lá, ele foi procurado em Base2, e assim
Na verdade, ele é um pouco mais complexo do que isso, o método muda para a resolução
dinamicamente para suportar chamadas de cooperativas de super (). Esta abordagem é
conhecida em outros idiomas herança múltipla como método de chamada da próxima e é mais
poderoso do que a chamada super encontrados em outras línguas herança única.
"Private" variáveis de instância que não podem ser acessados com exceção de dentro de um
objeto, não existem no Python. No entanto, existe uma convenção que é seguido pela maioria
código Python: um nome prefixado com um sublinhado (_spam, por exemplo) deve ser tratada
como uma parte não-públicas da API (se é uma função, um método ou um membro de dados) .
Deve ser considerado um detalhe de implementação e estão sujeitas a alterações sem aviso
prévio.
Dado que existe um caso de uso válido para os membros da classe-privadas (ou seja, evitar
conflitos de nomes com os nomes definidos pelas subclasses), não há suporte limitado para
esse mecanismo, chamado desconfiguração nome. Qualquer identificador do __spam forma
(pelo menos dois underscores, no máximo, um sublinhado à direita) é textualmente
substituído _classname__spam, onde classname é o nome da classe atual com os principais
sublinhado (s) descascada. Esta deturpação é feito sem levar em conta a posição sintática do
identificador, enquanto ela ocorre dentro da definição de uma classe.
Note que as regras são mangling projetados principalmente para evitar acidentes, ainda é
possível acessar ou modificar uma variável que é considerada privada. Isso pode até ser útil em
circunstâncias especiais, como no depurador.
Observe que o código passado para exec (), eval () ou execfile () não considera o nome da
classe da classe invocando a classe atual, que é semelhante ao efeito do cômputo global, cujo
efeito é igualmente limitado a código que foi byte-compilado em conjunto. A mesma restrição
aplica-se a getattr (), setattr () e delattr (), bem como quando __dict__ referência direta.
9.7. Odds and Ends ¶
Empregado de classe:
passar
Um pedaço de código Python que espera um determinado tipo abstrato de dados muitas vezes
pode ser transmitida de uma classe que emula os métodos desse tipo de dados em vez disso.
Por exemplo, se você tiver uma função que alguns formatos de dados de um objeto arquivo,
você pode definir uma classe com os métodos read () e readline () que recebem os dados de
um buffer string em vez disso, e passá-lo como um argumento.
objetos método Instância atributos, também: m.__self__ é o objeto exemplo, com o método
m (), e m.__func__ é o objeto função correspondente ao método.
9.8. Exceções são classes Too ¶
Exceções definidas pelo usuário são identificadas por classes. Usando este mecanismo, é
possível criar hierarquias extensíveis de exceções.
aumentar a Classe
levantar Instância
Na primeira forma, a classe deve ser uma instância de tipo ou de uma classe derivada dela. A
primeira forma é um atalho para:
levantar (classe)
Uma classe em uma cláusula except é compatível com uma exceção se for da mesma classe ou
de uma classe base do mesmo (mas não o contrário - uma cláusula de anúncio, exceto uma
classe derivada não é compatível com uma classe de base). Por exemplo, o código a seguir será
impresso B, C, D, nesta ordem:
Classe B (exceção):
passar
para c em B [, C, D]:
tente:
levantar c ()
exceto D:
print ("D")
C, exceto:
print ("C")
exceto B:
print ("B")
Note que, se as cláusulas de excepção foram invertidos (com exceção B em primeiro lugar),
teria impresso B, B, B - a primeira correspondência, excepto cláusula é acionada.
Quando uma mensagem de erro é impressa para uma exceção não tratada, nome da classe da
exceção é impresso, então uma vírgula e um espaço e, finalmente, a exemplo convertido em
uma string usando o built-in função str ().
9.9. Iterators ¶
Até agora você já deve ter notado que a maioria dos objetos recipiente pode ser enrolada
sobre o uso de uma instrução for:
Este estilo de acesso, é claro, conciso e prático. O uso de iteradores permeia e unifica Python.
Nos bastidores, a declaração de chamadas iter () no objeto de recipiente. A função retorna um
objeto iterador que define o __next__ (método) que acessa elementos no recipiente um de
cada vez. Quando não houver mais elementos, __next__ () gera uma exceção StopIteration
que diz o loop para terminar. Você pode chamar o __next__ () usando o método builtin next (),
esse exemplo mostra como tudo funciona:
>>> S = 'abc'
classe Reverse:
"Iterator para looping em uma seqüência para trás"
def __init__ (self, dados):
self.data dados =
self.index = len (dados)
def __iter__ (self):
retorno auto
def __next__ (self):
se self.index == 0:
levantar StopIteration
self.index = self.index - 1
retorno self.data [self.index]
9.10. Geradores ¶
Generators são uma ferramenta simples e poderosa para a criação de iteradores. Eles são
Qualquer coisa que pode ser feito com geradores também pode ser feito com a classe
iteradores base, como descrito na seção anterior. O que torna tão compacto geradores é que o
__iter__ () e __next__ () são criados automaticamente.
Outra característica importante é que as variáveis locais e estaduais de execução são salvos
automaticamente entre as chamadas. Isso fez com que a função mais fácil de escrever e muito
mais claro do que uma abordagem usando variáveis de instância como self.index e self.data.
Alguns geradores simples podem ser codificados sucintamente como expressões usando uma
sintaxe semelhante à compreensões lista, mas com parênteses, em vez de colchetes. Estas
expressões são concebidas para situações onde o gerador é usado imediatamente por uma
função de inclusão. Gerador de expressões são mais compactos e menos versáteis do que as
definições gerador completo e tendem a ser mais amigável do que a memória compreensões
lista equivalente.
Exemplos:
>>> Unique_words = set (palavra por linha na página de palavra em line.split ())
Certifique-se de usar o import os estilo em vez de importar OS *. Isto irá manter os.open () de
sombreamento do built-in função open () que opera de forma muito diferente.
A built-in dir () e help () são funções úteis como auxiliares para o trabalho interativo com os
módulos de grande porte como os:
O módulo getopt processos sys.argv usando as convenções do getopt Unix () função. linha de
processamento mais poderosos e flexíveis de comando é fornecida pelo módulo optparse.
10.4. Erro de redirecionamento de saída e ¶ Rescisão Programa
O módulo sys também tem atributos para stdin, stdout e stderr. O último é útil para emitir
avisos e mensagens de erro para torná-los visíveis mesmo quando stdout foi redirecionado:
>>> Sys.stderr.write ('Warning, log file not found a partir de uma nova \ n')
Warning, log file not found iniciar um novo
Quando apenas simples recursos são necessários, os métodos de string são preferidos porque
são mais fáceis de ler e debug:
10.6. Matemática ¶
O módulo math oferece acesso às funções subjacentes biblioteca C para matemática de ponto
flutuante:
O projeto <http://scipy.org> SciPy tem muitos outros módulos para cálculos numéricos.
10.7. Acesso à Internet ¶
Por exemplo, pode ser tentador usar a embalagem e desembalagem característica tupla em
vez da abordagem tradicional para trocar argumentos. O módulo timeit rapidamente
demonstra uma vantagem de desempenho modesto:
Em contraste com timeit o nível de granularidade fina, o perfil e os módulos pstats fornecer
ferramentas para a identificação de pontos críticos em tempo grandes blocos de código.
10.11. ¶ Controle de Qualidade
Uma abordagem para o desenvolvimento de software de alta qualidade é escrever testes para
cada função, uma vez que é desenvolvido e para executar esses testes frequentemente
durante o processo de desenvolvimento.
docTest importação
doctest.testmod () # validar automaticamente os testes embutido
O unittest módulo não é tão fácil como o docTest módulo, mas permite um conjunto mais
abrangente de testes para ser mantido em um arquivo separado:
unittest importação
Python tem um "baterias incluídas" filosofia. Este é o melhor visto através das capacidades
sofisticadas e robustas de seus pacotes de maiores dimensões. Por exemplo:
Esta segunda turnê abrange os módulos mais avançados que suportam as necessidades de
programação profissional. Estes módulos raramente ocorrem em scripts pequenos.
11.1. Saída de formatação ¶
O módulo reprlib fornece uma versão de repr () customizada para displays abreviada de
grandes contentores ou profundamente aninhadas:
O módulo pprint oferece um controle mais sofisticado do que objetos de impressão tanto
built-in e definidos pelo usuário de forma que seja legível pelo intérprete. Quando o resultado
O módulo textwrap pontos formatos de texto para ajustar a largura determinada tela:
11.2. Templating ¶
O módulo string inclui uma classe de modelo versátil, com uma sintaxe simplificada adequado
O formato utiliza nomes de espaço reservado formado por $ com identificadores válidos
Python (caracteres alfanuméricos e sublinhados). Cercando o espaço com aparelhos permite
que ele seja seguido por mais letras alfanumérico sem espaços intermediários. Escrevendo $
cria um único escapou $:
A estrutura do módulo fornece pack () e unpack (), funções para trabalhar com formatos de
registro de comprimento variável binária. O exemplo a seguir mostra como um loop através de
informações de cabeçalho em um arquivo ZIP sem o uso do módulo zipfile. códigos Pack "H" e
"I" representam dois e quatro números unsigned byte, respectivamente. Os "<" indica que eles
são de tamanho padrão e em pouco endian byte order:
importação struct
+ Start = 16
[Dados filename = start: + start filenamesize]
+ Start = filenamesize
[Dados extra = start: + start extra_size]
print (nome, hex (CRC32), comp_size, uncomp_size)
11.4. Multi-threading ¶
Threading é uma técnica de separação de tarefas que não são seqüencialmente dependentes.
Tópicos podem ser utilizados para melhorar a capacidade de resposta dos aplicativos que
aceitam a entrada do usuário, enquanto outras tarefas executadas em segundo plano. Um
caso de uso relacionado está sendo executado I / O em paralelo com os cálculos em outro
segmento.
O código a seguir mostra como o alto nível de segmentação módulo pode executar tarefas em
background enquanto o programa principal continua a ser executado:
Embora essas ferramentas são poderosas, erros de projeto menores pode resultar em
problemas que são difíceis de reproduzir. Assim, a abordagem preferida para coordenação de
tarefas é concentrar todo o acesso a um recurso em um único segmento e, em seguida, usar o
módulo fila para alimentar esse segmento com pedidos de outros segmentos. Aplicações
usando objetos da fila de discussão inter-comunicação ea coordenação são mais fáceis de
design, mais legível, e mais confiável.
11.5. Log ¶
O módulo de registro oferece um completo e flexível sistema de registro. Na sua forma mais
simples, as mensagens de log são enviadas para um arquivo ou sys.stderr:
registro de importação
logging.debug ("As informações de depuração)
logging.info ("Mensagem informativa)
logging.warning ("Aviso: arquivo de configuração% s não encontrado ',' server.conf)
logging.error ('Erro')
logging.critical ("erro crítico - fechar ')
Por padrão, as mensagens informativas e depuração são suprimidos eo produto é enviado para
o erro padrão. Outras opções de saída incluem roteamento de mensagens através de e-mail,
datagramas, tomadas ou a um servidor HTTP. Novos filtros pode selecionar diferentes
roteamento baseado em prioridade da mensagem: DEBUG, INFO, aviso, erro, e crítica.
O sistema de registro pode ser configurado diretamente ou Python pode ser carregado de um
usuário do arquivo de configuração editáveis personalizados registro sem alterar o pedido.
11.6. Referências Weak ¶
Esta abordagem funciona bem para a maioria das aplicações, mas ocasionalmente há uma
necessidade de rastrear objetos apenas enquanto estão sendo usados por outra coisa.
Infelizmente, apenas segui-los cria uma referência que torna permanente. O módulo weakref
fornece ferramentas para seguir objetos sem criar uma referência. Quando o objeto não é
mais necessário, ele é automaticamente removido de uma tabela weakref e um callback é
acionado para objetos weakref. Aplicações típicas incluem cache objetos que são caros para
criar:
Muitas das necessidades da estrutura de dados pode ser satisfeita com o built-in tipo de lista.
No entanto, às vezes há a necessidade de implementações alternativas com diferentes trade-
offs de desempenho.
O módulo fornece uma matriz (matriz) objeto que é como uma lista que armazena apenas
dados homogêneos e armazena-la mais compacta. O exemplo a seguir mostra uma matriz de
números armazenados como dois bytes sem sinal de números binários (código de tipo "H") ao
invés do usual 16 bytes por entrada para as listas regulares de objetos int Python:
O módulo de coleções fornece um deque () que o objeto é como uma lista com acrescentará
mais rápido e aparece do lado esquerdo, mas pesquisas mais lento no meio. Estes objetos são
adequados para a implementação de filas e largura pesquisas primeira árvore:
O módulo heapq fornece funções para a execução pilhas com base em listas regular. O menor
valor de entrada é sempre mantido na posição zero. Isso é útil para aplicativos que acessar
repetidamente o menor elemento, mas não quero correr uma lista completa de classificação:
O módulo decimal oferece um tipo de dados Decimal para aritmética de ponto flutuante
decimal. Comparado com o built-in float execução de ponto flutuante binário, a classe é
especialmente útil para
permite a exata representação da classe Decimal para realizar cálculos modulo e testes de
igualdade que são impróprios para ponto flutuante binário:
12. E agora?
Lendo este tutorial provavelmente tem reforçado o seu interesse em utilizar Python - você
deve estar ansioso para aplicar Python para resolver seus problemas do mundo real. Onde
você deve ir para saber mais?
Este tutorial é parte da documentação do Python set. Alguns outros documentos que constam
no:
Você deve navegar por este manual, o que dá completo (embora resumido) material de
referência sobre os tipos, funções e os módulos da biblioteca padrão. A distribuição padrão do
Python inclui uma grande quantidade de código adicional. Existem módulos para ler correio
Unix, recuperar documentos via HTTP, gerar números aleatórios, analisar as opções de linha de
comando, escrever programas CGI, compactar os dados, e muitas outras tarefas. Skimming
através da Biblioteca de Referência lhe dará uma idéia do que está disponível.
*
Instalando Python Módulos explica como instalar módulos externos escritas por outros
usuários Python.
*
Para questões relacionadas com Python e relatórios de problemas, você pode postar no
comp.lang.python newsgroup, ou enviá-los para a lista de discussão em python-
list@python.org. O grupo de notícias e lista de clientes passam pelo gateway, assim as
mensagens enviadas para um serão encaminhados automaticamente para o outro. Há cerca de
120 lançamentos por dia (com picos de até várias centenas), perguntando (e responder)
questões, sugerindo novas funcionalidades, e anunciando novos módulos. Antes de postar,
não se esqueça de verificar a lista de Frequently Asked Questions (também chamada de FAQ),
ou procurá-lo no diretório Misc / distribuição do código fonte do Python. arquivos da lista
estão disponíveis em http://mail.python.org/pipermail/. A FAQ responde muitas das questões
que vêm de novo e de novo, e já pode conter a solução para seu problema.
Se for suportado, edição de linha de entrada é ativo sempre que o interpretador imprime um
As teclas e alguns outros parâmetros da biblioteca Readline pode ser personalizado, colocando
os comandos em um arquivo de inicialização chamado ~ /. Inputrc. Teclas tem a forma
ou
Por exemplo:
Note-se que o padrão obrigatório para Tab em Python é inserir um caractere de tabulação em
vez de padrão Readline a função nome completo. Se você insistir, você pode substituir esse
Tab: completo
em seu ~ /. inputrc. (É claro, isso torna mais difícil a continuação linhas recuadas tipo se você
está acostumado a usar Tab para essa finalidade).
Esta liga-se a tecla Tab para a função de conclusão, de modo a apertar a tecla Tab duas vezes
sugere complementos, que olha para nomes declaração Python, variáveis local atual, e os
nomes disponíveis módulo. Para expressões pontilhada como string.a, ele irá avaliar a
expressão até o "final". e então sugerir conclusões a partir dos atributos do objeto resultante.
Observe que isso pode executar um código definido pelo aplicativo, se um objeto com um
__getattr__ () é parte da expressão.
Um arquivo de inicialização mais capaz pôde olhar como este exemplo. Observe que isso exclui
os nomes que cria uma vez que eles não são mais necessários, o que é feito desde o arquivo de
inicialização é executado no mesmo espaço de nomes como os comandos interativos, e
remover os nomes evita criar efeitos colaterais no ambiente interativo. Você pode achar que é
conveniente manter alguns dos módulos importados, como os, que acabam por ser necessário
na maioria das sessões com o intérprete.
atexit importação
OS importação
readline importação
rlcompleter importação
atexit.register (save_history)
del OS, atexit, readline, rlcompleter, save_history, historyPath
Uma alternativa melhor intérprete interativo que tem sido em torno de algum tempo é
IPython, que apresenta a conclusão de tabulação, objeto de exploração e gestão avançada da
história. Também pode ser completamente personalizado e incorporado em outros aplicativos.
Outro ambiente interativo é reforçada similar bpython.
Notas de Rodapé
[1] Python executará o conteúdo de um arquivo identificado pela variável de ambiente
PYTHONSTARTUP quando você iniciar um interpretador interativo.