.wrapper at 0x7f7ab702a950>
123 | f1()
124 | # Iniciada
125 | # Função f1() chamada!
126 | # Finalizada
127 | f2()
128 | # Iniciada
129 | # Função f2() chamada
130 | # Finalizada
131 | ```
132 |
133 | Basicamente este é o conceito de decoradores, estamos usando a função **func()** para alterar o comportamento das funções **f1()** e **f2()**, porém existe uma maneira mais interessante de definí-los, em outras palavras, mais Pythônica.
134 |
135 | ## Decorando Funções
136 |
137 | Vamos decorar as funções **f1()** e **f2()** usando a sintaxe `@`:
138 |
139 | ```python
140 | @func
141 | def f1():
142 | print("Função f1() chamada!")
143 |
144 | @func
145 | def f2():
146 | print("Função f2() chamada")
147 | ```
148 |
149 | Dessa vez podemos chamá-las diretamente e teremos o mesmo efeito anterior:
150 |
151 | ```python
152 | f1()
153 | # Iniciada
154 | # Função f1() chamada!
155 | # Finalizada
156 | f2()
157 | # Iniciada
158 | # Função f2() chamada
159 | # Finalizada
160 | ```
161 |
162 | Faremos agora outra modificação, dessa vez as funções **wrapper()** e **f1()** passam a receber um argumento e a função passada como argumento para **func()** passa a ser invocada com esse argumento:
163 |
164 | ```python
165 | def func(f):
166 | def wrapper(x):
167 | print("Iniciada")
168 | f(x)
169 | print("Finalizada")
170 | return wrapper
171 |
172 | @func
173 | def f1(x):
174 | print(f"O valor de x é = {x}")
175 |
176 | @func
177 | def f2():
178 | print("Função f2() chamada")
179 | ```
180 |
181 | Vejamos agora o que ocorre se invocarmos as funções **f1()** e **f2()**:
182 |
183 | ```python
184 | f1(7)
185 | # Iniciada
186 | # O valor de x é = 7
187 | # Finalizada
188 | f2() # TypeError: wrapper() missing 1 required positional argument: 'x'
189 | ```
190 |
191 | **f1()** é chamada e nos imprime o valor como esperado, porém **f2()** "quebra", não somo capazes de chamá-la, pois a função **wrapper()** espera um argumento. Para solucionar este problema podemos usar o conceito de `*args` e `**kwargs`, vamos então masi uma vez modificar nossas funções:
192 |
193 | ```python
194 | def func(f):
195 | def wrapper(*args, **kwargs):
196 | print("Iniciada")
197 | f(*args, **kwargs)
198 | print("Finalizada")
199 | return wrapper
200 |
201 | @func
202 | def f1(x):
203 | print(f"O valor de x é = {x}")
204 |
205 | @func
206 | def f2():
207 | print("Função f2() chamada")
208 |
209 | f1(7)
210 | # Iniciada
211 | # O valor de x é = 7
212 | # Finalizada
213 | f2()
214 | # Iniciada
215 | # Função f2() chamada
216 | # Finalizada
217 | ```
218 |
219 | Para finalizarmos, vamos modificar nossas funções **wrapper()** e **f1()** para retornar um valor:
220 |
221 | ```python
222 | def func(f):
223 | def wrapper(*args, **kwargs):
224 | print("Iniciada")
225 | valor_retorno = f(*args, **kwargs)
226 | print("Finalizada")
227 | return valor_retorno
228 | return wrapper
229 |
230 | @func
231 | def f1(x, y):
232 | print(f"O valor de x é = {x}")
233 | print(f"O valor de y é = {y}")
234 | return y + x
235 |
236 | f1 = f1(5,33)
237 | # Iniciada
238 | # O valor de x é = 5
239 | # O valor de y é = 33
240 | # Finalizada
241 | print(f1) # 38
242 | ```
243 |
244 | ## Outros Exemplos
245 |
246 | Funções e métodos são chamados **callable** se for possível chamá-los. De fato, qualquer objeto que implemente o método especial `__call__()` é um **callable**, então um decorador seria um callable que retorna um callable.
247 |
248 | Então como já tinhamos dito na nossa introdução, um decorador recebe um função, adiciona alguma funcionalidade a ela e a retorna:
249 |
250 | ```python
251 | def embelezar(func):
252 | def interno():
253 | print("Fui decorado")
254 | func()
255 | return interno
256 |
257 | def normal():
258 | print("Eu sou normal")
259 |
260 | normal() # Eu sou normal
261 | bonito = embelezar(normal)
262 | bonito()
263 | # Fui decorado
264 | # Eu sou normal
265 | ```
266 |
267 | Veja que a função **normal()** foi decorada e demos o nome à função retornada, que se chamou bonito. Uma forma mais eficaz de usarmos os decoradores é usando o símbolo `@` junto do nome da função decoradora e colocar ele em cima da definição da função a ser decorada. Por exemplo:
268 |
269 | ```python
270 | @embelezar
271 | def normal():
272 | print("Eu sou normal também")
273 |
274 | normal()
275 | # Fui decorado
276 | # Eu sou normal também
277 | ```
278 |
279 | ### Decorando Funções com Parâmetros
280 |
281 | O último **decorador** que escrevemos foi bastante simples, só funcionava com funções sem parâmatros, apenas para ilustrarmos o conceito, mas e se tivermos funções que operam com parâmetros?
282 |
283 | ```python
284 | def divisao(x, y):
285 | return x / y
286 | ```
287 |
288 | A função recebe dois parâmetros **x** e **y**, sabemos que se passarmos **0** para **y** ocorrerá um erro.
289 |
290 | ```python
291 | print(divisao(10,2)) # 5.0
292 | print(divisao(3,0)) # ZeroDivisionError: division by zero
293 | ```
294 |
295 | Agora vamos fazer um decorador para resolvermos esse problema.
296 |
297 | ```python
298 | def divisao_inteligente(func):
299 | def interior(x,y):
300 | print("Será feita uma divisão de {0} por {1}".format(x,y))
301 | if y == 0:
302 | print("Impossível dividir")
303 | return
304 | return func(x,y)
305 | return interior
306 |
307 | @divisao_inteligente
308 | def divisao(x,y):
309 | return x / y
310 |
311 | divisao(3,3)
312 | # Será feita uma divisão de 3 por 3
313 | # 1.0
314 | divisao(3,0)
315 | # Será feita uma divisão de 3 por 0
316 | # Impossível dividir
317 | ```
318 |
319 | ### Medindo Desempenho
320 |
321 | Podemos criar um decorar que é capaz de medir quanto tempo uma função leva para rodar:
322 |
323 | ```python
324 | import time
325 |
326 | def timer(func):
327 | def wrapper(*args, **kwargs):
328 | inicio = time.time()
329 | valor_retorno = func()
330 | total = time.time() - inicio
331 | print(f"Tempo: {total}")
332 | return valor_retorno
333 | return wrapper
334 | ```
335 |
336 | Vamos definir duas funções para medí-las:
337 |
338 | ```python
339 | @timer
340 | def t1():
341 | for _ in range(10_000_000):
342 | pass
343 |
344 | @timer
345 | def t2():
346 | time.sleep(2.3)
347 | ```
348 |
349 | Finalmente, vamos obter o tempo de cada uma:
350 |
351 | ```python
352 | t1() # Tempo: 0.36320018768310547
353 | t2() # Tempo: 2.302194118499756
354 | ```
355 |
356 | Com esse estudo podemos considerar que decoradores são de certa forma um pouco complexos, mas que nos trazem novas possibilidades de trabalharmos em cima das funções, modificando seu comportamento. Eles são muito comuns também em **frameworks web**, como **[Flask](https://flask.palletsprojects.com/)** e **[Bottle](https://bottlepy.org/docs/dev/)** por exemplo.
--------------------------------------------------------------------------------
/Capitulos/29.PIP.md:
--------------------------------------------------------------------------------
1 | # PIP
2 |
3 | **PIP** é o gerenciador de pacotes do Python, também conhecidos como **bibliotecas**.
4 |
5 | É importante notar que o termo "pacote" neste contexto está sendo usado como sinônimo de distribuição (ou seja, um pacote de software a ser instalado), não para se referir ao tipo de pacote que você importa em seu código-fonte Python (ou seja, um contêiner de módulos). É comum na comunidade Python referir-se a uma distribuição usando o termo "pacote". O uso do termo "distribuição" geralmente não é preferido, porque pode ser facilmente confundido com uma distribuição Linux ou outra distribuição de software maior como o próprio Python.
6 |
7 | A partir da versão 3.4 do Python o PIP já vem incluído por padrão com a instalação do Python, então existem grandes chances de você já tê-lo em sua máquina.
8 |
9 | Para confirmar se ele está instalado, vamos digitar o seguinte comando na nossa **interface de linha de comando**:
10 |
11 | ```
12 | pip --version
13 | ```
14 |
15 | Caso ele não esteja presente em sua máquina, você pode encontrá-lo em: **https://pypi.org/project/pip/** ou **[get-pip.py](https://bootstrap.pypa.io/get-pip.py)**:
16 |
17 | - Faça o download do arquivo `get-pip.py`
18 | - Execute o comando `python get-pip.py`. Isso irá instalar ou atualizar o pip.
19 |
20 | Outra opção de instalação é executar o comando:
21 |
22 | ```
23 | python -m ensurepip --default-pip
24 | ```
25 |
26 | Para confirmar se o pip está atualizado, você pode executar o seguinte comando:
27 |
28 | ```
29 | python -m pip install --upgrade pip
30 | ```
31 |
32 | Para navegar através da lista de mais de `190,943` projetos, `2,069,359` arquivos e `354,989` usuários, visite: **https://pypi.org**
33 |
34 | ## Pacotes
35 |
36 | Um pacote seria um conjunto de arquivos para um módulo, como já vimos antes, módulos são como bibliotecas de código que podemos incluir em nossos projetos para usarmos suas funcionalidades e facilitar nossa vida como programadores.
37 |
38 | Normalmente, não armazenamos todos os nossos arquivos em nosso computador no mesmo local. Usamos uma hierarquia de diretórios bem organizada para facilitar o acesso e gerência.
39 |
40 | Conforme nosso programa cresce em tamanho com muitos módulos, colocamos módulos semelhantes em um pacote e módulos diferentes em pacotes diferentes. Isso torna um projeto (programa) fácil de gerenciar.
41 |
42 | Da mesma forma, como um diretório pode conter sub-diretórios e arquivos, um pacote Python pode ter sub-pacotes e módulos.
43 |
44 | Um diretório deve conter um arquivo denominado `__init__.py` para que o Python o considere como um pacote. Este arquivo pode ser deixado vazio, mas geralmente colocamos o código de inicialização para esse pacote neste arquivo.
45 |
46 | A seguinte ilustração nos apresenta a ideia de como funciona a estrutura de um projeto, usamos como exemplo um pacote de nome **Game** que possui diversos módulos.
47 |
48 | 
49 |
50 | ### Instalando Pacotes
51 |
52 | Novamente, vamos abrir nossa **interface de linha de comando** e vamos até o diretório que está nosso script. Digitaremos o seguinte comando para instalar a biblioteca [requests](https://requests.readthedocs.io/en/master/):
53 |
54 | ```python
55 | pip install requests
56 | ```
57 |
58 | Será iniciado um processo de *download e instalação*, aguarde um pouco e estará pronto, agora poderemos usar a nova biblioteca.
59 |
60 | ### Utilizando o Pacote
61 |
62 | Uma vez que já temos requests instalada, para usarmos é só importá-la, assim como fazemos com os módulos padrão do Python:
63 |
64 | ```python
65 | import requests
66 |
67 | print(dir(requests))
68 | # ['ConnectionError', 'FileModeWarning', 'HTTPError', 'NullHandler', 'PreparedRequest', 'Request', 'RequestException', 'Response', 'Session', 'Timeout', 'TooManyRedirects', 'URLRequired', '__author__', '__build__', '__builtins__', '__cached__', '__copyright__', '__doc__', '__file__', '__license__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__title__', '__version__', 'adapters', 'api', 'auth', 'certs', 'codes', 'compat', 'cookies', 'delete', 'exceptions', 'get', 'head', 'hooks', 'logging', 'models', 'options', 'packages', 'patch', 'post', 'put', 'request', 'session', 'sessions', 'status_codes', 'structures', 'utils', 'warnings']
69 |
70 | r = requests.get("http://google.com")
71 | print(r.status_code) # 200, significa que a requisição ocorreu com sucesso
72 | print(r.text) # Retorna o conteúdo HTML da página
73 | print(r.encoding) # ISO-8859-1, codificação usada na página
74 | ```
75 |
76 | Como podem ver, com um rápido download e instalação, temos acesso a uma poderosa biblioteca chamada **requests**, que nos permite fazer requisições **[HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview)** e uma série de outras funcionalidades web.
77 |
78 | ### Removendo um Pacote
79 |
80 | Para desinstalarmos um pacote de nossa máquina podemos usar o comando `uninstall`
81 |
82 | ```
83 | pip uninstall requests
84 | ```
85 |
86 | É necessário confirmarmos a desinstalação com a tecla `y`.
87 |
88 | ### Listando os Pacotes
89 |
90 | Podemos usar o comando `list` para listarmos os pacotes que temos instalado em nossa máquina:
91 |
92 | ```
93 | pip list
94 | ```
95 |
96 | ### Atualizando um Pacote Existente
97 |
98 | O comando `install --upgrade` nos permite atualizar um pacote para sua versão mais recente:
99 |
100 | ```
101 | pip install --upgrade requests
102 | ```
103 |
104 | ### Obtendo Informações
105 |
106 | Através do comando `show` podemos obter informações sobre um determinado pacote:
107 |
108 | ```
109 | pip show requests
110 | ```
111 |
112 | Podemos também fazer pesquisas por **palavras-chave**:
113 |
114 | ```
115 | pip search http
116 | ```
117 |
118 | # Ambientes Virtuais
119 |
120 | O principal propósito dos **Ambientes Virtuais** é criar um ambiente isolado para projetos Python. Isso significa que cada projeto pode ter suas próprias dependências, independente da dependência de outros projetos. Eles são essenciais para evitarmos conflitos de versões de bibliotecas entre os nossos projetos.
121 |
122 | Python, como a maioria das outras linguagens de programação modernas, tem sua própria maneira única de baixar, armazenar e resolver pacotes. Embora isso tenha suas vantagens, algumas decisões interessantes foram tomadas sobre o armazenamento e a resolução de pacotes, o que levou a alguns problemas - especialmente em relação à como e onde os pacotes são armazenados.
123 |
124 | Existem alguns locais diferentes onde esses pacotes podem ser instalados em seu sistema. Por exemplo, a maioria dos pacotes de sistema são armazenados em um diretório filho, no qual o caminho fica armazenado em [sys.prefix](https://docs.python.org/3/library/sys.html#sys.prefix).
125 |
126 | Sendo assim, podemos usar a biblioteca **sys** para sabermos onde `sys.prefix` está apontando:
127 |
128 | ```python
129 | import sys
130 | print(sys.prefix) # /home/akira/anaconda3
131 | ```
132 |
133 | Veja que no meu caso, estou usando anaconda e posso usar este caminho para saber quais pacotes eu tenho instalado com o seguinte comando Linux:
134 |
135 | ```
136 | ls -la /home/akira/anaconda3/lib/python3.7/
137 | ```
138 |
139 | Mas afinal, por que essas informações são relevantes?
140 |
141 | É importante saber isso porque, por padrão, todos os projetos em seu sistema usarão esses mesmos diretórios para armazenar e recuperar pacotes de sites (bibliotecas de terceiros). Inicialmente, isso pode não parecer problemático, e não é realmente, para pacotes de sistema (pacotes que fazem parte da biblioteca Python padrão), mas importa para pacotes de terceiros.
142 |
143 | Considere o seguinte cenário em que você tem dois projetos: **ProjetoA** e **ProjetoB**, ambos os quais dependem da mesma biblioteca, **TimeLib**. O problema se torna aparente quando começamos a exigir versões diferentes do TimeLib. Talvez o ProjectA precise da v1.0.0, enquanto o ProjectB requer a v2.0.0 mais recente, por exemplo.
144 |
145 | Isso irá gerar conflitos e por este motivo os ambientes virtuais são tão importantes!
146 |
147 | Para saber mais detalhes sobre os **Ambientes Virtuais** você pode visitar: **[venv](https://docs.python.org/3/library/venv.html)**
148 |
149 | ## Usando Ambientes Virtuais
150 |
151 | Antes de tudo, devemos instalar a ferramenta `virtualenv` que nos permite trabalhar com ambientes virtuais.
152 |
153 | ```
154 | pip install virtualenv
155 | ```
156 |
157 | Lembrando que se você instalou a versão 3 do Python, é provável que você já o módulo `venv` da biblioteca padrão em seu computador. Agora que você já tem a ferramenta para criar **ambientes virtuais**, vamos criar um novo **diretório** em nossa máquina e navegar até ele através de nossa **interface de linha de comando** e digitar o seguinte comando
158 |
159 | ```
160 | # Para Python 2
161 | virtualenv env
162 |
163 | # Para Python 3
164 | python3 -m venv env
165 | ```
166 |
167 | O comando acima irá criar um diretório chamado `env` (nome arbitrário escolhido por nós) que contém uma estrutura similar a essa:
168 |
169 | ```
170 | ├── bin
171 | │ ├── activate
172 | │ ├── activate.csh
173 | │ ├── activate.fish
174 | │ ├── easy_install
175 | │ ├── easy_install-3.5
176 | │ ├── pip
177 | │ ├── pip3
178 | │ ├── pip3.5
179 | │ ├── python -> python3.5
180 | │ ├── python3 -> python3.5
181 | │ └── python3.5 -> /Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5
182 | ├── include
183 | ├── lib
184 | │ └── python3.5
185 | │ └── site-packages
186 | └── pyvenv.cfg
187 | ```
188 |
189 | Cada *folder* no diretório `env` contém:
190 |
191 | - **bin**: arquivos que interagem com o ambiente virtual
192 | - **include**: Cabeçalhos **C** que compilam os pacotes Python
193 | - **lib**: Uma cópia da versão Python juntamente com o *folder* `site-packages` onde cada dependência está localizada
194 |
195 | ## Ativando um Ambiente Virtual
196 |
197 | Dentro do *folder* **bin** que vimos anteriormente existem **scripts de ativação**, esses scripts são usados para setar nossa **[Shell](https://en.wikipedia.org/wiki/Shell_(computing))** para usar o executável Python do ambiente e os `site-packages`.
198 |
199 | De forma a usarmos os pacotes e recursos de um **ambiente virtual** é necessário que ativemos ele:
200 |
201 | ```
202 | source env/bin/activate
203 | ```
204 |
205 | Ou até mesmo utilizando somente `.`
206 |
207 | ```
208 | . env/bin/activate
209 | ```
210 |
211 | Perceba que ao ativarmos o ambiente virtual, nosso **prompt** de comandos irá se alterar para nos indicar que o ambiente está ligado. Caso você queira desativar o **ambiente virtual** basta digitar:
212 |
213 | ```python
214 | deactivate
215 | ```
216 |
217 | Agora que vimos como **ativar** e **desativar** nosso ambiente virtual, vamos reativá-lo e testá-lo instalando a biblioteca [bcrypt](https://pypi.org/project/bcrypt):
218 |
219 | ```python
220 | pip install bcrypt
221 | ```
222 |
223 | Abra agora o **Python Interactivo** ou um **Script** e vamos testar se a biblioteca está instalada corretamenta:
224 |
225 | ```python
226 | import bcrypt
227 |
228 | bcrypt.hashpw('senha'.encode('utf-8'), bcrypt.gensalt(12))
229 | # b'$2b$12$ZT52zrACwPVFy1ST8UbsKuRQ/LZmhMvmMB7EqchU1VUQTLTi4X7Mu'
230 | ```
231 |
232 | ## Gerando o Arquivo requirements.txt
233 |
234 | O comando `pip freeze` nos permite listar os pacotes que estão instalados em nossa **máquina** ou, caso estejamos em um **ambiente virtual**, os pacotes que nele estão presentes.
235 |
236 | É muito comum existir em projetos o arquivo `requirements.txt` que mostra os pacotes e suas versões necessárias para que o projeto possa funcionar corretamente, também é possível instalar pacotes através do arquivo `requirements.txt`
237 |
238 | Assumindo que estamos em nosso **ambiente virtual** e temos a biblioteca **bcrypt** instalada, vamos executar:
239 |
240 | ```python
241 | pip freeze > requirements.txt
242 | ```
243 |
244 | Ao verificar o contéudo do arquivo **requirements.txt**, encontramos o seguinte:
245 |
246 | ```
247 | bcrypt==3.1.7
248 | cffi==1.12.3
249 | pycparser==2.19
250 | six==1.12.0
251 | ```
252 |
253 | Caso queiramos instalar todos os pacotes contidos nele podemos usar o comando:
254 |
255 | ```python
256 | pip install -r requirements.txt
257 | ```
258 |
259 | ## Outras Alternativas
260 |
261 | Pip é uma ferramenta essencial para todos os Pythonistas e é usada por muitos aplicativos e projetos para gerenciamento de pacotes, ainda sim, existem outras alternativas muito boas que podemos usar em nossos projetos.
262 |
263 | ### Conda
264 |
265 | Conda é um gerenciador de pacotes, dependências e ambientes para muitas linguagens, incluindo Python. Na verdade, sua origem vem do [Anaconda](https://www.anaconda.com/), que começou como um pacote de ciência de dados para Python.
266 |
267 | O Conda é amplamente utilizado para aplicativos de ciência de dados e *Machine Learning*, e usa seu próprio índice para hospedar pacotes compatíveis.
268 |
269 | Conda não apenas permite que você gerencie dependências de pacote, mas também gerencia ambientes virtuais para seus aplicativos, instala distribuições Python compatíveis e empacota seu aplicativo para implantação na produção.
270 |
271 | Além do **pip** e do **ambiente virtual** tradicional que utilizamos anteriormente, também existem outras opções de gerenciadores de pacotes para Python.
272 |
273 | Você pode obter mais detalhes sobre Conda em: https://docs.conda.io/en/latest/
274 |
275 | ### Pipenv
276 |
277 | Pipenv é uma ferramenta que visa trazer o melhor de todos os mundos de pacotes (bundler, composer, npm, cargo, yarn, etc.) para o mundo Python. O Windows é um cidadão de primeira classe no Pipenv.
278 |
279 | Ele cria e gerencia automaticamente um virtualenv para seus projetos, bem como adiciona / remove pacotes de seu Pipfile conforme você instala / desinstala pacotes. Ele também gera o sempre importante `Pipfile.lock`, que é usado para produzir compilações determinísticas.
280 |
281 | Você pode obter mais detalhes sobre ele em: https://pipenv.pypa.io/en/latest/
--------------------------------------------------------------------------------
/Imagens/ASCIITable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/ASCIITable.png
--------------------------------------------------------------------------------
/Imagens/Algorithm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Algorithm.png
--------------------------------------------------------------------------------
/Imagens/Avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Avatar.png
--------------------------------------------------------------------------------
/Imagens/BinaryNumbers.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/BinaryNumbers.gif
--------------------------------------------------------------------------------
/Imagens/Classes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Classes.png
--------------------------------------------------------------------------------
/Imagens/ComputerArchitecture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/ComputerArchitecture.png
--------------------------------------------------------------------------------
/Imagens/Conditionals.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Conditionals.png
--------------------------------------------------------------------------------
/Imagens/Dictionary.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Dictionary.png
--------------------------------------------------------------------------------
/Imagens/Diferença.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Diferença.png
--------------------------------------------------------------------------------
/Imagens/DiferençaSimétrica.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/DiferençaSimétrica.png
--------------------------------------------------------------------------------
/Imagens/DistanceFormula.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/DistanceFormula.png
--------------------------------------------------------------------------------
/Imagens/File.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/File.png
--------------------------------------------------------------------------------
/Imagens/ForLoop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/ForLoop.png
--------------------------------------------------------------------------------
/Imagens/Function.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Function.png
--------------------------------------------------------------------------------
/Imagens/HinduAvatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/HinduAvatar.png
--------------------------------------------------------------------------------
/Imagens/Intersecção.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Intersecção.png
--------------------------------------------------------------------------------
/Imagens/Introduction.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Introduction.png
--------------------------------------------------------------------------------
/Imagens/JanKenPon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/JanKenPon.png
--------------------------------------------------------------------------------
/Imagens/Lambda.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Lambda.png
--------------------------------------------------------------------------------
/Imagens/Lists.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Lists.png
--------------------------------------------------------------------------------
/Imagens/Modules.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Modules.png
--------------------------------------------------------------------------------
/Imagens/Numbers.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Numbers.png
--------------------------------------------------------------------------------
/Imagens/Object.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Object.png
--------------------------------------------------------------------------------
/Imagens/Package.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Package.png
--------------------------------------------------------------------------------
/Imagens/Permutations.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Permutations.png
--------------------------------------------------------------------------------
/Imagens/Polymorphism.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Polymorphism.png
--------------------------------------------------------------------------------
/Imagens/PythonFunction.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/PythonFunction.png
--------------------------------------------------------------------------------
/Imagens/Set.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Set.png
--------------------------------------------------------------------------------
/Imagens/Sierpinski.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Sierpinski.png
--------------------------------------------------------------------------------
/Imagens/String.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/String.png
--------------------------------------------------------------------------------
/Imagens/União.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/União.png
--------------------------------------------------------------------------------
/Imagens/Variables.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/Variables.png
--------------------------------------------------------------------------------
/Imagens/WhileLoop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/WhileLoop.png
--------------------------------------------------------------------------------
/Imagens/XkcdPython.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/XkcdPython.png
--------------------------------------------------------------------------------
/Imagens/abs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/abs.png
--------------------------------------------------------------------------------
/Imagens/x-y.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/x-y.png
--------------------------------------------------------------------------------
/Imagens/x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/x.png
--------------------------------------------------------------------------------
/Imagens/x_y.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/x_y.png
--------------------------------------------------------------------------------
/Imagens/xy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/the-akira/Python-Iluminado/47849ac97bde6678e69666b40f601f075df4faf6/Imagens/xy.png
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 Gabriel Felippe
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Python Iluminado
2 |
3 |
4 |
5 |
6 |
7 |
8 | Python Iluminado é um Guia construído especialmente para Iniciantes com a Linguagem Python. O objetivo é explorar conceitos fundamentais de programação e compreender o funcionamento da linguagem e suas capacidades e potencial, bem como apresentar uma vasta lista de materiais de estudos qualificados para você ampliar e aperfeiçoar o seu conhecimento.
9 |
10 |
11 | ## Conteúdo
12 |
13 | 01. [Introdução](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/01.Introdu%C3%A7%C3%A3o.md)
14 | 02. [Ambiente de Programação](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/02.Ambiente%20de%20Programa%C3%A7%C3%A3o.md)
15 | 03. [Sintaxe](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/03.Sintaxe.md)
16 | 04. [Tipos de Variáveis](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/04.Tipos%20de%20Vari%C3%A1veis.md)
17 | 05. [Números](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/05.N%C3%BAmeros.md)
18 | 06. [Strings](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/06.Strings.md)
19 | 07. [Operadores](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/07.Operadores.md)
20 | 08. [Listas](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/08.Listas.md)
21 | 09. [Tuplas](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/09.Tuplas.md)
22 | 10. [Dicionários](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/10.Dicion%C3%A1rios.md)
23 | 11. [Sets](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/11.Sets.md)
24 | 12. [Input](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/12.Input.md)
25 | 13. [If... Else](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/13.If...Else.md)
26 | 14. [For Loops](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/14.ForLoops.md)
27 | 15. [While Loops](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/15.WhileLoops.md)
28 | 16. [Funções](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/16.Fun%C3%A7%C3%B5es.md)
29 | 17. [Expressões Lambda](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/17.Lambda.md)
30 | 18. [Módulos](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/18.M%C3%B3dulos.md)
31 | 19. [Input & Output de Arquivos](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/19.InputOutputArquivos.md)
32 | 20. [Erros, Exceções e Testes](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/20.ErrosExce%C3%A7%C3%B5es.md)
33 | 21. [Data e Tempo](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/21.DataTempo.md)
34 | 22. [Classes e Objetos](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/22.ClassesObjetos.md)
35 | 23. [Expressões Regulares](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/23.Express%C3%B5esRegulares.md)
36 | 24. [JSON](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/24.PythonJSON.md)
37 | 25. [XML](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/25.PythonXML.md)
38 | 26. [Iteradores ](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/26.Iteradores.md)
39 | 27. [Geradores](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/27.Geradores.md)
40 | 28. [Decoradores](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/28.Decoradores.md)
41 | 29. [Gerenciadores de Pacotes e Ambientes Virtuais](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/29.PIP.md)
42 | 29. [MySQL](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/30.PythonMySQL.md)
43 | 31. [MongoDB](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/31.PythonMongoDB.md)
44 | 32. [Grandes Bibliotecas e Ferramentas](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/32.Grandes%20Bibliotecas%20e%20Ferramentas.md)
45 | 33. [Referências Online](https://github.com/the-akira/Python-Iluminado/blob/master/Capitulos/33.Refer%C3%AAncias%20Online.md)
46 |
--------------------------------------------------------------------------------