Python: características, noções e guia de estudo

Guia de Estudos Python

Sabe aquela pergunta: “Qual linguagem de programação devo aprender primeiro?Python é a melhor resposta atualmente e explicarei os motivos neste post.

Guia de Estudo Python

Guia de Estudo Python

Você conhece algum ranking das principais linguagens de programação? TIOBE, PYPL, StackOverflow, IEEE, RedMonk? Esses são os principais, internacionais, que possuem diferentes critérios. Eles avaliam desde a popularidade até o volume de uso de diversas linguagens de programação. Levam em consideração aplicações profissionais, cursos, tutoriais e outros contextos de utilização das linguagens.

E quanto o Ranking de Linguagens da Universidade da Tecnologia (UT), que lançamos em 2018 neste blog? Ele traz uma análise das linguagens de programação com um foco diferente dos demais. Primeiro, elege e limita as principais linguagens de programação do mundo, que são as nomeadas. Esse processo é feito baseado nas intersecções de linguagens entre os rankings já consolidados e citados. Depois, fornece a  ordem em que cada linguagem nomeada deve ser aprendida, considerando quem quer aprender a programar. Um ponto interessante é que, para quem não é iniciante, ele também é útil, pois cria uma referência de evolução. Assim, o ranking aponta uma escalada ideal no mundo da programação, com possíveis trilhas de especialização ao longo do caminho.

Para saber mais sobre nosso ranking, como conhecer seus critérios e ver a lista completa, é só acessar o post aqui. Mas vamos ao que interessa aqui: a campeã do Ranking de Linguagens UT de 2018 é a linguagem Python! Ela é, neste momento, a primeira linguagem a ser aprendida por quem ainda não sabe programar.  Por isso, neste post trataremos a campeã com a devida atenção, apresentando um guia de estudo da linguagem Python, quase um manual de funcionamento básico, que faz parte da série Poliglota em Linguagens de Programação (e, assim, segue a mesma estruturação dos demais).

1. Características da linguagem Python

Python é uma linguagem de programação imperativainterpretada, de alto nível e com tipagem forte e dinâmica (para saber mais sobre essas classificações clique aqui).

Ela é considerada uma linguagem multi-paradigma, pois aceita diferentes formas de programação. A saber: programação orientada a objetos, procedural e funcional.

Segundo Robert Sebesta, consagrado autor do livro Conceitos de Linguagens de Programação, atualmente em sua 11ª edição, alguns autores se referem às linguagens de scripting como uma categoria separada de linguagens de programação. Entretanto, as linguagens nessa categoria são mais unidas entre si por seu método de implementação, interpretação parcial ou completa, do que por um projeto de linguagem comum. Assim, as linguagens de scripting, dentre elas Python, Perl, PHP, JavaScript e Ruby, são imperativas em todos os sentidos.

1.1 Nascimento

Python foi oficialmente lançada em 1991 por Guido van Rossum no Stichting Mathematisch Centrum, na Holanda. Atualmente, o desenvolvimento da linguagem é feito pela Python Software Foundation. Trata-se de uma linguagem com código aberto e disponível para a maioria das plataformas de computação.

Tradicionalmente, ela sempre foi usada para administração de sistemas, programação em CGI (Common Gateway Interface) e outras tarefas computacionais relativamente pequenas. Porém, com a chegada de frameworks interessantes e suporte da linguagem em diferentes servidores web, Python tem se destacado nos últimos anos.

Tal é sua atualidade e importância que ela é uma das duas linguagens cobradas no concurso público de 2018 da Polícia Federal para todos os cargos. Agente, delegado, perito, escrivão e papiloscopista, todos precisam ter noções de Python.

Vamos entender melhor os motivos dessa ascensão.

1.2 Diferenciais

Uma das principais características de Python é quanto a sua forma peculiar de escrever e, consequentemente, ler o código. Nela, não existem os tradicionais delimitadores formados por chaves, usados em linguagens como C, C++, C# e Java, por exemplo. Já o ponto e vírgula, usado como final de um comando nessas linguagens que citei, é opcional em Python. Só essas duas características já diferenciam bem Python das demais quanto a legibilidade e escrita, o que atrai programadores iniciantes.  Veja o famoso algoritmo de Fibonacci escrito em Python, que é um dos banners da página oficial. Há quem considere esse estilo de escrita revolucionário e moderno, por evitar símbolos repetitivos como as chaves. Cada escopo é delimitado pela indentação no código.

fib

Pelo fato da linguagem consistir em um projeto aberto, a linguagem possui muitas contribuições da comunidade. Cada framework lançado que proporcione à Python atuar em uma nova área de aplicação, porém com igualdade de condições perante outra linguagem já estabelecida, tende a ganhar rapidamente muitos utilizadores. A linguagem tem efetivamente uma legião de fãs e, assim, cada vez mais se consolida em diferentes mercados. Atualmente é possível usar Python até como uma linguagem funcional para aplicações de inteligência artificial, por exemplo.

