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[bb] 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.


PythonPara saber mais sobre Python recomendo o PythonBrasil.

Além disso, sou professor do Curso de Python da Visie.

Publicado por

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.

14 comentários em “Python X Java X Smalltalk”

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

  2. 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();

  3. //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

  4. 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”)

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *