TREINAMENTO Python

Júlia Rizza

contato@juliarizza.com

python
1991

guido van rossum

  • Monty Python Flying Circus

  • Produtividade e legibilidade

  • Interpretada

    • Tradução dinâmica

  • Alto nível

  • LINDA DE BONITA!

alguém usa python?

Download & Instalação

https://www.python.org/downloads/

Windows

Execute o .exe e então: next, next, next :D

Mac (MacPorts)

sudo port install python34

Linux

sudo apt-get install python3
sudo apt-get install idle3

Python IDLE

arquivos .py

>>> print("Hello world!")
Hello World!

Na IDLE

No Arquivo .Py

# -*- coding: utf-8 -*-

print("Oi, galerão!")

fazendo contas

>>> 10+5 #adição
15

>>> 20-11 #subtração
9

>>> 2*10 #multiplicação
20

>>> 30/2 #divisão
15

>>> 2**4 #exponenciação
16

>>> 10 % 8 #resto da divisão inteira
2

>>> 120-30+2**3 #múltiplas operações
98

python  vs  c++

#include <iostream>
using namespace std;

void main() {
    cout << "Hello World!" << endl;
    system("pause");
}
# -*- coding: utf-8 -*-

print("Hello World!")
# -*- coding: utf-8 -*-
from random import randint

num = randint(1, 1001)
tentativas = 0
usuario = None

while usuario != num:
    usuario = int(input("Chute um número: "))
    tentativas += 1
    if usuario > num:
        print("O número é menor!\n")
    elif usuario < num:
        print("O número é maior!\n")

print("Parabéns! Você acertou o número!")
print("Foram feitas %d tentativas." % tentativas)

Faça um programa que gera um número aleatório de 1 a 1000. O usuário deve tentar acertar qual o número que foi gerado, a cada tentativa o programa deverá informar se o chute é menor ou maior que o número gerado. O programa acaba quando o usuário acerta o número gerado. O programa deve informar em quantas tentativas o número foi descoberto.

Principais tipos básicos

já ouviu falar de string?

num = 10
50
0.5
"Vlw flws"
True
[1, "a", num]
(1, 2, 3)
{123, 456}
{'k': 'v'}
variáveis
strings
tuplas
inteiros
booleanos
sets
floats
listas
dicts

variável

num = 10
num = 20
num += 12
print(num)

Não pode: conter espaços, começar com números ou ser uma palavra reservada.

and def exec if not return
assert del finally import or try
break elif for in pass while
class else from is print yield
continue except global lambda raise

inteiros e floats

10
2.5 #ponto!!
type(20) #int
type(4.7) #float

Operações básicas:

10+20
50-2.5
4*10
10.5/10
0 ** 0 #1
10 % 5
resto
exponenciação
divisão
multiplicação
subtração
soma

String

"Isso é uma string."
"10" #isso também
print("Vlw flws")
type("50") #string

Casos Especiais

  • Aspas simples e duplas
'I\'m an apple.'
  • Escapando caracteres
"I'm an apple."
  • Aspas triplas
"""
    Mais de uma
    linha.
    Vlw flws.
"""

booleano

True
False
(10 > 5)
type(True) #bool

Valores verdadeiros ou falsos ou interpretados como tal.

Aplicação binária

Comparações lógicas

Linguagem de máquina

listas, tuplas & sets

[5, 10, "20"]
('a', 5, 'c')
{1, 11, 23}
type([1,2,3]) #list
type((4,5,6)) #tuple
type({7,8,9}) #set

Diferenças: imutabilidade da tupla e não-repetição do set

  • "Slicing" = fatiamento
lista = [1, 20, 'c']
lista[0] #1
lista[1] #20
  • Métodos built-in
append(x)
pop() index(x)
count(x) sort() len()*

Obs: slicing e métodos não aplicáveis no Set

dicionário

{'key': 'value'}
{'nome': 'João', 'idade': 20}
dict(nome='João', idade=20)
type({'chave': 'valor'}) #dict