Outro recurso interessante de Python é que ela pode ser facilmente estendida por qualquer usuário. Os módulos que suportam as extensões podem ser escritos em qualquer linguagem compilada. Extensões podem adicionar, ao interpretador Python, funções, variáveis e tipos de objetos. Isso, junto com a característica de ter código aberto e de seus desdobramentos,  justifica sua escolha para muitas organizações governamentais. Elas, preferencialmente, não devem utilizar tecnologia proprietária, das quais não possuirão total controle. Python representa uma solução que possui código-fonte aberto e pode ser estendida para diferentes propósitos.

1.3 Python como linguagem inicial

Um dos desafios de um professor que vai ensinar programação em alguma disciplina, como Algoritmos e Estrutura de Dados, é escolher qual linguagem de programação usar.

Recentemente, li esse material em que o professor Jeff Elkner relata, no prefácio, a diferença entre ensinar programação usando C++ comparado a Python. Já passei  pelo mesmo problema como aluno e, depois, como professor. Imagine uma primeira aula de C++, em que o professor só quer mostrar o código para realizar uma impressão na tela via programação e tem que explicar o que é o main, argc, argv, include, void, compilação etc . O aluno precisa abstrair muitos conceitos para entender só o comando de impressão na tela.

Na linguagem Java, a curva pode ser ainda mais brutal para um aluno sem nenhuma noção de programação. Depois de instalar o JDK, o aluno tem que escrever o código em um arquivo . java, compilar com javac.exe e ainda chamar o interpretador JVM (java.exe) com o arquivo bytecode .class gerado para rodar o programa. Isso sem falar que o aluno precisa saber orientação a objeto. Só nesse começo, você já coloca o aluno para correr. Se o intuito é aprender e encorajar (afinal muitos acham programação complexo demais e desistem logo no início), o ideal é que a linguagem permita uma curva de aprendizado mais suave. É exatamente o que Peter Novig fala no ensaio “Aprenda Programação em 10 anos”, de que não é adequado começar por C++ ou Java, linguagens abrangentes, complexas e largamente usadas em ambientes corporativos. Deve-se escolher uma linguagem mais simples para iniciar.

Python é bem superior quanto à simpatia na primeira impressão. Trabalha imediatamente o conceito de entrada e saída, permitindo que o aluno, gradualmente, incremente e sofistique a entrada para obter saídas mais complexas em termos de processamento de dados.

1.4 Propósitos

A boa impressão pela legibilidade e facilidade de se aprender a codificar é apenas a porta de entrada de Python. De nada adianta uma linguagem ser fácil de aprender, se ela não tem demanda no mercado de trabalho. Algumas linguagens criadas especificamente para fins didáticos, como Pascal e Basic, nunca tiverem plena aceitação no mercado e precisaram se adaptar com o tempo, sendo preteridas por linguagens difíceis de aprender, mas muito mais poderosas, como C++ e Java.

Já vi pessoas aprendendo a programar bons algoritmos conceitualmente, usando pseudocódigo (código escrito em linguagem natural, como em português), mas que não faziam ideia de como programar aquilo efetivamente. Claramente, nessa situação, a teoria avançou demais em relação a prática.

Como aluno durante a graduação, já tive uma experiência do outro extremo. O professor de algoritmos I escolheu a linguagem Scheme, um dialeto de LISP, muito utilizado dentro da área de inteligência artificial, como primeira linguagem. Mão na massa na primeira aula. Ele acertou em cheio quanto ao aprendizado de programação, mas quanto às aplicações práticas, ou procura de vagas no mercado, errou. Para você que nunca ouvi falar de Scheme, uma surpresa: ela possui mais semelhanças com Python do que você imagina. Mas não vamos falar disso aqui. O fato é que, de 30 e poucas pessoas que se formaram na minha graduação, possivelmente só eu estou falando sobre Scheme novamente. Moral da história: nunca mais usei a primeira linguagem que aprendi (embora até hoje usufrua os conhecimentos indiretos desse aprendizado).

Escolhendo Python, a história é bem diferente. Na minha opinião, não se corre nenhum dos riscos citados e fica-se longe dos extremos. Afasta-se dos contras das linguagens complexas e reuni-se os prós em se trabalhar com uma linguagem simples, mas poderosa. Com Python, você pode programar essencialmente qualquer sistema.

1.5 Semelhanças com JS

Se você leu nosso post de guia de estudo da linguagem Javascript, deve ter identificado que as características iniciais são muito parecidas. Praticamente, só muda o tipagem forte (do Python) pelo fraca (do Javascript), o resto é igual em termos de características macro. Essa diferença, do forte para o fraca, refere-se à conversão de tipos de dados. Javascript faz praticamente qualquer tipo de conversão entre tipos, até as que o desenvolvedor não gostaria que fizesse. Python não faz, assim como C# e Java.

