<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-38524186</id><updated>2011-11-15T20:09:19.123-03:00</updated><category term='Tecnologia'/><category term='Software'/><category term='Eventos'/><category term='Outros'/><category term='Python'/><category term='PyGame'/><category term='PyGTK'/><category term='MySQL'/><category term='Linux'/><title type='text'>def Python():</title><subtitle type='html'>Linguagem de programação Python, algumas dicas rápidas. E novidades sobre tecnologia.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>29</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-38524186.post-7584824349913642580</id><published>2008-01-15T18:46:00.000-03:00</published><updated>2008-01-15T18:53:47.669-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Outros'/><title type='text'>Novo Blog</title><content type='html'>&lt;span style="font-size:100%;"&gt;Terminei hoje meu novo blog: &lt;a href="http://www.igorsobreira.com"&gt;www.igorsobreira.com&lt;/a&gt;, portanto não vou mais atualizar esse aqui.&lt;br /&gt;&lt;br /&gt;O novo feed é esse &lt;a href="http://www.igorsobreira.com/feeds/blog/"&gt;aqui.&lt;/a&gt; E o feed somente da &lt;a href="http://www.igorsobreira.com/feeds/categoria/python/"&gt;categoria python &lt;/a&gt;(ainda não tem nada :P). Aguardo a visita de vocês....&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-7584824349913642580?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/7584824349913642580/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=7584824349913642580' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/7584824349913642580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/7584824349913642580'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2008/01/novo-blog.html' title='Novo Blog'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-6735996416153475976</id><published>2007-12-20T08:11:00.000-03:00</published><updated>2007-12-20T08:22:55.126-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Tela preta na inicialização do Ubuntu Gutsy</title><content type='html'>&lt;span style="font-size:90%;"&gt;Quando instalei meu Ubuntu Gutsy ele tava com um bug meio chato, quando inicializava não aparecia a famosa logo do com a barrinha carregando, mas ficava tela preta por bastante tempo, até aparecer a tela de login. Então eu simplesmente apertava ALT + F1, e ali em modo texto ele inicializava mais rápido.&lt;br /&gt;&lt;br /&gt;Mas um dia desses decidi procurar resolver isso, e é realmente bem simples (na verdade o primeiro resultado no google :-) ). Primeiro é preciso editar o arquivo usplash.conf:&lt;br /&gt;&lt;br /&gt;sudo gedit /etc/usplash.conf&lt;br /&gt;&lt;br /&gt;que provavelmente deve estar assim&lt;br /&gt;&lt;br /&gt;# Usplash configuration file&lt;br /&gt;xres=1280&lt;br /&gt;yres=1024&lt;br /&gt;&lt;br /&gt;e no meu caso, com tela de 15'4'', eu atualizei pra isso&lt;br /&gt;&lt;br /&gt;# Usplash configuration file&lt;br /&gt;xres=1280&lt;br /&gt;yres=800&lt;br /&gt;&lt;br /&gt;depois basta atualizar o tema, que é o simbolo do Ubuntu e a barrinha carregando&lt;br /&gt;&lt;br /&gt;sudo update-usplash-theme usplash-theme-ubuntu&lt;br /&gt;&lt;br /&gt;e pronto!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-6735996416153475976?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/6735996416153475976/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=6735996416153475976' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/6735996416153475976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/6735996416153475976'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/12/tela-preta-na-inicializao-do-ubuntu.html' title='Tela preta na inicialização do Ubuntu Gutsy'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-3965376781898556390</id><published>2007-12-12T23:48:00.000-03:00</published><updated>2007-12-12T23:57:11.005-03:00</updated><title type='text'>Renomear arquivos</title><content type='html'>&lt;span style="font-size:90;"&gt;Surgiu a pouco a necessidade de renomear todas imagens de uma pasta, so adicionar um termo no início do nome. E nada como um script em Python pra facilitar sua vida:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85;"&gt;&lt;pre&gt;&lt;br /&gt;import os&lt;br /&gt;&lt;br /&gt;for nome in os.listdir('.'):&lt;br /&gt; novo_nome = 'MEET_' + nome&lt;br /&gt; os.rename(nome, novo_nome)&lt;br /&gt;print 'OK'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-3965376781898556390?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/3965376781898556390/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=3965376781898556390' title='8 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/3965376781898556390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/3965376781898556390'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/12/renomear-arquivos.html' title='Renomear arquivos'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-6827426738293605650</id><published>2007-12-05T09:47:00.000-03:00</published><updated>2008-01-17T10:42:02.081-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Outros'/><title type='text'>Configurando o Gedit</title><content type='html'>&lt;span style="font-size:90;"&gt;Gosto de usar o Gedit pra programar, inicialmente ele parece ser bem simples, mas pode-se adicionar alguns plugins, basta ir em Edit -&gt; Preferences -&gt; Plugins e escolher. Também tem um pacote no apt-get, o gedit-plugins, que trás alguns adicionais, como &lt;/span&gt;&lt;span style="font-style: italic;font-size:90;" &gt;auto-completa&lt;/span&gt;&lt;span style="font-size:90;"&gt; de chaves, parêntesis, aspas, etc, comentário de um bloco de comandos. Mas &lt;a href="http://live.gnome.org/Gedit/Plugins"&gt;aqui&lt;/a&gt; tem vários outros bem interessantes, principalmente pra quem programa em Python.&lt;br /&gt;&lt;br /&gt;Um bem legal é o &lt;a href="http://live.gnome.org/Gedit/PythonOutlinePlugin"&gt;Python Outline&lt;/a&gt;, que mostra todo o &lt;/span&gt;&lt;span style="font-style: italic;font-size:90;" &gt;outline&lt;/span&gt;&lt;span style="font-size:90;"&gt; do código no painel lateral. Outro interessante é o &lt;a href="http://live.gnome.org/Gedit/Plugins/BetterPythonConsole"&gt;Better Python Console&lt;/a&gt;, que permite executar o código Python apertando f5, como no IDLE.&lt;br /&gt;&lt;br /&gt;Quem é desenvolvedor web, vai gostar do &lt;a href="http://my.opera.com/area42/blog/gedit-browser-preview-plugin"&gt;Browser Preview&lt;/a&gt;. Tem  o &lt;a href="http://guichaz.free.fr/misc/"&gt;Word Completion&lt;/a&gt;, que permite auto-completa de palavras que já foram digitadas no documento. O ideal seria ele mostrar os métodos e atributos do objeto, mas esse ainda está na seção de "Requested Plugins", assim como um Debugger pra Python.&lt;br /&gt;&lt;br /&gt;É bem fácil instalar novos plugins, normalmente é um arquivo .py e um .gedit-plugin, basta copiá-los para o diretório /usr/lib/gedit-2/plugins e reiniciar o Gedit. Pronto, é so escolher e usar.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;UPDATE&lt;br /&gt;Esse &lt;a href="http://www.micahcarrick.com/09-29-2007/gedit-html-editor.html"&gt;artigo&lt;/a&gt; tem umas dicas legais também&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-6827426738293605650?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/6827426738293605650/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=6827426738293605650' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/6827426738293605650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/6827426738293605650'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/12/configurando-o-gedit.html' title='Configurando o Gedit'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-341934265906715630</id><published>2007-12-02T16:42:00.000-03:00</published><updated>2007-12-02T16:56:08.336-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Enviando e-mails com smtplib</title><content type='html'>&lt;span style="font-size:90;"&gt;O protocolo &lt;a href="http://www.ietf.org/rfc/rfc2821.txt"&gt;SMTP&lt;/a&gt; é utilizado para enviar e-emails. E Python possui um módulo embutido, o &lt;a href="http://docs.python.org/lib/module-smtplib.html"&gt;smtplib,&lt;/a&gt; que facilita o envio de e-mails utilizando esse protocolo, e é bem facil de usar:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; import smtplib&lt;br /&gt;&gt;&gt;&gt; server = smtplib.SMTP('gmail-smtp-in.l.google.com', 25)&lt;br /&gt;&gt;&gt;&gt; para = 'v2.igor@gmail.com'&lt;br /&gt;&gt;&gt;&gt; de = 'ninguem@nada.com'&lt;br /&gt;&gt;&gt;&gt; msg = '''&lt;br /&gt;... From: ninguem@nada.com&lt;br /&gt;... To: v2.igor@gmail.com&lt;br /&gt;... Subject: Nao eh nada nao&lt;br /&gt;... Aqui eh o corpo da mensagem&lt;br /&gt;... '''&lt;br /&gt;&gt;&gt;&gt; server.sendmail(de, para, msg)&lt;br /&gt;{}&lt;br /&gt;&gt;&gt;&gt; server.close()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;A classe SMTP do módulo smtplib serve para se conectar com um servidor de e-mails, caso você tenha um servidor de email rodando localmente, basta usar "localhost". E 25 é a porta padrão do SMTP.&lt;br /&gt;&lt;br /&gt;A mensagem de e-mail tem um formato padrão que está definido &lt;a href="http://www.faqs.org/rfcs/rfc822.html"&gt;aqui.&lt;/a&gt; Mas os campos mais comuns são:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;b&gt;To:&lt;/b&gt; E-mail dos destinatários&lt;br /&gt;&lt;b&gt;Cc:&lt;/b&gt; E-mail das pessoas que devem receber uma cópia da menssagem&lt;br /&gt;&lt;b&gt;From:&lt;/b&gt; E-mail do criador da mensagem&lt;br /&gt;&lt;b&gt;Subject:&lt;/b&gt; Assunto da mensagem&lt;br /&gt;&lt;b&gt;Date:&lt;/b&gt; Data e hora em que a mensagem foi enviada&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Como se pode perceber, o cabeçalho das mensagens fica no formato Chave: valor... O unico dado que não tem uma chave é o corpo da mensagem em si. A classe Message do módulo email ajuda a formatar essa mensagem:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; from email.Message import Message&lt;br /&gt;&gt;&gt;&gt; msg = Message()&lt;br /&gt;&gt;&gt;&gt; msg['Subject'] = 'Assunto do email'&lt;br /&gt;&gt;&gt;&gt; msg.set_payload('Aqui eh o corpo da mensagem')&lt;br /&gt;&gt;&gt;&gt; print msg&lt;br /&gt;From nobody Sun Dec  2 16:29:56 2007&lt;br /&gt;Subject: Assunto do email&lt;br /&gt;&lt;br /&gt;Aqui eh o corpo da mensagem&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Os valores do cabeçalho podem ser adicionados como na sintaxe de um dicionário do Python, e o método set_payload() serve para adicionar a mensagem.&lt;br /&gt;&lt;br /&gt;Ah, e caso no exemplo acima o email não chegue na sua caixa de entrada do gmail, não se esqueça de verificar nos "Spams".&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-341934265906715630?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/341934265906715630/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=341934265906715630' title='7 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/341934265906715630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/341934265906715630'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/12/enviando-e-mails-com-smtplib.html' title='Enviando e-mails com smtplib'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-4431967755418595125</id><published>2007-11-28T12:18:00.000-03:00</published><updated>2007-11-28T12:59:19.669-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Lendo e-mails do Gmail</title><content type='html'>&lt;span style="font-size:90%;"&gt;Estava dando uma olhada no módulo &lt;a href="http://docs.python.org/lib/module-smtplib.html"&gt;smtplib&lt;/a&gt; do Python, então lembrei que li a um tempo atrás sobre um módulo pra ler emails do gmail, é a &lt;a href="http://libgmail.sourceforge.net/"&gt;libgmail.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tem outro módulo pra isso, é o &lt;a href="http://www.holovaty.com/blog/archive/2004/06/18/1751"&gt;gmail.py&lt;/a&gt;, mas quando eu fui testar recebi um erro de login :/ .&lt;br /&gt;&lt;br /&gt;Outro detalhe é que eu baixei o libgmail pelo apt-get, e também tive problemas na hora do login, mas com a ultima versão pelo site do projeto deu certo.&lt;br /&gt;&lt;br /&gt;É realmente bem simples de usar:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; import libgmail&lt;br /&gt;&gt;&gt;&gt; ac = libgmail.GmailAccount('v2.igor@gmail.com', 'senha')&lt;br /&gt;&gt;&gt;&gt; ac.login()&lt;br /&gt;&gt;&gt;&gt; inbox = ac.getMessagesByLabel('Inbox')&lt;br /&gt;&gt;&gt;&gt; len(inbox)&lt;br /&gt;100&lt;br /&gt;&gt;&gt;&gt; for msg in inbox:&lt;br /&gt;...     print msg.subject&lt;br /&gt;...&lt;br /&gt;[ ... ]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Fica ai a dica.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-4431967755418595125?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/4431967755418595125/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=4431967755418595125' title='9 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/4431967755418595125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/4431967755418595125'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/11/lendo-e-mails-do-gmail.html' title='Lendo e-mails do Gmail'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-4124249745645300495</id><published>2007-10-19T01:45:00.000-03:00</published><updated>2007-10-19T01:57:37.508-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Esperando um pouco por uma função</title><content type='html'>Navegando randomicamente pela web, acabei esbarrando numa classe do módulo &lt;a href="http://docs.python.org/lib/module-threading.html"&gt;threading&lt;/a&gt;(pretendo fazer um post sobre Threads breve) que é bem legal. Passamos um tempo para que uma função(callable) seja chamada. Com um exemplo fica mais fácil:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; from threading import Timer&lt;br /&gt;&gt;&gt;&gt; def ola():&lt;br /&gt;...     print 'ola!'&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; t = Timer(5, ola)&lt;br /&gt;&gt;&gt;&gt; t.start()   #espera 5 segundos&lt;br /&gt;&gt;&gt;&gt; ola!&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Depois de criado o objeto Timer(), chamamos seu método start() para começar a esperar. Caso precise parar no meio da espera, tem o método cancel(), além de vários outros....&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; dir(t)     &lt;br /&gt;['_Thread__args', '_Thread__block', '_Thread__bootstrap', '_Thread__daemonic', '_Thread__delete', '_Thread__exc_info', '_Thread__initialized', '_Thread__kwargs', '_Thread__name', '_Thread__started', '_Thread__stderr', '_Thread__stop', '_Thread__stopped', '_Thread__target', '_Verbose__verbose', '__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', '_note', '_set_daemon', 'args', 'cancel', 'finished', 'function', 'getName', 'interval', 'isAlive', 'isDaemon', 'join', 'kwargs', 'run', 'setDaemon', 'setName', 'start']&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Leia mais &lt;a href="http://docs.python.org/lib/timer-objects.html"&gt;aqui&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-4124249745645300495?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/4124249745645300495/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=4124249745645300495' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/4124249745645300495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/4124249745645300495'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/10/esperando-um-pouco-por-uma-funo.html' title='Esperando um pouco por uma função'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-3586626165078266612</id><published>2007-10-17T21:35:00.000-03:00</published><updated>2007-10-17T21:58:45.551-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Esperando o Ubuntu 7.10</title><content type='html'>&lt;span style="font-size:90;"&gt;A partir de amanhã a nova versão do &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt;, o 7.10(Gutsy Gibbon), que trará várias &lt;a href="http://www.ubuntu.com/testing/710rc"&gt;vantagens&lt;/a&gt;, estará disponível para download.&lt;br /&gt;&lt;br /&gt;Fiz um programinha pra esperar a alteração da página dos downloads...taí pra quem quiser começar a baixar assim que sair(como eu :P) &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-size:88;"&gt;&lt;br /&gt;#-*- coding: utf-8 -*-&lt;br /&gt;&lt;br /&gt;# esperando o lançamento do Ubuntu 7.10  :-)&lt;br /&gt;&lt;br /&gt;from urllib import urlretrieve, urlopen&lt;br /&gt;from os import system&lt;br /&gt;from time import sleep&lt;br /&gt;from sys import exit&lt;br /&gt;&lt;br /&gt;def save_old():&lt;br /&gt;    '''Salva a pagina atual do site de downloads'''&lt;br /&gt;    print 'salvando pagina antiga'&lt;br /&gt;    urlretrieve('http://br.releases.ubuntu.com/7.10/','UBUNTU.html')&lt;br /&gt;    print 'pagina antiga salva'&lt;br /&gt;&lt;br /&gt;def espera():&lt;br /&gt;    '''Entra na pagina a cada 10 min, e verifica se a pagina mudou'''&lt;br /&gt;    try:&lt;br /&gt;        old = open('UBUNTU.html').read()&lt;br /&gt;    except IOError:&lt;br /&gt;        print 'Eh preciso salvar a pagina na primeira vez...'&lt;br /&gt;        exit(0)&lt;br /&gt;        &lt;br /&gt;    while True:&lt;br /&gt;        print 'vamos verificar'&lt;br /&gt;        new = urlopen('http://br.releases.ubuntu.com/7.10/').read()&lt;br /&gt;        if new != old:&lt;br /&gt;            system('firefox http://br.releases.ubuntu.com/7.10/')&lt;br /&gt;            print 'SAIUUUU!!!!'&lt;br /&gt;            exit(0)&lt;br /&gt;        print 'Ainda nao foi dessa vez...'&lt;br /&gt;        sleep(600)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;opcao = raw_input('Salvar a pagina atual para comparacao(s/n): ').lower()&lt;br /&gt;if opcao != 's' and opcao != 'n':&lt;br /&gt;    print 'Opcao invalida'&lt;br /&gt;    exit(0)&lt;br /&gt;if opcao == 's':&lt;br /&gt;    save_old()&lt;br /&gt;    espera()&lt;br /&gt;else:&lt;br /&gt;    espera()&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-3586626165078266612?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/3586626165078266612/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=3586626165078266612' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/3586626165078266612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/3586626165078266612'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/10/esperando-o-ubuntu-710.html' title='Esperando o Ubuntu 7.10'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-2062705843077209237</id><published>2007-07-14T12:32:00.000-03:00</published><updated>2007-07-14T13:09:51.863-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PyGame'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Mini-Aulas PyGame (parte 1)</title><content type='html'>&lt;span style="font-size:90;"&gt;&lt;br /&gt;&lt;blockquote&gt;Tutorial enviado por &lt;a href="www.flavioribeiro.com"&gt;Flavio Ribeiro&lt;/a&gt;.&lt;br /&gt;Para enviar o seu, mande para o email no perfil ao lado&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Olá, hoje vou introduzir poucos conceitos que aprendi pra desenvolver games usando &lt;a href="http://www.pygame.org"&gt;pygame&lt;/a&gt;. Vou fazer um pequeno joguinho onde uma nave se move na tela e dá tiros. No fim falo mais sobre esse 'jogo'.&lt;br /&gt;&lt;br /&gt;1. Antes de mais nada, instale o pygame. Observe que se você usar alguma distro debian-based, basta um apt-get install python-pygame que ele dá conta do resto. Não sei em outros gerenciadores de pacotes (yum, emerge, etc) mas se não conseguirem usa-los, basta fazer download do &lt;a href="http://www.pygame.org/ftp/pygame-1.7.1release.tar.gz"&gt;tarball&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;2. Teste se já tá funcionando importando no interpretador python:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;root@nerdy:/# python&lt;br /&gt;Python 2.5.1 (r251:54863, May  2 2007, 16:56:35)&lt;br /&gt;[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2&lt;br /&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;br /&gt;&gt;&gt;&gt; import pygame&lt;br /&gt;&gt;&gt;&gt;&lt;br /&gt;&lt;/code&gt;&gt;&lt;br /&gt;Se o interpretador não chiar, estamos prontos.&lt;br /&gt;&lt;br /&gt;3. Vamos agora fazer nosso 'joguinho'. Comece importando os módulos necessários:&lt;br /&gt;import pygame, sys,os&lt;br /&gt;from pygame.locals import *&lt;br /&gt;&lt;br /&gt;__obsnãomuitoimportante__: O sys e os vou mostrar porque importei mais na frente, já o pygame.locals eu importei trazendo pro namespace pra economizar digitação.&lt;br /&gt;&lt;br /&gt;4. Inicialize o pygame usando o metodo init():&lt;br /&gt;&lt;code&gt;&lt;br /&gt;pygame.init()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;5. Agora sim, vamos por a mão na massa. Sete o tamanho da telinha do seu jogo e o título (que vai ficar na barrinha):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;window = pygame.display.set_mode((200, 200))&lt;br /&gt;pygame.display.set_caption('Meu primeiro jogo!')&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;6. Sete as váriaveis que vamos usar. Duas que indicarão a posição da nave (x_position e y_position), uma (step) que indica quantos pixels nossa nave vai se mexer quando o usuário apertar pros lados, e outra (shotspeed) que indica a velocidade do tiro.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;global x_position, y_position, step&lt;br /&gt;x_position, y_position = 50,100&lt;br /&gt;step = 5&lt;br /&gt;shotspeed = 1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;obs_importante: O global indica que modificaremos os valores dessas variáveis dentro de funções. Para saber mais clique &lt;a href="http://www.pythonbrasil.com.br/moin.cgi/PerguntasFrequentes/SobreProgramacao#head-a26d9a58f2f431eb0b63f68795dae95a39448642"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;7. Hora de 'carregar' nossas imagens. Aqui vou carregar o background, a nave e a imagem do tiro ok? Primeiro passo o endereço completo de onde a imagem se encontra (tá aí o os sendo usado!), depois dou um pygame.image.load pra carregar a imagem em uma instância.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;background_draw = os.path.join("/home/bioinfo/pygame/mygames","tile3.png")&lt;br /&gt;background = pygame.image.load(background_draw)&lt;br /&gt;&lt;br /&gt;ship_draw = os.path.join("/home/bioinfo/pygame/mygames","nave.png")&lt;br /&gt;ship = pygame.image.load(ship_draw)&lt;br /&gt;&lt;br /&gt;shot_draw = os.path.join("/home/bioinfo/pygame/mygames","tiro.png")&lt;br /&gt;shot = pygame.image.load(shot_draw)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;8. Pra que o background e a nave apareça na tela é necessário que você desenhe (blit) ele. Mas não é só isso, tudo que você for desenhar ou atualizar no pygame você precisa atualizar (flip) a tela.  No blit() você passa como argumentos a instância do pygame.image.load e a posição em coordenadas de pixels.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;window.blit(background, (0,0)) # Desenha o background na tela. O background tem o mesmo tamanho setado por nós no passo 5)&lt;br /&gt;window.blit(ship, (x_position,y_position)) # Desenha a nave&lt;br /&gt;pygame.display.flip() # Recarrega a janela&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;9. Pronto, agora o que precisamos é de um laço infinito recebendo todos os eventos do gamer (aperta botão K, aperta botão SPACE, clica com o botão direito do mouse, etc...), e o pygame é bem eficiente nisso. Tudo que você precisa fazer é:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;while True:&lt;br /&gt; events = pygame.event.get()&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;O pygame.event.get() está atribuinto a variavel events uma lista com os eventos que estão acontecendo. Então, quando essa lista não for vazia, alguem apertou ou moveu algo. Vamos tratar esse evento!&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt; for event in events:&lt;br /&gt;     if event.type == KEYDOWN and event.key == K_LEFT:&lt;br /&gt;         x_position -= step&lt;br /&gt;         window.blit(background, (0,0))&lt;br /&gt;         window.blit(ship, (x_position,y_position))&lt;br /&gt;         pygame.display.flip()&lt;br /&gt; &lt;br /&gt;     if event.type == KEYDOWN and event.key == K_RIGHT:&lt;br /&gt;         x_position += step&lt;br /&gt;         window.blit(background, (0,0))&lt;br /&gt;         window.blit(ship, (x_position,y_position))&lt;br /&gt;         pygame.display.flip()&lt;br /&gt; &lt;br /&gt;     if event.type == KEYDOWN and event.key == K_SPACE:&lt;br /&gt;         shot_pos_x, shot_pos_y = x_position, y_position&lt;br /&gt;         while shot_pos_y &gt; 0:&lt;br /&gt;             window.blit(background, (0,0))&lt;br /&gt;             window.blit(ship, (x_position,y_position))&lt;br /&gt;             window.blit(shot, (shot_pos_x,shot_pos_y))&lt;br /&gt;             shot_pos_y -= shotspeed&lt;br /&gt;             pygame.display.flip()&lt;br /&gt;         window.blit(background, (0,0))&lt;br /&gt;         window.blit(ship, (x_position,y_position))&lt;br /&gt;         pygame.display.flip()&lt;br /&gt; &lt;br /&gt;     if event.type == QUIT:&lt;br /&gt;         sys.exit(0)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Calma, calma. Vou explicar tudinho. Esse for trata os eventos como falei acima, e se o tipo do evento for KEYDOWN (alguem pressionou uma tecla) e essa tecla for setinha-pra-esquerda (K_LEFT) nós alteramos a posição da nave em cinco pixels pra esquerda (diminuimos o x_position com o step), apagamos tudo redesenhando o background por cima de tudo, desenhamos a nave novamente só que no novo lugar e damos um 'refresh' na tela, sacou? O mesmo com o K_RIGHT.&lt;br /&gt;&lt;br /&gt;Já com o K_SPACE, que é quando o usuário apertar espaço, nós setamos a posição do tiro que vai partir da nave (ou seja, tem que estar na mesma posição da nave que é x_position e y_position) e fazemos um while dizendo que enquanto a posição do tiro no eixo Y for maior que 0 (ou seja, enquanto o tiro não encostar na aresta superior da tela) o jogo precisa desenhar o background, desenhar a nave, desenhar o tiro e diminuir 1 pixel da posição atual do tiro, que é pra fazer ele subir. Dessa forma, uma hora o tiro vai chegar no topo da tela e sair fora do while. Aí o joguinho redesenha o background e a nave só e dá uma atualizada na tela pra que o tiro suma.&lt;br /&gt;&lt;br /&gt;O ultimo evento é só pra o X do canto superior direito da tela funcionar.&lt;br /&gt;&lt;br /&gt;Algumas Observações: Existem várias coisas nesse código que precisam ser melhoradas. Esse while do tiro precisa ser refeito porque enquanto o tiro viaja pela telinha nossa nave fica presa, esperando o tiro sumir da tela para que retomemos o controle dela. Isso é um erro.&lt;br /&gt;&lt;br /&gt;Outra coisa que preciso aprender é a atualização (flip) da tela. Existe um outro método mais eficiente que é o update(), e usamos ele quando queremos atualizar apenas partes da tela. Essa atualização por partes é chamada de dirty-rect, e ela desenha apenas retângulos de background onde aconteceram movimentos.&lt;br /&gt;&lt;br /&gt;No geral é mais ou menos isso. O código completo está &lt;a href="http://www.flavioribeiro.com/joguinho.p"&gt;aqui&lt;/a&gt; e se você quiser ver esse código funcionando pegue as imagens &lt;a href="www.flavioribeiro.com/imagens.tar.gz"&gt;aqui&lt;/a&gt;. Não esqueca de modificar o caminho das imagens no comecinho do código. Quando eu for fazendo as otimizações e adicionando funcionalidades ao código vou criando mais tutoriais como esse.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-2062705843077209237?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/2062705843077209237/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=2062705843077209237' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/2062705843077209237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/2062705843077209237'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/07/ol-nesses-ltimos-dias-venho-me.html' title='Mini-Aulas PyGame (parte 1)'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-2296564481105933098</id><published>2007-07-06T14:10:00.000-03:00</published><updated>2007-07-09T02:32:05.254-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python e MySQL</title><content type='html'>&lt;span style="font-size:85%;"&gt;Depois de algum tempo sem postar aqui no blog, vou mostrar um pouco sobre o modulo de Python para acessar um banco de dados MySQL, é o &lt;a href="http://sourceforge.net/projects/mysql-python"&gt;MySQLdb&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;No Debian, Ubuntu, etc.... aptitude install python-mysqldb.&lt;br /&gt;&lt;br /&gt;Eu presumo que você já saiba algo sobre &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt;, pois não vou falar sobre ele. Bem, depois depois do módulo baixado e instalado, vamos ver se ta funcionando:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; import MySQLdb&lt;br /&gt;&gt;&gt;&gt; print MySQLdb.__doc__&lt;br /&gt;MySQLdb - A DB API v2.0 compatible interface to MySQL.&lt;br /&gt;&lt;br /&gt;This package is a wrapper around _mysql, which mostly implements the&lt;br /&gt;MySQL C API.&lt;br /&gt;&lt;br /&gt;connect() -- connects to server&lt;br /&gt;&lt;br /&gt;See the C API specification and the MySQL documentation for more info&lt;br /&gt;on other items.&lt;br /&gt;&lt;br /&gt;For information on how MySQLdb handles type conversion, see the&lt;br /&gt;MySQLdb.converters module.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Tudo bem. Para se conectar ao banco é bem simples:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;conexao = MySQLdb.connect('host', 'usuario', 'senha', 'banco')&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Depois de estabelecida a conexão, é preciso criar um objeto "cursor", é ele quem vai executar os comandos SQL, assim como rebecer os dados que um comando SELECT por exemplo, vou mostrar adiante.&lt;br /&gt;Primeiro vamos criar uma tabela que guarda um nome e um email, será a tabela Dados (o banco deve ser previamente criado):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import MySQLDB&lt;br /&gt;&lt;br /&gt;conexao = MySQLdb.connect('host', 'usuario', 'senha', 'banco')&lt;br /&gt;cursor = conexao.cursor()&lt;br /&gt;&lt;br /&gt;cursor.execute('''create table Dados (&lt;br /&gt;          id int not null auto_increment primary key,&lt;br /&gt;              nome varchar(200) not null,&lt;br /&gt;          email varchar(100) not null );&lt;br /&gt;          ''')&lt;br /&gt;&lt;br /&gt;cursor.execute('''insert into Dados(nome, email)&lt;br /&gt;          values("igor", "igor@v2windcenter.com");&lt;br /&gt;           ''')&lt;br /&gt;cursor.close()&lt;br /&gt;conexao.close()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;O código acima vai criar uma tabela, e adicionar dados nessa tabela. Agora vamos retirar dados do banco, usando o interpretador mesmo:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; cursor.execute("SELECT * FROM Dados WHERE nome='igor'")&lt;br /&gt;1L&lt;br /&gt;&gt;&gt;&gt; dados = cursor.fetchall()&lt;br /&gt;&gt;&gt;&gt; print dados&lt;br /&gt;((1L, 'igor', 'igor@v2windcenter.com'),)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;o método fetchall() do cursor, retorna todas as linhas que combinam com o SELECT que foi dado acima, observe que é uma tupla de tuplas...&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; print dados[0][1]&lt;br /&gt;igor&lt;br /&gt;&gt;&gt;&gt; print dados[0][2]&lt;br /&gt;igor@v2windcenter.com&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Como no SELECT foi usado *, para selecionar toda a linha, o retorno vai ser uma tupla de linhas que batem com a condição, mas vamos ver como seria para pegar apenas o nome (lembrando que nós temos a tabela dados, quem tem as colunas id, nome e email):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; cursor.execute("SELECT email FROM Dados WHERE nome='igor'")&lt;br /&gt;1L&lt;br /&gt;&gt;&gt;&gt; print cursor.fetchone()&lt;br /&gt;('igor@v2windcenter.com',)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;o método fetchone() retornou todos os nomes(foi o que procuramos) que combinem com a condição acima. Aqui não é mais uma tupla de tuplas, e sim uma tuplas de valores, pois nós realmente estamos buscando por um unico valor da uma linha.&lt;br /&gt;&lt;br /&gt;Bem,&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; cursor.close()&lt;br /&gt;&gt;&gt;&gt; con.close()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;isso é o básico para se inserir e retirar dados de um banco MySQL.&lt;br /&gt;Para algo mais, visite a pagina no projeto:&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/mysql-python"&gt;&lt;br /&gt;http://sourceforge.net/projects/mysql-python&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-2296564481105933098?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/2296564481105933098/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=2296564481105933098' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/2296564481105933098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/2296564481105933098'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/07/python-e-mysql.html' title='Python e MySQL'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-1851725476827158725</id><published>2007-05-10T10:00:00.000-03:00</published><updated>2007-05-10T10:10:20.473-03:00</updated><title type='text'>Atributos de classe</title><content type='html'>&lt;span style="font-size:85%;"&gt;Os atributos de classe em Python, são equivalentes às variáveis 'static' de Java. Eles podem ser acessados sem precisar criar uma instância dessa classe, e ficam definidas em todo seu escopo.&lt;br /&gt;Diferente dos atributos de dados, que são as variáveis de instância, e são definidas dentro do método __init__(precedidos por 'self'), os atributos de classe são definidos fora de qualquer método, somente dentro do corpo da classe.&lt;br /&gt;&lt;br /&gt;Aqui é um exemplo simples de uma classe com somente um atributo de classe:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; class Idade:&lt;br /&gt;...     i = 18&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; Idade.i&lt;br /&gt;18&lt;br /&gt;&lt;br /&gt;o valor de 'i' pode ser acessada sem precisar criar uma instância da classe Idade. Porém, caso um objeto seja criado, ele também vai poder acessar essa variável:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; eu = Idade()&lt;br /&gt;&gt;&gt;&gt; eu.i&lt;br /&gt;18&lt;br /&gt;&lt;br /&gt;Assim como 'self' é uma referência a instância atual, também existe uma referência a classe. É um atributo embutido em toda classe: __class__&lt;br /&gt;Vamos usá-lo:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; class Idade:&lt;br /&gt;...     i = 18&lt;br /&gt;...     def __init__(self):&lt;br /&gt;...             self.__class__.i += 1&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; Idade.i&lt;br /&gt;18&lt;br /&gt;&gt;&gt;&gt; eu = Idade()&lt;br /&gt;&gt;&gt;&gt; eu.i&lt;br /&gt;19&lt;br /&gt;&gt;&gt;&gt; Idade.i&lt;br /&gt;19&lt;br /&gt;&lt;br /&gt;Quando eu acessei Idade.i pela primeira vez, como a classe Idade não havia sido instânciada, o método __init__ não foi chamado. Então o valor de retorno foi 18, o nosso atributo de classe definido acima.&lt;br /&gt;No momento que eu criei o objeto 'eu', o método __init__ foi chamado, e o valor de 'i' foi incrementado, mas perceba o uso de __class__, fazendo referência a classe, assim como 'self' fazendo referência a instância recém criada, no caso, 'eu'. Ou seja, o valor de 'i', apesar de ser incrementado dentro de um método, continua sendo um atributo de classe, e é normalmente acessado por qualquer objeto.&lt;br /&gt;&lt;br /&gt;Para quem ainda não se sente muito a vontade com Orientação a Objetos, tem um &lt;a href="http://defpython.blogspot.com/2007/01/python-orientado-objetos.html"&gt;post anterior&lt;/a&gt; que da essa introdução.&lt;br /&gt;No site da nossa comunidade, &lt;a href="http://www.pythonbrasil.com.br"&gt;pythonbrasil.com.br, &lt;/a&gt;também tem um boa documentação:&lt;br /&gt;- &lt;a href="http://www.pythonbrasil.com.br/moin.cgi/IntroducaoOop"&gt;Introdução OOP&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://www.pythonbrasil.com.br/moin.cgi/DocumentacaoPython?action=AttachFile&amp;do=get&amp;amp;target=modulo_b.pdf"&gt;Módulo B: Python Orientado a Objetos&lt;/a&gt;&lt;br /&gt;dentre &lt;a href="http://www.pythonbrasil.com.br/moin.cgi/DocumentacaoPython"&gt;outros&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Assim como no site oficial do Python, &lt;a href="http://www.python.org"&gt;python.org:&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://docs.python.org/tut/node11.html"&gt;Classes (do python tutorial)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Fonte: livro Megulhando no Python&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-1851725476827158725?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/1851725476827158725/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=1851725476827158725' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/1851725476827158725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/1851725476827158725'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/05/atributos-de-classe.html' title='Atributos de classe'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-1065230721136281852</id><published>2007-05-07T14:29:00.000-03:00</published><updated>2007-05-07T14:32:20.005-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Nova condicional no Python 2.5</title><content type='html'>&lt;span style="font-size:85%;"&gt;Recentemente instalei o Ubuntu 7.04(Feisty Fawn). Estava usando o 6.10, mas não consegui configurar minha placa Wireless, até desktop 3D tava rodando, com Beryl, mas internet sem fio...nada! Como mesmo no live CD do Feisty Fawn as redes Wireless já apareciam, imediatamente instalei(claro que o problema foi minha "enoorme" habilidade com Linux.. :P). Aliás, tenho um novo problema, agora é com o som(o que está me irritando profundamente), minha placa de som não da sinal de vida! Por favor os gurus em Linux...ajudem!&lt;br /&gt;&lt;br /&gt;Mas tive uma boa notícia quando digitei "Python" no terminal: Python 2.5.1c1&lt;br /&gt;Estava adiando minha atualização por mera preguiça.&lt;br /&gt;&lt;br /&gt;Uma mudança simples que eu achei bem interessante foi uma nova estrutura para o if:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; nome = 'igor'&lt;br /&gt;&gt;&gt;&gt; if nome: print 'tenho nome'&lt;br /&gt;... else: print 'nao tenho nome'&lt;br /&gt;...&lt;br /&gt;tenho nome&lt;br /&gt;&lt;br /&gt;Assim é o normal...mas agora pode ser feito assim:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; nome = 'igor'&lt;br /&gt;&gt;&gt;&gt; print 'tenho nome' if nome else 'nao tenho nome'&lt;br /&gt;tenho nome&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; nome = ''&lt;br /&gt;&gt;&gt;&gt; print 'tenho nome' if nome else 'nao tenho nome'&lt;br /&gt;nao tenho nome&lt;br /&gt;&lt;br /&gt;Como sempre, as coisas em Python bem mais simples.&lt;br /&gt;Foram adicionadas mais coisas...claro. Essa é só o primeiro link! :)&lt;br /&gt;&lt;br /&gt;Veja mais: &lt;a href="http://docs.python.org/whatsnew/whatsnew25.html"&gt;http://docs.python.org/whatsnew/whatsnew25.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-1065230721136281852?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/1065230721136281852/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=1065230721136281852' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/1065230721136281852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/1065230721136281852'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/05/nova-condicional-no-python-25.html' title='Nova condicional no Python 2.5'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-6206444696150037118</id><published>2007-04-11T20:22:00.000-03:00</published><updated>2007-04-11T21:04:50.125-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Outros'/><title type='text'>Primeira aula de Java</title><content type='html'>&lt;span style="font-size:85%;"&gt;Hoje eu assisti minha primeira aula de Java! Na verdade de Programação Orientada a Objetos, com Java. Eu vejo muitas pessoas na comunidade Python criticar muito a linguagem..."em Python se programa muito mais rápido"..."o código é bem mais limpo e organizado"...etc, etc. So em comparar visualmente os dois códigos, é facil ver que em Python fica realmete bem mais fácil de ler, porém essa é a unica comparação que eu posso fazer, pois nao conheço Java, ainda.&lt;br /&gt;&lt;br /&gt;A pouco mais de um ano atrás eu estava no primeiro período do meu curso de Sistemas de Telecomunicações, no CEFET-PB, tendo minha primeira aula de algoritmo, e foi lá realmente onde eu descobri "o que é programação". No mesmo perído foi dado Pascal, onde fiz meus primeiros códigos, gostei, mas ainda sem muita animação. Um amigo da turma, &lt;a href="http://www.flavioribeiro.com"&gt;Flávio Ribeiro&lt;/a&gt;, já me falava algo sobre Python, mas não dei muita atenção.&lt;br /&gt;&lt;br /&gt;No próximo período veio C, já comecei a me interessar mais pelos códigos, achei legal o tratamento quase que direto com a máquina que C proporciona, preocupando-se com cada byte na alocação de variáveis e tal. Nessa época já tinha visto alguns códigos em Python, mas como não ouvia falar muito da linguagem, ainda não dei muita atenção.&lt;br /&gt;&lt;br /&gt;Nessa mesma época aconteceu o EPSL - Encontro Potiguar de Software Livre, em Natal-RN. Assisti a palestra sobre &lt;a href="http://www.turbogears.org/"&gt;TurboGears&lt;/a&gt;, com &lt;a href="http://humberto.digi.com.br/blog/"&gt;Humberto Diógenes&lt;/a&gt; e Jonatas Oliveira, já comecei a olhar Python com outros olhos. E quando &lt;a href="http://www.pythonologia.org"&gt;Osvaldo Santana&lt;/a&gt; aprensentou o 770 e a plataforma &lt;a href="http://www.maemo.org/"&gt;Maemo&lt;/a&gt;, comecei a ficar fascinado por Python. Teve um minicurso sobre Python, também com o Humberto que foi a gota d'água, não via a hora de chegar em casa e começar a programar em Python!&lt;br /&gt;&lt;br /&gt;E aqui estou até hoje. Como no curso de Telecomunicações, aquela cadeira de C seria a ultima de programação, decidi transferi para um curso, tambem no CEFET-PB, totalmente voltado pra desenvolvimento web, Sistemas para Internet, e claro, muito Java.&lt;br /&gt;E como Java só é visto a partir do terceiro período(não consegui dispensar nem C porque a carga horária é maior), decidi começar a assistir aula como ouvinte.&lt;br /&gt;&lt;br /&gt;Mas claro que não vou parar de estudar Python, o livro Beginning Python, da Wrox, não sai da minha mesa! A unica diferença é que daqui a um tempo eu vou poder comparar as duas linguagens, sabendo o que estou falando....e acho que já sei qual vou preferir......... :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-6206444696150037118?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/6206444696150037118/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=6206444696150037118' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/6206444696150037118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/6206444696150037118'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/04/primeira-aula-de-java.html' title='Primeira aula de Java'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-5455560832678839140</id><published>2007-04-10T19:39:00.000-03:00</published><updated>2007-04-10T21:34:41.984-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='PyGTK'/><title type='text'>Introdução a PyGTK - parte 1</title><content type='html'>&lt;span style="font-size:85%;"&gt;A um tempo venho mechendo bastante em &lt;a href="http://pt.wikipedia.org/wiki/PyGTK"&gt;PyGTK&lt;/a&gt;, aprendi muita coisa interessante(ainda falta muuito). Apesar de eu estar usando Glade pra "desenhar" minhas interfaces, vou começar falando de "puro" PyGTK.&lt;br /&gt;Dependendo da distribuição de Linux usada, ela já traz o PyGTK instalado, senão você pode encontrar para Linux/Unix e Windows &lt;a href="http://www.pygtk.org/downloads.html"&gt;aqui.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Depois de instalado, vamos verificar se tá tudo bem. No interpretador vamos importá-lo:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; import pygtk&lt;br /&gt;&gt;&gt;&gt; pygtk.require('2.0')&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Não retornando nenhum erro, tá tudo OK. Já existem versões mais novas que a 2.0, a mais atual estável e a 2.10.x.&lt;br /&gt;E importante saber que vamos trabalhar com widgets, um widget é qualquer parte da interface. Um botão é um widget, assim como a janela, uma entrada de texto, etc.&lt;br /&gt;Agora vamos ao código.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class primeiraJanela:&lt;br /&gt; &amp;nbsp;&amp;nbsp;  def __init__(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;        self.janela = gtk.Window()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;        self.janela.set_title('Minha janela')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;        self.botao = gtk.Button('Ola Mundo')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;        self.janela.add(self.botao)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Aqui nós acabamos de criar uma janela e um botao, colocamos um título na janela e adicionamos o botao nessa janela.&lt;br /&gt;Quando um botão é clicado, o widget emite um sinal. Nós devemos capturar esse sinal e associá-lo a  um handler, que nada mais é do que uma função no código, que fará alguma coisa quando receber tal sinal.&lt;br /&gt;&lt;code&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       self.botao.connect('clicked', self.botaoClicado)&lt;br /&gt;        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.janela.connect('destroy', self.fecharTudo)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Ao botão, relacionamos o sinal 'clicked' com a função botaoClicado que vamos fazer em seguida. O sinal 'destroy' associando a janela, é quando clicamos no X pra fechá-la. Existem vários tipos de sinais, mas esses servirão por enquanto.&lt;br /&gt;É necessário mostrar cada widget cridado, com o método show(). Basicamente é isso. Criamos o widget, associamos seu sinal com uma função e mostramos ele.&lt;br /&gt;O correto é chamar o método show() tanto para a janela quanto para o botão. Mas tem o show_all(), que mostrará os dois.&lt;br /&gt;&lt;code&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    self.janela.show_all()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Pronto. Esse foi o __init__ de nossa classe principal. Agora vamos fazer nossa funções de callbacks, que no caso são somente duas: uma para o botão e uma para fechar a janela&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;  def botaoClicado(self, button):&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   print 'Ola mundo do PyGTK!!'&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;def fecharTudo(self, window):&lt;br /&gt;    &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.janela.hide()&lt;br /&gt;    &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gtk.main_quit()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Quando o botão for clicado, aparecerá no terminal a mensagem: Ola mundo do PyGTK!!&lt;br /&gt;O botao de fechar a janela for clicado, a jenela será escondida, e o programa será fechado.&lt;br /&gt;Aqui termina a nossa classe principal. Agora so falta chamá-la&lt;br /&gt;&lt;code&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;&amp;nbsp;&amp;nbsp;primeiraJanela()&lt;br /&gt;&amp;nbsp;&amp;nbsp;gtk.main()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;O código completo está abaixo. Existe muita documentação sobre PyGTK, inclusive no site da nossa comunidade[1]&lt;br /&gt;E claro a documentação oficial[2]&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import pygtk&lt;br /&gt;import gtk&lt;br /&gt;&lt;br /&gt;class primeiraJanela:&lt;br /&gt; &amp;nbsp;&amp;nbsp;def __init__(self):&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.janela = gtk.Window()&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.janela.set_title('Minha janela')&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.botao = gtk.Button('Ola mundo!')&lt;br /&gt;  &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.janela.add(self.botao)&lt;br /&gt;  &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.janela.connect('destroy', self.fechar)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.botao.connect('clicked', self.botaoClicado)&lt;br /&gt;  &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.janela.show_all()&lt;br /&gt;  &lt;br /&gt; &amp;nbsp;&amp;nbsp;def botaoClicado(self, button):&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print 'Ola mundo do PyGTK!'&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;def fechar(self, window):&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.janela.hide()&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gtk.main_quit()&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt; &amp;nbsp;&amp;nbsp;primeiraJanela()&lt;br /&gt; &amp;nbsp;&amp;nbsp;gtk.main()&lt;br /&gt;&lt;br /&gt;[1]&lt;a href="http://www.pythonbrasil.com.br"&gt;Python Brasil&lt;/a&gt;&lt;br /&gt;[2]&lt;a href="http://www.pygtk.org/tutorial.html"&gt;Tutorial PyGTK&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-5455560832678839140?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/5455560832678839140/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=5455560832678839140' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/5455560832678839140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/5455560832678839140'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/04/introduo-pygtk-parte-1.html' title='Introdução a PyGTK - parte 1'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-6984426214033284837</id><published>2007-03-28T22:25:00.000-03:00</published><updated>2007-03-28T23:58:16.253-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Xrange != Range</title><content type='html'>&lt;span style="font-size:85%;"&gt;Uma das primeiras coisas que a gente aprende quando começa a estudar Python é a função range(). So um simples resumo de como ela funciona:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; range(10)&lt;br /&gt;[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]&lt;br /&gt;&lt;br /&gt;quando colocamos só um argumento, a contagem começa do zero e vai até o numero dado menos um.&lt;br /&gt;Mas também pode passar o numero inicial:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; range(5,10)&lt;br /&gt;[5, 6, 7, 8, 9]&lt;br /&gt;&lt;br /&gt;Existe um terceiro argumento, opcional:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; range(1,20,3)&lt;br /&gt;[1, 4, 7, 10, 13, 16, 19]&lt;br /&gt;&lt;br /&gt;nesse caso, o range ta de um a vinte, pulando de três em três.&lt;br /&gt;&lt;br /&gt;Mas qual a diferença entre range e xrange. Aparentemente são a mesma coisa:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; for a in range(5):&lt;br /&gt;...     print a ,&lt;br /&gt;...&lt;br /&gt;0 1 2 3 4&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; for a in xrange(5):&lt;br /&gt;...     print a ,&lt;br /&gt;...&lt;br /&gt;0 1 2 3 4&lt;br /&gt;&lt;br /&gt;Mas eles têm uma diferença. O range gera uma lista, com cada um dos elementos pedidos, so que imagine um range com milhares de números, milhões....isso começaria a ficar lento. É ai que entra o xrange, que é uma classe embutida e cria menos elementos na memória, tornando-se mais rápido.&lt;br /&gt;Mas tem outro detalhe.....o range gera uma lista, e o xrange, um objeto. Mas tudo em Python é objeto! Listas também....&lt;br /&gt;Ai entra outra diferença:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; ran = range(10)&lt;br /&gt;&gt;&gt;&gt; dir(ran)&lt;br /&gt;['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__str__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']&lt;br /&gt;&lt;br /&gt;se observarmos os métodos da lista gerada pelo range, podemos ver que realmente é uma lista como outra qualquer, tem métodos públicos e privados. Mas olha só:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; xran = xrange(10)&lt;br /&gt;&gt;&gt;&gt; dir(xran)&lt;br /&gt;['__class__', '__delattr__', '__doc__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__iter__', '__len__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__str__']&lt;br /&gt;&lt;br /&gt;o objeto gerado pelo xrange só possui métodos privados. O que nos impede de fazer muita coisa.&lt;br /&gt;Mais uma prova de que 'xran' acima não é uma lista:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; xran&lt;br /&gt;xrange(10)&lt;br /&gt;&lt;br /&gt;Porém podemos acessar algum valor do objeto gerado, como se fosse uma lista ou uma tupla:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; xran[3]&lt;br /&gt;3&lt;br /&gt;&lt;br /&gt;Como isso é possivel? Bem...podemos ver entre os métodos privados o __getitem__, é ele que é chamado quando procuramos por um elemento dando seu indice entre colchetes.&lt;br /&gt;&lt;br /&gt;Na verdade é o seguinte: o range gera uma lista. Xrange é uma classe embutida, logo cria um objeto, que apesar de parecer uma sequência, é diferente, e é o mais aconselhável quando precisarmos gerar uma sequência muuito grande, onde o range se tornaria lento.&lt;br /&gt;&lt;br /&gt;Espero ter esclarecido um pouco. Qualquer dúvida ou principalmente complementações e erros, vocês podem e devem comentar! :)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:70%;"&gt;&lt;br /&gt;Fonte: livro Beginning Python, Ed. Wrox&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-6984426214033284837?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/6984426214033284837/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=6984426214033284837' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/6984426214033284837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/6984426214033284837'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/03/xrange-range.html' title='Xrange != Range'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-8225320756613638571</id><published>2007-03-16T13:20:00.000-03:00</published><updated>2007-03-29T00:15:27.811-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eventos'/><title type='text'>De volta do Bossa Conference</title><content type='html'>&lt;span style="font-size:85%;"&gt;Estive no Bossa Conference, em Porto de Galinhas - PE, essa semana. Pra quem não foi, perdeu muita coisa boa.&lt;br /&gt;O congresso foi totalmente voltado pra tecnologia móvel e multimídia, e teve muita coisa interessante. É difícil dizer qual foi a melhor palestra. A plataforma &lt;a href="http://www.maemo.org/"&gt;Maemo&lt;/a&gt; foi muito citada, assim como Python.&lt;/span&gt;&lt;span class="down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Na maioria dos casos era difícl escolher em qual sala entrar, infelizmente nao  assisti as de &lt;a href="http://www.pygtk.org/"&gt;PyGTK&lt;/a&gt; e Hildon, preferi o workshop de &lt;a href="http://sourceforge.net/projects/pys60"&gt;PyS60.&lt;/a&gt;&lt;br /&gt;É impressionante a facilidade de fazer aplicações pra os smartphones da linha S60 da Nokia, basta instalar o interpretador python no aparelho, escrever o script em python normal(.py) e passar para o celular. Foram criadas algumas bibliotecas específicas, de SMS, camera, etc. E a versão utilizada é o Python 2.2.2. Pretendo começar a fazer alguns programinhas utlizando PyS60, o unico problema que eu achei é que não existe um SDK para Linux, so pra Windows, e como estou usando Fedora e Ubuntu no momento, é preciso rodar o emulador pelo Wine.&lt;br /&gt;Breve eu estarei dando uma introdução da instalção do SDK, e alguns aplicativos simples.&lt;/span&gt;&lt;span class="down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Ainda teve palestras sobre o &lt;a href="http://pypy.org/"&gt;PyPy,&lt;/a&gt; &lt;a href="http://gstreamer.freedesktop.org/"&gt;Gstreamer,&lt;/a&gt; &lt;a href="https://garage.maemo.org/projects/canola/"&gt;Canola&lt;/a&gt;......muita coisa boa, valeu a pena.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;Só tenho duas críticas a fazer: não gostei do fato de não receber nenhum certificado, e achei que o Hotel não é bem preparado para receber esse tipo de evento, as salas são realmente imprenssadas.&lt;br /&gt;&lt;br /&gt;Mas acredito que o mais importante nesses eventos e ter a oportunidade de trocas idéias com os convidados, é difícil unir tanta gente boa, e o melhor é que foi a duas horas e meia da minha casa  :)&lt;br /&gt;&lt;br /&gt;Presença garantida num próximo...espero que aconteça breve.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-8225320756613638571?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/8225320756613638571/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=8225320756613638571' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/8225320756613638571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/8225320756613638571'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/03/de-volta-do-bossa-conference.html' title='De volta do Bossa Conference'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-7968575381319872442</id><published>2007-02-22T13:12:00.000-03:00</published><updated>2007-03-29T00:16:31.246-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Caminho do import</title><content type='html'>&lt;span style="font-size:90%;"&gt;Quando &lt;a href="http://defpython.blogspot.com/2007/02/from-modulo-import.html"&gt;importamos um módulo&lt;/a&gt;, como o interpretador Python sabe onde ele está?&lt;br /&gt;Na verdade existe uma lista de locais de onde esses modulos são importados.Para vê-la, basta digitar da linha de comando:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; from sys import path&lt;br /&gt;&gt;&gt;&gt; path&lt;br /&gt;['', '/usr/lib/python24.zip', '/usr/lib/python2.4', '/usr/lib/python2.4/plat-linux2', '/usr/lib/python2.4/lib-tk', '/usr/lib/python2.4/lib-dynload', '/usr/local/lib/python2.4/site-packages', '/usr/lib/python2.4/site-packages', '/usr/lib/python2.4/site-packages/HTMLgen', '/usr/lib/python2.4/site-packages/Numeric', '/usr/lib/python2.4/site-packages/PIL', '/usr/lib/python2.4/site-packages/cairo', '/usr/lib/python2.4/site-packages/gst-0.10', '/usr/lib/python2.4/site-packages/gtk-2.0', '/usr/lib/site-python']&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;E para adicionar um caminho, basta utliziar o método 'append' de lista. Assim podemos adicionar um local para o interpretador buscar os módulos que nós vizemos.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-7968575381319872442?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/7968575381319872442/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=7968575381319872442' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/7968575381319872442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/7968575381319872442'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/02/caminho-do-import.html' title='Caminho do import'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-9088819297908174803</id><published>2007-02-21T13:47:00.000-03:00</published><updated>2007-03-29T00:17:11.208-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>from 'modulo' import *</title><content type='html'>&lt;span style="font-size:90%;"&gt;Para importar um modulo em Python, basta fazer:&lt;br /&gt;&lt;br /&gt;import 'modulo'&lt;br /&gt;&lt;br /&gt;isso não e nenhum misterio. Do mesmo jeito que para importar apenas um método ou uma função de um módulo é bem simples:&lt;br /&gt;&lt;br /&gt;from 'modulo' import 'algo'&lt;br /&gt;&lt;br /&gt;Mas você já deve ter visto o from 'modulo' import *.&lt;br /&gt;Isso importa todu que tem no módulo. Mas ai você se pergunta: e por que não usar somente o import 'modulo' ?&lt;br /&gt;Quando usamos somente o import, todas as funções e atributos desse módulo importado não pertencem ao namespace do nosso modulo, ou seja, caso importamos o módulo 'teste', por exemplo, caso queira me referir a uma função de 'teste' eu terei que fazer:&lt;br /&gt;&lt;br /&gt;teste.nome_da_função&lt;br /&gt;&lt;br /&gt;já se eu usar o from teste import *, todas as funções e métodos do modulo 'teste' importado serão variaveis locais do meu modulo. E não será mais preciso usar a sintaxe acima.&lt;br /&gt;&lt;br /&gt;Um pouco mais de namespaces &lt;a href="http://defpython.blogspot.com/2007/02/namespaces-locals-e-globals.html"&gt;aqui&lt;/a&gt;.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-9088819297908174803?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/9088819297908174803/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=9088819297908174803' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/9088819297908174803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/9088819297908174803'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/02/from-modulo-import.html' title='from &apos;modulo&apos; import *'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-6908311680108354144</id><published>2007-02-21T13:30:00.001-03:00</published><updated>2007-03-29T00:17:58.996-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Namespaces, locals() e globals()</title><content type='html'>&lt;span style="font-size:90%;"&gt;Quando nós criamos uma variável, onde ela fica guardada exatamente? Isso vai depender de onde ela foi criada. Caso tenha sido dentro de uma função, ela só existirá para aquela função, será uma variável local, pertencendo a um "namespace" local, e quando essa função não for mais usada, a variavel desaparecerá.&lt;br /&gt;&lt;br /&gt;Namespaces são onde ficam registradas as variáveis, e funcionam como um dicionário, onde as chaves são os nomes das variáveis, e os valores são os valores dessas variáveis. Existem três tipos de namespaces:&lt;br /&gt;&lt;br /&gt;- Namespace local: como citado acima, se refere a uma função ou método de classe. As variáveis   desse namespace só poderão ser acessadas de sua função ou método de classse onde ela pertence.&lt;br /&gt;&lt;br /&gt;- Namespace global: é onde ficam todas as variáveis, funções, classes, módulos importados, do módulo corrente. Normalmente esse namespace dura até o fim do programa.&lt;br /&gt;&lt;br /&gt;- Namespace embutido: esse é acessível de qualquer módulo, e contém funções e excessões embutidas. Ele é criado quando o interpretador python é aberto, e dura até ele ser fechado. As variaveis desse namespace ficam em um módulo, chamado __builtin__.&lt;br /&gt;&lt;br /&gt;Quando, no meio do código, existe uma chamada a uma variável, o interpretador python segue uma sequencia de busca pra achar o valor dessa variável. Primeiro ele procura no namespace local, não achando, procura no namespace global, em seguida no namespace embutido. Caso exista uma função aninhada ou lambda dentro de outra, procura-se primeiro no namespace dessa função, depois no da função ascendente e so depois no global e embutido.&lt;br /&gt;&lt;br /&gt;Outra definição interessante é a de escopo. Escopo é uma região textual de um programa em Python, onde um namespace é diretamente acessível. O escopo local de uma função é a região de codigo dela, onde podemos chamar suas variáveis diretamente.&lt;br /&gt;&lt;br /&gt;Python tem duas funções muito interessantes, com elas podemos acessar os namespaces em tempo de execução, são elas locals() e globals().&lt;br /&gt;&lt;br /&gt;A função locals() retorna um dicionário, onde as chaves são os nomes das variáveis locais, e os valores são os valores dessas varáveis. Vamos ver um exemplo:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def f(n):&lt;br /&gt;....mult = n * 2&lt;br /&gt;....print locals()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Obeserve a função acima f(n), 'n' é o argumento da função, argumentos também pertencem ao namespace local, e dentro da função criamos a variável 'mult'. Agora vamos chamar a função atribuindo um valor para 'n':&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; f(4)&lt;br /&gt;{'mult': 8, 'n': 4}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Obeserve que locals() retornou o dicionario acima, com as variáveis e seus conteúdos.&lt;br /&gt;O mesmo que locals() faz para um namespace local, globals() faz para o namespace global.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; import locais&lt;br /&gt;&gt;&gt;&gt; globals()&lt;br /&gt;{'__builtins__': module '__builtin__' (built-in), '__name__': '__main__', '__doc__': None, 'locais': module 'locais' from 'locais.py'}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Vamos entender o que foi feito acima, direto da linha de comando. Primeiro eu importei o módulo criado acima,chamado de locais.py, que contém o exemplo de locals(). Depois, eu chamei a função globals() e ela me retornou o dicionário acima.&lt;br /&gt;'__builtins__', como eu já citei, é o módulo que contém todas as funções, excessões embutidas, o que forma o namespace embutido.&lt;br /&gt;'__name__' funciona da seguinte maneira. Ao rodar um módulo, ao invés de importá-lo, o valor embutido __name__ será __main__. E como nós estamos da linha de comando, __name__ é __main__&lt;br /&gt;E observe também a presença do módulo que foi importadom 'locais', ao ser importado ele pertence ao namespace global.&lt;br /&gt;'__doc__': None, mostra que nosso módulo corrente não tem nenhuma docstring&lt;br /&gt;&lt;br /&gt;Uma utilidade para essas funções é a formatação de string com dicionários, eu falei um pouco disso no post anterior sobre &lt;a href="http://defpython.blogspot.com/2007/01/conhecendo-os-dicionrios.html"&gt;dicionários&lt;/a&gt;.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fonte:&lt;br /&gt;- Livro Mergulhando no Python&lt;br /&gt;- &lt;a href="http://docs.python.org/tut/node11.html"&gt;Python tutorial&lt;/a&gt;&lt;/span&gt;&lt;/module&gt;&lt;/module&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-6908311680108354144?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/6908311680108354144/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=6908311680108354144' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/6908311680108354144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/6908311680108354144'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/02/namespaces-locals-e-globals.html' title='Namespaces, locals() e globals()'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-3413125469193577091</id><published>2007-02-07T10:21:00.000-03:00</published><updated>2007-03-29T00:18:43.555-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Argumentos Opcionais</title><content type='html'>&lt;span style="font-size:90%;"&gt;Python nos permite dar valores padrões para argumentos de funções, assim caso tal argumento não seja definido, será usado seu valor padrão, tornando esse argumento opcional.&lt;br /&gt;Para fazer isso, devemos nomear os argumentos que terão seu valor padrão:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; def info(nome, idade=18, curso='python'):&lt;br /&gt;&lt;br /&gt;Pronto, a função 'info' acima, possui 3 argumentos, 'nome' é um argumento obrigatório, já 'idade' e 'curso' têm valores padrão '18' e 'python' respectivamente.&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; info('igor')                                       ## 1&lt;br /&gt;&gt;&gt;&gt; info('igor', 20)                                ## 2&lt;br /&gt;&gt;&gt;&gt; info('igor', curso='plone')           ## 3&lt;br /&gt;&gt;&gt;&gt; info(nome='igor', idade=20)      ## 4&lt;br /&gt;&lt;br /&gt;Vamos analisar as chamadas acima:&lt;br /&gt;&lt;br /&gt;## 1: Nesse caso, entramos somente com o argumento obrigatório, então tando 'idade' quanto 'curso' assumem seus valores padrão, '18' e 'python'&lt;br /&gt;&lt;br /&gt;## 2: Agora definimos, além do argumento obrigatório, 'idade', que agora passa a ser '20', e seu valor padrão é ignorado. E 'curso' continua com seu valor padrão.&lt;br /&gt;&lt;br /&gt;## 3: Mas e se eu quiser definir o argumeto opcional 'curso' mas usar o valor padrão para 'idade'? Simples. Nesse caso nós, fizemos isso, definimos o argumento obrigatório, e também o argumento opcional 'curso' como 'plone'. Deixando 'idade' com seu valor padrão.&lt;br /&gt;&lt;br /&gt;## 4: Esse caso é so para mostrar que os argumentos obrigatórios também poder ser nomeados na hora da atribuição.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-3413125469193577091?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/3413125469193577091/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=3413125469193577091' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/3413125469193577091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/3413125469193577091'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/02/argumentos-opcionais.html' title='Argumentos Opcionais'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-3054322186662102531</id><published>2007-02-06T11:55:00.000-03:00</published><updated>2007-03-29T00:19:17.901-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Funções lambda</title><content type='html'>&lt;span style="font-size:90%;"&gt;Se você precisa de uma função para fazer algo simples, de apenas uma expressão, existe uma maneira bem prática pra fazer isso em Python, usando uma função lamba.&lt;br /&gt;Elas funcionam como uma função normal, só que possuem uma unica linha.&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; def f(x):&lt;br /&gt;...    return x*2&lt;br /&gt;&gt;&gt;&gt; f(3)&lt;br /&gt;6&lt;br /&gt;&lt;br /&gt;usando uma função lambda:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; f = lambda x: x*2&lt;br /&gt;&gt;&gt;&gt; f(3)&lt;br /&gt;6&lt;br /&gt;&lt;br /&gt;Também podemos usar uma função lambda sem atribuí-la a nenhuma variável&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; (lambda y: y*3 )(2)&lt;br /&gt;6&lt;br /&gt;&lt;br /&gt;As funções lambda são sempre opcionais, tudo que fazemos com ela pode ser feito com uma função normal.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-3054322186662102531?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/3054322186662102531/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=3054322186662102531' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/3054322186662102531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/3054322186662102531'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/02/funes-lambda.html' title='Funções lambda'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-927120146179151994</id><published>2007-01-29T11:31:00.000-03:00</published><updated>2007-03-29T00:22:11.608-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Conhecendo os Dicionários</title><content type='html'>&lt;span style="font-size:90%;"&gt;Hoje vamos dar uma olhada nos dicionarios, um tipo de dados do Python. Vamos começar por sua sintaxe:&lt;br /&gt;&lt;br /&gt;d = {'nome' : 'igor', 'idade' : 18, 'curso' : 'python' }&lt;br /&gt;&lt;br /&gt;Os dicionarios guardam pares de chave/valor, no caso acima, as chaves sao: 'nome', 'idade' e 'curso'... e elas se referem a seus respectivos valores: 'igor', 18, 'python'.&lt;br /&gt;É importante lembrar que as posições dos pares chave/valor não tem ordem fixa. Os valores podem ser de qualquer tipo, strings, inteiros, tuplas.&lt;br /&gt;&lt;br /&gt;Acima criamos o dicionario 'd' da maneira mais clássica, mas existem outras, como a função 'dict':&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; items = [('nome','igor'), ('idade', 18), ('curso','python')]&lt;br /&gt;&gt;&gt;&gt; d = dict(items)&lt;br /&gt;&gt;&gt;&gt; d&lt;br /&gt;{'idade': 18, 'curso': 'python', 'nome': 'igor'}&lt;br /&gt;&lt;br /&gt;Outra maneira interessante de se criar um dicionario, é usando o método 'fromkeys'&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; dic = {}.fromkeys(['nome','idade'])&lt;br /&gt;{'idade': None, 'nome': None}&lt;br /&gt;&lt;br /&gt;Ao invés de None, podemos dar o valor padrão&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; dic = {}.fromkeys(['nome','idade'],'NADA')&lt;br /&gt;&gt;&gt;&gt; dic&lt;br /&gt;{'idade': 'NADA', 'nome': 'NADA'}&lt;br /&gt;&lt;br /&gt;Agora vamos ao que mais interessa, manusear o dicionário...&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; d['nome']&lt;br /&gt;'igor'&lt;br /&gt;&lt;br /&gt;Tem um pequeno problema, e se essa chave nao existisse?&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; d&lt;br /&gt;{'idade': 18, 'curso': 'python', 'nome': 'igor'}&lt;br /&gt;&gt;&gt;&gt; d['profissao']&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt; File "&lt;stdin&gt;", line 1, in ?&lt;br /&gt;KeyError: 'profissao'&lt;br /&gt;&lt;br /&gt;Pra evitar esse tipo de bug, existe o metodo 'get'&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; d&lt;br /&gt;{'idade': 18, 'curso': 'python', 'nome': 'igor'}&lt;br /&gt;&gt;&gt;&gt; d.get('nome')&lt;br /&gt;'igor'&lt;br /&gt;&gt;&gt;&gt; print d.get('profissao')&lt;br /&gt;None&lt;br /&gt;&lt;br /&gt;Pra alterar o valor de uma chave é muito simples&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; d['nome']&lt;br /&gt;'igor'&lt;br /&gt;&gt;&gt;&gt; d['nome'] = 'sobreira'&lt;br /&gt;&gt;&gt;&gt; d['nome']&lt;br /&gt;'sobreira'&lt;br /&gt;&lt;br /&gt;Observe que eu substitui o valor da chave 'nome', e caso ela ainda não existisse, eu teria acabado de criá-la. Mas que tal verificar se determinada chave existe mesmo?&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; 'nome' in d&lt;br /&gt;True&lt;br /&gt;&gt;&gt;&gt; 'profissao' in d&lt;br /&gt;False&lt;br /&gt;&gt;&gt;&gt; d.has_key('nome')&lt;br /&gt;True&lt;br /&gt;&lt;br /&gt;Pra apagar uma chave também é batante simples:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; d&lt;br /&gt;{'curso': 'python', 'nome': 'igor', 'idade': 18}&lt;br /&gt;&gt;&gt;&gt; del d['nome']&lt;br /&gt;&gt;&gt;&gt; d&lt;br /&gt;{'idade': 18, 'curso': 'python'}&lt;br /&gt;&lt;br /&gt;Caso você queira ver o que está apagando, ao invés do 'del', pode usar o 'pop'&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; d&lt;br /&gt;{'idade': 18, 'curso': 'python'}&lt;br /&gt;&gt;&gt;&gt; d.pop('curso')&lt;br /&gt;'python'&lt;br /&gt;&lt;br /&gt;Mas eu não quero apagar so uma chave, quero limpar todo o dicionario. Pra isso tem o 'clear'&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; d = {'nome': 'igor', 'curso': 'python'}&lt;br /&gt;&gt;&gt;&gt; d.clear()&lt;br /&gt;&gt;&gt;&gt; d&lt;br /&gt;{}&lt;br /&gt;&lt;br /&gt;Também podemos copiar todo o conteudo do dicionario, para um outro dicionario&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; d = {'nome': 'igor', 'curso': 'python'}&lt;br /&gt;&gt;&gt;&gt; d2 = d.copy()&lt;br /&gt;&gt;&gt;&gt; d2&lt;br /&gt;{'curso': 'python', 'nome': 'igor'}&lt;br /&gt;&gt;&gt;&gt; d2['curso'] = 'dicionarios'&lt;br /&gt;&gt;&gt;&gt; d2&lt;br /&gt;{'curso': 'dicionarios', 'nome': 'igor'}&lt;br /&gt;&gt;&gt;&gt; d&lt;br /&gt;{'curso': 'python', 'nome': 'igor'}&lt;br /&gt;&lt;br /&gt;Observe que uma alteração em um, não altera o conteudo do dicionario copiado&lt;br /&gt;&lt;br /&gt;Existe uma utilidade muito legal dos dicioanários, que é formatar string. Aqui vai um exemplo muito interessante&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; dic = {'nome': 'igor', 'curso': 'python'}&lt;br /&gt;&gt;&gt;&gt; frase = 'meu nome e %(nome)s e estou estudando %(curso)s'&lt;br /&gt;&gt;&gt;&gt; print frase % dic&lt;br /&gt;meu nome e igor e estou estudando python&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bem, espero ter esclarecido um pouco o uso de dicionarios.&lt;br /&gt;Tomei como base o &lt;a href="http://www.pdfchm.com/book/beginning-python-from-novice-to-professional-2507/"&gt;livro Begining Pyhton - From Novice to Professional, de Magnus Lie Hetland&lt;/a&gt;&lt;/stdin&gt;&lt;/span&gt;&lt;span style="font-size:90%;"&gt;&lt;stdin&gt;, que eu aconselho muito pra quem ta começando na linguagem.&lt;br /&gt;Até a próxima...&lt;/stdin&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-927120146179151994?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/927120146179151994/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=927120146179151994' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/927120146179151994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/927120146179151994'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/01/conhecendo-os-dicionrios.html' title='Conhecendo os Dicionários'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-116930070878371176</id><published>2007-01-20T10:28:00.000-03:00</published><updated>2007-07-14T12:56:34.058-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python Orientado a Objetos</title><content type='html'>&lt;span style="font-size:90%;"&gt;Hoje vai a primeira dica enviada por um visitante do blog, um amigo, &lt;/span&gt;&lt;span style="font-size:90;"&gt;&lt;span style="font-size:90;"&gt;&lt;span style="font-size:90%;"&gt;&lt;a href="http://www.flavioribeiro.com/"&gt;Flavio Ribeiro&lt;/a&gt;. Foi ele quem me aprensentou a linguagem Python, quando começamos o curso de Sistemas em Telecomunicações no &lt;a href="http://www.cefetpb.edu.br/"&gt;CEFET-PB&lt;/a&gt;, e assim como eu, adora a linguagem e quer aprender cada vez mais sobre ela.&lt;br /&gt;&lt;br /&gt;Bem, Python é uma linguagem Orientad a Objetos, e aqui Flavio dar uma introdução de como funciona esse tipo de programação:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:90;"&gt;&lt;br /&gt;Python Orientado a Objetos&lt;br /&gt;&lt;br /&gt;Olá a todos, hoje vou tentar *introduzir* alguns conceitos de orientação a objetos e creio que isso também me ajudará a tirar algumas dúvidas sobre essa poderosa forma de programação.&lt;br /&gt;&lt;br /&gt;A programação orientada a objetos visa prioritariamente o reaproveitamento de código, além de deixar o código mais legivel, elegante e (claro) menor.&lt;br /&gt;&lt;br /&gt;Tudo comeca com uma Classe. Ela serve como fábrica de objetos (calma, jájá explico o que é um objeto), e é a base da POO. Tratando isso de uma maneira mais simples, vamos imaginar que você quer criar um joguinho onde terão vários personagens.&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;class Personagem:&lt;br /&gt;   """ Classe que cria personagens do jogo """&lt;br /&gt;   def __init__(self,Nome,Poder):&lt;br /&gt;       """ Método construtor da classe, onde recebe os parametros Nome e Poder de cada bonequinho """&lt;br /&gt;       self.Nome = Nome&lt;br /&gt;       self.Poder = Poder&lt;br /&gt;       print 'Criando personagem ',Nome,' com poder ',Poder&lt;br /&gt;   def Correr(self):&lt;br /&gt;       print self.Nome,' está correndo!'&lt;br /&gt;   def Chute(self,Adversario):&lt;br /&gt;       print self.Nome,' Deu um chute em ',Adversario&lt;br /&gt;&lt;code&gt;&lt;/pre&gt;&lt;br /&gt;Vamos agora explicar: Uma classe chamada Personagem foi criada, e para que ela fabrique algum bonequinho, precisa satisfazer os parametros do método construtor (__init__). A fabricação dele é o que chamamos de objeto ou instância de classe, e agora iremos criar um:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; Smurf = Personagem('Papai Smurf',30)&lt;br /&gt;&gt;&gt;&gt; Criando personagem Papai Smurf com poder 30&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Viu? Agora temos um objeto chamado Smurf, ou seja, demos vida ao Papai Smurf e ele está pronto pra correr!&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; Smurf.Correr()&lt;br /&gt;&gt;&gt;&gt; Papai Smurf está correndo!&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Agora, para o chute, você deve ter visto que na definição do metodo tem um parametro Adversario, notou? Então teremos que dizer quem vamos chutar!&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; Smurf.Chute('Gargamel')&lt;br /&gt;&gt;&gt;&gt; Papai Smurf Deu um chute em Gargamel&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Deu pra entender como funciona? Da mesma forma que criamos o objeto Smurf, poderemos criar mais inumeros personagens usando apenas essa classe Personagem, usando esses mesmos comandos que digitei acima.&lt;br /&gt;&lt;br /&gt;Ainda tem dúvidas não é? O que aquele self representa? O que são aquelas três aspas no inicio dos métodos e da classe? Toda classe precisa de parametros iniciais?&lt;br /&gt;&lt;br /&gt;Vamos lá:&lt;br /&gt;O self representa uma váriavel de objeto. Sem o self, quando fossem criados dois ou mais objetos as variaveis iriam sempre ser alteradas e citando como exemplo o código acima, se o ultimo bonequinho chamado 'Tux' fosse criado, todos os outros bonequinhos iam passar a chamar-se Tux também, assim como iam passar a ter o mesmo poder do Tux. Com o self, cada váriavel corresponde ao seu objeto!&lt;br /&gt;&lt;br /&gt;As três aspas são chamadas de Doc String. Quando um programa é muito extenso, essas doc strings são de extrema necessidade para que o programador se oriente, elas documentam o código. Olha só como funciona usando o mesmo código acima:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; Personagem.__doc__&lt;br /&gt;&gt;&gt;&gt; ' Classe que cria personagens do jogo '&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Sacou?&lt;br /&gt;&lt;br /&gt;Quanto a ultima pergunta, Não. Não é preciso que toda classe receba dados iniciais, eles podem ser manipulados após a criação dos objetos apenas adicionando metodos de set. Eu poderia criar mais um método ali chamado 'RecebeNome' onde só após a criação do objeto eu iria dar nome a ele.&lt;br /&gt;&lt;br /&gt;Bem, pretendo continuar a fazer mini-tutoriais como esse a medida que eu for tomando maior conhecimento da linguagem python. Dessa vez foi apenas um esquente, e espero que tenha ajudado alguem.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-116930070878371176?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/116930070878371176/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=116930070878371176' title='7 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/116930070878371176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/116930070878371176'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/01/python-orientado-objetos.html' title='Python Orientado a Objetos'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-116890882753047825</id><published>2007-01-15T20:50:00.001-03:00</published><updated>2007-03-29T00:24:05.189-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Trabalhando com strings</title><content type='html'>&lt;span style="font-size:90%;"&gt;Só pra não deixar o blog parado, vamos dar uma pequena olhada no que o Python pode fazer com strings, apenas alguns métodos. Primeiro vale lembra que em Python, tudo são objetos, então uma string também é um objeto, e tem varios metodos embutidos que facilitam seu manuseio e formatação. Não é preciso declarar variáveis, então para criar uma string, basta atribuir:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; nome = 'igor'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; nome&lt;br /&gt;'igor'&lt;br /&gt;&lt;br /&gt;Ou para tornar um outro tipo em string:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; numero = 12.45&lt;br /&gt;&gt;&gt;&gt; string = str(numero)&lt;br /&gt;&gt;&gt;&gt; string&lt;br /&gt;'12.45'&lt;br /&gt;&lt;br /&gt;As strings possuem aspas simples ou duplas, para o caso de precisarmos de algumas delas dentro da própria string:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; nome = "meu nome é 'igor' "&lt;br /&gt;&gt;&gt;&gt; nome&lt;br /&gt;"meu nome é 'igor' "&lt;br /&gt;&lt;br /&gt;E se quisermos escrever uma string usando varias linhas:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; nome = ''' estou&lt;br /&gt;... aprendendo&lt;br /&gt;... python'''&lt;br /&gt;&gt;&gt;&gt; nome&lt;br /&gt;'estou\n aprendendo\n python'&lt;br /&gt;&lt;br /&gt;Note que um carácter quebra de linha (\n) é adicionado automaticamente com o Enter.&lt;br /&gt;Agora vamos brincar com letras maiúsculas e minúsculas:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; nome = 'igor sobreira'&lt;br /&gt;&gt;&gt;&gt; nome.capitalize()&lt;br /&gt;'Igor sobreira'&lt;br /&gt;&gt;&gt;&gt; nome&lt;br /&gt;'igor sobreira'&lt;br /&gt;&gt;&gt;&gt; nome  = nome.capitalize()&lt;br /&gt;&gt;&gt;&gt; nome&lt;br /&gt;'Igor sobreira'&lt;br /&gt;&lt;br /&gt;capitalize() retorna a primeira letra de string em maiúscula, mas sem alterar o valor da string atual. Tambem tem o upper(), e o lower():&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; nome = 'igor'&lt;br /&gt;&gt;&gt;&gt; nome = nome.upper()&lt;br /&gt;&gt;&gt;&gt; nome&lt;br /&gt;'IGOR'&lt;br /&gt;&gt;&gt;&gt; nome.lower()&lt;br /&gt;'igor'&lt;br /&gt;&lt;br /&gt;Também é possivel procurar por um caracter numa string, mostrando seu índice, mas isso retornara um erro, caso nao encontre:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt;nome = 'python'&lt;br /&gt;&gt;&gt;&gt; nome.find('t')&lt;br /&gt;2&lt;br /&gt;&lt;br /&gt;Outro método muito interessante é o split():&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; '1+2+3+4+5'.split('+')&lt;br /&gt;['1', '2', '3', '4', '5']&lt;br /&gt;&lt;br /&gt;o argumento que splt() recebe, é onde a string será cortada, e retornara uma lista como o exemplo acima.&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; pasta = '/home/python/programa.py'&lt;br /&gt;&gt;&gt;&gt; pasta = pasta.split('/')&lt;br /&gt;&gt;&gt;&gt; pasta&lt;br /&gt;['', 'home', 'python', 'programa.py']&lt;br /&gt;&lt;br /&gt;Agora vamos fazer o inverso:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; '/'.join(pasta)&lt;br /&gt;'/home/python/programa.py'&lt;br /&gt;&gt;&gt;&gt; ' ---- '.join(pasta)&lt;br /&gt;'----home----python----programa.py'&lt;br /&gt;&lt;br /&gt;Agora o método que eu acho mais interessante de todos é o replace:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; nome = 'mergulhando em java'&lt;br /&gt;&gt;&gt;&gt; nome = nome.replace(' em java', ' no python')&lt;br /&gt;&gt;&gt;&gt; nome&lt;br /&gt;'mergulando no python'&lt;br /&gt;&gt;&gt;&gt; nome.replace('mergulhando em ','')&lt;br /&gt;'python'&lt;br /&gt;&lt;br /&gt;O replace pode ser utilizado pra tirar aquele estaço que fica no começo ou no final da string, mas, como não é surpresa,  o Python ja tem isso pronto, é o strip(), mas ele so tira do começo e/ou do final da string:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; nome = '     python e muito bom      '&lt;br /&gt;&gt;&gt;&gt; nome.strip()&lt;br /&gt;'python e muito bom'&lt;br /&gt;&lt;br /&gt;Ahh..quase ia me esquecendo, concatenar strings! Isso é algo muito dificil, creio que é a maior dificuldade de quem começa na linguagem:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; comeco = 'aprendendo '&lt;br /&gt;&gt;&gt;&gt; fim = 'python'&lt;br /&gt;&gt;&gt;&gt; comeco + fim&lt;br /&gt;'aprendendo python'&lt;br /&gt;&lt;br /&gt;Bem, e o print de Python, pode ser usado como o 'printf' de C:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; print 'aprendendo %s' %'python'&lt;br /&gt;aprendendo python&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;É claro que existem varios outros &lt;a href="http://www.python.org/doc/lib/node42.html"&gt;métodos para strings&lt;/a&gt;, esses são os mais usados, caso alguem lembre-se de outro, pode colocar nos comentários  :)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-116890882753047825?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/116890882753047825/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=116890882753047825' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/116890882753047825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/116890882753047825'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/01/trabalhando-com-strings_15.html' title='Trabalhando com strings'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-116845233963113321</id><published>2007-01-10T14:38:00.000-03:00</published><updated>2007-03-29T00:25:09.667-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>MSN feito em Python</title><content type='html'>&lt;span style="font-size:90%;"&gt;Ja saiu a primeira versão do Emesene, um messenger feito em Python e GTK, que da suporte ao protocolo MSN. Tem uma interface bastante intuitiva, leve e é multiplataforma.&lt;br /&gt;&lt;br /&gt;Acabei de testar e gostei muito. Ainda faltam algumas funcionalidades, como transferências de aquivos e mostrar avatar de usuário. Mas uma versão mais completa estará disponivel.&lt;br /&gt;&lt;br /&gt;Para fazer o donwload, &lt;a href="http://sourceforge.net/projects/emesene/"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Segue alguns screenshots do Emesene rodando no meu Ubuntu.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3084/4289/1600/504195/emesene.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3084/4289/320/148250/emesene.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3084/4289/1600/99906/emesene_janela.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3084/4289/320/373844/emesene_janela.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;Fonte: &lt;a href="http://www.yguarata.org/"&gt;yguarata.org&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-116845233963113321?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/116845233963113321/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=116845233963113321' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/116845233963113321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/116845233963113321'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/01/msn-feito-em-python.html' title='MSN feito em Python'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-116843938230819187</id><published>2007-01-10T11:02:00.000-03:00</published><updated>2007-03-29T00:25:50.861-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tecnologia'/><title type='text'>Novo Nokia N800</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3084/4289/1600/985771/n800_2.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3084/4289/320/244955/n800_2.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:90%;"&gt;A Nokia lançou seu novo internet tablet, o &lt;a href="http://europe.nokia.com/A4305062"&gt;N800&lt;/a&gt;, que veio para susceder o N770. Essa linha de aparelhos é voltada para conexão com a internet, não funciona como celular, ele vem com wi-fi e bluetooth, e suporta aplicações voip. Sua ótima resolução de 800 x 480 é perfeita para visualizar paginas web, tem navegador Opera, plugin de Flash 7, suporte a javascript, etc.&lt;br /&gt;&lt;br /&gt;Vem também com webcam VGA, microfone, auto-falantes, saida para fones de ouvido, mini-USB e dois slots SD, um interno e outro externo, que suportam até 2GB cada.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:90%;"&gt;&lt;br /&gt;Mas o mais interessante é que o N800 roda em cima de uma plataforma livre, a plataforma &lt;a href="http://www.maemo.org/about.html"&gt;Maemo&lt;/a&gt;, que é baseada em Linux, o que permite que desenvolvedores Linux portem facilemente suas aplicações.&lt;/span&gt;&lt;span class="" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Mais informações: &lt;a href="http://pythonologia.org/2007/01/08/novo-nokia-com-linux/"&gt;Pythonologia&lt;/a&gt;, &lt;a href="http://www.odontopalm.com.br/gsf/arquivo/2007/01/teteias_da_noki.html#more"&gt;Garota sem Fio&lt;/a&gt;.&lt;/span&gt;&lt;span class="down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-116843938230819187?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/116843938230819187/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=116843938230819187' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/116843938230819187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/116843938230819187'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/01/novo-nokia-n800.html' title='Novo Nokia N800'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-116839771192098478</id><published>2007-01-09T23:43:00.000-03:00</published><updated>2007-03-29T00:26:36.407-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Extraindo HTML de uma página</title><content type='html'>&lt;span style="font-size:90%;"&gt;Aproveitando a dica anterior sobre manipulação de arquivos, vou aprensentar uma biblioteca do Python usada pra extrair o codigo HTML de uma pagina web, a urllib.&lt;br /&gt;&lt;br /&gt;É bem parecido como a abertura de um aquivo texto, o metodo mais basico é o urlopen:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;import urllib&lt;br /&gt;pagina = urllib.urlopen('http://www.v2windcenter.com')&lt;br /&gt;codigo = pagina.read()&lt;br /&gt;pagina.close()&lt;br /&gt;print codigo&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:90%;" 90="" &gt;Para mais informações sobre o modulo&lt;a href="http://www.python.org/doc/lib/module-urllib.html"&gt; urllib&lt;/a&gt;.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-116839771192098478?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/116839771192098478/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=116839771192098478' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/116839771192098478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/116839771192098478'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/01/extraindo-html-de-uma-pgina.html' title='Extraindo HTML de uma página'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-116831644908027483</id><published>2007-01-09T01:20:00.000-03:00</published><updated>2007-03-29T00:27:17.960-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Manipulando arquivos</title><content type='html'>&lt;span style="font-size:90%;"&gt;Uma coisa bem interessante em Python é a manipulação de arquivos, que é bastante simples. Vamos tomar como exemplo o arquivo 'texto.txt' :&lt;br /&gt;&lt;br /&gt;&lt;font&gt;&gt;&gt;&gt; f = open( '/home/igor/texto.txt', 'w')&lt;/span&gt;&lt;/span&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&lt;br /&gt;&lt;br /&gt;a função open possui três argumentos: nome do arquivo, modo e buffer, sendo os dois ultimos opcionais. No exemplo acima, eu usei o nome e o modo 'w'. Vamos falar um pouco sobre os possiveis modos:&lt;br /&gt;&lt;br /&gt;Existem três tipos basicos de modos: 'w', 'r', 'a'. Write ('w') é usado para escrever algo no arquivo, apagando o que já havia nele, e caso o arquivo ainda não exista, ele será criado. Mas e se eu quiser apenas adicionar um texto sem apagar o que ja tinha la? Ai estamos falando no modo 'a' (append, pra quem conhece os metodos de listas isso deve ser familiar), agora todo o texto escrito será adicionado no final do que tinha anteriormente (lembrando que o texto inserido é no formato string, não tem nada a ver com listas), nesse caso, se o arquivo também não existir ele será criado sem problemas. E como era de se esperar, 'r' é usado para ler um arquivo já existente.&lt;br /&gt;&lt;br /&gt;Mas ainda tem alguns modificadores de modos:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; f = open('/home/igor/texto.txt','r+')&lt;br /&gt;&lt;br /&gt;quando um '+' é inserido no final de qualquer modo, ele possibilita tanto a leitura quanto a escrita.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; f = open('/home/igor/texto.txt','rb')&lt;br /&gt;&lt;br /&gt;Esse 'b', adicionado ao lado de algum modo, manuseia o arquivo em binario, e não em texto, como é o padrão.&lt;br /&gt;Caso não seja especificado nenhum modo na função open, sera atribuido 'r' (read), que é o padrão.&lt;br /&gt;&lt;br /&gt;O terceiro argumento, também opcional é o buffer, caso seja 0 ou False, não haverá buffer, ou seja, toda vez que o arquivo for ser utilizado, ele será manuseado diretamente do disco rigido; ja se for 1 ou True, então haverá buffer, o arquivo será manuseado da memoria, o que deixa o processo mais rápido. Caso for declarado um numero maior que 1, esse numero indicara o nivel de buffer (em bytes).&lt;br /&gt;&lt;br /&gt;Mas agora vamos ao que interessa, escrever:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; f = open('/home/igor/Python/texto','w')&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; f.write('Ola Mundo!')&lt;br /&gt;&lt;br /&gt;Como o modo padrão é texto, não é necessário a extensão .txt. Não podemos esquecer de fechar o arquivo:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:90%;"&gt;&lt;font&gt;&gt;&gt;&gt; f.close()&lt;/span&gt;&lt;/span&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&lt;br /&gt;&lt;br /&gt;Existem várias maneiras de ler o que está escrito, a basica é read()&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; f = open('/home/igor/Python/texto', 'r')&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; ler = f.read()&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; f.close()&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; print ler&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;Ola Mundo!&lt;br /&gt;&lt;br /&gt;O metodo read() usado sem nenhum argumento, mostrará tudo que esta no aquivo, mas se quisermos ler apenas os tres primeiros caracters (bytes), podemos usar da seguinte maneira:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; f = open('/home/igor/Python/texto')      #lembrando que o modo 'r' pode ser excluido pois e o padrao&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; ler = f.read(3)&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; print ler&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;Ola&lt;br /&gt;&lt;br /&gt;Aqui apenas especificamos que so serão lidos os tres primeiros caracters (bytes), e caso queira ler o restante, o read() começará de onde parou&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; restante = f.read()&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; print restante&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;Mundo!&lt;br /&gt;&lt;br /&gt;Agora vamos adicionar mais alguma coisa no nosso arquivo:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; f = open('/home/igor/Python/texto','a')&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; f.write('\nOla Python')&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:90%;"&gt;&lt;font&gt;&gt;&gt;&gt; f.close()&lt;/span&gt;&lt;/span&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&lt;br /&gt;&lt;br /&gt;Aqui usamos o 'a' (append), pra adicionar sem apagar o que ja havia no arquivo, e o '\n' é usado pra pular uma linha, lembrando que tudo é string. Agora vamos ver o resultado de outras maneiras:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; f = file('/home/igor/Python/texto', 'r')&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; linha1 = f.readline()&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; linha2 = f.readline()&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; f.close()&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; print linha1&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;Ola Mundo!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; print linha2&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;Ola Python&lt;br /&gt;&lt;br /&gt;O readline() sem argumento, ira ler todo o conteudo de uma linha, porem é possivel dar um limite de caracters, assim como o read. linha1 guarda o conteudo da primeira linha, quando eu chamamos o readline() mais uma vez, ele vai começar a ler de onde tinha parado, ou seja, na segunda linha. Caso não tenha percebido, ao inves de open, usamos file, que da o mesmo resultado.&lt;br /&gt;&lt;br /&gt;Pra quem é fã de lista (como eu), não poderia faltar um metodo que retornasse todo o conteudo do arquivo numa lista, e como tudo em Python, ele ja está pronto! É o readlines():&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:90%;"&gt;&lt;font&gt;&gt;&gt;&gt; f = open('/home/igor/Python/texto', 'r')&lt;/span&gt;&lt;/span&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;font&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; ler = f.readlines()&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; f.close()&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; print ler&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;['Ola Mundo!\n', 'Ola Python']&lt;br /&gt;&lt;br /&gt;Cada linha fica em um indice da lista, no formato de uma string.&lt;br /&gt;&lt;br /&gt;Para verificar se o arquivo foi realmente fechado, basta digitar:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;&gt;&gt;&gt; f.closed&lt;br /&gt;&lt;/span&gt;&lt;font&gt;&lt;span style="font-size:90%;"&gt;True&lt;br /&gt;&lt;br /&gt;Bem...espero ter esclarecido um pouco sobre manipulação de arquivos em Python, alguma duvida, complementação ou correção, podem comentar ou mandar um email.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-116831644908027483?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/116831644908027483/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=116831644908027483' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/116831644908027483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/116831644908027483'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/01/manipulando-arquivos_09.html' title='Manipulando arquivos'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38524186.post-116829014244387541</id><published>2007-01-08T17:55:00.000-03:00</published><updated>2007-03-29T00:30:52.213-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Outros'/><title type='text'>Primeiro post</title><content type='html'>&lt;span style="font-size:90%;"&gt;Bem, nesse primeiro post, gostaria de dizer o que tenho em mente ao criar este blog. Basicamente pretendo colocar dicas sobre a linguagem de programação Python, tenho muito pouca experiência com programação, então como estou aprendendo Python, tudo que eu for aprendendo e achando interessante na linguagem, vou escrever um pouco, dando dicas.&lt;br /&gt;&lt;br /&gt;Desse modo posso compartilhar  o que vou aprendendo e principalmente, alguem que esteja lendo e tenha alguma dica a mais, alguma atualização, correção, poderá deixar nos comentarios, ou me mandar um texto completo para ser publicado (igor@v2windcenter.com), afinal a principal meta desse blog é essa, a troca de informações.&lt;br /&gt;&lt;br /&gt;Como Python, assim como qualquer linguagem de programação, estão totalmente ligadas com tecnologia, também pretendo falar um pouco sobre novidades tecnológicas que venham a surgir.&lt;br /&gt;&lt;br /&gt;Espero ajudar um pouco quem estiver começando no Python, assim como eu, e também receber algumas dicas, pois o principal objetivo desse blog é o aprendizado. :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38524186-116829014244387541?l=defpython.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://defpython.blogspot.com/feeds/116829014244387541/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38524186&amp;postID=116829014244387541' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/116829014244387541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38524186/posts/default/116829014244387541'/><link rel='alternate' type='text/html' href='http://defpython.blogspot.com/2007/01/primeiro-post.html' title='Primeiro post'/><author><name>Nome: Igor Sobreira</name><uri>http://www.blogger.com/profile/07660575921940726369</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
