• Nenhum resultado encontrado

Prof. Victor Dalton 2021

N/A
N/A
Protected

Academic year: 2021

Share "Prof. Victor Dalton 2021"

Copied!
107
0
0

Texto

(1)

Aula 07

Análise de Dados para Auditor Federal de Controle Externo – Área Controle Externo do TCU

Prof. Victor Dalton

(2)

Sumário

SUMÁRIO 2

LINGUAGEM PYTHON 3

INTRODUÇÃO 3

TIPOS DE DADOS 10

Coleções 11

Manipulação de listas 11

Trabalhando com ranges 12

Manipulação de strings 14

OPERADORES 16

Operadores numéricos 16

Operadores relacionais e booleanos 16

Operadores sequenciais 17

ESTRUTURAS DE DECISÃO 18

if 18

if-else 18

if-elif-else 18

ESTRUTURAS DE REPETIÇÃO 20

for 20

for-else 21

while 22

while-else 22

FUNÇÕES 24

CLASSES 25

QUESTÕES COMENTADAS PELO PROFESSOR 26

LISTA DE QUESTÕES COMENTADAS 79

GABARITO 101

RESUMO DIRECIONADO 102

(3)

Linguagem Python

Introdução

Caros amigos, nesta aula vamos falar da linguagem de programação Python. A linguagem tem crescido muito nos últimos tempos e alguns acham que é uma tecnologia nova. Na verdade, Python existe desde 1991!

Apesar dessa longa “estrada”, Python ganhou notoriedade no mercado nos últimos anos. Hoje em dia está entre as linguagens de programação mais utilizadas. Segundo o relatório Octoverse do Github, é a 3ª linguagem mais popular do mundo.

O que fez o Python obter esse lugar de destaque são algumas características como alto nível de abstração, multiparadigma, foco no programador, versatilidade, dentre outras. Nós vamos estudar todas elas além de aprender a usar as construções da linguagem, ler/escrever programas em Python e o principal: gabaritar todas as questões de concurso sobre essa linguagem!

Vocês sabem que um programa de computador é um conjunto de instruções que descrevem uma tarefa a ser realizada por um computador. O computador está lá no nível mais baixo de abstração. Só entende 0 e 1. O humano está no outro extremo, no nível mais alto de abstração.

(4)

Ao passo que o computador só é capaz de trabalhar com coisas concretas, o homem pode trabalhar com pensamentos abstratos e subjetivos. Para uma pessoa dar instruções para um computador tem que ser usado um meio termo, algo que ambos entendam, que é a linguagem de programação.

Observem a nossa pirâmide de nível de abstração que o Python está no degrau mais alto, ou seja, é uma linguagem de alto nível. O código em Python é bastante conciso, relativamente fácil de ser lido, mais próximo da linguagem humana que em outras linguagens. Isso foi feito de propósito pelos criadores da tecnologia. O objetivo desde o início era enfatizar a legibilidade do código por parte do programador, facilitar o seu trabalho e aumentar sua produtividade. Um algoritmo escrito em Python requer menos linhas de código que o mesmo algoritmo escrito em outras linguagens.

O código-fonte Python (arquivo com extensão .py) é interpretado. Isso quer dizer que suas instruções são executadas interativamente, uma por uma, por um interpretador. Internamente, ao executar um programa em Python, ele é automaticamente transformado em um formato denominado bytecode (arquivo com extensão .pyc ou .pyo) para ser interpretado por uma máquina virtual.

Esse bytecode é portável, isto é, roda em qualquer sistema operacional (Windows, Mac, Linux, Android, etc.) desde que esse sistema possua uma máquina virtual Python. Isso dá muita versatilidade ao Python. O mesmo código roda em diversos sistemas diferentes. Por isso é dita uma linguagem multiplataforma.

(5)

Professor, ainda não entendi o que significa multiplataforma.

Sem problema. Observe no esquema abaixo como funciona. Você faz seu programa Python (.py), compila- o transformando num bytecode (.pyc) e aí pode pegar esse bytecode e jogar em qualquer plataforma que possua uma máquina virtual Python: Windows, Mac, Linux e outros. Sem precisar recompilar. É o mesmo código.

Outro motivo da versatilidade da linguagem é o fato de ser multiparadigma.

Peraí! Multi o quê, professor?

Multiparadigma. Significa que Python suporta vários paradigmas de programação como a funcional, imperativa, procedural e orientada a objeto. Mnemônico FIPO.

Multiparadigma em Python

F Funcional

I Imperativa

P Procedural

O Orientada a Objeto

(6)

Todas essas qualidades fazem com que o Python seja empregado nas mais variadas aplicações, desde desenvolvimento de games, sistemas do mercado financeiro, sites Web, análise de dados, estatística, pesquisa científica, etc. O motor de busca do Google, por exemplo, é grande parte escrito em Python. As aplicações que mais têm fomentado o crescimento da linguagem ultimamente são a análise de grandes bases de dados (Big Data), machine learning e inteligência artificial.

Dica: a partir de agora, recomendo que você acesse https://repl.it/languages/python3 e utilize o ambiente online ao longo da aula, pois TUDO o que mostrarmos no PDF você também poderá reproduzir.

O Python tem uma biblioteca padrão muito rica que estende a funcionalidade da tecnologia tornando-a uma linguagem poderosa, um verdadeiro “canivete suíço”. A biblioteca padrão já vem incluída no pacote Python e contém classes e funções prontas para o seguinte: processamento de texto, manipulação de estruturas de dados compostas, funções matemáticas complexas, programação funcional, acesso a diretórios e arquivos em disco, persistência de dados em bancos de dados, compressão de arquivos, arquivamento, exportação de dados para formatos específicos como CSV, criptografia, acesso a serviços do sistema operacional, programação paralela, comunicação em redes, processamento de mark-up (HTML, XML, ...), suporte a protocolos de internet, serviços multimídia, desenvolvimento de interfaces gráficas, dentre outros. Ufa!

Além da biblioteca padrão, existem inúmeras bibliotecas de terceiros com muita coisa pronta para facilitar a vida do desenvolvedor. Qualquer pessoa, empresa, universidade, órgão público pode desenvolver uma biblioteca Python e licenciá-la para a comunidade de desenvolvedores.

Em diversas linguagens, existe a figura dos delimitares de início e fim de bloco de comandos. Normalmente esses delimitadores são as chaves ({ }) ou o begin/end. Nesse ponto, Python é bem diferente das demais porque não usa delimitadores para marcar os blocos de comandos. O que define os blocos em Python é a indentação. Por isso, é de fundamental importância indentar corretamente o código.