Existem mais semelhanças entre Python e JS:

  • Python também é uma linguagem de propósito geral, usada para várias finalidades atualmente e em pleno crescimento;
  • Python também é uma linguagem organizada em scripts;
  • Python também é uma linguagem multiparadigma, pois aceita diferentes estilos de programação;
  • Python também pode ser usada no desenvolvimento web full-stack, ou seja, tanto no front-end quanto no back-end (assim como JS com node.js)
  • Python também pode ser usada em qualquer plataforma que rode um servidor web, como um circuito eletrônico com Linux embarcado;
  • Por todos esses motivos, ambas estão no top 10 dos principais rankings de programação.

Entretanto, existem algumas diferenças também.

1.6 Diferenças para JS

Javascript roda de forma nativa no navegador. Isto é, se você abrir um bloco de notas e colocar um mínimo de código HTML e Javascript, o navegador vai rodar o código. Mesmo sem internet, de modo que o browser atua como o próprio interpretador da linguagem Javascript. Naturalmente, existem outros interpretadores de JS também.

Python possui um interpretador próprio, que você pode baixar gratuitamente a partir do site oficial e rodar no seu computador . Contudo, quando você for publicar seu programa feito em Python,esse interpretador precisa estar acessível de alguma forma para o outro lado rodar seu software.  Nesse sentido, a solução mais usada é instalar um interpretador em um servidor web, como acontece com a linguagem PHP em servidores Apache, por exemplo. Aliás, é possível também rodar Python em um servidor Apache.

Dessa forma, a linguagem pode ser usada para desenvolver um módulo back-end no desenvolvimento web, assim como PHP ou JS com node.js. No lugar de um formulário HTML (elemento action da tag <form>) chamar um arquivo .php no servidor, chama-se um arquivo .py (de python). No entanto, diferentemente de PHP e JS, não é possível mesclar código HTML junto com o código Python. Caso ela seja usada para criar o front-end, irá gerar as estruturas HTML via objetos instanciados e ajustados no código. Para essa tarefa existe um excelente framework, que é o Django.

Aqui faço uma pausa e proponho um desafio para verificar o poder de Django e Python. Vá no Youtube e digite “Django Blog 30 minutes”. Assista a um dos vídeos sobre como desenvolver um blog funcionalmente em 30 minutos com essa tecnologia.

Caso tenha ficado curioso com essa comparação com JS, deixo essa leitura para você (é simples, apenas uma boa resposta a uma pergunta).

1.7 Versões

A versão atual da linguagem Python é a 3.7, de 27 de junho de 2018. Como costumo reforçar, apesar de não ser o material mais didático para ler, a fonte de referência mais confiável é sempre a documentação oficial da linguagem. Isso vale para qualquer linguagem. Em teoria, ela está sempre atualizada com a versão atual e com a lista de alterações feitas a partir da última versão.

2. Recursos da linguagem Python

Nesta seção vamos seguir a estrutura de posts da Série Poliglota. Colocaremos aqui os principais recursos da linguagem nativos que podem ser usados para a programação. Mais para frente falaremos dos principais frameworks ou de outras IDEs.

Dessa forma, o caminho natural é acessar www.python.org, baixar a última versão e instalá-la. No meu caso, como estou usando Windows (peço desculpa aos Linux e MacOS lovers), demonstrarei nesse OS, mas saibam que é possível baixar nesses outros sistemas também, como mostra a imagem abaixo.

recursos linguagem python

instalando python

Feito isso, é só rodar o executável python.exe, que, na versão atual, será executado com o atalho chamado Python 3.7 (32-bit). Ao digitar python na tela de pesquisa do Windows aparece como a primeira opção, como mostra a figura abaixo.

atalho windows python

Um terminal, que também pode ser chamado de console, abrirá, como na imagem abaixo:

terminal console python

Para quem já passou dos 30, acredito a imagem do console traga lembranças do prompt do MS-DOS, embora as pessoas mais novas também podem conhecer. Afinal, o recurso existe até hoje. Para conferir, basta rodar o comando “cmd” apertando a tecla Windows + R. Alternativamente, pode-se apertar botão inciar, executar, e em seguida escrever CMD e apertar enter. 

A partir daí já é possível brincar de entrada e saída. Digite algo (entrada) e dê enter (para ver a saída).

2.1 Impressões na tela

O tradicional recurso de impressão na tela é novamente o ponto de partida. Tanto pra quem está apreendendo a programar como para quem já sabe e está aprendendo Python. Afinal, sempre é uma boa prática imprimir valores durante o processo de depuração para encontrar algum bug.

A função que faz isso em Python é a print(). Ela aceita diferentes valores como parâmetro, como um texto. Veja como fica um “Hello World” em Python.

hello world python

Alguns pontos importantes da imagem:

  • Interface horripilante. Aquelas informações iniciais de Python com sua versão, depois Type “help” e, em seguida, o comando print(“Hello World”), tudo preto e branco, deixa a coisa confusa e com um ar retrô que pode sugerir algo ultrapassado, justamente o que a Python não é.
  • Sem o uso de ponto e vírgula ao final (pode existir, de modo que é opcional). O acionamento da tecla enter executa o comando.
  • Um texto é digitado entre aspas duplas, tal qual várias linguagens de programação fazem.

