Mudanças entre as edições de "Introdução a Python - Parte 1"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 496: Linha 496:
  
 
'''3.''' Faça um jogo de par ou ímpar, em que o jogador aposta contra o computador. O jogador deve digitar um número entre 0 e 5 e optar entre par ou ímpar. O computador deve sortear um número também entre 0 e 5. Se a paridade da soma dos números do jogador e do computador for a mesma que o jogador optou, então ele ganha a partida, senão o computador vence.
 
'''3.''' Faça um jogo de par ou ímpar, em que o jogador aposta contra o computador. O jogador deve digitar um número entre 0 e 5 e optar entre par ou ímpar. O computador deve sortear um número também entre 0 e 5. Se a paridade da soma dos números do jogador e do computador for a mesma que o jogador optou, então ele ganha a partida, senão o computador vence.
 +
 +
 +
'''4.''' Modifique a aplicação extratora de imagens para que extraia apenas imagens cujo nome (ou caminho):
 +
* '''Seja um caminho relativo ou absoluto dentro do próprio servidor de onde se obteve o documento HTML:''' nesse caso, o nome da imagem é da forma ''/um/caminho/para/imagem.jpg'' ou ''subdir/onde/existem/imagens/imagem.png''. ''OBS:'' qualquer extensão de imagem é aceita ...
 +
* '''Seja uma URL que aponte o mesmo servidor de onde se obteve o documento HTML:''' o nome do servidor na URL da imagem deve ser idêntico ao contido na URl do documento HTML. Ex: se o documento HTML está na URL ''http://www.sj.ifsc.edu.br/cursos'', a URL de imagem ''http://www.sj.ifsc.edu.br/imagens/logo.png'' é aceita, mas ''http://wiki.sj.ifsc.edu.br/ifsc.jpg'' não.
  
 
=== Estruturas de repetição ===
 
=== Estruturas de repetição ===

Edição das 15h42min de 18 de outubro de 2016

Referências

Parte 1: Introdução à linguagem Python

Um primeiro exemplo

Qualquer tutorial de programação que se preze inicia com um exemplo do tipo Hello world !. Pois bem, em Python isso pode ser feito assim:

print('Hello world !')

Para executá-lo, há pelo menos duas maneiras:

  1. Usando o prompt do interpretador Python: isso é parecido com o uso do shell em um terminal.
    1. Em um terminal execute o interpretador Python:
      $ python3
      Python 3.4.3 (default, Sep 14 2016, 12:36:27) 
      [GCC 4.8.4] on linux
      Type "help", "copyright", "credits" or "license" for more information.
      >>>
      
    2. No prompt do interpretador digite a instrução para mostrar o Hello world ! e em seguida tecle ENTER:
      >>> print('Hello world !')
      
    3. Você deve ver na tela o resultado:
      >>> print('Hello world !')
      Hello world !
      >>>
      
  2. Criando um arquivo de script: um script é um programa executado por meio de um interpretador. Se a instrução para o Hello world ! for gravada em um arquivo da maneira mostrada a seguir, esse arquivo pode ser considerado um programa Python. Sendo assim:
    1. Crie o arquivo hello.py com seu editor favorito, e nele grave este conteúdo:
      #!/usr/bin/python3
      
      print('Hello world !')
      
    2. Ative a permissão de execução do seu arquivo hello.py:
      chmod +x hello.py
      
    3. Por fim, execute o programa hello.py:
      $ ./hello.py
      Hello world !
      $
      

Um pouco de história


Zen de Python

  • Belo é melhor que feio
  • Explícito é melhor que implícito
  • Simples é melhor que complexo
  • Complexo é melhor que complicado
  • Plano é melhor que aninhado
  • Esparso é melhor que denso
  • Legibilidade é importante
  • Casos especiais não são especiais o suficiente para quebrar as regras
  • Embora praticidade vença pureza
  • Erros nunca deveriam passar silenciosos
  • A não ser que explicitamente silenciados
  • Em face a ambiguidade, recuse a tentação de adivinhar
  • Deveria existir uma, e preferencialmente somente uma, maneira óbvia de fazer
  • Embora essa forma possa não ser óbvia de primeira, a não ser que você seja um holandês
  • Agora é melhor que nunca
  • Embora nunca é frequentemente melhor do que agora mesmo
  • Se a implementação é difícil de explicar, é uma má ideia
  • Se a implementação é fácil de explicar, pode ser uma boa ideia
  • Namespaces são uma grande e sonora ideia -- vamos fazer mais desses !

