CURSO PYTHON

Júlia Rizza

juliards@algartech.com

Relembrando o básico...

print("Hello, world!")

Download & Instalação

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

Windows

Mac (Homebrew)

Linux

Baixe e execute o .exe e então next, next, next...

$ brew install python3
$ sudo apt-get install python3

Características da linguagem

  • Interpretada
  • Blocos por indentação
  • Tipagem dinâmica
hello = True

if hello:
    print("Hello, world!")
else:
    print("Ops!")
using System;
namespace HelloWorld
{
    class Hello 
    {
        static void Main() 
        {
            bool hello = true;
        
            if (hello) {
                Console.WriteLine("Hello, world!");
            } else {
                Console.WriteLine("Ops!");
            }
        }
    }
}
Python
C#

Versões da linguagem

  • print agora é uma função, não mais uma palavra-chave

  • A operação de divisão diferencia-se da divisão inteira

  • A codificação das strings passou a ser unicode

2.7 x 3.x

Tipos básicos

  • Variáveis
  • Inteiros
  • Pontos flutuantes (floats)
  • Strings
  • Booleanos
  • Listas, tuplas e sets (arrays)
  • Dicionários (struct ou par chave-valor)
>>> inteiro = 10
>>> type(inteiro)
<class 'int'>

>>> decimal = 0.5
>>> type(decimal)
<class 'float'>

>>> texto = "Algar Tech"
>>> type(texto)
<class 'str'>

>>> booleano = True
>>> type(booleano)
<class 'bool'>

>>> lista = [1, 2, "a"]
>>> type(lista)
<class 'list'>

>>> tupla = (1, 2, "a")
>>> type(tupla)
<class 'tuple'>

>>> conjunto = {1, 2, "a"}
>>> type(conjunto)
<class 'set'>

>>> dicionario = {"chave": "valor"}
>>> type(dicionario)
<class 'dict'>

Operadores relacionais

>>> 1 == 2
False

>>> 1 != 2
True

>>> 1 < 2
True

>>> 1 > 2
False

>>> 1 <= 2
True

>>> 1 >= 2
False
Operador Valor
== Igual
!= Diferente
< Menor
> Maior
<= Menor ou igual
>= Maior ou igual

Operadores lógicos

>>> True and True
True

>>> True and False
False

>>> False and True
False

>>> False and False
False
>>> True or True
True

>>> True or False
True

>>> False or True
True

>>> False or False
False
>>> not True
False

>>> not False
True

Condições

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

if 2 * 10 == 20:
    print("Agora sim!")
if None:
    print("Nunca acontecerá!")
elif 2 * 10 == 20:
    print("Agora sim!")
else:
    print("Nem precisa...")
if None:
    print("Nunca acontecerá!")
else:
    print("Agora sim!")
if
if - else
if - elif - else

Repetições

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

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

counter = 1
while counter <= 10:
    print(counter)
    if counter % 3 == 0:
        break
    counter += 1
for item in [1,2,3,4,5,6,7,8,9,10]:
    print(i)

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

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

for item in [3,6,9]:
    if item == 4:
        print("4!")
        break
else:
    print("Sem 4 :(")
while
for ... in ...

Funções

def funcao(arg1, arg2):
    pass

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

soma(1, 5) # 6

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

repetir(8) # ********
repetir(3, '$') # $$$
  • Reutilização de código
  • Grande conjunto de funções builtins
  • Definem variáveis locais e globais

Orientação a Objetos

ABSTRAÇÃO

HERANÇA

Características

  • patas: 4
  • cor: azul
  • pulgas: 0

Ações

  • Andar
  • Latir

Classes

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

    def liga(self):
        print("Carro ligado!")

    def acelera(self, aumento):
        self.velocidade += aumento
        print(self.velocidade + "km/h")

    def para(self):
        self.velocidade = 0
        print("0km/h")

    def desliga(self):
        print("Carro desligado!")


meu_carro = Carro()
meu_carro.liga()      # Carro ligado!
meu_carro.acelera(50) # 50km/h
meu_carro.acelera(20) # 70km/h
meu_carro.para()      # 0km/h
class Gol(Carro):
    def __init__(self):
        Carro.__init__(self)
        self.cor = 'Prata'
        self.som_ligado = False

    def liga_som(self):
        self.som_ligado = True
        print("Som ligado!")

    def desliga_som(self):
        self.som_ligado = False
        print("Som desligado!")

    def desliga(self):
        self.desliga_som()
        print("Carro desligado!")