2.2 Melhorando um pouco com IDLE

Algo que podemos fazer com os recursos nativos que vieram junto com a instalação original de Python é rodar o IDLE, um shell mais amigável para esses testes iniciais.

Só ir na tela de procura do Windows e digitar IDLE. Corresponde a última opção do menu que já mostrarmos anteriormente. Veja como um “Hello World” é visualmente mais simpático nele.

IDLE

As saídas são pintadas em azul, o comando print em rosa, parênteses em preto e um valor literal string, delimitado por aspas duplas, em verde.

Porém, o mais comum, é escrevermos um arquivo de script em Python no editor de nossa preferência, como o Visual Studio Code, e em seguida o rodarmos no shell ou no terminal. Ou ainda, usar uma das IDEs específicas para desenvolvimento em Python, discutidas na seção 3.

2.3 Operadores

Python possui diversos dos operadores tradicionais. Vamos vê-los divididos em categorias.

2.3.1 – Operadores Matemáticos

Até aqui, vimos que o comando print() pode ser usado para gerar saídas no console, mas ele não é o único a fazer isso. Dá para usar o interpretador como uma calculadora também, colocando expressões matemáticas direto no terminal, como uma soma ou subtração. Qualquer expressão matemática (válida) digitada ali será avaliada após um enter e gerará uma saída. Dessa forma, uma expressão com 2 números, como 1+1, ou outra com vários, como 5+22-13+7, pode ser usada normalmente.

É possível também usar os operadores de multiplicação (*), divisão (/), bem como organizar parênteses para modificar a precedência de operadores (que seguem a mesma definição da matemática, o que está entre parênteses primeiro, depois multiplicação e divisão na mesma ordem de prioridade, e por fim soma e subtração). Existe também o operador resto da divisão (%), como em Javascript, C++ e Java.

Além desses, temos também algumas que merecem destaque. A primeira é a operação de potência ou potenciação. Um número elevado ao outro. O número 2 ao quadrado (2 elevado a potência 2) e 2 ao cubo (2 elevado a potência 3) pode ser representado, em Python, por 2**2 e 2**3, respectivamente. Ou seja, o segundo operando é o valor da potência sobre o primeiro.

É perfeitamente possível também usar números com casas decimais. Para isso, basta usar o ponto (.). Por exemplo, 14.3 * 20 é uma expressão matemática válida.  Sendo assim, a operação de raiz ou radiciação está definida também, dado que ela é o inverso da potenciação. Raiz quadrada de 4 pode ser calculada como 4**0.5 ou 4**(1/2). Já a raiz cúbica de 27 como 27**(1/3).

As linhas em azul da figura abaixo mostram os resultados de todos os exemplos citados acima.

shell

2.3.2 – Operadores Lógicos

Agora você já pode abrir um terminal em Python no lugar da calculadora para fazer contas! Mas, naturalmente, não é para isso que Python serve. Ela pode ser usada muito além do processamento de expressões matemáticas. Fazem parte da linguagem também os tradicionais operadores lógicos, que são:

  • Igualdade, como 4 == 4
  • Diferente, como 3 != 4
  • Maior, como 4>3
  • Maior igual 4 >= 4
  • Menor, como 3<4
  • Menos igual, como 3<=3

Digite todas essas expressões lógicas, marcadas em azul, no terminal. Agora, troque alguns dos números 4 por 6 e rode de novo. A figura abaixo mostra os resultados dos novos testes.

operadores lógicos em python

Dessa forma, o resultado de uma expressão lógica é True ou False. Isso, junto com os operadores lógicos, não representa novidade nenhuma em relação as outras linguagens. C# e Javascript, por exemplo, possuem os mesmo operadores citados. JS tem até alguns a mais, como o operador precisamente igual (===), que Python não tem.

Porém, no restante dos operadores lógicos usuais, como o AND e o OR lógicos, Python difere. No lugar dos tradicionais && (AND) e || (OR) usados nas linguagens C, C++, C# e JS, Python usa simplesmente and e or. Simples assim. Para checar se um número armazenado em uma variável aux é maior que zero e menor que 5 basta escrever (aux > 0 and aux <5).

2.3.3 – Operadores especiais para strings

Ainda não falamos sobre tipos de dados, mas você já sabe o que é string. É o tipo de dado que representa um texto, como uma frase, um parágrafo ou um simples caractere. No primeiro exemplo, “Hello World” é um valor do tipo string ou, simplesmente, uma string. Até aqui vimos operadores aplicados a números, mas existem dois operadores especiais que podem ser usados com strings.