Indentar nada mais é que tabular as instruções corretamente. Veja no código abaixo que o print da linha 5 está deslocado uma tabulação para a direita. Esse comando está indentado. Ao indentar, você está dizendo que esse print da linha 5 só deve ser executado se cair no if. Da mesma forma, ao indentar o print da linha 7 você está dizendo que esse print é pra executar somente se cair no else. Em outras linguagens, como por exemplo o R que veremos na próxima aula, a indentação não é obrigatória porque elas têm os delimitadores ({} ou begin/end). Em Python é obrigatório indentar.

Python é uma linguagem de tipagem dinâmica e forte. Tipagem dinâmica porque o tipo da variável é descoberto pelo interpretador somente no momento da execução. Não é necessário definir a priori os tipos das

(7)

variáveis. Como o tipo é descoberto somente em tempo de execução, ele pode mudar dinamicamente ao longo do programa. Tipagem forte implica que não se podem misturar tipos incompatíveis.

(8)

Características de tipagem das variáveis Python

Tipagem dinâmica O tipo de variável pode mudar ao longo do programa

Tipagem forte Não pode fazer operações com tipos incompatíveis

Para definir uma função em Python, usamos a palavra reservada def seguido do nome da função e de uma lista opcional de argumentos separados por vírgulas. Exemplo: def calculaIMC(peso, altura) é uma declaração válida de uma função chamada calculaIMC que recebe 2 parâmetros: peso e altura.

Observe o seguinte trecho de código para calcular o IMC (Índice de Massa Corporal) de uma pessoa a partir do seu peso e altura.

Repararam que o código Python é bem enxuto? Não precisamos definir explicitamente os tipos das variáveis.

Além disso, esses tipos podem mudar dinamicamente ao longo do programa, o que dá flexibilidade. Apesar de ter tipagem dinâmica, não podemos “abusar”. Se misturar tipos incompatíveis (como na linha 11) dá erro.

Também não é necessário demarcar o início e o fim do bloco de comandos dentro do corpo da função calculaIMC (linhas 2 e 3). Isso foi definido pela indentação.

Já dissemos anteriormente que Python é multiparadigma porque suporta programação funcional, imperativa, procedural e orientada a objeto (FIPO). Desses 4 paradigmas, o preponderante é a orientação a objeto a ponto de tudo na linguagem ser um objeto.

Como assim “tudo é um objeto” professor?

Declaração da função e de seus respectivos argumentos. Não é necessário definir os tipos dos argumentos. Eles serão descobertos em tempo de execução.

Também não é necessário definir o tipo da variável imc.

Somente na hora de invocar a função, o interpretador descobrirá que os 2 argumentos da função (peso e altura) são do tipo numérico e somente após o retorno da função saberá que meuIMC também é numérico.

A tipagem é dinâmica. Isso significa que pode mudar dinamicamente ao longo do programa. Esta conversão de meuIMC para um tipo string é válida.

Somente neste ponto o programa dá erro! O tipo de meuIMC passou a ser string na linha 8. A operação realizada na linha 11 não é possível com tipo string. Não pode misturar tipos incompatíveis pois a tipagem é forte.

(9)

Objetos são estruturas compostas de atributos e métodos (funções). Quando dizemos que tudo em Python são objetos estamos dizendo que tudo tem atributos e métodos e pode ser passado como uma variável ou como argumento para uma função. Tudo mesmo, incluindo os tipos primitivos, as funções e até os comentários do código. Vamos clarear isso.

Iremos definir uma função simples chamada calculaMedia e dentro dela colocar um comentário de documentação """esta função calcula a média entre arg1 e arg2""". Como dissemos, a função em Python também é um objeto. Um dos atributos desse objeto armazena justamente esse comentário. Podemos recuperar o atributo comentário com o comando da linha 7. Repare que a função calculaMedia é um objeto que é passado como parâmetro para a função inspect.getdoc(). A saída do print da linha 8 será exatamente o texto de comentário que definimos dentro da função.

Da mesma forma que obtivemos o atributo comentário do objeto função, poderíamos ter obtido outros atributos como o código-fonte da função, o nome da função, as variáveis internas, etc. O fato de tudo ser objeto em Python abre um leque de possibilidades para o programador. Não se preocupe se você não entendeu alguma parte do trecho de código acima. Vamos entrar em todos os detalhes da linguagem mais à frente nesta aula.

Caso queira escrever e rodar seus próprios programas em Python existem inúmeros softwares. Recomendo o Thonny, uma IDE gratuita muito simpática, simples de usar e voltada para quem está aprendendo a linguagem. Ele pode ser baixado em thonny.org. Tem versão para Windows, Mac e Linux.

O Thonny pode ser uma ferramenta útil para concurseiros! Você pode copiar o código do enunciado de uma questão, colar no Thonny e mandar ele executar. Dentro dele, dá para executar o programa passo a passo, inspecionar as variáveis, obter ajuda, etc.

É só para a fase de aprendizado e tirada de dúvidas específicas da linguagem. Na hora da prova, não terá essa facilidade. Por isso é importante estudarmos o funcionamento da linguagem nesta aula.

(10)

Tipos de dados

A biblioteca padrão do Python inclui alguns tipos de dados núcleo que são nativos da linguagem. Lembre-se que tudo é objeto. Portanto, todos esses tipos, até os mais primitivos, também são objetos.

Tipo Descrição Exemplos

Números

Inclui tipos numéricos como inteiros, reais, imaginários, hexadecimais, booleanos, entre outros.

123, 3.1415, 1+2j, 0x9ff, True, False

Strings Cadeias de caracteres. “laranja”, “maçã”, “José1”

Listas Sequência mutável de objetos de tamanho variável.

[1, 2, “João”], [“login”,”senha”], [234, [12.5, “spam”], 9+3j]

Dicionários Estrutura de dados de mapeamento de uma chave em um valor.

{“laranja” : 5.00, “maçã” : 7.40}

{“love” : “amor”, “book” : “livro”}

Tuplas Sequência imutável de objetos. Seus

valores não podem mudar. (1, “gato”, 15.45)

Arquivos Referência para o conteúdo de arquivos

em disco open(‘C:\meuarquivo.txt’)

Conjuntos

Sequência não ordenada de objetos únicos. O conjunto em si é mutável, mas seus elementos são imutáveis.

{‘a’, ‘b’, ‘c’}

{1, 12.3, 45, “New York”}

None Representa o nada. Equivalente ao null

em outras linguagens. None

Outros Funções, módulos e classes também são tipos.

(11)

Coleções

Os 3 tipos principais de coleções em Python são as listas, as tuplas e os dicionários. É importante distinguir bem as características de cada um desses tipos estruturados.

Coleção Pode substituir os valores dos elementos?

Pode acrescentar/remover elementos?

Forma de indexação dos elementos

Lista Sim Sim Inteiro

Tupla Não Não Inteiro

Dicionário Sim Sim String

Veja exemplos de como indexar coleções corretamente. Os elementos das listas e das tuplas são referenciados por um índice inteiro. Já os elementos de um dicionário são indexados pela chave, que é um string.

