├── txt ├── estrutura_de_dados │ ├── fila.txt │ ├── exemplos │ │ ├── Queue.py │ │ ├── Stack.py │ │ ├── Deque.py │ │ └── SQD.py │ └── pilha.txt ├── exemplos │ ├── test_pytest.py │ └── threading_stop.py ├── extras │ └── pygal_svg.py └── test │ ├── assert.txt │ ├── teste.py │ └── teste_unitario.txt ├── README.md ├── Makefile ├── source ├── index.rst ├── content │ ├── threads.rst │ ├── set_frozenset.rst │ ├── packages.rst │ ├── pytest.rst │ ├── closures.rst │ ├── data_types.rst │ ├── boolean.rst │ ├── exec_eval_execfile_compile.rst │ ├── tuple.rst │ ├── modules.rst │ ├── staticmethod_classmethod.rst │ ├── recursive.rst │ ├── decimal_module.rst │ ├── with.rst │ ├── if.rst │ ├── about.rst │ ├── loops.rst │ ├── date_time.rst │ ├── numeric_data_types.rst │ ├── decorators.rst │ ├── iter_gen.rst │ ├── sequences.rst │ ├── property.rst │ ├── scope.rst │ ├── dict.rst │ ├── list.rst │ ├── open.rst │ ├── language_particularities.rst │ ├── except.rst │ └── functions.rst └── conf.py └── LICENSE /txt/estrutura_de_dados/fila.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Apostila de Python 2 | 3 | Curso de programação em Python.
4 | Teoria e prática. 5 | -------------------------------------------------------------------------------- /txt/estrutura_de_dados/exemplos/Queue.py: -------------------------------------------------------------------------------- 1 | from SQD import SQD 2 | 3 | 4 | class Queue(SQD): 5 | 6 | @SQD.pop 7 | def pop(self): 8 | return self.elements.pop(0) 9 | 10 | @SQD.push 11 | def push(self, x): 12 | self.elements.append(x) 13 | 14 | q = Queue() 15 | 16 | q.push(1) 17 | q.push(2) 18 | q.push(3) 19 | -------------------------------------------------------------------------------- /txt/estrutura_de_dados/exemplos/Stack.py: -------------------------------------------------------------------------------- 1 | from SQD import SQD 2 | 3 | 4 | class Stack(SQD): 5 | 6 | @SQD.pop 7 | def pop(self): 8 | return self.elements.pop(-1) 9 | 10 | @SQD.push 11 | def push_last(self, x): 12 | self.elements.append(x) 13 | 14 | s = Stack() 15 | 16 | s.push(1) 17 | s.push(2) 18 | s.push(3) 19 | -------------------------------------------------------------------------------- /txt/exemplos/test_pytest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Use py.test test_pytest.py 3 | ''' 4 | 5 | def fatorial(x): 6 | if x == 0: 7 | return 1 8 | return x * fatorial(x - 1) 9 | 10 | def e_par(x): 11 | if x % 2 == 0: 12 | return True 13 | return False 14 | 15 | def test_fatorial(): 16 | assert fatorial(0) == 1 17 | 18 | def test_par(): 19 | assert e_par(8) 20 | -------------------------------------------------------------------------------- /txt/exemplos/threading_stop.py: -------------------------------------------------------------------------------- 1 | import threading 2 | import os 3 | import time 4 | 5 | class FileChecker(threading.Thread): 6 | def __init__(self, file_path): 7 | super(FileChecker, self).__init__() 8 | self._kill = False 9 | self._file_path = file_path 10 | 11 | def run(self): 12 | while (not os.path.isfile(self._file_path)): 13 | print("File {} not found!".format(self._file_path)) 14 | time.sleep(5) 15 | if self._kill: 16 | break 17 | 18 | def stop(self): 19 | self._kill = True 20 | self.join() 21 | 22 | t = FileChecker('/tmp/teste.txt') 23 | t.start() 24 | 25 | time.sleep(10) 26 | 27 | t.stop() 28 | 29 | print('fim') 30 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = source 9 | BUILDDIR = build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /txt/estrutura_de_dados/exemplos/Deque.py: -------------------------------------------------------------------------------- 1 | # _*_ encoding: utf-8 _*_ 2 | 3 | from SQD import SQD 4 | 5 | 6 | class Deque(SQD): 7 | 8 | @SQD.pop 9 | def pop_first(self): 10 | return self.elements.pop(0) 11 | 12 | @SQD.pop 13 | def pop_last(self): 14 | return self.elements.pop(-1) 15 | 16 | @SQD.push 17 | def push_first(self, x): 18 | self.elements.insert(0, x) 19 | 20 | @SQD.push 21 | def push_last(self, x): 22 | self.elements.append(x) 23 | 24 | # Métodos herdados a serem anulados 25 | 26 | def pop(self): 27 | print('Use pop_first ou pop_last') 28 | 29 | def push(self): 30 | print('Use push_first ou push_last') 31 | 32 | d = Deque() 33 | 34 | for i in range(1, 10): 35 | d.push_last(i) 36 | -------------------------------------------------------------------------------- /txt/extras/pygal_svg.py: -------------------------------------------------------------------------------- 1 | #_*_ encoding: utf-8 _*_ 2 | import pygal 3 | 4 | # http://blog.codeeval.com/codeevalblog/2014 5 | # most popular coding languages according to @codeeval 6 | # python for the win! w00t! 7 | 8 | data = ( 9 | ("Python", 77.7), 10 | ("Java", 22.2), 11 | ("C++", 13), 12 | ("Ruby", 10.6), 13 | ("Javascript", 5.2), 14 | ("TCL", 0.03) 15 | ) 16 | 17 | 18 | # Make a Pygal chart 19 | pie_chart = pygal.Pie() 20 | 21 | # add a title 22 | pie_chart.title = "CodeEval Most Popular Coding Languages of 2014" 23 | 24 | # add the data 25 | for label, data_points in data: 26 | pie_chart.add(label, data_points) 27 | 28 | # Render the chart 29 | xml_string = pie_chart.render() 30 | 31 | 32 | f = raw_input('Digite o nome do arquivo que deseja criar:\n') 33 | 34 | f = open(f, 'w+') 35 | 36 | print >> f, xml_string 37 | 38 | f.close() 39 | -------------------------------------------------------------------------------- /txt/test/assert.txt: -------------------------------------------------------------------------------- 1 | assert 2 | 3 | O comando assert auxilia a encontrar bugs. 4 | Afirmações (assertions) é uma forma sistemática para verificar se o estado interno de uma aplicação é como esperado pelo desenvolvedor, e então achar bugs. 5 | Simplificando, uma afirmação é algo como "raise-if-not comando". Ou seja, se o comando retornar falso levante (raise) uma exceção. 6 | 7 | 8 | 9 | Teste para valor verdadeiro: 10 | 11 | >>> assert True, 'Se for falso' 12 | 13 | 14 | 15 | Teste para valor falso: 16 | 17 | >>> assert False, 'Se for falso' 18 | 19 | Traceback (most recent call last): 20 | File "", line 1, in 21 | assert False, 'Se for falso' 22 | AssertionError: Se for falso 23 | 24 | 25 | 26 | Testando se x é inteiro: 27 | 28 | >>> x = 10 29 | >>> assert type(x) is int, 'x não é um inteiro' 30 | >>> x = '10' 31 | >>> assert type(x) is int, 'x não é um inteiro' 32 | 33 | Traceback (most recent call last): 34 | File "", line 1, in 35 | assert type(x) is int, 'x não é um inteiro' 36 | AssertionError: x não é um inteiro 37 | -------------------------------------------------------------------------------- /txt/test/teste.py: -------------------------------------------------------------------------------- 1 | #_*_ encoding: utf-8 _*_ 2 | 3 | import time 4 | 5 | ''' Fibonacci function ''' 6 | def fibo(n): 7 | if (n < 2): return n 8 | else: 9 | return fibo(n - 1) + fibo(n - 2) 10 | 11 | 12 | ''' Memoize function ''' 13 | def memoize(f): 14 | # dictionary 15 | mem = {} 16 | 17 | ''' Helper function ''' 18 | def memoizer(*param): 19 | key = repr(param) 20 | if not key in mem: 21 | mem[key] = f(*param) 22 | return mem[key] 23 | 24 | return memoizer 25 | 26 | # Start time 27 | t1 = time.time() 28 | 29 | # Loop 30 | for i in range(35): 31 | print('fib(%s) = %s' % (i, fibo(i))) 32 | 33 | # End time 34 | t2 = time.time() 35 | 36 | # Total time 37 | print('Tempo de execução: %.3fs' % (t2 - t1)) 38 | 39 | # Take a pause 40 | raw_input('Pressione para continuar\n') 41 | 42 | # Memoization of fibo (closure) 43 | fibo = memoize(fibo) 44 | 45 | # Start time 46 | t1 = time.time() 47 | 48 | # loop after memoization 49 | for i in range(40): 50 | print('fib(%s) = %s' % (i, fibo(i))) 51 | 52 | # End time 53 | t2 = time.time() 54 | 55 | # Total time 56 | print('Tempo de execução: %.3fs' % (t2 - t1)) 57 | -------------------------------------------------------------------------------- /source/index.rst: -------------------------------------------------------------------------------- 1 | .. Curso de Python documentation master file, created by 2 | sphinx-quickstart on Wed Aug 28 14:04:06 2019. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Curso de Python 7 | =========================================== 8 | 9 | .. toctree:: 10 | :maxdepth: 4 11 | :numbered: 12 | :caption: Contents: 13 | 14 | content/about 15 | content/language_particularities 16 | content/built-ins 17 | content/data_types 18 | content/str 19 | content/numeric_data_types 20 | content/boolean 21 | content/decimal_module 22 | content/date_time 23 | content/sequences 24 | content/list 25 | content/tuple 26 | content/set_frozenset 27 | content/dict 28 | content/operators 29 | content/iter_gen 30 | content/functions 31 | content/oo 32 | content/staticmethod_classmethod 33 | content/property 34 | content/scope 35 | content/if 36 | content/loops 37 | content/open 38 | content/with 39 | content/modules 40 | content/packages 41 | content/except 42 | content/closures 43 | content/decorators 44 | content/exec_eval_execfile_compile 45 | content/recursive 46 | content/threads 47 | content/pytest 48 | 49 | 50 | 51 | 52 | 53 | Indices and tables 54 | ================== 55 | 56 | * :ref:`genindex` 57 | * :ref:`modindex` 58 | * :ref:`search` 59 | -------------------------------------------------------------------------------- /txt/estrutura_de_dados/exemplos/SQD.py: -------------------------------------------------------------------------------- 1 | # _*_ encoding: utf-8 _*_ 2 | 3 | 4 | class SQD(object): 5 | 6 | __elements = [] 7 | __length = 0 8 | 9 | @property 10 | def first(self): 11 | if not self.is_empty(): 12 | return self.elements[0] 13 | return None 14 | 15 | @property 16 | def last(self): 17 | if not self.is_empty(): 18 | return self.elements[-1] 19 | return None 20 | 21 | @property 22 | def elements(self): 23 | return self.__elements 24 | 25 | @property 26 | def length(self): 27 | return self.__length 28 | 29 | @length.setter 30 | def length(self, x): 31 | if (x < 0): 32 | raise ValueError('Somente valores positivos ou zero') 33 | self.__length = x 34 | 35 | def push(f): 36 | def sub_push(self, x): 37 | self.length += 1 38 | f(self, x) 39 | return sub_push 40 | 41 | def is_empty(self): 42 | if (self.length == 0): 43 | print('Aviso: Sem elementos na estrutura!') 44 | return True 45 | return False 46 | 47 | def pop(f): 48 | def sub_pop(self): 49 | if not self.is_empty(): 50 | self.length -= 1 51 | return f(self) 52 | return None 53 | return sub_pop 54 | 55 | def erase(self): 56 | self.elements.clear() 57 | self.length = 0 58 | -------------------------------------------------------------------------------- /source/content/threads.rst: -------------------------------------------------------------------------------- 1 | Threads 2 | ******* 3 | 4 | 5 | 6 | .. code-block:: python 7 | 8 | import threading 9 | import time 10 | 11 | def funcao1(): 12 | linha = ('_' * 79) 13 | while (True): 14 | print(linha) 15 | time.sleep(10) 16 | 17 | def funcao2(tempo): 18 | while (True): 19 | print('funcao2') 20 | time.sleep(tempo) 21 | 22 | t1 = threading.Thread(target=funcao1, name='primeira_thread') 23 | 24 | t2 = threading.Thread(target=funcao2, name='segunda_thread', args=(3,)) 25 | 26 | t1.start() 27 | 28 | t2.start() 29 | 30 | .. code-block:: console 31 | 32 | funcao2 33 | funcao2 34 | funcao2 35 | 36 | 37 | .. code-block:: python 38 | 39 | t1.getName() 40 | 41 | .. code-block:: console 42 | 43 | 'primeira_thread' 44 | 45 | 46 | E se quisermos parar uma thread? 47 | 48 | .. code-block:: python 49 | 50 | import threading 51 | import os 52 | import time 53 | 54 | class FileChecker(threading.Thread): 55 | def __init__(self, file_path): 56 | super(FileChecker, self).__init__() 57 | self._kill = False 58 | self._file_path = file_path 59 | 60 | def run(self): 61 | while (not os.path.isfile(self._file_path)): 62 | print("File {} not found!".format(self._file_path)) 63 | time.sleep(5) 64 | if self._kill: 65 | break 66 | 67 | def stop(self): 68 | self._kill = True 69 | self.join() 70 | 71 | t = FileChecker('/tmp/teste.txt') 72 | t.start() 73 | 74 | time.sleep(10) 75 | 76 | t.stop() 77 | 78 | print('fim') -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2017, Juliano Atanazio 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | * Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /txt/estrutura_de_dados/pilha.txt: -------------------------------------------------------------------------------- 1 | stack (Stack) 2 | 3 | Sempre insere ao final. 4 | Last In First First Out (LIFO) ou First In Last Out (FILO). 5 | 6 | class Pilha(object): 7 | def __init__(self): 8 | self.stack = [] 9 | self.len_stack = 0 10 | 11 | def push(self, x): 12 | self.stack.append(x) 13 | self.len_stack += 1 14 | 15 | def is_empty(self): 16 | if (self.len_stack == 0): 17 | print('Aviso: stack vazia!') 18 | return True 19 | return False 20 | 21 | def pop(self): 22 | if not self.is_empty(): 23 | self.len_stack -= 1 24 | return self.stack.pop() 25 | return None 26 | 27 | def top(self): 28 | if not self.is_empty(): 29 | return self.stack[-1] 30 | return None 31 | 32 | def bottom(self): 33 | if not self.is_empty(): 34 | return self.stack[0] 35 | return None 36 | 37 | def erase(self): 38 | self.stack = [] 39 | self.len_stack = 0 40 | 41 | def elements(self): 42 | return self.stack 43 | 44 | def length(self): 45 | return self.len_stack 46 | 47 | 48 | p = Pilha() 49 | 50 | for i in range(0, 9): 51 | p.push(i) 52 | 53 | p.length() 54 | 9 55 | 56 | p.elements() 57 | [0, 1, 2, 3, 4, 5, 6, 7, 8] 58 | 59 | p.top() 60 | 8 61 | 62 | p.bottom() 63 | 0 64 | 65 | p.pop() 66 | 8 67 | 68 | p.is_empty() 69 | False 70 | 71 | p.elements() 72 | [0, 1, 2, 3, 4, 5, 6, 7] 73 | 74 | p.erase() 75 | 76 | p.is_empty() 77 | Aviso: stack vazia! 78 | True 79 | 80 | p.pop() 81 | Aviso: stack vazia! 82 | 83 | p.push(777) 84 | 85 | p.elements() 86 | [777] 87 | -------------------------------------------------------------------------------- /source/content/set_frozenset.rst: -------------------------------------------------------------------------------- 1 | set e frozenset 2 | *************** 3 | 4 | | Similarmente a list e tuple, a diferença entre eles é que frozenset é um tipo imutável. 5 | | Seus elementos são únicos. 6 | | Implementam operações matemáticas de conjuntos. 7 | 8 | 9 | 10 | .. code-block:: python 11 | 12 | # Set vazio: 13 | s = {*()} 14 | 15 | ou 16 | 17 | 18 | .. code-block:: python 19 | 20 | s = set() 21 | 22 | 23 | .. code-block:: python 24 | 25 | # Criação de um conjunto (set) não vazio: 26 | s = set([1, 1, 2, 3]) 27 | 28 | ou 29 | 30 | .. code-block:: python 31 | 32 | s = set((1, 1, 2, 3)) 33 | 34 | ou 35 | 36 | .. code-block:: python 37 | 38 | s = set([1, 1, 2, 3]) 39 | 40 | ou 41 | 42 | .. code-block:: python 43 | 44 | s = set({1, 1, 2, 3}) 45 | 46 | ou 47 | 48 | .. code-block:: python 49 | 50 | s = {1, 2, 3} 51 | 52 | .. code-block:: python 53 | 54 | # Exibindo o conteúdo do set: 55 | s 56 | 57 | .. code-block:: console 58 | 59 | {1, 2, 3} 60 | 61 | .. code-block:: python 62 | 63 | # Definição de dois conjuntos: 64 | a = set([1,2,3]) 65 | b = set([2,3,4]) 66 | 67 | 68 | .. code-block:: python 69 | 70 | # Operação de união entre os conjuntos: 71 | a | b 72 | 73 | ou 74 | 75 | .. code-block:: python 76 | 77 | a.union(b) 78 | 79 | .. code-block:: console 80 | 81 | {1, 2, 3, 4} 82 | 83 | 84 | .. code-block:: python 85 | 86 | # Operação de intersecção entre os conjuntos: 87 | a & b 88 | 89 | ou 90 | 91 | .. code-block:: python 92 | 93 | a.intersection(b) 94 | 95 | .. code-block:: console 96 | 97 | {2, 3} 98 | 99 | 100 | .. code-block:: python 101 | 102 | # Frozenset vazio: 103 | f = frozenset() 104 | 105 | .. code-block:: python 106 | 107 | # Frozenset não vazio: 108 | f = frozenset((1, 2, 3)) 109 | 110 | ou 111 | 112 | .. code-block:: python 113 | 114 | f = frozenset({1, 2, 3}) 115 | 116 | ou 117 | 118 | .. code-block:: python 119 | 120 | f = frozenset([1, 2, 3]) 121 | 122 | ou 123 | 124 | .. code-block:: python 125 | 126 | f = frozenset({1, 2, 3}) 127 | 128 | .. code-block:: python 129 | 130 | # Exibindo o conteúdo do frozenset: 131 | f 132 | 133 | .. code-block:: console 134 | 135 | frozenset({1, 2, 3}) 136 | -------------------------------------------------------------------------------- /source/content/packages.rst: -------------------------------------------------------------------------------- 1 | Pacotes 2 | ******* 3 | 4 | 5 | Criação de diretório (pacote): 6 | 7 | .. code-block:: bash 8 | 9 | mkdir pack_0 10 | 11 | 12 | 13 | Criação de um módulo dentro do pacote: 14 | 15 | .. code-block:: bash 16 | 17 | vim pack_0/foo.py 18 | 19 | .. code-block:: python 20 | 21 | # _*_ encoding: utf-8 _*_ 22 | 23 | print(__name__) 24 | 25 | 26 | class Pessoa(object): 27 | nome = '' 28 | idade = 0 29 | 30 | def saudacao(self): 31 | print('Olá, meu nome é {}'.format(self.nome)) 32 | 33 | class Funcionario(Pessoa): 34 | matricula = '' 35 | 36 | def cubo(x): 37 | return x ** 3 38 | 39 | 40 | 41 | import pacote.modulo: 42 | 43 | .. code-block:: python 44 | 45 | import pack_0.foo 46 | f1 = pack_0.foo.Funcionario() 47 | f1.nome = 'Zezinho' 48 | f1.saudacao() 49 | Olá, meu nome é Zezinho 50 | 51 | $ ls pack_0/ 52 | foo.py __init__.py __pycache__ 53 | 54 | $ ls pack_0/__pycache__/ 55 | foo.cpython-34.pyc __init__.cpython-34.pyc 56 | 57 | $ file pack_0/__pycache__/foo.cpython-34.pyc 58 | pack_0/__pycache__/foo.cpython-34.pyc: python 3.4 byte-compiled 59 | 60 | $ vim pack_0/__init__.py 61 | 62 | # _*_ encoding: utf-8 _*_ 63 | 64 | if __name__ != '__main__': 65 | print('Pacote {} importado'.format(__name__)) 66 | 67 | > import pack_0.foo 68 | Pacote pack_0 importado 69 | pack_0.foo 70 | 71 | > import pack_0 72 | Pacote pack_0 importado 73 | 74 | $ mkdir -p pack_0/pack_1/pack_2 75 | 76 | $ mv pack_0/foo.py pack_0/pack_1/pack_2/ 77 | 78 | > import pack_0.pack_1.pack_2.foo 79 | Pacote pack_0 importado 80 | pack_0.pack_1.pack_2.foo 81 | 82 | > f1 = pack_0.pack_1.pack_2.foo.Funcionario() 83 | 84 | Apesar de terem sido declarados, os diretórios pack_1 e pack_2 não são pacotes. 85 | 86 | 87 | Transformando os subdiretórios em pacotes: 88 | 89 | $ > pack_0/pack_1/__init__.py 90 | $ > pack_0/pack_1/pack_2/__init__.py 91 | 92 | > from pack_0.pack_1.pack_2 import foo 93 | Pacote pack_0 importado 94 | pack_0.pack_1.pack_2.foo 95 | > f1 = foo.Funcionario() 96 | 97 | > from pack_0.pack_1.pack_2.foo import Funcionario 98 | Pacote pack_0 importado 99 | pack_0.pack_1.pack_2.foo 100 | > f1 = Funcionario() 101 | 102 | $ echo 'print(__name__)' > pack_0/pack_1/__init__.py 103 | $ echo 'print(__name__)' > pack_0/pack_1/pack_2/__init__.py 104 | 105 | 106 | > from pack_0.pack_1.pack_2.foo import Funcionario 107 | Pacote pack_0 importado 108 | pack_0.pack_1 109 | pack_0.pack_1.pack_2 110 | pack_0.pack_1.pack_2.foo 111 | 112 | 113 | > from pack_0.pack_1.pack_2.foo import * 114 | Pacote pack_0 importado 115 | pack_0.pack_1 116 | pack_0.pack_1.pack_2 117 | pack_0.pack_1.pack_2.foo 118 | > f1 = Funcionario() 119 | 120 | $ python3 pack_0/__pycache__/foo.cpython-34.pyc 121 | 122 | __main__ -------------------------------------------------------------------------------- /source/content/pytest.rst: -------------------------------------------------------------------------------- 1 | pytest 2 | ****** 3 | 4 | 5 | 6 | sdsdsdsdsd: 7 | 8 | .. code-block:: bash 9 | 10 | vim /tmp/test_pytest.py 11 | 12 | 13 | .. code-block:: python 14 | 15 | # Função fatorial 16 | def fatorial(x): 17 | if x == 0: 18 | return 1 19 | return x * fatorial(x - 1) 20 | 21 | # Função que testa se um número é par 22 | def e_par(x): 23 | if x % 2 == 0: 24 | return True 25 | return False 26 | 27 | # Função para testar a função fatorial 28 | def test_fatorial(): 29 | assert fatorial(0) == 1 30 | 31 | # Função para testar a função e_par 32 | def test_par(): 33 | assert e_par(8) 34 | 35 | 36 | 37 | sasasasasa: 38 | 39 | .. code-block:: bash 40 | 41 | py.test /tmp/test_pytest.py 42 | 43 | .. code-block:: console 44 | 45 | ================================================= test session starts ================================================= 46 | platform linux -- Python 3.4.3+, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 47 | rootdir: /tmp, inifile: 48 | collected 2 items 49 | 50 | ../../tmp/test_pytest.py .F 51 | 52 | ====================================================== FAILURES ======================================================= 53 | ______________________________________________________ test_par _______________________________________________________ 54 | 55 | def test_par(): 56 | > assert e_par(8) 57 | E assert e_par(8) 58 | 59 | /tmp/test_pytest.py:19: AssertionError 60 | ========================================= 1 failed, 1 passed in 0.01 seconds ========================================== 61 | 62 | 63 | 64 | 65 | sdsdsdsd: 66 | 67 | .. code-block:: bash 68 | 69 | vim /tmp/test_pytest.py 70 | 71 | 72 | .. code-block:: python 73 | 74 | # Função fatorial 75 | def fatorial(x): 76 | if x == 0: 77 | return 1 78 | return x * fatorial(x - 1) 79 | 80 | # Função que testa se um número é par 81 | def e_par(x): 82 | if x % 2 == 0: 83 | return True 84 | return False 85 | 86 | # Função para testar a função fatorial 87 | def test_fatorial(): 88 | assert fatorial(0) == 1 89 | 90 | # Função para testar a função e_par 91 | def test_par(): 92 | assert e_par(8) 93 | 94 | 95 | 96 | .. code-block:: bash 97 | 98 | py.test /tmp/test_pytest.py 99 | 100 | .. code-block:: console 101 | 102 | ================================================= test session starts ================================================= 103 | platform linux -- Python 3.4.3+, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 104 | rootdir: /tmp, inifile: 105 | collected 2 items 106 | 107 | ../../tmp/test_pytest.py .. 108 | 109 | ============================================== 2 passed in 0.00 seconds =============================================== -------------------------------------------------------------------------------- /source/content/closures.rst: -------------------------------------------------------------------------------- 1 | Closures 2 | ******** 3 | 4 | Funções são objetos também. 5 | Closures são funções que constroem funções, retorna outra função. 6 | Sua estrutura é uma função dentro de outra. 7 | A função interna é também conhecida como função auxiliadora (helper). 8 | 9 | 10 | 11 | Criação de uma closure: 12 | 13 | .. code-block:: python 14 | 15 | def funcao_principal(x): 16 | def funcao_auxiliadora(y): 17 | return x ** y 18 | return funcao_auxiliadora 19 | 20 | 21 | 22 | Criação de uma variável foo e passando o valor x para a função principal: 23 | 24 | .. code-block:: python 25 | 26 | foo = funcao_principal(2) 27 | 28 | "foo" é uma nova função cujo o "x" de "função_principal" é 2. 29 | 30 | 31 | 32 | Qual é o nome da função?: 33 | 34 | .. code-block:: python 35 | 36 | print(foo.__name__) 37 | 38 | .. code-block:: console 39 | 40 | funcao_auxiliadora 41 | 42 | 43 | 44 | Tipo de "foo": 45 | 46 | .. code-block:: python 47 | 48 | type(foo) 49 | 50 | .. code-block:: console 51 | 52 | function 53 | 54 | 55 | 56 | Representação de "foo": 57 | 58 | .. code-block:: python 59 | 60 | repr(foo) 61 | 62 | .. code-block:: console 63 | 64 | '.funcao_auxiliadora at 0x7f9845369950>' 65 | 66 | 67 | 68 | Imprimindo o valor resultante ao passar agora o valor y: 69 | 70 | .. code-block:: python 71 | 72 | print(foo(6)) 73 | 74 | .. code-block:: console 75 | 76 | 64 77 | 78 | A operação realizada foi 2 elevado a 6 (x ** y). 79 | 80 | 81 | 82 | Podemos também chamar a função principal passando o parâmetro da função auxiliar: 83 | 84 | .. code-block:: python 85 | 86 | funcao_principal(5)(2) 87 | 88 | .. code-block:: console 89 | 90 | 25 91 | 92 | 93 | 94 | Closures com Lambda 95 | ------------------- 96 | 97 | Criação de uma closure com lambda: 98 | 99 | .. code-block:: python 100 | 101 | def funcao_principal(x): 102 | return lambda y: x ** y 103 | 104 | 105 | 106 | O "x" será 3: 107 | 108 | .. code-block:: python 109 | 110 | bar = funcao_principal(3) 111 | 112 | 113 | 114 | Exibindo o nome do objeto: 115 | 116 | .. code-block:: python 117 | 118 | print(bar.__name__) 119 | 120 | .. code-block:: console 121 | 122 | 123 | 124 | 125 | 126 | Tipo: 127 | 128 | .. code-block:: python 129 | 130 | type(bar) 131 | 132 | .. code-block:: console 133 | 134 | function 135 | 136 | 137 | 138 | Representação: 139 | 140 | .. code-block:: python 141 | 142 | repr(bar) 143 | 144 | .. code-block:: console 145 | 146 | '. at 0x7f9844527730>' 147 | 148 | 149 | 150 | 3 elevado a 2: 151 | 152 | .. code-block:: python 153 | 154 | print(bar(2)) 155 | 156 | .. code-block:: console 157 | 158 | 9 159 | 160 | 161 | 162 | Passando o parâmetro da função principal e de lambda: 163 | 164 | .. code-block:: python 165 | 166 | funcao_principal(2)(5) 167 | 168 | .. code-block:: console 169 | 170 | 32 -------------------------------------------------------------------------------- /source/conf.py: -------------------------------------------------------------------------------- 1 | # Configuration file for the Sphinx documentation builder. 2 | # 3 | # This file only contains a selection of the most common options. For a full 4 | # list see the documentation: 5 | # https://www.sphinx-doc.org/en/master/usage/configuration.html 6 | 7 | # -- Path setup -------------------------------------------------------------- 8 | 9 | # If extensions (or modules to document with autodoc) are in another directory, 10 | # add these directories to sys.path here. If the directory is relative to the 11 | # documentation root, use os.path.abspath to make it absolute, like shown here. 12 | # 13 | # import os 14 | # import sys 15 | # sys.path.insert(0, os.path.abspath('.')) 16 | 17 | 18 | # -- Project information ----------------------------------------------------- 19 | 20 | project = 'Curso de Python' 21 | copyright = '2019, Juliano Atanazio' 22 | author = 'Juliano Atanazio' 23 | 24 | # The full version, including alpha/beta/rc tags 25 | release = '2019-08-28' 26 | 27 | 28 | # -- General configuration --------------------------------------------------- 29 | 30 | # Add any Sphinx extension module names here, as strings. They can be 31 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 32 | # ones. 33 | extensions = [ 34 | ] 35 | 36 | # Add any paths that contain templates here, relative to this directory. 37 | templates_path = ['_templates'] 38 | 39 | # The language for content autogenerated by Sphinx. Refer to documentation 40 | # for a list of supported languages. 41 | # 42 | # This is also used if you do content translation via gettext catalogs. 43 | # Usually you set "language" from the command line for these cases. 44 | language = 'pt_BR' 45 | 46 | # List of patterns, relative to source directory, that match files and 47 | # directories to ignore when looking for source files. 48 | # This pattern also affects html_static_path and html_extra_path. 49 | exclude_patterns = [] 50 | 51 | 52 | # -- Options for HTML output ------------------------------------------------- 53 | 54 | # The theme to use for HTML and HTML Help pages. See the documentation for 55 | # a list of builtin themes. 56 | # 57 | # html_theme = 'alabaster' 58 | html_theme = 'sphinx_rtd_theme' 59 | 60 | # Add any paths that contain custom static files (such as style sheets) here, 61 | # relative to this directory. They are copied after the builtin static files, 62 | # so a file named "default.css" will overwrite the builtin "default.css". 63 | html_static_path = ['_static'] 64 | 65 | source_suffix = { 66 | '.rst': 'restructuredtext', 67 | '.txt': 'restructuredtext', 68 | '.md': 'markdown', 69 | } 70 | 71 | html_theme_options = { 72 | 'canonical_url': '', 73 | 'analytics_id': 'UA-XXXXXXX-1', # Provided by Google in your dashboard 74 | 'logo_only': False, 75 | 'display_version': True, 76 | 'prev_next_buttons_location': 'bottom', 77 | 'style_external_links': False, 78 | # 'vcs_pageview_mode': '', 79 | 'style_nav_header_background': '#1a1818', 80 | # Toc options 81 | 'collapse_navigation': True, 82 | 'sticky_navigation': True, 83 | 'navigation_depth': 4, 84 | 'includehidden': True, 85 | 'titles_only': False 86 | } 87 | -------------------------------------------------------------------------------- /source/content/data_types.rst: -------------------------------------------------------------------------------- 1 | Tipos de Dados 2 | ************** 3 | 4 | Os tipos em Python podem ser mutáveis ou imutáveis, ou seja, permitem ou não alterar seu conteúdo. 5 | Todos os tipos de dados são objetos, pois não existem tipos primitivos em Python. 6 | O tipo de dado de um objeto é determinado em tempo de execução e não há uma declaração explícita como se vê em outras linguagens. 7 | 8 | 9 | 10 | Criação de um objeto e verificando seu tipo: 11 | 12 | .. code-block:: python 13 | 14 | # Atribuir um inteiro à variável (objeto) "x": 15 | x = 7 16 | 17 | # Verificar o tipo de "x": 18 | type(x) 19 | 20 | .. code-block:: console 21 | 22 | int 23 | 24 | 25 | Variáveis 26 | --------- 27 | 28 | São criadas através de atribuição de valor e quando não existem mais referência a elas são destruídas pelo garbage colector. 29 | Seus nomes devem começar por uma letra (não acentuadas) ou por underline "_". 30 | 31 | Tipagem Dinâmica 32 | ~~~~~~~~~~~~~~~~ 33 | 34 | No mesmo código pode ter objetos diferentes com o mesmo nome. 35 | Como dito anteriormente, o tipo é determinado na execução e um mesmo nome pode ter tipos diferentes ao longo do código, porém na verdade será outro objeto. 36 | 37 | 38 | .. code-block:: python 39 | 40 | # Criação de dois objetos de mesmo nome 41 | x = 3.7 42 | 43 | # Exibir o id de "x": 44 | id(x) 45 | 46 | .. code-block:: console 47 | 48 | 140291958334736 49 | 50 | .. code-block:: python 51 | 52 | # Qual é o tipo de "x": 53 | type(x) 54 | 55 | .. code-block:: console 56 | 57 | float 58 | 59 | .. code-block:: python 60 | 61 | # Atribuir uma string à variável "x": 62 | x = 'foo' 63 | 64 | # Verificar a id de "x": 65 | id(x) 66 | 67 | .. code-block:: console 68 | 69 | 140292017787768 70 | 71 | .. code-block:: python 72 | 73 | # Qual é o tipo de "x": 74 | type(x) 75 | 76 | .. code-block:: console 77 | 78 | str 79 | 80 | Foram criados dois objetos "x", sendo o primeiro float e o segundo uma string. 81 | Nota-se ao redefinir o valor do objeto o mesmo deixou de existir (garbagem collector) criando um novo objeto. 82 | 83 | 84 | Tipagem Forte 85 | ~~~~~~~~~~~~~ 86 | 87 | A tipagem em Python além de dinâmica ela é forte. 88 | Em casos de operações matemáticas, por exemplo, é necessário fazer um cast para ser possível quando os tipos são incompatíveis. 89 | 90 | .. code-block:: python 91 | 92 | # Soma entre um um número de ponto flutuante e um inteiro 93 | 5.0 + 2 94 | 95 | .. code-block:: console 96 | 97 | 7.0 98 | 99 | .. code-block:: python 100 | 101 | # Tentativa de soma entre uma string e um inteiro 102 | '5' + 2 103 | 104 | .. code-block:: console 105 | 106 | TypeError: must be str, not int 107 | 108 | 109 | Ocorreu um erro, pois foi feita uma tentativa de somar uma string com um inteiro. 110 | Para isso ser possível é necessário fazer um cast da string para um valor numérico (quando for compatível, é claro). 111 | 112 | .. code-block:: python 113 | 114 | # Soma utilizando cast 115 | int('5') + 2 116 | 117 | .. code-block:: console 118 | 119 | 7 -------------------------------------------------------------------------------- /source/content/boolean.rst: -------------------------------------------------------------------------------- 1 | Booleanos 2 | ********* 3 | 4 | Qualquer objeto pode ser testado como um valor verdadeiro, para uso como condição em um if ou um while ou como um operando de operações "booleanas". Os seguintes valores são considerados como False: 5 | 6 | ``False``, ``0``, ``0.0``, ``0j``, ``[]``, ``()``, ``{}``, ``set([])``, ``None``, ``""`` ou ``''``. 7 | 8 | Instâncias de classes definidas por usuários, se a classe define um método __bool__() ou __len__(), quando este método retornar o inteiro zero ou um valor booleano False. 9 | Todos outros valores são considerados verdadeiros, então objetos de muitos tipos são considerados como True. 10 | 11 | .. code-block:: python 12 | 13 | # Definindo a variável como True de forma indireta: 14 | b = bool(1) 15 | 16 | # Verificando o valor da variável: 17 | print(b) 18 | 19 | .. code-block:: console 20 | 21 | True 22 | 23 | .. code-block:: python 24 | 25 | # Definindo a variável como False de forma indireta: 26 | b = bool(0) 27 | 28 | # Verificando o valor da variável: 29 | print(b) 30 | 31 | .. code-block:: console 32 | 33 | False 34 | 35 | .. code-block:: python 36 | 37 | # Teste usando a lógica OR: 38 | True | False 39 | 40 | .. code-block:: console 41 | 42 | True 43 | 44 | .. code-block:: python 45 | 46 | # Teste usando a lógica AND: 47 | True & False 48 | 49 | .. code-block:: console 50 | 51 | False 52 | 53 | .. code-block:: python 54 | 55 | # Negação de True: 56 | not True 57 | 58 | .. code-block:: console 59 | 60 | False 61 | 62 | .. code-block:: python 63 | 64 | # Negação de False: 65 | not False 66 | 67 | .. code-block:: console 68 | 69 | True 70 | 71 | .. code-block:: python 72 | 73 | # Criação de classes de teste: 74 | class Foo(object): 75 | def __len__(self): 76 | return 1 77 | 78 | class Bar(object): 79 | def __len__(self): 80 | return 0 81 | 82 | .. code-block:: python 83 | 84 | # Criação de objetos: 85 | foo = Foo() 86 | bar = Bar() 87 | 88 | # Verificando o valor booleano dos objetos: 89 | bool(foo) 90 | 91 | .. code-block:: console 92 | 93 | True 94 | 95 | .. code-block:: python 96 | 97 | bool(bar) 98 | 99 | .. code-block:: console 100 | 101 | False 102 | 103 | .. code-block:: python 104 | 105 | # True AND (NOT False): 106 | bool(foo) & (not bool(bar)) 107 | 108 | .. code-block:: console 109 | 110 | True 111 | 112 | .. code-block:: python 113 | 114 | # True AND False: 115 | bool(foo) & bool(bar) 116 | 117 | .. code-block:: console 118 | 119 | False 120 | 121 | .. code-block:: python 122 | 123 | # Classe para testar os métodos __bool__ e __len__: 124 | class Spam(object): 125 | def __bool__(self): 126 | return True 127 | 128 | def __len__(self): 129 | return 0 130 | 131 | O método __bool__ retorna um valor verdadeiro e o método __len__ um falso. 132 | Com ambos declarados na mesma classe, um objeto dela o que retornará? 133 | 134 | .. code-block:: python 135 | 136 | # Criação de objeto: 137 | spam = Spam() 138 | 139 | # Verificando o valor booleano: 140 | bool(spam) 141 | 142 | .. code-block:: console 143 | 144 | True 145 | 146 | O retorno foi verdadeiro, o método ``__bool__`` prevalece. -------------------------------------------------------------------------------- /source/content/exec_eval_execfile_compile.rst: -------------------------------------------------------------------------------- 1 | Expressões vs Statements 2 | ************************ 3 | 4 | Expressão: é algo que pode ser reduzido para um valor. 5 | 6 | Statement: sinônimo de comando. 7 | 8 | 9 | 10 | exec 11 | ---- 12 | 13 | É uma função que executa um comando (statement) passado como string. 14 | 15 | 16 | 17 | bla bla bla: 18 | 19 | .. code-block:: python 20 | 21 | exec('print(5)') # prints 5. 22 | 23 | .. code-block:: comando 24 | 25 | 5 26 | 27 | .. code-block:: python 28 | 29 | exec('print(5)\nprint(6)') # prints 5{newline}6. 30 | 31 | .. code-block:: console 32 | 33 | 5 34 | 6 35 | 36 | 37 | sdsdsdsdsd: 38 | 39 | .. code-block:: python 40 | 41 | exec('if True: print(6)') # prints 6. 42 | 43 | .. code-block:: console 44 | 45 | 6 46 | 47 | 48 | 49 | .. code-block:: python 50 | 51 | exec('5') # does nothing and returns nothing. 52 | exec('x = 7') # does nothing and returns nothing. 53 | 54 | 55 | 56 | eval 57 | ---- 58 | 59 | É uma função que retorna o resultado de uma expressão. 60 | 61 | 62 | 63 | bla bla bla: 64 | 65 | .. code-block:: python 66 | 67 | x = eval('5') # x <- 5 68 | x = eval('%d + 6' % x) # x <- 11 69 | x = eval('abs(%d)' % -100) # x <- 100 70 | x = eval('x = 5') # INVÁLIDO; atribuição não é uma expressão 71 | 72 | .. code-block:: console 73 | 74 | SyntaxError: invalid syntax 75 | 76 | 77 | 78 | wewewewe: 79 | 80 | .. code-block:: python 81 | 82 | x = eval('if 1: x = 4') # INVÁLIDO; if é um statement e não uma expressão 83 | 84 | .. code-block:: console 85 | 86 | SyntaxError: invalid syntax 87 | 88 | 89 | 90 | .. https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html 91 | 92 | bla bla bla: 93 | 94 | .. code-block:: python 95 | 96 | execfile(file) 97 | 98 | 99 | 100 | bla bla bla: 101 | 102 | .. code-block:: bash 103 | 104 | cat << EOF > /tmp/foo.py 105 | print('hello, world!') 106 | EOF 107 | 108 | 109 | 110 | bla bla bla: 111 | 112 | .. code-block:: bash 113 | 114 | python /tmp/foo.py 115 | 116 | .. code-block:: console 117 | 118 | hello, world! 119 | 120 | 121 | 122 | bla bla bla: 123 | 124 | .. code-block:: bash 125 | 126 | execfile('/tmp/foo.py') 127 | 128 | .. code-block:: console 129 | 130 | hello, world! 131 | 132 | 133 | compile 134 | ------- 135 | 136 | compile is a lower level version of exec and eval. It does not execute or evaluate your statements or expressions, but returns a code object that can do it. The modes are as follows: 137 | 138 | compile(string, '', 'eval') returns the code object that would have been executed had you done eval(string). Note that you cannot use statements in this mode; only a (single) expression is valid. 139 | compile(string, '', 'exec') returns the code object that would have been executed had you done exec(string). You can use any number of statements here. 140 | compile(string, '', 'single') is like the exec mode, but it will ignore everything except for the first statement. Note that an if/else statement with its results is considered a single statement. 141 | 142 | .. http://sahandsaba.com/thirty-python-language-features-and-tricks-you-may-not-know.html 143 | 144 | 145 | 146 | 147 | .. python3.7 -mtimeit -s 'code = "a = 2; b = 3; c = a * b"' 'exec(code)' 148 | 149 | 150 | .. python3.7 -mtimeit -s 'code = compile("a = 2; b = 3; c = a * b", "", "exec")' 'exec(code)' -------------------------------------------------------------------------------- /source/content/tuple.rst: -------------------------------------------------------------------------------- 1 | Tupla 2 | ***** 3 | 4 | | Tupla têm sua estrutura muito similar à da lista, no entanto, ela é imutável. 5 | | Ela é mais recomendada para uso de dados estáticos, pois comparada à lista, tem 6 | | um desempenho melhor devido à sua simplicidade e consome menos recursos. 7 | 8 | 9 | 10 | .. code-block:: python 11 | 12 | # Declaração de uma tupla vazia: 13 | t = () 14 | 15 | ou 16 | 17 | .. code-block:: python 18 | 19 | t = tuple() 20 | 21 | 22 | .. code-block:: python 23 | 24 | # Declaração de uma tupla com três elementos: 25 | t = tuple([1, 2, 3]) 26 | 27 | ou 28 | 29 | .. code-block:: python 30 | 31 | t = (1, 2, 3) 32 | 33 | ou 34 | 35 | .. code-block:: python 36 | 37 | t = 1, 2, 3 38 | 39 | .. code-block:: python 40 | 41 | # Exibindo o conteúdo da tupla: 42 | t 43 | 44 | .. code-block:: console 45 | 46 | (1, 2, 3) 47 | 48 | 49 | .. code-block:: python 50 | 51 | # Criação de um conjunto (set) contendo todos atributos e 52 | # métodos de uma tupla: 53 | tupla = set(dir(tuple)) 54 | 55 | 56 | .. code-block:: python 57 | 58 | # Criação de um conjunto (set) contendo todos atributos e 59 | # métodos de uma lista: 60 | lista = set(dir(list)) 61 | 62 | 63 | 64 | .. code-block:: python 65 | 66 | # Via intersecção, o que há em comum entre lista e tupla?: 67 | tupla.intersection(lista) 68 | 69 | . . . 70 | 71 | Tuplas tem apenas os métodos count e index. 72 | 73 | .. code-block:: python 74 | 75 | # Tupla de um único elemento: 76 | t = (1, ) 77 | 78 | 79 | .. code-block:: python 80 | 81 | # Exibir o conteúdo da tupla: 82 | t 83 | 84 | .. code-block:: console 85 | 86 | (1,) 87 | 88 | 89 | 90 | .. code-block:: python 91 | 92 | # Função type para verificar o tipo do objeto: 93 | type(t) 94 | 95 | .. code-block:: console 96 | 97 | tuple 98 | 99 | 100 | .. code-block:: python 101 | 102 | # Declaração de duas variáveis e trocando o valor entre elas: 103 | x = 0 104 | y = 1 105 | x, y = y, x # A troca se dá pela atribuição respectiva 106 | 107 | 108 | 109 | .. code-block:: python 110 | 111 | # Verificando os valores das variáveis: 112 | x 113 | 114 | .. code-block:: console 115 | 116 | 1 117 | 118 | 119 | .. code-block:: python 120 | 121 | y 122 | 123 | 124 | .. code-block:: console 125 | 126 | 0 127 | 128 | 129 | 130 | .. code-block:: python 131 | 132 | # Criação de uma variável que retorna uma tupla com três elementos: 133 | def retorna_tupla(): 134 | return 1, 2, 3 135 | 136 | 137 | 138 | .. code-block:: python 139 | 140 | # Atribuição respectiva: 141 | x, y, z = retorna_tupla() 142 | 143 | 144 | .. code-block:: python 145 | 146 | # Verificando os valores das variáveis: 147 | print(x) 148 | 149 | .. code-block:: console 150 | 151 | 1 152 | 153 | .. code-block:: python 154 | 155 | print(y) 156 | 157 | .. code-block:: console 158 | 159 | 2 160 | 161 | .. code-block:: python 162 | 163 | print(z) 164 | 165 | .. code-block:: console 166 | 167 | 3 168 | 169 | Tuplas são imutáveis, mas seus elementos não necessariamente: 170 | 171 | .. code-block:: python 172 | 173 | t = ({}, []) # Tupla com dois elementos; um dicionário e uma lista 174 | t[0].update({'chave': 'valor'}) # Alterando o primeiro elemento 175 | t[1].append(7) # Alterando o segundo elemento 176 | t # Exibindo a tupla 177 | 178 | .. code-block:: console 179 | 180 | ({'chave': 'valor'}, [7]) -------------------------------------------------------------------------------- /source/content/modules.rst: -------------------------------------------------------------------------------- 1 | Módulos 2 | ******* 3 | 4 | Módulos são as bibliotecas de Python. 5 | São simples arquivos de código Python (.py) e têm que estar dentro do PYTHONPATH. 6 | 7 | > import sys 8 | 9 | > dir(sys) 10 | ['__displayhook__', '__doc__', '__excepthook__', '__interactivehook__', '__loader__', '__name__', '__package__', '__spe 11 | c__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe' 12 | , '_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv', 'base_exec_prefix', 'base_prefix', 'builtin_mo 13 | dule_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info', ' 14 | excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'getallocatedblocks', 'get 15 | checkinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'ge 16 | trefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info', 'int 17 | ern', 'last_traceback', 'last_type', 'last_value', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks 18 | ', 'path_importer_cache', 'platform', 'prefix', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit' 19 | , 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', 'thread_info', 'version', 'version_info', 'warnoptions' 20 | ] 21 | 22 | > print(sys.path) 23 | 24 | ['', '/usr/bin', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages'] 25 | 26 | 27 | A primeira incidência é uma string vazia (''), o que significa ser o diretório corrente. 28 | 29 | $ vim foo.py 30 | 31 | # _*_ encoding: utf-8 _*_ 32 | 33 | print('Este arquivo, {} é um módulo!'.format(__file__)) 34 | print('Seu nome é {}.'.format(__name__)) 35 | 36 | 37 | > import foo 38 | Este arquivo, /tmp/foo.py é um módulo! 39 | Seu nome é foo. 40 | 41 | 42 | $ python3 foo.py 43 | .. code-block:: console 44 | 45 | Este arquivo, foo.py é um módulo! 46 | Seu nome é __main__. 47 | 48 | 49 | $ vim foo.py 50 | 51 | # _*_ encoding: utf-8 _*_ 52 | 53 | if __name__ == '__main__': 54 | print('Executado a partir da linha de comando.') 55 | else: 56 | print('Módulo importado.') 57 | 58 | > import foo 59 | Módulo importado. 60 | 61 | > type(foo) 62 | 63 | 64 | $ python3 foo.py 65 | Executado a partir da linha de comando. 66 | 67 | Recarregando um Módulo 68 | 69 | > import importlib 70 | > importlib.reload(foo) 71 | .. code-block:: console 72 | 73 | Módulo importado. 74 | 75 | 76 | 77 | $ vim foo.py 78 | 79 | # _*_ encoding: utf-8 _*_ 80 | 81 | class Pessoa(object): 82 | nome = '' 83 | idade = 0 84 | 85 | def saudacao(self): 86 | print('Olá, meu nome é {}'.format(self.nome)) 87 | 88 | class Funcionario(Pessoa): 89 | matricula = '' 90 | 91 | def cubo(x): 92 | return x ** 3 93 | 94 | 95 | Recarregando um módulo 96 | 97 | > importlib.reload(foo) 98 | 99 | .. code-block:: console 100 | 101 | 102 | 103 | > f1 = foo.Funcionario() 104 | > f1.nome = 'Chiquinho' 105 | > f1.saudacao() 106 | .. code-block:: console 107 | 108 | Olá, meu nome é Chiquinho 109 | 110 | > print(foo.cubo(7)) 111 | 112 | .. code-block:: console 113 | 114 | 343 115 | 116 | 117 | 118 | 119 | 120 | import as ... 121 | 122 | > import foo as meu_modulo 123 | > f1 = meu_modulo.Funcionario() 124 | > f1.matricula = 'xyz12345' 125 | > print(f1.matricula) 126 | .. code-block:: console 127 | 128 | xyz12345 129 | 130 | 131 | from módulo import ... 132 | 133 | .. code-block:: python 134 | 135 | from foo import Funcionario 136 | f1 = Funcionario() 137 | f1.nome = 'Chiquinho' 138 | f1.saudacao() 139 | 140 | .. code-block:: console 141 | 142 | Olá, meu nome é Chiquinho -------------------------------------------------------------------------------- /source/content/staticmethod_classmethod.rst: -------------------------------------------------------------------------------- 1 | Método de Classe e Método Estático 2 | ********************************** 3 | 4 | | Existem dois tipos de métodos que podem ser executados diretamente de uma 5 | | classe, ou seja, sem precisar criar um objeto dela. Por serem independentes 6 | | de objetos não esperam um "`self`" como primeiro parâmetro. 7 | | A utilidade desses métodos é para processamento de dados de classes em vez 8 | | de instâncias. 9 | | Mesmo que isso possa ser feito por uma função escrita externamente à classe, 10 | | não terá uma associação a essa classe e não poderão ser herdados por classes 11 | | filhas. 12 | | Métodos estáticos são usados para agrupar funções que têm conexão lógica com 13 | | a classe. 14 | | Métodos de classe são usados para o mesmo fim que os métodos estáticos, mas 15 | | que também podem processar dados da classe diretamente. 16 | 17 | 18 | 19 | Observe no exemplo a seguir as diferentes assinaturas para respectivamente os 20 | métodos comum, de classe e estático: 21 | 22 | .. code-block:: python 23 | 24 | class Foo(object): 25 | 26 | def metodo_comum(self): 27 | print(f'Método comum {self}') 28 | 29 | @classmethod 30 | def metodo_de_classe(cls): 31 | print(f'Método de classe {cls}') 32 | 33 | @staticmethod 34 | def metodo_estatico(): 35 | print('Método estático') 36 | 37 | 38 | | Na classe foram declarados três métodos, sendo que o primeiro que é um 39 | | método comum, cujo primeiro argumento é o tradicional self que representa a 40 | | instância (objeto) criada a partir da classe. 41 | | O segundo método é decorado com @classmethod, faz desse um método de 42 | | classe, o qual não faz necessária a criação de um objeto para ser 43 | | utilizado. 44 | | Esse tipo de método é invocado da seguinte forma: 45 | | 46 | | `Classe.metodo_de_classe().` 47 | | 48 | | Ainda sobre o método de classe um detalhe interessante é o "cls" em vez de 49 | | self. 50 | | A variável "cls" é utilizada com um propósito similar ao de self. No caso 51 | | representa a classe à qual o método pertence. 52 | | Como self, cls é apenas uma convenção, deixando ao gosto do usuário, se o 53 | | mesmo quiser utilizar outro nome. 54 | | E por fim o método estático, decorado com @staticmethod é como uma função 55 | | definida externamente à classe. Não recebe um "self" ou um "cls". 56 | 57 | 58 | 59 | Chamada do método comum pela classe: 60 | 61 | .. code-block:: python 62 | 63 | Foo.metodo_comum() 64 | 65 | .. code-block:: console 66 | 67 | TypeError: metodo_comum() missing 1 required positional argument: 'self' 68 | 69 | | Observa-se que se for feita uma tentativa de invocar a partir da classe um 70 | | método que não seja nem de classe e nem estático será retornado um erro. 71 | 72 | 73 | 74 | Invocando um método de classe a partir da classe: 75 | 76 | .. code-block:: python 77 | 78 | Foo.metodo_de_classe() 79 | 80 | .. code-block:: console 81 | 82 | Método de classe 83 | 84 | 85 | 86 | Invocando um método estático a partir da classe: 87 | 88 | .. code-block:: python 89 | 90 | Foo.metodo_estatico() 91 | 92 | .. code-block:: console 93 | 94 | Método estático 95 | 96 | 97 | 98 | Criação de objeto: 99 | 100 | .. code-block:: python 101 | 102 | o = Foo() 103 | 104 | | A instância "o" é implicitamente passada como argumento para o método 105 | | construtor que não foi declarado. 106 | 107 | 108 | 109 | Chamada do método comum pela instância: 110 | 111 | .. code-block:: python 112 | 113 | o.metodo_comum() 114 | 115 | 116 | .. code-block:: console 117 | 118 | Método comum <__main__.Foo object at 0x7f40d812d410> 119 | 120 | 121 | 122 | Chamada do método de classe pela instância: 123 | 124 | .. code-block:: python 125 | 126 | o.metodo_de_classe() 127 | 128 | .. code-block:: console 129 | 130 | Método de classe 131 | 132 | 133 | 134 | Chamada do método estático pela instância: 135 | 136 | .. code-block:: python 137 | 138 | o.metodo_estatico() 139 | 140 | .. code-block:: console 141 | 142 | Método estático -------------------------------------------------------------------------------- /source/content/recursive.rst: -------------------------------------------------------------------------------- 1 | Recursividade 2 | ************* 3 | 4 | De uma forma geral, recursividade é uma palavra cujo significado é a capacidade de um objeto fazer uma chamada a si mesmo em profundidade. 5 | Como exemplo podemos citar aqui um espelho de frente para outro. 6 | A palavra recursividade tem como origem o latim, do verbo "recurrere", cujo significado é algo como correr de volta. Essa característica de correr de volta é algo similar a um bumerangue, em que, obedecendo uma condição, ao chegar no fundo, esse "bumerangue" volta com o resultado desejado. 7 | Em linguagem de programação, recursividade é a capacidade de uma função fazer uma chamada a si mesma dentro de sua definição. Uma função recursiva precisa de uma condição de término para não rodar em um loop infinito, o que causaria efeitos indesejados. 8 | 9 | 10 | 11 | .. code-block:: python 12 | 13 | # _*_ coding: utf-8 _*_ 14 | 15 | # Fatoração 16 | 17 | def fatorial(n): 18 | if (n == 1) or (n == 0): 19 | return 1 20 | else: 21 | return n * fatorial(n - 1) 22 | 23 | 24 | Ida: 25 | 26 | n = 5 -> 5 * fatorial(4) 27 | 28 | n = 4 -> 4 * fatorial(3) 29 | 30 | n = 3 -> 3 * fatorial(2) 31 | 32 | n = 2 -> 2 * fatorial(1) 33 | 34 | 35 | Volta: 36 | 37 | fatorial(1) = 1 38 | 39 | fatorial(2) = 2 * 1 = 2 40 | 41 | fatorial(3) = 3 * 2 = 6 42 | 43 | fatorial(4) = 4 * 6 = 24 44 | 45 | fatorial(5) = 5 * 24 = 120 46 | 47 | 48 | 49 | print(fatorial(5)) 50 | 51 | 52 | # Fibonacci 53 | 54 | .. code-block:: python 55 | 56 | def fibo(n): 57 | if (n < 2): 58 | return n 59 | else: 60 | return fibo(n - 1) + fibo(n - 2) 61 | 62 | 63 | 64 | +--------------+---+---+---+---+---+---+---+----+----+----+----+-----+ 65 | | Fibonacci | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | ... | 66 | +--------------+---+---+---+---+---+---+---+----+----+----+----+-----+ 67 | | Elemento (n) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ... | 68 | +--------------+---+---+---+---+---+---+---+----+----+----+----+-----+ 69 | 70 | 71 | Ida: 72 | 73 | n = 7 -> fib(6) + fib(5) 74 | n = 6 -> fib(5) + fib(4) 75 | n = 5 -> fib(4) + fib(3) 76 | n = 4 -> fib(3) + fib(2) 77 | n = 3 -> fib(2) + fib(1) 78 | n = 2 -> fib(1) + fib(0) 79 | n = 1 -> fib(0) 80 | 81 | 82 | Volta: 83 | 84 | fib(0) = 0 85 | 86 | fib 87 | 88 | 89 | 90 | print(fib(7)) 91 | 92 | 93 | Memoização 94 | ---------- 95 | 96 | É uma técnica de otimização usada principalmente para acelerar aplicativos 97 | pelo armazenamento de resultados de chamadas de função que têm custo alto de 98 | processamento e retornando o resultado do cache quando as mesmas entradas 99 | acontecerem novamente. 100 | 101 | 102 | Para testarmos vamos criar o arquivo memoizacao.py com o seguinte conteúdo: 103 | 104 | .. code-block:: python 105 | 106 | #_*_ encoding: utf-8 _*_ 107 | 108 | import time 109 | 110 | ''' Fibonacci function ''' 111 | def fibo(n): 112 | if (n < 2): return n 113 | else: 114 | return fibo(n - 1) + fibo(n - 2) 115 | 116 | 117 | ''' Memoize function ''' 118 | def memoize(f): 119 | # dictionary (cache) 120 | mem = {} 121 | 122 | ''' Helper function ''' 123 | def memoizer(*param): 124 | key = repr(param) 125 | if not key in mem: 126 | mem[key] = f(*param) 127 | return mem[key] 128 | 129 | return memoizer 130 | 131 | # Start time 132 | t1 = time.time() 133 | 134 | # Loop 135 | for i in range(35): 136 | print('fib(%s) = %s' % (i, fibo(i))) 137 | 138 | # End time 139 | t2 = time.time() 140 | 141 | # Total time 142 | print('Tempo de execução: %.3fs' % (t2 - t1)) 143 | 144 | # Take a pause 145 | raw_input('Pressione para continuar\n') 146 | 147 | # Memoization of fibo 148 | fibo = memoize(fibo) 149 | 150 | # Start time 151 | t1 = time.time() 152 | 153 | # loop after memoization 154 | for i in range(40): 155 | print('fib(%s) = %s' % (i, fibo(i))) 156 | 157 | # End time 158 | t2 = time.time() 159 | 160 | # Total time 161 | print('Tempo de execução: %.3fs' % (t2 - t1)) 162 | 163 | 164 | 165 | Execute da seguinte forma: 166 | 167 | .. code-block:: bash 168 | 169 | python memoizacao.py 170 | 171 | 172 | 173 | Antes da memoização: 174 | 175 | Tempo de execução: 5.107s 176 | 177 | Depois da memoização: 178 | 179 | Tempo de execução: 0.001s 180 | 181 | Podemos ver na prática como é eficiente e como agiliza na execução. -------------------------------------------------------------------------------- /source/content/decimal_module.rst: -------------------------------------------------------------------------------- 1 | O Módulo decimal 2 | **************** 3 | 4 | O módulo decimal fornece suporte para aritmética de ponto flutuante decimal. 5 | Ele oferece muitas vantagens sobre o tipo float. 6 | O módulo decimal "é baseado em um modelo de ponto flutuante que foi projetado com pessoas em mente e necessariamente tem um princípio orientador fundamental - computadores devem fornecer uma aritmética que funciona da mesma maneira que a aritmética que as pessoas aprendem na escola" - extraindo da especificação da aritmética decimal. 7 | Números decimais podem ser representados exatamente. Em contraste, números como 1.1 e 2.2 não têm representações exatas em ponto flutuante binário. Usuários finais não esperam que 1.1 + 2.2 seja exibido como 3.3000000000000003 como é feito como o ponto flutuante binário. 8 | A exatidão leva à aritmética. Com ponto flutuante decimal, 0.1 + 0.1 + 0.1 - 0.3 é exatamente igual a zero. Com ponto flutuante binário, o resultado é 5.5511151231257827e-017. 9 | Enquanto próximo a zero, as diferenças evitam testes de igualdade confiáveis e diferenças podem acumular. Por essa razão, decimal é preferido em aplicações de contabilidade que tem invariações de igualdade rigorosas. 10 | O módulo decimal incorpora a noção de posições (casas decimais) significantes em que 1.30 + 1.20 é 2.50. O zero no fim é mantido para indicar a significância. Esta é a apresentação habitual para aplicações monetárias. Para multiplicação, a abordagem do "livro de escola" usa todos os números nos multiplicandos. Por exemplo, 1.3 * 1.2 dá 1.56 enquanto que 1.30 * 1.20 dá 1.5600. 11 | Ao contrário de hardware baseado em ponto flutuante binário, o módulo decimal tem uma precisão alterável (padrão 28 casas decimais). 12 | 13 | 14 | 15 | .. code-block:: python 16 | 17 | # Importação do módulo: 18 | import decimal 19 | 20 | # Criação do objeto Decimal: 21 | d = decimal.Decimal('0.777') 22 | 23 | # Exibindo o valor do objeto decimal: 24 | d 25 | 26 | .. code-block:: console 27 | 28 | Decimal('0.777') 29 | 30 | .. code-block:: python 31 | 32 | # Exibe o valor de "d": 33 | print(d) 34 | 35 | .. code-block:: console 36 | 37 | 0.777 38 | 39 | Algumas coisas "estranhas": 40 | 41 | .. code-block:: python 42 | 43 | # Somando dois floats: 44 | 1.1 + 2.2 45 | 46 | .. code-block:: console 47 | 48 | 3.3000000000000003 49 | 50 | .. code-block:: python 51 | 52 | # Outra operação com floats: 53 | 0.1 + 0.1 + 0.1 - 0.3 54 | 55 | .. code-block:: console 56 | 57 | 5.551115123125783e-17 58 | 59 | .. code-block:: python 60 | 61 | # Importando apenas a classe Decimal: 62 | from decimal import Decimal 63 | 64 | # Fazendo as mesmas operações anteriores com o módulo decimal: 65 | Decimal('1.1') + Decimal('2.2') 66 | 67 | .. code-block:: console 68 | 69 | Decimal('3.3') 70 | 71 | .. code-block:: python 72 | 73 | # Importando a função getcontext: 74 | from decimal import getcontext 75 | 76 | # Operações de multiplicação: 77 | Decimal('1.3') * Decimal('1.2') 78 | 79 | .. code-block:: console 80 | 81 | Decimal('1.56') 82 | 83 | .. code-block:: python 84 | 85 | # Multiplicação de decimais: 86 | Decimal('1.30') * Decimal('1.20') 87 | 88 | .. code-block:: console 89 | 90 | Decimal('1.5600') 91 | 92 | O último retorno foi com um número com 4 (quatro) casas decimais. 93 | 94 | A função getcontext, com o atributo "prec" (precision) ajusta a quantidade máxima de dígitos (antes e depois do ponto flutuante) para 3 (três): 95 | 96 | .. code-block:: python 97 | 98 | # Alterar o nível de precisão para 3: 99 | getcontext().prec = 3 100 | 101 | A precisão vai ser refletida em operações com o módulo decimal. 102 | Caso seja necessário o número será arredondado. 103 | 104 | .. code-block:: python 105 | 106 | # Operação de multiplicação de números com ponto flutuante 107 | Decimal('1.300') * Decimal('1.200') 108 | 109 | .. code-block:: console 110 | 111 | Decimal('1.56') 112 | 113 | .. code-block:: python 114 | 115 | # Ajustando a precisão para 10 (dez) 116 | getcontext().prec = 10 117 | 118 | # Multiplicação: 119 | Decimal('1.3897') * 2 120 | 121 | .. code-block:: console 122 | 123 | Decimal('2.7794') 124 | 125 | .. code-block:: python 126 | 127 | # Ajustando a precisão para 3 (três): 128 | getcontext().prec = 3 129 | 130 | # Multiplicação: 131 | Decimal('1.3897') * 2 132 | 133 | .. code-block:: console 134 | 135 | Decimal('2.78') 136 | 137 | Nota-se que foi feito um arredondamento do número. 138 | -------------------------------------------------------------------------------- /source/content/with.rst: -------------------------------------------------------------------------------- 1 | with 2 | **** 3 | 4 | | O comando with é usado para encapsular a execução de um bloco com métodos definidos por um gerenciador de contexto. 5 | 6 | 7 | 8 | Criação de um arquivo via shell do sistema operacional: 9 | 10 | .. code-block:: bash 11 | 12 | cat << EOF > /tmp/numbers.txt 13 | 1 14 | 2 15 | 3 16 | EOF 17 | 18 | 19 | 20 | Abrir o arquivo em modo leitura: 21 | 22 | .. code-block:: python 23 | 24 | f = open('/tmp/numbers.txt', 'r') 25 | 26 | # Loop: 27 | for line in f: 28 | print(int(line)) 29 | 30 | # Fecha o arquivo: 31 | f.close() 32 | 33 | .. code-block:: console 34 | 35 | 1 36 | 2 37 | 3 38 | 39 | 40 | 41 | O arquivo foi fechado?: 42 | 43 | .. code-block:: python 44 | 45 | print(f.closed) 46 | 47 | .. code-block:: console 48 | 49 | True 50 | 51 | 52 | 53 | Bla bla bla: 54 | 55 | .. code-block:: python 56 | 57 | f = open('/tmp/numbers_str.txt', 'r') 58 | for line in f: 59 | print(int(line)) 60 | f.close() 61 | print(f.closed) 62 | 63 | .. code-block:: console 64 | 65 | 1 66 | 2 67 | 68 | ValueError: invalid literal for int() with base 10: 'three\n' 69 | 70 | 71 | 72 | Bla bla bla: 73 | 74 | .. code-block:: python 75 | 76 | # 77 | f.closed 78 | 79 | .. code-block:: console 80 | 81 | False 82 | 83 | 84 | 85 | Bla bla bla: 86 | 87 | .. code-block:: python 88 | 89 | # 90 | f.close() 91 | f.closed 92 | 93 | .. code-block:: console 94 | 95 | True 96 | 97 | 98 | 99 | Bla bla bla: 100 | 101 | .. code-block:: python 102 | 103 | try: 104 | f = open('/tmp/numbers_str.txt', 'r') 105 | for line in f: 106 | print(int(line)) 107 | except ValueError: 108 | print('Ops... Isso não é um número em forma de dígitos...') 109 | finally: 110 | f.close() 111 | print(f.closed) 112 | 113 | .. code-block:: console 114 | 115 | 1 116 | 2 117 | Ops... Isso não é um número em forma de dígitos... 118 | True 119 | 120 | 121 | 122 | Bla bla bla: 123 | 124 | .. code-block:: python 125 | 126 | with open('/tmp/numbers.txt', 'r') as f: 127 | for line in f: 128 | print(int(line)) 129 | print(f.closed) 130 | 131 | .. code-block:: console 132 | 133 | 1 134 | 2 135 | 3 136 | True 137 | 138 | 139 | 140 | Bla bla bla: 141 | 142 | .. code-block:: python 143 | 144 | try: 145 | with open('/tmp/numbers_str.txt', 'r') as f: 146 | for line in f: 147 | print(int(line)) 148 | except ValueError: 149 | print('Ops... Isso não é um número em forma de dígitos...') 150 | finally: 151 | print(f.closed) 152 | 153 | .. code-block:: console 154 | 155 | 1 156 | 2 157 | Ops... Isso não é um número em forma de dígitos... 158 | True 159 | 160 | 161 | 162 | Exemplo de with com conexão a uma base de dados PostgreSQL: 163 | 164 | .. code-block:: python 165 | 166 | from psycopg2 import connect as pg_conn 167 | 168 | # Parâmetros de conexão 169 | PGHOST = 'localhost' 170 | PGDB = 'postgres' 171 | PGPORT = 5432 172 | PGUSER = 'postgres' 173 | PGPASS = '123' 174 | APPLICATION_NAME = 'python' 175 | 176 | # String de conexão 177 | CONN = f''' 178 | host={PGHOST} 179 | dbname={PGDB} 180 | port={PGPORT} 181 | user={PGUSER} 182 | password={PGPASS} 183 | application_name={APPLICATION_NAME} 184 | ''' 185 | 186 | # String SQL 187 | SQL = "SELECT 'Hello, World!';" 188 | 189 | # Criação de uma classe para conexão ao banco com with. 190 | # Através dela se conecta à base, executa comando(s) SQL e fecha a conexão 191 | # ao banco. 192 | 193 | class PgConnection(object): 194 | 195 | def __init__(self, conn, sql): 196 | self.conn = conn 197 | self.sql = sql 198 | 199 | def __enter__(self): 200 | print('===== __enter__ =====\n') 201 | self.conn = pg_conn(self.conn) 202 | cursor = self.conn.cursor() 203 | cursor.execute(self.sql) 204 | self.data = cursor.fetchone() 205 | return self.data 206 | 207 | def __exit__(self, type, value, traceback): 208 | print('\n===== __exit__ =====') 209 | self.conn.close() 210 | return 0 211 | 212 | 213 | with PgConnection(CONN, SQL) as x: 214 | print(x[0]) 215 | 216 | 217 | .. code-block:: console 218 | 219 | ===== __enter__ ===== 220 | 221 | Hello, World! 222 | 223 | ===== __exit__ ===== -------------------------------------------------------------------------------- /source/content/if.rst: -------------------------------------------------------------------------------- 1 | if / elif / else 2 | **************** 3 | 4 | O comando if, que inglês significa "se" indica uma condição. 5 | 6 | 7 | 8 | Criação de dois objetos int: 9 | 10 | .. code-block:: python 11 | 12 | x = 7 13 | y = 5 14 | 15 | 16 | 17 | Bloco if teste se x é maior que y: 18 | 19 | .. code-block:: python 20 | 21 | if x > y: 22 | print('X é maior') 23 | 24 | .. code-block:: console 25 | 26 | X é maior 27 | 28 | 29 | 30 | Bloco if teste se x é menor que y: 31 | 32 | .. code-block:: python 33 | 34 | if x < y: 35 | print('Y é maior') 36 | 37 | | Aqui nada aconteceu, pois a condição de if não foi satisfeita. 38 | 39 | 40 | 41 | Criação de duas variáveis booleanas: 42 | 43 | .. code-block:: python 44 | 45 | foo = True 46 | bar = False 47 | 48 | 49 | 50 | Modo "pythônico" de se testar um valor booleano: 51 | 52 | .. code-block:: python 53 | 54 | if foo: 55 | print('foo é verdadeiro!') 56 | 57 | .. code-block:: console 58 | 59 | foo é verdadeiro! 60 | 61 | | Note que não foi testado `foo == False`, utilizou-se uma maneira muito mais elegante. 62 | 63 | 64 | 65 | Testando uma Variável booleana com negação: 66 | 67 | .. code-block:: python 68 | 69 | if not bar: 70 | print('bar é falso!') 71 | 72 | .. code-block:: console 73 | 74 | bar é falso! 75 | 76 | 77 | 78 | Podemos também de maneira parecida, se a variável tiver um conteúdo: 79 | 80 | .. code-block:: python 81 | 82 | # Objeto string: 83 | texto = 'Python e PostgreSQL: Poder!' 84 | 85 | # Bloco if: 86 | if texto: 87 | print('A string NÃO é vazia!') 88 | 89 | 90 | .. code-block:: console 91 | 92 | A string NÃO é vazia! 93 | 94 | 95 | 96 | Teste de negação com string vazia: 97 | 98 | .. code-block:: python 99 | 100 | # String vazia: 101 | texto = '' 102 | 103 | # Bloco if: 104 | if not texto: 105 | print('A string é vazia!') 106 | 107 | .. code-block:: console 108 | 109 | A string é vazia! 110 | 111 | 112 | 113 | Boco if com else: 114 | 115 | .. code-block:: python 116 | 117 | # Objetos int: 118 | x = 1 119 | y = 2 120 | 121 | # Bloco if: 122 | if x > y: 123 | print('X é maior') 124 | else: 125 | print('Y é maior') 126 | 127 | .. code-block:: python 128 | 129 | Y é maior 130 | 131 | 132 | 133 | Bloco if com elif: 134 | 135 | .. code-block:: python 136 | 137 | # Objetos int: 138 | y = 1 139 | x = 1 140 | 141 | # Bloco if: 142 | if x > y: 143 | print('X é maior') 144 | elif x < y: 145 | print('Y é maior') 146 | else: 147 | print('Valores iguais') 148 | 149 | .. code-block:: console 150 | 151 | Valores iguais 152 | 153 | 154 | 155 | O valor de y depende de x: 156 | 157 | .. code-block:: python 158 | 159 | # Objeto int: 160 | x = 10 161 | 162 | # Bloco if: 163 | if (x > 5): 164 | y = 3 165 | else: 166 | y = 0 167 | 168 | # Exibe o resultado 169 | print(y) 170 | 171 | .. code-block:: console 172 | 173 | 3 174 | 175 | 176 | 177 | Operador Ternário 178 | ~~~~~~~~~~~~~~~~~ 179 | 180 | | Um recurso bastante interessante em outras linguagens como em C, por exemplo. 181 | | Seu objetivo é abreviar um bloco if em apenas uma linha. 182 | 183 | **Sintaxe**: 184 | 185 | | `retorno_se_verdadeiro if condição else retorno_se_falso` 186 | 187 | 188 | 189 | 190 | Declaração de uma variável x com valor, atribui a y o resultado e exibe seu valor: 191 | 192 | .. code-block:: python 193 | 194 | x = 10 # Variável int 195 | 196 | # Atribuição de valor condicional: 197 | y = (50 if (x > 5) else 40) 198 | 199 | # Exibe o valor de "y": 200 | print(y) 201 | 202 | .. code-block:: console 203 | 204 | 50 205 | 206 | 207 | 208 | Variável float para receber a nota: 209 | 210 | .. code-block:: python 211 | 212 | nota = float(input('Digite a nota do aluno: ')) 213 | 214 | .. code-block:: console 215 | 216 | Digite a nota do aluno: 8 217 | 218 | 219 | 220 | Atribuição condicional: 221 | 222 | .. code-block:: python 223 | 224 | estado = 'aprovado' if nota >= 7 else 'reprovado' 225 | 226 | 227 | 228 | Exibe a mensagem: 229 | 230 | .. code-block:: python 231 | 232 | print(f'Aluno {estado}!') 233 | 234 | .. code-block:: console 235 | 236 | Aluno aprovado! 237 | 238 | 239 | 240 | Variável int: 241 | 242 | .. code-block:: python 243 | 244 | num = int(input('Digite um número: ')) 245 | 246 | .. code-block:: console 247 | 248 | Digite um número: -2 249 | 250 | 251 | 252 | Atribuição condicional: 253 | 254 | .. code-block:: python 255 | 256 | sinal = 'positivo' if num > 0 else 'negativo' if num < 0 else 'zero' 257 | 258 | 259 | 260 | Exibe mensagem: 261 | 262 | .. code-block:: python 263 | 264 | print(f'O número é {sinal}' 265 | 266 | .. code-block:: console 267 | 268 | O número é negativo -------------------------------------------------------------------------------- /txt/test/teste_unitario.txt: -------------------------------------------------------------------------------- 1 | import unittest 2 | 3 | def soma(x, y): 4 | return x + y 5 | 6 | 7 | def subtracao(x, y): 8 | return x - y 9 | 10 | 11 | class TesteUnitario(unittest.TestCase): 12 | def teste_soma(self): 13 | self.assertEqual(7, soma(5, 2)) 14 | 15 | unittest.main() 16 | 17 | 18 | . 19 | ---------------------------------------------------------------------- 20 | Ran 1 test in 0.000s 21 | 22 | OK 23 | 24 | 25 | class TesteUnitario(unittest.TestCase): 26 | def teste_soma(self): 27 | self.assertEqual(9, soma(5, 2)) 28 | 29 | 30 | 31 | F 32 | ====================================================================== 33 | FAIL: teste_soma (__main__.TesteUnitario) 34 | ---------------------------------------------------------------------- 35 | Traceback (most recent call last): 36 | File "teste.py", line 13, in teste_soma 37 | self.assertEqual(9, soma(5, 2)) 38 | AssertionError: 9 != 7 39 | 40 | ---------------------------------------------------------------------- 41 | Ran 1 test in 0.000s 42 | 43 | FAILED (failures=1) 44 | 45 | class TesteUnitario(unittest.TestCase): 46 | def teste_soma(self): 47 | self.assertEqual(9, soma(5, 2)) 48 | 49 | def teste_subtracao(self): 50 | self.asserrtEqual(10, subtracao(2, 1)) 51 | 52 | FF 53 | ====================================================================== 54 | FAIL: teste_soma (__main__.TesteUnitario) 55 | ---------------------------------------------------------------------- 56 | Traceback (most recent call last): 57 | File "teste.py", line 13, in teste_soma 58 | self.assertEqual(9, soma(5, 2)) 59 | AssertionError: 9 != 7 60 | 61 | ====================================================================== 62 | FAIL: teste_subtracao (__main__.TesteUnitario) 63 | ---------------------------------------------------------------------- 64 | Traceback (most recent call last): 65 | File "teste.py", line 16, in teste_subtracao 66 | self.assertEqual(10, subtracao(2, 1)) 67 | AssertionError: 10 != 1 68 | 69 | ---------------------------------------------------------------------- 70 | Ran 2 tests in 0.000s 71 | 72 | FAILED (failures=2) 73 | 74 | 75 | 76 | 77 | class TesteUnitario(unittest.TestCase): 78 | def teste_soma(self): 79 | self.assertEqual(9, soma(5, 2)) 80 | 81 | def teste_subtracao(self): 82 | self.assertEqual(10, subtracao(2, 1)) 83 | 84 | def teste_potencia(self): 85 | self.assertEqual(21, 3 ** 3) 86 | 87 | 88 | 89 | FFF 90 | ====================================================================== 91 | FAIL: teste_potencia (__main__.TesteUnitario) 92 | ---------------------------------------------------------------------- 93 | Traceback (most recent call last): 94 | File "teste.py", line 19, in teste_potencia 95 | self.assertEqual(21, 3 ** 3) 96 | AssertionError: 21 != 27 97 | 98 | ====================================================================== 99 | FAIL: teste_soma (__main__.TesteUnitario) 100 | ---------------------------------------------------------------------- 101 | Traceback (most recent call last): 102 | File "teste.py", line 13, in teste_soma 103 | self.assertEqual(9, soma(5, 2)) 104 | AssertionError: 9 != 7 105 | 106 | ====================================================================== 107 | FAIL: teste_subtracao (__main__.TesteUnitario) 108 | ---------------------------------------------------------------------- 109 | Traceback (most recent call last): 110 | File "teste.py", line 16, in teste_subtracao 111 | self.assertEqual(10, subtracao(2, 1)) 112 | AssertionError: 10 != 1 113 | 114 | ---------------------------------------------------------------------- 115 | Ran 3 tests in 0.000s 116 | 117 | FAILED (failures=3) 118 | 119 | 120 | class TesteUnitario(unittest.TestCase): 121 | def teste_soma(self): 122 | self.assertEqual(9, soma(5, 2)) 123 | 124 | def teste_subtracao(self): 125 | self.assertEqual(10, subtracao(2, 1)) 126 | 127 | def teste_potencia(self): 128 | self.assertEqual(27, 3 ** 3) 129 | 130 | .FF 131 | ====================================================================== 132 | FAIL: teste_soma (__main__.TesteUnitario) 133 | ---------------------------------------------------------------------- 134 | Traceback (most recent call last): 135 | File "teste.py", line 13, in teste_soma 136 | self.assertEqual(9, soma(5, 2)) 137 | AssertionError: 9 != 7 138 | 139 | ====================================================================== 140 | FAIL: teste_subtracao (__main__.TesteUnitario) 141 | ---------------------------------------------------------------------- 142 | Traceback (most recent call last): 143 | File "teste.py", line 16, in teste_subtracao 144 | self.assertEqual(10, subtracao(2, 1)) 145 | AssertionError: 10 != 1 146 | 147 | ---------------------------------------------------------------------- 148 | Ran 3 tests in 0.000s 149 | 150 | FAILED (failures=2) 151 | 152 | class TesteUnitario(unittest.TestCase): 153 | def teste_soma(self): 154 | self.assertEqual(7, soma(5, 2)) 155 | 156 | def teste_subtracao(self): 157 | self.assertEqual(1, subtracao(2, 1)) 158 | 159 | def teste_potencia(self): 160 | self.assertEqual(27, 3 ** 3) 161 | 162 | ... 163 | ---------------------------------------------------------------------- 164 | Ran 3 tests in 0.000s 165 | 166 | OK 167 | -------------------------------------------------------------------------------- /source/content/about.rst: -------------------------------------------------------------------------------- 1 | Sobre Python 2 | ************ 3 | 4 | O que é Python 5 | -------------- 6 | 7 | Python é uma linguagem de programação criada pelo holandês Guido van Rossum no começo dos anos 90 na Stichting Mathematisch Centrum (http://www.cwi.nl/), na Holanda, com o objetivo de ser uma sucessora de uma linguagem chamada ABC. 8 | O nome linguagem foi inspirado na série humorística Monty Python's Flying Circus, do grupo humorístico britânico Monty Python. 9 | É muito atrativa para desenvolvimento ágil de aplicações. 10 | 11 | Site oficial: www.python.org 12 | Site da comunidade brasileira: www.python.org.br 13 | 14 | Características 15 | ~~~~~~~~~~~~~~~ 16 | 17 | - Linguagem de altíssimo nível; 18 | - Fácil de aprender; 19 | - Simples; 20 | - Objetiva; 21 | - Preza pela legibilidade; 22 | - Case sensitive; 23 | - Mutiparadigma: orientada a objeto e procedural; 24 | - Interpretada; 25 | - Compilada (transparente ao usuário); 26 | - Tipagem forte; 27 | - Tipagem dinâmica; 28 | - Suporte a módulos e packages encorajando modularidade e reúso de código; 29 | - Multiplataforma (Linux, MacOS, BSDs, Windows e outros); 30 | - Não suporte sobrecarga de funções; 31 | - Blocos delimitados por endentação (ou espaços ou tabs: não misturar!); 32 | - Um comando por linha (podem ser colocados mais que um após um ";", mas não é uma saída elegante); 33 | - Possui modo interativo; 34 | - Software Livre. 35 | 36 | Licença 37 | ~~~~~~~ 38 | 39 | Python utiliza uma licença similar à licença BSD, a PSF License (Python Software Foundation License). 40 | É um tipo de licença muito permissiva e compatível com a licença GPL. 41 | É tão permissiva que permite ao usuário escolher em manter ou não o código-fonte aberto. 42 | Mesmo empresas que pegam o código-fonte de um projeto sob essa licença, quando o fecham e derivam então gerando um software proprietário, acabam colaborando com o projeto original firmando assim uma parceria em que ambos saem ganhando. 43 | É o mesmo tipo de licença adotado por outros projetos de software livre como: PostgreSQL, FreeBSD, OpenBSD, NetBSD. 44 | 45 | O Interpretador Python 46 | ---------------------- 47 | Como o próprio nome diz, é o interpretador que faz a análise sintática e executa as instruções Python. 48 | 49 | Modo Interativo do Interpretador Python 50 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 51 | 52 | O modo interativo de Python é um recurso interessante que facilita o trabalho do desenvolvedor de forma que se possa testar algo que esteja fazendo assim que o comando é finalizado. 53 | É um recurso muito útil para debugging, quick hacking e testes. 54 | 55 | Invocando o Modo Interativo do Interpretador 56 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | 58 | A maioria das distribuições Linux tem já o Python instalado, de forma que para ter acesso ao prompt interativo bastar digitar no terminal o comando python. 59 | Para sair do interpretador basta digitar o caractere de fim de arquivo (EOF - End-Of-File) ( em Unix ou no Windows). Também pode-se usar as funções exit() ou quit(). 60 | 61 | A Filosofia de Python 62 | --------------------- 63 | 64 | Há um easter egg em Python bem divertido que exprime bem a filosofia de Python, que é conhecido como The Zen Of Python. 65 | The Zen Of Python é a PEP 20, PEP que significa Python Enhancement Proposals (Propostas de Melhoria para Python). 66 | Para visualizar esse easter egg basta que no shell interativo dê o seguinte comando: 67 | 68 | .. code-block:: python 69 | 70 | import this 71 | 72 | .. code-block:: console 73 | 74 | The Zen of Python, by Tim Peters 75 | 76 | Beautiful is better than ugly. 77 | Explicit is better than implicit. 78 | Simple is better than complex. 79 | Complex is better than complicated. 80 | Flat is better than nested. 81 | Sparse is better than dense. 82 | Readability counts. 83 | Special cases aren't special enough to break the rules. 84 | Although practicality beats purity. 85 | Errors should never pass silently. 86 | Unless explicitly silenced. 87 | In the face of ambiguity, refuse the temptation to guess. 88 | There should be one-- and preferably only one --obvious way to do it. 89 | Although that way may not be obvious at first unless you're Dutch. 90 | Now is better than never. 91 | Although never is often better than *right* now. 92 | If the implementation is hard to explain, it's a bad idea. 93 | If the implementation is easy to explain, it may be a good idea. 94 | Namespaces are one honking great idea -- let's do more of those! 95 | 96 | Tradução: 97 | 98 | .. code-block:: console 99 | 100 | 101 | O Zen de Python, por Tim Peters 102 | 103 | Bonito é melhor do que feio. 104 | Explícito é melhor do que implícito. 105 | Simples é melhor do que complexo. 106 | Complexo é melhor do que complicado. 107 | Plano é melhor do que aninhado. 108 | Disperso é melhor do que denso. 109 | Legibilidade conta. 110 | Casos especiais não são especiais o bastante para quebrar as regras. 111 | Embora a praticidade vença a pureza. 112 | Erros não devem passar silenciosamente. 113 | A não ser que sejam explicitamente silenciados. 114 | Diante a ambigüidade, recuse a tentação de adivinhar. 115 | Deve haver um-- e preferencialmente apenas um --modo óbvio de fazer isso. 116 | Embora a maneira não seja óbvia à primeira vista, a menos que seja holandês. 117 | Agora é melhor do que nunca. 118 | Embora nunca é muitas vezes melhor do que *agora* mesmo 119 | Se a implementação é difícil de explicar, é uma má idéia. 120 | Se a implementação é fácil de explicar, deve ser uma boa idéia. 121 | Namespaces são uma idéia fantástica – vamos fazer mais desses! -------------------------------------------------------------------------------- /source/content/loops.rst: -------------------------------------------------------------------------------- 1 | Loops - Laços de Repetição 2 | ************************** 3 | 4 | while 5 | ----- 6 | 7 | | Executa em laço (loop) **enquanto** a condição for verdadeira. 8 | 9 | 10 | 11 | Enquanto i for menor que 5, exiba i: 12 | 13 | .. code-block:: python 14 | 15 | i = 0 16 | 17 | while i < 5: 18 | print(i) 19 | i += 1 20 | 21 | .. code-block:: console 22 | 23 | 0 24 | 1 25 | 2 26 | 3 27 | 4 28 | 29 | 30 | 31 | O else no loop while 32 | ~~~~~~~~~~~~~~~~~~~~ 33 | 34 | | Opcionalmente, pode-se adicionar um else ao while em Python. 35 | | A idéia é que se caso o loop seja executado sem interrupção, um break, por exemplo, o que estiver dentro do bloco else será executado. 36 | 37 | 38 | 39 | Loop while com else sem interrupção: 40 | 41 | .. code-block:: python 42 | 43 | i = 0 44 | while i < 5: 45 | print(i) 46 | i += 1 47 | else: 48 | print('Fim') 49 | 50 | .. code-block:: console 51 | 52 | 0 53 | 1 54 | 2 55 | 3 56 | 4 57 | Fim 58 | 59 | 60 | 61 | Loop while com else com interrupção (break): 62 | 63 | .. code-block:: python 64 | 65 | i = 0 66 | 67 | while i <= 10: 68 | if i == 5: break 69 | print(i) 70 | i += 1 71 | else: 72 | print('Fim') 73 | 74 | .. code-block:: console 75 | 76 | 0 77 | 1 78 | 2 79 | 3 80 | 4 81 | 82 | 83 | 84 | Loop while com else e sem break: 85 | 86 | .. code-block:: python 87 | 88 | i = 0 89 | 90 | while i <= 10: 91 | if (i % 2 == 0): 92 | i += 1 93 | continue 94 | print(i) 95 | i += 1 96 | else: 97 | print('Fim') 98 | 99 | .. code-block:: console 100 | 101 | 1 102 | 3 103 | 5 104 | 7 105 | 9 106 | Fim 107 | 108 | 109 | 110 | Loop Infinito 111 | ~~~~~~~~~~~~~ 112 | 113 | | Em determinadas situações se faz necessário o uso de um loop sem fim. 114 | | Para que esse loop infinito seja rompido é preciso que uma ação externa ocorra, como uma interrupção com a combinação de teclas + C. 115 | 116 | 117 | 118 | Enquanto não houver uma interrupção externa, o loop abaixo exibirá "x" eternamente: 119 | 120 | .. code-block:: python 121 | 122 | while True: 123 | print('x') 124 | 125 | .. code-block:: console 126 | 127 | x 128 | x 129 | x 130 | . . . 131 | 132 | 133 | 134 | for 135 | ~~~ 136 | 137 | | O loop for interage sobre cada membro de um objeto iterável. 138 | 139 | 140 | 141 | Um simples loop for com a função range: 142 | 143 | .. code-block:: python 144 | 145 | for i in range(5): 146 | print(i) 147 | 148 | .. code-block:: console 149 | 150 | 0 151 | 1 152 | 2 153 | 3 154 | 4 155 | 156 | 157 | 158 | Loop sobre os elementos de uma tupla: 159 | 160 | .. code-block:: python 161 | 162 | lor = ('Gandalf', 'Bilbo', 'Frodo', 'Sauron', 'Aragorn', 'Legolas') 163 | 164 | for i in lor: 165 | print(i) 166 | 167 | .. code-block:: console 168 | 169 | Gandalf 170 | Bilbo 171 | Frodo 172 | Sauron 173 | Aragorn 174 | Legolas 175 | 176 | 177 | 178 | Loop sobr os elementos da tupla enumerados: 179 | 180 | .. code-block:: python 181 | 182 | for i, personagem in enumerate(lor): 183 | print(f'{i} - {personagem}') 184 | 185 | .. code-block:: console 186 | 187 | 0 - Gandalf 188 | 1 - Bilbo 189 | 2 - Frodo 190 | 3 - Sauron 191 | 4 - Aragorn 192 | 5 - Legolas 193 | 194 | 195 | 196 | Enumerando a tupla e convertendo-a para uma lista: 197 | 198 | .. code-block:: python 199 | 200 | list(enumerate(lor)) 201 | 202 | .. code-block:: console 203 | 204 | [(0, 'Gandalf'), (1, 'Bilbo'), (2, 'Frodo'), (3, 'Sauron'), (4, 'Aragorn'), (5, 'Legolas')] 205 | 206 | 207 | 208 | Lista cujos elementos são tuplas cujos elementos representam chave e valor, e por fim loop: 209 | 210 | .. code-block:: python 211 | 212 | dados = [('Nome', 'Chiquinho'), ('Sobrenome', 'da Silva'), ('Idade', 50)] 213 | 214 | for k, v in dados: 215 | print(f'{k}: {v}') 216 | 217 | .. code-block:: console 218 | 219 | Nome: Chiquinho 220 | Sobrenome: da Silva 221 | Idade: 50 222 | 223 | 224 | 225 | Criação de um dicionário: 226 | 227 | .. code-block:: python 228 | 229 | dados = { 230 | 'Nome': 'Chiquinho', 231 | 'Sobrenome': 'da Silva', 232 | 'Idade': 50 233 | } 234 | 235 | 236 | 237 | Loop sobre um dicionário: 238 | 239 | .. code-block:: python 240 | 241 | for k, v in dados.items(): 242 | print(f'{k}: {v}') 243 | 244 | .. code-block:: console 245 | 246 | Sobrenome: da Silva 247 | Idade: 50 248 | Nome: Chiquinho 249 | 250 | 251 | 252 | Loop for com else e sem interrupção: 253 | 254 | .. code-block:: python 255 | 256 | for i in range(5): 257 | print(i) 258 | else: 259 | print('Fim') 260 | 261 | .. code-block:: console 262 | 263 | 0 264 | 1 265 | 2 266 | 3 267 | 4 268 | Fim 269 | 270 | 271 | 272 | Loop for com else e com interrupção: 273 | 274 | .. code-block:: python 275 | 276 | for i in range(10): 277 | if i == 6: 278 | break 279 | print(i) 280 | else: 281 | print('Fim') 282 | 283 | .. code-block:: console 284 | 285 | 0 286 | 1 287 | 2 288 | 3 289 | 4 290 | 5 291 | 292 | 293 | 294 | Loop for com else e sem interrupção: 295 | 296 | .. code-block:: python 297 | 298 | for i in range(10): 299 | if i % 2 == 0: 300 | continue 301 | print(i) 302 | else: 303 | print('Fim') 304 | 305 | .. code-block:: console 306 | 307 | 1 308 | 3 309 | 5 310 | 7 311 | 9 312 | Fim -------------------------------------------------------------------------------- /source/content/date_time.rst: -------------------------------------------------------------------------------- 1 | Data e Hora 2 | *********** 3 | 4 | O Módulo datetime 5 | ----------------- 6 | 7 | Módulo que fornece classes para manipular datas e horas de maneiras simples e 8 | complexas. 9 | Enquanto data e hora são suportados aritmeticamente, o foco da implementação 10 | estã em uma extração eficiente de atributo para saída formatada e manipulação. 11 | 12 | 13 | 14 | .. code-block:: python 15 | 16 | # Imports: 17 | from datetime import date 18 | from datetime import datetime 19 | from sys import getsizeof 20 | 21 | 22 | .. code-block:: python 23 | 24 | # Inserir dados via teclado conforme sugere o modelo na mensagem: 25 | dt_evento = input('Digite a data e hora do evento (AAAA-MM-DD HH:MM): ') 26 | 27 | .. code-block:: console 28 | 29 | Digite a data e hora do evento (AAAA-MM-DD HH:MM): 30 | 31 | .. code-block:: python 32 | 33 | # Verificando o tipo da variável: 34 | type(dt_evento) 35 | 36 | .. code-block:: console 37 | 38 | str 39 | 40 | .. code-block:: python 41 | 42 | # Quanto custa essa variável em bytes?: 43 | getsizeof(dt_evento) 44 | 45 | .. code-block:: console 46 | 47 | 65 48 | 49 | 50 | | Strings não são adequadas para armazenar data e hora. 51 | | strptime transforma uma string para datetime conforme uma dada máscara: 52 | 53 | 54 | 55 | .. code-block:: python 56 | 57 | # Converter a string para datetime: 58 | datetime.strptime(dt_evento, '%Y-%m-%d %H:%M') 59 | 60 | .. code-block:: console 61 | 62 | datetime.datetime(2019, 12, 27, 19, 0) 63 | 64 | 65 | **strptime: str -> datetime** 66 | 67 | 68 | .. code-block:: python 69 | 70 | # O tamanho em bytes do dado em datetime: 71 | getsizeof(datetime.strptime(dt_evento, '%Y-%m-%d %H:%M')) 72 | 73 | .. code-block:: console 74 | 75 | 48 76 | 77 | A mesma informação armazenada como datetime ocupa menos espaço que string. 78 | 79 | .. code-block:: python 80 | 81 | # Recriar a variável como datetime utilizando seu valor antigo de string: 82 | dt_evento = datetime.strptime(dt_evento, '%Y-%m-%d %H:%M') 83 | 84 | # Verificando o tipo: 85 | type(dt_evento) 86 | 87 | .. code-block:: console 88 | 89 | datetime.datetime 90 | 91 | 92 | 93 | Pode ser necessário também fazer o caminho inverso, para transformar um dado datetime para string. 94 | 95 | Para isso pode-se usar strftime: 96 | 97 | .. code-block:: python 98 | 99 | # Extrair como string de um dado datetime: 100 | datetime.strftime(dt_evento, '%Y-%m-%d %H:%M') 101 | 102 | .. code-block:: console 103 | 104 | '2019-12-27 19:00' 105 | 106 | **strftime: datetime -> str** 107 | 108 | .. code-block:: python 109 | 110 | # Variável que contém apenas a data atual: 111 | hoje = date.today() 112 | 113 | # Exibindo o valor da variável: 114 | print(hoje) 115 | 116 | .. code-block:: console 117 | 118 | 2019-12-26 119 | 120 | Exibindo apenas partes da data: 121 | 122 | .. code-block:: python 123 | 124 | # dia: 125 | print(hoje.day) 126 | 127 | .. code-block:: console 128 | 129 | 26 130 | 131 | .. code-block:: python 132 | 133 | # mês: 134 | print(hoje.month) 135 | 136 | .. code-block:: console 137 | 138 | 12 139 | 140 | .. code-block:: python 141 | 142 | # ano: 143 | print(hoje.year) 144 | 145 | .. code-block:: console 146 | 147 | 2019 148 | 149 | .. code-block:: python 150 | 151 | # Formato ISO: 152 | hoje.isoformat() 153 | 154 | .. code-block:: console 155 | 156 | '2019-12-26' 157 | 158 | .. code-block:: python 159 | 160 | # Método toordinal; retorna a quantidade de dias 161 | # passados desde 01/01/0001: 162 | hoje.toordinal() 163 | 164 | .. code-block:: console 165 | 166 | 737419 167 | 168 | .. code-block:: python 169 | 170 | # Método fromordinal; retorna a data a partir da quantidade 171 | # de dias passados desde 01/01/0001: 172 | date.fromordinal(737419) 173 | 174 | .. code-block:: console 175 | 176 | datetime.date(2019, 12, 26) 177 | 178 | .. code-block:: python 179 | 180 | # Que dia será daqui a 40 dias?: 181 | date.fromordinal(hoje.toordinal() + 40) # formato datetime.date 182 | 183 | .. code-block:: console 184 | 185 | datetime.date(2020, 2, 4) 186 | 187 | .. code-block:: python 188 | 189 | # Formato ISO: 190 | date.fromordinal(hoje.toordinal() + 40).isoformat() 191 | 192 | .. code-block:: console 193 | 194 | '2020-02-04' 195 | 196 | .. code-block:: python 197 | 198 | # Método weekday (dia da semana), em que segunda-feira = 0 e domingo = 6: 199 | hoje.weekday() 200 | 201 | .. code-block:: console 202 | 203 | 3 204 | 205 | .. code-block:: python 206 | 207 | # Método isoweekday, em que segunda-feira = 1 e domingo = 7 208 | hoje.isoweekday() 209 | 210 | .. code-block:: console 211 | 212 | 4 213 | 214 | 215 | O Módulo time 216 | ------------- 217 | 218 | | Módulo cujos objetos representam uma hora (local) de dia, independente de 219 | | qualquer dia em particular, e sujeito a ajustes via um objeto tzinfo. 220 | | Fornece várias funções para manipular valores de hora. Não confundir com 221 | | a classe time do módulo datetime. 222 | 223 | .. code-block:: python 224 | 225 | # Imports: 226 | from time import ctime 227 | from time import sleep 228 | from time import time 229 | from time import tzname 230 | 231 | .. code-block:: python 232 | 233 | # Criação de função que espera n segundos e exibe uma mensagem no final: 234 | def espera(tempo): 235 | sleep(tempo) 236 | print(f'Passaram-se {tempo} segundos') 237 | 238 | .. code-block:: python 239 | 240 | # Execução da função: 241 | espera(3) 242 | 243 | .. code-block:: console 244 | 245 | Passaram-se 3 segundos 246 | 247 | .. code-block:: python 248 | 249 | # time.time retorna o tempo atual em segundos 250 | # desde Epoch (01/01/1970 00:00:00): 251 | time() 252 | 253 | .. code-block:: console 254 | 255 | 1577375404.8968937 256 | 257 | .. code-block:: python 258 | 259 | # Converte um tempo em segundos desde Epoch para uma string, 260 | # se nenhum parâmetro for passado retorna string do momento atual: 261 | ctime() 262 | 263 | .. code-block:: console 264 | 265 | 'Thu Dec 26 12:50:22 2019' 266 | 267 | .. code-block:: python 268 | 269 | ctime(1540000000) 270 | 271 | .. code-block:: console 272 | 273 | 'Fri Oct 19 22:46:40 2018' -------------------------------------------------------------------------------- /source/content/numeric_data_types.rst: -------------------------------------------------------------------------------- 1 | Tipos Numéricos - int, float e complex 2 | ************************************** 3 | 4 | int 5 | --- 6 | 7 | Para representação de todos números inteiros é o tipo int. 8 | A princípio utilizamos para números inteiros o tipo int. O número máximo de int que é aceito pode variar de uma máquina para outra. 9 | Para sabermos qual é o número máximo do tipo int fazemos: 10 | 11 | 12 | .. code-block:: python 13 | 14 | # Objeto inteiro: 15 | i = int(7) 16 | 17 | ou 18 | 19 | .. code-block:: python 20 | 21 | i = 7 22 | 23 | .. code-block:: python 24 | 25 | # Verificando seu valor: 26 | i 27 | 28 | .. code-block:: console 29 | 30 | 7 31 | 32 | .. code-block:: python 33 | 34 | # Verificando seu tipo: 35 | type(i) 36 | 37 | .. code-block:: console 38 | 39 | int 40 | 41 | .. code-block:: python 42 | 43 | # Tipo de "bar": 44 | type(bar) 45 | 46 | .. code-block:: console 47 | 48 | long 49 | 50 | .. code-block:: python 51 | 52 | # Representação hexadecimal de 178 53 | 0xb2 54 | 55 | .. code-block:: console 56 | 57 | 178 58 | 59 | .. code-block:: python 60 | 61 | # Representação octal de 8: 62 | 0o10 63 | 64 | .. code-block:: console 65 | 66 | 8 67 | 68 | .. code-block:: python 69 | 70 | # Representação binária de 14: 71 | 0b1110 72 | 73 | .. code-block:: console 74 | 75 | 14 76 | 77 | .. code-block:: python 78 | 79 | # Número 7 (sete) convertido para as bases 80 | # binária, hexadecimal e octal respectivamente: 81 | bin(7) 82 | 83 | .. code-block:: console 84 | 85 | '0b111' 86 | 87 | .. code-block:: python 88 | 89 | # Retorna a forma octal de 7: 90 | oct(7) 91 | 92 | .. code-block:: console 93 | 94 | '0o7' 95 | 96 | .. code-block:: python 97 | 98 | # Retorna a versão hexadecimal de 7: 99 | hex(7) 100 | 101 | .. code-block:: console 102 | 103 | '0x7' 104 | 105 | .. code-block:: python 106 | 107 | # Descobrir o decimal dada uma base: 108 | int('facada', base=16) 109 | 110 | .. code-block:: console 111 | 112 | 16435930 113 | 114 | .. code-block:: python 115 | 116 | # 25 octal em decimal é: 117 | int('25', base=8) 118 | 119 | .. code-block:: console 120 | 121 | 21 122 | 123 | .. code-block:: python 124 | 125 | # 1111 binário é em decimal: 126 | int('1111', base=2) 127 | 128 | .. code-block:: console 129 | 130 | 15 131 | 132 | 133 | float 134 | ----- 135 | 136 | Ponto flutuante; não tem precisão absoluta, sua precisão é relativa. 137 | Para uma maior precisão com números que tenham ponto flutuante, utilizar o módulo decimal. 138 | 139 | 140 | 141 | .. code-block:: python 142 | 143 | # Criação de um float: 144 | f = float(3) 145 | 146 | ou 147 | 148 | .. code-block:: python 149 | 150 | f = 3.0 151 | 152 | .. code-block:: python 153 | 154 | f # Veririca o valor 155 | 156 | .. code-block:: console 157 | 158 | 3.0 159 | 160 | Formas de se definir um float: 161 | 162 | .. code-block:: python 163 | 164 | x = 0.5000000000 165 | 166 | ou 167 | 168 | .. code-block:: python 169 | 170 | x = 0.5 171 | 172 | ou 173 | 174 | .. code-block:: python 175 | 176 | x = .5 177 | 178 | x # Exibe o valor 179 | 180 | .. code-block:: console 181 | 182 | 0.5 183 | 184 | .. code-block:: python 185 | 186 | type(x) # Tipo 187 | 188 | .. code-block:: console 189 | 190 | float 191 | 192 | .. code-block:: python 193 | 194 | x = 2. 195 | 196 | x # Verifica o valor 197 | 198 | .. code-block:: console 199 | 200 | 2.0 201 | 202 | .. code-block:: python 203 | 204 | # Que tipo resulta de da soma de um inteiro e um float?: 205 | type(7 + 3.0) 206 | 207 | .. code-block:: console 208 | 209 | float 210 | 211 | 212 | .. code-block:: python 213 | 214 | # Resultado: 215 | 7 + 3.0 216 | 217 | .. code-block:: console 218 | 219 | 10.0 220 | 221 | 222 | .. code-block:: python 223 | 224 | # Divisão: 225 | 3 / 2 226 | 227 | ou 228 | 229 | .. code-block:: python 230 | 231 | 3 / 2.0 232 | 233 | ou 234 | 235 | .. code-block:: python 236 | 237 | 3.0 / 2 238 | 239 | ou 240 | 241 | .. code-block:: python 242 | 243 | 3.0 / 2.0 244 | 245 | .. code-block:: console 246 | 247 | 1.5 248 | 249 | .. code-block:: python 250 | 251 | # Divisão Inteira: 252 | 3 // 2.0 253 | 254 | .. code-block:: console 255 | 256 | 1.0 257 | 258 | .. code-block:: python 259 | 260 | # Notação Científica: 261 | 1e+2 262 | 263 | .. code-block:: console 264 | 265 | 100.0 266 | 267 | .. code-block:: python 268 | 269 | # Notação científica com expoente negativo: 270 | 1e-3 271 | 272 | .. code-block:: console 273 | 274 | 0.001 275 | 276 | complex 277 | ------- 278 | 279 | É o tipo de dados em Python que trata de números complexos, que são muito utilizados em engenharia elétrica. 280 | 281 | .. code-block:: python 282 | 283 | # Número complexo somente com a parte real: 284 | c = complex(1) 285 | print(c) 286 | 287 | .. code-block:: console 288 | 289 | (1+0j) 290 | 291 | .. code-block:: python 292 | 293 | # Verificando seu valor e seu tipo: 294 | type(c) 295 | 296 | .. code-block:: console 297 | 298 | complex 299 | 300 | .. code-block:: python 301 | 302 | # Novo valor do número complexo com parte real e imaginária: 303 | c = complex(5, 3) 304 | 305 | .. code-block:: python 306 | 307 | c # Verificando o valor 308 | 309 | .. code-block:: console 310 | 311 | (5+3j) 312 | 313 | 314 | .. code-block:: python 315 | 316 | # Número complexo somente com a parte imaginária: 317 | c = complex(0, 3) 318 | 319 | .. code-block:: python 320 | 321 | c # Verificando seu valor 322 | 323 | .. code-block:: console 324 | 325 | 3j 326 | 327 | .. code-block:: python 328 | 329 | c.imag # Extraindo somente a parte imaginária 330 | 331 | .. code-block:: console 332 | 333 | 3.0 334 | 335 | .. code-block:: python 336 | 337 | c.real # Extraindo somente a parte real 338 | 339 | .. code-block:: console 340 | 341 | 0.0 342 | 343 | .. code-block:: python 344 | 345 | c + 1 # Somando o número com a parte real 346 | 347 | .. code-block:: console 348 | 349 | (1+3j) 350 | 351 | .. code-block:: python 352 | 353 | c + complex('7j') # Somando o número com a parte imaginária 354 | 355 | .. code-block:: console 356 | 357 | 10j 358 | 359 | .. code-block:: python 360 | 361 | c + complex(2, 17) # somando o número complexo com outro complexo 362 | 363 | .. code-block:: console 364 | 365 | (2+20j) 366 | -------------------------------------------------------------------------------- /source/content/decorators.rst: -------------------------------------------------------------------------------- 1 | Decoradores em Python 2 | ********************* 3 | 4 | É um conceito diferente do conceito decorator de design pattern. 5 | Pode ser implementado como uma classe ou como uma função. 6 | Modificam funções. 7 | É identificado da seguinte forma: @nome_do_decorador. 8 | Deve ser inserido na linha anterior da definição. 9 | Um decorador deve ser executável, ou seja, deve ter o método __call__(). 10 | São envelopes de função. 11 | Decoradores podem ser definidos como classes ou funções. 12 | 13 | Decoradores de Funções 14 | ---------------------- 15 | 16 | Classe como decorador: 17 | 18 | .. code-block:: python 19 | 20 | class Decorador(object): 21 | 22 | def __init__(self, funcao): 23 | ''' 24 | O parâmetro "funcao" é a função que será decorada. 25 | ''' 26 | 27 | print('Método __init__() do decorador') # Mensagem ao instanciar 28 | funcao() # Executa a função ao instanciar 29 | 30 | def __call__(self): 31 | print('Método __call__() do decorador') 32 | 33 | 34 | 35 | Definição da classe com decorador: 36 | 37 | .. code-block:: python 38 | 39 | @Decorador 40 | def funcao_decorada(): 41 | print('Dentro da função decorada') 42 | 43 | 44 | .. code-block:: console 45 | 46 | Método __init__() do decorador 47 | Dentro da função decorada 48 | 49 | O método construtor do decorador é invocado logo após da definição da função 50 | decorada. 51 | No exemplo, a própria função, que é usada como parâmetro, é invocada pelo 52 | método construtor __init__(). 53 | 54 | 55 | 56 | Execução da função decorada: 57 | 58 | .. code-block:: python 59 | 60 | funcao_decorada() 61 | 62 | .. code-block:: console 63 | 64 | Método __call__() do decorador 65 | 66 | 67 | 68 | Recriação da classe decoradora: 69 | 70 | .. code-block:: python 71 | 72 | class Decorador(object): 73 | def __init__(self, funcao): 74 | print('Método __init__() do decorador') 75 | self.funcao = funcao 76 | 77 | def __call__(self): 78 | print('Método __call__() do decorador') 79 | self.funcao() 80 | 81 | Diferente da criação da classe anteriormente, aqui a função não é chamada 82 | no método construtor, mas sim no método __call__. 83 | 84 | 85 | 86 | Definição da função decorada: 87 | 88 | .. code-block:: python 89 | 90 | @Decorador 91 | def funcao_decorada(): 92 | print('Dentro da função') 93 | 94 | .. code-block:: console 95 | 96 | Método __init__() do decorador 97 | 98 | 99 | 100 | Execução da função decorada: 101 | 102 | .. code-block:: python 103 | 104 | funcao_decorada() 105 | 106 | .. code-block:: console 107 | 108 | Método __call__() do decorador 109 | Dentro da função 110 | 111 | 112 | 113 | Decorador com Argumentos 114 | ------------------------ 115 | 116 | Para funções decoradas que têm argumentos. 117 | 118 | 119 | 120 | Criação da classe decoradora: 121 | 122 | .. code-block:: python 123 | 124 | class Decorador(): 125 | 126 | def __init__(self, f): 127 | print('Método __init__() do decorador') 128 | self.f = f 129 | 130 | def __call__(self, *args, **kargs): 131 | print('Método __call__() do decorador') 132 | return self.f(*args, **kargs) 133 | 134 | 135 | 136 | Definição da classe decorada: 137 | 138 | .. code-block:: python 139 | 140 | @Decorador 141 | def soma(x, y): 142 | return x + y 143 | 144 | 145 | 146 | Execução da classe decorada: 147 | 148 | .. code-block:: python 149 | 150 | print(soma(2, 5)) 151 | 152 | .. code-block:: console 153 | 154 | Método __call__() do decorador 155 | 7 156 | 157 | 158 | 159 | Função como Decorador 160 | --------------------- 161 | 162 | Até então foram vistos exemplos de decoradores definidos como classes, agora serão vistos os definidos como função. 163 | 164 | 165 | 166 | Criação da função decoradora, o decorador em si: 167 | 168 | .. code-block:: python 169 | 170 | def funcao_decoradora(funcao): 171 | 172 | # Função auxiliar 173 | def funcao_auxiliar(): 174 | print('Antes da função decorada') 175 | funcao() 176 | print('Depois da função decorada') 177 | 178 | return funcao_auxiliar 179 | 180 | 181 | 182 | Definição da função decorada: 183 | 184 | .. code-block:: python 185 | 186 | @funcao_decoradora 187 | def foo(): 188 | print('Função decorada') 189 | 190 | 191 | 192 | Execução da função decorada: 193 | 194 | .. code-block:: python 195 | 196 | foo() 197 | 198 | .. code-block:: console 199 | 200 | Antes da função decorada 201 | Função decorada 202 | Depois da função decorada 203 | 204 | 205 | 206 | Podemos também aplicar mais de um decorador a uma função: 207 | 208 | .. code-block:: python 209 | 210 | # Função para itálico em HTML 211 | def to_italic(funcao): 212 | def funcao_auxiliadora(*args, **kargs): 213 | return '' + funcao(*args, **kargs) + '' 214 | return funcao_auxiliadora 215 | 216 | # Função para negrito em HTML 217 | def to_bold(funcao): 218 | def funcao_auxiliadora(*args, **kargs): 219 | return '' + funcao(*args, **kargs) + '' 220 | return funcao_auxiliadora 221 | 222 | 223 | 224 | Definição da função decorada com dois decoradores: 225 | 226 | .. code-block:: python 227 | 228 | @to_italic 229 | @to_bold 230 | def fc_msg(msg): 231 | return msg 232 | 233 | 234 | 235 | Execução da função decorada: 236 | 237 | .. code-block:: python 238 | 239 | fc_msg('Hello, World!') 240 | 241 | .. code-block:: console 242 | 243 | 'Hello, World!' 244 | 245 | 246 | Memoização 247 | ---------- 248 | 249 | Texto... 250 | 251 | 252 | 253 | Criação do decorador de memoização: 254 | 255 | .. code-block:: python 256 | 257 | def memoize(f): 258 | ''' 259 | Memoize function (as decorator) 260 | ''' 261 | 262 | # dictionary (cache) 263 | mem = {} 264 | 265 | ''' Helper function ''' 266 | def memoizer(*param): 267 | key = repr(param) 268 | if not key in mem: 269 | mem[key] = f(*param) 270 | return mem[key] 271 | return memoizer 272 | 273 | 274 | 275 | Criação da função decorada com memoização aplicada para Fibonacci: 276 | 277 | .. code-block:: python 278 | 279 | @memoize 280 | def fibo(n): 281 | if (n < 2): return n 282 | else: 283 | return fibo(n - 1) + fibo(n - 2) 284 | 285 | 286 | 287 | Execução da função decorada: 288 | 289 | .. code-block:: python 290 | 291 | fibo(39) 292 | 293 | .. code-block:: console 294 | 295 | 63245986 -------------------------------------------------------------------------------- /source/content/iter_gen.rst: -------------------------------------------------------------------------------- 1 | Iteratoradores e Geradores 2 | ************************** 3 | 4 | Iterator 5 | -------- 6 | 7 | 8 | Um iterator (iterador) permite acessar elementos de uma coleção / sequência, retornando cada elemento sequencialmente. 9 | Todo objeto que tiver o método __next__() é um iterator. 10 | 11 | 12 | 13 | Criação de um iterator com uma string: 14 | 15 | .. code-block:: python 16 | 17 | it = iter('bar') 18 | 19 | 20 | 21 | Representação: 22 | 23 | .. code-block:: python 24 | 25 | repr(it) 26 | 27 | .. code-block:: console 28 | 29 | '' 30 | 31 | 32 | 33 | Executando o método __next__ até seu fim: 34 | 35 | .. code-block:: python 36 | 37 | it.__next__() 38 | 39 | .. code-block:: console 40 | 41 | 'b' 42 | 43 | .. code-block:: python 44 | 45 | it.__next__() 46 | 47 | .. code-block:: console 48 | 49 | 'a' 50 | 51 | .. code-block:: python 52 | 53 | it.__next__() 54 | 55 | .. code-block:: console 56 | 57 | 'r' 58 | 59 | .. code-block:: python 60 | 61 | it.__next__() 62 | 63 | .. code-block:: console 64 | 65 | StopIteration: 66 | 67 | Bla bla bla 68 | 69 | | Nota-se que a iteração foi feita sobre a string declarada, de forma a 70 | | retornar caractere por caractere e após o último foi lançada uma exceção 71 | | indicando que não há mais elementos a serem retornados. 72 | 73 | 74 | 75 | Classe Iterator 76 | --------------- 77 | 78 | | É possível também implementar um iterador como um objeto de uma classe 79 | | personalizada. 80 | | É necessário implementar os métodos __iter__ e __next__. 81 | | __iter__ retorna o objeto iterador por si. 82 | | __next__ retorna o próximo item da coleção e ao alcançar o fim e se 83 | | houver uma chamada sequente uma exceção é lançada (StopIteration). 84 | 85 | 86 | 87 | Criação da classe de iterador: 88 | 89 | .. code-block:: python 90 | 91 | class FirstNumbers(object): 92 | 93 | def __init__(self, n): 94 | self.n = n 95 | self.i = 0 96 | 97 | def __iter__(self): 98 | return self 99 | 100 | 101 | def __next__(self): 102 | if self.i <= self.n: 103 | cur = self.i 104 | self.i += 1 105 | return cur 106 | else: 107 | raise StopIteration() 108 | 109 | 110 | 111 | Somatória dos 10 primeiros números: 112 | 113 | .. code-block:: python 114 | 115 | print(sum(FirstNumbers(10))) 116 | 117 | .. code-block:: console 118 | 119 | 45 120 | 121 | 122 | 123 | Generator 124 | --------- 125 | 126 | | Um generator é um objeto iterável assim como um iterator, mas nem todo 127 | | iterator é um generator. 128 | | Funções de generator permite declarar uma função que se comporta como um 129 | | iterador, podendo ser usadas em loops. 130 | | Um generator implementa o conceito de lazy evaluation, o que faz com que 131 | | em determinadas situações economize-se recursos de processamento, pois cada 132 | | elemento é processado conforme a demanda. 133 | 134 | 135 | 136 | Criando um objeto range que vai de 0 a 9: 137 | 138 | .. code-block:: python 139 | 140 | numeros = range(0, 10) 141 | 142 | 143 | 144 | Se for utilizado list comrprehension será gerada uma lista: 145 | 146 | .. code-block:: python 147 | 148 | rq = [x ** 2 for x in numeros] 149 | 150 | 151 | 152 | Verificando os elementos: 153 | 154 | .. code-block:: python 155 | 156 | rq 157 | 158 | .. code-block:: console 159 | 160 | [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 161 | 162 | 163 | 164 | Verificando o tipo: 165 | 166 | .. code-block:: python 167 | 168 | type(rq) 169 | 170 | .. code-block:: console 171 | 172 | list 173 | 174 | 175 | 176 | Tuple comprehension é uma maneira de se criar um generator: 177 | 178 | .. code-block:: python 179 | 180 | rq = (x ** 2 for x in numeros) 181 | 182 | 183 | 184 | Verificando o tipo do objeto: 185 | 186 | .. code-block:: python 187 | 188 | type(rq) 189 | 190 | .. code-block:: console 191 | 192 | generator 193 | 194 | 195 | 196 | Executando o método dunder next até o fim dos elementos: 197 | 198 | .. code-block:: python 199 | 200 | rq.__next__() 201 | 202 | .. code-block:: console 203 | 204 | 0 205 | 206 | .. code-block:: python 207 | 208 | rq.__next__() 209 | 210 | .. code-block:: console 211 | 212 | 1 213 | 214 | . . . 215 | 216 | .. code-block:: console 217 | 218 | 81 219 | 220 | .. code-block:: python 221 | 222 | rq.__next__() 223 | 224 | .. code-block:: console 225 | 226 | StopIteration: 227 | 228 | Bla bla bla 229 | 230 | 231 | 232 | Funções Generator 233 | ----------------- 234 | 235 | | Uma função generator utiliza o comando yield em vez de return, o que faz 236 | | com que retorne o próximo elemento da sequência. 237 | 238 | 239 | 240 | Criação de uma função generator: 241 | 242 | .. code-block:: python 243 | 244 | def gen(): 245 | 246 | i = 0 247 | 248 | while i < 10: 249 | yield i 250 | i += 1 251 | 252 | 253 | 254 | Criação do gerador via execução da função: 255 | 256 | .. code-block:: python 257 | 258 | x = gen() 259 | 260 | 261 | 262 | Verificando os tipos: 263 | 264 | .. code-block:: python 265 | 266 | type(gen) 267 | 268 | .. code-block:: console 269 | 270 | function 271 | 272 | .. code-block:: python 273 | 274 | type(x) 275 | 276 | .. code-block:: console 277 | 278 | generator 279 | 280 | 281 | 282 | Execução do método __next__ até o fim: 283 | 284 | .. code-block:: python 285 | 286 | x.__next__() 287 | 288 | .. code-block:: console 289 | 290 | 0 291 | 292 | . . . 293 | 294 | .. code-block:: python 295 | 296 | x.__next__() 297 | 298 | .. code-block:: console 299 | 300 | 9 301 | 302 | .. code-block:: python 303 | 304 | x.__next__() 305 | 306 | .. code-block:: console 307 | 308 | StopIteration: 309 | 310 | 311 | 312 | Iterator vs Generator 313 | --------------------- 314 | 315 | - Para criar um generator utilizamos ou uma função com yield no lugar de 316 | return ou tuple comprehension. 317 | Para criar um iterador utilizamos a função `iter()`; 318 | 319 | - Generator utiliza `yield`, iterator não; 320 | 321 | - Gerador salva o estado de variáveis locais a cada vez que o yield pausa o 322 | loop. Um iterador não faz uso de variáveis locais, tudo o que ele precisa é 323 | faz a iteração. 324 | 325 | - Iteradores fazem uso mais eficiente de memória. 326 | 327 | 328 | 329 | Do módulo timeit importar a função de mesmo nome: 330 | 331 | .. code-block:: python 332 | 333 | from timeit import timeit 334 | 335 | 336 | 337 | Verificação de tipos: 338 | 339 | .. code-block:: python 340 | 341 | type(iter([x for x in range(1, 1001)])) 342 | 343 | .. code-block:: console 344 | 345 | list_iterator 346 | 347 | .. code-block:: python 348 | 349 | type((x for x in range(1, 1001))) 350 | 351 | .. code-block:: console 352 | 353 | generator 354 | 355 | 356 | 357 | Strings com código em loop sobre iterador e gerador, respectivamente: 358 | 359 | .. code-block:: python 360 | 361 | code_it = ''' 362 | for i in (iter([x for x in range(1, 1001)])): 363 | pass 364 | ''' 365 | 366 | .. code-block:: python 367 | 368 | code_gen = ''' 369 | for i in ((x for x in range(1, 1001))): 370 | pass 371 | ''' 372 | 373 | 374 | 375 | Cronometrando os códigos de iterador e gerador, respectivamente: 376 | 377 | .. code-block:: python 378 | 379 | timeit(code_it) 380 | 381 | .. code-block:: console 382 | 383 | 42.666774257901125 384 | 385 | .. code-block:: python 386 | 387 | timeit(code_gen) 388 | 389 | .. code-block:: console 390 | 391 | 53.58039242995437 -------------------------------------------------------------------------------- /source/content/sequences.rst: -------------------------------------------------------------------------------- 1 | Sequências 2 | ********** 3 | 4 | Com sequências podemos fazer iteração, indexação, fatiamento (slice) e operações de list comprehension. 5 | 6 | Mútável: 7 | 8 | **lista -> list -> [0, 'string', 7.0, 1000L]** 9 | 10 | Imutáveis: 11 | 12 | **string -> str -> 'texto'** 13 | 14 | **tupla -> tuple -> (0, 'string', 7.0, 1000L)** 15 | 16 | Strings e tuplas funcionam de forma idêntica à lista, porém, seus itens são imutáveis, consomem menos recursos. 17 | 18 | 19 | Operações com Sequências 20 | ------------------------ 21 | 22 | - Índices 23 | 24 | Toda sequência, seguindo a mesma idéia de vetores de outras linguagens, como C, por exemplo, começa com o índice 0 (zero). 25 | Para se obter um índice, fazemos da seguinte forma: 26 | 27 | sequencia[indice] 28 | 29 | 30 | 31 | Segundo elemento da string: 32 | 33 | .. code-block:: python 34 | 35 | 'Python'[1] 36 | 37 | .. code-block:: console 38 | 39 | 'y' 40 | 41 | 42 | 43 | Primeiro elemento da lista: 44 | 45 | .. code-block:: python 46 | 47 | ['foo', 'bar', 2.7, 80, 2 + 7j][0] 48 | 49 | .. code-block:: console 50 | 51 | 'foo' 52 | 53 | 54 | 55 | Quarto elemento da tupla: 56 | 57 | .. code-block:: python 58 | 59 | ('Python', 'C', 'C++', 2.7, 3.7)[3] 60 | 61 | .. code-block:: console 62 | 63 | 2.7 64 | 65 | 66 | 67 | Iteráveis 68 | --------- 69 | 70 | Sequências nos permite também fazer iteração sobre cada elemento. 71 | 72 | 73 | 74 | Definição de uma tupla: 75 | 76 | .. code-block:: python 77 | 78 | regiao_sudeste = ('SP', 'MG', 'ES', 'RJ') 79 | 80 | 81 | 82 | Loop sobre a tupla e impressão em tela de cada elemento: 83 | 84 | .. code-block:: python 85 | 86 | for i in regiao_sudeste: 87 | print(i) 88 | 89 | .. code-block:: console 90 | 91 | SP 92 | MG 93 | ES 94 | RJ 95 | 96 | 97 | 98 | Loop sobre a string e impressão em tela de cada caractere: 99 | 100 | .. code-block:: python 101 | 102 | for i in 'Python': 103 | print(i) 104 | 105 | .. code-block:: console 106 | 107 | P 108 | y 109 | t 110 | h 111 | o 112 | n 113 | 114 | 115 | 116 | Loop sobre um range de 0 (zero) a 20 (vinte) com a condição de exibir somente 0 (zero) e divisíveis por 5 (cinco): 117 | 118 | .. code-block:: python 119 | 120 | for i in range(21): 121 | if (i % 5 == 0): 122 | print(i) 123 | 124 | .. code-block:: console 125 | 126 | 0 127 | 5 128 | 10 129 | 15 130 | 20 131 | 132 | 133 | 134 | Fatiamento / Slicing 135 | -------------------- 136 | 137 | É o corte de uma sequência. 138 | 139 | **[inicio:fim - 1:incremento]** 140 | 141 | 142 | 143 | Fatiamento sem qualquer determinação: 144 | 145 | .. code-block:: python 146 | 147 | 'Python Language'[::] 148 | 149 | .. code-block:: console 150 | 151 | 'Python Language' 152 | 153 | 154 | Não foram determinados início, fim e incremento. 155 | 156 | 157 | 158 | Fatiamento determinando apenas o início, que é o último elemento: 159 | 160 | .. code-block:: python 161 | 162 | 'Python Language'[-1::] 163 | 164 | .. code-block:: console 165 | 166 | 'e' 167 | 168 | 169 | 170 | Pelo sinal de subtração, os três últimos caracteres da string: 171 | 172 | .. code-block:: python 173 | 174 | 'Python Language'[-3::] 175 | 176 | .. code-block:: console 177 | 178 | 'age' 179 | 180 | 181 | 182 | Determinando apenas o incremento de 4 (quatro) em 4: 183 | 184 | .. code-block:: python 185 | 186 | (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)[::4] 187 | 188 | .. code-block:: console 189 | 190 | (0, 4, 8) 191 | 192 | 193 | 194 | Incremento negativo faz com que a string seja colocada em ordem reversa: 195 | 196 | .. code-block:: python 197 | 198 | 'Python Language'[::-1] 199 | 200 | .. code-block:: console 201 | 202 | 'egaugnaL nohtyP' 203 | 204 | 205 | 206 | A partir do primeiro caractere: 207 | 208 | .. code-block:: python 209 | 210 | 'Python Language'[0:] 211 | 212 | .. code-block:: console 213 | 214 | 'Python Language' 215 | 216 | 217 | 218 | Do primeiro ao primeiro caractere: 219 | 220 | .. code-block:: python 221 | 222 | 'Python Language'[0:1] 223 | 224 | .. code-block:: console 225 | 226 | 'P' 227 | 228 | 229 | 230 | Do primeiro ao sexto caractere: 231 | 232 | .. code-block:: python 233 | 234 | Python Language'[0:6] 235 | 236 | .. code-block:: console 237 | 238 | 'Python' 239 | 240 | 241 | 242 | Do oitavo caractere em diante: 243 | 244 | .. code-block:: python 245 | 246 | 'Python Language'[7:] 247 | 248 | .. code-block:: console 249 | 250 | 'Language' 251 | 252 | 253 | 254 | Criação de uma tupla de exemplo: 255 | 256 | .. code-block:: python 257 | 258 | linux_distros = ( 259 | 'Debian', 260 | 'RedHat', 261 | 'Slackware', 262 | 'Ubuntu', 263 | 'CentOS', 264 | 'SuSE', 265 | ) 266 | 267 | 268 | 269 | Do primeiro ao terceiro elemento: 270 | 271 | .. code-block:: python 272 | 273 | linux_distros[0:3] 274 | 275 | .. code-block:: console 276 | 277 | ('Debian', 'RedHat', 'Slackware') 278 | 279 | 280 | 281 | List Comprehension 282 | ------------------ 283 | 284 | Ou em português, "Compreensão de Lista", fornece uma maneira concisa para criar listas. 285 | Usos comuns são para fazer novas listas onde cada elemento é o resultado de algumas operações aplicadas para cada membro de outra sequência ou iterável, criar uma subsequência desses elementos que satisfaçam uma certa condição. 286 | Sempre retornará uma lista. 287 | 288 | 289 | 290 | Lista a partir de uma list comprehension do range: 291 | 292 | .. code-block:: python 293 | 294 | [i for i in range(21)] 295 | 296 | .. code-block:: console 297 | 298 | [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] 299 | 300 | 301 | 302 | Lista cujos elementos são a metade de cada elemento do range: 303 | 304 | .. code-block:: python 305 | 306 | [i / 2.0 for i in range(10)] 307 | 308 | .. code-block:: console 309 | 310 | [0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5] 311 | 312 | 313 | 314 | Lista com condição que seja 0 (zero) ou divisível por 5 (cinco): 315 | 316 | .. code-block:: python 317 | 318 | [i for i in range(21) if (i % 5 == 0)] 319 | 320 | .. code-block:: console 321 | 322 | [0, 5, 10, 15, 20] 323 | 324 | 325 | 326 | Tuple Comprehension 327 | ------------------- 328 | 329 | Ou em português "Compreenção de Tupla" é similar a uma list comprehension, no entanto resulta em um generator. 330 | 331 | 332 | 333 | Criação de um generator a partir de uma tuple comprehension: 334 | 335 | .. code-block:: python 336 | 337 | x = (i for i in range(21)) 338 | 339 | 340 | 341 | Verificando o tipo do objeto: 342 | 343 | .. code-block:: python 344 | 345 | type(x) 346 | 347 | .. code-block:: console 348 | 349 | generator 350 | 351 | 352 | 353 | Dict Comprehension 354 | ------------------ 355 | 356 | Ou também conhecido em português como "Compreenção de Dicionário" 357 | 358 | 359 | Objeto dicionário a ser criado: 360 | 361 | .. code-block:: python 362 | 363 | d1 = {'a': 1, 'b':2, 'c': 3} 364 | 365 | 366 | 367 | Novo dicionário criado a partir de dict comprehension: 368 | 369 | .. code-block:: python 370 | 371 | d2 = {k.upper(): v * 10 for k, v in d1.items()} 372 | 373 | Cada chave é o caractere maiúsculo das chave correspondente ao dicionário 374 | original e seus valores são multiplicados por 10 (dez). 375 | 376 | 377 | 378 | Exibindo o dicionário gerado a partir da dict comprehension: 379 | 380 | .. code-block:: python 381 | 382 | print(d2) 383 | 384 | .. code-block:: console 385 | 386 | {'A': 10, 'B': 20, 'C': 30} -------------------------------------------------------------------------------- /source/content/property.rst: -------------------------------------------------------------------------------- 1 | Encapsulamento 2 | ************** 3 | 4 | | O conceito de encapsulamento no geral consiste em isolar atributos e / ou métodos de acesso externo deixando-os como privados. 5 | | Atributos privados devem ser acessados ou modificados através de *getters* e *setters*, respectivamente. 6 | | Métodos privados têm sua área de atuação restrita somente internamente na classe. 7 | 8 | 9 | Modificador Private (__) 10 | ------------------------ 11 | 12 | | Colocando 2 (dois) underscores antecedendo o atributo, ele fica privado, ou seja, não é acessível fora da classe. 13 | | Em Python não existem modificadores de atributos e métodos como em outras linguagens, ou seja, não existe *public*, *private* ou *protected*. 14 | 15 | 16 | 17 | Criação de uma classe de teste: 18 | 19 | .. code-block:: python 20 | 21 | class Foo(object): 22 | __atributo = 0 23 | 24 | 25 | 26 | Instância da classe: 27 | 28 | .. code-block:: python 29 | 30 | f = Foo() 31 | 32 | 33 | 34 | 35 | Tentativa de acesso a atributo privado: 36 | 37 | .. code-block:: python 38 | 39 | f.__atributo 40 | 41 | .. code-block:: console 42 | 43 | . . . 44 | AttributeError: 'Foo' object has no attribute '__atributo' 45 | 46 | | Por ser um atributo privado, seu acesso externo não foi reconhecido. 47 | 48 | 49 | 50 | Property 51 | -------- 52 | 53 | | Property é a solução pythônica para implementar getters e setters de forma inteligente e podendo inclusive impor restrições. 54 | 55 | 56 | 57 | Criação da classe Carro: 58 | 59 | .. code-block:: python 60 | 61 | class Carro(object): 62 | def __init__(self): 63 | self.__velocidade = 0 64 | 65 | # Métodos privados para a property 66 | 67 | def __get__velocidade(self): 68 | print(f'Velocidade: {self.__velocidade} km/h') 69 | return self.__velocidade 70 | 71 | def __set__velocidade(self, velocidade): 72 | if velocidade > 300: 73 | raise ValueError('A velocidade máxima permitida é de 300 km/h') 74 | self.__velocidade = velocidade 75 | print(f'Velocidade = {self.__velocidade} km/h') 76 | 77 | def __del__velocidade(self): 78 | print('Removendo a propriedade de velocidade') 79 | del self.__velocidade 80 | 81 | # Definição da property velocidade 82 | velocidade = property(__get__velocidade, # getter 83 | __set__velocidade, # setter 84 | __del__velocidade, # deleter 85 | 'Velocidade máxima do carro') # Descrição 86 | 87 | 88 | 89 | Instância da classe Carro: 90 | 91 | .. code-block:: python 92 | 93 | c = Carro() 94 | 95 | 96 | 97 | Tentativa de acesso ao atributo privado: 98 | 99 | .. code-block:: python 100 | 101 | c.__velocidade 102 | 103 | 104 | .. code-block:: console 105 | 106 | AttributeError: 'Carro' object has no attribute '__velocidade' 107 | 108 | 109 | 110 | Acessando a property velocidade: 111 | 112 | .. code-block:: python 113 | 114 | c.velocidade 115 | 116 | .. code-block:: console 117 | 118 | Velocidade: 0 km/h 119 | 0 120 | 121 | 122 | 123 | Atribuindo um valor para a property: 124 | 125 | .. code-block:: python 126 | 127 | c.velocidade = 200 128 | 129 | .. code-block:: console 130 | 131 | Velocidade = 200 km/h 132 | 133 | 134 | 135 | O que acontece se pegarmos o nome do atributo privado e o definirmos externamente?: 136 | 137 | .. code-block:: python 138 | 139 | c.__velocidade = 'valor equivocado' 140 | 141 | 142 | 143 | Acessando o atributo adicionado: 144 | 145 | .. code-block:: python 146 | 147 | c.__velocidade 148 | .. code-block:: console 149 | 150 | 'valor equivocado' 151 | 152 | 153 | 154 | Será que a property foi afetada?: 155 | 156 | .. code-block:: python 157 | 158 | c.velocidade 159 | 160 | .. code-block:: console 161 | 162 | Velocidade: 200 km/h 163 | 164 | | Felizmente a property não foi afetada e o encapsulamento foi mantido :) 165 | 166 | 167 | 168 | Reatribuir um novo valor: 169 | 170 | .. code-block:: python 171 | 172 | c.velocidade = 170 173 | 174 | .. code-block:: console 175 | 176 | Velocidade = 170 km/h 177 | 178 | 179 | 180 | Consultar o valor do atributo: 181 | 182 | .. code-block:: python 183 | 184 | c.velocidade 185 | 186 | .. code-block:: console 187 | 188 | Velocidade: 170 km/h 189 | 170 190 | 191 | 192 | 193 | Tentativa de atribuir um valor não permitido: 194 | 195 | .. code-block:: python 196 | 197 | c.velocidade = 301 198 | 199 | .. code-block:: console 200 | 201 | . . . 202 | 203 | ValueError: A velocidade máxima permitida é de 300 km/h 204 | 205 | 206 | 207 | Remover a property: 208 | 209 | .. code-block:: python 210 | 211 | del c.velocidade 212 | 213 | .. code-block:: console 214 | 215 | Removendo a propriedade de velocidade 216 | 217 | 218 | 219 | Tentativa de acesso à property apagada: 220 | 221 | .. code-block:: python 222 | 223 | c.velocidade 224 | 225 | .. code-block:: console 226 | 227 | AttributeError: 'Carro' object has no attribute '_Carro__velocidade' 228 | 229 | 230 | 231 | Property como Decorator 232 | ~~~~~~~~~~~~~~~~~~~~~~~ 233 | 234 | | Além da já citada implementação de property, pode-se também fazer isso por meio de decorators. 235 | 236 | 237 | 238 | Criação de classe com definição de properties via decorators: 239 | 240 | .. code-block:: python 241 | 242 | class Carro(object): 243 | def __init__(self): 244 | self.__velocidade = 0 245 | 246 | # Properties 247 | 248 | @property 249 | def velocidade(self): 250 | ''' 251 | Velocidade máxima do carro 252 | ''' 253 | print(f'Velocidade: {self.__velocidade} km/h') 254 | return self.__velocidade 255 | 256 | @velocidade.setter 257 | def velocidade(self, velocidade): 258 | if velocidade > 300: 259 | raise ValueError('A velocidade máxima permitida é de 300 km/h') 260 | self.__velocidade = velocidade 261 | print(f'Velocidade = {self.__velocidade} km/h') 262 | 263 | @velocidade.deleter 264 | def velocidade(self): 265 | print('Removendo a propriedade de velocidade') 266 | del self.__velocidade 267 | 268 | | Repetir os comandos do exercício anterior ;) 269 | 270 | 271 | 272 | Descriptors 273 | ----------- 274 | 275 | | São objetos Python que implementam um método do protocolo descritor, que nos permite criar objetos que 276 | tenham um comportamento desejado quando seus atributos são acessados por outros objetos. 277 | 278 | 279 | 280 | Criação de uma classe descriptor: 281 | 282 | .. code-block:: python 283 | 284 | class Verbose(object): 285 | 286 | def __get__(self, obj, type=None) -> object: 287 | return 7 288 | 289 | def __set__(self, obj, value) -> None: 290 | raise AttributeError('Não pode mudar o valor!!!') 291 | 292 | def __delete__(self, obj, type=None) -> None: 293 | raise AttributeError('Não pode remover o atributo!!!') 294 | 295 | 296 | 297 | 298 | 299 | Criação de uma classe de teste para o descriptor: 300 | 301 | .. code-block:: python 302 | 303 | class Foo(object): 304 | atributo = Verbose() 305 | 306 | 307 | 308 | 309 | Instanciação da classe Foo: 310 | 311 | .. code-block:: python 312 | 313 | o = Foo() 314 | 315 | 316 | 317 | 318 | Verificação do tipo do atributo que utiliza o descriptor: 319 | 320 | .. code-block:: python 321 | 322 | type(o.atributo) 323 | 324 | .. code-block:: console 325 | 326 | int 327 | 328 | 329 | 330 | 331 | Exibe o valor do atributo: 332 | 333 | .. code-block:: python 334 | 335 | print(o.atributo) 336 | 337 | .. code-block:: console 338 | 339 | 7 340 | 341 | 342 | 343 | Tentativa de atribuir um novo valor ao atributo: 344 | 345 | .. code-block:: python 346 | 347 | o.atributo = 9 348 | 349 | .. code-block:: console 350 | 351 | AttributeError: Não pode mudar o valor!!! 352 | 353 | | Houve um lançamento de exceção ao tentar redefinir o valor do atributo. 354 | 355 | 356 | 357 | Tentativa de remover o atributo do objeto: 358 | 359 | .. code-block:: python 360 | 361 | del o.atributo 362 | 363 | .. code-block:: console 364 | 365 | AttributeError: Não pode remover o atributo!!! 366 | 367 | | Houve um lançamento de exceção ao tentar remover o atributo. 368 | 369 | 370 | 371 | Verificando se o atributo foi alterado: 372 | 373 | .. code-block:: python 374 | 375 | print(o.atributo) 376 | 377 | .. code-block:: console 378 | 379 | 7 -------------------------------------------------------------------------------- /source/content/scope.rst: -------------------------------------------------------------------------------- 1 | Escopo 2 | ****** 3 | 4 | | Por escopo entende-se o contexto onde um identificador será considerado. 5 | | Um identificador pode ser uma variável, um comando, uma função uma clase ou um objeto. 6 | | A ordem de busca de um identificador em escopos é a seguinte: 7 | 8 | 1. Local ou dentro de função; 9 | 2. Função externa; 10 | 3. Global ou de módulo; 11 | 4. __builtins__ 12 | 13 | 14 | 15 | Escopo Local ou Dentro de Função 16 | -------------------------------- 17 | 18 | É o escopo que tem a maior prioridade. 19 | 20 | 21 | 22 | Declaração de uma variável com seu valor: 23 | 24 | .. code-block:: python 25 | 26 | foo = 7 27 | 28 | 29 | 30 | Exibindo na tela o valor da variável: 31 | 32 | .. code-block:: python 33 | 34 | print(foo) 35 | 36 | .. code-block:: console 37 | 38 | 7 39 | 40 | 41 | 42 | Função locals 43 | ~~~~~~~~~~~~~ 44 | 45 | | A função locals() retorna um dicionário com os identificadores locais e seus respectivos valores. 46 | | Então é pedido o valor dada a chave que é o nome da variável local. 47 | 48 | 49 | 50 | Usando locals para retornar o valor de uma variável: 51 | 52 | .. code-block:: python 53 | 54 | locals()['foo'] 55 | 56 | .. code-block:: console 57 | 58 | 7 59 | 60 | 61 | 62 | Escopo Interno de uma Função 63 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | 65 | | Diz respeito ao espaço delimitado de alcance, dentro de uma função. 66 | 67 | 68 | 69 | Declaração de uma variável externamente ao escopo da função: 70 | 71 | .. code-block:: python 72 | 73 | foo = 7 74 | 75 | 76 | 77 | Definição de uma função: 78 | 79 | .. code-block:: python 80 | 81 | def funcao(): 82 | foo = 9 83 | print(id(foo)) 84 | print(foo) 85 | 86 | | Nota-se que dentro da função também há uma variável chamada "foo". Essa função imprime o ID desse identificador e depois imprime seu valor. 87 | 88 | 89 | 90 | Exibindo o ID de foo: 91 | 92 | .. code-block:: python 93 | 94 | print(id(foo)) 95 | 96 | .. code-block:: console 97 | 98 | 162857064 99 | 100 | 101 | 102 | Exibindo o valor de foo: 103 | 104 | .. code-block:: python 105 | 106 | print(foo) 107 | 108 | .. code-block:: console 109 | 110 | 7 111 | 112 | 113 | 114 | Acionando a função: 115 | 116 | .. code-block:: python 117 | 118 | funcao() 119 | 120 | .. code-block:: console 121 | 122 | 162857040 123 | 9 124 | 125 | | Nota-se também que bem como o ID e o valor retornados pela função, da variável interna foo são diferentes da variável externa de mesmo nome. 126 | 127 | 128 | 129 | Escopo de Função Externa 130 | ------------------------ 131 | 132 | | Ao se criar uma função dentro de outra, a função mais interna pode utilizar um identificador que esteja no nível mais acima. 133 | 134 | 135 | 136 | Definição de uma função com uma função interna: 137 | 138 | .. code-block:: python 139 | 140 | def funcao_principal(): 141 | x = 1 142 | def funcao_secundaria(): 143 | print(x) 144 | funcao_secundaria() 145 | 146 | | A função principal tem uma variável x, cujo valor é impresso em tela pela função secundária. 147 | | A função principal invoca a função secundária. 148 | 149 | 150 | 151 | Chamando a função: 152 | 153 | .. code-block:: python 154 | 155 | funcao_principal() 156 | 157 | .. code-block:: console 158 | 159 | 1 160 | 161 | 162 | Uma nova definição da função: 163 | 164 | .. code-block:: python 165 | 166 | def funcao_principal(): 167 | x = 1 168 | def funcao_secundaria(): 169 | x = 2 170 | print(x) 171 | funcao_secundaria() 172 | 173 | | Diferente do exemplo anterior, a função secundária declarou sua própria variável "x". 174 | 175 | 176 | 177 | Testando a função: 178 | 179 | .. code-block:: python 180 | 181 | funcao_principal() 182 | 183 | .. code-block:: console 184 | 185 | 2 186 | 187 | | Nota-se que o valor considerado foi o de "x", que é o identificador mais interno. 188 | 189 | 190 | 191 | Escopo Global ou Escopo do Módulo 192 | --------------------------------- 193 | 194 | | É também conhecido como escopo de módulo devido ao fato de estar na endentação do mesmo. 195 | 196 | 197 | 198 | Criação de variável: 199 | 200 | .. code-block:: python 201 | 202 | foo = 'bar' 203 | 204 | 205 | 206 | Criação de função: 207 | 208 | .. code-block:: python 209 | 210 | def funcao(): 211 | foo = 'eggs' 212 | print(foo) 213 | 214 | | A função criada tem uma variável com o mesmo nome que uma variável global, a ela dá um valor e imprime esse valor em tela. 215 | | Será que isso altera o valor da variável global? 216 | 217 | 218 | 219 | Execução da função: 220 | 221 | .. code-block:: python 222 | 223 | funcao() 224 | 225 | .. code-block:: console 226 | 227 | eggs 228 | 229 | | Nota-se que o valor impresso é igual ao da variável "foo" dentro da função. 230 | | Pra saber se a variável global foi alterada, vamos testar com a função print. 231 | 232 | 233 | 234 | Imprimindo o valor da variável global: 235 | 236 | .. code-block:: python 237 | 238 | print(foo) 239 | 240 | .. code-block:: console 241 | 242 | bar 243 | 244 | | Pode-se concluir que a função criada não interferiu na variável global. 245 | | Para alterar uma variável global em um contexto local precisamos utilizar o comando global. 246 | 247 | 248 | Criação de função que altera a variável global: 249 | 250 | .. code-block:: python 251 | 252 | def funcao(): 253 | global foo 254 | foo = 'eggs' 255 | print(foo) 256 | 257 | 258 | 259 | Executar função: 260 | 261 | .. code-block:: python 262 | 263 | funcao() 264 | 265 | .. code-block:: console 266 | 267 | eggs 268 | 269 | | OK, a função imprimiu o valor local da função. 270 | | Mas será que a variável global também foi alterada? 271 | 272 | 273 | 274 | Imprimir o valor da variável global: 275 | 276 | .. code-block:: python 277 | 278 | print(foo) 279 | 280 | .. code-block:: console 281 | 282 | eggs 283 | 284 | | Agora a função pôde alterar a variável global. Isso se deve ao fato do comando global ter sido empregado. 285 | | A variável global a ser alterada deve ser declarada como global antes de sua atribuição. 286 | 287 | 288 | 289 | Escopo __builtins__ 290 | ------------------- 291 | 292 | | O escopo __builtins__ abrange identificadores que já estão definidos antes mesmo do código a ser escrito. 293 | | São funções, comandos e variáveis internas de Python. 294 | 295 | 296 | 297 | "str" é está em __builtins__?: 298 | 299 | .. code-block:: python 300 | 301 | 'str' in dir(__builtins__) 302 | 303 | .. code-block:: console 304 | 305 | True 306 | 307 | | Resposta afirmativa (True), ou seja, "str" faz parte desse escopo. 308 | | E se sobescrevermos esse item localmente? 309 | 310 | 311 | 312 | Criando uma variável cujo identificador pertence ao escopo __builtins__: 313 | 314 | .. code-block:: python 315 | 316 | str = 1 317 | 318 | 319 | 320 | Qual é o tipo?: 321 | 322 | .. code-block:: python 323 | 324 | type(str) 325 | 326 | .. code-block:: console 327 | 328 | int 329 | 330 | | "str" que inicialmente era um identificador para o tipo de strings em Python, aqui agora virou uma variável de inteiro. 331 | | Mas e o tipo "str" deixou de existir? 332 | 333 | 334 | 335 | Qual tipo? 336 | 337 | .. code-block:: python 338 | 339 | type(__builtins__.str) 340 | 341 | .. code-block:: console 342 | 343 | type 344 | 345 | | É do tipo "tipo" 346 | 347 | 348 | 349 | Valor de str?: 350 | 351 | .. code-block:: python 352 | 353 | str 354 | 355 | .. code-block:: console 356 | 357 | 1 358 | 359 | 360 | 361 | Chamar a str built-in para converter a str redefinida: 362 | 363 | .. code-block:: python 364 | 365 | __builtins__.str(str) 366 | 367 | .. code-block:: console 368 | 369 | '1' 370 | 371 | 372 | 373 | Apagando a variável: 374 | 375 | .. code-block:: python 376 | 377 | del str 378 | 379 | 380 | 381 | Função built-in str: 382 | 383 | .. code-block:: python 384 | 385 | str(7) 386 | 387 | .. code-block:: console 388 | 389 | '7' 390 | 391 | | Observe que a função não foi removida, apenas a variável criada por redefinição. 392 | 393 | 394 | 395 | Verificar todos identificadores built-ins: 396 | 397 | .. code-block:: python 398 | 399 | dir(__builtins__) 400 | 401 | | . . . 402 | 403 | 404 | 405 | Funções globals(), locals() e vars() e Comando global 406 | ----------------------------------------------------- 407 | 408 | | Cada uma das funções retornam dicionários de variáveis e seus respectivos valores. 409 | 410 | - globals(): Retorna variáveis globais (escopo do módulo); 411 | - locals(): Retorna variáveis locais (escopo local); 412 | - vars(obj): sem argumentos é equivalente a locals(), com um argumento, equivalente a objeto.__dict__. 413 | 414 | 415 | 416 | Variável em um escopo global: 417 | 418 | .. code-block:: python 419 | 420 | foo = 'escopo global' 421 | 422 | 423 | 424 | Função de teste: 425 | 426 | .. code-block:: python 427 | 428 | def f(): 429 | foo = 'escopo local' 430 | bar = 'uma variável qualquer...' 431 | print(globals()['foo']) # Valor do identificador global 432 | print(locals()['foo']) # Valor do identificador local 433 | 434 | 435 | 436 | Chamada da função: 437 | 438 | .. code-block:: python 439 | 440 | f() 441 | 442 | .. code-block:: console 443 | 444 | escopo global 445 | escopo local 446 | 447 | 448 | 449 | Criação de uma classe de teste: 450 | 451 | .. code-block:: python 452 | 453 | class Spam(object): 454 | foo = '' 455 | bar = '' 456 | 457 | 458 | 459 | "foo" e "bar" ambos identificadores estão contidos em "vars(Spam)"?: 460 | 461 | .. code-block:: python 462 | 463 | set(('foo', 'bar')).issubset(vars(Spam)) 464 | 465 | .. code-block:: console 466 | 467 | True 468 | 469 | 470 | 471 | Função de teste: 472 | 473 | .. code-block:: python 474 | 475 | def f(): 476 | global x 477 | x = 7 478 | 479 | 480 | 481 | Verificando o tipo: 482 | 483 | .. code-block:: python 484 | 485 | type(x) 486 | 487 | .. code-block:: console 488 | 489 | NameError: name 'x' is not defined 490 | 491 | | A variável "x" não existe ainda. 492 | 493 | 494 | 495 | Executando a função: 496 | 497 | .. code-block:: python 498 | 499 | f() 500 | 501 | 502 | 503 | Verificando o tipo: 504 | 505 | .. code-block:: python 506 | 507 | type(x) 508 | 509 | .. code-block:: console 510 | 511 | int 512 | 513 | 514 | 515 | Exibir o valor da variável: 516 | 517 | .. code-block:: python 518 | 519 | print(x) 520 | 521 | .. code-block:: console 522 | 523 | 7 -------------------------------------------------------------------------------- /source/content/dict.rst: -------------------------------------------------------------------------------- 1 | Dicionários 2 | *********** 3 | 4 | Em Python um dicionário é uma estrutura de dados envolta por chaves cujos elementos são compostos por chave:valor e separados por vírgula. 5 | 6 | 7 | 8 | Dicionário vazio: 9 | 10 | .. code-block:: python 11 | 12 | d = {} 13 | 14 | 15 | 16 | Criação de um dicionário utilizando a função dict: 17 | 18 | .. code-block:: python 19 | 20 | d = dict(chave1 = 'valor2', chave2 = 1980) 21 | 22 | 23 | 24 | Criação de um dicionário utilizando chaves: 25 | 26 | .. code-block:: python 27 | 28 | d = { 29 | 'nome': 'Chiquinho', 30 | 'sobrenome': 'da Silva', 31 | 'email': 'chiquinho.silva@zeninguem.com', 32 | } 33 | 34 | 35 | 36 | Exibir o valor de uma chave do dicionário: 37 | 38 | .. code-block:: python 39 | 40 | d['nome'] 41 | 42 | .. code-block:: console 43 | 44 | 'Chiquinho' 45 | 46 | 47 | Loop para exibir cada par de chave e valor do dicionário: 48 | 49 | .. code-block:: python 50 | 51 | for k in d: 52 | print(f'{k} = {d[k]}') 53 | 54 | .. code-block:: console 55 | 56 | nome = Chiquinho 57 | sobrenome = da Silva 58 | email = chiquinho.silva@zeninguem.com 59 | 60 | 61 | 62 | Loop para exibir cada par de chave e valor do dicionário ordenado por chave: 63 | 64 | .. code-block:: python 65 | 66 | for k in sorted(d): 67 | print(f'{k} = {d[k]}') 68 | 69 | .. code-block:: console 70 | 71 | email = chiquinho.silva@zeninguem.com 72 | nome = Chiquinho 73 | sobrenome = da Silva 74 | 75 | 76 | 77 | Itens do dicionário: 78 | 79 | .. code-block:: python 80 | 81 | d.items() 82 | 83 | .. code-block:: console 84 | 85 | dict_items([('nome', 'Chiquinho'), ('sobrenome', 'da Silva'), ('email', 'chiquinho.silva@zeninguem.com')]) 86 | 87 | 88 | 89 | 90 | Loop sobre os itens do dicionário: 91 | 92 | .. code-block:: python 93 | 94 | for k, v in d.items(): 95 | print(f'{k} = {v}') 96 | 97 | .. code-block:: console 98 | 99 | nome = Chiquinho 100 | sobrenome = da Silva 101 | email = chiquinho.silva@zeninguem.com 102 | 103 | 104 | 105 | Método para exibir as chaves do dicionário: 106 | 107 | .. code-block:: python 108 | 109 | d.keys() 110 | 111 | .. code-block:: console 112 | 113 | dict_keys(['nome', 'sobrenome', 'email']) 114 | 115 | 116 | 117 | Método para exibir as chaves do dicionário: 118 | 119 | .. code-block:: python 120 | 121 | d.values() 122 | 123 | .. code-block:: console 124 | 125 | dict_values(['Chiquinho', 'da Silva', 'chiquinho.silva@zeninguem.com']) 126 | 127 | 128 | 129 | Método para limpar o dicionário: 130 | 131 | .. code-block:: python 132 | 133 | d.clear() 134 | 135 | 136 | 137 | Dicionário após a execução do método clear: 138 | 139 | .. code-block:: python 140 | 141 | d 142 | 143 | .. code-block:: console 144 | 145 | {} 146 | 147 | 148 | 149 | Método update para adicionar chaves e valores: 150 | 151 | .. code-block:: python 152 | 153 | d.update({ 154 | 'nome': 'Chiquinho', 155 | 'sobrenome': 'da Silva', 156 | 'email': 'chiquinho.silva@zeninguem.com', 157 | } 158 | ) 159 | 160 | 161 | 162 | Exibindo o conteúdo do dicionário: 163 | 164 | .. code-block:: python 165 | 166 | d 167 | 168 | .. code-block:: console 169 | 170 | {'email': 'chiquinho.silva@zeninguem.com', 171 | 'nome': 'Chiquinho', 172 | 'sobrenome': 'da Silva'} 173 | 174 | 175 | 176 | Adicionando uma chave e valor ao dicionário: 177 | 178 | .. code-block:: python 179 | 180 | d.update({'data_nascimento': '28/02/1936'}) 181 | 182 | 183 | 184 | Exibindo o conteúdo do dicionário: 185 | 186 | .. code-block:: python 187 | 188 | d 189 | 190 | .. code-block:: console 191 | 192 | {'nome': 'Chiquinho', 193 | 'sobrenome': 'da Silva', 194 | 'email': 'chiquinho.silva@zeninguem.com', 195 | 'data_nascimento': '28/02/1936'} 196 | 197 | 198 | 199 | Alterando uma chave do dicionário: 200 | 201 | .. code-block:: python 202 | 203 | d['data_nascimento'] = '08/02/1936' 204 | 205 | 206 | 207 | Exibindo o conteúdo do dicionário: 208 | 209 | .. code-block:: python 210 | 211 | d 212 | 213 | .. code-block:: console 214 | 215 | {'nome': 'Chiquinho', 216 | 'sobrenome': 'da Silva', 217 | 'email': 'chiquinho.silva@zeninguem.com', 218 | 'data_nascimento': '08/02/1936'} 219 | 220 | 221 | 222 | Adicionando uma nova chave e valor: 223 | 224 | .. code-block:: python 225 | 226 | d['cidade_origem'] = 'Cascatinha' 227 | 228 | 229 | Exibindo o conteúdo do dicionário: 230 | 231 | .. code-block:: python 232 | 233 | d 234 | 235 | .. code-block:: console 236 | 237 | {'nome': 'Chiquinho', 238 | 'sobrenome': 'da Silva', 239 | 'email': 'chiquinho.silva@zeninguem.com', 240 | 'data_nascimento': '08/02/1936', 241 | 'cidade_origem': 'Cascatinha'} 242 | 243 | Como chave só são aceitos tipos que utilizam hash, listas não são aceitas, mas 244 | instâncias de classes e tuplas são aceitas. 245 | 246 | 247 | 248 | Criação de uma lista e uma tupla respectivamente: 249 | 250 | .. code-block:: python 251 | 252 | l = [1, 2, 3] 253 | t = (5, 7) 254 | 255 | 256 | 257 | Criação de uma classe para teste: 258 | 259 | .. code-block:: python 260 | 261 | class Funcionario(object): 262 | pass 263 | 264 | 265 | 266 | Objeto da classe Funcionário: 267 | 268 | .. code-block:: python 269 | 270 | f1 = Funcionario() 271 | 272 | 273 | 274 | Tentativa de fazer uma lista ser chave do dicionário e atribuir um valor: 275 | 276 | .. code-block:: python 277 | 278 | d[l] = 0 279 | 280 | .. code-block:: console 281 | 282 | TypeError: unhashable type: 'list' 283 | 284 | Listas são "unhashable", portanto não podem ser chaves de um dicionário. 285 | 286 | 287 | 288 | Objeto da classe Funcionário como chave do dicionário: 289 | 290 | .. code-block:: python 291 | 292 | d[f1] = 'Funcionário 1' 293 | 294 | 295 | Exibir o conteúdo do dicionário: 296 | 297 | .. code-block:: python 298 | 299 | d 300 | 301 | .. code-block:: console 302 | 303 | {'nome': 'Chiquinho', 304 | 'sobrenome': 'da Silva', 305 | 'email': 'chiquinho.silva@zeninguem.com', 306 | 'data_nascimento': '08/02/1936', 307 | 'cidade_origem': 'Cascatinha', 308 | <__main__.Funcionario at 0x7f3769ca9c88>: 'Funcionário 1'} 309 | 310 | 311 | 312 | Tupla como chave do dicionário e atribuir um valor: 313 | 314 | .. code-block:: python 315 | 316 | d[t] = 0 317 | 318 | 319 | 320 | Exibir o conteúdo do dicionário: 321 | 322 | .. code-block:: python 323 | 324 | d 325 | 326 | .. code-block:: console 327 | 328 | {'nome': 'Chiquinho', 329 | 'sobrenome': 'da Silva', 330 | 'email': 'chiquinho.silva@zeninguem.com', 331 | 'data_nascimento': '08/02/1936', 332 | 'cidade_origem': 'Cascatinha', 333 | <__main__.Funcionario at 0x7f3769ca9c88>: 'Funcionário 1', 334 | (5, 7): 0} 335 | 336 | 337 | 338 | Tentativa de acessar uma chave inexistente: 339 | 340 | .. code-block:: python 341 | 342 | d[endereco] 343 | 344 | .. code-block:: console 345 | 346 | NameError: name 'endereco' is not defined 347 | 348 | 349 | 350 | Método get: 351 | 352 | .. code-block:: python 353 | 354 | d.get('nome') 355 | 356 | .. code-block:: console 357 | 358 | 'Chiquinho' 359 | 360 | Existe a chave "nome", então seu valor foi retornado. 361 | 362 | .. code-block:: python 363 | 364 | d.get('endereco') 365 | 366 | Não existe a chave "endereço", por isso nada foi retornado, no entanto, não 367 | foi lançada exceção. 368 | 369 | .. code-block:: python 370 | 371 | d.get('endereco', 'R. do Cafezal, 30') 372 | 373 | .. code-block:: console 374 | 375 | 'R. do Cafezal, 30' 376 | 377 | Não existe a chave "endereço", mas no método get foi passado um segundo 378 | parâmetro, o qual foi retornado, porém não houve modificação no dicionário. 379 | 380 | .. code-block:: python 381 | 382 | d.get('nome', 'Zezinho') 383 | 384 | .. code-block:: console 385 | 386 | 'Chiquinho' 387 | 388 | A chave "nome" já existia, sendo um valor diferente do valor da mesma, foi 389 | retornado o valor que pertence à chave. 390 | 391 | 392 | 393 | Criação de um dicionário: 394 | 395 | .. code-block:: python 396 | 397 | carro = { 398 | 'marca': 'Fiat', 399 | 'modelo': '147' 400 | } 401 | 402 | 403 | 404 | Tentando acessar uma chave inexistente: 405 | 406 | .. code-block:: python 407 | 408 | carro['cor'] 409 | 410 | .. code-block:: console 411 | 412 | KeyError: 'cor' 413 | 414 | 415 | 416 | Método get apenas para retorno: 417 | 418 | .. code-block:: python 419 | 420 | carro.get('cor', 'amarelo') 421 | 422 | .. code-block:: console 423 | 424 | 'amarelo' 425 | 426 | 427 | 428 | Verificando o conteúdo do dicionário: 429 | 430 | .. code-block:: python 431 | 432 | carro 433 | 434 | .. code-block:: console 435 | 436 | {'marca': 'Fiat', 'modelo': '147'} 437 | 438 | 439 | 440 | Método setdefault: 441 | 442 | .. code-block:: python 443 | 444 | carro.setdefault('modelo', 'Topazio') 445 | 446 | .. code-block:: console 447 | 448 | '147' 449 | 450 | Já havia uma chave "modelo", então foi retornado seu valor e não o segundo 451 | parâmetro fornecido. 452 | 453 | 454 | 455 | .. code-block:: python 456 | 457 | carro.setdefault('cor', 'verde') 458 | 459 | .. code-block:: console 460 | 461 | 'verde' 462 | 463 | Não havia uma chave "cor", agora ela e seu valor fazem parte do dicionário. 464 | 465 | 466 | 467 | Verificando o conteúdo do dicionário: 468 | 469 | .. code-block:: python 470 | 471 | carro 472 | 473 | .. code-block:: console 474 | 475 | {'cor': 'verde', 'marca': 'Fiat', 'modelo': '147'} 476 | 477 | 478 | 479 | Método update para alterar valores de chaves pré existentes ou mesmo para 480 | adicionar novos pares de chave-valor: 481 | 482 | .. code-block:: python 483 | 484 | carro.update(modelo = 'Topazio', cor = 'cinza') 485 | 486 | 487 | Verificando o conteúdo do dicionário: 488 | 489 | .. code-block:: python 490 | 491 | carro 492 | 493 | .. code-block:: console 494 | 495 | {'cor': 'cinza', 'marca': 'Fiat', 'modelo': 'Topazio'} 496 | 497 | 498 | 499 | Método pop; retira uma chave do dicionário e retorna seu valor: 500 | 501 | .. code-block:: python 502 | 503 | carro.pop('cor') 504 | 505 | .. code-block:: console 506 | 507 | 'cinza' 508 | 509 | 510 | 511 | Verificando o conteúdo do dicionário: 512 | 513 | .. code-block:: python 514 | 515 | carro 516 | 517 | .. code-block:: console 518 | 519 | {'marca': 'Fiat', 'modelo': 'Topazio'} 520 | 521 | 522 | 523 | Método pop para uma chave que não existe: 524 | 525 | .. code-block:: python 526 | 527 | carro.pop('ano') 528 | 529 | .. code-block:: console 530 | 531 | KeyError: 'ano' 532 | 533 | 534 | 535 | Método pop para uma chave que não existe, mas fornecendo um valor: 536 | 537 | .. code-block:: python 538 | 539 | carro.pop('ano', 1981) 540 | 541 | .. code-block:: console 542 | 543 | 1981 544 | 545 | O dicionário continua sem a chave, mas não lançou uma exceção. 546 | 547 | 548 | 549 | Existe a chave "marca" no dicionário?: 550 | 551 | .. code-block:: python 552 | 553 | 'marca' in carro 554 | 555 | .. code-block:: console 556 | 557 | True 558 | 559 | 560 | 561 | Existe a chave "cor" no dicionário?: 562 | 563 | .. code-block:: python 564 | 565 | 'cor' in carro 566 | 567 | .. code-block:: console 568 | 569 | False 570 | 571 | 572 | Adicionando novas chaves e seus respectivos valores: 573 | 574 | .. code-block:: python 575 | 576 | carro['cor'] = 'cinza' 577 | carro['ano'] = 1981 578 | 579 | 580 | 581 | Verificando o conteúdo do dicionário: 582 | 583 | .. code-block:: python 584 | 585 | carro 586 | 587 | .. code-block:: console 588 | 589 | {'marca': 'Fiat', 'modelo': 'Topazio', 'cor': 'cinza', 'ano': 1981} -------------------------------------------------------------------------------- /source/content/list.rst: -------------------------------------------------------------------------------- 1 | Lista 2 | ***** 3 | 4 | Uma lista é uma estrutura de dados similar ao tradicional array que tem em 5 | outras linguagens, porém seus elementos podem ser de tipos diferentes. 6 | Uma lista é também uma coleção de dados mutável, pois sua estrutura pode ser mudada. 7 | 8 | 9 | 10 | Formas de criar uma lista vazia: 11 | 12 | .. code-block:: python 13 | 14 | l = [] 15 | 16 | ou 17 | 18 | .. code-block:: python 19 | 20 | l = list() 21 | 22 | 23 | 24 | Formas de criar uma lista com elementos: 25 | 26 | .. code-block:: python 27 | 28 | l = list([1, 2, 3]) 29 | 30 | ou 31 | 32 | .. code-block:: python 33 | 34 | l = [1, 2, 3] 35 | 36 | 37 | 38 | Declaração de uma nova lista: 39 | 40 | .. code-block:: python 41 | 42 | x = ['a', 'b', 3, 4.0] 43 | 44 | 45 | 46 | Exibindo o terceiro elemento da lista: 47 | 48 | .. code-block:: python 49 | 50 | print(x[2]) 51 | 52 | .. code-block:: console 53 | 54 | 3 55 | 56 | 57 | 58 | Alterando o terceiro elemento da lista: 59 | 60 | .. code-block:: python 61 | 62 | x[2] = 30 63 | 64 | 65 | 66 | Exibindo o terceiro elemento da lista: 67 | 68 | .. code-block:: python 69 | 70 | print(x[2]) 71 | 72 | .. code-block:: console 73 | 74 | 30 75 | 76 | 77 | 78 | Exibindo os elementos da lista: 79 | 80 | .. code-block:: python 81 | 82 | print(x) 83 | 84 | .. code-block:: console 85 | 86 | ['a', 'b', 30, 4.0] 87 | 88 | 89 | 90 | Existe "7" na lista?: 91 | 92 | .. code-block:: python 93 | 94 | 7 in x 95 | 96 | .. code-block:: console 97 | 98 | False 99 | 100 | 101 | 102 | Existe "3" na lista?: 103 | 104 | .. code-block:: python 105 | 106 | 3 in x 107 | 108 | .. code-block:: console 109 | 110 | True 111 | 112 | 113 | 114 | O método append adiciona um elemento ao final da lista: 115 | 116 | .. code-block:: python 117 | 118 | x.append('Uma string qualquer...') 119 | 120 | 121 | 122 | Exibindo os elementos da lista: 123 | 124 | .. code-block:: python 125 | 126 | print(x) 127 | 128 | .. code-block:: console 129 | 130 | ['a', 'b', 30, 4.0, 'Uma string qualquer...'] 131 | 132 | 133 | 134 | O método extend faz com que os elementos de outra lista sejam adicionadas a 135 | uma lista atual: 136 | 137 | .. code-block:: python 138 | 139 | foo = ['a', 'b', 'c'] # Definição da primeira lista 140 | bar = [1, 2] # Definição da segunda lista 141 | foo.extend(bar) # Extendendo a primeira lista com os elementos da segunda 142 | print(foo) # Exibindo a lista extendida 143 | 144 | .. code-block:: console 145 | 146 | ['a', 'b', 'c', 1, 2] 147 | 148 | 149 | 150 | O operador "+" sendo utilizado para criar uma nova lista a partir de outra somada à outra: 151 | 152 | .. code-block:: python 153 | 154 | y = x + ['abobrinha', '7', {'chave': 'valor'}, ('SP', 'MG', 'PR', 'RO')] 155 | 156 | 157 | 158 | Exibindo a nova lista: 159 | 160 | .. code-block:: python 161 | 162 | y 163 | 164 | .. code-block:: python 165 | 166 | ['a', 167 | 'b', 168 | 30, 169 | 4.0, 170 | 'Uma string qualquer...', 171 | 'abobrinha', 172 | '7', 173 | {'chave': 'valor'}, 174 | ('SP', 'MG', 'PR', 'RO')] 175 | 176 | 177 | 178 | Utilizando "+=" como um atalho para o método extend e exibindo seu novo conteúdo: 179 | 180 | .. code-block:: python 181 | 182 | x += ['xyz'] 183 | x 184 | 185 | .. code-block:: console 186 | 187 | ['a', 'b', 30, 4.0, 'Uma string qualquer...', 'xyz'] 188 | 189 | 190 | 191 | Removendo um elemento da lista e exibindo seu novo conteúdo: 192 | 193 | .. code-block:: python 194 | 195 | x.remove('xyz') 196 | x 197 | 198 | .. code-block:: console 199 | 200 | ['a', 'b', 30, 4.0, 'Uma string qualquer...'] 201 | 202 | 203 | 204 | Método extend com uma lista como parâmetro: 205 | 206 | .. code-block:: python 207 | 208 | x.extend(['xyz']) 209 | x 210 | 211 | .. code-block:: console 212 | 213 | ['a', 'b', 30, 4.0, 'Uma string qualquer...', 'xyz'] 214 | 215 | 216 | 217 | Método extend com uma string como parâmetro: 218 | 219 | .. code-block:: python 220 | 221 | x.extend('xyz') 222 | x 223 | 224 | .. code-block:: console 225 | 226 | ['a', 'b', 30, 4.0, 'Uma string qualquer...', 'xyz', 'x', 'y', 'z'] 227 | 228 | Ao utilizarmos uma string como parâmetro do método extend, a string foi 229 | convertida em lista de forma a transformar cada caractere em elemento 230 | de uma lista. 231 | 232 | 233 | 234 | Método append: 235 | 236 | .. code-block:: python 237 | 238 | x.append('xyz') 239 | x 240 | 241 | .. code-block:: console 242 | 243 | ['a', 'b', 30, 4.0, 'Uma string qualquer...', 'xyz', 'x', 'y', 'z', 'xyz'] 244 | 245 | Aqui podemos ver claramente a diferença entre os métodos extend e append, que 246 | pode causar uma certa confusão inicial para quem está iniciando em Python. 247 | Nota-se que o método append adicionou a string inteira como um novo elemento 248 | da lista. 249 | 250 | 251 | 252 | 253 | Extendendo a lista com o operador "+=": 254 | 255 | .. code-block:: python 256 | 257 | x += 'String' 258 | x 259 | 260 | .. code-block:: console 261 | 262 | ['a', 263 | 'b', 264 | 30, 265 | 4.0, 266 | 'Uma string qualquer...', 267 | 'xyz', 268 | 'x', 269 | 'y', 270 | 'z', 271 | 'xyz', 272 | 'S', 273 | 't', 274 | 'r', 275 | 'i', 276 | 'n', 277 | 'g'] 278 | 279 | Como o operador "+=" ser um atalho para o método extend ele transformou a 280 | string numa lista, uma lista cujos elementos são os caracteres da string. 281 | 282 | 283 | 284 | Tentativa de utilizar o operador "+" em uma lista: 285 | 286 | .. code-block:: python 287 | 288 | x + 'bla bla bla' 289 | 290 | .. code-block:: console 291 | 292 | TypeError: can only concatenate list (not "str") to list 293 | 294 | Não se pode concatenar uma lista com uma string. 295 | 296 | 297 | 298 | Criação de uma nova lista a partir de uma string: 299 | 300 | .. code-block:: python 301 | 302 | z = list('Hobbit') 303 | z 304 | 305 | .. code-block:: console 306 | 307 | ['H', 'o', 'b', 'b', 'i', 't'] 308 | 309 | 310 | 311 | Novamente o método append: 312 | 313 | .. code-block:: python 314 | 315 | z.append('Hobbit') 316 | z 317 | 318 | .. code-block:: console 319 | 320 | ['H', 'o', 'b', 'b', 'i', 't', 'Hobbit'] 321 | 322 | 323 | 324 | Qual o tamanho (quantos elementos) da lista? 325 | 326 | .. code-block:: python 327 | 328 | len(z) 329 | 330 | .. code-block:: console 331 | 332 | 7 333 | 334 | Tamanho 7, posições variam de 0 a 6. 335 | 336 | 337 | 338 | Método insert utilizando a priemira posição (0): 339 | 340 | .. code-block:: python 341 | 342 | z.insert(0, 'Gandalf') 343 | z 344 | 345 | .. code-block:: console 346 | 347 | ['Gandalf', 'H', 'o', 'b', 'b', 'i', 't', 'Hobbit'] 348 | 349 | 350 | 351 | Pode-se também verificar o tamanho de uma lista com o dunder len: 352 | 353 | .. code-block:: python 354 | 355 | z.__len__() 356 | 357 | .. code-block:: console 358 | 359 | 8 360 | 361 | 362 | 363 | Dado que a lista tem 8 (oito) elementos, inserir num novo elemento na nona (8) posição: 364 | 365 | .. code-block:: python 366 | 367 | z.insert(8, 'Bilbo') 368 | z 369 | 370 | .. code-block:: console 371 | 372 | ['Gandalf', 'H', 'o', 'b', 'b', 'i', 't', 'Hobbit', 'Bilbo'] 373 | 374 | O efeito foi o mesmo que utilizar o método append. 375 | 376 | 377 | 378 | O método pop sem parâmetros retorna o último elemento e o apaga da lista: 379 | 380 | .. code-block:: python 381 | 382 | z.pop() 383 | 384 | .. code-block:: console 385 | 386 | 'Bilbo' 387 | 388 | 389 | .. code-block:: python 390 | 391 | z 392 | 393 | 394 | .. code-block:: console 395 | 396 | ['Gandalf', 'H', 'o', 'b', 'b', 'i', 't', 'Hobbit'] 397 | 398 | 399 | 400 | Como o método pop retorna o último elemento, o mesmo pode ser utilizado para atribuição: 401 | 402 | .. code-block:: python 403 | 404 | livro = ('O {}'.format(z.pop())) 405 | livro 406 | 407 | .. code-block:: console 408 | 409 | 'O Hobbit' 410 | 411 | 412 | 413 | Retornando e apagando o sexto elemento: 414 | 415 | .. code-block:: python 416 | 417 | z.pop(5) 418 | 419 | .. code-block:: console 420 | 421 | 'i' 422 | 423 | 424 | 425 | 426 | Método sort, organiza a lista com seus elementos pela ordem alfabética: 427 | 428 | .. code-block:: python 429 | 430 | z.sort() 431 | z 432 | 433 | 434 | 435 | .. code-block:: console 436 | 437 | ['Gandalf', 'H', 'b', 'b', 'i', 'o', 't'] 438 | 439 | 440 | 441 | O método reverse pega a atual posição dos elementos e reconstrói a lista 442 | na ordem reversa: 443 | 444 | .. code-block:: python 445 | 446 | z.reverse() 447 | z 448 | 449 | .. code-block:: python 450 | 451 | ['t', 'o', 'b', 'b', 'H', 'Gandalf'] 452 | 453 | 454 | 455 | A função sorted não altera a lista, apenas retorna o conteúdo pela ordem 456 | alfabética: 457 | 458 | .. code-block:: python 459 | 460 | sorted(z) 461 | 462 | .. code-block:: console 463 | 464 | ['Gandalf', 'H', 'b', 'b', 'o', 't'] 465 | 466 | 467 | .. code-block:: python 468 | 469 | z 470 | 471 | .. code-block:: console 472 | 473 | ['t', 'o', 'i', 'b', 'b', 'H', 'Gandalf'] 474 | 475 | 476 | 477 | A função sorted também pode somente retornar o reverso de uma lista: 478 | 479 | .. code-block:: python 480 | 481 | sorted([1, 2, 3], reverse=True) 482 | 483 | .. code-block:: console 484 | 485 | [3, 2, 1] 486 | 487 | 488 | 489 | Criação de uma lista a partir do retorno de sorted: 490 | 491 | .. code-block:: python 492 | 493 | w = sorted(z) 494 | w 495 | 496 | .. code-block:: console 497 | 498 | ['Gandalf', 'H', 'b', 'b', 'o', 't'] 499 | 500 | .. code-block:: python 501 | 502 | z 503 | 504 | .. code-block:: console 505 | 506 | ['t', 'o', 'b', 'b', 'H', 'Gandalf'] 507 | 508 | 509 | 510 | A função reversed() sempre retorna um iterador: 511 | 512 | > reversed(z) 513 | 514 | 515 | 516 | 517 | 518 | Convertendo para lista o iterador gerado pela função reversed: 519 | 520 | .. code-block:: python 521 | 522 | z = list(reversed(z)) 523 | z 524 | 525 | .. code-block:: console 526 | 527 | ['Gandalf', 'H', 'b', 'b', 'o', 't'] 528 | 529 | 530 | 531 | Função sorted transforma a string numa lista e organiza por ordem 532 | alfabética: 533 | 534 | .. code-block:: python 535 | 536 | sorted('aAcb') 537 | 538 | .. code-block:: console 539 | 540 | ['A', 'a', 'b', 'c'] 541 | 542 | 543 | 544 | Função sorted transforma a string numa lista e organiza por ordem alfabética: 545 | 546 | .. code-block:: python 547 | 548 | sorted('aAcb', reverse=True) 549 | 550 | .. code-block:: console 551 | 552 | ['c', 'b', 'a', 'A'] 553 | 554 | 555 | 556 | Função reversed transforma a string em uma lista com seus caracteres em ordem 557 | reversa: 558 | 559 | .. code-block:: python 560 | 561 | list(reversed('aAcb')) 562 | 563 | .. code-block:: console 564 | 565 | ['b', 'c', 'A', 'a'] 566 | 567 | 568 | 569 | Definição de lista com 3 (três) elementos: 570 | 571 | .. code-block:: python 572 | 573 | x = [1, 2, 3] 574 | 575 | 576 | 577 | A partir da lista "x", atribuir respectivamente seus elementos como valores 578 | para as variáveis à esquerdae exibir seus valores: 579 | 580 | .. code-block:: python 581 | 582 | a, b, c = x 583 | print(a) 584 | 585 | .. code-block:: console 586 | 587 | 1 588 | 589 | .. code-block:: python 590 | 591 | print(b) 592 | 593 | .. code-block:: console 594 | 595 | 2 596 | 597 | .. code-block:: python 598 | 599 | print(c) 600 | 601 | .. code-block:: console 602 | 603 | 3 604 | 605 | 606 | 607 | E se a quantidade de variáveis que receberão os valores forem em menor 608 | número que a quantidade de elementos da lista?: 609 | 610 | .. code-block:: python 611 | 612 | y, z, = x 613 | 614 | .. code-block:: console 615 | 616 | ValueError: too many values to unpack (expected 2) 617 | 618 | Lista com três elementos não pode fazer atribuição respectiva a apenas 619 | duas variáveis. 620 | 621 | 622 | 623 | Utilização do caractere underscore como solução: 624 | 625 | .. code-block:: python 626 | 627 | y, z, _ = x 628 | print(y) 629 | 630 | .. code-block:: console 631 | 632 | 1 633 | 634 | 635 | .. code-block:: python 636 | 637 | print(z) 638 | 639 | .. code-block:: console 640 | 641 | 2 -------------------------------------------------------------------------------- /source/content/open.rst: -------------------------------------------------------------------------------- 1 | open 2 | **** 3 | 4 | 5 | | É a forma nativa de Python para manipular arquivos (leitura e escrita). 6 | | Um arquivo é iterável, cujas iterações são por linha. 7 | 8 | `open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)` 9 | 10 | +---------+--------------------------------------------------------------------------+ 11 | |**Modo** | **Descrição** | 12 | +---------+--------------------------------------------------------------------------+ 13 | | r | Leitura (padrão). | 14 | +---------+--------------------------------------------------------------------------+ 15 | | w | Escrita (novo arquivo, ou se o mesmo existir será truncado). | 16 | +---------+--------------------------------------------------------------------------+ 17 | | x | Cria um novo arquivo e o abre para escrita. | 18 | +---------+--------------------------------------------------------------------------+ 19 | | a | Escrita (append; o novo conteúdo é adicionado ao arquivo pré existente). | 20 | +---------+--------------------------------------------------------------------------+ 21 | | b | Modo binário. | 22 | +---------+--------------------------------------------------------------------------+ 23 | | t | Modo de texto (padrão). | 24 | +---------+--------------------------------------------------------------------------+ 25 | | \+ | Abre um arquivo em disco para a atualização (leitura e escrita). | 26 | +---------+--------------------------------------------------------------------------+ 27 | 28 | 29 | 30 | Supondo que o arquivo não exista, criação do mesmo para leitura e escrita: 31 | 32 | .. code-block:: python 33 | 34 | f = open('/tmp/foo.txt', 'w+') 35 | 36 | 37 | 38 | Verificando o tipo de f: 39 | 40 | .. code-block:: python 41 | 42 | type(f) 43 | 44 | .. code-block:: console 45 | 46 | _io.TextIOWrapper 47 | 48 | 49 | 50 | Escrevendo no arquivo com a função print: 51 | 52 | .. code-block:: python 53 | 54 | print('Teste de escrita em arquivo', file=f) 55 | 56 | 57 | 58 | Uma linha em branco: 59 | 60 | .. code-block:: python 61 | 62 | print(' ', file=f) 63 | 64 | 65 | 66 | Mais uma linha...: 67 | 68 | .. code-block:: python 69 | 70 | print('Uma linha qualquer', file=f) 71 | 72 | 73 | 74 | Fechando o objeto e aplicando todas as escritas feitas: 75 | 76 | .. code-block:: python 77 | 78 | f.close() 79 | 80 | 81 | 82 | Reabrindo o arquivo para somente leitura: 83 | 84 | .. code-block:: python 85 | 86 | f = open('/tmp/foo.txt', 'r') 87 | 88 | 89 | 90 | Imprimir o arquivo em tela linha por linha: 91 | 92 | .. code-block:: python 93 | 94 | for line in f: 95 | print(line.strip('\n')) 96 | 97 | 98 | 99 | Fechamento de arquivo: 100 | 101 | .. code-block:: python 102 | 103 | f.close() 104 | 105 | 106 | 107 | No shell do sistema operacional usar o recurso heredoc para criar linhas em um novo arquivo: 108 | 109 | .. code-block:: bash 110 | 111 | cat << EOF > /tmp/linhas.txt 112 | linha_1 113 | linha_2 114 | linha_3 115 | EOF 116 | 117 | 118 | 119 | Exibir as linhas: 120 | 121 | .. code-block:: bash 122 | 123 | cat /tmp/linhas.txt 124 | 125 | .. code-block:: console 126 | 127 | linha_1 128 | linha_2 129 | linha_3 130 | 131 | 132 | 133 | Em um shell Python abrir o arquivo: 134 | 135 | .. code-block:: python 136 | 137 | f = open('/tmp/linhas.txt') 138 | 139 | 140 | 141 | Método readline: 142 | 143 | .. code-block:: python 144 | 145 | f.readline() 146 | 147 | .. code-block:: console 148 | 149 | 'linha_1\n' 150 | 151 | 152 | 153 | Método split na saída do método readline (3X): 154 | 155 | .. code-block:: python 156 | 157 | f.readline().split() 158 | 159 | .. code-block:: console 160 | 161 | ['linha_2'] 162 | 163 | 164 | .. code-block:: console 165 | 166 | ['linha_3'] 167 | 168 | 169 | .. code-block:: console 170 | 171 | [] 172 | 173 | | O método readline interagiu para cada linha retornando-a até não ter mais nada a ler no arquivo. 174 | 175 | 176 | 177 | Fechando o arquivo: 178 | 179 | .. code-block:: python 180 | 181 | f.close() 182 | 183 | 184 | 185 | Reabrindo o arquivo: 186 | 187 | .. code-block:: python 188 | 189 | f = open('/tmp/linhas.txt') 190 | 191 | 192 | 193 | Método readlines: 194 | 195 | .. code-block:: python 196 | 197 | f.readlines() 198 | 199 | .. code-block:: console 200 | 201 | ['linha_1\n', 'linha_2\n', 'linha_3\n'] 202 | 203 | | O método readlines retorna cada linha do arquivo como um elemento de uma lista. 204 | 205 | 206 | 207 | Fechando o arquivo: 208 | 209 | .. code-block:: python 210 | 211 | f.close() 212 | 213 | 214 | 215 | Criar um script Python cujo comportamento é o mesmo do utilitário shell cat: 216 | 217 | .. code-block:: bash 218 | 219 | vim /tmp/cat.py 220 | 221 | 222 | 223 | Código Python: 224 | 225 | .. code-block:: python 226 | 227 | #!/usr/bin/env python3 228 | #_*_ encoding: utf8 _*_ 229 | 230 | import sys 231 | 232 | # Primeiro argumento do script 233 | f = sys.argv[1] 234 | 235 | # Abrir o arquivo como somente leitura (sobrescreve a variável original) 236 | f = open(f, 'r') 237 | 238 | # Para cada linha imprimir, com o método strip suprimindo linhas em branco 239 | # desnecessárias. (Supressão de \n no final de cada linha) 240 | for i in f: 241 | print(i.strip()) 242 | 243 | f.close() 244 | 245 | 246 | 247 | Tornar o script executável: 248 | 249 | .. code-block:: bash 250 | 251 | chmod +x /tmp/cat.py 252 | 253 | 254 | 255 | Teste do script: 256 | 257 | .. code-block:: bash 258 | 259 | /tmp/cat.py /tmp/linhas.txt 260 | 261 | .. code-block:: console 262 | 263 | linha_1 264 | linha_2 265 | linha_3 266 | 267 | 268 | 269 | Novo arquivo criado via shell do sistema operacional: 270 | 271 | .. code-block:: bash 272 | 273 | cat << EOF > /tmp/cores.txt 274 | 1 - Verde 275 | 2 - Preto 276 | 3 - Branco 277 | EOF 278 | 279 | 280 | 281 | Abrir o arquivo em modo somente leitura: 282 | 283 | .. code-block:: python 284 | 285 | f = open('/tmp/cores.txt', 'r') 286 | 287 | 288 | 289 | Um simples loop for sobre o arquivo: 290 | 291 | .. code-block:: python 292 | 293 | for i in f: 294 | print(i.strip()) 295 | 296 | .. code-block:: python 297 | 298 | 1 - Verde 299 | 2 - Preto 300 | 3 - Branco 301 | 302 | 303 | 304 | Nova execução do loop: 305 | 306 | .. code-block:: python 307 | 308 | for i in f: 309 | print(i.strip()) 310 | 311 | 312 | 313 | Método seek; posição 0 do cursor: 314 | 315 | .. code-block:: python 316 | 317 | f.seek(0) 318 | 319 | 320 | 321 | Nova execução do loop: 322 | 323 | .. code-block:: python 324 | 325 | for i in f: 326 | print(i.strip()) 327 | 328 | .. code-block:: console 329 | 330 | 1 - Verde 331 | 2 - Preto 332 | 3 - Branco 333 | 334 | 335 | 336 | Posição 1: 337 | 338 | .. code-block:: python 339 | 340 | f.seek(1) 341 | 342 | 343 | 344 | Nova execução do loop: 345 | 346 | .. code-block:: python 347 | 348 | for i in f: 349 | print(i.strip()) 350 | 351 | .. code-block:: console 352 | 353 | - Verde 354 | 2 - Preto 355 | 3 - Branco 356 | 357 | 358 | 359 | Posição 0 (zero) do cursor: 360 | 361 | .. code-block:: python 362 | 363 | f.seek(0) 364 | 365 | 366 | 367 | Lê as 7 (sete) primeiras posições: 368 | 369 | .. code-block:: python 370 | 371 | f.read(7) 372 | 373 | .. code-block:: console 374 | 375 | '1 - Ver' 376 | 377 | 378 | 379 | Ler as próximas 7 (sete) posições (repetir): 380 | 381 | .. code-block:: python 382 | 383 | f.read(7) 384 | 385 | .. code-block:: console 386 | 387 | 'de\n2 - ' 388 | 389 | .. code-block:: console 390 | 391 | 'Preto\n3' 392 | 393 | 394 | .. code-block:: console 395 | 396 | ' - Bran' 397 | 398 | 399 | 400 | Fechar o arquivo: 401 | 402 | .. code-block:: python 403 | 404 | f.close() 405 | 406 | 407 | 408 | Verificar se o arquivo está fechado como o atributo closed: 409 | 410 | .. code-block:: python 411 | 412 | f.closed 413 | 414 | .. code-block:: console 415 | 416 | True 417 | 418 | 419 | 420 | Abrir o arquivo como escrita: 421 | 422 | .. code-block:: python 423 | 424 | f = open('/tmp/cores.txt', 'w') 425 | 426 | 427 | 428 | Verificar se o arquivo está fechado como o atributo closed: 429 | 430 | .. code-block:: python 431 | 432 | f.closed 433 | 434 | .. code-block:: console 435 | 436 | False 437 | 438 | 439 | 440 | Fechar o arquivo: 441 | 442 | .. code-block:: python 443 | 444 | f.close() 445 | 446 | 447 | 448 | Verificar o conteúdo do arquivo via shell do sistema operacional: 449 | 450 | .. code-block:: bash 451 | 452 | cat /tmp/cores.txt 453 | 454 | 455 | 456 | Abrir p arquivo como escrita: 457 | 458 | .. code-block:: python 459 | 460 | f = open('/tmp/cores.txt', 'w') 461 | 462 | 463 | 464 | Escrever no arquivo: 465 | 466 | .. code-block:: python 467 | 468 | f.write('1 - Verde\n') 469 | 470 | 471 | 472 | Fechar o arquivo: 473 | 474 | .. code-block:: python 475 | 476 | f.close() 477 | 478 | 479 | 480 | Verificar o conteúdo do arquivo via shell do sistema operacional: 481 | 482 | .. code-block:: bash 483 | 484 | cat /tmp/cores.txt 485 | 486 | .. code-block:: console 487 | 488 | 1 - Verde 489 | 490 | | Todo o conteúdo foi substituído por essa linha... 491 | 492 | 493 | 494 | Exibir a localização do arquivo: 495 | 496 | .. code-block:: python 497 | 498 | print(f.name) 499 | 500 | .. code-block:: console 501 | 502 | /tmp/cores.txt 503 | 504 | 505 | 506 | Abrir o arquivo em modo append: 507 | 508 | .. code-block:: python 509 | 510 | f = open('/tmp/cores.txt', 'a') 511 | 512 | 513 | 514 | Adicionar novas linhas ao arquivo: 515 | 516 | .. code-block:: python 517 | 518 | f.write('2 - Preto\n') 519 | f.write('3 - Branco\n') 520 | 521 | 522 | 523 | Efetivar a escrita no arquivo sem fechá-lo: 524 | 525 | .. code-block:: python 526 | 527 | f.flush() 528 | 529 | 530 | 531 | Verificar o conteúdo do arquivo via shell do sistema operacional: 532 | 533 | .. code-block:: bash 534 | 535 | cat /tmp/cores.txt 536 | 537 | .. code-block:: console 538 | 539 | 1 - Verde 540 | 2 - Preto 541 | 3 - Branco 542 | 543 | 544 | 545 | Fechar o arquivo: 546 | 547 | .. code-block:: python 548 | 549 | f.close() 550 | 551 | 552 | 553 | Abrir o arquivo em modo leitura: 554 | 555 | .. code-block:: python 556 | 557 | f = open('/tmp/cores.txt', 'r') 558 | 559 | 560 | 561 | Método tell; retorna a posição atual: 562 | 563 | .. code-block:: python 564 | 565 | f.tell() 566 | 567 | .. code-block:: console 568 | 569 | 0 570 | 571 | 572 | 573 | Método read: 574 | 575 | .. code-block:: python 576 | 577 | f.read() 578 | 579 | .. code-block:: console 580 | 581 | '1 - Verde\n2 - Preto\n3 - Branco\n' 582 | 583 | 584 | 585 | Veriricando a atual posição: 586 | 587 | .. code-block:: python 588 | 589 | f.tell() 590 | 591 | .. code-block:: console 592 | 593 | 31 594 | 595 | 596 | 597 | Método seek recoloca o cursor na posição 0 (zero): 598 | 599 | .. code-block:: python 600 | 601 | f.seek(0) 602 | 603 | .. code-block:: console 604 | 605 | 0 606 | 607 | 608 | 609 | Método tell confirma: 610 | 611 | .. code-block:: python 612 | 613 | f.tell() 614 | 615 | .. code-block:: console 616 | 617 | 0 618 | 619 | 620 | 621 | Ler 7 (sete) posições adiante: 622 | 623 | .. code-block:: python 624 | 625 | f.read(7) 626 | 627 | .. code-block:: console 628 | 629 | '1 - Ver' 630 | 631 | 632 | 633 | Método tell: 634 | 635 | .. code-block:: python 636 | 637 | f.tell() 638 | 639 | .. code-block:: console 640 | 641 | 7 642 | 643 | 644 | 645 | Fechar o arquivo: 646 | 647 | .. code-block:: python 648 | 649 | f.close() 650 | 651 | 652 | 653 | Criar um novo arquivo como escrita: 654 | 655 | .. code-block:: python 656 | 657 | f = open('/tmp/planetas.txt', 'w') 658 | 659 | 660 | 661 | Tupla com 3 (três) elementos: 662 | 663 | .. code-block:: python 664 | 665 | planetas = ('Saturno\n', 'Urano\n', 'Netuno\n') 666 | 667 | 668 | 669 | Escreve linhas no arquivo com os elementos da tupla: 670 | 671 | .. code-block:: python 672 | 673 | f.writelines(planetas) 674 | 675 | 676 | 677 | Efetiva a escrita: 678 | 679 | .. code-block:: python 680 | 681 | f.flush() 682 | 683 | 684 | 685 | Verificando o conteúdo do arquivo via shell do sistema operacional: 686 | 687 | .. code-block:: bash 688 | 689 | cat /tmp/planetas.txt 690 | 691 | .. code-block:: console 692 | 693 | Saturno 694 | Urano 695 | Netuno 696 | 697 | 698 | 699 | Redefinindo a tupla com outros elementos: 700 | 701 | .. code-block:: python 702 | 703 | planetas = ('Marte\n', 'Vênus\n', 'Plutão\n', 'Júpiter\n') 704 | 705 | 706 | 707 | Escrevendo (adicionando) linhas: 708 | 709 | .. code-block:: python 710 | 711 | f.writelines(planetas) 712 | 713 | 714 | 715 | Fechar o arquivo: 716 | 717 | .. code-block:: python 718 | 719 | f.close() 720 | 721 | 722 | 723 | Verificando o conteúdo do arquivo via shell do sistema operacional: 724 | 725 | .. code-block:: bash 726 | 727 | cat /tmp/planetas.txt 728 | 729 | .. code-block:: console 730 | 731 | Saturno 732 | Urano 733 | Netuno 734 | Marte 735 | Vênus 736 | Plutão 737 | Júpiter -------------------------------------------------------------------------------- /source/content/language_particularities.rst: -------------------------------------------------------------------------------- 1 | Particularidades da Linguagem 2 | ***************************** 3 | 4 | Palavras Reservadas 5 | ------------------- 6 | 7 | Palavras reservadas ou em inglês *keywords* são 8 | 9 | .. code-block:: text 10 | 11 | False class finally is return 12 | None continue for lambda try 13 | True def from nonlocal while 14 | and del global not with 15 | as elif if or yield 16 | assert else import pass 17 | break except in raise 18 | 19 | Podemos verificar as palavras reservdas de Python usando código: 20 | 21 | .. code-block:: python 22 | 23 | from keyword import kwlist as keywords 24 | 25 | for i in keywords: 26 | print(i) 27 | 28 | .. code-block:: console 29 | 30 | . . . 31 | 32 | 33 | 34 | Definição do Interpretador de Comandos 35 | -------------------------------------- 36 | 37 | Para scripts Python, na primeira linha podemos especificar o interpretador de comandos a ser utilizado, também conhecido como shebang; 38 | 39 | .. code-block:: python 40 | :linenos: 41 | 42 | #!/usr/bin/env python3 43 | 44 | .. note:: 45 | 46 | Em ambientes Windows não é preciso espeficar, isso é pertinente a ambientes Unix. 47 | 48 | Codificação (Conjunto de Caracteres - Encoding) 49 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | 51 | É possível utilizar codificações diferentes de ASCII em arquivos de código-fonte. 52 | A melhor maneira de se fazer isso é colocar uma linha especial no começo do arquivo, se foi especificado o interpretador, deve vir logo depois dele: 53 | 54 | .. code-block:: python 55 | :linenos: 56 | 57 | # _*_ encoding: utf-8 _*_ 58 | 59 | 60 | .. code-block:: bash 61 | 62 | vim /tmp/hello.py 63 | 64 | .. code-block:: python 65 | :linenos: 66 | 67 | #!/usr/bin/env python 68 | 69 | print('Olá!') 70 | 71 | .. code-block:: bash 72 | 73 | $ python /tmp/hello.py 74 | 75 | .. code-block:: console 76 | 77 | File "/tmp/hello.py", line 4 78 | SyntaxError: Non-ASCII character '\xc3' in file /tmp/hello.py on line 4, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details 79 | 80 | Editar o script Python: 81 | 82 | .. code-block:: bash 83 | vim /tmp/hello.py 84 | 85 | .. code-block:: python 86 | :linenos: 87 | 88 | #!/usr/bin/env python 89 | #_*_ coding: utf-8 _*_ 90 | 91 | print('Olá!') 92 | 93 | Executar o script: 94 | 95 | .. code-block:: bash 96 | 97 | python /tmp/hello.py 98 | 99 | .. code-block:: console 100 | 101 | Olá! 102 | 103 | Case Sensitive 104 | -------------- 105 | 106 | Python é case sensitive, ou seja, letras maiúsculas e minúsculas são interpretadas de formas diferentes. 107 | 108 | 109 | .. code-block:: python 110 | 111 | foo = 'bar' 112 | Foo = 'foo' 113 | print(foo) 114 | 115 | .. code-block:: console 116 | 117 | bar 118 | 119 | .. code-block:: python 120 | 121 | print(Foo) 122 | 123 | .. code-block:: console 124 | 125 | foo 126 | 127 | Não Suporta Sobrecarga de Funções / Métodos 128 | ------------------------------------------- 129 | 130 | Àqueles que vêm de Java deve estranhar dentre outras coisas o fato de Python não suportar sobrecarga de funções e métodos. 131 | Quando uma mesma função é escrita duas ou mais vezes, o que prevalece é a última definição. 132 | 133 | .. code-block:: python 134 | 135 | # Definição da função sem parâmetro 136 | def hello_world(): 137 | print('Hello World') 138 | 139 | # (Re)Definição da função com um parâmetro 140 | def hello_world(string): 141 | print(string) 142 | 143 | # Tentativa de execução sem parâmetro 144 | hello_world() 145 | 146 | .. code-block:: console 147 | 148 | Traceback (most recent call last): 149 | File "", line 1, in 150 | hello_world() 151 | TypeError: hello_world() missing 1 required positional argument: 'string' 152 | 153 | 154 | .. code-block:: python 155 | 156 | hello_world('foo') 157 | 158 | .. code-block:: console 159 | 160 | foo 161 | 162 | Orientada a Objetos 163 | ------------------- 164 | 165 | Em Python tudo é objeto. 166 | Ainda fazendo comparação com o mundo Java, em Python não existem tipos primitivos. 167 | Até mesmo um número inteiro é uma instância de int e tem seus atributos e métodos. 168 | 169 | 170 | .. code-block:: python 171 | x = 45 172 | x.__hex__() 173 | 174 | .. code-block:: console 175 | 176 | '0x2d' 177 | 178 | .. code-block:: python 179 | 180 | x.real 181 | 182 | .. code-block:: console 183 | 184 | 45 185 | 186 | .. code-block:: python 187 | 188 | x.imag 189 | 190 | .. code-block:: console 191 | 192 | 0 193 | 194 | 195 | A criação de classes em Python é extremamente simples, sendo que uma classe primária a herança é 196 | feita da classe object e cada classe pode herdar mais de uma. Ou seja, também é aceita herança múltipla. 197 | 198 | 199 | .. code-block:: python 200 | 201 | class Carro(object): 202 | marca = '' 203 | modelo = '' 204 | ano = 0 205 | 206 | c1 = Carro() 207 | 208 | c1.marca = 'Porsche' 209 | 210 | c1.modelo = 'Carrera' 211 | 212 | c1.ano = 1995 213 | 214 | print('O {} {} fabricado em {} estava estacionado.'.format(c1.marca, c1.modelo, c1.ano)) 215 | 216 | .. code-block:: console 217 | 218 | O Porsche Carrera fabricado em 1995 estava estacionado. 219 | 220 | 221 | .. code-block:: python 222 | 223 | class Animal(object): 224 | peso = 0.0 225 | 226 | class Humano(Animal): 227 | quoficiente_inteligencia = 0.0 228 | 229 | class Touro(Animal): 230 | envergadura_chifre = 0.0 231 | 232 | class Minotauro(Humano, Animal): 233 | pass 234 | 235 | 236 | Tipagem Dinâmica 237 | ---------------- 238 | 239 | O interpretador define o tipo de acordo com o valor atribuído à variável. 240 | A mesma variável pode ter seu tipo mudado de acordo com valores a ela atribuídos ao longo do código-fonte e em seu tempo de execução. 241 | 242 | .. code-block:: python 243 | 244 | foo = 'bar' 245 | type(foo) 246 | 247 | .. code-block:: console 248 | 249 | str 250 | 251 | .. code-block:: python 252 | 253 | foo = 123 254 | type(foo) 255 | 256 | .. code-block:: console 257 | 258 | int 259 | 260 | .. code-block:: python 261 | 262 | foo = 7.0 263 | type(foo) 264 | 265 | .. code-block:: console 266 | 267 | float 268 | 269 | 270 | 271 | Tipagem Forte 272 | ------------- 273 | 274 | O interpretador verifica se a operação é válida e não faz coerção automática entre tipos incompatíveis. Caso haja operações de tipos incompatíveis é preciso fazer a conversão explícita da variável ou variáveis antes da operação. 275 | 276 | .. code-block:: python 277 | 278 | foo = '2' 279 | bar = 5 280 | type(foo) 281 | 282 | .. code-block:: console 283 | 284 | 285 | 286 | .. code-block:: python 287 | 288 | type(bar) 289 | 290 | .. code-block:: console 291 | 292 | 293 | 294 | .. code-block:: python 295 | 296 | foobar = foo + bar 297 | 298 | 299 | .. code-block:: console 300 | 301 | Traceback (most recent call last): 302 | File "", line 1, in 303 | foobar = foo + bar 304 | TypeError: can only concatenate str (not "int") to str 305 | 306 | .. code-block:: python 307 | 308 | foobar = int(foo) + bar 309 | print(foobar) 310 | 311 | .. code-block:: console 312 | 313 | 7 314 | 315 | .. code-block:: python 316 | 317 | foo = 2.0 318 | type(foo) 319 | 320 | .. code-block:: console 321 | 322 | 323 | 324 | 325 | .. code-block:: python 326 | 327 | bar = 5 328 | type(bar) 329 | 330 | .. code-block:: console 331 | 332 | 333 | 334 | .. code-block:: python 335 | 336 | foobar = foo + bar 337 | print(foobar) 338 | 339 | .. code-block:: console 340 | 341 | 7.0 342 | 343 | Bytecode 344 | -------- 345 | 346 | Formato binário multiplataforma resultante da compilação de um código Python. 347 | 348 | 349 | Criação de estrutura de diretórios para teste de pacote e bytecode: 350 | 351 | .. code-block:: bash 352 | 353 | mkdir -p /tmp/python/PacoteA/PacoteA1 354 | 355 | Editar o módulo "Modulo1" que está dentro do pacote "PacoteA": 356 | 357 | .. code-block:: bash 358 | 359 | vim /tmp/python/PacoteA/Modulo1.py 360 | 361 | 362 | .. code-block:: python 363 | :linenos: 364 | 365 | def funcao(): 366 | print('Hello World!!!') 367 | 368 | Editar o módulo "Modulo2" que está dentro do pacote "PacoteA": 369 | 370 | .. code-block:: bash 371 | 372 | vim /tmp/python/PacoteA/PacoteA1/Modulo2.py 373 | 374 | 375 | .. code-block:: python 376 | :linenos: 377 | 378 | def funcao(numero): 379 | print(numero ** 3) 380 | 381 | 382 | Edição de script de exemplo: 383 | 384 | .. code-block:: bash 385 | 386 | vim /tmp/python/foo.py 387 | 388 | .. code-block:: python 389 | :linenos: 390 | 391 | #!/usr/bin/env python 392 | # _*_ encoding: utf-8 _*_ 393 | 394 | from PacoteA.Modulo1 import funcao 395 | from PacoteA.PacoteA1 import Modulo2 396 | 397 | print('\nAtenção!!!\n') 398 | print('O teste vai começar...\n') 399 | 400 | funcao() 401 | 402 | Modulo2.funcao(3) 403 | 404 | Execução do script: 405 | 406 | .. code-block:: bash 407 | 408 | python3 /tmp/python/foo.py 409 | 410 | .. code-block:: console 411 | 412 | Atenção!!! 413 | 414 | O teste vai começar... 415 | 416 | Hello World!!! 417 | 27 418 | 419 | Quando um módulo é carregado pela primeira vez ou se seu código é mais novo do que o arquivo binário ele é compilado e então gera ou gera novamente o arquivo binário .pyc. 420 | 421 | Listar o conteúdo de "PacoteA": 422 | 423 | .. code-block:: bash 424 | 425 | ls /tmp/python/PacoteA/ 426 | 427 | .. code-block:: console 428 | 429 | Modulo1.py PacoteA1 __pycache__ 430 | 431 | 432 | Listar o conteúdo de __pycache__: 433 | 434 | .. code-block:: bash 435 | 436 | ls /tmp/python/PacoteA/__pycache__/ 437 | 438 | .. code-block:: console 439 | 440 | Modulo1.cpython-36.pyc 441 | 442 | 443 | Com o comando "file" verificar informações de tipo de arquivo: 444 | 445 | .. code-block:: bash 446 | 447 | file /tmp/python/PacoteA/__pycache__/Modulo1.cpython-36.pyc 448 | 449 | .. code-block:: console 450 | 451 | /tmp/python/PacoteA/__pycache__/Modulo1.cpython-36.pyc: python 3.6 byte-compiled 452 | 453 | Quebra de linhas 454 | ---------------- 455 | 456 | Pode ser usada a barra invertida ou por vírgula. 457 | 458 | .. code-block:: python 459 | 460 | varTeste = 3 * 5 + \ 461 | (10 + 7) 462 | 463 | varLista = [7,14,25, 464 | 81,121] 465 | 466 | 467 | Blocos 468 | ------ 469 | 470 | São delimitados por endentação e a linha anterior ao bloco sempre termina com dois pontos. 471 | 472 | 473 | .. code-block:: python 474 | 475 | #Definição de uma classe 476 | class Carro(object): 477 | ano = 0 478 | marca = '' 479 | estado_farois = False 480 | 481 | #Definição de um método da classe 482 | def interruptor_farois(self): 483 | #Bloco if 484 | if(self.estado_farois): 485 | print('Apagando faróis') 486 | self.estado_farois = False 487 | else: 488 | print('Acendendo faróis') 489 | self.estado_farois = True 490 | 491 | Comentários 492 | ----------- 493 | 494 | Inicia-se com o caractere "#" em cada linha. 495 | 496 | .. code-block:: python 497 | 498 | # um simples comentário 499 | 500 | # A seguir uma soma 501 | 502 | x = 5 + 2 503 | 504 | print(x) # Imprime o valor de x 505 | 506 | 507 | Docstrings ou Strings de Múltiplas Linhas 508 | ----------------------------------------- 509 | 510 | Feitos dentro de funções e classes, que geram documentação automaticamente que pode ser acessado pela função help(). 511 | São usados três pares de apóstrofos (') ou três pares de aspas ("), 3 (três) no início e 3 (três) no fim. 512 | 513 | 514 | .. code-block:: python 515 | 516 | # Com apóstrofos 517 | 518 | '''Esta função faz isso de forma 519 | x, y e z além de bla bla bla bla''' 520 | 521 | # Com aspas 522 | 523 | """Esta função faz isso de forma 524 | x, y e z além de bla bla bla bla""" 525 | 526 | Recurso para criar documentação automaticamente: 527 | 528 | .. code-block:: python 529 | 530 | def funcao(): 531 | '''Esta função não faz absolutamente nada''' 532 | 533 | help(funcao) 534 | 535 | .. code-block:: console 536 | 537 | Help on function funcao in module __main__: 538 | 539 | funcao() 540 | Esta função não faz absolutamente nada 541 | 542 | 543 | Operadores 544 | ---------- 545 | 546 | Python suporta operadores dos tipos: 547 | 548 | * Aritiméticos: +, -, *, /, //, **, %; 549 | * Relacionais: >, <, >=, >=, ==, !=; 550 | * Atribuição: =, +=, +=, -=, /=, *=, %=, **=, //=; 551 | * Lógicos: and, or, not; 552 | * Associação: in, not in; 553 | * Identidade: is, is not; 554 | * Bitwise: &, |, ^, ~, <<, >>. 555 | 556 | Operadores serão discutidos em mais detalhes em um capítulo posterior. 557 | 558 | O Comando del 559 | ------------- 560 | 561 | Este comando tem como objetivo remover a referência de um objeto. 562 | Se esse objeto não tiver outra referência, o garbage collector atuará liberando recursos. 563 | 564 | .. code-block:: python 565 | 566 | sogra = 'Edelbarina' 567 | print(sogra) 568 | 569 | .. code-block:: console 570 | 571 | Edelbarina 572 | 573 | .. code-block:: python 574 | 575 | del sogra 576 | print(sogra) 577 | 578 | .. code-block:: console 579 | 580 | Traceback (most recent call last): 581 | File "", line 1, in 582 | NameError: name 'sogra' is not defined 583 | 584 | .. code-block:: python 585 | 586 | a = ['Z', 1, 5, 'm'] 587 | del a[2] 588 | print(a) 589 | 590 | .. code-block:: console 591 | 592 | ['Z', 1, 'm'] 593 | 594 | 595 | print 596 | ----- 597 | 598 | Antes era somente um comando, a partir da série 3.X será apenas interpretado como função. 599 | 600 | .. code-block:: python 601 | 602 | print('Teste') 603 | 604 | .. code-block:: console 605 | 606 | Teste 607 | 608 | 609 | 610 | Referência de Identificadores 611 | ----------------------------- 612 | 613 | .. code-block:: python 614 | 615 | x = 7 616 | y = x 617 | z = x 618 | 619 | id(x) 620 | 621 | .. code-block:: console 622 | 623 | 29786312 624 | 625 | .. code-block:: python 626 | 627 | id(y) 628 | 629 | .. code-block:: console 630 | 631 | 29786312 632 | 633 | .. code-block:: python 634 | 635 | id(z) 636 | 637 | .. code-block:: console 638 | 639 | 29786312 640 | 641 | 3 (três) referências ao mesmo objeto 642 | 643 | 644 | .. code-block:: python 645 | 646 | del x 647 | 648 | Agora são 2 (duas) referências... 649 | 650 | .. code-block:: python 651 | 652 | print(y) 653 | 654 | .. code-block:: console 655 | 656 | 7 657 | 658 | .. code-block:: python 659 | 660 | del y 661 | 662 | Resta apenas 1 (uma) referência... 663 | 664 | .. code-block:: python 665 | 666 | print(z) 667 | 668 | .. code-block:: console 669 | 670 | 7 671 | 672 | .. code-block:: python 673 | 674 | del z 675 | 676 | O contador de referências chegou a 0 (zero), ou seja, não há mais referência para o objeto. 677 | Então entra em ação o Garbage Collector para limpar a memória. -------------------------------------------------------------------------------- /source/content/except.rst: -------------------------------------------------------------------------------- 1 | Exceções 2 | ******** 3 | 4 | .. https://docs.python.org/3/tutorial/errors.html 5 | .. https://docs.python.org/3/library/exceptions.html 6 | 7 | 8 | **Blocos de Comandos**: 9 | 10 | - | try: Tenta executar o bloco de comandos; 11 | - | except: Em outras linguagens de programação é conhecido como "catch", 12 | | captura e trata a exceção; 13 | - | else: Só é executado se não tiver nenhuma exceção; 14 | - | finally: Tendo exceção ou não é executado de qualquer jeito. 15 | 16 | :: 17 | 18 | try: 19 | | 20 | Deu erro? 21 | / \ 22 | Sim / \ Não 23 | / \ 24 | / \ 25 | else: except: 26 | \ / 27 | \ / 28 | \ / 29 | \ / 30 | finally: 31 | 32 | 33 | `Hierarquia de classes built-in de exceções `_: 34 | 35 | :: 36 | 37 | BaseException 38 | +-- SystemExit 39 | +-- KeyboardInterrupt 40 | +-- GeneratorExit 41 | +-- Exception 42 | +-- StopIteration 43 | +-- StopAsyncIteration 44 | +-- ArithmeticError 45 | | +-- FloatingPointError 46 | | +-- OverflowError 47 | | +-- ZeroDivisionError 48 | +-- AssertionError 49 | +-- AttributeError 50 | +-- BufferError 51 | +-- EOFError 52 | +-- ImportError 53 | | +-- ModuleNotFoundError 54 | +-- LookupError 55 | | +-- IndexError 56 | | +-- KeyError 57 | +-- MemoryError 58 | +-- NameError 59 | | +-- UnboundLocalError 60 | +-- OSError 61 | | +-- BlockingIOError 62 | | +-- ChildProcessError 63 | | +-- ConnectionError 64 | | | +-- BrokenPipeError 65 | | | +-- ConnectionAbortedError 66 | | | +-- ConnectionRefusedError 67 | | | +-- ConnectionResetError 68 | | +-- FileExistsError 69 | | +-- FileNotFoundError 70 | | +-- InterruptedError 71 | | +-- IsADirectoryError 72 | | +-- NotADirectoryError 73 | | +-- PermissionError 74 | | +-- ProcessLookupError 75 | | +-- TimeoutError 76 | +-- ReferenceError 77 | +-- RuntimeError 78 | | +-- NotImplementedError 79 | | +-- RecursionError 80 | +-- SyntaxError 81 | | +-- IndentationError 82 | | +-- TabError 83 | +-- SystemError 84 | +-- TypeError 85 | +-- ValueError 86 | | +-- UnicodeError 87 | | +-- UnicodeDecodeError 88 | | +-- UnicodeEncodeError 89 | | +-- UnicodeTranslateError 90 | +-- Warning 91 | +-- DeprecationWarning 92 | +-- PendingDeprecationWarning 93 | +-- RuntimeWarning 94 | +-- SyntaxWarning 95 | +-- UserWarning 96 | +-- FutureWarning 97 | +-- ImportWarning 98 | +-- UnicodeWarning 99 | +-- BytesWarning 100 | +-- ResourceWarning 101 | 102 | 103 | 104 | Forçando um erro dividindo por zero: 105 | 106 | .. code-block:: python 107 | 108 | print(1 / 0) 109 | 110 | .. code-block:: console 111 | 112 | --------------------------------------------------------------------------- 113 | ZeroDivisionError Traceback (most recent call last) 114 | in () 115 | ----> 1 print('Resultado = %s' % (x / y)) 116 | 117 | ZeroDivisionError: integer division or modulo by zero 118 | 119 | 120 | 121 | bla bla bla: 122 | 123 | .. code-block:: python 124 | 125 | try: 126 | print(1 / 0) 127 | 128 | # catch all exceptions 129 | except: 130 | print('\n\nErro: Não dividirás por zero!\n\n') 131 | 132 | .. code-block:: console 133 | 134 | Erro: Não dividirás por zero! 135 | 136 | 137 | 138 | Utilizando try e forçando um erro de divisão por zero: 139 | 140 | .. code-block:: python 141 | 142 | try: 143 | print(1 / 0) 144 | # specified exception 145 | except ZeroDivisionError: 146 | print('\n\nErro: Não dividirás por zero!\n\n') 147 | 148 | 149 | .. code-block:: console 150 | 151 | Erro: Não dividirás por zero! 152 | 153 | 154 | .. code-block:: python 155 | 156 | numeros = ('zero', 'um', 'dois') 157 | 158 | try: 159 | print(numeros[0]) 160 | print(numeros[1]) 161 | print(numeros[2]) 162 | print(numeros[3]) 163 | except IndexError: 164 | print('\n\nERRO: Índice não encontrado\n\n') 165 | 166 | .. code-block:: console 167 | 168 | zero 169 | um 170 | dois 171 | 172 | ERRO: Índice não encontrado 173 | 174 | 175 | 176 | sasasasasa: 177 | 178 | .. code-block:: python 179 | 180 | try: 181 | print(numeros[0]) 182 | print(numeros[1]) 183 | print(numeros[2]) 184 | print(numeros[3]) 185 | except IndexError, e: 186 | print('\n\nERRO: Índice não encontrado\n\n%s' % e) 187 | 188 | .. code-block:: console 189 | 190 | zero 191 | um 192 | dois 193 | 194 | 195 | ERRO: Índice não encontrado 196 | 197 | tuple index out of range 198 | 199 | O "e" é a mensagem de erro "tuple index out of range" 200 | 201 | 202 | 203 | ssdsdpsdsd: 204 | 205 | .. code-block:: bash 206 | 207 | $ vim excecao.py 208 | 209 | .. code-block:: python 210 | 211 | #_*_ encoding: utf-8 _*_ 212 | 213 | import sys 214 | 215 | numeros = ('zero', 'um', 'dois') 216 | 217 | try: 218 | print(numeros[0]) 219 | print(numeros[1]) 220 | print(numeros[2]) 221 | print(numeros[3]) 222 | except IndexError, e: 223 | print >> sys.stderr, '\n\nERRO: Índice não encontrado\n\n%s' % e 224 | sys.exit(1) 225 | 226 | 227 | 228 | sdsdsdsd: 229 | 230 | .. code-block:: bash 231 | 232 | python excecao.py 233 | 234 | .. code-block:: console 235 | 236 | zero 237 | um 238 | dois 239 | 240 | 241 | ERRO: Índice não encontrado 242 | 243 | tuple index out of range 244 | 245 | 246 | ddsdsd: 247 | 248 | .. code-block:: bash 249 | 250 | echo $? 251 | 252 | .. code-block:: console 253 | 254 | 1 255 | 256 | 257 | 258 | sdsdsdsdsdsd: 259 | 260 | .. code-block:: bash 261 | 262 | vim excecao3.py 263 | 264 | .. code-block:: python 265 | 266 | #_*_ encoding: utf-8 _*_ 267 | 268 | import sys 269 | 270 | numeros = ('zero', 'um', 'dois') 271 | 272 | try: 273 | print(numeros[0]) 274 | print(numeros[1]) 275 | print(numeros[2]) 276 | print(numeros[3]) 277 | except IndexError as e: 278 | print('\n\nERRO: Índice não encontrado\n\n%s' % e, file = sys.stderr) 279 | sys.exit(1) 280 | 281 | 282 | 283 | sdsdsd: 284 | 285 | .. code-block:: bash 286 | 287 | python3 excecao3.py 288 | 289 | .. code-block:: console 290 | 291 | zero 292 | um 293 | dois 294 | 295 | 296 | ERRO: Índice não encontrado 297 | 298 | tuple index out of range 299 | 300 | 301 | 302 | sdsdsdsd: 303 | 304 | .. code-block:: bash 305 | 306 | echo $? 307 | 308 | .. code-block:: console 309 | 310 | 1 311 | 312 | 313 | 314 | sddsdsdsdsd: 315 | 316 | .. code-block:: python 317 | 318 | f = open('/tmp/blablabla.txt', 'r') 319 | 320 | .. code-block:: console 321 | 322 | --------------------------------------------------------------------------- 323 | IOError Traceback (most recent call last) 324 | in () 325 | ----> 1 f = open('/tmp/blablabla.txt', 'r') 326 | 327 | IOError: [Errno 2] No such file or directory: '/tmp/blablabla.txt' 328 | 329 | 330 | 331 | sddsdsdsd: 332 | 333 | .. code-block:: python 334 | 335 | try: 336 | f = open('/tmp/blablabla.txt', 'r') 337 | except IOError as e: 338 | print('O arquivo não existe!') 339 | 340 | .. code-block:: python 341 | 342 | O arquivo não existe! 343 | 344 | 345 | 346 | sdsdsdsd: 347 | 348 | .. code-block:: python 349 | 350 | type(e) 351 | 352 | .. code-block:: console 353 | 354 | IOError 355 | 356 | 357 | 358 | sdsdssdsdsd: 359 | 360 | .. code-block:: python 361 | 362 | dir(e) 363 | 364 | .. code-block:: console 365 | 366 | ['__class__', 367 | '__delattr__', 368 | '__dict__', 369 | '__doc__', 370 | '__format__', 371 | '__getattribute__', 372 | '__getitem__', 373 | '__getslice__', 374 | '__hash__', 375 | '__init__', 376 | '__new__', 377 | '__reduce__', 378 | '__reduce_ex__', 379 | '__repr__', 380 | '__setattr__', 381 | '__setstate__', 382 | '__sizeof__', 383 | '__str__', 384 | '__subclasshook__', 385 | '__unicode__', 386 | 'args', 387 | 'errno', 388 | 'filename', 389 | 'message', 390 | 'strerror'] 391 | 392 | 393 | 394 | dsdsdsdsd: 395 | 396 | .. code-block:: python 397 | 398 | repr(e) 399 | 400 | .. code-block:: console 401 | 402 | "IOError(2, 'No such file or directory')" 403 | 404 | 405 | sdsdsdsdsd: 406 | 407 | .. code-block:: python 408 | 409 | e. 410 | 411 | .. code-block:: console 412 | 413 | e.args e.errno e.filename e.message e.strerror 414 | 415 | 416 | 417 | sdsddssd: 418 | 419 | .. code-block:: python 420 | 421 | print(e.errno) 422 | 423 | .. code-block:: console 424 | 425 | 2 426 | 427 | 428 | 429 | sdsdsdsdsd: 430 | 431 | .. code-block:: bash 432 | 433 | vim excecao.py 434 | 435 | .. code-block:: python 436 | 437 | #_*_ encoding: utf-8 _*_ 438 | 439 | import sys 440 | 441 | try: 442 | f = open('/tmp/blablabla.txt', 'r') 443 | 444 | except IOError as e: 445 | print >> sys.stderr, '\n\nERRO: Arquivo não encontrado\n\n%s' % e 446 | sys.exit(e.errno) 447 | 448 | 449 | 450 | sddssd: 451 | 452 | .. code-block:: bash 453 | 454 | python excecao.py 455 | 456 | .. code-block:: console 457 | 458 | ERRO: Arquivo não encontrado 459 | 460 | [Errno 2] No such file or directory: '/tmp/blablabla.txt' 461 | 462 | 463 | 464 | sdsdklsdkkl: 465 | 466 | .. code-block:: bash 467 | 468 | echo $? 469 | 470 | .. code-block:: console 471 | 472 | 2 473 | 474 | 475 | 476 | sdsdsdsdd: 477 | 478 | .. code-block:: bash 479 | 480 | vim excecao3.py 481 | 482 | 483 | 484 | .. code-block:: python 485 | 486 | #_*_ encoding: utf-8 _*_ 487 | 488 | import sys 489 | 490 | try: 491 | f = open('/tmp/blablabla.txt', 'r') 492 | 493 | except IOError as e: 494 | print('\n\nERRO: Arquivo não encontrado\n\n%s' % e, file = sys.stderr) 495 | sys.exit(e.errno) 496 | 497 | 498 | 499 | sdsdsdsdsd: 500 | 501 | .. code-block:: bash 502 | 503 | python3 excecao3.py 504 | 505 | .. code-block:: console 506 | 507 | ERRO: Arquivo não encontrado 508 | 509 | [Errno 2] No such file or directory: '/tmp/blablabla.txt' 510 | 511 | 512 | 513 | sdsddssd: 514 | 515 | .. code-block:: bash 516 | 517 | echo $? 518 | 519 | .. code-block:: console 520 | 521 | 2 522 | 523 | 524 | 525 | 526 | else 527 | ---- 528 | 529 | 530 | 531 | .. code-block:: bash 532 | 533 | vim excecao.py 534 | 535 | .. code-block:: python 536 | 537 | #_*_ encoding: utf-8 _*_ 538 | 539 | import sys 540 | 541 | f = sys.argv[1] 542 | 543 | try: 544 | f = open(f, 'r') 545 | 546 | except IOError: 547 | print('Não existe o arquivo') 548 | 549 | else: 550 | print('Sim, o arquivo existe!') 551 | f.close() 552 | 553 | 554 | 555 | ewowewewe: 556 | 557 | .. code-block:: bash 558 | 559 | python excecao.py /tmp/blablabla.txt 560 | 561 | .. code-block:: console 562 | 563 | Não existe o arquivo 564 | 565 | 566 | 567 | ewewewewe: 568 | 569 | .. code-block:: bash 570 | 571 | touch /tmp/blablabla.txt 572 | python excecao.py /tmp/blablabla.txt 573 | 574 | .. code-block:: console 575 | 576 | Sim, o arquivo existe! 577 | 578 | 579 | 580 | dsdsdsdsd: 581 | 582 | .. code-block:: bash 583 | 584 | rm /tmp/blablabla.txt 585 | 586 | 587 | 588 | finally 589 | ------- 590 | 591 | 592 | 593 | .. code-block:: bash 594 | 595 | vim excecao.py 596 | 597 | 598 | .. code-block:: python 599 | 600 | #_*_ encoding: utf-8 _*_ 601 | 602 | import sys 603 | 604 | f = sys.argv[1] 605 | 606 | try: 607 | f = open(f, 'r') 608 | 609 | except IOError: 610 | print('Não existe o arquivo') 611 | 612 | else: 613 | print('Sim, o arquivo existe!') 614 | f.close() 615 | 616 | finally: 617 | print('Se deu certo ou errado, o programa termina aqui :/') 618 | 619 | 620 | 621 | dsdsdsdsd: 622 | 623 | .. code-block:: bash 624 | 625 | python excecao.py /tmp/blablabla.txt 626 | 627 | .. code-block:: console 628 | 629 | Não existe o arquivo 630 | 631 | Se deu certo ou errado, o programa termina aqui :/ 632 | 633 | 634 | 635 | sdsdsd: 636 | 637 | .. code-block:: bash 638 | 639 | touch /tmp/blablabla.txt 640 | python excecao.py /tmp/blablabla.txt 641 | 642 | .. code-block:: console 643 | 644 | Sim, o arquivo existe! 645 | 646 | Se deu certo ou errado, o programa termina aqui :/ 647 | 648 | 649 | raise 650 | ----- 651 | 652 | sasasasa: 653 | 654 | .. code-block:: python 655 | 656 | raise Exception('Provocando uma exceção') 657 | 658 | .. code-block:: console 659 | 660 | --------------------------------------------------------------------------- 661 | Exception Traceback (most recent call last) 662 | in () 663 | ----> 1 raise Exception('Provocando uma exceção') 664 | 665 | Exception: Provocando uma exceção 666 | 667 | 668 | 669 | saassasasa: 670 | 671 | .. code-block:: python 672 | 673 | try: 674 | raise ZeroDivisionError() 675 | except IOError: 676 | print('Exceção IOError') 677 | except IndexError: 678 | print('Exceção IndexError') 679 | except: 680 | print('Exceção não declarada') 681 | 682 | .. code-block:: console 683 | 684 | Exceção não declarada 685 | 686 | 687 | 688 | ewwewewe: 689 | 690 | .. code-block:: python 691 | 692 | try: 693 | raise ZeroDivisionError('Erro de divisão por zero') 694 | except IOError: 695 | print('Exceção IOError') 696 | except IndexError: 697 | print('Exceção IndexError') 698 | except ZeroDivisionError: 699 | print('Exceção ZeroDivisionError') 700 | except: 701 | print('Exceção não declarada') 702 | 703 | .. code-block:: console 704 | 705 | Exceção ZeroDivisionError 706 | 707 | 708 | 709 | osdkskldskl: 710 | 711 | .. code-block:: python 712 | 713 | try: 714 | raise ZeroDivisionError('Erro de divisão por zero') 715 | except IOError: 716 | print('Exceção IOError') 717 | except IndexError: 718 | print('Exceção IndexError') 719 | except ZeroDivisionError: 720 | print('Exceção ZeroDivisionError') 721 | except Exception: 722 | print('Exceção não declarada') 723 | 724 | .. code-block:: console 725 | 726 | Exceção ZeroDivisionError 727 | 728 | 729 | 730 | ssdsdpsdsd: 731 | 732 | .. code-block:: python 733 | 734 | try: 735 | raise ZeroDivisionError('Erro de divisão por zero') 736 | except IOError: 737 | print('Exceção IOError') 738 | except IndexError: 739 | print('Exceção IndexError') 740 | except ZeroDivisionError: 741 | print('Exceção ZeroDivisionError') 742 | raise 743 | except Exception: 744 | print('Exceção não declarada') 745 | 746 | .. code-block:: console 747 | 748 | Exceção ZeroDivisionError 749 | --------------------------------------------------------------------------- 750 | ZeroDivisionError Traceback (most recent call last) 751 | in () 752 | 1 try: 753 | ----> 2 raise ZeroDivisionError('Erro de divisão por zero') 754 | 3 except IOError: 755 | 4 print('Exceção IOError') 756 | 5 except IndexError: 757 | 758 | ZeroDivisionError: Erro de divisão por zero 759 | 760 | 761 | 762 | Exceção Personalizada 763 | --------------------- 764 | 765 | Para criarmos uma exceção personalizada preciamos criar uma classe que herde 766 | de uma outra classe de exceção, cuja raiz é Exception. 767 | 768 | 769 | 770 | DSSDSDSD: 771 | 772 | .. code-block:: python 773 | 774 | class FooException(Exception): 775 | pass 776 | 777 | try: 778 | raise FooException('Bla bla bla') 779 | except Exception as e: 780 | print('Erro ------> %s' % e) 781 | 782 | 783 | .. code-block:: console 784 | 785 | Erro ------> Bla bla bla 786 | 787 | 788 | 789 | sdsdksdsd: 790 | 791 | .. code-block:: python 792 | 793 | class EggsException(Exception): 794 | def __init__(self, value): 795 | self.value = value 796 | def __str__(self): 797 | return self.value 798 | 799 | try: 800 | raise EggsException(50) 801 | except EggsException as e: 802 | print('Ocorreu um erro da minha exceção, cujo valor é %s' % (e.value)) 803 | 804 | .. code-block:: console 805 | 806 | Ocorreu um erro da minha exceção, cujo valor é 50 807 | 808 | 809 | 810 | sdaasasa: 811 | 812 | .. code-block:: python 813 | 814 | raise EggsException('bla bla bla') 815 | 816 | .. code-block:: console 817 | 818 | --------------------------------------------------------------------------- 819 | EggsException Traceback (most recent call last) 820 | in () 821 | ----> 1 raise EggsException('bla bla bla') 822 | 823 | EggsException: bla bla bla -------------------------------------------------------------------------------- /source/content/functions.rst: -------------------------------------------------------------------------------- 1 | Funções 2 | ******* 3 | 4 | | Uma funçao é um recurso de linguagens de programação, que armazena instruções contidas em um bloco de forma a evitar escrever novamente essas mesmas instruções reaproveitando o código ali escrito. 5 | | No âmbito (escopo) da função podem ser definidas variáveis que só terão visibilidade dentro da função. 6 | | Após definida a função, a mesma é invocada pelo seu nome e seus argumentos (se ela requerir). 7 | | Funções em Python são definidas a partir do comando def. 8 | | Funções ajudam o código a dividir, agrupar, reusar, reduzir, deixar mais legível além de ser uma boa prática. 9 | 10 | 11 | Funções sem Argumentos 12 | ---------------------- 13 | 14 | Definição da função sem argumentos: 15 | 16 | .. code-block:: python 17 | 18 | def funcao(): 19 | numero = 7 ** 2 20 | msg = 'O quardrado de 7 é %d' % numero 21 | print(msg) 22 | 23 | funcao() 24 | 25 | 26 | .. code-block:: console 27 | 28 | O quardrado de 7 é 49 29 | 30 | O Comando return 31 | ---------------- 32 | 33 | O comando return dá um retorno para a função. 34 | Uma função pode retornar um ou mais valores (coleções). 35 | Deve ser o último comando da função, pois se tiver algum código depois será ignorado. 36 | Vale lembrar que return não é a mesma coisa que imprimir em tela. Quando se digita algo que retorne um valor dentro de um shell interativo, esse valor por conveniência é impresso em tela. 37 | Mas em um aplicativo ou script isso não acontecerá, portanto se deseja imprimir um valor em tela, isso deve ser explicitado, o que é mais comumente feito por print(). 38 | Quando uma função não tem um comando return, seu retorno é None implícito, o que para outras linguagens como C e Java é a mesma coisa que void. 39 | 40 | 41 | 42 | Definição da função: 43 | 44 | .. code-block:: python 45 | 46 | def funcao(): 47 | return 7 48 | 49 | 50 | 51 | Utilizando print para imprimir em tela o valor retornado pela função 52 | multiplicado por 3: 53 | 54 | .. code-block:: python 55 | 56 | print(funcao() * 3) 57 | 58 | .. code-block:: console 59 | 60 | 21 61 | 62 | 63 | 64 | Definição de uma função que retorna mais de um valor: 65 | 66 | .. code-block:: python 67 | 68 | def funcao(): 69 | return 3, 9 70 | 71 | 72 | 73 | Atribuindo à variável o valor de retorno da função: 74 | 75 | .. code-block:: python 76 | 77 | x = funcao() 78 | 79 | 80 | 81 | 82 | Imprimindo o valor da variável: 83 | 84 | .. code-block:: python 85 | 86 | print(x) 87 | 88 | .. code-block:: console 89 | 90 | (3, 9) 91 | 92 | 93 | 94 | 95 | Verificando o tipo da variável: 96 | 97 | .. code-block:: python 98 | 99 | type(x) 100 | 101 | .. code-block:: console 102 | 103 | tuple 104 | 105 | 106 | 107 | Definição de uma função com código após return: 108 | 109 | .. code-block:: python 110 | 111 | def funcao(): 112 | return 7 113 | print('Teste') 114 | 115 | 116 | 117 | Execução da função: 118 | 119 | .. code-block:: python 120 | 121 | funcao() 122 | 123 | .. code-block:: console 124 | 125 | 7 126 | 127 | | Como pode-se notar, o código inserido após return foi completamente 128 | | ignorado. 129 | | Devido ao fato de os comandos serem digitados no shell interativo foi 130 | | impresso em tela o valor de retorno da função. 131 | 132 | 133 | 134 | Argumentos Simples (Argumentos Não Nomeados) 135 | -------------------------------------------- 136 | 137 | Uma função pode ter um ou mais argumentos a serem pasados. 138 | Esses argumentos podem ser ou não obrigatórios. Sendo que os argumentos não obrigatórios têm um valor inicial. 139 | 140 | 141 | 142 | Definição de uma função: 143 | 144 | .. code-block:: python 145 | 146 | def funcao(x): 147 | return x 148 | 149 | 150 | 151 | Execução da função sem passar argumentos: 152 | 153 | .. code-block:: python 154 | 155 | funcao() 156 | 157 | .. code-block:: console 158 | 159 | --------------------------------------------------------------------------- 160 | TypeError Traceback (most recent call last) 161 | /home/beethoven/ in () 162 | ----> 1 funcao() 163 | 164 | TypeError: funcao() takes exactly 1 argument (0 given) 165 | 166 | | Devido ao fato de a função exigir que seja passado um argumento. 167 | 168 | 169 | 170 | Execução da função passando um argumento: 171 | 172 | .. code-block:: python 173 | 174 | funcao(7) 175 | 176 | .. code-block:: console 177 | 178 | 7 179 | 180 | 181 | 182 | Argumentos Nomeados 183 | ------------------- 184 | 185 | Podemos definir uma função em que um ou mais argumentos tenham valores padrões de forma que ao invocar a função podemos omitir a declaração, pois será considerado o padrão ou explicitando um valor. 186 | Quando houver mais de um argumento, os argumentos obrigatórios devem vira primeiro. 187 | 188 | 189 | 190 | Definição de função com um argumento: 191 | 192 | .. code-block:: python 193 | 194 | def funcao(x = 7): 195 | return x 196 | 197 | 198 | 199 | Chamando a função sem declarar valor de argumento: 200 | 201 | .. code-block:: python 202 | 203 | funcao() 204 | 205 | .. code-block:: console 206 | 207 | 7 208 | 209 | 210 | 211 | Chamando a função explicitando um valor de argumento: 212 | 213 | .. code-block:: python 214 | 215 | funcao(9) 216 | 217 | ou 218 | 219 | .. code-block:: python 220 | 221 | funcao(x = 9) 222 | 223 | .. code-block:: console 224 | 225 | 9 226 | 227 | 228 | 229 | Definindo uma função mesclando argumentos padrão e obrigatórios: 230 | 231 | .. code-block:: python 232 | 233 | def funcao(x = 7, y): 234 | return x + y 235 | 236 | .. code-block:: console 237 | 238 | SyntaxError: non-default argument follows default argument 239 | 240 | | Houve um erro, pois primeiro são os argumentos não padrões. 241 | 242 | 243 | 244 | Definindo uma função com dois parâmetros: 245 | 246 | .. code-block:: python 247 | 248 | def funcao(x, y = 7): 249 | return x + y 250 | 251 | 252 | 253 | Execução da função passando apenas um parâmetro (o obrigatório): 254 | 255 | .. code-block:: python 256 | 257 | funcao(3) 258 | 259 | .. code-block:: console 260 | 261 | 10 262 | 263 | 264 | 265 | Passando os dois parâmetros: 266 | 267 | .. code-block:: python 268 | 269 | funcao(2, 3) 270 | 271 | .. code-block:: console 272 | 273 | 5 274 | 275 | 276 | 277 | Forçando um erro ao não passar sequer o parâmetro obrigatório: 278 | 279 | .. code-block:: python 280 | 281 | funcao() 282 | 283 | .. code-block:: console 284 | 285 | TypeError: funcao() takes at least 1 argument (0 given) 286 | 287 | 288 | 289 | Definindo uma função com dois parâmetros opcionais: 290 | 291 | .. code-block:: python 292 | 293 | def funcao(x, y = 1, z = 2): 294 | return x + y + z 295 | 296 | 297 | 298 | Execução da função com um parâmetro (o obrigatório): 299 | 300 | .. code-block:: python 301 | 302 | funcao(0) 303 | 304 | .. code-block:: console 305 | 306 | 3 307 | 308 | 309 | 310 | Execução da função com um parâmetro obrigatório e um opcional: 311 | 312 | .. code-block:: python 313 | 314 | funcao(1, 2) 315 | 316 | .. code-block:: console 317 | 318 | 5 319 | 320 | 321 | 322 | Execução da função com um parâmetro obrigatório e dois opcionais: 323 | 324 | .. code-block:: python 325 | 326 | funcao(1, 2, 90) 327 | 328 | .. code-block:: console 329 | 330 | 93 331 | 332 | funcao(10, z = 30, y = 50) 333 | 334 | .. code-block:: console 335 | 336 | 90 337 | 338 | 339 | 340 | Argumentos em Lista Não Nomeados 341 | -------------------------------- 342 | 343 | | É possível passar uma lista de argumentos sem nomear cada um deles, ou 344 | | seja, atribuir uma variável. 345 | | Essa lista, internamente é interpretada como uma tupla (tuple). 346 | | Tal recurso nos possibilita passar uma quantidade indeterminada de 347 | | argumentos. 348 | | O identificador da variável que representa esse tipo de argumento vem logo 349 | | depois do caractere asterisco (*). 350 | 351 | .. code-block:: python 352 | 353 | def funcao(*args): 354 | qtd = len(args) 355 | primeiro = args[0] 356 | ultimo = args[-1] 357 | print(f'Foram passados {qtd} argumentos') 358 | print(f'O primeiro é {primeiro}') 359 | print(f'O último é {ultimo}') 360 | print(f'Os argumentos passados foram: {args}') 361 | 362 | .. code-block:: console 363 | 364 | funcao('abacaxi', 3, 'p', 8.3, 5 + 9j) 365 | Foram passados 5 argumentos 366 | O primeiro é "abacaxi" 367 | O último é "(5+9j)" 368 | Os argumentos passados foram: ('abacaxi', 3, 'p', 8.3, (5+9j)) 369 | 370 | 371 | 372 | Definição de função de duas formas diferentes: 373 | 374 | .. code-block:: python 375 | 376 | def funcao(*args): 377 | for arg in args: 378 | print(f'Argumento {args.index(arg)} = {arg}') 379 | 380 | ou 381 | 382 | .. code-block:: python 383 | 384 | def funcao(*args): 385 | for i, arg in enumerate(args): 386 | print(f'Argumento {i} = {arg}') 387 | 388 | 389 | 390 | Execução: 391 | 392 | .. code-block:: python 393 | 394 | funcao('a', 1.5, 7, 99) 395 | 396 | .. code-block:: console 397 | 398 | Argumento 0 = a 399 | Argumento 1 = 1.5 400 | Argumento 2 = 7 401 | Argumento 3 = 99 402 | 403 | 404 | 405 | Definição de uma função com um parâmetro arbitrário não nomeado: 406 | 407 | .. code-block:: python 408 | 409 | def funcao(*args): 410 | print(args) 411 | for i in args: 412 | print(i) 413 | 414 | 415 | 416 | Criação de uma tupla com quatro elementos: 417 | 418 | .. code-block:: python 419 | 420 | spam = (1, 2, 3, 4) 421 | 422 | 423 | 424 | Notemos a diferença de comportamento nas execuções: 425 | 426 | .. code-block:: python 427 | 428 | # Execução sem "desempacotamento" dos valores da tupla 429 | funcao(spam) 430 | 431 | .. code-block:: console 432 | 433 | ((1, 2, 3, 4),) 434 | (1, 2, 3, 4) 435 | 436 | 437 | .. code-block:: python 438 | 439 | # Execução com "desempacotamento" dos valores da tupla 440 | funcao(*spam) 441 | 442 | .. code-block:: console 443 | 444 | (1, 2, 3, 4) 445 | 1 446 | 2 447 | 3 448 | 4 449 | 450 | | Quando o caractere asterisco é posicionado antes de uma variável faz com 451 | | que considere que aquela variável (coleções) seja "desempacotada". 452 | | Seus elementos são passados como se fossem uma tupla, ou seja, uma 453 | | sequência de valores estraídos separados por vírgulas. 454 | 455 | 456 | 457 | Argumentos em Lista Nomeados 458 | ---------------------------- 459 | 460 | | O identificador da variável desse tipo de argumento é precedido por dois 461 | | asteriscos (**). 462 | | É uma lista com quantidade indeterminada e cada elemento da lista tem um 463 | | identificador próprio. 464 | 465 | 466 | 467 | Definição de uma função com parâmetros arbitrários nomeados: 468 | 469 | .. code-block:: python 470 | 471 | def funcao(**kargs): 472 | return kargs 473 | 474 | funcao(a = 1, b = 2) 475 | 476 | .. code-block:: console 477 | 478 | {'a': 1, 'b': 2} 479 | 480 | 481 | 482 | Definição e execução: 483 | 484 | .. code-block:: python 485 | 486 | def funcao(**kargs): 487 | for k, v in kargs.items(): 488 | print(f'{k} = {v}') 489 | 490 | 491 | funcao( 492 | nome = 'Chiquinho', 493 | sobrenome = 'da Silva', 494 | idade = 30, 495 | telefone = '(11) 99999-9999', 496 | ) 497 | 498 | 499 | .. code-block:: console 500 | 501 | Idade = 30 502 | Sobrenome = da Silva 503 | Telefone = (11) 99999-9999 504 | Nome = Chiquinho 505 | 506 | 507 | 508 | Definição e execução: 509 | 510 | .. code-block:: python 511 | 512 | def funcao(**kargs): 513 | return kargs 514 | 515 | eggs = {'a': 3, 'b': 5, 'c': 'x'} 516 | 517 | funcao(eggs) 518 | 519 | .. code-block:: console 520 | 521 | TypeError: funcao() takes exactly 0 arguments (1 given) 522 | 523 | 524 | 525 | Execução com duplo asterisco no identificador do parâmetro: 526 | 527 | .. code-block:: python 528 | 529 | funcao(**eggs) 530 | 531 | .. code-block:: console 532 | 533 | {'a': 3, 'b': 5, 'c': 'x'} 534 | 535 | 536 | 537 | Funções com Argumentos Variados 538 | ------------------------------- 539 | 540 | | E se precisarmos fazer uma função que utilize tipos diferentes conforme 541 | | visto anteriormente? 542 | | A ordem dos tipos de argumentos é a seguinte: 543 | | 544 | | **Simples**, **Nomeados**, **Lista de Não Nomeados** e **Lista de Nomeados** 545 | 546 | 547 | 548 | Definição e execução de uma função com parâmetros mistos: 549 | 550 | .. code-block:: python 551 | 552 | def foo(a, b = 3, *c, **d): 553 | print(a + b) 554 | print(c) 555 | print(d) 556 | 557 | foo( 558 | 4, 559 | 5, 560 | 'Alemanha', 561 | 'Holanda', 562 | 'Inglaterra', 563 | continente = 'Europa', 564 | hemisferio = 'Norte') 565 | 566 | .. code-block:: console 567 | 568 | 9 569 | ('Alemanha', 'Holanda', 'Inglaterra') 570 | {'continente': 'Europa', 'hemisferio': 'Norte'} 571 | 572 | 573 | 574 | Estruturas de Dados como Parâmetro para Funções 575 | ----------------------------------------------- 576 | 577 | | Em algumas situações pode ser útil utilizar uma estrutura de dados como 578 | | tupla (tuple), lista (list), dicionário (dict) ou mesmo um conjunto 579 | | (set / frozenset). 580 | 581 | 582 | 583 | Criação da função de teste: 584 | 585 | .. code-block:: python 586 | 587 | def param_test(x, y): 588 | return x + y 589 | 590 | 591 | 592 | Declaração das variáveis de estrutura de dados que serão utilizadas como 593 | parâmetro para a função: 594 | 595 | .. code-block:: python 596 | 597 | tupla = (5, 2) 598 | lista = [5, 2] 599 | dicio = {'x': 5, 'y': 2} 600 | conjunto = {2, 5, 2} 601 | 602 | 603 | 604 | Testes utilizando as estruturas de dados criadas: 605 | 606 | .. code-block:: python 607 | 608 | param_test(**dicio) # Dicionário (dict) como parâmetro 609 | param_test(*tupla) # Tupla (tuple) como parâmetro 610 | param_test(*lista) # Lista (list) como parâmetro 611 | param_test(*conjunto) # Conjunto (set) como parâmetro 612 | 613 | .. code-block:: console 614 | 615 | 7 616 | 617 | 618 | 619 | Boas Práticas: Função Main 620 | -------------------------- 621 | 622 | | Evite execuções globais, quebre seu código em funções o que facilita o 623 | | reúso e teste de código. 624 | | Crie uma função principal (main). Crie primeiro as outras funções e por 625 | | último a ser definida a função principal. 626 | | Na função principal serão feitas as chamadas às outras funções. 627 | | Outra coisa interessante a ser feita é colocar a função principal dentro 628 | | de um if. Sendo que se for executado, terá a variável especial "__name__" 629 | | como valor "__main__". 630 | 631 | 632 | 633 | Editando um script Python de teste: 634 | 635 | .. code-block:: bash 636 | 637 | vim hello.py 638 | 639 | .. code-block:: python 640 | 641 | #!/usr/bin/env python 642 | #_*_ coding: utf-8 _*_ 643 | 644 | def funcao(): 645 | print('Função executada') 646 | 647 | 648 | def Main(): 649 | print('==== Início ====') 650 | funcao() 651 | print('==== Fim ====') 652 | 653 | 654 | if __name__ == '__main__': 655 | Main() 656 | 657 | 658 | 659 | Execução do script: 660 | 661 | .. code-block:: bash 662 | 663 | python hello.py 664 | 665 | .. code-block:: console 666 | 667 | ==== Início ==== 668 | Função executada 669 | ==== Fim ==== 670 | 671 | 672 | 673 | Funções Geradoras 674 | ----------------- 675 | 676 | | Uma função geradora ao invés de utilizar o comando return, utiliza o 677 | | comando yield, que retorna um objeto generator. 678 | 679 | 680 | 681 | Criação de uma função geradora: 682 | 683 | .. code-block:: python 684 | 685 | def f_gen(var): 686 | print('INÍCIO') 687 | 688 | for i in var: 689 | yield i 690 | 691 | print('FIM') 692 | 693 | 694 | 695 | Criação de um generator pela função geradora e verificando seu tipo: 696 | 697 | .. code-block:: python 698 | 699 | g = f_gen('Python') 700 | type(g) 701 | 702 | .. code-block:: console 703 | 704 | generator 705 | 706 | 707 | 708 | Método next(): 709 | 710 | .. code-block:: python 711 | 712 | g.next() 713 | 714 | .. code-block:: console 715 | 716 | INÍCIO 717 | 'P' 718 | 719 | .. code-block:: python 720 | 721 | g.next() 722 | 723 | 724 | .. code-block:: console 725 | 726 | 'y' 727 | 728 | .. code-block:: python 729 | 730 | g.next() 731 | 732 | .. code-block:: console 733 | 734 | 't' 735 | 736 | .. code-block:: python 737 | 738 | g.next() 739 | 740 | .. code-block:: console 741 | 742 | 'h' 743 | 744 | .. code-block:: python 745 | 746 | g.next() 747 | 748 | .. code-block:: console 749 | 750 | 'o' 751 | 752 | .. code-block:: python 753 | 754 | g.next() 755 | 756 | .. code-block:: console 757 | 758 | 'n' 759 | 760 | .. code-block:: python 761 | 762 | g.next() 763 | 764 | .. code-block:: console 765 | 766 | FIM 767 | 768 | StopIteration: . . . 769 | 770 | 771 | Funções Lambda 772 | -------------- 773 | 774 | | São funções anônimas, ou seja, que não são associadas a um nome. Um 775 | | recurso similar às funções anônimas em PL/pgSQL (PostgreSQL). 776 | | Sua estrutura é composta apenas por expressões, o que a torna muito 777 | | limitada, no entanto consome menos recursos do que uma função convencional. 778 | | Por só aceitar expressões, o comando return não é permitido em sua 779 | | estrutura. 780 | 781 | 782 | 783 | Execução de uma função lambda: 784 | 785 | .. code-block:: python 786 | 787 | (lambda x, y: x + y)(5, 2) 788 | 789 | .. code-block:: console 790 | 791 | 7 792 | 793 | 794 | 795 | Criando uma função através de uma função lambda e execução: 796 | 797 | .. code-block:: python 798 | 799 | foo = lambda x, y: x ** y 800 | print(foo(2, 5)) 801 | 802 | .. code-block:: console 803 | 804 | 32 --------------------------------------------------------------------------------