O primeiro é o símbolo de adição (+) que, quando usado com strings, provoca a concatenação de strings. Concatenar é juntar, assim, ao juntar uma string “texto1” com outra “texto2”, obtemos como resultado as duas juntas, concatenadas. De forma programática, fica: “texto1” + “texto2” = “texto1texto2”. Esse operação especial de concatenar strings com o operador + se chama sobrecarga de operador. Sobrecarga porque, justamente, o operador é usado para mais de uma função. Esse recurso existe em várias outras linguagens também.

No entanto, Python permite ainda a sobrecarga de um segundo operador matemático para strings. Trata-se do operador de multiplicação (*) que, quando usado com strings, torna-se um operador de repetição.  Assim, “texto1″*2 = “texto1texto1”.

Por fim, o caractere de escape dentro de uma string, ou seja, aquele usado para inserir símbolos ou comandos especiais, é a barra invertida. Um comando especial, por exemplo, é pular uma linha na string. Para isso, usa-se “\n”, como em várias outras linguagens também (C++, Java e Javascript). A imagem abaixo ilustra os exemplos dessa subseção.

2.4 Variáveis

Variáveis correspondem aos recursos de uma linguagem de programação que permitem ao desenvolvedor armazenar valores, alterá-los e utilizá-los no programa sempre que preciso. Em Pyhton não é diferente e a criação de variáveis ocorre exatamente como em Javascript. O nome da variável do lado esquerdo, sinal de igual, e o valor do lado direito. Esse tipo de comando é chamado de atribuição. Dessa forma, um sinal de igual (=) é usado para atribuições, enquanto dois sinais (==) é usado para comparações.

O comando print() também pode ser usado para impressão dos valores armazenados pelas variáveis. Para isso, é só usar o identificador (nome da variável) dentro dos parênteses do comando, como print(a) para imprimir na tela o valor retido pela variável a. Naturalmente, a variável precisa existir, que significa que ela precisa ser atribuída a algum valor antes de ser usada no comando print(). A imagem abaixo mostra a atribuição de 6 variáveis diferentes com os comandos de impressão na tela na sequência. Observações:

  • Um texto (string) pode ser digitado com aspas duplas ou simples, assim como um caractere.
  • Um comando de atribuição não gera saída no console.
  • A variável f armazena o resultado da avaliação da expressão lógica 3>5.

variáveis python

2.5 Palavras reservadas

Python possui poucas palavras reservadas, apenas 35, o que é mais uma semelhança com JS (que possui 33). Comparado com C#, que possui cerca de 77, são poucas de fato.

É possível visualizar as palavras reservadas no terminal. Para isso, é preciso usar dois comandos, como na figura abaixo. Incluí ainda um terceiro comando, len(), usado para contar o número de itens de uma lista. Assim, vemos que atualmente, na versão 3.7, Python conta com 35 palavras reservadas ou palavras chaves.

palavras reservadas python

2.6 Tipos de dados

Como comentei no início do post, Python é uma linguagem tipada dinamicamente e fortemente.

O dinamicamente refere-se ao momento da criação de uma variável. Para criar uma basta escolher um nome válido (como não começar por números) e fazer uma atribuição a um valor. O tipo de dado da variável será determinado dinamicamente pelo tipo do valor usado na atribuição.

Sendo assim, um valor individual (também chamado de valor literal), sem uma atribuição, também tem um tipo de dado. Para saber qual é o tipo de dado de um valor é possível usar o comando type(), com o valor que se deseja descobrir o tipo digitado entre os parênteses. Por exemplo, type(12) gera como saída o tipo de dado compatível com o valor 12 (valor inteiro). Já o comando type(“Leandro”) retorna o tipo de dado do valor “Leandro” (texto ou string no inglês técnico de computação). No primeiro caso, temos um valor inteiro, que em Python, corresponde ao tipo int. No segundo, temos o tipo texto/string, que em Python é str.

Além desses 2 tipos muito utilizados, temos também o tipo bool, que equivale a um tipo lógico, e o tipo float, que equivale a um valor real, com casas decimais. Dessa forma, o comando type(4>3) retornará o tipo bool e type(3.45) retornará o o tipo float. A imagem a seguir ilustra os testes de tipo de dados dessa seção.

tipos lógicos

2.6.1 – Observações importantes

Pela última imagem é possível destacar alguns pontos:

  • A linguagem Python não diferencia a precisão de números com ponto flutuante. Um número com uma, duas ou com várias casas decimais, será considerado float. Para obter mais precisão é possível usar frameworks de análise de dados, como o NumPy, e assim trabalhar com float de 128 bits.
  • Qualquer valor entre aspas duplas ou simples será considerado str.
  • Os tipos informados nos resultados dos comandos, ou seja, nas saídas do console, mostram que todos os tipos são classes.
  • Dessa última característica decorre um conceito importante: em Python, todos os elementos são objetos, de modo que os tipos básicos não são tipos primitivos, mas sim tipos nativos ou built-in, no sentido de serem classes já definidas com a distribuição original de Python. No entanto, assim como em outras linguagens que suportam orientação a objeto ou a estrutura struct, você pode criar um novo tipo de dados composto a partir dos tipos nativos.