Manipulação de listas

As listas são outro recurso poderoso do Python. Elas podem conter elementos de qualquer tipo de objeto:

números, strings, outras listas, etc. Seus elementos podem ser mutáveis, isto é, modificáveis. A lista em si também é mutável, pode ter seu tamanho aumentado ou reduzido e a ordem dos seus elementos rearranjada.

Os elementos de uma lista na maior parte das vezes são acessados colocando o índice desejado entre colchetes. O índice do 1º elemento é 0 (zero). Os índices andam “para a frente” e “para trás”. Explicando melhor, você pode acessar o último elemento com o índice -1, o penúltimo com -2 e por aí vai.

As listas são mutáveis. É possível alterar o valor dos seus elementos, inserir novos elementos, remover e reordenar.

Imprime “Coca Cola”, o elemento de lista cujo índice é 1

Imprime 9, o elemento do dicionário cuja chave é “matemática”

(12)

Trabalhando com ranges

Uma função recorrentemente cobrada em concursos é a range. Range em inglês é intervalo. E a ideia é essa mesmo. Essa função serve para gerar automaticamente uma sequência de números inteiros entre um intervalo.

Funciona da seguinte forma.

start: (opcional) Indica o 1º número da sequência. Default = 0.

stop: (mandatório) Limite superior da sequência, não inclusive.

step: (opcional) Incremento. Default = 1.

O retorno da função range é um objeto sequencial da classe range, mas não é uma lista. Para transformar o range em lista utilize a função list() como no trecho abaixo.

É preciso ficar atento para o fato de a função range retornar um objeto do tipo range e não uma lista. As bancas de concurso cobram isso. Veja a questão abaixo.

Gera um objeto range de 0 a 4 com incremento de 1.

O stop = 5 é não-inclusive. Por isso para 1 casa antes, no 4.

Transforma o range na lista [0, 1, 2, 3, 4]

Gera um objeto range de 1 a 11 com incremento de 2.

O stop = 12 é não inclusive. Por isso para 1 casa antes, no 11.

Transforma o range na lista [1, 3, 5, 7, 9, 11]

(13)

(VUNESP - 2017 - TJM-SP - Técnico de Comunicação e Processamento de Dados) Considere o seguinte código no Python 3.5:

x = range(10)

O tipo da variável “x”, após a execução do código, é (a) classe ‘set’.

(b) classe ‘tuple’.

(c) classe ‘list’.

(d) classe ‘range’.

(e) classe ‘iter’.

RESOLUÇÃO

O retorno de range(10) é um objeto da classe range que representa o intervalo [0,1,2,3,4,5,6,7,8,9]. Não é uma lista! É um range.

Resposta: D

(14)

Mais uma questão, agora para você entender o funcionamento do range.

(FGV - 2018 - AL-RO - Analista Legislativo - Infraestrutura de Redes e Comunicação) Analise o código Python a seguir.

Assinale a opção que indica o número de valores printados na execução desse código.

(a) Zero (b) Um (c) Dois (d) Quatro (e) Cinco RESOLUÇÃO

Lembrando a assinatura do método range:

O 1º parâmetro do range é start = 0 O 2º parâmetro é o stop = 4

O 3º parâmetro é o step = -1 (step = incremento)

Com esses parâmetros start e incremento, a sequência seguiria o seguinte caminho: [0, -1, -2, -3, -4, -5, ...]

Desse jeito não vai chegar nunca no stop = 4. Se fosse uma outra linguagem de programação poderíamos entrar aqui em um loop infinito com consequente estouro de memória. Mas a função range do Python é “inteligente” e nesse caso o range retornado é uma sequência vazia pela impossibilidade de chegar no stop = 4 partindo do start

= 0 e decrementando de -1 em -1.

Desta forma, o for não realiza nenhum loop e consequentemente o print nunca é chamado.

Resposta: A

Manipulação de strings

Strings podem ser representadas tanto com aspas simples quanto com aspas duplas. É a mesma coisa. Tem também as aspas triplas, para quando a string tem mais de 1 linha.

(15)

Você pode concatenar strings com o operador + e obter repetições com o *. No código abaixo, o print da linha 5 retorna “Michael Jordan “ e o da linha 8 “Michael Michael Jordan Jordan Jordan ”.

Existem diversas funções prontas para facilitar operações com strings como obter o seu tamanho (len), encontrar ocorrências dentro dela (find), quebrar (split).

As strings em Python são imutáveis! Na linha 9 acima, quando você aplica a função split sobre a string citacao, a citacao fica intacta (imutável) e é gerado um retorno com o resultado do split.

Outros exemplos de funções da biblioteca padrão úteis para manipular strings: swapcase, strip e replace.

Imprime 37, o número de caracteres da string citacao

Imprime 6, o índice da 1ª ocorrência de “aim”

Imprime uma lista com as subpartes de citacao quebradas pelo separador ‘;’ (ponto e vírgula):

[“Small aim is a crime”, “have great aim”]

Imprime um string com os caracteres invertidos.

Maiúscula vira minúscula e vice-versa.

“ rEPÚBLICA fEDERATIVA dO bRASIL “ Retira os espaços do início e do fim do string.

“República Federativa do Brasil“

Substitui um texto pelo outro.

“República Federativa da Argentina“

(16)

Operadores

Vamos dar uma olhada nos operadores em Python.

Operadores numéricos

São aplicados sobre os tipos numéricos e retornam também um número.

Operação Descrição X + Y Adição

X - Y Subtração X * Y Multiplicação

X / Y Divisão

X ** Y Exponenciação

Operadores relacionais e booleanos

Retornam True ou False.

Operação Descrição

X < Y Menor

X <= Y Menor ou igual X > Y Maior

X >= Y Maior ou igual X == Y Igual

X != Y Diferente

X is Y Testa se X e Y são o mesmo objeto X is not Y Testa se X e Y não são o mesmo objeto

X < Y < Z Comparação tripla not X Inverte o valor lógico de X

(17)

Alguns exemplos de uso dos operadores relacionais.

Operadores sequenciais

Apropriados para trabalhar com sequências (strings, listas e tuplas).

Operação Descrição

X in S Verifica se o elemento X pertence à sequência S

X not in S Verifica se o elemento X não pertence à sequência S

S1 + S2 Concatena as sequências S1 e S2 n * S Repete n vezes a sequência S

S[i:j] Fatia a sequência S entre os índices i e j len(S) Retorna o tamanho de S

min(S) Retorna o mínimo elemento de S max(S) Retorna o máximo elemento de S for X in S Percorre todos os elementos de S

armazenando o elemento corrente em X del S[i] Deleta o elemento localizado no índice i

(18)

Você pode iterar dentro de uma sequência sem referenciar seus índices utilizando o operador for X in S. Veja como funciona.

