Browse Source

added swtich

master
Julio Biason 7 years ago
parent
commit
106fecf9ae
  1. 468
      fugindo-com-python-2.html

468
fugindo-com-python-2.html

@ -153,26 +153,32 @@ def switch_two():
print_phrase(CONSONANTS) print_phrase(CONSONANTS)
def unknown():
"""We don't know what to do."""
print('Dude, option!')
if __name__ == "__main__": if __name__ == "__main__":
args = ArgumentParser() args = ArgumentParser()
args.add_argument('-t', '--totally', args.add_argument('-t', '--totally',
dest='totally', dest='type',
default=False, action='store_const',
action='store_true', const='totally',
help='Like, toootaly random') help='Like, toootaly random')
args.add_argument('-s', '--short', args.add_argument('-s', '--short',
dest='short', dest='type',
default=False, action='store_const',
action='store_true', const='switch'
help='Not so random') help='Not so random')
result = args.parse_args() result = args.parse_args()
if result.totally: callbacks = {
totally_random() 'totally': totally_random,
elif result.short: 'switch': switch_two
switch_two() }
else:
print('Dude, option!')</code></pre> func = callbacks.get(result.type, unknown)
func()</code></pre>
</section> </section>
</section> </section>
@ -646,9 +652,9 @@ frase.capitalize()
print(PASSPHRASE.format(*consonants).capitalize()) print(PASSPHRASE.format(*consonants).capitalize())
</code></pre> </code></pre>
<aside class="notes"> <aside class="notes">
Holy cow! Holy cow!
</aside> </aside>
</section> </section>
<section> <section>
@ -690,10 +696,10 @@ frase.capitalize()
Bem vindo Júlio! Bem vindo Júlio!
</code></pre> </code></pre>
<aside class="notes"> <aside class="notes">
Format funciona da seguinte format: Tudo que tiver `{}` no Format funciona da seguinte format: Tudo que tiver `{}` no
meio, ele troca pelo que vier de parâmetro. meio, ele troca pelo que vier de parâmetro.
</aside> </aside>
</section> </section>
<section> <section>
@ -708,283 +714,319 @@ PASSPHRASE.format('f', 'j', 'c', 'l', 'n')
'fujam para as colinas' 'fujam para as colinas'
</code></pre> </code></pre>
<aside class="notes"> <aside class="notes">
... se eu passar cada uma das consoantes no format com ... se eu passar cada uma das consoantes no format com
a nossa string original, ele vai trocar cada um dos `{}` a nossa string original, ele vai trocar cada um dos `{}`
pelas consoantes passadas como parâmetros, uma a uma. pelas consoantes passadas como parâmetros, uma a uma.
</aside> </aside>
</section> </section>
<section> <section>
<h2>Welcome to... Hell</h2> <h2>Welcome to... Hell</h2>
<pre><code> <pre><code>
CONSONANTS = ['f', 'j', 'c', 'l', 'n'] CONSONANTS = ['f', 'j', 'c', 'l', 'n']
PASSPHRASE = '{}u{}am para as {}o{}i{}as' PASSPHRASE = '{}u{}am para as {}o{}i{}as'
PASSPHRASE.format(*CONSONANTS) PASSPHRASE.format(*CONSONANTS)
</code></pre> </code></pre>
<pre><code> <pre><code>
'fujam para as colinas' 'fujam para as colinas'
</code></pre> </code></pre>
<aside class="notes"> <aside class="notes">
... e como a gente viu que dá pra converter listas ... e como a gente viu que dá pra converter listas
para parâmetros, usando o `*` a gente passa a lista, para parâmetros, usando o `*` a gente passa a lista,
que é convertida para chamada de parâmetros exatamente que é convertida para chamada de parâmetros exatamente
como anteriormente e ainda temos o mesmo resultado. como anteriormente e ainda temos o mesmo resultado.
</aside> </aside>
</section> </section>
<section> <section>
<h2>Welcome to... Hell?</h2> <h2>Welcome to... Hell?</h2>
<pre><code> <pre><code>
'fujam para as colinas'.capitalize() 'fujam para as colinas'.capitalize()
</code></pre> </code></pre>
<pre><code> <pre><code>
Fujam para as colinas Fujam para as colinas
</code></pre> </code></pre>
<aside class="notes"> <aside class="notes">
E `capitalize()` simplesmente converte o primeiro E `capitalize()` simplesmente converte o primeiro
caractere para maiúscula. caractere para maiúscula.
</aside> </aside>
</section> </section>
</section> </section>
<section> <section>
<section> <section>
<h2>Randomizações</h2> <h2>Randomizações</h2>
<pre><code> <pre><code>
def totally_random(): def totally_random():
"""Run a totally random way.""" """Run a totally random way."""
random.shuffle(CONSONANTS) random.shuffle(CONSONANTS)
print_phrase(CONSONANTS) print_phrase(CONSONANTS)
</code></pre> </code></pre>
<aside class="notes"> <aside class="notes">
Nada complicado: A gente chama o `random.shuffle`, Nada complicado: A gente chama o `random.shuffle`,
que é um método do módulo `random` que a gente fez que é um método do módulo `random` que a gente fez
import lá no começo. import lá no começo.
O único problema aqui é que `shuffle` faz *in-place*, O único problema aqui é que `shuffle` faz *in-place*,
ou seja, a lista vai ter o conteúdo alterado. ou seja, a lista vai ter o conteúdo alterado.
</aside> </aside>
</section> </section>
<section> <section>
<h2>Randomizações</h2> <h2>Randomizações</h2>
<pre><code> <pre><code>
def switch_two(): def switch_two():
"""Run by changing two steps at a time.""" """Run by changing two steps at a time."""
first = random.randint(0, 1) first = random.randint(0, 1)
second = random.randint(2, 4) second = random.randint(2, 4)
</code></pre> </code></pre>
<aside class="notes"> <aside class="notes">
Essa função simplesmente escolhe dois números randomicamente. Essa função simplesmente escolhe dois números randomicamente.
O primeiro vai de 0 a 1. O primeiro vai de 0 a 1.
E o segundo de 2 a 4. E o segundo de 2 a 4.
... que, se a gente contar, são exatamente as posições das ... que, se a gente contar, são exatamente as posições das
consoantes de "fujam" e de "colinas", respecticamente, consoantes de "fujam" e de "colinas", respecticamente,
começando por 0. começando por 0.
</aside> </aside>
</section> </section>
</section> </section>
<section> <section>
<section> <section>
<h2>Welcome to hell, maybe?</h2> <h2>Welcome to hell, maybe?</h2>
<pre><code> <pre><code>
CONSONANTS[second], CONSONANTS[first] = \ CONSONANTS[second], CONSONANTS[first] = \
CONSONANTS[first], CONSONANTS[second] CONSONANTS[first], CONSONANTS[second]
</code></pre> </code></pre>
</section> </section>
<section> <section>
<h2>Welcome to Listas!</h2> <h2>Welcome to Listas!</h2>
<pre><code> <pre><code>
# CONSONANTS = ['f', 'j', 'c', 'l', 'n'] # CONSONANTS = ['f', 'j', 'c', 'l', 'n']
# second = random.randint(2, 4) # second = random.randint(2, 4)
CONSONANTS[second] CONSONANTS[second]
</code></pre> </code></pre>
<aside class="notes"> <aside class="notes">
Para acessar um elemento específico de uma lista Para acessar um elemento específico de uma lista
é só usar colchetes e um índice; ou seja, iremos é só usar colchetes e um índice; ou seja, iremos
pegar a consoante indicada pelo número randômico pegar a consoante indicada pelo número randômico
seleciado (entre 2 e 4, inclusive). seleciado (entre 2 e 4, inclusive).
</aside> </aside>
</section> </section>
<section> <section>
<h2>Welcome to Tuples!</h2> <h2>Welcome to Tuples!</h2>
<p> <p>
Tuplas são como listas, só que Tuplas são como listas, só que
não podem ser alteradas. não podem ser alteradas.
</p> </p>
<p> <p>
E pra criar uma tupla: E pra criar uma tupla:
</p> </p>
<pre><code> <pre><code>
valor, valor valor, valor
</code></pre> </code></pre>
<p class="fragment">Ou mais bonitinho: <code>(valor, valor)</code></p> <p class="fragment">Ou mais bonitinho: <code>(valor, valor)</code></p>
</section> </section>
<section> <section>
<h2>Welcome to Destructuring</h2> <h2>Welcome to Destructuring</h2>
<pre><code> <pre><code>
primeiro, segundo = [1, 2] primeiro, segundo = [1, 2]
print(primeiro) print(primeiro)
print(segundo) print(segundo)
</code></pre> </code></pre>
<pre><code> <pre><code>
1 1
2 2
</code></pre> </code></pre>
<aside class="notes"> <aside class="notes">
Destructuring (e não destroying) serve Destructuring (e não destroying) serve
para "desmontar" tuplas e listas. para "desmontar" tuplas e listas.
Por exemplo, a lista tem dois elementos; se Por exemplo, a lista tem dois elementos; se
eu apontar os dois valores para ela, o eu apontar os dois valores para ela, o
primeiro vai ter o primeiro valor e o segundo, primeiro vai ter o primeiro valor e o segundo,
o segundo; se forem três, eu preciso de três o segundo; se forem três, eu preciso de três
variáveis. variáveis.
E se o número de váriaveis estiver errado, E se o número de váriaveis estiver errado,
dá erro. dá erro.
</aside> </aside>
</section> </section>
<section> <section>
<h2>Tudo junto, agora!</h2> <h2>Tudo junto, agora!</h2>
<pre><code> <pre><code>
CONSONANTS[second], CONSONANTS[first] = \ CONSONANTS[second], CONSONANTS[first] = \
CONSONANTS[first], CONSONANTS[second] CONSONANTS[first], CONSONANTS[second]
</code></pre> </code></pre>
<pre class="fragment"><code> <pre class="fragment"><code>
tmp = CONSONANTS[first] tmp = CONSONANTS[first]
CONSONANTS[first] = CONSONANTS[second] CONSONANTS[first] = CONSONANTS[second]
CONSONANTS[second] = tmp CONSONANTS[second] = tmp
</code></pre> </code></pre>
<aside class="notes"> <aside class="notes">
Ou seja, estamos pegando a consonante Ou seja, estamos pegando a consonante
escolhida randomicamente entre 0 e 1 (f e j) escolhida randomicamente entre 0 e 1 (f e j)
e a consoante escolhida randomicante entre e a consoante escolhida randomicante entre
2 e 4 (c, l, n) e criando uma tupla com esses 2 e 4 (c, l, n) e criando uma tupla com esses
dois valores; a seguir a gente desmonta dois valores; a seguir a gente desmonta
(destructura) esses dois na ordem inversa. (destructura) esses dois na ordem inversa.
</aside> </aside>
</section> </section>
</section> </section>
<section> <section>
<section> <section>
<h2>O Pai de Todos Módulos</h2> <h2>O Pai de Todos Módulos</h2>
<pre><code> <pre><code>
if __name__ == "__main__": if __name__ == "__main__":
</code></pre> </code></pre>
<aside class="notes"> <aside class="notes">
Falamos antes que um módulo, quando Falamos antes que um módulo, quando
importado, vira um namespace. importado, vira um namespace.
Pois bem, namespaces tem nomes que podem Pois bem, namespaces tem nomes que podem
ser acessados com `__name__`. ser acessados com `__name__`.
E o que acontece quando um script é E o que acontece quando um script é
executado diretamente pela linha de executado diretamente pela linha de
comando? O módulo é "importado" pelo comando? O módulo é "importado" pelo
interpretador, mas qual é o nome do interpretador, mas qual é o nome do
namespace? namespace?
`__main__`. `__main__`.
Essa construção permite que scripts sejam Essa construção permite que scripts sejam
tanto executados diretamente quando importados. tanto executados diretamente quando importados.
No caso, todo o conteúdo desse if só vai No caso, todo o conteúdo desse if só vai
ser executado se for executado pela linha ser executado se for executado pela linha
de comando. Se for importado por um outro de comando. Se for importado por um outro
script, o script vai ter acesso às funções, script, o script vai ter acesso às funções,
mas não vai ser afetado pela leitura da mas não vai ser afetado pela leitura da
linha de comando. linha de comando.
</aside> </aside>
</section> </section>
</section> </section>
<section> <section>
<section> <section>
<h2>A linha de comando</h2> <h2>A linha de comando</h2>
<pre><code> <pre><code>
args = ArgumentParser() args = ArgumentParser()
args.add_argument('-t', '--totally', args.add_argument('-t', '--totally',
dest='totally', dest='type',
default=False, action='store_const',
action='store_true', const='totally',
help='Like, toootaly random') help='Like, toootaly random')
args.add_argument('-s', '--short', args.add_argument('-s', '--short',
dest='short', dest='type',
default=False, action='store_const',
action='store_true', const='switch'
help='Not so random') help='Not so random')
result = args.parse_args() result = args.parse_args()
</code></pre> </code></pre>
<aside class="notes"> <aside class="notes">
Nada de muito mágico aqui, exceto que o Nada de muito mágico aqui, exceto que o
ArgumentParser faz um monte de coisas pra ArgumentParser faz um monte de coisas pra
nós: nós só definimos os parametros, onde eles nós: nós só definimos os parametros, onde eles
vão ficar no final, qual ação a ser tomada vão ficar no final, qual ação a ser tomada
e um help. E o ArgumentParser faz todo e um help. E o ArgumentParser faz todo
o resto. o resto.
</aside> </aside>
</section> </section>
</section> </section>
<section> <section>
<section> <section>
<h2>E os finalmentes...</h2> <h2>Funções são cidadãos de primeira classe</h2>
<pre><code> <pre><code>
if result.totally: callbacks = {
totally_random() 'totally': totally_random,
elif result.short: 'switch': switch_two
switch_two() }
else: func = callbacks.get(result.type, unknown)
print('Dude, option!')</code></pre> func()
</code></pre>
<aside class="notes">
E a gente simplesmente acessa as propriedades <aside class="notes">
do objeto de resultado do `parse_args` e, "Cidadão de primeira classe" significa que
se for verdadeiro (True), executamos funções são tratadas como qualquer outro
uma função ou a outra. objeto/elemento/variável. No caso estamos
</aside> criado um dicionário onde a chave é uma
</section> string (não por coincidência as mesmas
</section> strings que estão no argumentparser) e
o valor são funções.
Dicionários são objetos como strings e
possuem uma função `get()`; essa função
retorna o valor da entrada com a chave
indicada e, caso não exista, retorna um valor
padrão (que normalmente é `None`).
Aqui temos, então, uma relação das possíveis
strings que existem no ArgumentParser e as
funções que podem ser chamadas; com o valor
vindo da linha de comando, selecionamos a
função `totally_random` ou `switch_two` ou,
ainda, se o valor de `type` não existir,
assume-se `unkonwn` -- de certa forma, agora
`func` é um ponteiro para uma função.
E para executar a função apontada pela variável,
basta colocar os parênteses, como faria com
qualquer função em Python.
E esse é basicamente o formato de como se faz
`switch` em Python.
</aside>
</section>
</section>
<section>
<section data-background="_images/python.jpg">
<h1 class="semi-opaque">Fulindo para as Cojinas com Python</h1>
</section>
<section data-background="_images/python.jpg">
<h1 class="semi-opaque">Fucindo para as Lonijas com Python</h1>
</section>
</section>
<section data-background='_images/thats-all-folks.jpg'> <section data-background='_images/thats-all-folks.jpg'>
<section> <section>

Loading…
Cancel
Save