Achei muito interessante este artigo comparando a sintaxe de Smalltalk com Java. Implementei os mesmos exemplos em Python, para que você possa comparar a sintaxe:
Problema: cálculo de fatorial
def factorialRecursive(n): if n<0:return 0 if n==0:return 1 return n*factorialRecursive(n-1)
Ou assim:
def factorialNonRecursive(n): if n<0:return 0 return reduce(lambda a,b:a*b,[1]+range(1,n+1))
A recursividade pode parecer uma solução elegante, mas o consumo de memória é assombroso nesse caso, em qualquer linguagem. Calcular a fatorial de um número grande qualquer pode ser um problema com a recursividade. Por isso, prefira a versão não recursiva.
No novo Python 2.5 você pode fazer:
def fact(x): return ( 0 if x<0 else reduce(lambda a,b:a*b,[1]+range(1,x+1)) )
Aqui é difícil dizer qual é mais prática, Smalltalk ou Python. Você pode palpitar sobre qual é mais elegante, uma vez que as soluções são radicalmente diferentes, mas a escolha final é subjetiva.
Problema: imprimir os números de 1 a 10
Eu faria usando os recursos de programação funcional:
print "\n".join(map(str,range(1,11)))
Mas você pode preferir:
for i in range(1,11): print i
De qualquer maneira, ponto para o Python aqui.
Problema: trabalhando com Collections
l=[ 'Em Python,', 'chamamos as', 'collections', 'de "listas"', ] print "\n".join(l)
Aqui, indiscutivelmente, ponto para o Python.
Problema: mostrar os pares e ímpares entre 1 e 10
for i in range(1,11): print i,["is even","is odd"][i % 2]
Novamente, o Python ganha disparado.
Problema: invocar um método via Reflection
É bem fácil:
o=MyClass() getattr(o,"showMessage")()
Aqui o páreo é duro, Python e Smalltalk correm cabeça-a-cabeça. Na minha opinição, Python ganha por um focinho.
Para saber mais sobre Python recomendo o PythonBrasil.
Além disso, sou professor do Curso de Python da Visie.
Uma maneira mais prática ainda de se imprimir e criar um array já populado de 0 à 10 seria:
print [ x for x in range(10)]
=)
Muito bom o teu POST.
É interessante ver as coisas boas de uma linguagem com uma sintaxe moderna. 🙂
Tanto faz os exemplos em PHP, Phyton, Ruby, Lua, … eles são superiores aos feitos em Java, C#, …
Uso PHP, pelos tipos de sistemas que desenvolvo, onde o PHP é a melhor alternativa na minha opinião, mas em outros casos o Phyton e o Ruby são as melhores alternativas.
não tem como mandar certo… da errado o post
Saiu errado emcima
— FATORIAL ————————
function factorial($n) {
if ($n 1) $t *= $n–;
return $t;
}
Usando PHP:
— FATORIAL ————————
function factorial($n) {
if ($n 1) $t *= $n–;
return $t;
}
— LISTAR NUMEROS —————–
foreach(range(0, 10) as $n)
echo $n;
— Collections ——————–
$l = array (
‘Em PHP,’,
‘chamamos as’,
‘collections’,
‘de “arrays”‘,
);
echo implode($l, “\n”);
— ODD/EVEN ————————
foreach(range(0, 10) as $n)
echo (1 & $n) ? “$n is odd, ” : “$n is even, “;
— Reflection ———————
$o = new ReflectionClass(‘MyClass’);
$o->newInstance()->showMessage();
//for i in range(1,11):
// print i,[“is even”,”is odd”][i % 2]
Eu levaria tres horas pra pensar nisso!
Por isso q eu adoro python: sempre uma surpresa… hehehhe
O código não saiu do jeito que eu escrevi, hehehe.
Em Ruby:
# FATORIAL RECURSIVO
def fatorial(n)
return 0 if n [“Ruby”, “eats”, “Python”, “up”]
puts a.join(“\n”)
# EVEN/ODD DE 1 A 10
1.upto(10) do |n|
puts “#{n} é ” + (n % 2 == 0 ? “par” : “ímpar”)
end
# MENSAGEM VIA REFLECTION
o = MyClass.new
o.send(“say_hello”)
Existe essa outra forma também:
getattr(o,”showMessage”).__call__()
Quem sabe eu me animo pra mostrar uns exemplos em Lua?
Ahh, assim não vale! Tu é professor de Python! 😀
Muito legais os códigos, especialmente o que faz o cálculo de fatorial (o não-recursivo).
No mais, parabéns pelo blog. Muito bom!
[]s
Guilherme, Davis,
Vocês podiam mandar alguns dos exemplos em PHP e .Net para a gente comparar, né?
ASP.Net (C# ou VB.Net)! 😀
Mas é sempre bom saber outras coisas. 😉
Abraços!
Python é realmente uma linguagem muito interessante, mas eu, pelo menos para web ainda gosto mais do PHP, mesmo não parecendo tão bonito ^^
[]’s