Nesse exemplo, são impressos em tela os nomes dos filmes que começam com a letra “C”: “Cidadão Kane”

e “Casablanca”.

Estruturas de decisão

Como vimos na aula de Lógica de Programação, as estruturas de decisão servem para desviar o fluxo de execução do programa dependendo de uma condição. Python possui 3 estruturas de decisão: if, if-else e if-elif- else.

if

O if é o mais simples. Só executa determinada ação se a condição for verdadeira. A sintaxe é a seguinte. Tem que colocar o “:” (dois pontos) após a condição.

if-else

O if-else é uma bifurcação. Se a condição de teste for verdadeira, executa o if, caso contrário executa o else.

Observe o seguinte trecho.

Neste caso, será executado somente o print da linha 6 porque a condição idade >= 18 é FALSA.

if-elif-else

O if-elif-else é um encadeamento de diversos caminhos possíveis. É como se fosse uma “escadinha”. Ele testa o 1º degrau, se for falso passa para o 2º, se for falso passa para o 3º e assim sucessivamente até o último degrau que é o else. O else só será executado se todas as condições anteriores forem falsas.

(19)

Na linha 3 definimos a primeira condição (idade < 12). Como o teste dá falso (pois idade é 65), o programa seguirá para o próximo teste elif na linha 6 sem executar o print(“criança”). Na linha 6 o teste também dá falso.

Então pula o print(“adolescente”) e parte para o elif da linha 9. Na linha 9 novamente o elif dá falso. Ele pula o print(“adulto”) e segue para o else. Por fim, ele imprime “idoso”.

Ele vai andando de degrau em degrau enquanto as condições testadas forem falsas. Se chegar num degrau em que a condição seja verdadeira, executa o bloco de comandos correspondente e sai da escada. Não passa para o próximo degrau.

(20)

Estruturas de repetição

Estruturas de repetição permitem que determinado bloco de instruções seja executado repetidamente segundo certos critérios. São também conhecidos como laços ou loops. Em Python, temos as seguintes estruturas de repetição.

Estrutura de repetição Finalidade

for Executar repetidamente por um número determinado de vezes

for-else Igual o for só que com um bloco else a ser executado obrigatoriamente após os loops

while Executar repetidamente enquanto uma condição for verdadeira

while-else Igual o while só que com um bloco else a ser executado obrigatoriamente após os loops

for

O for é usado quando se quer iterar sobre um bloco de código um número determinado de vezes. É muito utilizado para percorrer itens de uma coleção (listas, tuplas, strings, ...) e, para cada um dos itens, executar um bloco de código.

No exemplo acima, o for vai executar o laço 4 vezes, 1 para cada elemento da lista cores. Em cada volta do loop ele irá fazer o print do elemento corrente da lista: "azul", "verde", "vermelho", "amarelo", nesta ordem. O comportamento seria o mesmo se a variável cores em vez de lista fosse um outro tipo de coleção como uma tupla, por exemplo.

Lembrando que o string é uma coleção de caracteres. Portanto, é possível usar um for para iterar sobre os caracteres do string. Veja abaixo.

(21)

No exemplo acima, será impresso ‘o’, ‘i’, ‘i’, ‘a’, ‘e’, ‘e’, ‘a’, nessa ordem. Imprime somente as vogais dentro do string palavras.

O for também é muito utilizado para iterar dentro de um intervalo definido por um range . No exemplo abaixo ele irá imprimir todos os números do range(8) que são os seguintes: 0, 1, 2, 3, 4, 5, 6, 7.

Existem 2 palavras reservadas úteis pra usar dentro de loops, são elas o break e continue.

O break faz com que o loop seja imediatamente encerrado, independentemente de ter percorrido todas as iterações previstas no for. No exemplo a seguir, só serão impressas as cores “azul” e “verde”. Isso ocorre porque quando chega no “verde” ele dá um break o que força a saída do loop for antes de seguir para os demais elementos da lista.

O continue funciona de maneira parecida com a do break, porém, no lugar de encerrar o loop, ele faz com que todo o código que esteja abaixo (porém ainda dentro do loop) seja ignorado e avança para a próxima iteração.

No trecho de código acima, só serão impressos os números ímpares dentro do range(10) que são 1, 3, 5, 7, 9.

for-else

O for-else nada mais é que um for com um bloco adicional else ao final. Depois de executar todas as iterações do for ele obrigatoriamente executa o bloco dentro do else 1 vez.

O for percorre todo o range [0,1,2,3,4,5,6,7,8,9] e a cada iteração atribui o número atual à variável numero

Se o número atual dividido por 2 der resto 0, ou seja, número atual for par, o continue obriga a pular para a próxima iteração do for pulando o comando subsequente (print)

Só executa print se numero for ímpar porque nestes casos

“escapa” do continue.

(22)

No exemplo acima, depois de imprimir todos os ímpares entre 0 e 10, ele imprime o texto "Terminei. Printei somente os ímpares".

while

O while é um loop que será executado repetidamente enquanto determinada condição for verdadeira.

Observe o seguinte exemplo.

Ele percorre os elementos da lista situacao e enquanto o elemento da lista é igual a “não passei” ele permanece no laço imprimindo a mensagem “Não vou desistir” e testando o próximo elemento. Isso é feito 3 vezes. Quando ele chega no elemento “Passei !!!”, a condição deixa de ser verdadeira e ele sai do loop.

Os comandos break e continue funcionam também dentro do while da mesma forma que no for.

while-else

O while-else é um while com um bloco adicional else no final que é executado obrigatoriamente após todas as iterações do while. É a mesma ideia do for-else só que com o while.

(23)
(24)

Resumindo todas as estruturas de controle do Python.

Funções

As funções são declaradas usando a palavra reservada def seguido do nome da função e de uma lista opcional de argumentos. A título de exemplo, vamos escrever uma função para calcular as raízes da equação do 2º grau. A função recebe os coeficientes a, b e c da equação 𝒂𝒙𝟐+ 𝒃𝒙 + 𝒄, aplica a fórmula conhecida como de Bhaskara 𝑥 =−𝑏±√𝑏2−4𝑎𝑐

2𝑎 e retorna as 2 raízes. Na linha 9 do código abaixo, no momento em que é feito o retorno, parece que a função está retornando 2 valores (raiz1 e raiz2). Na verdade, está retornando 1 valor só, uma tupla contendo os 2 elementos raiz1 e raiz2.

Outras características da linguagem que podemos observar nesse código da função de Bhaskara é o parâmetro c=0 como argumento da função na linha 4. O =0 significa que 0 (zero) é o valor default para o parâmetro c caso não seja passado nenhum valor.

Também é possível observar na linha 1 a importação da biblioteca matemática padrão do Python para, mais adiante nas linhas 6 e 7, poder utilizar a função sqrt e obter a raiz quadrada de delta.

