quarta-feira, 4 de abril de 2012

O que dá para aprender sobre Python em 02:30 hs?

Introdução:
OK, Ok, eu sei que vai depender do contexto, de quem está ensinando, de quem está aprendendo, do propósito da aula, etc.

Vou contextualizar para vocês:
Turma de Sistemas de Informação e Análise e Desenvolvimento de Software, 3º Semestre, experiência de linguagem de programação anterior: C.

Objetivo:
Demonstrar o quanto Python é fácil e versátil.

Sobre o Professor:
A aula sobre Python foi ministrada pelo meu amigo e especialista na linguagem João S. O. Bueno <gwidion at gmail dot com>

Qualquer absurdo escrito abaixo é responsabilidade minha, já que essas são minhas anotações e o João pode ter dito banana e eu escrevi tamarina.


Diferenças entre as linguagens:
C --> Compilado
Python --> Bit Code --> Acessa a VM e depois acessa o Hardware
Java --> Bit Code --> Acessa a VM e depois acessa o Hardware

C e Java --> Linguagens Estáticas
Python, Php, Javascript --> Dinâmicas

Python você não declara as variáveis para depois usar, você cria e sai usando. Surgiu em 1991

Sites sobre Python:
http://python.org e http://www.python.org.br

Começando a brincadeira:
Estavamos em um laboratório com CentOS 5, e a versão do python bem desatualizada, mas vamos em frente.