Definição: associação de valores à palavras-chave

operadores relacionais

Operador Valor
== Igual
!= Diferente
< Menor
> Maior
<= Menor ou Igual
>= Maior ou Igual
>>> 10 > 5
True
>>> 20 < 7
False
>>> (20**2) > 100
True
>>> (2*5) == 10
True
>>> 40 != (4*10)
False
>>> 3*5 <= 15
True
>>> 27 >= 120
False
>>> (2**5) != 32
False
>>> 10 % 2 == 1
False
>>> 120 % 6 == 0
True

operadores lógicos

>>> not False
True
>>> not True
False
>>> True and True
True
>>> True or False
True
>>> True and False
False
>>> 10 > 5 and 10 < 20
True
>>> 5 < 10 < 20 and 10 > 30
False
>>> 20 >= 21 or 11 < 9
False
>>> not 10 > 9
False
>>> not 120 % 60 != 0
True

condições

if (se)

if None:
    print('Nunca acontecerá!')

if 2*10 == 20:
    print('Agora acontece!')

elif (~ou se)

if None:
    print('Nunca acontecerá!')
elif 2*10 == 20:
    print('Agora acontece!')

else (se não)

if None:
    print('Nunca acontecerá!')
elif 2*10 != 20:
    print('Ainda não!')
else:
    print('Agora acontece!')

Utilize sempre indentação, brô!

loops (ou laços ou repetições)

repetição

print(1)
print(2)
print(3)
.
.
.
print(10)

while

i = 1
while (i <= 10):
    print(i)
    i += 1


##############################

i = 1
while (i <= 10):
    print(i)
    if i % 3 == 0:
        break
    i+= 1

for ... in ...

for i in [1,2,3,4,5,6,7,8,9,10]:
    print(i)

for i in range(1, 11):
    print(i)

################################

for i in [1,2,3]:
    if i == 4:
        print("4!")
        break
else:
    print("Sem 4 :(")

Utilize sempre indentação, brô!

ORIENTAÇÃO A OBJETOS

Abstração

Herança

Funções

def soma(a, b):
    return a+b

soma(1, 5) # 6
soma(3,19) # 22


def repetir(qtd, char='*'):
    return qtd*char

repetir(8)      # ********
repetir(5, '$') # $$$$$
string() int() set()
list() dict() float()
len() type() input()
max(a,b) min(a,b) range(inicio, fim)
  • Menos repetição
  • Realizar ações
  • Reutilização de código

variáveis locais e globais

a = 15

def trocas():
    a = 20
    return a

print(a) #15
trocas() #20

A posição da variável (dentro ou fora da função) faz diferença!

Classes

class Carro():
    def __init__(self):
        self.cor = 'Preto'
        self.lugares = 5
        self.velocidade = 0

    def acelera(self, aumento):
        self.velocidade += aumento

    def para(self):
        self.velocidade = 0

gol = Carro()
gol.acelera(50) # 50km/h
gol.acelera(20) # 70km/h
gol.para()      # 0km/h

self.característica define um atributo

self.função define um método da classe!

Herança (na prática)

class Gol(Carro):
    def __init__(self):
        Carro.__init__(self)
        self.cor = 'Prata'
        self.airbag = True
        self.som_ligado = False

    def liga_som():
        self.som_ligado = True

gol = Gol()
gol.acelera(40) # 40km/h
gol.para()      # 0km/h
gol.liga_som()  # som_ligado = True

As características e funcionalidades da classe Carro são mantidas na classe Gol.

Manipulação de arquivos

arquivo = open('texto.txt', 'w')
arquivo.write("""Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc semper, 
arcu a lacinia varius, nulla sem ultricies massa, nec convallis nulla augue efficitur 
ex. Sed in mollis nisi, sit amet hendrerit orci. Praesent eget lorem ac magna euismod 
vestibulum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sagittis ut 
lacus quis bibendum. Fusce in dictum mauris. In varius ex sit amet congue ornare. """)
arquivo.close()