2.6.2 – Conversão de dados

A parte do fortemente tipada na característica da linguagem está relacionada em como ela trata a conversão de dados. Muitas vezes, em um programa, será útil garantir que o resultado de um processamento de dados tenha um determinado tipo de dado. Assim, faz-se necessário converter ou forçar um determinado tipo para que o resultado seja conforme o esperado.

Por exemplo, imagine uma caixa de texto de um formulário, na qual o usuário vai digitar um texto. Esse componente pode ser usado para entrada de diferentes dados, como o nome (texto) e a idade (número inteiro). Assim, quando for o momento de armazenar uma idade em um banco de dados ou em outra estrutura de dado, pode ser necessário garantir que o valor esteja no tipo correto.

Para isso, podemos usar algumas funções como int(), str() e float(). Agora, vamos juntar dois conceitos com um terceiro. Já falei que, em Python, os elementos são objetos. Vimos os tipos int, float, str e bool, que no fundo são classes. Imprimimos os tipos na tela usando a função type() e, na própria impressão, aparece class – <nome do tipo>. Assim, essas funções são na verdade métodos construtores das classes. Recebem dados de qualquer tipo e, se conseguirem, transformam em um objeto da classe correspondente.

Uma conversão da string “140” em número inteiro 140, por exemplo, pode ser feita com o comando int(“140”). A mesma função pode ser usada para converter um float em um int. Já int(“Leandro”) não faz sentido, por isso, dá pau. As funções float(), str() e bool () funcionam de forma similar. Apenas uma ressalva para bool(): se o número for zero ou string vazia, retorna False. Caso contrário, True. A imagem a seguir mostra os exemplos dessa subseção.

conversão

No IDLE, a cor vermelha é usada para mostrar erros.

2.6.3 – Coerção de dados

Coerção de dados é uma conversão automática de dados que o interpretador faz para você. Por exemplo, o que acontece quando Python precisa avaliar a expressão a = 3.0 + 15. O primeiro valor da soma é um float e o segundo é um inteiro. Neste caso, você não precisa usar uma conversão, como a = 3.0 + float(15). O interpretador faz uma coerção de dados, ou seja, ele converte automaticamente o número inteiro 15 em número float 15.0. Teste aí no seu computador.

2.6.4 – Resumo dos tipos

Dessa forma, em Python, até aqui, mostramos os seguintes tipos de dados:

  • int
  • float
  • str
  • bool

Mas existem outros, como list (lista), tuple (tupla) e dic(dicionário).

2.7 Funções

Assim como as variáveis, as funções precisam ser declaradas para que possam ser usadas. Uma vez declaradas, elas podem ser usadas e reutilizadas a vontade. Para usar uma função, basta chamá-la. Ou seja, como fizemos para print(), type(), int() e tantas outras. A diferença é que essas funções já vem junto com o Python, mas é possível também criar livremente funções. Para isso, é preciso escolher um nome (como nas variáveis, que não comece com números e também que não seja palavra reservada) e usar a palavra chave def. O template é o seguinte:

>>> def <nome_da_funcao> (<lista de parametros>) : 

>>>     <lista_comandos>

Aqui temos outra diferença marcante em Python.

Que funções, bem como escopos e outras estruturas não levam os símbolos de chaves, já sabemos. Importante reforçar: o uso de chaves não é opcional como no caso do ponto e vírgula. Se usar chaves, vai dar pau. 

Então vem a pergunta: como saber qual é o escopo da função? Se a função tiver 3 comandos, como informo na definição da função o local em que ela termina?

2.7.1 – Indentação

Com indentação (há quem chame de identação também), ou seja, o recuo ou avanço inserido entre uma linha e outra. Esse espaço extra determina o escopo da função. Reparem no template que a segunda linha, a que traz a lista de comandos, está indentada com dois espaços vazios. Assim, tudo o que estiver indentado igualmente após a definição da função, é de seu escopo. Isso nos leva a uma importante e diferenciada característica de Python: indentação é obrigatória.

Na maioria das linguagens, indentamos o código para aumentar sua legibilidade, isto é, a facilidade de leitura do código. Como em Python a indentação é usada definir escopos, você não pode dar um monte de espaços arbitrariamente. Assim, um comando >>> print() está correto, mas um comando >>>     print() vai dar pau. Eu exagerei nos espaços para ficar nítido, mas o fato é: um espaço a mais, desnecessário, dá pau (erro: unexpected indent).

Na figura abaixo defino uma função chamada escudo(), que imprime um texto. Reparem que ela não possui nenhum parâmetro (não deve receber nenhum valor dentro dos parênteses). Em seguida, a chamo. Se eu tentar chamar a função escudo com um valor, como escudo(10), dá pau (fala que a função escudo tem 0 argumentos, mas foi dado 1). Depois, defino uma função dano(), que recebe um parâmetro inteiro (força) como entrada e devolve 75% do valor como retorno. Ou seja, recebe um int, devolve um float. Implemento essa função usando uma variável local auxiliar chamada resultado. Após calcular o valor necessário e armazená-lo na variável resultado, retorno o valor da função usando a palavra chave return. Por fim, chamo a função dano() com o valor 25, isto é, dano(25).