Uma simples (?) aplicação


Existem muitas possíveis aplicações que podem ser criadas com Python. Portanto o critério para escolher uma aplicação como tema para guiar esta introdução à linguagem é um tanto arbitrária. Nem por isso o programa a ser apresentado deixa de ser interessante. Afinal, o principal ponto é demonstrar como se pode criar com facilidade uma aplicação que faz uma tarefa não tão simples.

Imagine que seja necessário ter um programa que extraia automaticamente imagens existentes em páginas web. Esse programa basicamente acessa uma URL, e no documento web lá existente ele procura por imagens e as transfere para o computador. Esse programa precisaria do seguinte:

  1. Uma forma de obter o conteúdo de uma página web, dada sua URL.
  2. Identificar todas as referências a imagens contidas nessa página.
  3. Transferir cada uma das imagens para o disco local.


A primeira versão dessa aplicação pode ser vista a seguir. Ela somente mostra os nomes dos links das imagens existentes em uma determinada página. A URL dessa página deve ser informada como argumento de linha de comando:

#!/usr/bin/python3

# Importa alguns modulos necessarios

# Modulo de sistema (um modulo basico)
import sys

# Este modulo fornece um interpretador de conteúdo HTML
from bs4 import BeautifulSoup

# Este modulo fornece um acessador de conteudo web (cliente HTTP)
from urllib import request

# define a variavel "url", cujo conteudo eh o primeiro argumento de linha de comando 
# que deve conter uma URL
url = sys.argv[1]

# cria um acessador para acessar a URL
con = request.urlopen(url)

# Le todos os bytes do conteudo web identificado pela URL
dados = con.read()

# encerra a conexao do acessador
con.close()

# cria um analisador de conteudo HTML
parser = BeautifulSoup(dados, 'lxml')

# extrai uma lista de elementos HTML do tipo "img"
imagens = parser.find_all('img')

# itera a lista de elementos img
for img in imagens:
  # mostra o nome da imagem
  print(img['src'])

sys.exit(0)


Para executá-la, deve-se aplicar a técnica 2 (ver Primeiro exemplo):

  1. Copie o conteúdo do script Python para um arquivo chamado app1.py.
  2. Ative a permissão de execução desse arquivo
  3. Execute-o informando uma URL como argumento. Os caminhos das imagens serão mostrados em seguida (um por linha). Ex:
    $ ./app1.py http://mcc.sj.ifsc.edu.br 
    http://mcc.sj.ifsc.edu.br/files/2016/10/MCC_2016_TOPO-SITE_v3.jpg
    http://mcc.sj.ifsc.edu.br/files/2016/07/imagem_capa_site_mcc2016-1.png
    http://mcc.sj.ifsc.edu.br/wp-content/themes/responsive/core/icons/twitter-icon.png
    http://mcc.sj.ifsc.edu.br/wp-content/themes/responsive/core/icons/facebook-icon.png
    


Essa aplicação será explorada ao longo deste curso, quando diversas melhorias serão realizadas.

Elementos da linguagem

Python é uma linguagem com algumas características muito particulares, as quais a simplificam e a tornam muito rica e expressiva. Nesta parte do curso alguns elementos básicos da linguagem serão apresentados.

Apresentação de dados na tela

Uma necessidade elementar de um programa é apresentar informações na tela na forma de texto simples. Python oferece a função predefinida print, que mostra texto na tela de forma simples e com grande flexibilidade. Ela já foi vista no exemplo Hello world !, e aqui alguns detalhes sobre como usá-la serão mostrados.

A função print pode ser usada para mostrar um texto. Note que uma constante string pode ser delimitada tanto por aspas simples quanto duplas:

print('Um texto')
print("Outro texto")


Múltiplos argumentos podem ser passados à função, bastando separá-los por vírgulas. Ao serem apresentados, um espaço em branco é inserido entre eles:

print('Um texto',"Outro texto")

Valores de diferentes tipos podem ser mostrados com print, tais como números inteiros e ponto flutuante:

print('Numero inteiro:', 5)
print('Numero ponto-flutuante:', 3.1416)

Naturalmente, os valores a serem apresentados podem estar contidos em variáveis:

x = 5
pi = 3.1416
print('Numero inteiro:', x)
print('Numero ponto-flutuante:', pi)

