Como posso aprender a escrever efetivamente código Pythonic?

46

Fazer uma pesquisa no Google por "pythonic" revela uma ampla variedade de interpretações. A página da wikipedia diz:

Um neologismo comum na comunidade Python é pitônico, que pode ter uma ampla gama de significados relacionados ao estilo do programa. Dizer que o código é pitônico é dizer que ele usa bem os idiomas Python, que é natural ou mostra fluência na linguagem. Da mesma forma, dizer de um recurso de interface ou linguagem que é pitônico é dizer que funciona bem com os idiomas do Python, que seu uso se encaixa bem com o restante da linguagem.

Ele também discute o termo "não-tônico":

Por outro lado, uma marca do código não-sintônico é que ele tenta escrever código C ++ (ou Lisp, Perl ou Java) em Python - ou seja, fornece uma transcrição grosseira, em vez de uma tradução idiomática de formulários de outro idioma. O conceito de pitonicidade está fortemente vinculado à filosofia minimalista de legibilidade do Python e evita a abordagem "há mais de uma maneira de fazer isso". Código ilegível ou idiomas incompreensíveis não são sintonizados.

O que significa o termo "pitônico"? Como aprendo a aplicá-lo efetivamente na prática?


fonte
6
Eu acho que sua pergunta pode ser estendida a qualquer linguagem de programação. Sempre existe uma maneira recomendada de programação que pode ser precisa em um grande número de casos e também para melhorar a revisão, a legibilidade e a manutenção. Eu acho que também desafiar essas recomendações pode fazer com que uma linguagem evolua e avance ...
Amine
@Amine tão verdadeiro. Na verdade, acho que um wiki da comunidade que consiste exatamente de onde aprender idiomas - para todos os idiomas - deve ser considerado.
yati sagade
Possivelmente relacionado: programmers.stackexchange.com/questions/47860/…
FrustratedWithFormsDesigner
1
Comentaristas: por favor, pare de postar comentários irrelevantes; eles foram excluídos por um motivo. Se você tiver uma resposta, deixe-a como resposta. Se você quiser discutir o tópico desta pergunta, use o bate-papo .
1
Praticando Python!
Dynamic

Respostas:

22

Eu descobri que a maioria das pessoas tem suas próprias interpretações do que ser "pitonico" realmente significa. Da Wikipedia:

Um neologismo comum na comunidade Python é pitônico, que pode ter uma ampla gama de significados relacionados ao estilo do programa. Dizer que o código é pitônico é dizer que ele usa bem os idiomas Python, que é natural ou mostra fluência na linguagem. Da mesma forma, dizer de um recurso de interface ou linguagem que é pitônico é dizer que funciona bem com os idiomas do Python, que seu uso se encaixa bem com o restante da linguagem.

Por outro lado, uma marca do código não-sintônico é que ele tenta escrever código C ++ (ou Lisp, Perl ou Java) em Python - ou seja, fornece uma transcrição grosseira, em vez de uma tradução idiomática de formulários de outro idioma. O conceito de pitonicidade está fortemente vinculado à filosofia minimalista de legibilidade do Python e evita a abordagem "há mais de uma maneira de fazer isso". Código ilegível ou idiomas incompreensíveis não são sintonizados.

Descobri que mais vezes do que não, mais exemplos "pitônicos" são realmente derivados de pessoas que tentam ser inteligentes com os idiomas do Python e (novamente, mais do que nunca) tornando seu código praticamente ilegível (o que não é Pythonic).

Desde que você adote os idiomas do Python e evite tentar usar estilos C ++ (ou outra linguagem) no Python, estará sendo Pythonic.

Conforme apontado pelo WorldEngineer, o PEP8 é um bom padrão a seguir (e se você usa o VIM, existem plugins disponíveis para a aprendizagem do PEP8).


Realmente, no final do dia, se a sua solução funciona e não é absolutamente horrivelmente insustentável e lenta, quem se importa? Mais vezes do que não, seu trabalho é realizar uma tarefa, não escrever o código python mais elegante possível.


Outra nota lateral (apenas a minha opinião, não hesite em downvote por causa disso;)): Eu também constatou a comunidade Python para ser preenchido com uma tonelada de ego (não que a maioria das comunidades não são , é apenas um pouco mais prevalente em comunidades como C e Python). Assim, combinar o ego com interpretações mal interpretadas de ser "pitônico" tenderá a produzir muita negatividade sem fundamento. Pegue o que você lê dos outros com um grão de sal. Atenha-se aos padrões e documentação oficiais e você ficará bem.