identificação

2.8 Listas

Em situações em que é preciso armazenar coleções de valores, a variável deixa de ser a estrutura mais adequada e surgem as tradicionais estruturas de dados. Como exemplos, podemos ter arrays, listas, dicionários e outras possibilidades. Uma das mais utilizadas é o array. Em português, as traduções para o termo array são vetor ou arranjo. Em linguagens como C#, existem arrays, listas, dicionários e várias outras (pilha, fila, tupla, árvores, heaps etc). Cada uma possui características diferentes e é mais adequada para determinadas situações. A linguagem C, nativamente, oferece suporte para arrays somente. Você pode usar listas a vontade, mas você tem que implementar as estruturas de listas com ponteiros. A linguagem não vem com a estrutura pronta para ser usada.

Essencialmente, tanto listas quanto arrays são usadas para armazenar conjuntos de valores, mas alguns autores enumeram as vantagens das listas sobre os arrays. Por exemplo, arrays precisam de um tamanho fixo. Se você mudar o tamanho do array em tempo de execução, terá que se preocupar com a reorganização do vetor, com sua ordem, seus índices, a medida que ele cresce. Isso para manter o controle sobre a estrutura e sobre os dados nela armazenados. Já com listas, temos que seu tamanho é alocado dinamicamente, o que traz algumas vantagens. O fato é que, independente de qual é a melhor estrutura, em geral, arrays são usados para situações em que o número de valores do conjunto é fixo. Listas, quando é variável.

Em Python existem listas, não arrays. Assim, quando você ler arrays em Python, possivelmente se trata de listas. Possivelmente assumindo os recursos nativos, é claro, pois com frameworks um novo tipo pode ser definido. Também existem tuplas e dicionários, mas isso falaremos mais para frente.

2.8.1 – Criando listas

Uma lista pode ser criada usando colchetes ( símbolos [ e ]) como delimitadores. Assim, uma lista com alguns carboidratos pode ser definida com o comando carbs = [“arroz”, “batata”, “cenoura”, “macarrão”]. Isso cria uma lista, que pode ser impressa normalmente na tela com print(carbs). Lembram de como contamos a lista de palavras reservadas da linguagem? Usando a função len(). Aqui podemos fazer a mesma coisa, ou seja, len(carbs) devolve o número 4. É possível criar listas de qualquer tipo, inclusive listas híbridas (com tipos de elementos diferentes).

2.8.2 – Acessando elementos

Depois que uma lista é criada é possível acessar seus elementos pelos seus índices, exatamente como é feito com arrays em linguagens tradicionais. Por exemplo, print(carbs[2]) imprimirá “cenoura”. Isto quer dizer que, assim como C, C++, C#, Java e Javascript, os índices começam em 0. Assim, porcoes[0] é igual a 100.

Uma característica diferente de Python é que os índices, em listas, podem ser negativos. Um índice negativo percorre a estrutura no sentido inverso. Isto quer dizer que um índice -1 pegará o último elemento do vetor (penso que essa seja uma das grandes vantagens dessa abordagem). Dessa forma, notas[-1] é igual a 4.1.

Usando a mesma regra de indexação é possível atribuir novos valores a qual um dos elementos de uma lista. Por exemplo, para trocar a nota do índice 2 por 4.0, basta digitar notas[2]=4.0.

A figura abaixo ilustra os exemplos dessa subseção.

exemplos de subseção python

Listas são mutáveis, ou seja, é possível modificar seus elementos livremente, além de se tamanho como um todo na estrutura. Existem várias recursos para se trabalhar com listas. Inserção de diferentes formas (em diferentes locais da lista), remoção, ordenação e outras.

2.9 Tuplas

As tuplas, por sua vez, são imutáveis. Para criar uma tupla usam-se os símbolos ( e ) como delimitadores. Assim, parar criarmos um tupla com meses do primeiro semestre de um ano, faremos: semestre1 = (“Janeiro”, “Fevereiro”, “Março”, “Abril”, “Maio”, “Junho). A partir daí, podemos obter os valores dos elementos da tupla usando a indexação usada em listas. O elemento semestre[3] é “Abril”, por exemplo. O método len() funciona normalmente com tuplas. Agora, não é possível atribuir novos valores a um elemento de uma tupla. Sendo assim, semestre[2] = “Agosto”, por exemplo, vai dar pau.

tupla

2.10 Observações finais

Vou colocar aqui o que acho que faltou falar no geral, como se fossem as sobras das noções apresentadas na seção 2. Não comentei antes por não serem absolutamente essenciais, de forma a não incrementar mais volume de conhecimento aos tópicos anteriores e correr o risco de prejudicar os entendimentos.