Quando múltiplos valores são apresentados, pode-se modificar o separador inserido entre eles. Como já informado, incialmente o separador é um espaço em branco, mas ele pode ser qualquer coisa:

x = 5
pi = 3.1416
print('Numero inteiro:', x, sep='-->')
print('Numero ponto-flutuante:', pi, sep='...')


Por fim, print por default adiciona uma quebra de linha ao final dos dados apresentados, mas isso pode ser alterado. Por exemplo, se for desejável mostrar uma vírgula ao invés da quebra de linha:

x = 5
pi = 3.1416
print('Numero inteiro:', x, end=', ')
print('Numero ponto-flutuante:', pi)


Estrutura do código-fonte

Tipos de dados básicos

Python possui alguns tipos de dados básicos. A rigor, todos tipos de dados em Python são na verdade classes, e variáveis desses tipos são objetos. Isso abre um grande leque de operações que podem ser feitos com essas variáveis.

Tipos numéricos

Python possui três tipos numéricos:

  • Inteiros (int)
  • Ponto-flutuante (float)
  • Número complexo (complex)

Variáveis desses tipos são criadas principalmente ao se atribuirem constantes numéricas a elas:

# x é uma variável do tipo int
x = 1

# pi é uma variável do tipo float
pi = 3.1416

Tipos numéricos suportam operações aritméticas típicas:

x = 1
pi = 3.1416

# Soma de dois inteiros: resultado é inteiro
y = x + 2

# Soma de inteiro e float: resultado é float
z = x + pi

# Multiplicação de inteiros: resultado é inteiro
w = x * 2

# Multiplicação entre int e float: resultado é float
v = pi*x

# Divisão entre inteiros: resultado é float
y = y / 2

# Potenciação de int: resultado é int
x = x**2

# Potenciação de float: resultado é float
y = pi**3


Exercícios:

  1. Execute o programa acima. Que resultados ele apresenta ?
  2. Modifique o programa para que cada nova variável tenha seu valor mostrado na tela segundo este formato: nome_da_variável=valor_da_variável

Conversões entre os tipos de dados podem ser feitas usando diretamente as classes int e float:

  • Conversão para int:
    # pi é float
    pi = 3.1416
    
    # numero é uma string !
    numero = '12345'
    
    # converte os valores para int
    x = int(pi)
    y = int(numero)
    
    print('x:', x)
    print('y:', y)
    
  • Conversão para float:
    # x é int
    x = 23
    
    # numero é uma string !
    numero = '3.1416'
    
    # converte os valores para float
    y = int(x)
    pi = int(numero)
    
    print('y:', y)
    print('pi:', pi)
    

Tipo booleano

Python possui um tipo de dados booleano chamado bool. Basicamente ele pode armazenar apenas dois valores: True ou False. Esse tipo de dados deve ser útil ao se usarem estruturas de decisão.

ok = True
nok = False

# tipo booleano suporta operações lógicas
print('ok and nok:', ok and nok)
print('ok or nok:', ok or nok)
print('not ok:', not ok)
print('ok xor nok:', ok ^ nok)

# uma comparação gera um valor bool
a = 1
b = 2
print('a == b ?', a == b)
print('a != b ?', a != b)
print('a < b ?', a < b)
print('a > b ?', a > b)

Tipo string

