|
|
|
@ -49,7 +49,6 @@
|
|
|
|
|
<body> |
|
|
|
|
|
|
|
|
|
<div class="reveal"> |
|
|
|
|
<!-- Any section element inside of this container is displayed as a slide --> |
|
|
|
|
<div class="slides"> |
|
|
|
|
<section data-background='_images/zen-of-python-poster-a3.png' class='semi-opaque'> |
|
|
|
|
<h1>Python</h1> |
|
|
|
@ -64,12 +63,17 @@
|
|
|
|
|
<ul> |
|
|
|
|
<li>Linguagem interpretada.</li> |
|
|
|
|
<li>Dinamicamente tipada.</li> |
|
|
|
|
<li>Principais usos em pesquisas e web.</li> |
|
|
|
|
</ul> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h2>O Zen de Python</h2> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<ul> |
|
|
|
|
<li>Bonito é melhor que feio.</li> |
|
|
|
|
<li>Explícito é melhor que implícito.</li> |
|
|
|
@ -83,20 +87,24 @@
|
|
|
|
|
|
|
|
|
|
<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>Casos especiais não são especiais o suficiente para quebrar as regras. |
|
|
|
|
<ul><li>Embora praticabilidade ganhe de puridade.</li></ul> |
|
|
|
|
</li> |
|
|
|
|
<li>Erros nunca devem passam silenciosamente. |
|
|
|
|
<ul><li>A não ser que sejam explicitamente silenciados.</li></ul> |
|
|
|
|
</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> |
|
|
|
|
<li>Deve haver um -- e preferencialmente apenas um -- modo óbvio de fazer algo. |
|
|
|
|
<ul><li>Embora talvez não seja tão óbvio de primeira a não ser que você seja Holandês.</li></ul> |
|
|
|
|
</li> |
|
|
|
|
</ul> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<ul> |
|
|
|
|
<li>Agora é melhor do que nunca.</li> |
|
|
|
|
<li>Embora nunca seja melhor que <i>agora mesmo</i>.</li> |
|
|
|
|
<li>Agora é melhor do que nunca. |
|
|
|
|
<ul><li>Embora nunca seja melhor que <i>agora mesmo</i>.</li></ul> |
|
|
|
|
</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> |
|
|
|
@ -129,7 +137,7 @@ python meuscript.py
|
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h2>Tipos</h2> |
|
|
|
|
<h2>Tipos de Variáveis</h2> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
@ -446,6 +454,18 @@ iterável[start:end:step]
|
|
|
|
|
>>> return (a + b) / c |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>Parâmetros podem ser nomeados.</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> def funcao(a, b, c): |
|
|
|
|
>>> return (a + b) / c |
|
|
|
|
>>> |
|
|
|
|
>>> funcao(b=2, c=3, a=10) |
|
|
|
|
4 |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
@ -536,6 +556,227 @@ iterável[start:end:step]
|
|
|
|
|
Julio |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>Herança</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> class A(object): |
|
|
|
|
>>> def __init__(self): |
|
|
|
|
>>> self.value = 10 |
|
|
|
|
>>> class B(A): |
|
|
|
|
>>> def __init__(self): |
|
|
|
|
>>> super(B, self).__init__() |
|
|
|
|
>>> self.name = 'AAAA' |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>Herança Múltipla</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> class A(object): |
|
|
|
|
>>> def __init__(self): |
|
|
|
|
>>> self.value = 10 |
|
|
|
|
>>> class B(object): |
|
|
|
|
>>> def __init__(self): |
|
|
|
|
>>> self.name = 'AAAA' |
|
|
|
|
>>> class C(A, B): |
|
|
|
|
>>> def __init__(self): |
|
|
|
|
>>> super(C, self).__init__() |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>No Python 3, basta usar <code>super().__init__()</code>. |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<h2>As Esquisitices de Python</h2> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h3>Strings São Imutáveis</h3> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> a = 'string 1' |
|
|
|
|
>>> b = 'string 2' |
|
|
|
|
>>> c = a + ' ' + b |
|
|
|
|
</code></pre></p> |
|
|
|
|
|
|
|
|
|
<ul> |
|
|
|
|
<li>Cria um objeto que é o conteúdo de "a" com um espaço.</li> |
|
|
|
|
<li>Cria um novo objeto que é o novo objeto mais o conteúdo de "b".</li> |
|
|
|
|
<li>Atribui o novo objeto à "c".</li> |
|
|
|
|
</ul> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>Forma correta de concatenar strings:</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> a = 'string 1' |
|
|
|
|
>>> b = 'string 2' |
|
|
|
|
>>> c = ' '.join([a, b]) |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h3>Listas São Mutáveis</h3> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> def a(l=[]): |
|
|
|
|
>>> l.append(1) |
|
|
|
|
>>> print l |
|
|
|
|
>>> |
|
|
|
|
>>> a() |
|
|
|
|
[1] |
|
|
|
|
>>> a() |
|
|
|
|
[1, 1] |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>Forma correta de lidar com parâmetros mutáveis:</p> |
|
|
|
|
|
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> def a(l=None): |
|
|
|
|
>>> if not l: |
|
|
|
|
>>> l = [] |
|
|
|
|
>>> l.append(1) |
|
|
|
|
>>> |
|
|
|
|
>>> a() |
|
|
|
|
[1] |
|
|
|
|
>>> a() |
|
|
|
|
[1] |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h3>Stars</h3> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>"Stars" servem para empacotar e desempacotar parâmetros indefinidos.</p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> def a(*args): |
|
|
|
|
>>> print args |
|
|
|
|
>>> |
|
|
|
|
>>> a(1) |
|
|
|
|
[1] |
|
|
|
|
>>> a(1, 2, 3, 4, 5) |
|
|
|
|
[1, 2, 3, 4, 5] |
|
|
|
|
</code></pre></p> |
|
|
|
|
|
|
|
|
|
<p><code>*</code> pega somente os parâmetros que não tem nome.</p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> def a(**kwargs): |
|
|
|
|
>>> print kwargs |
|
|
|
|
>>> |
|
|
|
|
>>> a(a=1) |
|
|
|
|
{a: 1} |
|
|
|
|
>>> a(value1=10, a=2) |
|
|
|
|
{value1: 10, a: 2} |
|
|
|
|
</code></pre></p> |
|
|
|
|
|
|
|
|
|
<p><code>**</code> pega somente os parâmetros que tem nome.</p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> def a(*args, **kwargs): |
|
|
|
|
>>> print args |
|
|
|
|
>>> print kwargs |
|
|
|
|
>>> |
|
|
|
|
>>> a(a=1) |
|
|
|
|
[] |
|
|
|
|
{a: 1} |
|
|
|
|
>>> a(1, 2, 3, a=5) |
|
|
|
|
[1, 2, 3] |
|
|
|
|
{a: 5} |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> def a(a, b, *args, name=None, **kwargs): |
|
|
|
|
>>> print 'a =', a |
|
|
|
|
>>> print 'b =', b |
|
|
|
|
>>> print 'args =', args |
|
|
|
|
>>> print 'name = ', name |
|
|
|
|
>>> print 'kwargs =', kwargs |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<img src='_images/boring.gif'> |
|
|
|
|
|
|
|
|
|
<p>BORING!</p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p>A parte legal dos stars não é usar para criar funções que aceitam |
|
|
|
|
qualquer parâmetro (embora isso seja legal em alguns casos).</p> |
|
|
|
|
|
|
|
|
|
<p>A parte legal é fazer chamadas de funções com dicionários.</p> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> def funcao(a, b, c): |
|
|
|
|
>>> return (a + b) / c |
|
|
|
|
>>> |
|
|
|
|
>>> params = {b: 2, c: 3, a:10} |
|
|
|
|
>>> funcao(**params) |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h3>"Functions are First Class Citizens"</h3> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<p><pre><code data-trim> |
|
|
|
|
>>> def funcao(a, b, c): |
|
|
|
|
>>> return (a + b) / c |
|
|
|
|
>>> |
|
|
|
|
>>> def check(a, b, c, condition, function): |
|
|
|
|
>>> if condition: |
|
|
|
|
>>> print function(a, b, c) |
|
|
|
|
>>> |
|
|
|
|
>>> check(1, 2, 3, True, funcao) |
|
|
|
|
1 |
|
|
|
|
>>> check(1, 2, 3, False, funcao) |
|
|
|
|
>>> |
|
|
|
|
</code></pre></p> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
<section> |
|
|
|
|
<h3>Decorators</h3> |
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
|
<section> |
|
|
|
|
</section> |
|
|
|
|
</section> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|