meu_gol = Gol()
gol.liga()      # Carro ligado!
gol.acelera(40) # 40km/h
gol.liga_som()  # Som ligado!
gol.para()      # 0km/h
gol.desliga()   # Som desligado!
                # Carro desligado!

Seguindo para o mais avançado...

Funções lambda

É uma função anônima, ou seja, não possui nome.

>>> cubo = lambda x: x**3
>>> cubo(2)
8

>>> funcao_qualquer(arg1, arg2=cubo)
  • Limitadas a uma só expressão lógica
  • Ideal para passar como parâmetro

Argumentos variáveis

Existem funções que recebem quantidades variáveis de argumentos. Para isso, utilizamos *args e **kwargs para representá-los. Da primeira forma, os valores são retornados em forma de tupla; da segunda, em forma de dicionário.

def multiplica(*args):
    resultado = 1
    for numero in args:
        resultado *= numero
    return resultado

>>> multiplica(2, 3, 5)
30
>>> multiplica(2, 3)
6

def dados(**kwargs):
    for chave, valor in kwargs.items():
        print(chave + ": " + str(valor))

>>> dados(nome="Julia", idade=21)
nome: Julia
idade: 21

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.

Funções builtin

  • Grande quantidade de funções builtin
  • Funções de uso comum e prático
Funções de conversão
>>> str(10)
'10'

>>> int('20')
20
Funções matemáticas
>>> min([32, 12, 220])
12

>>> max([32, 12, 220])
220

>>> d = [{'a': 1, 'b': 2}, {'a': 2, 'b': 1}]
>>> min(d, key=lambda item: item['b'])
{'a': 2, 'b': 1}

>>> sum([1, 2, 3])
6

>>> abs(2-3j)
3.605551275463989
Funções de manipulação
>>> len([1, 2, 3, 4, 5])
5

>>> len("Algar Tech")
10
>>> complex(2, 3)
(2+3j)

>>> pow(2, 3)
8

>>> round(2.7)
3

Funções builtin

Funções de iteráveis
>>> all([2>1, 3<59, 2!=3])
True

>>> any([2<1, 3<59, 2==3])
True

>>> enumerate(['Primavera', 'Verão', 'Outono', 'Inverno'])
[(0, 'Primavera'), (1, 'Verão'), (2, 'Outono'), (3, 'Inverno')]

>>> filter(lambda x: x>10, [3, 42, 15, 5, 7, 39])
[42, 15, 39]

>>> map(lambda x: x+1, [15, 20, 25, 30])
[16, 21, 26, 31]

>>> range(3, 10)
[3, 4, 5, 6, 7, 8, 9]

>>> sorted([3, 45, 20, 13, 29])
[3, 13, 20, 29, 45]

>>> zip(['a', 'b', 'c'], [1, 2, 3])
[('a', 1), ('b', 2), ('c', 3)]

Manipulação de arquivos

arquivo = open("texto.txt", 'w')
arquivo.write("Um texto bem interessante.")
arquivo.close()

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

with open("texto.txt", 'r') as arquivo:
    linhas = arquivo.readlines()
    for linha in linhas:
        print(linha)

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

valor_bin = "ALGUM_VALOR_BINARIO_DE_ARQUIVO"
with open("arquivo.formato", 'wb') as arquivo:
    arquivo.write(valor_bin)

Modos de abertura:

  • Leitura 'r'
  • Escrita 'w'
  • Adição 'a'
  • Leitura binária 'rb'
  • Escrita binária 'wb'

Módulos e bibliotecas

def fib(n):
    a, b = 0, 1
    while b < n:
        print(b)
        a, b = b, a+b

def fib2(n):
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result
fibo.py
# modo 1
import fibo
fibo.fib(1000)
print(fibo.fib2(1000))

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

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

Bibliotecas são conjuntos de módulos que ficam armazenados na pasta de binários do Python.

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

List Comprehension

É uma técnica para popular listas, onde a sintaxe é semelhante à sintaxe de conjuntos da matemática.

Por exemplo:

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

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

L = range(-100, 101)
C = [x for x in L if 0 < x <= 10]
>>> xl = ['a', 'b', 'c']
>>> yl = ['x', 'y', 'z']
>>> t = [x+y for x in xl for y in yl]
>>> print(t)
['ax', 'ay', 'az', 'bx', 'by', 'bz', 'cx', 'cy', 'cz']

Formatação de strings

>>> "Oi, eu sou %s e tenho %d anos" % ("Julia", 21)
'Oi, eu sou Julia e tenho 21 anos'

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

>>> "Oi, eu sou {} e tenho {} anos".format("Julia", 21)
'Oi, eu sou Julia e tenho 21 anos'

