PY-0101 - Resumo de Python

Resumo Geral
1 - Introdução
Python(https://www.python.org/) é uma linguagem de altíssimo nível (em inglês, Very High Level Language) orientada a objeto, de tipagem dinâmica e forte, interpretada e interativa, com uma sintaxe clara e concisa, que favorece a legibilidade do código fonte, tornando a linguagem mais produtiva.
A linguagem inclui diversas estruturas de alto nível (listas, dicionários, data/hora, complexos e outras) e uma vasta coleção de módulos prontos para uso, além de frameworks de terceiros que podem ser adicionados. Também possui recursos encontrados em outras linguagens modernas, tais como: geradores, introspecção, persistência, metaclasses e unidades de teste. Multiparadigma, a linguagem suporta programação modular e funcional, além da orientação a objetos. Mesmo os tipos básicos no Python são objetos. A linguagem é interpretada através de bytecode pela máquina virtual Python, tornando o código portável. Com isso é possível compilar aplicações em uma plataforma e rodar em outros sistemas ou executar direto do código fonte.
Python é um software de código aberto (com licença compatível com a General Public License (GPL), porém menos restritiva, permitindo que o Python seja inclusive incorporado em produtos proprietários). A especificação da linguagem é mantida pela Python Software Foundation(https://www.python.org/psf/ - PSF). Além de ser utilizado como linguagem principal no desenvolvimento de sistemas, o Python também é muito utilizado como linguagem script em vários softwares, permitindo automatizar tarefas e adicionar novas funcionalidades, entre eles: BrOffice.org, PostgreSQL, Blender, GIMP e Inkscape. A implementação oficial do Python é mantida pela PSF e escrita em C, e por isso, é também conhecida como CPython. A versão estável mais recente está disponível para download no endereço http://www.python.org/download/.
É possível integrar o Python a outras linguagens, como a Linguagem C e Fortran. Em termos gerais, a linguagem apresenta muitas similaridades com outras linguagens dinâmicas, como Perl e Ruby. Existem também implementações de Python para .NET (IronPython), JVM (Jython) e em Python (PyPy).
Para a plataforma Windows, basta executar o instalador. Para outras plataformas, como em sistemas Linux, geralmente o Python já faz parte do sistema, porém em alguns casos pode ser necessário compilar e instalar o interpretador a partir dos arquivos fonte.
1.1 - Documentação
PyDOC é a ferramenta de documentação do Python (também disponível em: http://www.python.org/doc/) . Ela pode ser utilizada tanto para acessar a documentação dos módulos que acompanham o Python, quanto a documentação dos módulos de terceiros. No Windows, acesse o ícone “Module Docs” para a documentação da biblioteca padrão e “Python Manuals” para consultar o tutorial, referências e outros documentos mais extensos. No Linux, a documentação das bibliotecas pode ser vista através do browser usando o comando:
pydocX -b -p 8000
Onde x é a versão do python instalado(lembrando que estamos usando a versão mais recente do Python 3) e a visualização fica disponível no endereço http://localhost:8000/. Além disso, é possível ainda consultar a documentação no próprio interpretador, através da função help().
1.2 - Tipagem dinâmica
Python utiliza tipagem dinâmica, o que significa que o tipo de uma variável é inferido pelo interpretador em tempo de execução (isto é conhecido como Duck Typing). No momento em que uma variável é criada através de atribuição, o interpretador define um tipo para a variável, com as operações que podem ser aplicadas. A tipagem do Python é forte, ou seja, o interpretador verifica se as operações são válidas e não faz correções automáticas entre tipos incompatíveis. Para realizar a operação entre tipos não compatíveis, é necessário converter explicitamente o tipo da variável ou variáveis antes da operação.
1.3 - Sintaxe
Um programa feito em Python é constituído de linhas, que podem continuar nas linhas seguintes, pelo uso do caractere de barra invertida (\) ao final da linha ou parênteses, colchetes ou chaves, em expressões que utilizam tais caracteres. O caractere # marca o inicio de comentário. Qualquer texto depois do # será ignorado até o fim da linha, com exceção dos comentários funcionais. Comentários funcionais são usados para:
- Alterar a codificação do arquivo fonte do programa acrescentando um comentário com o texto “#-*- coding: -*#-” no inicio do arquivo, no qual é a codificação do arquivo (geralmente latin1 ou utf-8). Alterar a codificação é necessário para suportar caracteres que não fazem parte da linguagem inglesa, no código fonte do programa; e
- Definir o interpretador que será utilizado para rodar o programa em sistemas UNIX, através de um comentário começando com “#!” no inicio do arquivo, que indica o caminho para o interpretador (geralmente a linha de comentário será algo como “#!/usr/bin/env python”).
Exemplo de comentários funcionais. Sintaxe:
O comando print insere espaços entre as expressões que forem recebidas como parâmetro e um caractere de nova linha no final, a não ser que ele receba uma vírgula no fim da lista parâmetros.
1.4 - Blocos
Em Python, os blocos de código são delimitados pelo uso de indentação, que deve ser constante no bloco de código, porém é considerada uma boa prática manter a consistência no projeto todo e evitar a mistura tabulações e espaços.
A linha anterior ao bloco sempre termina com dois pontos (:) e representa uma estrutura de controle da linguagem ou uma declaração de uma nova estrutura (uma função, por exemplo).
1.5 - Operadores
O Python oferece uma série de operadores pré-definidos para manipular números por meio de cálculos e operações lógicas. Abaixo listamos as mais comuns:
Aritméticas:
- soma (+);
- subtração (-);
- multiplicação (*);
- divisão ( / );
- divisão inteira ( // );
- módulo – retorna resto da divisão (%); e
- potenciação (**).
Lógicos:
- maior (>);
- menor (<);
- menor ou igual (<=);
- maior ou igual (>=);
- igual (==); e
- diferente (!=).
Além das operações acima, o Python oferece, ainda, outras funções para manipular tipos numéricos:
- abs() – retorna o valor absoluto do número;
- oct() – converte para octal;
- hex() – converte para hexadecimal;
- pow() – eleva um número pelo outro; e
- round() – retorna um número real com arredondamento.
Sinais de Comparação
Existem também os sinais de comparação. Estes sinais retornarão True ou False, indicando se uma determinada comparação é Verdadeira ou Falsa. True e False são valores especiais em Python, um tipo de dado chamado Boolean, onde os únicos valores possíveis são estes dois. Vamos aos sinais de comparação:
- igual a(==);
- diferente de (!=);
- maior que (>);
- maior ou igual a (>=);
- menor que (<); e
- menor ou igual a (<=).
1.5 - Funções, Print, Comentários, Tipos de Dados e Variáveis
Funções são blocos, pedaços de códigos predefinidos que podem ser reaproveitados, que podem levar parâmetros ou não, e podem retornar um valor final para ser utilizado posteriormente ou apenas exibir informações. A forma usual de chamar uma função é através de seu nome, com os parâmetros dentro de parênteses. Caso a função não receba parâmetros, deve-se incluir os parênteses, mas sem nada dentro deles. A função print, por exemplo, recebe como parâmetro o que será exibido por ela.
A função “print()”, basicamente, “imprime” na tela, ou seja, exibe, aquilo que está dentro dos parênteses. Esta função mudou do Python 2 para o Python 3. No Python 3, “print()” é, exclusivamente, uma função.
Comentários são auto-explicativos. São anotações no código que não são rodadas junto com o próprio, e servem para ilustrar, explicar ou incluir informações adicionais nele. No Python existem duas formas de comentários. O primeiro, o comentário de uma linha, deve ser antecedido por “#, e transforma em comentário tudo que está a partir dele, até o final daquela linha e não precisa estar no começo da linha, ele pode começar logo após alguma linha de código. O segundo, de mais de uma linha deve estar entre três aspas (duplas """ ou simples ''')
O Python permite trabalhar com diferentes tipos de dados. Um destes tipos é o tipo String. Vamos passar por cada tipo, explicando cada um deles:
- Strings - são dados definidos entre aspas duplas (“) ou simples (‘), representando texto, que normalmente é exibido por um programa ou exportado por ele. Ex: “Oi Python";
- Integer - são números sem casas decimais, números inteiros. São definidos simplesmente como um número inteiro comum. Ex: 5, 31, 150;
- Float - números com casas decimais, são definidos com o número e as casas decimais após o ponto. Ex: 5.67, 99.99; e
- Boolean - utilizado para representar os conceitos de Verdadeiro ou Falso. Booleans só podem assumir estes dois valores, representados por “True” e “False” (mas sem as aspas). Ex: True, False
Temos também outros tipos de dados, como Listas (lists), Dicionários (dictionaries) e Tuplas (tuples), entre outros. Estes são tipos especiais, que veremos em capítulos posteriores, mas servem basicamente para armazenar outros tipos de dados.
Para definir uma variável no Python, basta digitar um nome para a própria, o sinal de igual e o valor que se deseja que ela armazene que pode armazenar praticamente qualquer tipo de dado. Os nomes de variáveis em Python precisam começar com uma letra ou com um underscore “_”. Números podem ser usados se não estiverem no começo. Variáveis em Python também não possuem tipos definidos. Desta forma, uma mesma variável que armazena inicialmente uma string, pode depois armazenar um número inteiro, ou uma lista. Também é possível definir mais de uma variável de uma vez. Caso o valor seja igual para todas, utilize o sinal de igual entre os nomes das variáveis. Caso seja diferente, use vírgulas entre os nomes das variáveis e entre os valores de cada uma delas. Veja os exemplos abaixo:
# Definição de múltiplas variáveis com valores iguais:
x = y = z = 10
# Definição de múltiplas variáveis com valores diferentes:
x, y, z = 10, 20, 30
É muito importante não confundir o sinal de comparação “==” e o sinal de atribuição “=”. Para definir uma variável, use sempre “=”, e para fazer uma comparação, saber se dois valores ou variáveis são iguais, use sempre “==”.
A função input()
Esta função é utilizada para captar informações enviadas pelo usuário. Ela pode receber um parâmetro, que será uma mensagem exibida ao usuário antes que ele insira o que deseja. A entrada inserida pelo usuário pode ser salva e utilizada posteriormente. No exemplo abaixo, a entrada digitada pelo usuário é salva na variável “nome” e depois é impressa, juntamente com a mensagem desejada. No exemplo, logo após a exibição da mensagem “Olá, qual o seu nome?”, o programa aguardará o input do usuário. Após digitar seu nome, você deve apertar o Enter, para que o código prossiga.
nome = input("Olá, qual o seu nome?\n")
print("Olá, %s" % nome)
> Olá, qual o seu nome?
Rodrigo Brito
> Olá, Rodrigo Brito
Exemplos de códigos:
Questionário:
1 - O caractere “#” representa o início de um comentário. Isso significa que qualquer texto inserido em seguida não será executado, salvo comentários funcionais. Os Comentários funcionais possuem duas finalidades:
R: Modificar a codificação do arquivo fonte e definir o interpretador a ser utilizado.
2 - No geral, as regras para variáveis em Python são as seguintes, exceto:
R: Aceitam que o nome da variável seja iniciado por números.
3 - Funções no Python são pedaços de códigos identificados por um nome único e possuem as seguintes características, exceto:
R: Não podem retornar valor para a função principal.
4 - Considerando que uma variável x com valor 2 tenha sido declarada previamente, qual o trecho de código correto em Python para imprimir a mensagem na tela: "Eu tenho 2 cachorros."
R: print ("Eu tenho",x,"cachorros.")
5 - Para sair do modo interativo do PYTHON basta digitar a função "exit()" ou então pressionar "CONTROL+D".
R: verdadeiro.
6 - Em Python a linha anterior do bloco deve sempre terminar com dois pontos (:), o que representa uma estrutura de controle da linguagem ou a declaração de uma nova estrutura.
R: Verdadeiro.
7 - Outro tipo muito utilizado no Python são as listas. Elas são coleções de objetos de qualquer tipo (coleções heterogêneas).
R: Verdadeiro.
8 - Variáveis, tanto no Python quanto em qualquer outra linguagem de programação, são nomes que referenciam um determinado valor.
R: Verdadeiro.
9 - O Python diferencia letras maiúsculas de minúsculas, portanto, uma variável “variavel” é diferente de “Variavel”.
R: Verdadeiro.
10 - A função PRINT no Python versão 3 precisa receber os parâmetros que serão impressos entre parenteses (). Se for uma string (um conjunto de caracteres) estará entre aspas simples ou duplas. Ex: print ("teste")
R: Verdadeiro.
11 - Na linguagem PYTHON As três aspas ””” são um tipo de comentário especial que utilizam várias linhas. Tudo que estiver entre os dois conjuntos de ””” serão comentários.
R: Verdadeiro.
12 - A função PRINT no Python é utilizada para imprimir alguma coisa na tela. Podemos imprimir um número, uma string (conjunto de caracteres) ou o valor de uma variável.
R: Verdadeiro.
13 - Na linguagem de programação PYTHON qualquer coisa digitada depois do "#" é considerado um comentário.
R: Verdadeiro
14 - É por meio do comando de atribuição "=" que é possível criar e atribuir valores às variáveis em Python.
R: Verdadeiro
15 - Código-fonte são declarações que você escreve em seu programa, consistindo em arquivos de texto, que normalmente terminam com a extensão .py no PYTHON.
R: Verdadeiro.
16 - A declaração de variável a seguir está correta: valor final = 10
R: Falso.
17 - As palavras reservadas não podem ser usadas como nome para variáveis em Python.
R: Verdadeiro.
18 - O comando "resultado = a ** b" significa que estamos atribuido à variável "resultado" o valor da variável "a" elevada ao valor da variável "b", ou seja, a variável "resultado" recebe o resultado da portência de "a" por "b".
R: Verdadeiro.
19 - O comando de atribuição de variável "while = 10" está correto.
R: Falso.
20 - Em PYTHON 3 é possível declarar variáveis com acentos: ação = 10.
R: Verdadeiro.
21 - O comando "x=15<14" indica que a variável x irá receber o valor "True".
R: Falso.
22 - Em Python o caractere “#” indica que a linha é um comentário no código.
R: Verdadeiro.
23 - O comando "x=True" coloca o valor verdadeiro armazenado na variável "x".
R: Verdadeiro.
24 - Para facilitar o aprendizado podemos testar e aprender utilizando interpretadores e compiladores ONLINE. São exemplos o IDEONE.COM e o REPL.IT .
R: Verdadeiro.
25 - Para entrar em modo interativo do Python basta acessar um terminal (GNU/Linux), digitar "python" e teclar "ENTER". Para executar algo, depois de acessar o modo interativo basta digitar os comandos que deseja executar.
R: Verdadeiro.
26 - Python oferece recursos como: programação orientada a objetos, exceções, módulos, coleta de lixo automática, recursos avançados de manipulação de textos, listas e outras estruturas de dados, e a possibilidade de executar o mesmo programa sem modificações em várias plataformas de hardware e sistemas operacionais.
R: Verdadeiro
27 - Para executar um programa em PYTHON na linha de comando do sistema operacional basta digitar: python arquivo.py
R: Verdadeiro.
28 - O espaçamento da indentação deve ser respeitado para que o código seja interpretado e executado. Os blocos de instrução são executados um a um, de cima para baixo e da esquerda para direita, sequencialmente.
R: Verdadeiro.
29 - Na linguagem Python os blocos de códigos são delimitados pelo uso de indentação (é utilizar "tab" para indentação).
R: Verdadeiro.
2 - Tipos de Dados
2.1 - Strings
São dados definidos entre aspas duplas ou simples, representando texto, que normalmente é exibido por um programa ou exportado por ele, podendo conter letras, números, símbolos. Existe uma terceira forma, que é a definição de strings entre três aspas triplas. Neste caso, caracteres escapados assumem seu significado correto, e quebras de linha, seja no terminal ou na linha de código também são interpretadas como tal no output. Veja o exemplo abaixo, onde cada quebra de linha foi feita dando ENTER após cada sentença. A string só se encerra ao fechá-la com o mesmo conjunto de aspas simples ou duplas utilizado para iniciá-la:
Para criar uma string com aspas duplas e simples no meio basta colocá-los junto com a string e ela continuará sendo válida. Ex:
string3 = "A cantora Sinnead O'Connor"
string4 = 'Alfredo disse "Corram aqui para ver isso!"'
Para utilizar as duas em uma string, ou caso sempre defina suas strings com aspas duplas e queira usar aspas duplas em uma string específica, é preciso escapar este caracter utilizando a contrabarra (\).
Uma outra forma de representar strings é antecedendo sua definição com a letra “r”. Isto gera o que chamamos de raw string literals, onde a string é exibida exatamente como ela foi definida, e não substituindo caracteres escapados por seus significados no output. Ex:
Para inserir valores de variávies em strings é possível utilizar o sinal de “%”, que é um caractere de formatação de strings no Python da seguinte forma:
- %s para incluir outras strings em uma string;
- %d para incluir um número inteiro (integer);
- %f para incluir um número flutuante (float). Pode ser definido o número de casas decimais, exemplos: %.2f duas casas e %.3f três casas.
name = "Rodrigo Brito"
print("Meu nome é %s " % name)
Outra forma de inserir valores em strings é através da concatenação. O sinal de concatenação no Python é o “+”.
name = 'Rodrigo Brito'
print("Olá, meu nome é " + nome)
Contudo, a função print não faz a conversão de um número inteiro ou flutuante para uma string automaticamente, desta forma, avariável deve ser convertida para string através da função str() ou a função format(). Na função format as variávies serão posicionadas entre chaves no local de inserção da variável, além de ser possível realizar a formatação e concatenação. Ex:
Em Python, toda string é tratada como uma lista, estrutura semelhante aos arrays, assim, é possível acessar qualquer caractere da string através de seu índice, ou index. A primeira letra tem índice 0 (zero), e a última é igual a quantidade de caracteres da string menos um.
Funções úteis para Strings
- capitalize(): transforma a primeira letra de uma string em maiúscula;
- lower() e upper(): transformam, respectivamente, todas as letras em minúsculas e maiúsculas;
- center(): centraliza uma string para um determinado número de caracteres, utilizando um caractere a ser definido para preencher a string dos dois lados. ljust() e rjust() fazem o mesmo, mas preenchem caracteres apenas à esquerda ou à direita;
- find(): indica se uma determinada substring faz parte de uma string e retorna a posição onde começa esta substring. Caso não, a função retorna -1;
- in e not in: retorna "True" ou "False" caso a substring faça parte de uma string;
- isalnum(), isalpha() e isnumeric(): indicam se uma determinada string é, respectivamente, totalmente formada por caracteres alfanuméricos, alfabéticos (só contem letras) e números. Se as strings tiverem pelo menos um caracter que invalide cada condição, estas funções retornarão “False”. Vale notar que espaço em branco na string torna uma string inválida para qualquer uma destas funções;
- isspace(): retornará True se a string for constituída somente de espaços, tabulações e quebras de linha e não estiver vazia;
- istitle(): retornará True se a string for constituída somente de palavras que comecem com uma letra maiúscula seguida somente de letras minúsculas;
- len(): retorna a quantidade de caracteres presentes na string, sendo a string passada como um argumento para ela;
- replace(): substitui uma parte de uma string por outra parte, definidas nos dois primeiros argumentos da função;
- strip(): remove espaços no começo e no fim das strings. rstrip() e lstrip() removem, respectivamente, espaços à direita e à esquerda da string;
- slice: fatia uma string a partir ou até indíces passados como parâmetros. O zero ou fim pode ser omitido com o uso de dois pontos;
- join(): útil quando temos uma lista de strings que devem ser unidas em um único valor de string;
- split(): é útil quando temos um string e queremos separá-la em uma lista.
2.2 - Listas
As listas do Python são os arrays das outras linguagens, estruturas de dados sequenciais que servem para armazenar outros diferentes tipos de dados. As listas podem armazenar qualquer tipo de dado, como números inteiros, strings, números decimais e até outras listas. Para criar uma lista, basta definir seus itens entre colchetes “[]” e separados por vírgula. Também é possível criar uma lista vazia, definindo apenas os colchetes, sem nenhum item dentro deles. Itens não precisam ser todos do mesmo tipo.
Para acessar os itens de uma lista, utiliza-se o índice de cada uma delas, ou a posição que o item desejado ocupa na lista, ondeprimeiro item é o de índice 0 (zero). Também pode usar índices negativos, e assim a contagem será feita do final da lista. Da mesma forma, também podemos alterar o valor que está nestes índices. Ex:
Quando é preciso adicionar novos itens a uma lista é utilizada a função append(), que recebe como parâmetro o item a ser adicionado ao final da lista. Para inserir um item em um índice específico é utilizada a função insert(índice, item). Para unir uma lista ao final de outra é utilizada a função extend(lista) ou concatenando com o sinal "+". Ainda é possível usar o sinal de multiplicação para repetir itens de uma lista. Ex:
Para remover itens de uma lista, temos as funções remove(item) e pop(). A função "remove()", apaga o item com base em seu valor, caso exista mais de um apagará o primeiro item que corresponder ao valor. A função "pop()" remove o último item da lista ou o item passado como índice e retorna o item removido. As listas também têm uma funcionalidade slicing a partir de um intervalo passado. Ex:
Funções úteis para trabalhar com listas
- len(): retorna a quantidade de itens em uma lista;
- append(x): adiciona um elemento ao fim da lista;
- index(x): retorna o índice (ou posição) de um determinado elemento da lista;
- max() e min(): retornam o valor máximo e o mínimo em uma lista;
- copy(): forma correta de criar uma cópia de uma lista;
- clear(): remove todos os itens da lista;
- count(): retorna a quantidade de vezes que um determinado item ocorre em uma lista;
- sort(): ordena uma lista. Não retorna nenhum valor, mas sim ordena a lista permanentemente. Caso seja preciso manter os dados na ordem que estavam e apenas fazer uma exibição da lista ordenada, deve-se fazer uma cópia da lista;
- reverse(): reverte a ordem dos elementos de uma lista. Assim como a função “sort()”, ela executa a operação permanentemente na lista onde é chamad;
- in: verifica se um determinado item consta ou não na lista;
- split(): retorna uma lista a partir de uma string e de um separador definido, que pode ser qualquer coisa, mas por padrão é um espaço;
- join(): retorna uma string a partir de uma sequência de items (strings), com os itens da sequência divididos por um determinado separador;
- set(): Retorna um dado do tipo "Set" com elementos não repetidos da lista.
2.3 - Tuplas
As tuplas assemelham-se bastante às listas. São estruturas que armazenam dados de diferentes tipos, em forma de lista. A grande diferença é que ao contrário de uma lista, uma tupla é imutável. Você não pode redefinir elementos de uma tupla, alterar seus valores ou qualquer coisa do tipo. A forma para se criar uma tupla é bastante semelhante à de uma lista também. Só que ao invés de usarmos colchetes, usa-se parênteses e itens separados por vírgulas. Também é permitido criar uma tupla vazia, definindo apenas os parênteses, sem qualquer elemento dentro.
A ordem dos elementos numa Tupla será a ordem na qual estes foram definidos, ou seja, não é possível ordenar em tempo de execução os elementos.
Para acessar seus elementos, utiliza-se o índice entre colchetes e é possível realizar o slicing.
Para apagar uma tupla completamente, através da função "del()":
Algumas das funções para listas também funcionam com as tuplas, como "len()", "max()" e "min()".
Também é possível transformar uma tupla em uma lista e vice-versa, através das funções list e tuple:
2.4 - Dicionários
Os dicionários do Python são mais uma estrutura para armazenar dados que implementam mapeamentos. Entretanto, o que difere significativamente os dicionários das listas é que no dicionário, o índice é um nome.
Para criar um dicionário, usamos as chaves ({}). Os elementos seguem o formato
“chave” : “valor”. Ex:
É possível criar um dicionário vazio, definindo apenas as chaves, sem elementos dentro. Para acessar os dados de um dicionário, usamos o mesmo formato das listas, porém, como o índice é nomeado. Para modificar um valor é como nas listas, bastandoindicar a chave que se deseja alterar e definir o novo valor. A inclusão de um novo item no dicionário é feita da mesma forma, utilizando uma chave que ainda não foi utilizada no mesmo. Ex:
Para remover uma determinada chave e seu valor, usamos o "del". Para apagar todas as chaves e valores, usamos o método "clear", chamado através do dicionário:
Funções úteis para Dicionários
Algumas das funções que utilizamos com as listas também funcionam com os dicionários. É o caso da função "len()", "in" e "pop(chave)". Outras funções:
- get(): útil para evitar erros de chave inexistente, recebendo dois parâmetros, a chave a ser buscada e um valor de retorno. Ela retorna o valor de desta chave se ela existir no dicionário, e se não existir, retorna aquilo que foi definido como valor de retorno ou None se nenhum valor de retorno for definido, usando o formato x.get(chave,valor_default);
- items(): retorna uma lista de tuplas com os pares “chave” : valor;
- keys(): retorna uma lista apenas com as chaves do dicionário;
- values(): retorna uma lista apenas com os valores dos itens do dicionário;
- update(): recebe um dicionário como parâmetro e insere os pares deste dicionário parâmetro no dicionário através do qual a função é chamada. Caso existam chaves coincidentes, o primeiro dicionário é atualizado com os valores do dicionário passado como parâmetro
3 - Estruturas de controle e Laços de repetição, Módulos e Funções
3.1 - Estruturas de controle e Laços de repetição
If, else e elif
O “if” é uma estrutura de controle que executa um determinado bloco de código baseado em uma condição. Se a condição estipulada for verdadeira, o bloco logo abaixo será executado. Este bloco de código a ser executado deve estar indentado, ou seja, com espaços em seu início, e sempre com a mesma quantidade de espaços para que o Python possa identificar onde ele começa e termina. O else é sempre executado se a condição estipulada no if não for verdadeira.
Pode-se usar o “elif” quantas vezes for necessário, para testar quantas condições. Se nenhuma delas for verdadeira, o bloco “else”, localizado ao final, é executado.
Loops - For
Os loops são estruturas de controle para repetição. O loop “for" itera sobre os elementos de uma sequência, executando o código no bloco indentado logo abaixo. Pode ser uma string, uma lista etc, algo que possa ser iterável. No caso de dicionários, que possuem pares chave-valor, é possível iterar sobre apenas um ou sobre os dois elementos (para chave e valor, caso o valor seja número deverá ser convertido para string). Ex:
No caso da impressão dos números, podemos usar a função "range()", que cria uma sequência de números inteiros, podendo receber um ou dois parâmetros. Recebendo um parâmetro, ela cria o intervalo que vai de 0, até o número passado na função, excluindo o próprio número. Caso sejam passados dois parâmetros, o intervalo começa no primeiro e termina no segundo.
Dois comando importantes presentes nos loops são o "break" e o "continue", que alteram o fluxo natural de um loop. Break para a execução do loop. Continue não executa mais nada naquele ciclo de iteração e passa para o próximo.
Loops - while
O loop while é semelhante ao for, no sentido que ele leva a repetição de um bloco de código. Entretanto, ele executa este código enquanto uma certa condição definida for verdadeira. Ex:
Este exemplo vai imprimindo a variável contador, e no final do bloco de código, aumenta seu valor em 1. Conforme a condição, enquanto o contador for menor que 5, o bloco de código dentro dele será executado. Quando o valor chega em 5, a condição não é mais verdadeira e o bloco não é mais executado. Têm de se tomar cuidado com o loop while, pois se você definir uma condição que nunca se torne falsa entrará um loop infinito.
Outra possibilidade é definir como condição para execução do loop "while True" e dentro do loop, definir alguma condição onde se execute o "break" tal como um "if else".
Exercicios:
3.2 - Módulos
Módulos são uma forma de organizar o código. Basicamente, defini-se funções em um arquivo e para permitir a reutilização em outros projetos. É possível a utilização de módulos próprios, de terceiros ou os disponibilizados pelo Python. Para a utilização dos módulos é utilizada a palavra "import" e o módulo ou função do módulo, no início do script. A importação poderá ser realizada das seguintes formas:
import modulo
from modulo import funcao
from modulo import *
Na última variação da forma anterior o asterisco indica que tudo que está no módulo deve ser importado. Parece prático, mas esta forma nos expõe a riscos, pois há a possibilidade de existir funções que tenham o mesmo nome das utilizadas no projeto, podendo causar sobreposição de chamadas.
Se for preciso criar um módulo em outra pasta o Python procura pelos módulos da seguinte forma:
- Primeiro: procura no diretório atual; este seria o diretório que contém o script onde você está importando o módulo ou o diretório que iniciou o terminal do Python;
- Segundo: o Python procura em cada diretório definido no PYTHONPATH, que é uma variável do sistema que possui uma série de diretórios onde módulos podem ser encontrados;
- Por último: o Python checa o diretório padrão da instalação do Python que está sendo utilizada. No caso do Linux, por exemplo, costuma ser “/usr/local/lib/python”.
Para conferir os diretórios presentes no seu PYTHONPATH, basta entrar no terminal do Python e seguir os comandos abaixo:
import sys
sys.path
O Python já vem com uma série de módulos predefinidos. Para estes, não é preciso definir nada, apenas importar e usar. Um exemplo é o módulo sys, que usamos no último exemplo e contém funções e parâmetros específicos do sistema.
Módulo os
- os.getcwd(): Retorna uma string representando o diretório de trabalho atual;
- os.read(file, buffersize): Lê uma determinada fração de um arquivo aberto;
- os.write(file, string): Escreve uma determinada string em um arquivo;
- os.chmod(file, mode): Altera as permissões de um arquivo aberto;
- os.chdir(path): Altera o diretório de trabalho corrente; e
- os.system(command): Executa o comando (uma string) em um subshell.
Módulo Requests
- x = requests.get(url): Realiza uma requisição GET;
- x = requests.post(url): Realiza uma requisição POST;
- x.status_code: Retorna o status da requisição feita;
- x.text: Retorna o texto página;
- x.headers: Retorna os headers da requisição; e
- x.cookies: Retorna os cookies que estão salvos.
Uma lista completa de módulos padrões do Python pode ser encontrada no seguinte links: https://docs.python.org/3/library/
3.3 - Funções
Funções são blocos de código que podem ser reutilizados quantas vezes forem necessárias e podem receber ou não parâmetros. O Python já vem com muitas funções predefinidas. Tais como "len()" e "print()", por exemplo, além das presentes em módulos utilizados.
A estrutura básica para definir uma função é através da declaração "def", depois o nome da função e parênteses. Caso a função não receba parâmetros, os parênteses ficarão vazios. Se receber, os parâmetros devem ser nomeados na definição. Funções podem ter valores retornados. Definimos o valor a ser retornado pela função através do comando "return". O que é retornado pode ou não estar entre parênteses.
Variáveis definidas em funções são locais, isto é, só podem ser usadas nas funções em que foram definidas. Variáveis definidas fora de funções são conhecidas como variáveis globais. É possível no código de uma função ler o conteúdo de uma variável
global. Para alterar uma variável global, ela precisa ser declarada no corpo da função usando o comando global (global
É possível definir um valor padrão para um argumento para caso ele não receba nenhum valor na chamada da função.
Os argumentos recebem os valores de acordo com a ordem de declaração, mas na chamada da função há a possibiliade de atribuir os valores nomeando os argumentos. Ex:
Existe uma forma no Python de definir as funções para que recebam uma quantidade variável de argumentos, além da forma normal de definição de argumentos. Esta forma é através da definição de argumentos com um ou dois asteriscos antes de seus nomes. Por convenção, costuma-se utilizar os nomes *args e **kwargs, mas não existe uma restrição do Python para que sejam utilizados apenas estes nomes. Ambas as formas permitem que seja passado para a função um número qualquer de argumentos. A diferença entre eles é que com um asterisco, ou, por convenção, *args, estes argumentos não são nomeados, enquanto a função com o formato de dois asteriscos, **kwargs, utilizam-se argumentos nomeados na chamada da função. É possível utilizar estes com o formato convecional de declaração de parâmetros. Ex:
Exercícios:
Questionário:
1 - A chave de um item de um dicionário é imutável, mas o conteúdo do item não. O conteúdo do item pode ser modificado.
R: Verdadeiro.
2 - Dicionários são listas associadas e compostas por uma chave única com estruturas correspondentes. Assim como as listas, os dicionários também são mutáveis.
R: Verdadeiro.
3 - No Python não existem tipos primitivos, mas sim estruturas de dados já padronizadas. Os tipos no Python podem assumir duas características: (Mutáveis) - é possível alterar o conteúdo da variável; (Imutável) - não é permitido alterar o conteúdo da variável.
R: Verdadeiro.
4 - Python utiliza a nomenclatura tipo primitivo para dados genéricos. São os de built-ins (ou tipos de objetos), que são classes definidas e padronizadas dentro da máquina virtual do Python. Isso se dá devido ao fato de que no Python nem tudo é objeto.
R: Falso.
5 - As listas são imutáveis, ou seja não podem ser alteradas.
R: Falso.
6 - O comando "x=15<14" indica que a variável x irá receber o valor "True".
R: Falso.
7 - As constantes booleanas são usadas para a tomada de decisão. É por meio delas que avaliaremos o resultado de uma sentença (condição) e dentro de uma estrutura de decisão seguiremos um caminho ou outro.
R: Verdadeiro.
8 - As listas são mutáveis, ou seja podem ser alteradas.
R: Verdadeiro.
9 - A estrutura de decisão "if else" testa uma determinada condição. Ela possui dois blocos de comandos. Caso essa condição avaliada pelo if seja verdadeira ele executa o primeiro bloco de comandos dentro da estrutura, antes do else. Caso a condição seja falsa ela executa o segundo bloco, depois do comando else. O primeiro bloco só é executado se o resultado do teste da condição for verdadeiro. O segundo bloco só é executado se o resultado do teste da condição for falso.
R: Verdadeiro.
10 - Listas são sequências organizadas de valores, na qual cada dado é mostrado por meio de índice.
R: Verdadeiro.
11 - Para quebrar uma linha na impressão de uma mensagem na tela com PRINT utilizamos o \n .
R: Verdadeiro.
12 - No laço while (enquanto), o trecho de código da repetição está associado a uma condição. Enquanto a condição tiver valor verdadeiro, o trecho é executado. Quando a condição passa a ter valor falso, a repetição termina.
R: Verdadeiro.
13 - A Estrutura de repetição é utilizada para executar uma mesma sequência de comandos várias vezes. A repetição está associada ou a uma condição, que indica se deve continuar ou não a repetição, ou a uma sequência de valores, que determina quantas vezes a sequência deve ser repetida.
R: Verdadeiro.
14 - O comando if é utilizado quando precisamos decidir se um trecho do programa deve ou não ser executado. Ele é associado a uma condição, e o trecho de código será executado se o valor da condição for verdadeiro.
R: Verdadeiro.
15 - O Python oferece uma série de operadores pré-definidos para manipular números por meio de cálculos e operações lógicas. Além dessas operações mais comuns, o Python oferece, ainda, outras funções para manipular tipos numéricos. Relacione as FUNÇÕES com suas respectivas descrições (significados):
- round(): retorna um número real com arredondamento;
- pow(): eleva um número pelo outro;
- int(): converte para número inteiro;
- hex(): converte para hexadecimal;
- abs(): retorna o valor absoluto do número;
- float(): converte oara um número real;
- oct(): converte para octal; e
- str(): converte para string..
16 - As estruturas de repetição são conhecidas também como laços (loops).
R: Verdadeiro.
17 - Para declarar uma variável como real podemos usar o construtor FLOAT(). Ex: valor=float(2.5).
R: Verdadeiro.
18 - Para declarar uma variável como inteiro podemos usar o construtor INT(). Ex: valor=int(3).
R: Verdadeiro.
19 - Em python o tipo "float" significa que a variável será do tipo numérico apenas com números reais.
R: Verdadeiro.
20 - O comando "soma = a % b" significa que estamos atribuido à variável "soma" o valor do resto da divisão da variável "a" pela variável "b". Se "a" valer 10 e "b" valer 3 a variável "soma" receberá 1.
R: Verdadeiro.
21 - O while é um comando muito útil, mas pode ser perigoso, pois, se não tratarmos corretamente o critério de parada, o laço pode não ter fim, e o programa não faz o que deveria e pode entrar em loop infinito, como é chamado. Escolha uma opção:
R: Veradeiro.
22 - Para usar funções matemáticas em Python, como seno (sin), cosseno (cos), tangente(tan), raiz quadrada (sqrt) e fatorial (factorial) devemos utilizar o módulo "math". Para utilizar todas as funções do módulo math fazemos: import math.
R: Verdadeiro.
23 - O while é um comando que manda um bloco de código ser executado enquanto uma condição não for satisfeita. Assim, permite que sejam criados loops de execução.
R: Verdadeiro.
4 - Expressões Regulares e Manipulação de Arquivos
4.1 - Expressões Regulares
Expressões regulares são padrões de caracteres que associam sequências de caracteres no texto. Os usos mais comuns de regex são:
- Buscar uma string (re.search e re.match);
- Achar uma string (re.findall);
- Quebrar uma string em sub strings (re.split);
- Substituir parte de uma string (re.sub)
Módulos:
- re.match() - Esse método encontra equivalência se ela ocorrer no início da string;
- re.search() - É similar a match() mas não restringe a encontrar equivalência apenas no começo da string;
- re.findall() - É útil obter uma lista de todos os padrões encontrados. Não há restrições em buscar do começo ou do fim;
- re.split() - Este método ajuda a dividir a string pela ocorrências do padrão dado;
- re.sub() - Às vezes é útil buscar um padrão de string e substituí-lo por uma nova sub string. Se o padrão não for encontrado, a string é retornada sem mudanças; e
- re.compile() - Podemos combinar uma expressão regular com objetos de padrões, que pode ser usado para encontrar padrões. É útil também para buscar um padrão sem ter que reescrevê-lo.
Classes de caracteres delimitada por colchetes: [], [abc], [1*]...
Para localizar um conjunto de caracteres que não tem uma classe de caracteres predefinida, utilize colchetes [ ].
- O padrão "[adm]" localiza um único caractere. Ou o caractere a ou d ou m;
- O padrão "[C-G]" identifica uma letra maiúscula individual no intervalo de C a G.
EX: regex = r'[\w.+-]+@[\w-]+\.[\w.-]+'
Classes predefinidas de caracteres: \d, \w, \D...
- \d (digit) - Um dígito é qualquer caractere numérico (0, 1, 2, 3, ... , 9);
- \w (word) - Um caractere de palavra é qualquer letra (maiúscula ou minúscula), qualquer dígito ou o caractere sublinhado;
- \s (space) - Um caractere de espaço em branco é um espaço, uma tabulação, um caractere de nova linha ou um avanço de formulário.
Ex: regex = r'[\w.+-]+@[\w-]+\.[\w.-]+'
Quantificadores: *, +, ?, {x}…
- "*": Localiza zero ou mais ocorrências da sub expressão imediatamente anterior a "*". Localiza zero ou mais ocorrências de um dígito;
- "+": Identifica uma ou mais ocorrências da sub expressão imediatamente anterior "+";
- "?": Localiza zero ou uma ocorrência da expressão que ele quantifica;
- ".": Corresponde a qualquer caractere único, exceto a nova linha "\ n".
Ex: regex = r'[\w.+-]+@[\w-]+\.[\w.-]+'
Documentação: https://docs.python.org/3/library/re.html
Exercícios:
4.2 - Manipulação de arquivos
Seguintes etapas:
- Abrir o arquivo: associar um arquivo físico a um objeto arquivo;
- Manipular o arquivo: ler ou gravar dados usando os métodos do objeto arquivo; e
- Fechar o arquivo.
A função open()
Esta é a função mais primária para abrir com arquivos e recebe dois parâmetros, o nome do arquivo e o modo de abertura. O modo indica o que pode e não pode fazer com o arquivo.
Estes são os métodos mais utilizados, apesar de termos outros métodos, cuja lista completa pode ser encontrada no seguinte link: https://docs.python.org/3.6/library/functions.html#open
Comando: open(file, mode, buffering) onde:
- file: caminho/nome do arquivo [str];
- mode: modo de operação (opcional):
- 'r': leitura (default);
- 'w': escrita;
- 'b': binário;
- 'a': escrita a partir do final;
- '+': (usado com r) indica leitura e escrita; e
- 't': (usado com r,a,w): indica modo texto(default).
- buffering: indica se memória (buffers) é usada para acelerar operações de entrada e saída (int opcional).
Operações com um arquivo aberto:
- read(): retorna uma str com o contéudo do arquivo;
- write(x): escreve a str x no arquivo;
- readline(): retorna str com uma linha do arquivo; e
- readlines(): retorna list com cada elemento sendo uma linha do arquivo.
Ex: Abrindo o arquivo para leitura:
arq = open("dados.txt")
Lendo os dados do arquivo:
texto = arq.read()
print(texto)
Fechando o arquivo:
arq.close()
Abrindo um arquivo
Passando um número inteiro para a função “read()”, é possíveç definir a quantidade de caracteres a serem retornados na leitura. Contudo, o objeto "file" guarda a uma determinada posição dentro do arquivo (como um ponteiro), que indica onde está escrevendo / lendo). Ao abrir o arquivo, esta posição é 0, ou seja, o primeiro caractere do arquivo. Após usar a função “read()”, o ponteiro se move para o último caractere. Então, após a primeira leitura, ao abrir o arquivo novamente para fazer a leitura o início será após o fim da primeira leitura. A função "readline()" lê uma única linha do arquivo. Caso siga repetindo a função, a mesma vai lendo as linhas seguintes do arquivo.
Escrevendo em um arquivo
Para escrever em um arquivo, usando para isso o modo "w" na função "open()", conforme vimos mais acima. Depois, usa-se a função "write()" para escrever no arquivo aberto. Além disso, também é importante fechar o arquivo com a função "close()". O Python faz isso para no final de um programa, mas é uma boa prática fechar o arquivo após usá-lo.
Adicionando a um arquivo
Vamos agora adicionar texto a um arquivo já existente. Para isso, vamos abrir o arquivo no modo "a". A função neste modo é a mesma usada para novos arquivos, "write()".
Abrindo no modo r+
O modo "r+" permite tanto a leitura quanto a escrita em arquivos. A posição inicial ao abrir o arquivo neste modo é 0, de forma que qualquer coisa que seja escrita sem que se mova a posição substituirá o que está no começo. Para alterar a posição se usa a função "seek()", fornecendo a posição para a qual você deseja alterar:
file = open("novo_arquivo.txt", "r+")
file.write("Testando r+")
file.seek(10)
file.write("Novo teste do r+")
file.close()
Exercícios Gerais:
Extra: Diferenças entre bytes, str e unicode
No Python 3, existem dois tipos que representam caracteres: bytes e str. Instâncias de bytes contêm valores primários de 8 bits. Instâncias de str contêm caracteres Unicode.
No Python 2, existem dois tipos que representam sequências de caracteres: str e unicode. Em contraste com o Python 3, instâncias de str contêm valores primários de 8 bits. Instâncias de unicode contêm caracteres Unicode.
Existem muitas maneiras de representar caracteres Unicode como dados puramente binários (valores primários de 8 bits). A codificação mais comum é UTF-8. É importante observar que as instâncias str em Python 3 e unicode em Python 2 não têm uma codificação binária associada. Para converter caracteres Unicode para dados binários, é preciso usar o método encode. Para converter dados binários para caracteres Unicode, é preciso usar o método decode.
Ao escrever programas em Python, é importante codificar e decodificar o Unicode no limite mais longínquo de suas interfaces. O núcleo de seu programa deve usar apenas caracteres Unicode (str no Python 3, unicode no Python 2) e não devem fazer nenhum julgamento quanto à codificação deles. Essa regrinha permite que o programa possa ser bastante assertivo a respeito de codificações alternativas de texto (como Latin-1, Shift JIS e Big5) enquanto mantém-se bastante rigoroso a respeito da codificação do texto de saída (idealmente, UTF-8).
A confusão causada pelos tipos de caractere causa duas situações muito comuns quando se codifica em Python:
- Operação com valores brutos de 8 bits codificados em UTF-8 (ou qualquer outra codificação);
- operaçãor com caracteres Unicode que não estão codificados em nenhum padrão específico.
Serão necessárias duas funções auxiliares para converter entre esses dois casos e assegurar que o tipo do valor de entrada é o que o código está esperando que seja.
No Python 3, precisaremos de um método que aceite um str ou bytes e sempre retorne str.
def to_str(bytes_or_str):
if isinstance(bytes_or_str, bytes):
value = bytes_or_str.decode('utf-8')
else:
value = bytes_or_str
return value # Instância de str
Será necessário outro método que aceite valores str ou bytes e sempre retorne bytes.
def to_bytes(bytes_or_str):
if isinstance(bytes_or_str, str):
value = bytes_or_str.encode('utf-8')
else:
value = bytes_or_str
return value # Instância de bytes
Em Python 3, as operações envolvendo "handlers", os manipuladores de arquivos (devolvidos pela função nativa open), sempre esperam codificação UTF-8 por default. No Python 2, o default para as operações de arquivo é sempre o tipo binário. Isso causa falhas inesperadas, especialmente para os programadores acostumados com o Python 2. A causa dessa exceção é o novo argumento encoding para a função open, adicionado no Python 3. Esse parâmetro tem como valor default "utf-8". Com isso, as operações read e write em manipuladores de arquivos esperam receber instâncias str contendo caracteres Unicode em vez de instâncias bytes contendo dados binários. Para que isso funcione de forma apropriada, é preciso indicar que o arquivo será aberto em modo de escrita binária ('wb') em vez do modo de escrita de texto ('w'). O trecho de código a seguir emprega a função open de uma maneira que funciona tanto em Python 2 como em Python 3:
with open('/tmp/random.bin', 'wb') as f:
f.write(os.urandom(10))
Lembre-se:
- No Python 3, bytes contêm sequências de valores puros em 8 bits e str contém sequências de caracteres Unicode. Instâncias bytes e str não podem ser usadas juntas com operadores (como > ou +);
- No Python 2, str contém sequências de valores de 8 bits e unicode contém sequências de caracteres Unicode. str e unicode podem ser usados juntos com operadores desde que str contenha apenas caracteres ASCII de 7 bits;
- Use funções auxiliares para assegurar que as entradas que estão sendo manipuladas são do tipo de caractere que o código está esperando (valores de 8 bits, caracteres codificados em UTF-8, caracteres Unicode etc.); e
- Se deseja ler ou escrever dados binários em um arquivo, sempre o abra usando o modo binário (como 'rb' ou 'wb').