Quais são os recursos menos conhecidos, mas úteis, da linguagem de programação Python?
- Tente limitar as respostas ao núcleo do Python.
- Um recurso por resposta.
- Dê um exemplo e uma breve descrição do recurso, não apenas um link para a documentação.
- Rotule o recurso usando um título como a primeira linha.
Links rápidos para respostas:
- Argumento Desempacotando
- Suspensórios
- Operadores de comparação de encadeamento
- Decoradores
- Pegadas de argumento padrão / perigos de argumentos padrão mutáveis
- Descritores
.get
Valor padrão do dicionário- Testes de Docstring
- Sintaxe de corte de reticências
- Enumeração
- For / else
- Função como argumento iter ()
- Expressões do gerador
import this
- Troca de valor no local
- Passo da lista
__missing__
Itens- Regex de várias linhas
- Formatação de string nomeada
- Compreensões de lista / gerador aninhadas
- Novos tipos em tempo de execução
.pth
arquivos- Codificação ROT13
- Depuração de Regex
- Enviando para Geradores
- Conclusão da guia no intérprete interativo
- Expressão ternária
try/except/else
- Desempacotando +
print()
função with
declaração
python
hidden-features
compie
fonte
fonte
(< 1 x 10)
. Você pode até mesmo aplicar-lhes argumentos individuais, como(= 10)
: cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/...Obtenha a árvore de análise python regex para depurar seu regex.
Expressões regulares são um ótimo recurso do python, mas depurá-las pode ser uma dor, e é muito fácil cometer erros de regex.
Felizmente, o python pode imprimir a árvore de análise regex, passando o sinalizador não documentado, experimental e oculto
re.DEBUG
(na verdade, 128) parare.compile
.Depois de entender a sintaxe, você poderá identificar seus erros. Não podemos ver que eu esqueci de escapar do
[]
no[/font]
.Obviamente, você pode combiná-lo com qualquer sinalizador que desejar, como regexes comentadas:
fonte
enumerar
Envolva um iterável com enumerar e ele produzirá o item junto com seu índice.
Por exemplo:
Referências:
enumerate
fonte
Criando objetos geradores
Se você escrever
você pode sair do gerador e atribuí-lo a x. Agora isso significa que você pode fazer
A vantagem disso é que você não precisa de armazenamento intermediário, o que você precisaria se precisasse
Em alguns casos, isso pode levar a uma velocidade significativa.
Você pode anexar muitas instruções if ao final do gerador, basicamente replicando aninhados para loops:
fonte
iter () pode usar um argumento que pode ser chamado
Por exemplo:
A
iter(callable, until_value)
função chamacallable
e produz repetidamente seu resultado até queuntil_value
seja retornada.fonte
lambda
palavra-chave é necessária aqui?Cuidado com argumentos padrão mutáveis
Em vez disso, você deve usar um valor sentinela indicando "não fornecido" e substituir pelo mutável que você deseja como padrão:
fonte
foo.func_defaults
. O que, sendo uma tupla, é imutável.Enviando valores para as funções do gerador . Por exemplo, tendo esta função:
Você pode:
fonte
Se você não gosta de usar espaço em branco para indicar escopos, pode usar o estilo C {} emitindo:
fonte
O argumento step em operadores de fatia. Por exemplo:
O caso especial
x[::-1]
é um idioma útil para 'x invertido'.fonte
Decoradores
Os decoradores permitem agrupar uma função ou método em outra função que pode adicionar funcionalidade, modificar argumentos ou resultados, etc. Você escreve decoradores uma linha acima da definição da função, começando com um sinal de "arroba" (@).
O exemplo mostra um
print_args
decorador que imprime os argumentos da função decorada antes de chamá-la:fonte
A sintaxe for ... else (consulte http://docs.python.org/ref/for.html )
O bloco "else" será normalmente executado no final do loop for, a menos que a interrupção seja chamada.
O código acima pode ser emulado da seguinte maneira:
fonte
A partir de 2.5, os ditados têm um método especial
__missing__
que é chamado para itens ausentes:Também existe uma subclasse dict
collections
chamada,defaultdict
que faz praticamente o mesmo, mas chama uma função sem argumentos para itens não existentes:Eu recomendo converter esses dictos em ditados regulares antes de passá-los para funções que não esperam tais subclasses. Muitos códigos usam
d[a_key]
e capturam KeyErrors para verificar se existe um item que adicionaria um novo item ao ditado.fonte
m={}; m.setdefault('foo', []).append(1)
.defaultdict
também é mais poderoso que osetdefault
método em outros casos. Por exemplo, para uma contra-dd = collections.defaultdict(int) ... dd[k] += 1
vsd.setdefault(k, 0) += 1
.Troca de valor no local
O lado direito da atribuição é uma expressão que cria uma nova tupla. O lado esquerdo da tarefa descompacta imediatamente essa tupla (não referenciada) dos nomes
a
eb
.Após a atribuição, a nova tupla não é referenciada e marcada para coleta de lixo, e os valores vinculados
a
eb
foram trocados.Conforme observado na seção do tutorial do Python sobre estruturas de dados ,
fonte
Expressões regulares legíveis
No Python, você pode dividir uma expressão regular em várias linhas, nomear suas correspondências e inserir comentários.
Exemplo de sintaxe detalhada (de Dive into Python ):
Exemplo de correspondências de nomeação (no HOWTO de Expressão Regular )
Você também pode escrever uma regex verbalmente sem usar
re.VERBOSE
a concatenação literal de cadeias.fonte
Argumento de Função Descompactando
Você pode descompactar uma lista ou um dicionário como argumentos de função usando
*
e**
.Por exemplo:
Atalho muito útil, pois listas, tuplas e dictos são amplamente utilizados como contêineres.
fonte
ROT13 é uma codificação válida para o código fonte, quando você usa a declaração de codificação correta na parte superior do arquivo de código:
fonte
cevag h"Uryyb fgnpxbiresybj!"
Criando novos tipos de uma maneira totalmente dinâmica
que é exatamente o mesmo que
Provavelmente não é a coisa mais útil, mas é bom saber.
Edit : Nome fixo do novo tipo, deve ser
NewType
exatamente a mesma coisa que com aclass
instrução.Editar : ajustou o título para descrever com mais precisão o recurso.
fonte
Gerentes de contexto e a
with
declaração " "Introduzido no PEP 343 , um gerenciador de contexto é um objeto que atua como um contexto de tempo de execução para um conjunto de instruções.
Como o recurso faz uso de novas palavras-chave, é introduzido gradualmente: está disponível no Python 2.5 através da
__future__
diretiva. O Python 2.6 e superior (incluindo o Python 3) o disponibilizam por padrão.Eu tenho usado muito a instrução "with" porque acho que é uma construção muito útil, aqui está uma demonstração rápida:
O que está acontecendo aqui nos bastidores é que a instrução "with" chama os métodos
__enter__
e especiais__exit__
no objeto de arquivo. Os detalhes da exceção também são passados para__exit__
se alguma exceção foi levantada do corpo da instrução with, permitindo que o tratamento da exceção ocorra lá.O que isso faz com você nesse caso específico é que garante que o arquivo seja fechado quando a execução estiver fora do escopo do
with
conjunto, independentemente se isso ocorrer normalmente ou se uma exceção foi lançada. É basicamente uma maneira de abstrair o código comum de tratamento de exceções.Outros casos de uso comuns para isso incluem bloqueio com threads e transações com o banco de dados.
fonte
withs
:)with open('filea') as filea and open('fileb') as fileb: ...
with open('filea') as filea, open('fileb') as fileb: ...
Os dicionários têm um método get ()
Os dicionários têm um método 'get ()'. Se você d ['key'] e a chave não estiverem lá, você receberá uma exceção. Se você fizer d.get ('key'), retornará None se 'key' não estiver lá. Você pode adicionar um segundo argumento para recuperar esse item em vez de Nenhum, por exemplo: d.get ('key', 0).
É ótimo para coisas como somar números:
sum[value] = sum.get(value, 0) + 1
fonte
get(key, None)
. Não tinha idéia do queNone
era fornecido por padrão.Descritores
Eles são a mágica por trás de vários recursos principais do Python.
Quando você usa acesso pontilhado para procurar um membro (por exemplo, xy), o Python primeiro procura o membro no dicionário de instância. Se não for encontrado, ele o procura no dicionário de classes. Se o encontrar no dicionário de classes e o objeto implementar o protocolo do descritor, em vez de apenas devolvê-lo, o Python o executará. Um descritor é qualquer classe que implementa as
__get__
,__set__
ou__delete__
métodos.Veja como você implementaria sua própria versão (somente leitura) da propriedade usando descritores:
e você o usaria exatamente como a propriedade interna ():
Os descritores são usados no Python para implementar propriedades, métodos vinculados, métodos estáticos, métodos de classe e slots, entre outras coisas. Compreendê-los facilita ver por que muitas coisas que antes pareciam 'peculiaridades' do Python são do jeito que são.
Raymond Hettinger tem um excelente tutorial que faz um trabalho muito melhor de descrevê-los do que eu.
fonte
foo = property(lambda self: self.__foo)
property
ele próprio é implementado com descritores, que foi o ponto da minha postagem.Atribuição Condicional
Ele faz exatamente o que parece: "atribua 3 a x se y for 1; caso contrário, atribua 2 a x". Observe que os parênteses não são necessários, mas eu gosto deles para facilitar a leitura. Você também pode encadeá-lo se tiver algo mais complicado:
Embora em um certo ponto, vá um pouco longe demais.
Observe que você pode usar if ... else em qualquer expressão. Por exemplo:
Aqui, func1 será chamado se y for 1 e func2, caso contrário. Nos dois casos, a função correspondente será chamada com os argumentos arg1 e arg2.
Analogamente, o seguinte também é válido:
onde class1 e class2 são duas classes.
fonte
x = ((y == 1) ? 3 : 2)
faz mais sentido para mimDoctest : documentação e testes de unidade ao mesmo tempo.
Exemplo extraído da documentação do Python:
fonte
locals()
, em seguida, em sua doctest fazerlocals().update(setUp())
= DFormatação nomeada
A formatação% usa um dicionário (também aplica a validação% i /% s etc.).
E como locals () também é um dicionário, você pode simplesmente passar isso como um ditado e ter% -substitions de suas variáveis locais. Eu acho que isso é desaprovado, mas simplifica as coisas ..
Nova formatação de estilo
fonte
Para adicionar mais módulos python (especialmente os de terceiros), a maioria das pessoas parece usar variáveis de ambiente PYTHONPATH ou adiciona links simbólicos ou diretórios em seus diretórios de pacotes de sites. Outra maneira é usar arquivos * .pth. Aqui está a explicação oficial do documento python:
fonte
Cláusula Exception else :
O uso da cláusula else é melhor do que adicionar código adicional à cláusula try, pois evita a captura acidental de uma exceção que não foi gerada pelo código sendo protegido pela instrução try ... exceto.
Consulte http://docs.python.org/tut/node10.html
fonte
Redigitando exceções :
A instrução 'raise' sem argumentos dentro de um manipulador de erros diz ao Python para aumentar novamente a exceção com o traceback original intacto , permitindo que você diga "oh, desculpe, desculpe, não pretendi pegar isso, desculpe, desculpe. "
Se você deseja imprimir, armazenar ou mexer no traceback original, pode obtê-lo com sys.exc_info (), e imprimi-lo como o Python faria com o módulo 'traceback'.
fonte
raise e
, o que não preserva o retorno original.exc_info = sys.exc_info(); raise exc_info[0], exc_info[1], exc_info[2]
é equivalente a isso, mas você pode alterar esses valores ao redor (por exemplo, alterar o tipo de exceção ou mensagem)Mensagens principais :)
Decifrado :
fonte
print s.translate("".join(chr(64<i<91 and 65+(i-52)%26 or 96<i<123 and 97+(i-84)%26 or i) for i in range(256)))
e ele parece muito melhor agora! :-DConclusão da guia Interpretador interativo
Você também precisará definir uma variável de ambiente PYTHONSTARTUP.
fonte
easy_install ipdb
- então você pode usarimport ipdb; ipdb.set_trace()
readline.parse_and_bind ("bind ^I rl_complete")
Compreensões de lista aninhadas e expressões geradoras:
Eles podem substituir grandes pedaços de código de loop aninhado.
fonte
for
instruções deve ser escrita na ordem em que você espera que sejam escritas em um loop for padrão, de fora para dentro.for
s eif
s comyield x
interior. Para converter isso em uma expressão de gerador, movax
primeiro, exclua todos os dois pontos (e oyield
) e coloque tudo entre parênteses. Para compreender a lista, substitua as parênteses externas por colchetes.Sobrecarga do operador para o
set
builtin:Mais detalhes da referência da biblioteca padrão: Tipos de conjunto
fonte