arquivo = open('texto.txt', 'r')
texto = arquivo.readlines()
for linha in texto:
    print(linha)
arquivo.close()

Cria, lê e altera arquivos existentes no diretório informado.

Módulos e bibliotecas

Um módulo é um arquivo Python contendo definições e declarações.

def fib(n):    # escreve a sequência Fibonacci até o número n
    a, b = 0, 1
    while b < n:
        print b,
        a, b = b, a+b

def fib2(n): # retorna a sequência Fibonacci até o número n
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result
# modo 1
import fibo
fibo.fib(1000) # ou fib = fibo.fib
print(fibo.fib2(1000))

# modo 2
from fibo import *
fib(1000)
print(fib2(1000))

# modo 3
from fibo import fib
fib(1000)
print(fib2(1000))

# modo 3 e meio :P
from fibo import fib, fib2
fib(1000)
print(fib2(1000))

random           math           tkinter

Standard (inclusos na linguagem): https://docs.python.org/3/py-modindex.html

PyPI (Package Index):  https://pypi.python.org/pypi

fibo.py

contas.py

Interfaces Gráficas

#!/usr/bin/python

import tkinter

top = tkinter.Tk()

def hello_world():
    l = tkinter.Label(top, text="Hello world!")
    l.pack()

w = tkinter.Button(top, text="Clica em mim!", command=hello_world)
w.pack()

top.mainloop()

Usando o Tkinter, módulo padrão de Python:

Tkinter       PyGTK       PyQt       wxPython       JPython       Kivy

tratamento de erros

try:
    4/0
except ZeroDivisionError:
    print("Não foi dessa vez, champs!")

SintaxError

IdentationError

KeyError

NameError

TypeError

ValueError

IndexError

INDICAÇÕES & REFERÊNCIAS

Introdução à programação com Python - Nilo Ney

PARTE ii

FUNÇÕES ESPECIAIS

lambda: são funções anônimas que suportam argumentos e que aceitam apenas uma expressão, ou seja, funções de uma linha só.

substitui = lambda palavra: palavra.replace(" ", "_")
substitui("Treinamento de Python")
>>> Treinamento_de_Python

pass: é uma palavra especial utilizada para deixar algo (geralmente funções) em branco, ou seja, um comando para não fazer nada.

def soma(a,b):
    pass

for i in [1,2,3]:
    if i == 2:
        pass
    else:
        print("Não é 2!")

FUNÇÕES ESPECIAIS

Existem funções que podem ter uma quantidade de argumentos variáveis. Para passarmos isso na definição de uma função, usamos duas palavras especiais: *args e **kwargs. A primeira, faz com que os valores sejam recebidos e retornados no formato de tubla; a segunda, no formato de dicionário.

def mostra(*args):
    print(args)

>>> mostra("oi", 20, True)
>>> ("oi", 20, True)

def mostra(**kwargs):
    print(kwargs)

>>> mostra(a="oi", j=20, d=True)
>>> {'a': "oi", 'j': 20, 'd': True}
def mostra(**kwargs):
    print(kwargs)
    
>>> dic = {'nome': "Julia", 'idade': 19}
>>> mostra(**dic)
>>> {'nome': "Julia", 'idade': 19}

LIST COMPREhENSION

É uma nova forma de popular listas, onde a sintaxe se assemelha a sintaxe de conjuntos na matemática.

 

Por exemplo:

L = {-100, ... , -3, -2, -1, 0, 1, 2, 3, ... , 100}

C = {x | x ∈ L;  0 < x <= 10 }

L = range(-100, 100)
C = [x for x in L if 0 < x <= 10]
L = range(-100, 100)
C = [x-11 for x in L if 0 < x <= 10]

matrizes

Da mesma forma como fazemos em outras linguagens, uma matriz pode ser criada a partir de listas dentro de listas.

m = [[1,1,1],
     [2,2,2],
     [3,3,3]]

