Ir para o conteúdo
ou

Software livre Brasil

Tela cheia
 Feed RSS

Blog

27 de Maio de 2009, 0:00 , por Software Livre Brasil - | Ninguém está seguindo este artigo ainda.

Python 101: O Operador Ternário

30 de Maio de 2013, 0:00, por Software Livre Brasil - 0sem comentários ainda

Este texto é uma tradução livre do post “Python 101: The Ternary Operator“, escrito por Mike Driscoll. A licença permanece a mesma especificada pelo autor.

Existem várias linguagens que permitem o uso do operador ternário (ou terciário), que, em Python, consiste basicamente de uma expressão condicional de apenas uma linha. Se você estiver interessado, poderá ler na Wikipédia sobre como isso é feito em outras linguagens. Aqui iremos dar uma olhada em vário exemplos, também iremos discutir o porque de você querer usar esse operador na vida real.

Eu me lembro de ter usado o operador ternário em C++, onde ele é representado pelo simbolo de interrogação. E pesquisei um pouco e encontrei alguns bons exemplos em uma pergunta e resposta do StackOverflow e que também menciona o exemplo da `Wikipédia`_. Vamos ver alguns deles e como funcionam. Aqui está um dos exemplos mais simples:

x = 5
y = 10
result = True if x > y else False

Este código é basicamente lido da seguinte maneira: O resultado será True se x for maior que y, caso contrário o resultado será False. Para ser honesto, isso me lembra um pouco dos blocos condicionais do Microsoft Excel. Algumas pessoas são contra essa forma, mas isto é o que a documentação oficial do Python usa.

O código a seguir mostra como você escreveria a instrução acima utilizando uma instrução normal:

    x = 5
    y = 10

    if x > y:
        print "True"
    else:
        print "False"

Veja que você economiza 3 linhas de código por utilizar o operador ternário. Sendo assim, você pode querer utilizar esta estrutura, a versão ternária, quando está iterando sobre um conjunto de arquivos e quer filtrá-los em algumas seções ou linhas.

Para o nosso próximo exemplo, iremos iterar sobre alguns número e checar se eles são pares ou ímpares:

    for i in range(1, 11):
        x = i % 2
        result = "Odd" if x else "Even"
        print "%s is %s" % (i, result)

Você ficaria surpreso com a frequência que somos lembrados da estrutura de divisão. Esta é uma maneira de determinar se um número é par ou ímpar. No link do StackOverflow mencionado anteriormente, tem uma parte interessante do código que é mostrado como exemplo pelas pessoas que ainda usam Python 2.4 ou anteriror:

    # (falseValue, trueValue)[test]
    >>> (0, 1)[5>6]
    0

    >>> (0, 1)[5<6]
    1

Este código é bem feio, mas funciona. Ele indexa uma tupla o que certamente é um truque, mas não deixa de ser interessante. Claro, ele não é tão diferente do que vimos anteriormente, e ambos os valores são avaliados. Você pode até usá-lo, mas vai ter obter uma quantidade única de erros por fazer dessa maneira onde True é False e vice-versa, portanto eu não a recomendaria.

Existem várias outras maneiras de usar o ternário em Python com funções lambda. Aqui está um exemplo mostrado na Wikipédia:

    def true():
          print "true"
          return "truly"
    def false():
          print "false"
          return "falsely"

    func = lambda b,a1,a2: a1 if b else a2
    func(True, true, false)()

    func(False, true, false)()

Este é um código mais arrojado, principalmente se você não sabe como as funções lambdas funcionam. Basicamente, uma lambda é uma função anônima. Aqui criamos duas funções normais e uma lambda. Então podemos chamá-la com um booleano True e um False. Na primeira chamada, ela é lida assim: chama a função true se o booleano é True, e então chama a função false. A segunda é um pouco mais confusa pois parece dizer para chamar o método true se o booleano for False, quando na verdade está dizendo que irá chamar o método false apenas se b é False. É, eu acho isso um pouco confuso também.

Conclusão

Existem vários outros exemplos de operadores ternários na seção de “Leitura Adicional” que está abaixo, mas até aqui você já deve ter entendido como usar e talvez quando usá-lo. Eu uso esta metodologia quando eu sei que tenho apenas uma condicional True/False e preciso economizar umas linhas de código. Entretanto, frequentemente eu uso a maneira explicita pois sei que depois terei de fazer alguma manutenção no código e então não quero me deparar com esse tipo de coisa estranha a todo tempo. Mas é claro, a escolha é sua.

Leitura Adicional




Eclipse Icons Bug on Kubuntu 12.10

