Introdução ao Python - wiki.sj.ifsc.edu.br · Combinação de atribuição e operação ... Tipos...
Transcript of Introdução ao Python - wiki.sj.ifsc.edu.br · Combinação de atribuição e operação ... Tipos...
Introdução ao Python
Roberto W. Nóbrega
Instituto Federal de Santa CatarinaCampus São José
Café com Linux21 de maio de 2015
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 1 / 49
Introdução
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 2 / 49
Histórico
Guido van Rossum
BDFL (benevolentdictator for life)
1989: primeira implementação1994: versão 1.02000: versão 2.02008: versão 3.0(não compatível com a versão 2)
2014: versão 3.4(atual)
2015: versão 3.5(prevista para setembro)
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 3 / 49
Licença e implementação
Python Software Foundation License (PSFL)(aprovada pela FSF e pela OSI; compatível com GPL)
Multi-plataforma
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 4 / 49
Características básicas
Interpretada
Multi-propósitoScriptingProgramação webInterfaces gráficas (GUI)Aplicações científicas
Multi-paradigmaOrientada a objetosImperativaFuncional
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 5 / 49
Quem usa Python?
https://wiki.python.org/moin/OrganizationsUsingPythonhttp://en.wikipedia.org/wiki/List_of_Python_software
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 6 / 49
The Zen of Python, por Tim Peters
Bonito é melhor que feio.
Explícito é melhor que implícito.
Simples é melhor que complexo.
Complexo é melhor que complicado.
Plano é melhor que aglomerado.
Esparso é melhor que denso.
Original: https://www.python.org/dev/peps/pep-0020/Tradução: http://wiki.python.org.br/TheZenOfPython
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 7 / 49
The Zen of Python, por Tim Peters
Legibilidade faz diferença.
Casos especiais não são especiais o
bastante para quebrar as regras.
Embora a praticidade vença a pureza.
Erros nunca devem passar
silenciosamente.
A menos que sejam explicitamente
silenciados.
Diante da ambiguidade, recuse a
tentação de adivinhar.
Original: https://www.python.org/dev/peps/pep-0020/Tradução: http://wiki.python.org.br/TheZenOfPython
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 7 / 49
The Zen of Python, por Tim Peters
Deve haver um –- e preferencialmente só
um –- modo óbvio para fazer algo.
Embora esse modo possa não ser óbvio à
primeira vista a menos que você seja
holandês.
Agora é melhor que nunca.
Embora nunca freqüentemente seja melhor
que *exatamente* agora.
Se a implementação é difícil de
explicar, é uma má ideia.
Se a implementação é fácil de explicar,
pode ser uma boa ideia.
Original: https://www.python.org/dev/peps/pep-0020/Tradução: http://wiki.python.org.br/TheZenOfPython
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 7 / 49
Olá, mundo!
Java:
public class HelloWorld {public static void main(String[] args) {
System.out.println("Hello, world!");}
}
Python:
print(’Hello, world!’)
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 8 / 49
Indentação
C:
if (condição_A) {comando_1;if (condição_B) {
comando_2;}
}else if (condição_C) {
comando_3;}else {
comando_4;}comando_5;
Python:
if condição_A:comando_1if condição_B:
comando_2elif condição_C:
comando_3else:
comando_4comando_5
Indentação é obrigatória!Recomendação: sempre 4 espaços,
nunca tab.
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 9 / 49
xkcd 353, por Randall Munroe
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 10 / 49
Python básico
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 11 / 49
Atribuição de variáveis
>>> a = 10>>> a10
>>> x, y = a - 1, a + 1>>> x9>>> y11
>>> x, y = y, x # Swap>>> x11>>> y9
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 12 / 49
Tipos de dados padrão: Básicos
Booleanobool : False
Numéricosint : -10float : 6.28complex : 1.0 - 4.2j
Stringstr : ’Café com Linux’
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 13 / 49
Booleanos
>>> not TrueFalse
>>> True or FalseTrue
>>> True and FalseFalse
>>> 0 == 1False
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 14 / 49
Inteiros
>>> a = 150>>> a + 2152
>>> a - 2148
>>> 2 * a300
>>> a / 2 # Resultado de ’/’ é sempre float!75.0
>>> 2**a # Exponenciação (** e não ^)1427247692705959881058285969449495136382746624
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 15 / 49
Floats
>>> import math>>> tau = 2 * math.pi>>> tau6.283185307179586
>>> math.sin(tau/4)1.0
>>> 3 * 0.1 # Python não tenta te enganar0.30000000000000004
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 16 / 49
Inteiros vs floats: Sutilezas
>>> 1 + 1 # Resultado é int2>>> 1.0 + 1 # Resultado é float2.0>>> 7 / 41.75>>> 4 / 4 # Resultado de ’/’ é sempre float1.0>>> 7 // 4 # Divisão inteira1>>> 7 % 4 # Resto da divisão por 43
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 17 / 49
Inteiros vs floats: Conversões
>>> int(1.9) # Conversão para int1>>> float(1) # Conversão para float1.0
>>> math.trunc(1.9), math.trunc(-1.9) # Equivalente a int()(1, -1)>>> math.floor(1.9), math.floor(-1.9)(1, -2)>>> math.ceil(1.9), math.ceil(-1.9)(2, -1)>>> round(1.9), round(-1.9)(2, -2)
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 18 / 49
Inteiros vs floats: Mais sobre round
>>> round(0.5), round(1.5), round(2.5), round(3.5)... # Em caso de empate: arredonda para tornar par(0, 2, 2, 4)
>>> round(1234.25) # sem 2o argumento: retorna int1234>>> round(1234.25, 0) # com 2o argumento: retorna float1234.0
>>> round(1234.25, 1)1234.2>>> round(1234.25, -1)1230.0
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 19 / 49
Operações de comparação
>>> 2**10 == 1024True
>>> (1 + 2 + 3 + 4 + 5 + 6) != (6 * 7) // 2False
>>> (tau/2 > 3, tau/2 <= 3.14)(True, False)
>>> 3 * 0.1 == 0.3 # Extremo cuidado ao comparar floats!False
>>> x = 0.75>>> 0 <= x < 1 # Equivalente a (0 <= x) and (x < 1)True
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 20 / 49
Numeros complexos
>>> z = 1/2 - 17j # Alternativamente: complex(1/2, -17)>>> z(0.5-17j)
>>> z.real0.5>>> z.imag-17.0
>>> from cmath import polar, rect>>> polar(1 + 1j)(1.4142135623730951, 0.7853981633974483)
>>> rect(1, tau/8)(0.7071067811865476+0.7071067811865475j)
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 21 / 49
Strings
>>> ’Café com Linux’ # Unicode!’Café com Linux’>>> "Café com Linux" # Aspas duplas também funcionam.’Café com Linux’
>>> "Aspas \"duplas\" no string"’Aspas "duplas" no string’>>> ’Aspas "duplas" no string’’Aspas "duplas" no string’
>>> "Aspas ’simples’ no string""Aspas ’simples’ no string">>> ’Aspas \’simples\’ no string’"Aspas ’simples’ no string"
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 22 / 49
Combinação de atribuição e operação
>>> variavel_com_nome_longo = 10
>>> variavel_com_nome_longo = variavel_com_nome_longo + 2>>> variavel_com_nome_longo12
>>> variavel_com_nome_longo += 2>>> variavel_com_nome_longo14
>>> variavel_com_nome_longo /= 10>>> variavel_com_nome_longo1.4
Obs: A sintaxe x++ não existe em Python
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 23 / 49
Tipos de dados padrão: Coleções
Lista, tupla e rangelist : [0, 1, 4, 9, 16, 25]tuple : (’Café com Linux’, 2015)range : range(10)
Dicionáriodict : {’evento’: ’Café com Linux’, ’ano’: 2015}
Conjuntoset : {0, 1, True, ’Café’}
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 24 / 49
Listas
>>> lista = [0, 1, 2, 3]
>>> lista.append(’Linux’)>>> lista[0, 1, 2, 3, ’Linux’]
>>> lista.extend([True, 2])>>> lista[0, 1, 2, 3, ’Linux’, True, 2]
>>> lista.reverse()>>> lista[2, True, ’Linux’, 3, 2, 1, 0]
>>> ’Linux’ in lista # Checa se é membroTrue
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 25 / 49
Indexação
>>> lista[2, True, ’Linux’, 3, 2, 1, 0]>>> len(lista) # Comprimento da lista7
>>> lista[0] # O primeiro elemento é indexado por 02>>> lista[2]’Linux’>>> lista[6] = ’Café’>>> lista[2, True, ’Linux’, 3, 2, 1, ’Café’]
>>> lista[7]# IndexError: list index out of range
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 26 / 49
Indexação negativa
>>> lista[2, True, ’Linux’, 3, 2, 1, ’Café’]
>>> lista[-1] # Equivalente a lista[6]’Café’>>> lista[-2] # Equivalente a lista[5]1>>> lista[-7] # Equivalente a lista[0]2>>> lista[-8]# IndexError: list index out of range
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 27 / 49
Ranges
>>> r = range(4)>>> rrange(0, 4)
>>> list(r)[0, 1, 2, 3]
>>> list(range(1, 6))[1, 2, 3, 4, 5]
>>> list(range(1, 18, 3))[1, 4, 7, 10, 13, 16]
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 28 / 49
Compreensão de listas
>>> [n for n in range(1, 8)] # Ou list(range(1, 8))[1, 2, 3, 4, 5, 6, 7]
>>> [n**2 for n in range(1, 10)][1, 4, 9, 16, 25, 36, 49]
>>> [n**2 for n in range(1, 10) if n % 2 == 1][1, 9, 25, 49]
>>> [1 / n**2 for n in range(1, 10) if n % 2 == 1][1.0, 0.1111111111111111, 0.04, 0.02040816326530612]
>>> sum(1 / n**2 for n in range(1, 10000) if n % 2 == 1)1.2336505501363413>>> math.pi**2 / 81.2337005501361697
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 29 / 49
Tuplas
>>> t = (’Café com Linux’, 2015)>>> t[0]’Café com Linux’>>> t[0] = ’Café com Windows’# TypeError: ’tuple’ object does not support item assignment
Diferença entre listas e tuplas:1 Listas são mutáveis; tuplas são imutáveis (mais rápido)2 Semântica:
Se você sair para uma caminhada, você pode anotar suas coordenadas aqualquer instante numa tupla (x, y). Se você quiser registrar sua jornada, vocêpode anexar (a cada minuto) sua posição em uma lista.— dan-gph, usuário do Stack Overflow
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 30 / 49
Dicionários
>>> d = {’evento’: ’Café com Linux’, ’ano’: 2015}>>> d[’evento’]’Café com Linux’
>>> d[’ano’] = 3000>>> d{’evento’: ’Café com Linux’, ’ano’: 3000}
>>> d = dict([(2, ’two’), (1, ’one’), (3, ’three’)])>>> d{1: ’one’, 2: ’two’, 3: ’three’}
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 31 / 49
Conjuntos
>>> s = {1, 2, 3, 1} # Elementos repetidos são ignorados>>> s{1, 2, 3}
>>> s.add(0) # Adiciona um novo elemento>>> s{0, 1, 2, 3}
>>> s.update({4, 5}) # Adiciona novos elementos>>> s{0, 1, 2, 3, 4, 5}
>>> set([’Café’, ’Chá’, ’Suco’]) # set a partir de list{’Café’, ’Suco’, ’Chá’}
Obs: A versão imutável de set é frozenset
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 32 / 49
Operações com conjuntos
>>> todos = {1, 2, 3, 4, 5, 6}>>> impares = {1, 3, 5}>>> primos = {2, 3, 5}
>>> impares | primos # União{1, 2, 3, 5}
>>> impares & primos # Intersecção{3, 5}
>>> impares ^ primos # Diferença simétrica{1, 2}
>>> todos - impares # Diferença{2, 4, 6}
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 33 / 49
Slicing
>>> import string>>> alphabet = string.ascii_uppercase; alphabet’ABCDEFGHIJKLMNOPQRSTUVWXYZ’
>>> alphabet[3 : 5]’DE’>>> alphabet[1 : 6 : 2]’BDF’
>>> alphabet[: 13]’ABCDEFGHIJKLM’>>> alphabet[13 :]’NOPQRSTUVWXYZ’
>>> alphabet[5 : -2]’FGHIJKLMNOPQRSTUVWX’
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 34 / 49
Controle de fluxo
for/in:
for element in iterable:corpo [utiliza element]
while:
while condição:corpo
if/elif/else:
if condição_1:corpo_A
elif condição_2: # Pode ter mais de um elifcorpo_B
else:corpo_C
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 35 / 49
Funções
def função(arg1, arg2, ...):corporeturn valor # return é opcional
Funções λ:>>> square = lambda x: x**2>>> square(4)16
Obs: Funções são objetos que podem sermanipulados e passados a outras funções!
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 36 / 49
Funções com argumentos opcionais
def root(x, n=2):return x**(1/n)
>>> root(2)1.4142135623730951>>> root(2, 3)1.2599210498948732
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 37 / 49
Classes
Tudo em Python é um objeto.
class Classe(cls1, cls2, ...):def método_1(self, arg1, arg2, ...):
comandos
def método_2(self, arg1, arg2, ...):comandos
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 38 / 49
Snippets
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 39 / 49
Fibonacci
def fib(n):a, b = 0, 1for _ in range(n):
a, b = b, a + breturn a
>>> [fib(n) for n in range(10)][0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 40 / 49
Quicksort
def qsort(list):if not list:
return []else:
head, tail = list[0], list[1:]less = [x for x in tail if x < head]more = [x for x in tail if x >= head]return qsort(less) + [head] + qsort(more)
>>> qsort([-1, 5, 2, 17, -4, 5])[-4, -1, 2, 5, 5, 17]
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 41 / 49
Integração numérica: método dos trapézios
def trapz(f, a, b, n):h = (b - a) / n # passo de integraçãos = f(a) / 2for i in range(1, n):
s += f(a + i*h)s += f(b) / 2return s * h
>>> f = lambda x: math.sqrt(1 - x**2) # semicírculo unitário>>> trapz(f, -1, 1, 10000)1.5707946637152863>>> math.pi / 21.5707963267948966
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 42 / 49
Cifra de César
import string
def caesar(shift, str_):alphabet = string.ascii_uppercaseN = len(alphabet)d = {’ ’: ’ ’}for (i, char) in enumerate(alphabet):
d[char] = alphabet[(i + shift) % N]return ’’.join(d[char] for char in str_)
>>> s_enc = caesar(5, ’CAFE COM LINUX’); s_enc’HFKJ HTR QNSZC’>>> s_dec = caesar(-5, s_enc); s_dec’CAFE COM LINUX’
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 43 / 49
Crivo de Eratóstenes
import math
def sieve(n):A = [False, False] + [True]*(n - 2)for i in range(2, int(math.sqrt(n)) + 1):
if A[i]:for j in range(i**2, n, i):
A[j] = Falsereturn A
>>> is_prime = sieve(8); is_prime[False, False, True, True, False, True, False, True]>>> [n for n in range(8) if is_prime[n]][2, 3, 5, 7]
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 44 / 49
Daqui pro futuro
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 45 / 49
Documentação oficial: http://docs.python.org/
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 46 / 49
Referências sugeridas
Summerfield, Mark. Programming in Python 3: A CompleteIntroduction to the Python Language, 2nd Edition.Addison-Wesley Professional, 2009.Pilgrim, Mark. Dive Into Python. Apress, 2009.Disponível em http://www.diveintopython3.net/.
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 47 / 49
Aplicações científicas
Bibliotecas (não padrão):NumPy: Manipulação de arrays (vetores, matrizes)SciPy: Suplementar ao NumPy, adicionando mais funçõesmatplotlib: GráficosSymPy: Matemática simbólica
Outros:Jupyter: Notebook web interativoSageMath: Combina vários pacotes cientíticos open-source
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 48 / 49
Obrigado!Roberto W. Nóbregahttp://rwnobrega.name/[email protected]
Roberto W. Nóbrega (IFSC/SJE) Introdução ao Python Café com Linux 2015 49 / 49