Imprime (3,2), uma tupla com as 2 raízes da equação

(25)

Usando o pass

Python tem a palavra reservada pass que é usada quando você deseja “passar” a implementação de uma função.

Por exemplo, suponha que no meio do seu código você criou a assinatura da função minhaFuncao, mas não é o momento ainda de implementar o corpo dessa função. Para não dar erro de compilação, você pode colocar o pass. A função não vai fazer nada, mas não vai dar mais erro. É para implementação futura.

Classes

No tópico anterior, relativo a funções, vocês repararam que a função bhaskara estava “solta” no código?

Isso é possível em Python porque é suportado o paradigma procedural em que o código não possui classes e os métodos podem ficar desta forma, fora do contexto de uma classe.

Entretanto, Python também suporta o paradigma de programação orientada a objetos. Neste caso, as funções são métodos pertencentes a uma classe.

Pessoal, a tecnologia Python é extensa. O que vimos até agora são os principais conceitos e recursos da linguagem. Tem muito mais além disso. Para efeito do nosso objetivo, que é ser aprovado em concurso, o mais produtivo é partir para resolver questões. Então vamos lá!

Declaração da classe Cachorro

O atributo tipo é de classe, comum a todas as instâncias da classe Cachorro

Instanciação de 2 classes do tipo Cachorro

Definição do método construtor da classe __init__

A variável self é utilizada como convenção pelo Python para referenciar atributos de instância. Neste caso, o atributo nome é de instância.

Imprime “Canino” porque o valor de tipo é comum a todas as classes Imprime “Bob” porque o valor de nome é específico do objeto Imprime “Canino” porque o valor de tipo é comum a todas as classes Imprime “Rex” porque o valor de nome é específico do objeto

(26)

Questões comentadas pelo professor

1. (CESPE - 2021 - Polícia Federal)

O código Python a seguir apresenta como resultado "True".

RESOLUÇÃO:

Esta foi uma questão polêmica, então vamos acompanhar o raciocínio antes do gabarito, OK?

Vejamos o código linha a linha:

X = bool(-3) -> nesta linha, X receberá TRUE, uma vez que bool com qualquer número que não seja ZERO retorna TRUE;

Y = bool(“True”*x) -> esta linha faz Y receber TRUE, uma vez que uma string de texto válida multiplicada pelo parâmetro TRUE (que é X), também retorna TRUE;

Z = bool(“FALSE”) -> aqui tem uma pegadinha! Pois se fosse bool(FALSE), Z receberia FALSE. No entanto, como o conteúdo é bool(“FALSE”), repare nas aspas, qualquer string não nula como parâmetro fará Z assumir o valor TRUE.

Por fim, print(x AND y and Z) vai imprimir o resultado da operação LÓGICA TRUE and TRUE and TRUE.

Logo, a impressão imprime TRUE, e a questão estaria certa, né? Quase....

O gabarito preliminar era CORRETO. Mas tem um problema...

“TRUE” entre aspas, como o enunciado da questão, é diferente de TRUE sem aspas, né?

O examinador se enrolou na própria pegadinha, e, após os recursos, o gabarito passou a ser ERRADO.

Resposta: Errado

2. (IF-MT - 2018 - IF-MT - Informática)

Sobre a linguagem Python, é INCORRETO afirmar que:

(a) Suporta os paradigmas: imperativo, orientado a objetos e funcional.

(b) Utiliza indentação para delimitar início e fim de blocos.

(c) A linguagem Python é distribuída sob licença que proíbe sua incorporação em produtos proprietários.

(d) Python é uma linguagem de tipagem dinâmica e forte.

(e) Python é um software de código aberto.

RESOLUÇÃO:

(27)

(a) Suporta os paradigmas: imperativo, orientado a objetos e funcional.

Lembrando o nosso mnemônico FIPO: funcional, imperativo, procedural e orientado a objeto. A alternativa mencionou só os paradigmas imperativo, orientado a objetos e funcional, mas está correta.

Quem pode mais, pode menos.

(b) Utiliza indentação para delimitar início e fim de blocos.

Correto. Não temos delimitadores de blocos em Python. Basta indentar corretamente.

(c) A linguagem Python é distribuída sob licença que proíbe sua incorporação em produtos proprietários.

Errado! A licença do Python permite que seja incorporada em um produto proprietário.

(d) Python é uma linguagem de tipagem dinâmica e forte.

Correto. Vimos isso no exemplo do cálculo do IMC no início da parte teórica desta aula.

(e) Python é um software de código aberto.

Correto. Python é licenciado segundo a Python Software Foundation License (PSFL), um tipo de licença de código aberto.

Resposta: C

3. (FCC - 2018 - MPE-PE - Analista Ministerial - Informática) Considere o fragmento de código Python abaixo.

Para que o código seja compilado e executado corretamente, a lacuna I deverá ser preenchida com (a) __init__(self, nome, renda):

(b) function __init(self, nome, renda):

(c) def __construct(self, nome, renda):

(d) def __init__(self, nome, renda):

(e) Cliente(self, nome, renda):

RESOLUÇÃO:

O self é utilizado para referenciar atributos de instância da classe. Portanto, os atributos nome e renda da classe Cliente são específicos do objeto instanciado. As atribuições que são feitas no bloco de construção destacadas são típicas de um construtor. Em Python, para definir corretamente o método construtor usa-se a sintaxe def __init__(self,<atributos de instância>):.

(28)

No nosso caso concreto, o construtor seria def __init__(self,nome,renda):. É o que se encaixa corretamente na lacuna I.

Resposta: D

4. (IF-MT - 2018 - IF-MT - Informática)

Considere o seguinte fragmento de código fonte, escrito em linguagem python:

a = 3 b = a * 2 a, b = b, a

Após a execução de todos os comandos, qual é o resultado apresentado pelo comando abaixo?

print(a) (a) 3 (b) 6 (c) 36 (d) 63 (e) a RESOLUÇÃO:

Na 1ª linha, a = 3 Na 2ª linha, b = 6

Na 3ª linha (a,b) = (b,a) = (6,3)

Na 3ª linha, é feita uma atribuição dupla em que a recebe b e b recebe a.

Assim, o print(a) irá imprimir 6.

Resposta: B

5. (CESPE - 2018 - Polícia Federal - Agente de Polícia Federal) Considere o programa a seguir, na linguagem Python.

Bloco de comandos de construção

(29)

A sintaxe do programa está correta e, quando executado, ele apresentará o seguinte resultado.

PF

RESOLUÇÃO:

A sintaxe do programa está incorreta, o operador == significa um teste de comparação “igual a”. Para atribuir a lista [“P”, “F”] à variável letras deveria ser usado o operador =.

Resposta: Errado

6. (CESPE - 2018 - Polícia Federal - Perito Criminal Federal - Conhecimentos Básicos - Todas as Áreas) Considere os seguintes comandos na programação em Python.

