|
|
|
@ -66,6 +66,42 @@
|
|
|
|
|
<li>Dinamicamente tipada.</li> |
|
|
|
|
</ul> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<h2>O Zen de Python</h2> |
|
|
|
|
|
|
|
|
|
<ul> |
|
|
|
|
<li>Bonito é melhor que feio.</li> |
|
|
|
|
<li>Explícito é melhor que implícito.</li> |
|
|
|
|
<li>Simples é melhor que complexo.</li> |
|
|
|
|
<li>Complexo é melhor que complicado.</li> |
|
|
|
|
<li>Plano é melhor que aninhado.</li> |
|
|
|
|
<li>Esparço é melhor que denso.</li> |
|
|
|
|
<li>Legibilidade conta.</li> |
|
|
|
|
</ul> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<ul> |
|
|
|
|
<li>Casos especiais não são especiais o suficiente para quebrar as regras.</li> |
|
|
|
|
<li>Embora praticabilidade ganhe de puridade.</li> |
|
|
|
|
<li>Erros nunca devem passam silenciosamente.</li> |
|
|
|
|
<li>A não ser que sejam explicitamente silenciados.</li> |
|
|
|
|
<li>Em caso de ambiguidade, evite a tentação de adivinhar.</li> |
|
|
|
|
<li>Deve haver um -- e preferencialmente apenas um -- modo óbvio de fazer algo.</li> |
|
|
|
|
<li>Embora talvez não seja tão óbvio de primeira a não ser que você seja Holandês.</li> |
|
|
|
|
</ul> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<ul> |
|
|
|
|
<li>Agora é melhor do que nunca.</li> |
|
|
|
|
<li>Embora nunca seja melhor que <i>agora mesmo</i>.</li> |
|
|
|
|
<li>Se a implementação é difícil de explicar, é uma péssima idéia.</li> |
|
|
|
|
<li>Se a implementação é fácil de explicar, pode ser uma boa idéia.</li> |
|
|
|
|
<li>Namespaces são uma grande idéia - vamos fazer mais desses!</li> |
|
|
|
|
</ul> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
@ -81,6 +117,14 @@ Type "help", "copyright", "credits" or "license" for more information.
|
|
|
|
|
>>> |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>Executando scripts Python:</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
python meuscript.py |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
@ -97,7 +141,8 @@ Type "help", "copyright", "credits" or "license" for more information.
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>Uma variável do tipo "imutável" não pode ser alterada depois de |
|
|
|
|
criada. Tentar modificar a variável vai criar uma nova instância.</p> |
|
|
|
|
criada. Tentar modificar o conteúdo da variável vai criar uma nova |
|
|
|
|
instância.</p> |
|
|
|
|
|
|
|
|
|
<p>Uma variável do tipo "mutável" é o contrário: tentar alterar vai |
|
|
|
|
alterar o objeto, não criar um novo.</p> |
|
|
|
@ -105,21 +150,30 @@ Type "help", "copyright", "credits" or "license" for more information.
|
|
|
|
|
<p>A importância disto será visto mais pra frente, mas tenha isso |
|
|
|
|
em mente.</p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>... ainda...</p> |
|
|
|
|
|
|
|
|
|
<p>Existem tipos que são, na verdade, objetos e tem toda uma gama |
|
|
|
|
de funções para alterar/manipular/editar o conteúdo de uma variável.</p> |
|
|
|
|
|
|
|
|
|
<p>Outros são tipos simples que não são objetos.</p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><code>bool</code>: Tipo booleano.</p> |
|
|
|
|
<p><code>bool</code>: Tipo booleano. Tipo simples.</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
a = True |
|
|
|
|
b = False |
|
|
|
|
>>> a = True |
|
|
|
|
>>> b = False |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><code>int</code>: Um inteiro.</p> |
|
|
|
|
<p><code>int</code>: Um inteiro. Simples.</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
a = 1 |
|
|
|
|
>>> a = 1 |
|
|
|
|
</code></pre></p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
@ -129,56 +183,56 @@ a = 1
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><code>float</code>: Um número com ponto flutuante.</p> |
|
|
|
|
<p><code>float</code>: Um número com ponto flutuante. Simples.</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
a = 1.1 |
|
|
|
|
b = 1.0 |
|
|
|
|
>>> a = 1.1 |
|
|
|
|
>>> b = 1.0 |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><code>str</code>: Strings. É um objeto imutável.</p> |
|
|
|
|
<p><code>str</code>: Strings. Objeto imutável.</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
a = 'Python' |
|
|
|
|
b = "Python" |
|
|
|
|
c = """Python |
|
|
|
|
Rocks!""" |
|
|
|
|
>>> a = 'Python' |
|
|
|
|
>>> b = "Python" |
|
|
|
|
>>> c = """Python |
|
|
|
|
>>> Rocks!""" |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><code>unicode</code>: Strings em Unicode. É um objeto imutável.</p> |
|
|
|
|
<p><code>unicode</code>: Strings em Unicode. Objeto imutável.</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
a = u'Python' |
|
|
|
|
>>> a = u'Python' |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><code>list</code>: Listas. É um objeto mutável.</p> |
|
|
|
|
<p><code>list</code>: Listas. Objeto mutável.</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
a = [1, 2, 'Python', ['Outra lista']] |
|
|
|
|
>>> a = [1, 2, 'Python', ['Outra lista']] |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><code>dict</code>: Um dicionário/objeto/mapa. É um objeto mutável.</p> |
|
|
|
|
<p><code>dict</code>: Um dicionário/objeto/mapa. Objeto mutável.</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
a = {'Python': 'Rocks', |
|
|
|
|
1: 1.0} |
|
|
|
|
>>> a = {'Python': 'Rocks', |
|
|
|
|
>>> 1: 1.0} |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><code>tuple</code>: Um conjunto de elementos. É um objeto imutável.</p> |
|
|
|
|
<p><code>tuple</code>: Um conjunto de elementos. Objeto imutável.</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
a = ('Python', 1) |
|
|
|
|
b = (2,) |
|
|
|
|
>>> a = ('Python', 1) |
|
|
|
|
>>> b = (2,) |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
@ -218,9 +272,9 @@ b = (2,)
|
|
|
|
|
<h3><code>if [condição]</code></h3> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
if a = 1: |
|
|
|
|
b = 2 |
|
|
|
|
c = 3 |
|
|
|
|
>>> if a == 1: |
|
|
|
|
>>> b = 2 |
|
|
|
|
>>> c = 3 |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
@ -228,11 +282,11 @@ c = 3
|
|
|
|
|
<h3><code>while [condição]</code></h3> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
a = 1 |
|
|
|
|
while True: |
|
|
|
|
a += 1 |
|
|
|
|
if a > 10: |
|
|
|
|
break |
|
|
|
|
>>> a = 1 |
|
|
|
|
>>> while True: |
|
|
|
|
>>> a += 1 |
|
|
|
|
>>> if a > 10: |
|
|
|
|
>>> break |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
@ -240,9 +294,9 @@ while True:
|
|
|
|
|
<h3><code>for [iterável]</code></h3> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
soma = 0 |
|
|
|
|
for valor em [345, 123, 123, 34]: |
|
|
|
|
soma += valor |
|
|
|
|
>>> soma = 0 |
|
|
|
|
>>> for valor em [345, 123, 123, 34]: |
|
|
|
|
>>> soma += valor |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
@ -276,8 +330,8 @@ for valor em [345, 123, 123, 34]:
|
|
|
|
|
<p>Strings como iteráveis:</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
for l in 'Python': |
|
|
|
|
print l |
|
|
|
|
>>> for l in 'Python': |
|
|
|
|
>>> print l |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
@ -285,10 +339,98 @@ for l in 'Python':
|
|
|
|
|
<p>Dicionários como iteráveis:</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
for key in {'Python': 'Rocks', 'Parrot': 'Dead', 'Favorite Color': 'Blue'}: |
|
|
|
|
print key |
|
|
|
|
>>> d = {'Python': 'Rocks', 'Parrot': 'Dead', 'Favorite Color': 'Blue'} |
|
|
|
|
>>> for key in d: |
|
|
|
|
>>> print key, d[key] |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>Ou ainda:</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> d = {'Python': 'Rocks', 'Parrot': 'Dead', 'Favorite Color': 'Blue'} |
|
|
|
|
>>> for (key, value) in d.iteritems(): |
|
|
|
|
>>> print key, value |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h2>Slices</h2> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>Slice é uma "extensão" de indíces de acesso.</p> |
|
|
|
|
|
|
|
|
|
<p>Com slices, é possível "cortar" iteráveis, retornando |
|
|
|
|
um novo iterável.</p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
iterável[start:end:step] |
|
|
|
|
</code></pre></p> |
|
|
|
|
|
|
|
|
|
<p>(<code>end</code> é exclusívo.)</p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> a = [1, 2, 3, 4] |
|
|
|
|
>>> print a[1:2] |
|
|
|
|
[2] |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>Deixar um índice em branco indica que:</p> |
|
|
|
|
|
|
|
|
|
<ul> |
|
|
|
|
<li><code>start</code> = 0</li> |
|
|
|
|
<li><code>end</code> = len(iterável)</li> |
|
|
|
|
<li><code>step</code> = 1</li> |
|
|
|
|
</ul> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> a = [1, 2, 3, 4] |
|
|
|
|
>>> print a[:2] |
|
|
|
|
[1, 2] |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>Índices negativos começam do final do iterável.</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> a = [1, 2, 3, 4] |
|
|
|
|
>>> print a[1:-1] |
|
|
|
|
[2, 3] |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>Lembre-se que strings também são iteráveis.</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> a = 'Python Rocks' |
|
|
|
|
>>> print a[7:-1] |
|
|
|
|
'Rock' |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>Deixar os dois índices em branco cria uma cópia "flat".</p> |
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> a = [1, 2, 3, 4] |
|
|
|
|
>>> print a[:] |
|
|
|
|
[1, 2, 3, 4] |
|
|
|
|
</code></pre></p> |
|
|
|
|
|
|
|
|
|
<p>Para fazer uma cópia de uma lista com outros |
|
|
|
|
iteráveis internos, existe o módulo <code>deepcopy</code>.</p> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
@ -297,14 +439,104 @@ for key in {'Python': 'Rocks', 'Parrot': 'Dead', 'Favorite Color': 'Blue'}:
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<h3><code>def [nome_da_função]([parâmetro], [parâmetro]):</code></h3> |
|
|
|
|
<h3><code>def [nome_da_função]([parâmetro], [parâmetro], ...):</code></h3> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
def funcao(a, b, c): |
|
|
|
|
return (a + b) / c |
|
|
|
|
>>> def funcao(a, b, c): |
|
|
|
|
>>> return (a + b) / c |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h2>Classes</h2> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>Ok, algumas coisas a serem vistas antes de entrar em |
|
|
|
|
classes:</p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>Existem dois tipos de classes: old-style e new-style.</p> |
|
|
|
|
|
|
|
|
|
<p>A diferença é que classes "new-style" sempre extendem da |
|
|
|
|
classe <code>object</code>, enquanto que "old-style" não |
|
|
|
|
extendem ninguém.</p> |
|
|
|
|
|
|
|
|
|
<p>Por baixo dos panos, "new-style" e "old-style" funcionam |
|
|
|
|
de forma diferente, mas isso não é visível para o |
|
|
|
|
programador.</p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>Para todos os casos e efeitos, "old-style" não deve |
|
|
|
|
mais ser usado.</p> |
|
|
|
|
|
|
|
|
|
<p class='fragment'>No Python 3, não existem mais |
|
|
|
|
classes "old-style", mas a sintaxe removeu a necessidade |
|
|
|
|
de extender <code>object</code>.</p> |
|
|
|
|
|
|
|
|
|
<p class='fragment'>(Ou seja, no Python 3 uma classe |
|
|
|
|
se parece com o "old-style" do Python 2.)</p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><code>this</code>/<code>self</code> não é uma variável |
|
|
|
|
implícita da classe: Ela tem que constar <i>sempre</i> |
|
|
|
|
na definiçào do método.</p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>O construtor da classe é chamado <code>__init__</code>.</p> |
|
|
|
|
|
|
|
|
|
<p>Não existe função para o destrutor.</p> |
|
|
|
|
|
|
|
|
|
<p class='fragment'>Existem ainda outras funções (como o |
|
|
|
|
<code>__getitem__</code> comentado anteriormente), mas |
|
|
|
|
não vamos falar sobre elas nesse momento.</p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> class MyClasse(object): |
|
|
|
|
>>> def __init__(self): |
|
|
|
|
>>> self.valor = 0 |
|
|
|
|
>>> def show(self): |
|
|
|
|
>>> print self.valor |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>Para instanciar uma classe, basta chamar a classe |
|
|
|
|
como se fosse uma função.</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> my = MyClasse() |
|
|
|
|
>>> my.show() |
|
|
|
|
0 |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>Se o construtor tiver parâmetros, estes devem ser |
|
|
|
|
passados durante a instanciação, como se a "função" |
|
|
|
|
classe tivesse parâmetros.</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> class MyClasse(object): |
|
|
|
|
>>> def __init__(self, name): |
|
|
|
|
>>> self.name = name |
|
|
|
|
>>> def show(self): |
|
|
|
|
>>> print self.name |
|
|
|
|
|
|
|
|
|
>>> my = MyClasse('Julio') |
|
|
|
|
>>> my.show() |
|
|
|
|
Julio |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|