Python X Java X Smalltalk

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.

Elcio: Elcio é sócio fundador da Visie Padrões Web. Pioneiro no uso e divulgação dos padrões do W3C no Brasil, Elcio já treinou equipes de dezenas de empresas como Globo.com, Terra, Petrobras, iG e Locaweb. Além disso, tem dirigido as equipes da Visie no desenvolvimento de projetos web para marcas como Brastemp, Itaú Unibanco, Johnson & Johnson e Rede Globo.

View Comments (13)

  • 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.

  • 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

  • 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! :D

    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