Esses comandos, quando executados, apresentarão o resultado a seguir.

RESOLUÇÃO:

A função strip elimina os espaços no início e fim do string. Fazer a.strip() daria como saída o string “Hello, World!”.

É muito importante você gravar que, em Python, o string é imutável. Se, após fazer o strip, você chamar a[0] o string a é o string original da linha 1, antes do strip. Portanto a[0] retornará o 1º caractere do a que é um espaço a[0] = ‘ ‘. E a(1) = ‘H’.

Resposta: Errado

(30)

7. (CESPE - 2018 - Polícia Federal - Agente de Polícia Federal) Considere o programa a seguir, na linguagem Python.

A sintaxe do programa está correta e, quando executado, ele apresentará o seguinte resultado.

RESOLUÇÃO:

Tem 2 erros de sintaxe neste programa.

O if em Python, após o teste condicional 5 > 2, deveria vir : (dois pontos).

Não se usam as chaves para delimitar bloco de comandos em Python. Basta indentar. Esse é o outro erro de sintaxe.

Resposta: Errado

8. (FGV - 2018 - AL-RO - Analista Legislativo - Banco de Dados)

Considere a aplicação do algoritmo de busca binária sobre um conjunto de chaves distintas.

Assinale a declaração Python que define uma lista L sobre a qual esse algoritmo não pode ser aplicado diretamente.

(a) L=[0,1,2,3,5,8,13,21]

(b) L=[0]

(c) L=[“MARIA”, “MARINA”, “MARIO”]

(d) L=[-1,-2,-3,-4,-5]

(e) L=[“MARIA”, “MARIO”, “MARINA”]

RESOLUÇÃO:

Pessoal, vimos na aula de Lógica de Programação que, para o algoritmo de busca binária funcionar, a lista a ser buscada deve estar previamente ordenada.

As listas das alternativas (a) e (b) estão ordenadas na ordem numérica crescente. Correto.

A lista (c) está ordenada na ordem alfabética crescente. Correto.

A lista (d) está na ordem numérica decrescente. Correto.

A única que está desordenada é a alternativa (e).

Resposta: E

(31)

9. (FGV - 2018 - AL-RO - Analista Legislativo - Banco de Dados) Analise o código Python a seguir.

Assinale o que acontece com esse código quando o comando Run Module (F5) é acionado na interface IDLE (Python GUI).

(a) Os valores [1, 2, 3, 4, 5, 6] são exibidos.

(b) Os valores [1, 2, 2, 4, 8, 32] são exibidos.

(c) Os valores [1, 1, 2, 6, 24, 120] são exibidos (d) Um erro de compilação

(e) Um erro de execução RESOLUÇÃO:

Galerinha, lembrem-se que a função len(L) retorna o tamanho da lista L, que L[-1] referencia o último elemento da lista e que L.append(x) insere um novo elemento x no final da lista L.

No início, L = [1]. Logo, len(L) = 1.

Ele chega no while e faz o teste. len(L) < 6 ? Verdadeiro porque len(L) = 1.

Então entra na 1ª iteração do while.

Na 1ª iteração é feito L.append(L[-1]*len(L)) = L.append(1 * 1) = L.append(1) = [1, 1].

Na 2ª iteração é feito L.append(L[-1]*len(L)) = L.append(1 * 2) = L.append(2) = [1, 1, 2].

Na 3ª iteração é feito L.append(L[-1]*len(L)) = L.append(2 * 3) = L.append(6) = [1, 1, 2, 6].

Na 4ª iteração é feito L.append(L[-1]*len(L)) = L.append(6 * 4) = L.append(24) = [1, 1, 2, 6, 24].

Na 5ª iteração é feito L.append(L[-1]*len(L)) = L.append(24 * 5) = L.append(120) = [1, 1, 2, 6, 24, 120].

A 6ª iteração do while não ocorre porque a essa altura len(L) < 6 deixa de ser verdade pois len(L) = 6. E a nossa lista L mutável ao final será [1, 1, 2, 6, 24, 120].

Resposta: C

(32)

10. (COPEVE-UFAL - 2016 - UFAL - Analista de Tecnologia da Informação (Edital nº 30))

O trecho de código Python é uma função recursiva para o cálculo do fatorial de um número natural qualquer.

Entretanto, apresenta um erro de programação.

Em qual linha está o erro e como consertá-lo para que a função cumpra corretamente o seu propósito?

(a) o código deveria ser “if (n == 1):” na linha 2.

(b) o código deveria ser “return 0” na linha 3.

(c) o código deveria ser “if (n == 1) and (n == 0):” na linha 2.

(d) o código deveria ser “return Fatorial(n - 1) * n;” na linha 5.

(e) o código deveria ser “return Fatorial(n) * n -1;” na linha 5.

RESOLUÇÃO:

O trecho de código tenta programar o cálculo do fatorial.

Matematicamente, a definição de Fatorial(n) = n*(n-1)*(n-2)*...*2*1.

Programaticamente podemos usar recursividade para fazer esse cálculo Fatorial(n) = n*Fatorial(n-1). Letra D.

O trecho do enunciado está errado. Só funciona para n = 0, n = 1, n = 6 e n = 7. Para os demais valores de entrada, o cálculo sai errado.

Resposta: D

11.(IF-MT - 2018 - IF-MT - Informática)

Considere o seguinte fragmento de código fonte escrito na linguagem python:

Após a execução de todos esses códigos, qual é o valor a ser mostrado mediante o comando abaixo?

(a) 0 (b) 1 (c) 3 (d) 6 (e) 9

(33)

RESOLUÇÃO:

A função foo é bem simples. Ela triplica o valor do parâmetro que recebe.

O parâmetro b nas 3 chamadas foo(b) é passado por valor. Isso significa que ele será triplicado dentro do contexto da função. Fora, ele permanece com o valor original, que é 1. Portanto, ao fazer o print(b) no final é impresso 1.

Resposta: B

12. (FGV - 2018 - AL-RO - Analista Legislativo - Análise e Desenvolvimento de Sistemas) Assinale o código Python que cria um novo arquivo, contendo uma linha.

(a) (b)

(c) (d)

(e)

RESOLUÇÃO:

A forma correta de criar o arquivo é por meio da função open(“teste.txt”,”w”).

“teste.txt” é o nome do arquivo que será criado. O argumento “w” significa que o arquivo será aberto para escrita (writing). Se o arquivo “teste.txt” já existir no diretório corrente, ele será apagado e sobrescrito. Se não, será criado vazio pronto para escrita.

O f.write(“Linha de teste\n”) escreve 1 linha no arquivo com o texto “Linha de teste\n”. O “\n” no final significa pulo de linha.

Resposta: A

(34)

