Pythonic way of life
22.05.08
Exemplo, por favor?
Vejamos um dos exemplos mais simples de programação: Exibir os números pares até 20.
Em C, por exemplo, podemos fazer assim:
int n;
for (n = 0; n <= 20; n++) {
. . . if (n % 2 == 0)
. . . . . printf(“%d “, n);
}
Em Python podemos fazer de forma semelhante, mas há uma alternativa bem mais simples:
print [ x for x in range(21) if x % 2 == 0 ]
Essa construção sintática se chama “List comprehension“. Traduzindo, a expressão acima, significa:
“Gere uma lista de números de 0 a 20, com a função range(21). Para cada um desses números, verifique se são divisíveis por 2. Se forem, insira-os numa lista”.
O print vai imprimir a lista de números pares, separados por uma vírgula, dessa forma:
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
É isso. E como diz o Zen of Python, “Simple is better than complex”

Nerdson,
A questão da redução de linhas em um código tem dois lados. O primeiro que serve para deixar o código “enxuto” para quem está vendo o mesmo e o segundo, que deixa-o de tal forma “complexo” que demora-se muito mais para compreendê-lo.
Não é feio fazer códigos grandes. Não é feio fazer códigos extensos. O feio mesmo é fazer código sem comentários e daqueles que só “nerdsons” compreendem
Simple is better than complex when you can read
arrramm…
Brincar de golf é esporte de outra linguagem
, e é pq eu nem estou jogando ainda… isso é só o jeito natural de fazer
print join ‘, ‘, grep { $_ % 2 == 0 } 0..20;
(preciso dizer qual é a linguagem?)
daniel
E aqui temos um post que pode gerar um flamewar
Agora, se é para jogar golf…
print join’, ‘,grep{~$_&1}0..20
Alguém se habilita?
hehhe python surpreende mesmo!!
Abraços!!
Caros, não estou dizendo que Python é a melhor linguagem nem que códigos com poucas linhas são melhores. Não foi essa a minha intenção ao escrever o post. A intenção é mostrar algo que PODE SER feito em Python, de forma simples, apresentando o conceito – independente de linguagem – chamado “list comprehension”, que pode fazer muito mais do que listar números pares. O exemplo do post não necessariamente se refere à tirinha.
One-Liner C++ ->
for(int i=0; i<20; printf(“%d,”, i+=2));
Mas quem precisa de linguagem de programação? escreve direto na RAM da máquina…
Mais fácil ainda (em Python): print range(0, 21, 2)
Ruby:
(0..20).each {|n| puts n if n % 2 == 0}
É mais “simples”, mais “bonito” mas não tem milagre, nessa única linha de python tem também explicitamente todas as intruções que teria em C.
Tem o for, tem o if e tem o print, não tem mágica nenhuma…
Hehehe, programadores Python…
Adorei essa tira, adoro Python e não sei porque cargas d’água tem gente que se importa tanto em provar que Python não é a maravilha maior do Universo…
Programming Language is SERIOUS BUSINESS?
Show!
Cada post sobre Python que leio aqui no NERDSON me dá vontade de voltar a prender Python, parei no básicão.
Pronto, com esse comentário do Renan consegui fazer com que o post atingisse seu objetivo.
Obrigado pela compreensão.
Mission Accomplished.
ou ainda usando o mm algorito (resto da divisao) em c++…
for(int n=0; n++<=20;(n%2)?n:printf(“%d “,n));
claro que o for(int i=0; i<20; printf(”%d,”, i+=2)); é boa ideia, saltar logo de 2 em 2…. hehehe
qt ao python acho que é mm moda, queria era ver isso feito em ocaml , de certeza que bate as linguagens imperativas neste tipo de problemas hehehehe amanha se tiver paciencia penso nisso…
Ricardo,
No link da Wikipédia que tem ali no post, tem um exemplo bem parecido com o de Python, de F#, que se não me engano é uma variação do OCaml pra plataforma .NET.
{ for x in 0..100 when x*x > 3 -> 2*x }
Pena que em C# não o código não fica tão elegante. =/ huahueahuuhe
print range(0, 21, 2)
Beautiful is better than ugly.
Desisto.
Ao pessoal que está mostrando os números de 2 em 2 (ex: com a função range do python), e se fosse pra imprimir os pares entre 1 e 20?
FAILED – MISSION ABORTED!
for (i=1;i<=20;i++) print (“%d “,i*(1-i&1))
isto evita um custoso if.
Fast is beautiful.
Fala FelipeBZ…
print [x for x in range(0, 21, 2) if x]
ou
print [x+1 for x in range(1, 21, 2)]
“Ricardo,
No link da Wikipédia que tem ali no post, tem um exemplo bem parecido com o de Python, de F#, que se não me engano é uma variação do OCaml pra plataforma .NET.
{ for x in 0..100 when x*x > 3 -> 2*x }
Pena que em C# não o código não fica tão elegante. =/ huahueahuuhe”
F# é a resposta da micro às linguagens funcionais, sendo o ocaml uma delas. Mas só a ver aí um for explicito é logo má programação funcional, melhor, é usar programação funcional para para programar imperativamente. Um bocado como usar um trator para ir à praia, podemos fazer mas nao foi para isso que foram feitos…
Nem sempre uma redução no número de linhas é uma coisa boa. Para quem tiver que dar manutenção no código (às vezes você mesmo) isso pode ser uma bela dor de cabeça. Tudo bem que existem casos e mais casos, mas ter instruções separadas linha a linha podem ajudar o pobre cérebro humano a entender mais facilmente =)
InFog
Nossa como o pessoal gosta de complicar as coisas neh hehehe pior que eh assim na programação, lido todo dia com complicações que outros “programadores” fazem e tento simplificar, e não importa a linguagem, se da pra simplificar e deixar entendível pelos outros “programadores” ai blz.
Adoro Python, esse post me fez sentir bem e com mais vontade ainda de usar meu tempo livre para aprender e me aprofundar mais na linguagem.
[]’s
Karl, não se preocupe. A melhor linguagem de programação que existe (pra mim) é a que paga as contas no final do mês (ou no começo).
Eu comecei a aprender Python, fiquei bem no básico mesmo, mas é uma linguagem que se tivesse algum investimento (ou apoio) de grandes da indústria iria derrubar muita linguagem dita poderosa. A propósito, dê uma olhada nas libs gráficas (GTK se não me engano) para python. Elas fazem maravilhas em interface gráfica com poucas linhas de código.
E agradeça por até agora não aparecer ninguém do Java dizendo que não existe “tipagem forte” no Python (já que não existe como fazer algo parecido em 1 linha no Java).
PS: agora que fui prestar atenção direito nos comentários anteriores. Sem comentários a respeito de alguns…
Python gerou tanta polemica que fiquei ate com vontade de aprender =P
[]’s
ah muito bom o post, e a guerrinha de brinde
minha area nao é programação, mas um dia tentei aprender python….mas tbm parei no basiquissimo.
apesar de ser simples, acaba sendo meio “viajante” pra alguem de fora da area de computação…. eu por exemplo levaria um bom tempo pra compreender essa unica linha de codigo!
Bom, pelo menos o post está tendo bastante comentários.
Concordo com o amigo Trovalds ali em cima. A melhor é a que paga as contas no final do mês, por isso sou fã do C#… ;P
Estou retomando meus estudos de Python, alguém tem um bom livro pra indicar?
Inté!
python+pygtk eh a maneira mais simples de se fazer um programa grafico que conheço
e se usar wxwidgets o negocio fica totalmente portavel
MAS, nao gosto de programas muito complexos feitos em python, por exemplo o Exaile, tende a ficar lento
for(n=0;n<=20;n=n+2,printf(”%d “,n));
Essa meus alunos aprenderam na aula C
for (int i = 0; i < 21; i += 2) printf(“%d “, i); 37 chars
print [ x for x in range(21) if x % 2 == 0 ] 31 chars
Agora compare a velocidade de uma e de outra ;P
Como eu sei que ninguém ia comparar os tempos de execução, eu comparei:
murilo@blacksheep:~$ time python -c “print [ x for x in range(21) if x % 2 == 0 ]”
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
real 0m0.017s
user 0m0.008s
sys 0m0.008s
murilo@blacksheep:~$ time ./for
0 2 4 6 8 10 12 14 16 18 20
real 0m0.002s
user 0m0.000s
sys 0m0.000s
O de baixo é o for que disse acima compilado com o gnu g++.
Gente, tenham em mente: Golf é divertido, mas não é pra ser levado a sério (ou seja, não tente enfiar o máximo possível de código no mínimo de caracteres, a não ser por diversão).
Agora, no post em si, a idéia não é usar poucos caracteres, mas sim ser mais claro. Se lembrarem de teoria dos conjuntos, verão que
print [ x for x in range(21) if x % 2 == 0 ]
equivale a
{ x pertence a {0 … 20} | x = 0 (mod 2) }
Quanto ao Perl Golf, minha tacada é:
print join’, ‘,map$_*2,0..10
ou melhor ainda:
$,=’, ‘;print map$_*2,0..10
Aliás, se alguém quiser jogar esse tipo de golf na internet, seja em Perl, PHP, Python ou Ruby, sugiro o http://codegolf.com/ . Pena que meu score costuma ser o dobro dos piores (sendo que menor = melhor)
meu professor de sistemas distribuidos disse que tudo depende do Siqueira, as coisas ficam tão complicadas quanto siqueira
se queira, sacou? tah eu sei q foi sem graça =/
Æ!!
Ainda bem que postaram um de Ruby…heheheh…Eu já estava vindo aqui para postar tambem! =D
To com vontade de aprender Python tambem…Qualquer hora eu vou pegar para brincar um pouco.
Há braços
ihhh eu acho que o pessoal entendeu errado kkkkkkkk
Fazer códigos com menos elementos é uma característica comum de programadores de lingagens dinamicas, mas pq a linguagem dá ferramentas pra que vc faça isso de forma elegante
Além do mais todo mundo sabe que isso não importa, afinal. É apenas uma característica dos programadores ^^
Esses posts envolvendo mais de uma linguagem de programação, mais de um SO, mais um time de futebol, etc, sempre geram disputa… Se você juntar Hitler e Deus num único post, aposto que vai ter alguém para defender Hitler.
E que tal assim:
select *
from ( select case when mod(rownum,2) = 0 then rownum
end numero
from dual
connect by rownum < 20
) lista
where lista.numero is not null
SQL RULA!
Ops, no comentário anterior o operador relacional deveria ser <=, se não ele não vai considerar o 20.
Eu adorei a tira!
Para quem não foi iniciado ao conceito é bem interessante saber que existe uma forma mais natural, mesmo que não pareça a primeira vista, de gerar uma lista a partir de outra lista.
Legibilidade conta!
E para quem quer aprender Python, abrir a mente, eu recomendo o livro Dive Into Python, disponível gratuitamente na Internet.
No primeiro exemplo ele mostra list compreension, atribuição múltipla, etc. Mas distrincha tudo, linha a linha. E continua assim por todo o livro, vale a pena cada minuto investido lendo os exemplos.
Espero ter contribuído.. e sem guerra de linguagens, vamos respeitar as escolhas de cada um.
Hum… O que foi isso? Jabá de Python?
(Legal a tira… Mas como eu não manjo Python, então… Whatever.)
o/
E aí, Karlisson, você imaginou que *uma* inocente linha de Python fosse ser re-escrita de todas as formas diferentes? Até com comparações de performance! Putz…
Galera, o autor só quis dizer que Python é uma linguagem concisa e bonita, e é mesmo. Pronto! Podem continuar curtindo vossas linguagens e parar com as comparações!
for (int n = 0; n <= 20; n=n+2) printf(”%d “, n);
EM UMA LINHA!!!! =D
Python, a preguiça da programação! hehehe…, nunca mexi com essa linguagem, mas me surpreendo com o que ela pode fazer, porem a coisa que eu mais odeio no pythonianos são seus exemplos, de ficar mostrando que o intepretador também é uma calculadora!!! Grandes Porcaria hehe… Um dia eu estudo mais afundo Python… =), tambem gosto de facilidades! Pena que não é uma linguagem ainda reconhecida no mercado de trabalho, dificilmente vejo uma empresa trabalhar com python =(
código compacto != código simples, não confundam o artigo com o numeral.
eu quero é saber para onde foi parar a serie o “Ataque do bots assassinos”. Ele já tá sumindo ali da listagem…
Cara, não conhecia seu site. Mas que bom que encontrei. aisheuaise.
Taí um modo diferente de se aprender. Se mais livros fossem escritos assim, teríamos programadores melhores.
Sucesso pra ti!
Abraços
Maneiro. To aprendendo Python e acho que entendi o código.
x%2 exibe o resto da divisão né… E depois == 0 pergunta se o resto foi zero?
Acho que é isso mesmo.
Concordo com o Japa.
No meu caso eu prefiro usar o ‘for’, por ser muito mais legível para um programador que não conhece os detalhes da linguagem (no caso, Python).
Já que o ‘for’ é “universal”, seria minha opcão!
Saber escrever código compacto ou obscuro é bacana! Mas na hora de trabalhar quanto mais legível melhor
No Matlab, é só usar o comando
[0:2:20]
Mais simples ainda.
Na verdade dá pra escrever qualquer coisa em uma linha de Python, porque a linguagem continua Turing-complete mesmo com essa restrição. Coloquei uma demonstração disso no meu blog, pra quem quiser ver:
http://www.ricbit.com/2008/05/python-one-liners-so-turing-complete.html
[...] Infelizmente conheo muito pouco de Pearl pra falar. Um blog Nerd que fez uma tirinha sobre phyton Nerdson não vai * escola Pythonic way of life __________________ " If you choose not to decide, you still have made a choice." [...]
Paulino, certamente vc não está falando sério que o código ali é imcompreensível e coisa só de nerdson ou ainda que deveríamos reescrevê-lo em Java padrão, com javadoc e com diagramas de caso de uso?!
Pensando bem, não responda. Você sabe que mundo tá muito ferrado das idéias mesmo quando piadas por email vêm com a explicação entre parênteses ou palitos de dentes vêm com instruções de uso… não há mais salvação para a humanidade.
Boas tentativas, damnerd e ricardo, infelizmente não há realmente one-liner em C++, C#, Java ou outras mainstream, já que vc precisa criar um wrapper formal de programa para o compilador ficar feliz. Coisas como int main() {}; public static void Main() {} etc. Além dos imports usuais. É claro, sua IDE pode cuidar disso, mas não faz disso um one-liner.
Pior, vc não pode simplesmente usar o one-liner na linha-de-comando, que é o principal uso de one-liners, afinal…
Vai de cobol…
perform varying i from 2 by 2 until i > 20 display i.
Não tem if, mas tbm não é mágica!
Mais fácil ainda…
Bota seu irmão mais novo pra digitar pra vc! huhsuahsuahusuh
Digita ai mulek!
0 2 4 6 8 10 12 14 16 18 20 pronto!
Bem mais fácil! hehe
Pra quem não saca de programação é uma boa! rsrs