.. -*- coding: utf-8 -*- Introdução ========== Introdução ---------- - Python 2.7 - Não vamos usar Python 3 =( Como vai ser o curso: --------------------- 1. Mix: Teoria + Exercícios 2. Não se sintam obrigados a anotar tudo! Material -------- 1. Como baixar 2. Como compilar o material Origem ------ - Criada por Guido Van Rossum, Holandez; - Em 1991 o autor publicou o código fonte na internet; - Construído colaborativamente por pessoas; - Sem nenhuma empresa por trás, sem restrições econômicas; Python é tão especial? ---------------------- - `Case Studies & Success Stories `_. - "Porque o Python cabe na sua mente" `Bruce Eckel `_, - Autor de livros especializados em Java e C++, `que estava apaixonado pelo Python; `_ - Excelente biblioteca padrão +230 `módulos `_ (EN) - Documentação em `Português `_ - Resolver problemas e compartilhar esta na essência do Python! Python package index: `pypi `_ (repositório de softwares) .. code-block:: bash $ pip install nomedomodulo Zen python - Tim Peters ----------------------- Nada mais é do que uma série de filosofias escritas pelo criador da linguagem Python. **Se seu código é inspirado nessas regras é pythonico.** `Zen Python `_. `Zen Python pt-BR `_. Easter Egg ;) .. code-block:: python >>> import this .. nextslide:: - Bonito é melhor que feio. - Explícito é melhor que implícito. - Simples é melhor que complexo. - Complexo é melhor que complicado. - Plano é melhor que aninhado. - Dispersa é melhor que denso. - Legibilidade conta. .. nextslide:: - Casos especiais não são especiais o suficiente para quebrar as regras. - Embora praticidade vença pureza. - Erros nunca devem passar silenciosamente. - A menos que explicitamente silenciados. - Em face da ambiguidade, recuse a tentação de adivinhar. - Deve haver uma -- e de preferência apenas uma -- maneira óbvia para fazê-lo. .. nextslide:: - Apesar dessa maneira poder não ser óbvia à primeira vista, a menos que você seja holandês. - Agora é melhor do que nunca. - Embora nunca tenha sido muitas vezes é melhor do que agora mesmo. - Se a implementação é difícil de explicar, é uma má idéia. - Se a implementação é fácil de explicar, pode ser uma boa idéia. - Namespaces são uma grande ideia - vamos fazer mais desses! Introdução à linguagem ====================== Introdução à linguagem ---------------------- - Python é uma linguagem **interpretada** (bytecode-compiled). - Tipagem **dinâmica** (não existem declarações de tipos de variáveis, parâmetros, funções) - Reduzida utilização de **caracteres** especiais (vírgula, dois pontos, ponto e vírgula) - **Modular** (vasta coleção de módulos que podem ser utilizados como base para sua aplicação, Alguns desses módulos implementam manipulação de arquivos, chamadas do sistema, sockets, e até mesmo acesso a bibliotecas de construção de interfaces gráficas, como Tk) - **Código compacto, legível e flexível**; O interpretador Python ---------------------- Melhor forma de se ver como um código funciona é utilizando o interpertador do python :: $ python .. code-block:: python >>> a = 6 ## Seta uma variável na sessão do interpretador >>> a ## Entrando com uma expressão o interpretador imprime o resultado 6 >>> a + 2 8 >>> a = 'hi' ## 'a' pode ser uma string em seguida >>> a 'hi' >>> len(a) ## chamando a função len() da string 2 >>> a + len(a) ## Tente algo que não funcione Traceback (most recent call last): File "", line 1, in TypeError: cannot concatenate 'str' and 'int' objects >>> a + str(len(a)) ## provavelmente o que você queria 'hi2' >>> foo ## Tente algo que nao esteja definido Traceback (most recent call last): File "", line 1, in NameError: name 'foo' is not defined >>> ^D ## Pressione CTRL-d para sair (CTRL-z em Windows/DOS terminal) .. nextslide:: - Fácil de experimentar variáveis e operadores; - O interpretador também exibe as exceções; - Python é case sensitive; - O fim da linha marca o fim da declaração; - Não é preciso colocar ponto e virgula no fim de cada declaração; - Comentários começam com '#' e se estendem até o fim da linha. O IPython --------- Interpretador com recursos embutidos que facilitam o dia-a-dia. .. code-block:: bash $ sudo pip install ipython $ ipython $ In [1]: - Auto-Complete - Execução de comandos de sistema (ls -l) - Autoindentação - Interface Web: (notebook) - Histórico - Ex.: '_' (underline) resultado do último comando. - Execução de programas Python: com apenas um comando, é possível executar um arquivo Python dentro do iPython. - Ex.: %run arquivo.py hello.py ----------------- .. code-block:: bash #!/usr/bin/env python # import dos modulos são feitos aqui -- sys é um modulo muito comum import sys # Reúna o nosso código em uma função main() def main(): print 'Hello there', sys.argv[1] # Os argumentos da linha de comando estão em sys.argv[1], sys.argv[2] ... # sys.argv[0] é o próprio nome do script # Definindo uma variavel simples nome = 'Ana Beatriz' # Forma padrão para chamar a função main para iniciar o programa if __name__ == '__main__': main() Código fonte python ------------------- O código fonte python utiliza a extensão ".py" e as extensões são chamadas de "módulos". Por exemplo para executar o módulo python hello.py, a maneira mais fácil de executá-lo é ir no shell e digitar. :: $ python hello.py Kmee O comando citado, inicializa o interpretador Python para executar o módulo/arquivo hello.py, A string "Kmee" funciona como argumento de linha de comando. Veja a página da `Documentação oficial `_ sobre todas as diferentes opções que você tem ao executar Python a partir da linha de comando. .. nextslide:: | Executando o programa através da linha de comando: | :: $ python hello.py Guido Hello there Guido $ ./hello.py Kmee ## without needing 'python' first (Unix) Hello there Kmee Argumentos de linha de comando ----------------------------------------------- As declarações em um arquivo ou módulo python são processadas uma única vez durante a primeira importação do módulo em algum lugar, iniciando suas variáveis e funções. Um módulo python pode ser executado diretamente - como fizemos acima "python hello.py Carol" - ou pode ser importado e utilizado em outro módulo. Quando um arquivo python é executado diretamente, uma variável especial "__name__" é atribuída ao "__main__". É muito comum vermos o trecho de código: .. code-block:: python if __name__ == '__main__': pass para chamar a função main(), mas não quando este módulo é importado por outro módulo. Argumentos ---------- Em em um programa Python padrão, a lista *sys.argv* contém os argumentos da linha de comando na forma padrão: - sys.argv[0] sendo o próprio nome do arquivo programa; - sys.argv[1] o primeiro argumento, - sys.argv[2] o segundo argumento, - e assim por diante. len() ----- Se você estiver na dúvida com o número de argumentos de um programa, você pode simplesmente consultá-los através da função len(sys.argv) como fizemos ao verificar o tamanho da string. Em geral, **len()** pode te dizer: - Tamanho de uma string; - Número de elementos em uma lista, dicionário, tupla ou qualquer estrutura de dados; Interpretador Python Interativo -------------------------------- Chama o interpretador python processando o modulo do parâmetro, e continua com a sessão do interpretador aberta. .. code-block:: shell $ ipython -i hello.py $ python -i hello.py - Variáveis que foram definidas no arquivo hello.py continuam disponíveis na sessão - É possível interagir com a sessão .. code-block:: python >>> nome 'Ana Beatriz' Funções definidas pelo usuário ------------------------------ Funções em Python são definidas desta forma: :: # Define a função 'repetidor' que espera 2 argumentos. def repetidor(s, exclamacao): """ Retorna a string 's' repetida 3 vezes. Se 'exclamacao' for true, adiciona o marcador de exclamacao. """ result = s + s + s # você pode também usar a notação "s * 3" if exclaim: result = result + '!!!' return result Note que todas as linhas que compõem a função ou instrução if, são agrupadas pelo mesmo nível de identação. .. nextslide:: - Também apresentamos duas maneira diferentes de se repetir strings: - utilizando o operador "+" - utilizando o operador "*" (De forma que "-" * 10 = "----------"); \*OBS: Utilizar o "\*" é mais rápido do que o "+", porque * calcula o tamanho da string somente uma vez, enquanto "+" calcula a cada operação de "+" - Ambos + e * são chamados de operadores sobrecarregados pois têm significados diferentes para números, strings e outros tipos de dados. .. nextslide:: - A palavra reservada *def* define a função com seus parâmetros entre parênteses e seu código identado. A primeira linha de uma função pode ser sua documentação string ("docstring") que deve descrever o que a função faz. - O docstring pode ser uma única linha, ou múltiplas linhas como no exemplo anterior. (Com aspas triplas). - Váriáveis definidas dentro de uma função são locais para esta função, então o result da função anterior é separado de uma mesma váriavel result em outra função. - Se a declaração de retorno receber um argumento, este será retornado a quem chamou a função. .. nextslide:: Exemplo: :: def main(): print repeat('Yay', False) ## YayYayYay print repeat('Woo Hoo', True) ## Woo HooWoo HooWoo Hoo!!! Indentação ----------- Uma caractéristica do Python é que um espaço em branco pode alterar o significado de um trecho de código. Um bloco lógico de declarações que compõem uma função devem ter todos a mesma indentação, em relaçao à indentação da função ou do bloco if ou qualquer outro tipo de bloco. Se uma das linhas em um grupo tem uma indentação diferente, temos um erro de sintaxe. O uso de espaços em branco parece ser bem estranho de início, mas é lógico e você acaba se acostumando muito rápido. .. nextslide:: Evite usar TABs pois eles detonam o esquema de recuo. (Tabs significam coisas diferentes em diferentes plataformas). Configure o seu editor para inserir espaços em vez de tabs. Uma questão comum: "Com quantos espaços eu devo indentar meu código?" **De acordo com o a PEP8, deve-se indentar com 4 espaços.** PEPs ------- O desenvolvimento de Python é conduzido amplamente através do processo **Python Enhancement Proposal ("PEP")**, em português Proposta de Melhoria do Python. Os PEPs são documentos de projeto padronizados que fornecem informações gerais relacionadas ao Python, incluindo propostas, descrições, justificativas de projeto (design rationales) e explicações para características da linguagem. https://www.python.org/dev/peps/ O Código é checado em tempo de execução --------------------------------------- O Python realiza pouca checagem ao compilar, adiando as checagens de nomes, tipos e etc. para quando a linha for executada. Exemplo:' .. code-block:: python def main(): if name == 'Guido': print repeeeet(name) + '!!!' else: print repeat(name) Este código compila e funciona muito bem desde que o nome não seja 'Guido'. Somente quando a aplicação tenta executar o método com o nome errado que um erro será exibido. .. nextslide:: Esta é uma área em que linguagens como Java podem ter vantagens... Pois podem detectar erros deste tipo durante a compilação. Por isso é muito importante que os testes percorram todo o trecho do código. Nomes de Variáveis ------------------ Como as variáveis em Python não têm seus tipos especificados no código-fonte, é importante nomearmos as variáveis com significados que nos auxiliem a lembrar do que se trata. Muitos erros básicos ocorrem ao esquecermos o tipo de uma variável. Para nomes de variáveis a PEP8 recomenda o uso de variáveis de **"mais_de_uma_palavra"** com underscore mas recomenda aos desenvolvedores a adiar alterar códigos que utilizem a notação **camelCase.** Como toda linguagem palavras como 'print' e 'while' não podem ser usadas como nomes de variáveis. Enquanto 'str' e 'list' podem parecer bons nomes, você estaria substituindo essas variáveis ​​do sistema. Built-ins não são palavras-chave e, portanto, são suscetíveis ao uso inadvertido por novos desenvolvedores Python. Mais um pouco de módulos e seus Namespaces ------------------------------------------ Suponha que você criou um módulo chamado "blink.py" que contem um método "def foo()". O nome completo desta função é "blink.foo". Desta forma, vários módulos podem ter suas funções e variáveis da maneira que eles quiserem, e suas variáveis não entrarão em conflito. - module1.foo é diferente de module2.foo. No vocabulário Python dizemos que cada módulo tem seu próprio namespace. Que são vínculos entre nome de objetos e variáveis. .. nextslide:: Por exemplo, se o modulo padrão "sys". Que contem algumas ferramentas como argv, exit(). Com o trecho "import sys" você então pode acessar as definições do modulo sys no seu namespace. .. code-block:: python import sys # Now can refer to sys.xxx facilities sys.exit(0) Outra forma de realizarmos importações: .. code-block:: python from sys import argv, exit Isto torna o argv e exit() disponíveis através dos seus nomes curtos. Mas é recomendada a forma original com nomes completos (fully-qualified) pois é muito mais simples determinar à que função pertence certo atributo. .. nextslide:: Existem vários módulos e pacotes que são empacotados em conjunto com a instalação do interpretador padrão do Python, de forma que você não precisa fazer mais nada para usá-los. Eles são conhecidos como a Biblioteca Padrão do Python ("Python Standard Library."). Módulos e pacotes inclusos: - sys — exit(), argv, stdin, stdout, ... - re — regular expressions - os — interface com o sistema operacional, sistema de arquivos. Standard Library Link: http://docs.python.org/library. Ajuda Online, help(), and dir() ------------------------------- Existe uma grande variedade de opções para se obter ajuda em Python! 1. Pesquisa no google inciando com python; 1.1 Geralmente o primeiro resultado da pesquisa será a documentação oficial — docs.python.org 2. StackOverflow and Quora; 3. help() 4. dir() Quando você estiver dentro do interpretador python, a função help() imprime o docstring do objeto enviado como parâmetro. Já a função dir() imprime quais são os atributos do objeto. .. nextslide:: Abaixo alguns exemplos: .. code-block:: python help(len) # Ajuda para a função embutida len() function # Note que é "len", não "len()". que é uma chamada da função, algo que não queremos. help(sys) # help string do modulo sys (você deve antes importar o sys) dir(sys) # dir() é como um help() mas retorna uma pequna lista dos atributos do objeto. help(sys.exit) # help string para o exit(), função do modulo sys. help('xyz'.split) # help string do metodo split() de um objeto string 'xyz'; Você pode invocar o help() de uma instância de um objeto ou mesmo do objeto. .. code-block:: python help('kmee'.split) a = 'abcd' help(a.split) help(str.split) help(list) # help string para listas; dir(list) # exibe os atributos das listas, incluindo os seus métodos. help(list.append) # help string para o método append() de uma lista.