Demian Brecht
fonte
2
+1 para uma boa resposta (exceto pela cotação desde que eu a usei no OP).
Ugh .. Deveria reler o OP antes de postar a citação: P
Demian Brecht
3
Em vez disso, existe uma alta correlação entre ego e estar ativo online, expressando opiniões em qualquer comunidade. Basicamente, você não vê muito as pessoas não-egoístas porque, em primeiro lugar, elas não escrevem muito.
Isarandi
17

Pythonic é codificar idioma em Python. Significa usar estruturas e formatação que funcionam bem para Python do ponto de vista de programação, mas também do ponto de vista da comunidade. É muito parecido com o modo como a K&R define o padrão para o estilo de programação C por um longo tempo. Este guia mostra que você precisa codificar idioma em Python. O PEP 8 é mencionado nesse guia, portanto provavelmente vale a pena ler.

Engenheiro Mundial
fonte
1
@ MattFenwick Não são 90% do que é a programação? Bons programadores passam muito tempo lendo o código e, em quanto tempo resta, escrevem muito código. Quanto mais código Pythonic você ler, e quanto mais você escrever em Python, mais Pythonic será seu código. Eu não acho que existem atalhos aqui.
Kris Harper #
2
Excellent link!
Ethan Furman
13

Escrevendo código "Pythonic" O IMHO está apenas fazendo uso efetivo dos recursos (V) HLL fornecidos pelo idioma. Como um exemplo onipresente,

x, y = 7, 'fuhrer'

Isso é muito pitonico. Lembro-me de quando comecei a aprender C # depois de meses apenas em Python,

int x, y = 10, z;

de alguma forma me confundiu, mas demorei um minuto para retornar às minhas raízes C / C ++.

Outra maneira pitônica é usar lambdas.

l = [1, 2, 3, 4, 5]
print(sorted(l, key=lambda x: -x))

realmente será impresso lem ordem decrescente.

Depois, há a "digitação de pato" muito usada, mas muito menos compreendida - Se ela anda e fala como um pato, você a trata como um pato. Esta é vagamente relacionadas com interfaces em outras linguagens OO.

Também se usam métodos de programação funcional, quando aplicável, como o uso de map e red e são considerados pitônicos.

Vi uma resposta sendo postada enquanto eu digitava, e ele contém um link legal. PS: Não é que o seu conhecimento sobre Python seja limitado. Posso apostar que Python não era sua primeira língua e, portanto, (como a maioria de nós pythonistas), você terá que aprender a ficar "idiomático" com a cobra! Felicidades!

yati sagade
fonte
Eu não incluí o link, pois ele já estava publicado enquanto eu digitava - resposta do WorldEngineer :) Pense em "explorar" os recursos de idioma para o seu bem e dos outros, e você terá o Pythonic a caminho e siga esse link
yati sagade 15/11
4
Na verdade, muitos disputa que map, reduce, lambdae tais são idiomática per se. Compreensões de lista e expressão de gerador são uma alternativa e muitas as preferem sempre que razoavelmente possível (em particular, elas são menos barulhentas quando você precisa de um lambda de qualquer maneira). Eles certamente têm seus usos e programas de programação funcionais em outros idiomas (decorador, por exemplo).
@delnan concordou - e mais ainda quando se trata de Python 3. Conclusão é que os recursos funcionais devem ser usados exatamente onde necessário. E que (Só há uma maneira óbvia de fazê-lo) é idiomática :)
yati sagade
Pessoalmente, nunca entendi as preferências das pessoas no seu primeiro exemplo. Isso é muito mais fácil de analisar mentalmente (que é o Zen do Python, o código é lido com mais frequência do que está escrito): (x, y) = (7, 'fuhrer')- no entanto, quase sempre sou "corrigido" que sem parens é a melhor maneira de escrevê-lo!
Izkata 03/07/2012
2
Eu diria que seu exemplo de classificação específico não é pitônico. Por que reintroduzir a reordenação com um lambda, se você puder print(sorted(l, reverse=True)), o que adicionalmente explicita ao leitor o que está acontecendo? Eu também consideraria seu primeiro exemplo discutível. São duas atribuições compactadas em uma; está tudo bem, mas eu não chamaria isso de muito pitonico. Os leitores precisam olhar mais tempo para o que fazem do que para ter duas atribuições.
Phresnel
7
--> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