13.(FGV - 2018 - AL-RO - Analista Legislativo - Análise e Desenvolvimento de Sistemas) Analise o código Python a seguir.

O comando de execução desse código produz (a) erro de sintaxe.

(b) erro de execução.

(c) a exibição do número 12 somente.

(d) a exibição de dois números, 14 e 12, nessa ordem.

(e) a exibição de três números, 18, 12 e 10, nessa ordem.

RESOLUÇÃO:

Vamos analisar o código passo a passo.

O range do enunciado (linha 3) é bem atípico, talvez para levar o candidato desavisado a marcar as alternativas

“erro de sintaxe” ou “erro de execução”. A verdade é que esse range, apesar de estranho, é válido.

Lembre-se dos parâmetros do range.

Pelo range do nosso código do enunciado (linha 3 do código), start = -1. Como vimos anteriormente, Python permite que uma lista seja referenciada com índices negativos. O 1º índice de uma lista é sempre 0 (zero) e start = -1 significa que o índice anda uma casa à esquerda indo parar do outro lado da lista, na última posição. Portanto nosso range começa na última posição de L1.

O incremento = -1 significa que a lista será percorrida de trás para a frente, decrementando o índice.

Já o stop é igual a -len(L1). Como len(L1) é o comprimento da lista L1, -len(L1) = -7. Logo, stop = -7. Isso significa que o stop do nosso range é na casa imediatamente antes do índice -7, que é o -6. Lembre-se que o stop é não- inclusive!

Declaração e inicialização de 2 listas: L1 e L2

Bloco de repetição do for

Laço de repetição for no intervalo definido por range(-1, -len(L1), -1)

Lembrando a ordem dos parâmetros do range: range(start, stop, incremento) Logo, start = -1

stop = -len(L1) = - tamanho da lista L1 = -7 incremento = -1

(35)

Resumindo nosso range, ele percorre a lista L1 iniciando na última posição (start = -1), anda da direita para a esquerda de 1 em 1 (incremento = -1) até parar no índice -6 (stop = -7).

Desta forma, o range vai percorrer os seguintes índices: [-1, -2, -3, -4, -5, -6]

Na linha 4 do código, é feita uma referência a L2[-5:-2]. Isso também é um range. Ele está selecionando uma subparte da lista L2 entre os índices -5 (inclusive) e -2 (exclusive). Assim L2[-5:-2] = [10,12,14].

Entendido como os ranges de L1 e L2 irão funcionar, vamos executar o laço for passo a passo com a variável de controle k.

k if L1[k] in L2[-5:-2] : print(L1[k]) -1 [20] in [10,12,14] ? FALSO Não faz nada -2 [18] in [10,12,14] ? FALSO Não faz nada -3 [15] in [10,12,14] ? FALSO Não faz nada -4 [14] in [10,12,14] ? VERDADEIRO print(14) -5 [13] in [10,12,14] ? FALSO Não faz nada -6 [12] in [10,12,14] ? VERDADEIRO print(12)

Portanto, seria impresso o 14 e o 12, nessa ordem. O gabarito oficial da questão é esse, letra D.

Obs.: Essa questão caiu em 2018, mas parece que o avaliador ainda está na versão antiga do Python. No Python 2, podíamos fazer a chamada print L1[k] que funcionava normalmente. No Python atual (versão 3) isso dá um erro de sintaxe. No Python 3, print é uma função. A forma correta de chamar o print atualmente é print(L1[k]).

Resposta: D

(36)

14. (FGV - 2018 - AL-RO - Analista Legislativo - Infraestrutura de Redes e Comunicação)

A execução do código Python a seguir termina com sucesso, mostrando a lista de números dispostos em ordem crescente corretamente.

Assinale a opção que indica o valor exibido pelo primeiro comando print (a) 0

(b) 1 (c) 8 (d) 16 (e) 64 RESOLUÇÃO:

Galera, já vimos o funcionamento do algoritmo Bubble Sort anteriormente na aula de Lógica de Programação. O objetivo desse algoritmo é ordenar uma sequência de números desordenada. O código do enunciado implementa esse algoritmo corretamente em linguagem Python.

Mas para matar a questão, temos que nos atentar aos detalhes.

Definição da função de ordenação.

Argumento de entrada da função de ordenação é a lista a ser ordenada chamada de numeros

Muita calma nessa hora. O retorno da função de ordenação é o valor da variável de nome trocas, que não representa o número de trocas realizado na lista.

Lista desordenada.

Imprime o retorno de bubbleSort que é o valor de trocas Incremento da variável trocas

(37)

A função bubbleSort ordena corretamente a lista numeros recebido como argumento. O problema é a variável trocas. Apesar do nome, ela não reflete o número efetivo de trocas realizado pelo Bubble Sort. Se fosse o número de trocas do Bubble Sort seria 1, somente a troca do 94 pelo 93 para a lista numeros ficar ordenada.

Pelo código que está escrito, a variável trocas ao final da execução armazenará um outro valor. Vamos lá, passo a passo.

No início, trocou = True, então ele entra a 1ª vez no while.

O range do for é [0, 1, 2, 3, 4, 5, 6, 7]. Como o incremento do trocas ocorre dentro desse for, trocas será incrementado 8 vezes ficando trocas = 8 após as 8 repetições do 1º for. O if dá verdadeiro 1 vez somente, quando chega no 94 que é menor que o elemento subsequente 93. É realizada a troca de 94 por 93 e a variável trocou é modificada para True.

Como trocou = True, entra a 2ª vez no while. Nesta passagem, o range do for é o mesmo que na passagem anterior. Então a variável trocas será incrementada 8 vezes de novo. Como o valor anterior de trocas era 8, após os 8 novos incrementos vai a 16. Após isso, não ocorre mais troca, trocou = False e a função é finalizada.

Portanto, a função bubbleSort retornará o valor final de trocas = 16.

Resposta: D

15. (Quadrix - 2019 - CRA-PR - Analista Sistema I)

Julgue o item quanto à programação orientada a objetos e à linguagem de programação Python.

Um recurso bastante útil da Python consiste no tratamento posicional das strings. Elas são consideradas como sequências mutáveis e podem ter sua ordem (sequência) alterada da esquerda para a direita ou vice‐versa, dependendo da função do programa.

RESOLUÇÃO:

A 1ª frase está correta: “Um recurso bastante útil da Python consiste no tratamento posicional das strings.”.

O erro está na 2ª frase quando o avaliador diz que as strings são consideradas como sequências mutáveis. Isso não é verdade. As strings são imutáveis. Ao fazer qualquer manipulação em uma string, o Python copia e cria um novo objeto string com o resultado da manipulação e a string original permanece imutável.

Resposta: Errado

16. (PUC-PR - 2017 - TJ-MS - Técnico de Nível Superior - Analista de Infraestrutura de Rede) Dentre as seguintes funções, a que serve para converter um caractere único no seu respectivo valor inteiro em Python é