Em Python, comentários são feitos com o símbolo #. Assim, é possível inserir comentários em uma linha que já possui um comando.

Python é case sensitive, isto é, diferencia maiúscula de minúsculas. Atenção ao fato que os valores lógicos são False e True, com a primeira letra em maiúsculo. Esse padrão é diferente das demais linguagens, porém é interessante reforçar porque se usar false ou true, vai dar pau.

3. Ambientes de Programação

Existem diferentes opções de IDE para desenvolvimento com Python. Uma delas, como já comentei, é usar um editor de sua preferência, como o Visual Studio Code, com os devidos plugins.

Outras famosas são a Atom, PyCharm e Spyder. Existe ainda a Eric Python IDE, desenvolvida com a biblioteca gráfica Qt, que possui vários componentes visuais prontos.

Para saber um pouco mais sobre esse assunto, recomendo duas leituras: uma internacional e outra nacional.

Para os(as) desenvolvedores(as) mais roots, vale lembrar que dá para trabalhar no terminal e no IDLE também.

4. Frameworks

Por permitir um rápido desenvolvimento web full-stack, o mais conhecido framework de Python é Django. Ele pode ser usado desde pequenos projetos até os grandes.

Para os projetos pequenos, outros bem famosos também são o Flask, Tornado e o Pyramid.

Existem também os que não são para desenvolvimento web. PyQT, por exemplo, fornece componentes visuais para aplicações em desktop.

frameworks de python

Existe também o PyQT3D, que permite trabalhar com o desenvolvimento 3D e Python.

PyQT3D

Para reforçar a diversidade de frameworks, basta escolher uma área.

Por exemplo, para AI (Inteligência Artificial), temos o TensorFlow, Theano e o Keras (este último open-source).

Por fim, para enorme área de Ciência de Dados, que utilizando largamente Python, pode-se citar os frameworks NumPy, SciPy e Pandas.

5. Onde Aprender

Meu level em Python ainda é baixo, de forma que aqui, diferentemente de outras linguagens, ainda não consigo indicar um material para nível iniciante, intermediário e avançado, até porque ainda estou no iniciante.

No entanto, farei o seguinte: deixarei na seção seguinte todos os links de materiais com os quais interagi enquanto estudei sobre o assunto e que, de certa forma, serviram para escrever este post. Alguns foram citados em trechos no artigo e devidamente referenciados em cada parte, outros estão apenas nas referências gerais. Abaixo, ainda nesta seção, descreverei o caminho das pedras na minha visão até aqui.

Se você não sabe inglês, não perca tempo com os 3 primeiros links das referências. Eles representam uma fonte confiável de conhecimento e estão sempre atualizadas com as novidades. No entanto, de nada adianta isso sem conseguir compreender para valer as informações que lá estão. Sendo assim, sugiro ler absorvendo o máximo que puder o material da referência 4. Leia e pratique cada exemplo do livro. Esse valioso material, gratuito, é a tradução da primeira edição da referência [5], atualmente na terceira edição (lançada em abril de 2018). É seguramente um dos melhores e mais didáticos materiais a respeito do assunto. Se quiser algo mais curto e visual, vá para a referência [6].

Referências

Sobre a linguagem Python (todos materiais gratuitos):

[1] Documentação oficial Python 3.7.0. Disponível em: <https://docs.python.org/3/>. Acesso em: 24 jul 2018.

[2] The Python Tutorial. Disponível em: <https://docs.python.org/3/tutorial/index.html>. Acesso em: 24 jul 2018.

[3] Beginner’s Guide to Python. Disponível em: <https://wiki.python.org/moin/BeginnersGuide>. Acesso em: 24 jul 2018.

[4] Aprenda Computação com Python v1.1. Disponível em: <http://www3.ifrn.edu.br/~jurandy/fdp/doc/aprenda-python/capitulo_01.html>.

[5] How to Think Like a Computer Scientist: Learning with Python 3 Documentation. Disponível em: <https://media.readthedocs.org/pdf/howtothink/latest/howtothink.pdf >.

[6] MAB 225 – Computação II. Disciplinas da UFRJ, ministrada pelo professor Fabio Mascarenhas, com links para o material preparado pelo professor Cláudio Esperança. Disponível em: http://www.dcc.ufrj.br/~fabiom/mab225/.

Sobre o Autor

Leandro Pinho Monteiro

Leandro Pinho é engenheiro de computação, graduado em Ciência da Computação na Universidade Estadual de Maringá (UEM) e mestre em Engenharia da Computação na Faculdade de Engenharia Elétrica e Computação (FEEC) da UNICAMP, ambas formações com foco em Computação Gráfica. Possui experiência no desenvolvimento de sistemas interativos 3D para pontos de venda, marketing e eventos. Atualmente trabalha como consultor de tecnologia e é o responsável pela coordenação dos cursos oferecidos na Universidade da Tecnologia.