print(m[0][1]) # 1

## CUIDADO!!
m1 = [0,1,2]
m2 = [3,4,5]

m1 + m2 # NÃO É SOMA DE MATRIZES, É CONCATENAÇÃO (APPEND)
        # m1 + m2 => [0,1,2,3,4,5]

formatação de strings

São operações para modificar o conteúdo de uma string, seja adicionando elementos externos ou trabalhando com o que já existe na string.

Inserindo dados

"Oi, eu sou %s e tenho %d anos." % ("Fulano", 15)
>>> Oi, eu sou Fulano e tenho 15 anos.

"Oi, eu sou %(nome)s e tenho %(idade)d anos." % {'idade': 15, 'nome': "Fulano"}
>>> Oi, eu sou Fulano e tenho 15 anos.

"O preço é R$%.2f" % (10)
>>> O preço é R$10.00

formatação de strings

São operações para modificar o conteúdo de uma string, seja adicionando elementos externos ou trabalhando com o que já existe na string.

Inserindo dados

"Oi, eu sou {0} e tenho {1} anos.".format("Fulano", 15)
>>> Oi, eu sou Fulano e tenho 15 anos.

"Oi, eu sou {nome} e tenho {idade} anos.".format(idade=15, nome="Fulano")
>>> Oi, eu sou Fulano e tenho 15 anos.

"O preço é R${preco:.2}".format(preco=10)
>>> O preço é R$10.00

formatação de strings

São operações para modificar o conteúdo de uma string, seja adicionando elementos externos ou trabalhando com o que já existe na string.

MODIFICANDO dados

"minha mensagem.".capitalize()
>>> Minha mensagem.

"três tigres tristes comeram três pratos de trigo".count("tr")
>>> 4

"Tudo certo".endswith("rto") # o mesmo funciona para .startswith()
>>> True

"sem espaços aqui".replace(" ", "")
>>> "semespaçosaqui"

formatação de strings

São operações para modificar o conteúdo de uma string, seja adicionando elementos externos ou trabalhando com o que já existe na string.

MODIFICANDO dados

"separando em palavras".split(" ")
>>> ["separando", "em", "palavras"]

"           muito espaço        ".strip()
>>> "muito espaço"

"isso é um título charmoso".title()
>>> Isso É Um Título Charmoso

"um grito bem alto".upper() # o mesmo vale para .lower()
>>> 'UM GRITO BEM ALTO'

geradores

Iteradores: são, em geral, objetos que podem ser percorridos elemento por elemento. Por exemplo, listas, tuplas e até mesmo strings. Basicamente, objetos que podem ser percorridos por um for.

 

Geradores: são um padrão de design que criam objetos iteráveis nos quais os elementos são gerados um por vez, e não são armazenados na memória.

Como criar uma classe que segue o padrão gerador é algo tedioso e pouco legível, o Python oferece duas formas de se criar objetos geradores, as expressões geradoras e as funções geradoras.

funções geradoras

As expressões geradoras são similares às list comprehensions, exceto que elas são encapsuladas por parênteses e não colchetes.

 

As funções geradoras são funções nas quais ao invés de se retornar apenas uma vez, se "concede" um objeto repetidas vezes, sendo que em cada chamada à next um novo objeto é concedido.

 

Desta forma, pode-se criar iterações de tamanho indefinido sem ocupar um espaço significativo na memória!

def fib(max):
    a, b = 0, 1
    while a < max:
        yield a
        a, b = b, a + b

for i,f in zip(range(100), fibs()):
	print(f, end=", ")

módulos e pacotes

Módulo: É um agrupamento de código e funções de propósitos semelhantes. É um arquivo único.

 

Pacote: É um diretório que consiste em módulos, subpacotes, sub-subpacotes e assim por diante. Todos os módulos e subpacotes são reunidos a partir de um arquivo __init__.py.

 

 

módulos

def hello_world():
    print("Hello World!")

def hello_user(user):
    print("Hello, {0}!".format(user))
