Baixe o app para aproveitar ainda mais
Prévia do material em texto
Variáveis, tipos de dados e operadores de algoritmos em Python APRESENTAÇÃO Em geral, dados são qualquer conjunto de caracteres que são reunidos, processados e traduzidos para algum propósito. Um dado pode ser desde um simples caractere, um texto, números, image ns, som, vídeo, além de muitos outros tipos. Se os dados não estão contextualizados, eles não fa zem muito sentido para uma pessoa ou mesmo para um computador. Na memória ou no armazenamento de um computador, os dados são uma série de bits (dígitos bi nários), que podem ter o valor um ou zero. Os dados são processados pela CPU (Unidade de Pro cessamento Central), que usa operações lógicas para produzir novos dados (saída), a partir dos d ados de origem (entrada). Computadores recebem dados de entrada com o objetivo de transformá-los, processá-los e, por f im, exibir informações aos usuários de forma mais significativa. Assim, para que esses dados po ssam ser transportados, desde sua entrada (origem) no sistema computacional até a sua saída, se faz necessário percorrer vias bem definidas e estruturadas, com regras de operação para cada tip o de dado a ser manipulado. Nesta Unidade de Aprendizagem, você verá como a linguagem de programação Python trata e m anipula os dados na memória do computador. Além disso, você também verá como formular e i nterpretar soluções algorítmicas de manipulação de dados com a aplicação de diferentes operado res. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Descrever a organização de dados manipuláveis por um algoritmo na memória do computa dor. • Formular soluções algorítmicas empregando os diferentes operadores.• Interpretar soluções algorítmicas de manipulação de dados.• DESAFIO Na programação, variáveis, operadores e tipos de dados são extremamente importantes para a tra nsformação dos dados de entrada em dados (ou informações) de saída. Praticamente todas as lin guagens de programação fazem uso dessas estruturas para manipular valores durante a execução de um algoritmo. Em determinadas situações, é preciso validar esses dados, principalmente quan to ao seu tipo, para que o programa não falhe. Suponha que você é o programador de uma empresa de contabilidade. Com base nessas informações, responda: A) Qual função do Python poderia ser usada para verificar se o que foi digitado, para o valor que vai a esquerda ou a direita do operador, é um valor numérico? B) Como ficaria a expressão lógica que está sendo avaliada pela instrução if? INFOGRÁFICO Conceitualmente, vetor é uma estrutura unidimensional, que armazena valores (elementos) hom ogêneos, em que cada valor pode ser identificado por um índice. Isso significa que pode conter d ados de apenas um tipo, além de manter a posição dos dados por meio dos índices. Dessa forma, os dados não perdem a ordem natural em que foram posicionados na criação do vetor. Matriz é um arranjo ordenado que, diferente do vetor, pode ter mais de uma dimensão. Assim, p odemos dizer que matrizes são n-dimensionais. Por exemplo, uma matriz de duas dimensões ser á chamada bidimensional, uma matriz de três dimensões tridimensional e assim por diante. Simi lar ao vetor, matriz também tem índices para cada uma de suas dimensões e armazena dados de apenas um tipo. Na linguagem de programação Python, a estrutura que mais atende ao conceito de vetor é a lista (list). Da mesma forma, a estrutura de dados que mais atende ao conceito de matriz é a lista de l istas. Python tem um recurso incrível chamado de notação de fatiamento. O fatiamento pode ser usado em listas, tuplas, arranjos e, também, em algumas estruturas de dados personalizadas. Neste Infográfico, você verá a representação visual da lista e como acessar seus elementos usand o a notacão de fatiamento (slice) da linguagem de programação Python. CONTEÚDO DO LIVRO Informação é a matéria-prima da computação, que dá sentido a existência de computadores. Por ém, até que um dado seja transformado em informação, ele percorre um longo caminho. Além di sso, para percorrer esse caminho, cada dado necessita de um contêiner especializado para cada ti po – seja um dado numérico, lógico ou mesmo uma sequência de valores. No capítulo Variáveis, tipos de dados e operadores de algoritmos em Python, do livro Raciocíni o lógico, você verá como, em um sistema computacional, os dados podem ser manipulados por meio de variáveis e operadores. Boa leitura. RACIOCÍNIO ALGORÍTMICO Variáveis, tipos de dados e operadores de algoritmos em Python Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: Descrever a organização de dados manipuláveis por um algoritmo na memória do computador. Formular soluções algorítmicas empregando os diferentes operadores. Interpretar soluções algorítmicas de manipulação de dados. Introdução Ao contrário de um ser humano, um computador não sabe a diferença entre a expressão “1234” e a expressão “abcd”. Para haver essa distinção em um sistema computacional, é necessária uma classificação que de- termine o que uma variável (ou objeto) pode conter. Variáveis e tipos de dados são fatores importantes em praticamente todas as linguagens de programação de computadores, incluindo a linguagem de programação Python. Quando os programadores criam aplicativos de computador, seja para desktop, mobile ou mesmo para a web, os tipos de dados devem ser referenciados e usados corretamente para garantir o resultado adequado e um programa sem erros. Neste capítulo, você vai ver como manipular variáveis que armazenam qualquer tipo de dado, sejam dados numéricos, sequenciais ou lógicos. Você também vai conhecer uma variedade de operadores, como ope- radores aritméticos, relacionais (ou de comparação), binários, lógicos e de atribuição. Além disso, você vai estudar a estrutura e o processo de avaliação de expressões, incluindo os conceitos de precedência dos operadores e associatividade de um operador. Identificação interna do documento 1IHNVHPA5P-YPKWV71 1 Gerenciamento de memória e variáveis Antes de você estudar as variáveis e os tipos de dados, deve compreender como o Python funciona e como as variáveis escritas em Python se comportam na memória de um computador. Para isso, é possível fazer uma analogia entre a memória de um computador e um livro de vários autores com espaços ainda vazios. Nesse livro, ainda não há muita coisa escrita nas páginas e, eventu- almente, diferentes autores aparecerão. Cada autor deseja algum espaço para escrever sua própria história. Porém, como eles não podem escrever um em cima do texto do outro, devem ter cuidado com as páginas em que escrevem. Assim, antes de começarem a escrever, consultam o gerente do livro. O gerente decide em que local do livro cada autor tem permissão para escrever. Como esse livro existe há muito tempo, muitas histórias contidas nele não são mais relevantes. Assim, quando ninguém lê ou faz referência àquelas histórias sem relevância, elas são removidas para abrir espaço para novas narrativas. Na verdade, em computação, é comum chamar blocos contíguos de “páginas de memória de comprimento fixo”. Portanto, essa analogia serve muito bem para se falar de memória de computador. Em essência, a memória do com- putador é como aquele livro, e os autores são como diferentes aplicativos ou processos que precisam armazenar dados na memória. O gerente, que decide onde os autores podem escrever no livro, desempenha o papel de um tipo de gerenciador de memória. Por fim, a pessoa que removeu as histórias antigas para dar lugar a novas é um coletor de lixo de memória. O gerenciamento de memória é o processo pelo qual os aplicativos leem e gravam dados. Um gerenciador de memória determina onde colocar os dados de um aplicativo. A memória, como as páginas do livro da analogia, são finitas. Logo, o gerente precisa encontrar algum espaço livre e fornecê-lo ao aplicativo. Esse processode fornecer memória é geralmente chamado de alocação de memória. Assim, quando um dado não é mais necessário, ele pode ser excluído ou liberado. Porém, a pergunta que fica é: liberado para onde? De onde veio essa “memória”? Variáveis, tipos de dados e operadores de algoritmos em Python2 Identificação interna do documento 1IHNVHPA5P-YPKWV71 Em algum lugar do computador, existe um dispositivo físico que armazena dados quando se executa programas Python. Existem muitas camadas de abstração pelas quais o código Python passa antes que os objetos cheguem ao hardware. Uma das principais camadas acima do hardware (como RAM [random access memory, em português memória de acesso aleatório] ou disco rígido) é o Sistema Operacional (SO). O SO realiza (ou nega) solicitações para ler ou gravar o dado (ou informação) na memória. Acima do SO, existem aplicativos, um dos quais é a implementação padrão do Python, que vem por padrão incluída no sistema operacional, ou pode ser baixada do site oficial (www.python.org). O gerenciamento de memória para o código Python é tratado pelo aplicativo Python. O modo como o Python manipula e gerencia os dados de memória é o foco deste capítulo. A implementação padrão do Python, chamada de “CPython”, é escrita na linguagem de programação C (PYTHON SOFTWARE FOUNDATION, 2019b). Ela converte seu código Python em instruções que são executadas em uma máquina virtual. Máquinas virtuais são como computadores físicos, mas são implementadas em software. Elas geralmente processam instruções básicas semelhantes às instruções de montagem (assembly). Assim, Python é uma linguagem de programação interpretada. Seu código Python é previamente compilado para obter instruções mais legíveis para computador, chamadas bytecode. Essas instruções são interpretadas por uma máquina virtual quando o código Python é executado. É importante observar que existem outras implementações além do CPython. O IronPython, por exemplo, é compilado para execução no Com- mon Language Runtime (CLR) da Microsoft. O Jython também é compilado no bytecode da linguagem de programação Java para ser executado na Java Virtual Machine (JVM). O CPython é escrito na linguagem de programação C, que não suporta nativamente a programação orientada a objetos. Por esse motivo, existem alguns designs interessantes no código CPython. Tudo no Python é um objeto, mesmo tipos como int (inteiro) e str (string). Assim, em partes, isso é verdade em um nível de implementação no CPython. Existe uma estrutura chamada “PyObject”, que todos os outros objetos do 3Variáveis, tipos de dados e operadores de algoritmos em Python Identificação interna do documento 1IHNVHPA5P-YPKWV71 CPython usam. Pode-se dizer que o PyObject é pai de todos os objetos em Python; ele contém apenas dois elementos: ob_refcnt, que é a contagem de referência, e ob_type, que é o ponteiro para outro tipo de objeto. A contagem de referência é usada para coleta de lixo. Então, há um ponteiro para o tipo de objeto real. Esse tipo de objeto é apenas outra estrutura que descreve um objeto Python, como um dict (dicionário) ou um int (inteiro). Cada objeto tem seu próprio alocador de memória específico e sabe fazer com que a memória o armazene. Além disso, cada objeto possui um desalo- cador de memória específico que “libera” a memória quando ela não é mais necessária. No entanto, há um fator importante envolvendo todo esse assunto sobre alocação e liberação de memória. A memória é um recurso compartilhado no computador, e situações desagradáveis podem acontecer se dois processos diferentes tentarem gravar (escrever) no mesmo local ao mesmo tempo. O Python tem um recurso chamado Global Interpreter Lock (GIL), que é uma solução para o problema comum de ter de lidar com recursos comparti- lhados, como a memória em um computador (PYTHON SOFTWARE FOUN- DATION, 2019b). A Figura 1 apresenta um exemplo gené rico do gerenciador de memória em Python. Figura 1. Gerenciador de memória em Python. Quando dois processos (ou threads) tentam modificar o mesmo recurso ao mesmo tempo, eles podem “pisar nos dedos” um do outro. O resultado final pode ser uma bagunça ilegível, em que nenhum dos processos termina como esperado. Considerando a analogia do livro apresentada anteriormente, Variáveis, tipos de dados e operadores de algoritmos em Python4 Identificação interna do documento 1IHNVHPA5P-YPKWV71 suponha que dois autores decidam “teimosamente” que é a vez deles de escrever. Não apenas isso, mas ambos precisam escrever na mesma página do livro e, ainda, ao mesmo tempo. Cada um dos autores ignora a tentativa do outro de criar uma história e começa a escrever na página. O resultado final serão duas histórias, uma em cima da outra, o que tornará toda a página completamente ilegível. Uma solução viável para o problema de memória compartilhada é fazer um bloqueio global e único no interpretador toda vez que um processo interage com a memória (a página do livro). Nesse caso, em outras palavras, apenas um autor de cada vez pode escrever naquela página. O GIL do Python realiza isso bloqueando todo intérprete, o que significa que não é possível que outro processo interfira no processo que está sendo realizado. Quando o CPython manipula a memória, ele usa o GIL para garantir segurança. Assim, o geren- ciamento de memória é parte integrante do trabalho com computadores, e o Python lida com quase tudo nos bastidores. Variáveis em Python Em Python, quando se fala em variável, deve-se pensar em uma variável como um nome anexado a um objeto específi co (PYTHON SOFTWARE FOUNDATION, 2019c). No Python, as variáveis não precisam ser declaradas ou defi nidas com antecedência, como é o caso em muitas outras linguagens de programação, por exemplo, C ou Java. Para criar uma variável, basta defi nir um nome, atribuir um valor para ela e começar a usá-la. A atribuição é feita com um único sinal de igual (=): nome = "John" Isso é lido ou interpretado como “para ‘nome’, seja atribuído o valor ‘John’”. Uma vez feito isso, o identificador “nome” pode ser usado em uma instrução (ou declaração) ou expressão. Em muitas linguagens de programação, as variáveis são declaradas esta- ticamente. Isso significa que uma variável é inicialmente relacionada a um tipo de dados específico, e qualquer valor atribuído a ela durante sua vida útil deve ter sempre esse tipo. Variáveis em Python não estão sujeitas a essa restrição. No Python, uma variável pode ser atribuída a um valor de um tipo e, posteriormente, redesignada a um valor de tipo diferente. 5Variáveis, tipos de dados e operadores de algoritmos em Python Identificação interna do documento 1IHNVHPA5P-YPKWV71 var = 5.7 print(id(var)) # Endereço na memória: 4557936080 print(var) # Resultado: 5.7 print(type(var)) # Resultado: <class 'float'> var = 'Agora eu sou uma string' print(id(var)) # Endereço na memória: 4497916832 print(var) ## Resultado: Agora eu sou uma string print(type(var)) # Resultado: <class 'str'> No exemplo que você acabou de ver, foi utilizada uma função chamada “type()”. Essa função tem o objetivo de imprimir o tipo de dado que um objeto possui. Quando são apresentadas as instruções do exemplo, o interpretador Python está realizando os passos listados a seguir. 1. Crie na memória um objeto do tipo ponto flutuante ( float) cujo iden- tificador é “var”. 2. Atribua-lhe o valor 5.7. 3. Exiba no console o número do identificador do objeto “var”. 4. Exiba no console o valor contido em “var”. 5. Exiba no console o tipo da classe do objeto “var”. 6. Crie na memória um novo objeto do tipo str cujo identificador é “var”, porém, como já existe um objeto na memória com esse identificador, antes, destrua o antigo objeto “var”. 7. Atribua-lhe o valor “Agora eu sou uma string”. 8. Exiba no console o número do identificador do objeto “var”. 9. Exiba no console o valor contido em “variável”. 10. Exiba no console o tipo da classe do objeto. Variáveis, tipos de dadose operadores de algoritmos em Python6 Identificação interna do documento 1IHNVHPA5P-YPKWV71 O Python possui um tipo de função interna chamado “type()” para determinar o tipo de dados de uma variável ou o seu valor. Outra função interna é a “isinstance()”, que existe para testar se um objeto é uma instância de outro objeto. Pode-se dizer que o Python é uma linguagem forte e dinamicamente tipada, ou seja, uma variável pode ser atribuída com outro tipo durante a sua vida útil no sistema, porém não é possível fazer operações com tipos diferentes, a menos que isso esteja muito bem definido previamente. Por exemplo, não é possível fazer uma operação de soma entre um tipo inteiro e um tipo string, a menos que seja sobrescrito como realizar essa operação, desenhando um método próprio para esse tipo de caso. O Python é também uma linguagem altamente orientada a objetos. De fato, praticamente todos os itens de dados em um programa Python são objetos de um tipo ou classe específica (esse ponto será tratado mais adiante neste capí- tulo). Assim, pode-se dizer que uma variável Python tem um nome simbólico (identificador) e é uma referência (ou ponteiro) para um objeto. Depois que um objeto é atribuído a uma variável, é possível se referir a ele com esse nome. Porém, os dados em si ainda estão contidos no objeto. Um dos comportamentos das referências para um objeto em Python se dá por meio de um contador de referências. Quando se atribui um valor para uma variável, por exemplo, “a = 1”, uma referência “a” é adicionada ao objeto e a contagem de referência do valor “1” é incrementada. Quando o Python executa a próxima instrução, por exemplo, “b = 1”, já que se trata do mesmo valor (1), um novo objeto não é inicializado. O mesmo objeto na memória com o valor “1” apenas possui outra referência “b”. Isso faz parte do processo de gerenciamento de memória Python. Para “c = 2”, um novo objeto é criado novamente, pois ele possui um novo valor “2” com “c” como referência agora apontando para “1”. Por fim, se for atribuído um valor para uma nova variável, por exemplo, “d = a”, o gerenciador de memória incrementa mais uma referência para o objeto “1”, tendo também “d” como variável. O mesmo ocorre para valores de uma lista quando os elementos dela têm o mesmo valor atribuído a outra variável anteriormente. 7Variáveis, tipos de dados e operadores de algoritmos em Python Identificação interna do documento 1IHNVHPA5P-YPKWV71 a = 1 print(id(a)) # ID: 4447157152 - Valor 1 tem 1 referência (a) b = 1 print(id(b)) # ID: 4447157152 - Valor 1 tem 2 referências (a e b) c = 2 print(id(c)) # ID 4466998208 - Valor 2 tem 1 referência (c) d = a print(id(d)) # ID: 4447157152 - Valor 1 tem 3 referências (a, b e d) L = [1, 1, 1, 1] # Valor 1 tem 7 referências (a b, c, L[0], L[1], L[2} e L[3]) print(id(L[0])) # ID: 4447157152 print(id(L[1])) # ID: 4447157152 print(id(L[2])) # ID: 4447157152 print(id(L[3])) # ID: 4447157152 Os exemplos apresentados até agora usaram nomes curtos para as variáveis. Mas nomes de variáveis podem ser mais detalhados. De fato, geralmente é mais benéfico quando o nome da variável representa o seu conteúdo, pois isso torna o objetivo da variável mais evidente à primeira vista. Oficialmente, os nomes de variáveis no Python podem ter qualquer tamanho e podem consistir em letras maiúsculas e minúsculas (A–Z, a–z), dígitos (0–9) e caractere sublinhado (_). Uma restrição adicional é que, embora um nome de variável possa conter dígitos, o primeiro caractere de um nome de variável nunca pode ser um dígito. Não há nada que impeça a criação de variáveis diferentes no mesmo programa denominadas “iDade”, “idade” e “idadE”. Mas isso é extremamente desaconselhá- vel. Sem sombra de dúvida, qualquer um que tentasse ler o código ficaria confuso. Até mesmo o próprio programador do código, depois de ficar um tempo sem lidar com ele, ficaria confuso. Assim, vale a pena dar a uma variável um nome que seja descritivo o suficiente para esclarecer para que ela está sendo usada. Variáveis, tipos de dados e operadores de algoritmos em Python8 Identificação interna do documento 1IHNVHPA5P-YPKWV71 Suponha que seja preciso calcular o número de pessoas que estão se formando na faculdade. É possível escolher qualquer um dos seguintes nomes: numerodeformandos = 1500 # Todas minúsculas NUMERODEFORMANDOS = 1500 # Todas maiúsculas numeroDeFormandos = 1500 # Camel Case NumeroDeFormandos = 1500 # Pascal Case numero _ de _ formandos = 1500 # Snake Case print(numerodeformandos, NUMERODEFORMANDOS, numeroDeFormandos, NumeroDeFormandos, numero _ de _ formandos) Todos os exemplos que você acabou de ver são melhores nomes do que apenas um “n”, um “ndf” ou similares. Pelo menos, é possível dizer pelo nome qual valor a variável representa. Por outro lado, nem todos são igualmente legíveis. Como em muitas situações, nesse caso a escolha é uma questão de preferência pessoal, mas a maioria das pessoas consideraria os dois primeiros exemplos (particularmente o que utiliza todas as letras maiúsculas), em que todas as letras são colocadas juntas, mais difíceis de ler. Os métodos mais usados para construir um nome de variável com várias palavras são Camel case, Pascal case e Snake, que correspondem respectivamente aos métodos usados para definição dos nomes das variáveis: numeroDeFormandos, NumeroDeFormandos e numero _ de _ formandos. A seguir, você vai conhecê-los melhor. Camel case: a segunda palavra e as subsequentes têm iniciais maiúsculas para facilitar a visualização dos limites dos termos (Provavelmente, ocorreu a alguém em algum momento que as letras maiúsculas espa- lhadas pelo nome da variável se assemelham vagamente à corcundas dos camelos). 9Variáveis, tipos de dados e operadores de algoritmos em Python Identificação interna do documento 1IHNVHPA5P-YPKWV71 Pascal case: idêntico ao Camel case, exceto que a primeira palavra também tem inicial maiúscula. Snake case: as palavras são separadas por sublinhados. Os programadores que usam Python debatem calorosamente sobre qual dos métodos é preferível. Há argumentos para defender cada um desses estilos. O programador deve utilizar o que for mais atraente visualmente para ele. Assim, deve escolher um e usá-lo de forma consistente. As variáveis não são os únicos elementos que podem receber nomes em Python. Além delas, também se nomeiam funções, classes, módulos e assim por diante. As regras que se aplicam a nomes de variáveis também se aplicam a identificadores, o termo mais geral para nomes dados a objetos de programa. O Guia de Estilo para Código Python, também conhecido como PEP-0008, contém convenções de nomenclatura que listam padrões sugeridos para nomes de diferentes tipos de objetos. O PEP-0008 inclui as recomendações a seguir. Snake case: deve ser usado para funções e nomes de variáveis. Pascal case: deve ser usado para nomes de classe. Além das regras de sintaxe para os nomes de variáveis, ainda existe mais uma restrição para os nomes desses identificadores. A linguagem de progra- mação Python reserva um pequeno conjunto de palavras-chave (keywords) que designam funcionalidades especiais da linguagem. Nenhum objeto pode ter o mesmo nome que uma dessas palavras reservadas. No Python 3.7, existem 35 palavras-chave reservadas (Quadro 1). False def if raise continue break assert None del import return global for finally True elif in try pass not nonlocal and else is while class async yield as except lambda with from await or Quadro 1. Palavras-chave reservadas do Python Variáveis, tipos de dados e operadores de algoritmos em Python10 Identificação interna do documento 1IHNVHPA5P-YPKWV71 É possível ver essa lista a qualquer momento digitando “help(‘keyword’)” em um terminal ou console com interpretador Python. As palavras reservadas diferenciam maiúsculas de minúsculas e devem ser usadas exatamente como mostrado no Quadro 1.Todas as keywords são escritas em letras minúsculas, exceto False, None e True, que têm a primeira letra capitalizada. Se você tentasse criar uma variável com o mesmo nome de qualquer palavra reservada, isso resultaria em uma exceção (Exception) levantada pelo Python. 2 Tipos de dados em Python Em geral, um tipo de dado defi ne o formato e os limites superior e infe- rior dos dados para que um programa possa usá-los adequadamente. No entanto, os tipos de dados Python são muito mais do que isso. No Python, não é preciso declarar uma variável mencionando explicitamente o tipo do dado. Esse recurso, como foi discutido anteriormente, é conhecido como “tipagem dinâmica” (PYTHON SOFTWARE FOUNDATION, 2019a). O Python determina o tipo de um valor diretamente na sintaxe do código e em tempo de execução. Por exemplo, as aspas marcam a declaração de um valor sequencial, os colchetes representam uma lista e as chaves são utilizadas para um dicionário. Além disso, os números não decimais serão atribuídos ao tipo inteiro, enquanto aqueles com um ponto decimal serão atribuídos para pontos fl utuantes. A seguir, está a lista de tipos de dados importantes comumente usados no Python. Depois, você vai conhecer melhor cada um deles e ver exemplos. Booleanos (booleans) Numéricos (numbers) Cadeias de caracteres (strings) Bytes Listas (lists) Tuplas (tuples) Conjuntos (sets) Dicionários (dictionaries) 11Variáveis, tipos de dados e operadores de algoritmos em Python Identificação interna do documento 1IHNVHPA5P-YPKWV71 Tipos numéricos São um dos tipos de dados mais importantes em Python. Ao contrário de muitas linguagens que possuem apenas números inteiros e fl utuantes, o Python introduz o número complexo como um novo tipo de dado numérico. Os ti- pos de dados numéricos em Python são classifi cados usando as seguintes palavras-chave: int, fl oat e complex. Os tipos booleanos são considerados uma especialização do tipo inteiro. Booleano É um tipo de dado que quase todas as linguagens de programação possuem. O booleano em Python pode ter dois valores, verdadeiro ou falso. Esses valores são constantes e podem ser usados para atribuir ou comparar valores booleanos. Veja um exemplo simples a seguir. condicao = False if condicao: # Equivalente a: if condicao == True print("Continuar programa!") else: print("O programa será encerrado!") a = True + 0 # Resultado: 1 b = False + 0 # Resultado: 0 print(type(a)) # Resultado: <class 'int'> print(type(b)) # Resultado: <class 'int'> A expressão em um bloco de condições produzirá um valor booleano. O Python cria contextos booleanos para avaliar expressões. Seja qual for a Variáveis, tipos de dados e operadores de algoritmos em Python12 Identificação interna do documento 1IHNVHPA5P-YPKWV71 expressão, o Python usará o contexto booleano para determinar seu valor verdadeiro. Como o Python possui muitos tipos de dados, eles operam com suas próprias regras para encontrar o resultado em um contexto booleano. Em alguns casos, as constantes booleanas True e False também podem atuar como números. É evidente no exemplo anterior que True é 1 e que o valor de False é 0. Eles se transformarão em números durante operações aritméticas. Inteiros A partir do Python 3, efetivamente não há limite para o quão longo um valor inteiro pode ser. Obviamente, ele é limitado pela quantidade de memória que o sistema possui, mas, para além disso, um número inteiro pode ser tão longo quanto necessário. O Python interpreta uma sequência de dígitos numéricos e sem nenhum prefi xo como um número decimal de base 10. Outras sequências de caracteres podem ser anexadas a um valor inteiro para indicar uma base diferente de 10. O tipo subjacente de um número inteiro Python, independen- temente da base usada para especifi cá-lo, é chamado de int. Números de ponto flutuante Esse tipo designa um número de ponto fl utuante no Python. Valores fl utu- antes são especifi cados com um ponto (.) que separa os valores decimais dos valores inteiros. Um número de ponto fl utuante é aquele em que a posição do ponto decimal pode “fl utuar” em vez de estar em uma posição fi xa dentro de um número. Exemplos de números de ponto fl utuante são: 1.23, 87.425 e 9039454.2. Diferentes linguagens de programação ou sistemas podem ter limites de tamanho ou formas distintas de defi nir números de ponto fl utuante. Opcionalmente, o caractere “e” ou “E” seguido por um número inteiro, positivo ou negativo, pode ser anexado para especificar a notação científica. Uma notação de ponto flutuante é um cálculo matemático usado para exibir números longos de forma “curta”. Por exemplo, um número como 12.000.000 pode ser escrito como 12e6 ou também pode ser 0.12 * 10e8. 13Variáveis, tipos de dados e operadores de algoritmos em Python Identificação interna do documento 1IHNVHPA5P-YPKWV71 No Python, não é preciso descrever a parte inteira do tipo float quando ela for zero. Para representar “0.5”, basta apenas descrever: “.5”. Veja como pode ser descrita uma expressão que eleva um valor “x” a meio: x**.5 seria o mesmo que x**(1/2). Números complexos O Python também suporta números complexos, ou números compostos por uma parte real e uma parte imaginária. Assim como a instrução “print()” é usada para imprimir valores, a função “complex()” é usada para criar números complexos. Essa função requer dois valores, o primeiro será a parte real do número complexo, enquanto o segundo valor será a parte imaginária. Tipos sequenciais Existem alguns tipos básicos e personalizados de sequências em Python: listas (objetos list) e tuplas (objetos tuple) são tipos básicos. Além disso, existem os tipos de sequências personalizados para o processamento de dados binários (objetos bytes) e as sequências de texto ou cadeias de caracteres (objetos str). Cadeias de caracteres Uma sequência de um ou mais caracteres entre aspas simples (') ou aspas duplas (") é considerada string no Python. Qualquer letra, número ou símbolo pode fazer parte da sequência. Python também suporta sequências de várias linhas, que requerem estar entre aspas triplas ("""). Sequências de caracteres entre triplas de aspas (simples ou duplas) conservam o caractere de quebra de linha (\n) como parte da string. Variáveis, tipos de dados e operadores de algoritmos em Python14 Identificação interna do documento 1IHNVHPA5P-YPKWV71 aspas _ simples = 'Esse tipo de string permite aspas "du- plas" incorporadas.' aspas _ duplas = "Esse tipo de string permite aspas 'sim- ples' incorporadas." tripla _ de _ aspas _ simples = '''Esse tipo de string permite aspas 'simples', "duplas" e ""triplas duplas""" incorporadas.''' tripla _ de _ aspas _ duplas = """Esse tipo de string permite aspas 'simples', "duplas" e '''tripla simples''' incorporadas.""" print(type(aspas _ simples)) # <class 'str'> print(aspas _ simples[0:5]) # Cinco primeiros caracteres print(aspas _ simples[1:5]) # Substring de 2 até 5 print(aspas _ simples[-6:-1]) # Cinco caracteres antes do último print(aspas _ simples[-2:]) # Dois últimos caracteres print(aspas _ simples[:2]) # Dois primeiros caracteres Existem várias funções em Python para manipular cadeias de caracteres. Uma delas é a função isnumeric(), que retorna verdadeiro se os caracteres de uma cadeia são caracteres numéricos. Caso contrário, retorna falso. 15Variáveis, tipos de dados e operadores de algoritmos em Python Identificação interna do documento 1IHNVHPA5P-YPKWV71 Bytes O byte é um tipo imutável em Python. Ele pode armazenar uma sequência de bytes (cada byte tem 8 bits) variando de 0 a 255. Semelhante ao que ocorre em uma lista, é possível buscar o valor de um único byte usando o índice. Mas não é possível modifi car o valor em nenhuma posição. A seguir, veja algumas diferenças entre byte e string. Os objetos do tipo byte contêm uma sequência de bytes, enquanto as strings contêm uma sequência de caracteres. Os bytes sãoobjetos legíveis apenas para o computador, enquanto as strings estão na forma legível para os humanos. Como o byte é legível apenas por máquina, ele pode ser armazenado diretamente no disco. Já as strings precisam ser codificadas antes de serem armazenadas no disco. Um contexto em que os bytes são importantes é quando se executam operações de entrada e saída (E/S) com o buffer (espaço reservado) ativado. Considere, por exemplo, um programa que está recebendo continuamente os dados pela rede. Ele vai armazenando os dados que vêm pelo fluxo; depois que os cabeçalhos e terminadores de mensagens aparecem no fluxo, os dados recebidos são analisados. Então, o programa continua anexando mais bytes que estão chegando no buffer de forma contínua. objeto _ vazio = bytes(2) print(type(objeto _ vazio)) # <class 'bytes'> print(objeto _ vazio) # Resultado: b'\\x00\\x00' buffer = b'' while verificar _ mensagem(buffer): buffer += ler _ do _ socket() Variáveis, tipos de dados e operadores de algoritmos em Python16 Identificação interna do documento 1IHNVHPA5P-YPKWV71 Listas São construções semelhantes às strings, porém servem para armazenar objetos de tipo arbitrário em uma sequência ordenada. Uma lista é muito fl exível e não possui um tamanho fi xo. O índice de lista é também uma lista que começa com zero no Python. É uma coleção heterogênea de itens de tipos de dados variados. As listas em Python podem ser declaradas se os elementos forem colocados entre colchetes e forem separados por vírgulas. A seguir, veja as características importantes das listas Python: as listas são ordenadas; as listas podem conter objetos arbitrários; os elementos da lista podem ser acessados pelo índice; as listas podem ser aninhadas com profundidade arbitrária; as listas são mutáveis; as listas são dinâmicas. lista = [True, 1, 1.1, 1 + 2j, 'Teste', b'bytes', [1, 2, 3], (1, 2), {1: 'a'}] for elemento in lista: print(type(elemento)) # Resultados: # <class 'bool'> # <class 'int'> # <class 'float'> # <class 'complex'> # <class 'str'> # <class 'bytes'> # <class 'list'> # <class 'tuple'> # <class 'dict'> tupla = ('01', '02', '03') # Embalar (janeiro, fevereiro, marco) = tupla # desembalar print(janeiro) # Resultado: 01 print(fevereiro) # Resultado: 02 print(marco) # Resultado: 03 17Variáveis, tipos de dados e operadores de algoritmos em Python Identificação interna do documento 1IHNVHPA5P-YPKWV71 Tuplas As tuplas são imutáveis, ou seja, seus elementos não podem ser modifi cados ou excluídos depois de confi gurados. As tuplas geralmente têm melhor desempenho (seus dados podem ser acessados mais rapidamente) do que uma lista regular. Uma tupla é uma estrutura de dados ideal para uma lista de itens heterogêneos (que se diferem em tipo ou comprimento) cujo valor não muda. As tuplas são idênticas às listas em todos os aspectos, exceto pelos seguintes itens: as tuplas são definidas colocando-se os elementos entre parênteses em vez de entre colchetes; as tuplas são imutáveis; as tuplas podem ser embaladas e desembaladas (packed e unpacked). Mapas Um objeto de mapeamento mapeia valores hash (identifi cadores de tamanho fi xo e que podem ser ordenados) para objetos arbitrários. Mapeamentos são objetos mutáveis. Atualmente, existe apenas um tipo de mapeamento padrão, o dicionário. Dicionários O dicionário é um tipo de estrutura de dados utilizado para mapear ou asso- ciar itens. Um dicionário em Python é como um dicionário no mundo real e é composto por dois elementos, as chaves e os valores. As chaves devem ser elementos únicos, ou seja, em um dicionário, não pode haver duas chaves com Variáveis, tipos de dados e operadores de algoritmos em Python18 Identificação interna do documento 1IHNVHPA5P-YPKWV71 o mesmo nome ou valor. Os valores podem ser praticamente de qualquer tipo, por exemplo, uma lista ou lista de lista, numéricos, booleanos, etc. A seguir, veja as características dos dicionários. São mutáveis. Podem ter seus valores e chaves alterados. São dinâmicos. Eles podem crescer e encolher conforme necessário. Podem ser aninhados. Um dicionário pode conter outro dicionário ou uma lista. Os elementos do dicionário são acessados via chaves. Os dicionários podem ser criados colocando-se uma lista separada por vírgula de pares “chave:valor” entre chaves. Cada par de chave mapeia para seu valor associado. dicionario1 = dict() # mesmo que: dicionario = {} dicionario2 = { # chave numérica 1: 'futebol', 2: 'basebol' } print(dicionario2) # Resultado: {1: 'futebol', 2: 'basebol'} dicionario3 = dict({ # chaves de tipos diferentes 'classe': 'primeira', 1: [1, 2, 3] }) print(dicionario3) # Resultado: {'classe': 'primeira', 1: [1, 2, 3]} dicionario4 = dict([ # Criado com uma sequência de tuplas (1, 'teste1'), (2, 'teste2') ]) print(dicionario4) # Resultado: {1: 'teste1', 2: 'teste2'} 19Variáveis, tipos de dados e operadores de algoritmos em Python Identificação interna do documento 1IHNVHPA5P-YPKWV71 3 Operadores em Python Como muitas outras linguagens de programação, o Python também reserva alguns caracteres especiais para atuar como operadores (PYTHON SOF- TWARE FOUNDATION, 2019d). Todo operador realiza algumas operações, como adição e multiplicação, para manipular dados e variáveis. As variáveis passadas como entrada para um operador são conhecidas como “operandos”. Operadores aritméticos São os símbolos que representam operações matemáticas aritméticas. Com operadores aritméticos, é possível realizar várias operações aritméticas, como adição, subtração, multiplicação, divisão, módulo, expoente, etc. O Python fornece várias maneiras para cálculos aritméticos, como função eval(), declarar variável e calcular ou mesmo chamar funções. No Quadro 2, a seguir, veja uma lista dos operadores aritméticos. Operador Propósito Uso + Adição a + b – Subtração a – b * Multiplicação a * b / Divisão a / b // Inteiro da divisão a // b % Módulo a % b ** Expoente a ** b Quadro 2. Lista dos operadores aritméticos Operadores de comparação Na programação Python, os operadores de comparação permitem determinar se dois valores são iguais ou se um é maior do que o outro, e então tomar uma decisão com base no resultado. O Quadro 3 descreve os operadores de comparação internos no Python. Variáveis, tipos de dados e operadores de algoritmos em Python20 Identificação interna do documento 1IHNVHPA5P-YPKWV71 Operador Propósito Uso > Maior que a > b < Menor que a < b == Igual a a == b != Diferente de a != b >= Maior ou igual a a >= b <= Menor ou igual a a <= b Quadro 3. Lista dos operadores de comparação Operadores lógicos Os operadores lógicos do Python permitem a tomada de decisões com base em várias condições. Os operandos agem como condições que podem resultar em um valor verdadeiro ou falso. O resultado dessa operação é verdadeiro ou falso (ou seja, um valor booleano). No entanto, nem todos esses operadores retornam um resultado booleano. Os operadores an e or retornam um de seus operandos em vez do valor booleano puro. Já o operador not sempre fornece um resultado booleano real. No Quadro 4, veja um exemplo que mostra como esses operadores funcionam no Python. Operador Propósito Uso and Se “a” for falso, então “a”; caso contrário, “b” a and b or Se “a” for falso, então “b”; caso contrário, “a” a or b not Se “a” for falso, então True; caso contrário, False not a Quadro 4. Lista dos operadores lógicos 21Variáveis, tipos de dados e operadores de algoritmos em Python Identificação interna do documento 1IHNVHPA5P-YPKWV71 Operadores bit a bit Os operadores de bit a bit do Python processam os bits individuais de va- lores inteiros. Eles os tratam como sequências de bits binários. É possível usar operadores bit a bit para verifi car se um bit específi co está defi nido. Por exemplo, os sensores geralmente trabalham com bits específi cos queindicam se determinada função está ativa ou não. Em situações similares, esses operadores binários podem ajudar. No Quadro 5, veja uma lista dos operadores binários. Operador Propósito Uso & Retorna 1 se ambos os bits correspondentes forem 1 a & b | Retorna 1 se algum dos bits correspondentes for 1 a | b ~ Inverte todos os bits em um único operando ~ a ^ Retorna 1 se algum dos bits correspondentes for 1, mas não os dois a ^ b >> Desloca os bits de “a” para a direita, “b” número de vezes a >> b << Desloca os bits de “a” para a esquerda, “b” número de vezes a << b Quadro 5. Lista dos operadores binários Operadores de atribuição No Python, é possível usar operadores de atribuição para defi nir valores em variáveis. Por exemplo, a instrução “a = 4” usa um operador de atribuição pri- mitivo que atribui o valor “4” ao operando esquerdo da instrução. No Quadro 6, está a lista de operadores compostos disponíveis no Python. Por exemplo, a instrução “a += 1” é adicionada à variável e, em seguida, atribui essa mesma variável. O operador será avaliado como “a = a + 1”. Variáveis, tipos de dados e operadores de algoritmos em Python22 Identificação interna do documento 1IHNVHPA5P-YPKWV71 Operador Exemplo Mesmo que = a = 1 a = 1 += a += 1 a = a + 1 –= a –= 1 a = a – 1 *= a *= 1 a = a * 1 /= a /= 1 a = a / 1 %= a %= 1 a = a % 1 **= a **= 1 a = a ** 1 &= a &= 1 a = a & 1 |= a |= 1 a = a | 1 ^= a ^= 1 a = a ^ 1 >>= a >>= 1 a = a >> 1 <<= a <<= 1 a = a << 1 Quadro 6. Lista dos operadores de atribuição Operadores avançados O Python também tem alguns operadores para fi ns especiais. Eles são conhe- cidos como “operadores avançados Python” e são os operadores de identidade e os operadores de associação. Veja a seguir. Operadores de identidade Esses operadores permitem comparar os locais de memória de dois objetos Python. Além disso, permitem saber se os objetos Python compartilham o mesmo endereço de memória. As variáveis com valores iguais não são ne- cessariamente idênticas. Como alternativa, é possível usar esses operadores para determinar se um valor é de uma classe ou tipo específi co. Consulte o Quadro 7 para entender mais sobre eles. 23Variáveis, tipos de dados e operadores de algoritmos em Python Identificação interna do documento 1IHNVHPA5P-YPKWV71 Operador Propósito Uso is Retorna True se os operandos referenciam o mesmo objeto a is b is not Retorna True se os operandos não referenciam o mesmo objeto a is not b Quadro 7. Lista dos operadores de identidade Operadores de associação Os operadores de associação permitem testar se um valor é membro de outros objetos Python, como strings, listas ou tuplas. Além disso, esse operador também pode testar em um dicionário, mas apenas para a chave, não para o valor. No Quadro 8, veja os operadores de associação. Operador Propósito Uso in Retorna True se o valor existe na sequência 1 in [1, 2, 3] not in Retorna True se o valor não existe na sequência 4 not in {1:2, 2:7, 3:9} Quadro 8. Lista dos operadores de associação Precedência de operadores em Python Quando é agrupado um conjunto de valores, variáveis, operadores ou chamadas de função, é necessário ter uma ordem em que as operações e operadores são avaliados. Por exemplo: “3 + 4” é uma expressão simples em Python e con- tém apenas um operador e dois operandos. No entanto, uma expressão mais complexa pode incluir vários operadores, por exemplo, “2 * 4**4 + 5”. Para Variáveis, tipos de dados e operadores de algoritmos em Python24 Identificação interna do documento 1IHNVHPA5P-YPKWV71 avaliar expressões complexas, o Python estabelece a regra de precedência, que governa a ordem em que as operações ocorrem. A seguir está a lista da precedência dos operadores, da maior para a menor. 1. (**) — expoente 2. (~x) — bit a bit de negação 3. (+x, -x) — positivo, negativo 4. (*, /, %) — produto, divisão, resto 5. (+, –) — adição, subtração 6. (<<, >>) — deslocamento para a esquerda/direita 7. (&) — bit a bit AND 8. (̂ ) — bit a bit XOR 9. (|) — bit a bit OR 10. (in, not in, is, is not, <, <=, >, >=, !=, ==) — comparação, associação, identidade 11. (not x) — booleano NOT 12. (and) — booleano AND 13. (or) — booleano OR Os operadores na parte inferior da lista têm a menor precedência, e aqueles na parte superior da lista têm a mais alta precedência. Quaisquer operadores no mesmo item da lista têm a mesma precedência. Está claro que a multiplicação é realizada antes da adição, pois tem precedência mais alta, conforme a lista anterior. Da mesma forma, a potência tem a precedência mais alta entre todos os itens da lista. Por exemplo, na expressão “2 * 4**4 + 5”, primeiramente será avaliada a potência, depois será avaliado o produto e, por fim, será avaliada a adição. Na matemática, seria algo assim: {[2 * (4**4)] + 5}. Ao longo do capítulo, você viu como ocorrem o gerenciamento de memória e o gerenciamento de variáveis em Python, além dos tipos de dados suportados e operadores disponíveis nesta linguagem de programação. Esperamos que você tenha gostado, continue a estudar e a implementar soluções algorítmicas para manipulação dos mais variados tipos de dados em Python! 25Variáveis, tipos de dados e operadores de algoritmos em Python Identificação interna do documento 1IHNVHPA5P-YPKWV71 PYTHON SOFTWARE FOUNDATION. Data types. [2019a]. Disponível em: https://docs. python.org/3/library/datatypes.html. Acesso em: 30 dez. 2019. PYTHON SOFTWARE FOUNDATION. Glossary. [2019b]. Disponível em: https://docs. python.org/3/glossary.html#term-bytecode. Acesso em: 30 dez. 2019. PYTHON SOFTWARE FOUNDATION. Identifiers and keywords. [2019c]. Disponível em: https://docs.python.org/3/reference/lexical_analysis.html#identifiers. Acesso em: 30 dez. 2019. PYTHON SOFTWARE FOUNDATION. Standard operators as functions. [2019d]. Disponível em: https://docs.python.org/3.8/library/operator.html. Acesso em: 30 dez. 2019. Os links para sites da web fornecidos neste capítulo foram todos testados, e seu fun- cionamento foi comprovado no momento da publicação do material. No entanto, a rede é extremamente dinâmica; suas páginas estão constantemente mudando de local e conteúdo. Assim, os editores declaram não ter qualquer responsabilidade sobre qualidade, precisão ou integralidade das informações referidas em tais links. Variáveis, tipos de dados e operadores de algoritmos em Python26 Identificação interna do documento 1IHNVHPA5P-YPKWV71 Conteúdo: [illJ__ � SOLUÇÕES EDUCACIONAIS INTEGRADAS DICA DO PROFESSOR Python tem várias estruturas de dados disponíveis para casos distintos. Uma das mais utilizadas é, sem dúvida, o dicionário (dict). Dicionários são dinâmicos e, em Python, é o tipo que mais rep resenta o conceito de banco de dados, pois trata-se de uma coleção associativa. A associação, ou mapeamento, é feita a partir de uma chave, que pode ser qualquer tipo imutável, para um valor, podendo ser qualquer objeto de dados do Python. Nesta Dica do Professor, você verá como dicionários são criados em Python, como os elementos são adicionados, acessados e removidos, entre outros métodos internos dessa estrutura. Aponte a câmera para o código e acesse o link do vídeo ou clique no código para acessar. EXERCÍCIOS 1) Os elementos de um dicionário são compostos por dois atributos, sendo eles a chave e o valor. Cada chave mapeia exclusivamente um determinado valor. Considere o seguinte código em Python: dicionario = { 'Love': 'Amor', 'Paz': 'Peace', 5: 'Five', True: 'True', False: 'Falso' } Com base no dicionário acima, pode-se afirmar que está correto: https://fast.player.liquidplatform.com/pApiv2/embed/cee29914fad5b594d8f5918df1e801fd/1a044141082ec655305bcfe1320f3f67 A) print( dicionario[ Paz ] ) B) print( dicionario[ 'True' ] ) C) print( dicionario[ '5' ] ) D) print( dicionario[ 'False' ] ) E) print( dicionario[ 'Love' ] ) 2) As estruturas de dados, em Python, se diferenciam quanto à sintaxe paraa criação de cada uma delas. Por exemplo, uma lista é criada com colchetes, uma tupla com parên teses e um dicionário com chaves. a = (1, 2, 3) b = [2, 3, 4] c = {"1": 1, "2": 2, "3": 3} A sintaxe correta para acessar valores são: A) a[2], b[2] e c["2"]. B) a[3], b[3] e c[3]. C) a[2], b[2] e c[2]. D) a[3], b[4] e c[3]. E) a[1], b[2] e c[1]. 3) Sabe-se que, em Python, as variáveis não precisam ser declaradas, porém precisam se r inicializadas antes do uso. O nome de objetos, também chamado identificadores, po ssui algumas regras a serem observadas no momento de defini-los. Qual identificador está adequado e atende às regras de sintaxe de Python? A) nome+sobrenome = "Edson Campos" B) 1_teste = True C) teste_2 = False D) aceleração = 9.8 E) proporção áurea = 0.618 4) A precedência de operadores determina qual operador é executado primeiro, em uma expressão com mais de um operador cujas prioridades são diferentes. Observe a segu inte expressão em Python: a + b * c ** d / e - f Para forçar a precedencia dos operadores, pode-se escrevê-la de que forma? A) ( ( a + ( b * ( c * * d ) ) / e ) - f ) B) ( ( ( a + b ) * ( c * * d ) ) / e ) ) - f ) C) ( ( a + ( ( b * ( ( c * * d ) ) / ( e - f ) ) D) ( ( a + ( ( b * ( c ** d ) ) / e ) ) - f ) E) ( ( a + ( ( b * c ) * * d ) ) / e ) ) - f ) 5) Quanto aos dicionários em Python, sabe-se que é uma estrutura de dados dinâmica, q ue pode ter seus valores alterados, e que cada chave mapeia um valor específico. Qua nto às chaves que um dicionário pode ter, sabe-se, também, que somente objetos que podem ser gerados um hash daquele objeto são permitidos. Quanto aos tipos que podem ser usados para as chaves de um dicionário, qual alteran tiva é a correta? A) 1, 'a', (1,2), True B) 1, 'a', [1,2], True C) 1, 'a', (1,2), {1:2} D) 1, ' a', (1,2), {[1,2]} E) 1, ' a', ([1,2]), True NA PRÁTICA Em programação, para cada situação, é fundamental a escolha certa de estruturas e seus tipos de dados. Ou seja, como o software foi idealizado e projetado. Os tipos tuplas e listas são extrema mente úteis e podem ajudar bastante na organização dos dados em um algoritmo. Porém, muitas vezes, é necessário um tipo mais especializado, que possa realizar um mapeamento para valores – por exemplo, o dicionário. Esse tipo de notação é muito utilizado para as respostas de serviços nas requisições Web. Os ser viços da Web também podem utilizar a estrutura XML como formato para transmissão de dado s, mas, desde que o JSON surgiu, ele tem se tornado o formato preferido, pois é mais leve e sua notação é mais simples que o formato XML. SAIBA + Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professo r: Pythonclub Este portal foi criado pela comunidade e para a comunidade. Sua finalidade é unir, em um único lugar, tudo sobre a linguagem Python e tecnologias relacionadas. Aponte a câmera para o código e acesse o link do vídeo ou clique no código para acessar. Estruturas de dados Este livro explica uma série de outras estruturas de dados que podem ser usadas na Computação. Boa leitura! Aponte a câmera para o código e acesse o link do vídeo ou clique no código para acessar. Comunidade Python Brasil A comunidade Python Brasil reúne grupos de usuários, em todo o Brasil, interessados em difund ir e divulgar a linguagem de programação Python. Abriga, em seu domínio, todo o material edita do sobre Python em português brasileiro. Aponte a câmera para o código e acesse o link do vídeo ou clique no código para acessar. http://pythonclub.com.br/ https://viewer.bibliotecaa.binpar.com/viewer/9788577804504/ https://wiki.python.org.br/IntroPython#Tipos_simples
Compartilhar