O código pitônico é:

  • Legível
  • Simples (o mais simples possível, mas não mais simples)
  • Bem pensado
Ethan Furman
fonte
1
+1. O Zen do Python é mais importante para escrever código pitônico do que seguir uma lista de idiomas; o último não cobrirá todas as circunstâncias.
Doval
6

Sempre que tentei aprender um novo idioma, descobri que a leitura de código por pessoas que conhecem o idioma como as costas da mão, olhando / perguntando sobre qualquer coisa que pareça estranha e tentando imitar seu estilo é a melhor coisa a fazer. Exemplos:

No Python, como estamos no assunto, achei os exemplos do Dive Into Python incrivelmente úteis para começar. Eles tendem a ensinar não apenas o básico do Python, mas enfatizar realmente o Python idiomático .

Ao aprender D, como a documentação não era boa no momento porque a linguagem era muito avançada, aprendi lendo o código na biblioteca padrão, especificamente, algumas das obras-primas de Andrei Alexandrescu .

Ao aprender C ++, herdei uma base de código de um bom programador de C ++ e aprendi muito sobre programação idiomática em C ++ por sua insistência em passar contêineres STL por referência, etc.

Em todos os idiomas, acho que navegar nas perguntas do StackOverflow sobre o idioma e observar o que as pessoas normalmente fazem para realizar coisas básicas ajuda.

dsimcha
fonte
+1 Depois de conhecer o básico de um idioma, a leitura de código ajudará muito mais do que a leitura de livros.
Pace
3

Python não é Java pode dar alguns conselhos úteis. Não posso dizer mais sem saber em que tipo de problemas você está se deparando, mas é um conselho muito concreto para programadores provenientes de outra linguagem (neste caso especificamente java) sobre como fazer python de maneira diferente.

maxpolun
fonte
2

Alguém disse para parafrasear, para aprender o que é Pythonic, apenas bash fora algum código. Eu discordo disso. Se você gosta de escrever código altamente denso, isso não o torna mais pitonico.

Uma maneira de ajudá-lo a definir o que é Pythonic no que diz respeito a você, pergunte a si mesmo "Por que eu (significando que você) usaria a linguagem Python?" O que agrada a você sobre isso?

Para mim, é legibilidade e falta de compilação e código aberto (praticamente tudo isso). Posso carregar toneladas de bibliotecas e ler seu código-fonte com menos estresse sobre o licenciamento do que em muitos outros idiomas.

Para mim, Python é bonito visualmente. Guido (o criador do Python) também continua me provando, através de suas respostas no PEPS e nas discussões) que suas escolhas de como ele criou a linguagem são superiores às minhas próprias idéias de como ela deveria ter sido criada.

Para mim, um ótimo programador é alguém com habilidades bem informadas para tomar decisões sobre qual caminho seguir ao codificar. Para mim, o Python ajuda a fazer essas escolhas rapidamente.

Ao simplificar a sintaxe do código-fonte, permitindo a digitação com patos em vez da conversão explícita, e a expectativa de que os codificadores que revisam seu código "devam ser codificadores bem comportados" leva a algo que eu também chamo de "Pythonic"

Portanto, existem dois lados do que é pitônico. Um é sintático, o outro é a prática de. Como explicar o lado mais profundo do que é "pitonico" ..?

Em Python, não é grande coisa fazer isso: alist = ['one', 'two', 'three \ n'] alist.append ((1234, 'Atuple'))

e a tupla será adicionada à lista sem nenhuma preocupação com os tipos de objetos. A parte Pythonic não é que você PODE fazer isso, mas que seu código deve ESPERAR isso e apenas trabalhar / adaptar.

Tudo o que funciona no objeto -alist- deve ser escrito com a idéia de que algum outro codificador possa entrar e adicionar uma não-string à lista e que a adaptação do código-fonte pelo novo codificador não deve ser difícil de fazer. Afinal, esse é o benefício do tipo de pato.

DevPlayer
fonte
-2

Compre um livro recomendado. Leia-o. Deve fornecer uma boa base para o uso do idioma e de um mecanismo que atenda ao estilo da comunidade

Paulo
fonte