(a) unichr (x) (b) hex (x) (c) ord (x) (d) oct (x) (e) chr (x)

(38)

RESOLUÇÃO:

(a) unichr (x)

Esta função converte o código inteiro no caractere Unicode correspondente. Exemplo: unichr(99) = ‘c’

(b) hex (x)

hex(x) converte o inteiro x no seu correspondente em representação hexadecimal. Ex.: hex(200) = 0xc8 (c) ord (x)

ord(x) o inverso do unichr(x). Dado um caractere x, o ord(x) converte-o para seu código inteiro Unicode correspondente. Ex.: ord(‘c’) = 99. É a alternativa correta.

(d) oct (x)

Converte um número inteiro no seu correspondente em representação octal. Ex.: oct(12) = 0o14.

(e) chr (x)

Converte o código inteiro no caractere correspondente. Ex.: chr(99) = ‘c’. É muito parecida com a função unichr(x). A única diferente é que unichr faz a conversão para todos os caracteres Unicode, que é uma lista bem mais ampla que os caracteres normais. Inclui também caracteres especiais.

Resposta: C

17. (FUNCERN - 2017 - IF-RN - Professor - Sistemas de Informação)

Em relação às estruturas de controles da linguagem de programação Python, a palavra (a) pass tem o mesmo efeito que a palavra continue do C++.

(b) elif vem acompanhada de parênteses e dois pontos.

(c) null representa o tipo para objetos nulos.

(d) else pode ser usada opcionalmente junto ao laço while ou for.

RESOLUÇÃO:

(a) pass tem o mesmo efeito que a palavra continue do C++.

Vimos na parte teórica desta aula que o pass é uma palavra reservada em Python que serve para quando você define a assinatura de uma função, mas não deseja implementar o seu corpo, quer deixá-la vazia por enquanto. Não tem nada a ver com o continue. O continue no C++ tem a mesma função que o continue do Python. No meio de um laço, ele pula para a próxima iteração ignorando as instruções subsequentes dentro do bloco de repetição. Alternativa errada.

(b) elif vem acompanhada de parênteses e dois pontos.

Errado. Vimos que o elif é uma estrutura de seleção equivalente a um else-if.

(c) null representa o tipo para objetos nulos.

Errado. Em Python usa-se o None para representar objetos nulos.

(39)

(d) else pode ser usada opcionalmente junto ao laço while ou for.

Correto. Na seção de Estruturas de Repetição desta aula estudamos o for-else e o while-else. O else ao final do laço introduz um bloco de instruções a ser executado 1 vez obrigatoriamente após o laço.

Resposta: D

18. (FUNCERN - 2017 - IF-RN - Professor - Sistemas de Informação) Observe os seguintes comandos em Python:

Ao término da execução da última linha, o programa deverá imprimir (a) [2, 9, 1, 0]

(b) [2, 9, 0, 5]

(c) [2, 0, 1, 5]

(d) [0, 9, 1, 5]

RESOLUÇÃO:

Pessoal, esta questão aborda uma característica bem peculiar do Python que é a atribuição múltipla.

Na linha 1 deste código ele cria a lista x = [2, 9, 1, 5]

E nas linhas 2 e 3 ele atribui i = 1 e j = 2.

Até aí tudo bem. Foram 3 atribuições simples.

Na linha 4 tem a peculiaridade. É feita uma atribuição dupla. Observe como você deve interpretar o comando de dupla atribuição da linha 4 do código:

A variável i está à esquerda da vírgula e recebe a atribuição do valor correspondente à esquerda da virgula após o igual (=).

i = j * 2 – x[j] ** 2

= 2 * 2 – x[2] ** 2

= 4 – 1 ** 2 = 4 – 1

= 3

Portanto, i = 3. Isso é importante!

(40)

Na segunda atribuição x[i] = 0, o i já vale 3. Logo, a atribuição que é feita é x[3] = 0.

Resumindo, nossa lista inicial x manteve os valores de x[0] = 2, x[1] = 9 e x[2] = 1. Só o x[3] que mudou para 0.

Assim, nossa lista x ao final será x = [2, 9, 1, 0].

Resposta: A

19. (FGV - 2015 - PGE-RO - Técnico da Procuradoria - Tecnologia da Informação) Na linguagem Python 2.7, os comandos

L=range(0,12) print L

produzem:

(a) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

(b) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

(c) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

(d) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12]

(e) uma mensagem de erro RESOLUÇÃO:

Já perceberam que o range cai MUITO em questão de concurso. O segredo para acertar todas essas questões é entender como o range funciona. Os parâmetros do range são os seguintes.

O start e o step são opcionais. Quando é colocado no enunciado range(0,12) é porque o 1º parâmetro step = 0, o 2º parâmetro stop = 12 e o 3º parâmetro step foi ignorado. Se ele é ignorado, vale seu valor default que é +1. Então step = 1.

Com esses parâmetros, nosso range começa em 0 e vai incrementando de 1 em 1 até chegar no 12 (exclusive), ou seja, no inteiro imediatamente antes do 12 que é o 11.

Nosso range então é a sequência [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].

Resposta: B

20. (FGV - 2015 - PGE-RO - Analista da Procuradoria - Analista de Sistemas (Desenvolvimento)) Analise a linha de código Python 2.7 mostrada a seguir.

X= [ ]

O comando compatível com as características e a instância da variável X é:

(a) X = X + 2 (b) X = X (1) (c) X = X + [2]

(d) X = X +"A"

Referências

Documentos relacionados

“Sim, umas árvores de casca e tronco finos, eucaliptos como você, aos montes, centenas, não, milhares, talvez milhões, tudo igual, mas forçados por HOMO SAPIENS

Convido a comunidade jurídica a refletir sobre a possibilidade, descartada no passado, mas que poderia ser de grande valia nesse momento peculiar de pande- mia: a inclusão

Ora, evidentemente isto demanda trabalho, de modo que seja preciso, para apreender a essência de algo, proceder a uma variação eidética que é,

“Considero bem importante esse serviço prestado pela cooperativa e sempre busco orientação antes de realizar um negócio, escolher a melhor aplicação, fazer empréstimos

Porém, Aristóteles não pode exigir que o adversário diga que algo é ou que algo não é (e não ambos), ou seja, que ele forneça uma proposição, pois nesse caso, o adversário

Muitas vezes é útil impor-se, para manipulação de uma certa estrutura de dados, restrições quanto à visibilidade de seus componentes ou quanto à ordem que deve ser

Esta combina o canto interno da pálpebra superior sobrancelhas caídas, agora não pode ser apenas sonolência ou tédio, mas o início da tristeza... Agora os cantos levantados

Para verificar a forma como os dicionários registam mudanças de significado e para acompanhar esses processos de mudança, selecionámos quatro adjetivos: dois em que