$ python
Python 2.4.3 (#1, Feb 22 2012, 16:06:13)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-52)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

Soma:
>>> 2+2
4

Exponenciação:
>>> 2 ** 4
16

Criar uma string:
>>> 'qualquer coisa'
'qualquer coisa'
>>> "qualquer coisa"
'qualquer coisa'
>>>

Definindo Variáveis:
>>> a=10
>>> a
10

>>> a="deo"
>>> a
'deo'


>>> a="faculdade "
>>> b="politecnica"
>>> a+b
'faculdade politecnica'

Não posso somar texto com número:
>>> "50" + 50
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects
>>>

Converter dados:
>>> int("10")+20
30

Transformei o texto em inteiro e somei, poderia ter lido de um arquivo texto por exemplo.

Inverso do anterior:
>>> str(20)+"20"
'2020'

Importar a biblioteca para manipulação de comandos do SO:
>>> import os

Mostra o arquivo que contem as funções:
>>> os
<module 'os' from '/usr/lib/python2.4/os.pyc'>

Listar os arquivos do diretório corrente:
>>> os.listdir(".")
['.redhat', '.nautilus', '.viminfo', 'upgrade.log.syslog', '.mysql_history', 'install.log.syslog', '.ICEauthority', '.eggcups', '.gconf', '.bashrc', '.thumbnails', '.dmrc', '.tcshrc', '.recently-used', '.evolution', '.config', '.gnome2_private', '.recently-used.xbel', '.bash_logout', '.cshrc', '.gnome', '.gstreamer-0.10', '\npolicamp\nping www.polysolve.com\nPS1=C:z> ', '.xsession-errors', '.metacity', 'Desktop', '.bash_profile', 'install.log', '.gtkrc-1.2-gnome2', 'anaconda-ks.cfg', '.themes', '.icons', '.Trash', '.esd_auth', '.mozilla', '.gnome2', '.gconfd', 'upgrade.log', '.bash_history', '.openoffice.org2.0']

Pegando informações de um vetor:
>>> arquivos=os.listdir(".")
>>> arquivos[0]
'.redhat'

>>> arquivos[20]
'.gnome'

Arquivos 0,1,2:
>>> arquivos[0:3]
['.redhat', '.nautilus', '.viminfo']

Lista em Python:
>>> b=[1,2,3]
>>> b
[1, 2, 3]

>>> b[0]
1

Em Python tudo são objetos, por isso o "+" se comporta de uma maneira para texto e outra para número.
Chamando métodos:
os.listdir

os --> módulo
listdir --> método


Convertendo para maiúsculas:
>>> b="policamp"
>>> b.upper()
'POLICAMP'
>>> b
'policamp'

>>> arquivos[30]
'.themes'
>>> arquivos[30].upper()
'.THEMES'

Lista de todos os métodos disponíveis para o objeto, uso o dir.
>>> dir (b)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__str__', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'replace', 'rfind', 'rindex', 'rjust', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

strip remove espaços em branco:
>>> c = " campinas "
>>> c
' campinas '
>>> c.strip()
'campinas'

Verificar se todos são alfanuméricos: isalpha:
>>> "abcd".isalpha()
True
>>> "abcd5".isalpha()
False

Multiplicar string:
>>> "qwe"*5
'qweqweqweqweqwe'

Ver tamanho da string:
>>> a="Policamp campinas - teste"
>>> len(a)
25
>>> len(b)
25000000

Ver objeto da string:
>>> b[1]
'o'
>>> b[0:100]
'Policamp campinas - testePolicamp campinas - testePolicamp campinas - testePolicamp campinas - teste'
>>>

Programa que pega uma url e conta quantas imagens tem o site (string img):
>>> import urllib
>>> html=urllib.urlopen("http://www.seufuturonapratica.com.br/portal/index.php?id=99").read()
>>> len(html)
55162
>>> print html[0:100]
<!DOCTYPE html
        PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
        <meta http-equiv="Con
>>> html.count("<img")
179

Achar a primeira ocorrencia:
>>> html.find("<img")
4207

Exibir a url:
>>> print html[4207:4350]
<img src="typo3temp/menu/1f118291ac.gif" width="200" height="20" border="0" alt="Avalia��o Institucional" /></a><a href="index.php?id=3036" onf
>>>

LIVRO: O Mínimo Absoluto Que Todo Desenvolvedor De Software Absolutamente, Positivamente Precisa Saber Sobre Unicode E Conjuntos de Caracteres (Sem Desculpas!)
 
Fonte: http://local.joelonsoftware.com/wiki/O_M%C3%ADnimo_Absoluto_Que_Todo_Desenvolvedor_De_Software_Absolutamente,_Positivamente_Precisa_Saber_Sobre_Unicode_E_Conjuntos_de_Caracteres_%28Sem_Desculpas!%29

>>> print html[4207:4350].decode("latin1")
<img src="typo3temp/menu/1f118291ac.gif" width="200" height="20" border="0" alt="Avaliação Institucional" /></a><a href="index.php?id=3036" onf

Existe o método encode também, além do encode.

Quero pegar todas as url:

split corta o texto:
>>> c="abc, def, fgh"
>>> c.split(",")
['abc', ' def', ' fgh']

>>> imagens=html.split("<img")
>>> len(imagens)
180
>>> print imagens[1]
 src="typo3temp/menu/1f118291ac.gif" width="200" height="20" border="0" alt="Avalia��o Institucional" /></a><a href="index.php?id=3036" onfocus="blurLink(this);"  >
>>> print imagens[2]
 src="typo3temp/menu/3c997a0c3b.gif" width="200" height="20" border="0" alt="CPA" /></a><a href="index.php?id=5811" onfocus="blurLink(this);"  >

O For do python percorre elementos de uma sequencia:
>>> for letra in "palavra":
...    print letra * 3
...
ppp
aaa
lll
aaa
vvv
rrr
aaa

Nao preciso abrir chaves, mas preciso identar...


Posso cortar dados de uma string também:
>>> "policamp"[2:]
'licamp'

Mostrou a URL de todas as imagens:
>>> for tag in imagens[1:] :
...    print tag.split('"')[1]
...

Para aprender uma linguagem precisamos aprender 3 coisas:
for, if e como definir uma função:

IF:
>>> a =1
>>> if a == 1:
...   print "a vale 1"
... else:
...   print "nao"
...
a vale 1

Definir a Função:
>>> def soma (a, b):
...    return a + b
...
>>> soma(4, 5)
9
>>> soma("a", "b")
'ab'
>>> soma("a", 5)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 2, in soma
TypeError: cannot concatenate 'str' and 'int' objects

>>> def testa(a) :
...    if a == 1:
...       print "a vale 1"
...    elif a < 5:
...       print "a eh menor que cinco"
...    else:
...       print "a eh grande"
...
>>> testa(1)
a vale 1
>>> testa(5)
a eh grande
>>> testa(4)
a eh menor que cinco

$ vi alo.py
# coding:utf-8

print "alô mundo"

$ python alo.py
alô mundo

Capturar dados:
$ vi alo.py
   
# coding:utf-8

nome = raw_input("seu nome ? ")
print "seu nome é", nome

$ python alo.py
seu nome ? André
seu nome é André

Pegar dados na sequencia inversa:
>>> a = [10,20,40]
>>> a[-1]
40
>>> a[-2]
20
>>> "abcde"[-1]
'e'

Programa que pergunta a url e baixa as imagens:
$ vi alo.py
   
# coding:utf-8
import urllib
def salva_imagem(url):
    try:
        dados = urllib.urlopen(url).read()
    except:
        print "erro para ", url
        return
    nome = url.split("/")[-1]
    arq = open(nome, "wb")
    arq.write(dados)
    arq.close()

def acha_urls(html):
    tag_imagens = html.split("<img")[1:]
    res = []
    for tag in tag_imagens:
        url = tag.split('"')[1]
        res.append(url)
    return res
   
pagina = raw_input("URL da qual baixar imagens: ")
html = urllib.urlopen(pagina).read()
imagens = acha_urls(html)
for imagem in imagens:
    print imagem
    salva_imagem(imagem)
   
Python com Interface Gráfica:
>>> import gtk

>>> janela = gtk.Window()
>>> botao = gtk.Button("Ok")

>>> def clicado(*args):
...         print "click"
...
   
>>> janela.add(botao)
>>> janela.show()
>>> botao.show()
>>> botao.connect("clicked", clicado)
>>> gtk.mainloop()

Como instalar bibliotecas no Python:
 
Ele tem um gerenciador de pacotes dele:
# yum install python-setuptolls.noarch

Instalar a biblioteca de Games para Python:
# easy_install pygame

py2exe --> Gera um "exe" do seu ".py" para distribuir para os usuários finais.

.pyc --> python compilado, geralmente o .py esta no mesmo diretorio

Na declaração da função ou na criação do programa, se na primeira linha eu usar
""" --> Documentação de help
bla bla bla
"""" --> Fechei a documentação

Igual o <<Label
bla bla bla
Label --> Em Shell Script

Ver o help:
>>> import os
>>> help(os)
q --> para sair

Orientação a objetos em Python:
>>> class Pessoa(object):
...     pass
...
>>> p = Pessoa()
>>> p
<__main__.Pessoa object at 0xb7b78eac>
>>> p.nome = "Joao"
>>> p.nome
'Joao'

>>> class Pessoa(object):
...     def __init__(self, nome="", idade=None):
...         self.nome = nome
...         self.idade = idade
...     def __repr__(self):
...         return "Pessoa: " + self.nome
        def maior_de_idade(self):
            if self.idade is None:
               raise Exception("Idade nao definida")
            return self.idade >= 18
...
>>> p = Pessoa()
>>> p
Pessoa:
>>> p = Pessoa("Daniel")
>>> p
Pessoa: Daniel
>>> p.nome
'Daniel'
>>> p.idade
>>> p.idade = 23
>>> p.idade
23
>>> p.idade = 18
>>> p.maior_de_idade()
True
>>> p2 = Pessoa("Luciana")
>>> p2
Pessoa: Luciana
>>> p2.maior_de_idade()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 9, in maior_de_idade
Exception: Idade nao definida

Livros sobre Python:
http://www.python.org.br/wiki/AprendaMais

Bom, foi essa a experiência que eu tive em 02:30 hs de aula de Python. Espero que seja tão útil para quem ler quanto foi para mim!

Obrigado João.

Um comentário:

Hálen Yuri Oliveira disse...

Fica a Dica pra quem gosta de estudar em casa ( ou não tem dinheiro, como eu ) ... http://learnpythonthehardway.org/

Abraços Déo