hello.py
import hello

hello.hello_world()
hello.hello_user("Fulano")
from hello import *

hello_world()
hello_user("Fulano")
from hello import hello_world, hello_user

hello_world()
hello_user("Fulano")
outro.py

pacotes

def laranja():
    print("Laranja!")
laranja.py
def pera():
    print("Pêra!")
pera.py
def laranja():
    print("Laranja!")
uva.py
from laranja import *
from pera import *
from uva import *
__init__.py
Frutas/
├── __init__.py
├── laranja.py
├── pera.py
└── uva.py
import Frutas
Frutas.laranja()

from Frutas.laranja import laranja
laranja()

bibliotecas externas

$ pip install thefuck

Pip é um sistema de gerenciamento de pacotes usado para instalar e gerenciar pacotes de software escritos em Python. A maior parte dos pacotes está no PyPI (Python Package Index) e pode ser encontrada em: https://pypi.python.org/pypi

teste unitário

São testes configurados para serem realizados e aprovados ou não automaticamente. Funciona assim: você sabe qual deve ser o resultado quando o programa realizar determinado procedimento, então você faz um teste que compara o resultado esperado com o que o programa está realmente devolvendo.

teste unitário

import unittest
from fibo import fibo
 
class testa_fibonacci(unittest.TestCase):
   def teste_um(self):
      self.assertEqual(fibo(0),0)
 
   def teste_dois(self):
      self.assertEqual(fibo(1),1)
 
   def teste_tres(self):
      self.assertEqual(fibo(7),13)
 
   def teste_quatro(self):
      self.assertEqual(fibo(10),55)
 
unittest.main()
def fibo(n):
   if n < 2:
      return n
   else:
      return fibo(n-1) + fibo(n-2)
fibo.py
teste.py

documentação

Para documentar programas, é convencional utilizarmos docstrings. São strings de aspas triplas que funcionam como comentários e geralmente estão localizadas no início de um programa ou na definição de classe ou função.

 

Dessa forma, podemos utilizar uma ferramenta externa que irá ler essas docstrings e irá gerar sua documentação em um formato mais legível, como HTML ou PDF. Por exemplo, o Sphinx: http://www.sphinx-doc.org/en/stable/#

documentação

def hello_user(user):
    """
    Função que exibe "Hello " + o nome do usuário na tela.
    Exemplo: hello_user("Fulano")
             >>> "Hello Fulano"
    """
    print("Hello {0}".format(user))

pep8

A PEP8 (Python Enhancement Proposal 8) é um guia de boas práticas. Não é obrigatório que você siga tudo o que está escrito lá, mas é uma recomendação para que seu código fique legível, bem escrito e profissional. Além de facilitar a vida de quem for trabalhar com você e contribuir com seu código.

$ pip install autopep8

exercícios

Faça um programa que, dado um número inteiro, fornece como resultado a soma dos números representados por esses algarismos. Exemplo: Numero digitado (123) deve fornecer resultado (6).

# -*- coding: utf-8 -*-

num = input("Amigão, diz um número aí: ")

soma = 0
for i in range(len(num)):
    soma += int(num[i])

print(soma)

Faça um programa que calcule o comprimento e a área de uma circunferência, cada um por meio de uma função diferente, quando o usuário informar o raio. As fórmulas são, respectivamente:

Comprimento = 2*pi*R

Área = 4/3(pi*R²)

# -*- coding: utf-8 -*-

def calc_area(raio):
    return (4/3)*(3.14*(raio**2))

def calc_comprimento(raio):
    return 2*3.14*raio

raio = int(input("Informe o raio da circunferencia: "))
print("O comprimento e: %.2f" % calc_comprimento(raio))
print("A area e: %.2f" % calc_area(raio))

Escreva um programa que solicite o preço de uma mercadoria e o percentual de desconto e armazene os valores no dicionário. Utilize o dicionário para retornar os valores e fazer o cálculo do preço com o desconto.

# -*- coding: utf-8 -*-