Outro tipo de dados básico existente em Python é str. Seu uso mais elementar é armazenar texto (ou sequências de caracteres). Diversas operações básicas existem para string:

  • Criação de variáveis string: a forma mais comum é pela atribuição de constantes string:
    # uma constante string pode ser delimitada por aspas simples
    nome='Mandroval "O Cara"'
    
    # ... ou por aspas duplas
    sobrenome="Muvurunga 'da Silva'"
    
    # ou ainda por aspas triplas !
    endereco = '''Rua Cafundó, 0
    Vila Fim de Mundo
    Buraco Perdido, ZZ
    CEP: 00000-000'''
    
    print("Nome:", nome, sobrenome)
    print('Endereco:', endereco)
    
  • Concatenação: strings podem ser concatenadas usando-se o operador +:
    nome = 'Mandroval'
    sobrenome = 'Muvurunga'
    
    nome_completo = nome + ' ' + sobrenome
    
    print('Nome completo:', nome_completo)
    
  • Repetição: uma string pode ser repetida quantas vezes se desejar usando-se o operador *:
    aviso = 'Nao dormirei mais em aula !'
    saida = aviso * 100
    print(saida)
    
  • Comparação: string podem ser comparadas com poeradores ==, !=, < e >:
    nome = 'Mandroval'
    sobrenome = 'Muvurunga'
    
    print ('nome == sobrenome  ?', nome == sobrenome)
    print ('nome != sobrenome  ?', nome != sobrenome)
    print ('nome antecede alfabeticamente sobrenome  ?', nome < sobrenome)
    print ('nome cede alfabeticamente sobrenome  ?', nome > sobrenome)
    
  • Formatação: string podem ser criadas segundo um formato. Tal formato possibilita substituir partes da string por valores de diferentes tipos, de forma semelhante ao que se faz com o velho printf da linguagem C:
    x = 2
    
    # cria a string resultado segundo o formato indicado. Nele se substituem dois valores inteiros nas posições indicadas
    # por %d
    resultado = '%d elevado a 2 = %d' % (x, x**2)
    print(resultado)
    
    # cria a string resultado segundo o formato indicado. Nele se substitui um valores inteiro nas posição indicada
    # por %d, e um valor float onde aparece %f
    resultado = '%d / 3 = %f' % (x, x/3)
    print(resultado)
    
    nome = 'Mandroval'
    sobrenome = 'Maravilha'
    
    # apresenta nome e sobrenome no formato "sobrenome, nome". cada %s é substituído por uma string
    print('%s, %s' % (sobrenome, nome))
    
  • Comprimento: o comprimento de uma string é obtido com a função predefinida len:
    nome = 'Mandroval'
    
    print ('Comprimento de %s = %d' % (nome, len(nome))
    
  1. Acesso a um caractere específico: um caractere em uma posição específica de uma string pode ser acessado desta forma:
    nome = 'Mandroval'
    
    # posicoes positiva contam a partir do inicio da string
    inicial = nome[0]
    segundo = nome[2]
    
    # ... mas posicoes negativas contam a partir do final !
    ultimo = nome[-1]
    penultimo = nome[-2]
    
    print('Inicial:', inicial)
    print('Ultimo:', ultimo)
    
  • Acesso a um trecho da string: um trecho da string pode ser obtido usando esta sintaxe:
    nome = 'Mandroval'
    
    # obtem os três primeiro caracteres
    inicio = nome[:3]
    
    # ... e os três últimos:
    ultimos = nome[-3:]
    
    # ... e agora os caracteres entre a primeiro e último
    meio = nome[1:-1]
    
    print('Inicio:', inicio)
    print('Ultimos:', ultimos)
    print('Meio:', meio)
    
  • Existência de um caractere ou substring: pode-se facilmente verificar se um caractere ou substring existem dentro de uma string:
    nome = 'Mandroval'
    
    # operador "in" testa se o valor da esquerda existe na string da direita
    # o resultado é bool
    ok = 'a' in nome
    print('a existe em %s ?' % nome, ok)
    
    # o valor procurado pode ser uma substring
    ok = 'and' in nome
    print('and existe em %s ?' % nome, ok)
    
    # pode-se também verificar se o valor não existe
    ok = 'and' not in nome
    print('and NÃO existe em %s ?' % nome, ok)
    


Exercícios:

  1. Sejam

Estruturas de decisão

Como qualquer linguagem de programação (conferir !), Python possibilita que condições sejam testadas e ações correspondentes sejam executadas. A única estrutura de decisão disponível na linguagem é do tipo se condição então ... senão .... Porém ela possui algumas particularidades.


Ver este primeiro exemplo para a estrutura de decisão:

x = 5

if x < 10:
  print('%d é menor que 10 !' % x)
else:
  print('%d é maior ou igual a 10 !' % x)

O resultado a ser apresentado, que é um tanto óbvio, deve ser:

5 é menor que 10 !


Este primeiro exemplo mostra também uma característica importante da linguagem Python: blocos de sentença são delimitados de acordo com a identação. Duas ou mais sentenças pertencem ao mesmo bloco se estiverem alinhadas na mesma coluna de texto. Com isso, Python difere de outras linguagens, como C, C++ e Java, que usam chaves ({ }) para delimitar blocos de sentença. Um efeito dessa forma de delimitar blocos é obrigar o programador a identar seu código-fonte ... algo sempre apreciado ! No exemplo acima, o bloco de sentenças caso a condição seja verdadeira está deslocado duas colunas à direita ... mesmo havendo uma única sentença. O mesmo se pode verificar no bloco a ser executado caso a condição seja falsa. Ao menos uma coluna de texto deve ser deslocada à direita para se iniciar um novo bloco.


O interpretador Python é rigoroso quanto à identação. Se linhas de código sucessivas estiverem em colunas diferentes sem razão para tal, um erro é apresentado e o programa sequer é executado. Por exemplo, se o programa de demonstração do if for escrito assim:

x = 5

if x < 10:
  print('%d é menor que 10 !' % x)
 else:
  print('%d é maior ou igual a 10 !' % x)

... ao se tentar executá-lo isto será mostrado (supor que ele foi gravado em um arquivo err.py):

  File "./err.py", line 7
    else:
        ^
IndentationError: unindent does not match any outer indentation level


Python não possui a estrutura de decisão switch .. case. Porém, sua implementação de if .. else possui uma extensão elsif que torna switch .. case desnecessária. Ver este novo exemplo:

opcao = 3

if opcao == 1:
  print('escolhida a opcao 1')
elsif opcao == 2:
  print('escolhida a opcao 2')
elsif opcao == 3:
  print('escolhida a opcao 3')
elsif opcao == 4:
  print('escolhida a opcao 4')
else:
  print('Opcao %d desconhecida !' % opcao)

Exercícios:

1. Um radar de trânsito faz a medição de velocidade de veículos e, dependendo do valor, calcula a multa a ser aplicada. Em uma determinada via esse radar foi configurado da seguinte forma:

  • Se a velocidade for maior que 80 km/h, a multa é de R$ 360.
  • Se a velocidade for maior que 60 km/h, a multa é de R$ 180.
  • Se a velocidade for menor ou igual a 60 km/h, não há multa.

    Escreva um programa que calcule a multa de acordo com a velocidade de um veículo. A velocidade deve ser lida do teclado.


2. Na Universidade da California, no centro Médico de San Diego, quando um paciente com ataque cardíaco é recebido, dezenove variáveis são medidas ao longo das primeiras 24 horas. Essas incluem pressão sanguínea, idade, e 17 outras variáveis ordenadas e binárias (booleanas) que sumarizam os sintomas médicos considerados importantes indicadores da condição do paciente.

O objetivo de um estudo médico feito entre os anos 70 e 80 foi o desenvolvimento de um método para identificar pacientes de alto risco (que não sobreviverão ao menos 30 dias) com base nos dados obtidos nas primeiras 24 horas. O diagrama abaixo mostra uma regra de classificação que foi produzida nesse estudo. A letra F significa que não há um risco alto, e a letra G quer dizer paciente de alto risco. Essa regra classifica os pacientes como F ou G dependendo de respostas do tipo sim/não a no máximo três perguntas.

Crt-decisao.png


Implemente um programa que leia os valores necessários do teclado, e informe se o paciente o risco de vida do paciente.

(Exemplo obtido do livro Classification and Regression Trees, de Leo Breiman, Jerome Friedman, Richard Olshen e Charles Stone, editora Chapman & Hall, 1984).


3. Faça um jogo de par ou ímpar, em que o jogador aposta contra o computador. O jogador deve digitar um número entre 0 e 5 e optar entre par ou ímpar. O computador deve sortear um número também entre 0 e 5. Se a paridade da soma dos números do jogador e do computador for a mesma que o jogador optou, então ele ganha a partida, senão o computador vence.


4. Modifique a aplicação extratora de imagens para que extraia apenas imagens cujo nome (ou caminho):

  • Seja um caminho relativo ou absoluto dentro do próprio servidor de onde se obteve o documento HTML: nesse caso, o nome da imagem é da forma /um/caminho/para/imagem.jpg ou subdir/onde/existem/imagens/imagem.png. OBS: qualquer extensão de imagem é aceita ...
  • Seja uma URL que aponte o mesmo servidor de onde se obteve o documento HTML: o nome do servidor na URL da imagem deve ser idêntico ao contido na URl do documento HTML. Ex: se o documento HTML está na URL http://www.sj.ifsc.edu.br/cursos, a URL de imagem logo.png é aceita, mas ifsc.jpg não.

Estruturas de repetição

Tratamento de exceções

Tipos de dados não tão básicos

Leitura e escrita de arquivos

Módulos

APIs para string

De volta à simples aplicação

Parte 2: Introdução a pygame

Um primeiro exemplo

Elementos da API pygame

Um jogo de memória

Um jogo animado