>>> "Oi, eu sou {nome} e tenho {idade} anos".format(nome="Julia", idade=21)
'Oi, eu sou Julia e tenho 21 anos'

>>> nome = "Julia"
>>> idade = 21
>>> f"Oi, eu sou {nome} e tenho {idade} anos"
'Oi, eu sou Julia e tenho 21 anos'

>>> "O preço é R$%.2f" % 2.449
'O preço é R$2.45'

>>> "O preço é R${preco:.3}".format(preco=2.449)
'O preço é R$2.45'

>>> preco = 2.449
>>> f"O preço é R${preco:.3}"
'O preço é R$2.45'

Formatação de strings

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

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

>>> "      espaços desnecessários   ".strip()
'espaços desnecessários'

>>> "Linguagem hacker".replace('a', '4')
'Lingu4gem h4cker'

>>> "Separando as palavras da frase".split(" ")
['Separando', 'as', 'palavras', 'da', 'frase']

>>> " ".join(["Juntando", "as", "palavras"])
'Juntando as palavras'

>>> "isso é um título formatado".title()
'Isso É Um Título Formatado'

>>> "um grito bem alto".upper()
'UM GRITO BEM ALTO'

>>> "Uma Conversa Normal".lower()
'uma conversa normal'

Manipulação de listas

>>> l1 = [0, 1, 2, 3]
>>> l2 = ['a', 'b', 'c', 'd']

>>> l1[0:2]
[0, 1]

>>> l1[:3]
[0, 1, 2]

>>> l1[0:4:2]
[0, 2]

>>> l1[::2]
[0, 2]

>>> l1[-1]
3

>>> l1[::-1]
[3, 2, 1, 0]

>>> l1 + l2
[0, 1, 2, 3, 'a', 'b', 'c', 'd']

Manipulação de listas

>>> l1 = [0, 1, 2, 3]
>>> l2 = ['a', 'b', 'c', 'd']

>>> l2.append('e')
['a', 'b', 'c', 'd', 'e']

>>> l2.pop(4)
'e'

>>> l2.remove('b')
['a', 'c', 'd']

>>> l2.index('c')
1

>>> l2.count('d')
1

Tratamento de erros

try:
    4/0
except ZeroDivisionError:
    print("Não pode dividir por zero!")

try:
    20/0
except Exception as e:
    print(f"Erro: {e}")

SyntaxError

IndexError

ValueError

TypeError

KeyError

NameError

IdentationError

Requests

Requisições HTTP e comunicação com APIs

import requests

URL = "http://example.com"
params = {"language": "pt-BR"}
headers = {
    "Content-Type": "application/json"
}
data = {
    "nome": "Julia",
    "idade": 21
}
user = "julia"
password = "1234"

response = requests.get(URL, params=params, headers=headers, json=data, auth=(user, password))
print(response.status)
print(response.text)
print(response.json())

APIs com Python

Utilizando um web framework para criar APIs

from flask import Flask, jsonify, abort

app = Flask(__name__)
users = [
    {
        "id": 1,
        "nome": "Fulano",
        "idade": 30
    },
    {
        "id": 2,
        "nome": "Ciclano",
        "idade": 40
    }
]

@app.route('/users/api/1.0/users', methods=['GET'])
def get_users():
    return jsonify({'users': users})

@app.route('/users/api/1.0/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
    user = [u for u in users if u["id"] == user_id]
    if len(user) == 0:
        return abort(404)
    return jsonify({"user": user[0]})

APIs com Python

Utilizando um web framework para criar APIs

@app.route('/users/api/1.0/users', methods=['POST'])
def create_user():
    if not request.json or not 'nome' in request.json:
        abort(400)
    user = {
        "id": users[-1]['id'] + 1,
        "nome": request.json['nome'],
        "idade": requests.json.get('idade')
    }
    users.append(user)
    return jsonify({"user": user}), 201


@app.route('/users/api/1.0/users/<int:user_id>', methods=['DELETE'])
def delete_user(user_id):
    user = [u for u in users if u['id'] == user_id]
    if len(user) == 0:
        abort(404)
    users.remove(user[0])
    return jsonify({'result': True})

Testes unitários

Testes automatizados de funcionalidades

def fib(n):
    if n < 2:
        return n
    else:
        return fib(n-1) + fib(n-2)
import unittest
from fibo import fib
 
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()
fibo.py
tests.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.

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

CURSO PYTHON

Júlia Rizza

juliards@algartech.com

Python - Algar Tech

By Júlia Rizza

Python - Algar Tech

  • 904