produto = {}
produto['preco'] = float(input("Informe o preço: "))
produto['desconto'] = int(input("Informe o desconto (em %): "))
produto['preco_final'] = produto['preco'] - (produto['preco']*\
                                            (produto['desconto']/100))
print("O produto custava {preco} e o novo preço é: \
       {preco_final:.2f}".format(
                                 preco=produto['preco'], 
                                 preco_final=produto['preco_final']
                                ))

Escreva um programa que solicite o preço de uma mercadoria e o percentual de desconto e armazene os valores no dicionário. Utilize o dicionário para retornar os valores e fazer o cálculo do preço com o desconto.

# -*- coding: utf-8 -*-

produto = {}
produto['preco'] = float(input("Informe o preço: "))
produto['desconto'] = int(input("Informe o desconto (em %): "))
produto['preco_final'] = produto['preco'] - (produto['preco']*\
                                            (produto['desconto']/100))
print("O produto custava {preco} e o novo preço é: \
       {preco_final:.2f}".format(
                                 preco=produto['preco'], 
                                 preco_final=produto['preco_final']
                                ))

Escreva um programa para calcular a redução do tempo de vida de um fumante. Pergunte a quantidade de cigarros fumados por dia e quantos anos ele já fumou. Considere que um fumante perde 10 minutos de vida a cada cigarro, calcule quantos dias de vida um fumante perderá. Exiba o total em dias.

# -*- coding: utf-8 -*-

cig_dia = int(input("Quantidade de cigarros por dia: "))
anos = int(input("Quantos anos fumando? "))
minutos = 10*cig_dia*anos*365
dias = minutos/1440
print("Voce perdeu {dias:.2f} dias de vida.".format(dias=dias))

Escreva um programa que pergunte a distância que um passageiro deseja percorrer em km. Calcule o preço da passagem, cobrando R$ 0,50 por km para viagens de até 200 km e R$ 0,45 para viagens mais longas.

# -*- coding: utf-8 -*-

km = int(input("Quantos km deseja percorrer? "))
if km < 200:
    preco = 0.5 * km
else:
    preco = 0.45 * km
print("O valor da passagem e R${preco:.2f}".format(preco=preco))

Escreva um programa que leia números inteiros do teclado e armazene-os numa lista. O programa deve ler os números e armazenar até que o usuário digite 0 (zero). No final da execução, exiba a quantidade de números digitados, assim como a soma e a média aritimética.

# -*- coding: utf-8 -*-

print("Pressione 0 para sair!")
lista = []
num = 1
while(num != 0):
    num = int(input("Insira um número: "))
    lista.append(num)
soma = 0
for num in lista:
    soma += num
media = soma/len(lista)
print("{quant} números digitados, \
       sua soma é {soma} e a média é {media:.2f}".format(
                                                         quant=len(lista),
                                                         soma=soma,
                                                         media=media
                                                        )

Escreva uma classe Cliente que tenha como atributos os dados de um usuário (nome, telefone, idade, etc) e métodos alterar_nome, alterar_idade, etc.

# -*- coding: utf-8 -*-

class Cliente():
    def __init__(self):
        self.nome = ""
        self.idade = ""
        self.telefone = ""

    def muda_nome(self, nome):
        self.nome = nome
        print("Novo nome: %s" % nome)

    def muda_idade(self, idade):
        self.idade = idade
        print("Nova idade: %d" % idade)

    def muda_telefone(self, telefone):
        self.telefone = telefone
        print("Novo telefone: %s" % telefone)

exercícios uri

  • 1036
  • 1014
  • 1933
  • 1983
  • 2006
  • 1169
  • 1047
  • 1131
  • 1160
  • 1024
  • 1168
  • 1234
  • 1436
  • 1520
  • 1025
  • 1069

TREINAMENTO python

Júlia Rizza

contato@juliarizza.com

Treinamento Python - LIT

By Júlia Rizza

Treinamento Python - LIT

  • 1,605