3 de Fevereiro de 2013, 0:00, por Software Livre Brasil - 0sem comentários ainda

It’s ironic but, seems that Gtk is not so friendly at KDE (or even Linux) ambient.

On these days I tried to use the Eclipse IDE with WindowBuilder plugin. The installation of WindowBuilder was really easy and Eclipse looks work softly, unlike Netbeans.

Some tests later, the WindowBuilder’s Palette doesnt appear anymore. Look the dock at left side.eclipse_no_paletteSome searches later, I found this bug report. Seems that Gtk doesnt work well at Linux? Its a kind of strange bug. But someone suggested insert into eclipse.ini file, those lines:

-Dorg.eclipse.swt.internal.gtk.cairoGraphics=false
-Dorg.eclipse.swt.internal.gtk.useCairo=false

So, I put tem at the end of that file. Here its located /usr/lib/eclipse/.
That suggestion perfectly worked, now Eclipse is perfect! Even the toolbar icons now are ok.

eclipse_no_palette_ok




VX Tool 5k

5 de Novembro de 2012, 0:00, por Software Livre Brasil - 0sem comentários ainda

Fist, for who doesnt know, “VX” means “Virus eXchange”.

VXTool5k is a tool that I’m working on to sort my cumputer virus collection.
The first ideas are in the mind map…

This mind map was made using Astah* Professional.




Python – Drag n’ Drop com Tkinter

5 de Outubro de 2012, 0:00, por Software Livre Brasil - 0sem comentários ainda

Este exemplo mostra como fazer “drag n’ drop” (arrastar e soltar) utilizando o canvas do Tkinter e alguns elementos gráficos.

Todo o código foi encontrado na internet.

import Tkinter as tk

class SampleApp(tk.Tk):
    '''Illustrate how to drag items on a Tkinter canvas'''

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        # create a canvas
        self.canvas = tk.Canvas(width=400, height=400)
        self.canvas.pack(fill="both", expand=True)

        # this data is used to keep track of an 
        # item being dragged
        self._drag_data = {"x": 0, "y": 0, "item": None}

        # create a couple movable objects
        self._create_token((100, 100), "white")
        self._create_token((200, 100), "black")

        # add bindings for clicking, dragging and releasing over
        # any object with the "token" tag
        self.canvas.tag_bind("token", "<ButtonPress-1>", self.OnTokenButtonPress)
        self.canvas.tag_bind("token", "<ButtonRelease-1>", self.OnTokenButtonRelease)
        self.canvas.tag_bind("token", "<B1-Motion>", self.OnTokenMotion)

    def _create_token(self, coord, color):
        '''Create a token at the given coordinate in the given color'''
        (x,y) = coord
        self.canvas.create_oval(x-25, y-25, x+25, y+25, 
                                outline=color, fill=color, tags="token")

    def OnTokenButtonPress(self, event):
        '''Being drag of an object'''
        # record the item and its location
        self._drag_data["item"] = self.canvas.find_closest(event.x, event.y)[0]
        self._drag_data["x"] = event.x
        self._drag_data["y"] = event.y

    def OnTokenButtonRelease(self, event):
        '''End drag of an object'''
        # reset the drag information
        self._drag_data["item"] = None
        self._drag_data["x"] = 0
        self._drag_data["y"] = 0

    def OnTokenMotion(self, event):
        '''Handle dragging of an object'''
        # compute how much this object has moved
        delta_x = event.x - self._drag_data["x"]
        delta_y = event.y - self._drag_data["y"]
        # move the object the appropriate amount
        self.canvas.move(self._drag_data["item"], delta_x, delta_y)
        # record the new position
        self._drag_data["x"] = event.x
        self._drag_data["y"] = event.y

if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()



Python – Tk Hello World

29 de Setembro de 2012, 0:00, por Software Livre Brasil - 0sem comentários ainda

Exemplo de uso do Tkinter, biblioteca gráfica incorporada ao Python.
Esse exemplo foi retirado desse site e adaptado para o Python 3.

Uma boa fonte de referência Tkinter é o TkDocs.

from tkinter import *

class App:

    def __init__(self, master):

        frame = Frame(master)
        frame.pack()

        self.button = Button(frame, text="QUIT", fg="red", command=frame.quit)
        self.button.pack(side=LEFT)

        self.hi_there = Button(frame, text="Hello", command=self.say_hi)
        self.hi_there.pack(side=LEFT)

    def say_hi(self):
        print ("hi there, everyone!")

root = Tk()

app = App(root)

root.mainloop()

Não sei o que acontece no Kubuntu 12.04, pois mesmo executando um código com a versão 3 do Python, o que obtenho é a mesma janela feia do Python 2.