Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

Linguagem de Programação 
Introdução à linguagem Python
Python é uma linguagem de programação orientada a objetos. Sua essência foi criada para ter comandos e estruturas simples, de fácil leitura e compreensão. A seguir, conheça as principais características dessa linguagem.
Python uma poderosa linguagem de programação orientada a objetos
Por que usar Python?
• Utiliza sintaxe limpa que facilita a leitura dos programas que você escreve.
• Linguagem de fácil utilização. Ideal para o desenvolver protótipos e outras tarefas de programação.
• Possui uma biblioteca padrão que suporta várias tarefas de programação.
• Sua linguagem é do tipo interpretada, o código não precisa ser convertido em linguagem de máquina.
• Permite atribuição múltipla atribuindo valores a mais de uma variável em uma única instrução.
Onde eu escrevo os códigos em Python e vejo os resultados?
Para obter os resultados de um código precisamos ter um interpretador Python. A implementação de códigos em Python, pode ser feita tanto em ferramentas instaladas no seu computador, quanto em ambientes em nuvem.
Através da página oficial da linguagem temos várias opções de interpretador Python puro (sem bibliotecas de terceiros). Ao baixar e instalar o interpretador você já pode programar através do modo interativo.
Atenção: Este modo e recomendado para testes rápidos uma vez que no modo interativo ao fechar o prompt, todo o código é perdido.
Como implementar soluções utilizando o Python?
Para implementação de soluções utilizamos IDE (Integrated Development Environment). As principais IDE´s são: PyCharm e o Visual Studio Code (VSCode).
Projeto Python Anaconda Consiste na união de diversas ferramentas Python, compostas por bibliotecas e IDE’s. O destaque do projeto Python Anaconda são as duas interfaces de desenvolvimento, a IDE spyder e o projeto Jupyter.
• IDE spyder: é um ambiente de desenvolvimento com várias funcionalidades integradas.
• Projeto Jupyter: O Jupyter Notebook é um ambiente de computação interativa, que permite aos usuários criar documentos de notebook que incluem: código ativo, gráficos, texto narrativo equações, imagens e Vídeo.
Google Colaboratory (Colab)
Outra forma de escrever e executar código Python é através do Colaboratory ou "Colab". 
Baseado no projeto de código aberto Jupyter, você escreve e executa os códigos através do navegador. É especialmente adequado para aprendizado de máquina, análise de dados e educação.
Variáveis e tipos básicos de dados em Python
A construção de um algoritmo envolve entrada, processamento e saída. Para que o processamento ocorra, é necessário um meio de armazenar valores temporariamente, razão pela qual surge o conceito de variáveis. Uma variável é um espaço alocado na memória RAM.
Muitas linguagens de programação possuem variáveis com tipo primitivo, como int, ou string – em Python esses tipos primitivos não existem. 
Na linguagem Python, o tipo de variável é identificado no momento que se atribui um valor a ela. Portanto, uma variável refere-se a um valor.
Na verdade, em Python não há a necessidade de definir estaticamente o tipo de variável, como em outras linguagens de programação.
Banin (2018) explica que “O modelo de dados do Python (Python Data Model, em inglês) adota como paradigma que todo dado em um programa escrito com Python é representado por um objeto”.
Todo objeto Python tem três aspectos:
· Um identificador.
· Um tipo.
· Um conteúdo.
Os códigos a seguir exibem o resultado para três objetos: int, str e float (tipos de variáveis), sem declaração do tipo.
print(‘olá’)
# string
print(10)
# inteiro
print(3.141592)
# float
Exemplos
Exemplos de códigos que atribuem valores à variável.
>>> valor = 10
>>> type(valor) 
<class 'int'>
>>> valor = 'nome'
>>> type(valor)  
<class ‘str>
>>> valor = 10.5
>>> type(valor)  
<class ‘float’>>
Em outras linguagens de programação, tais objetos seriam variáveis primitivas. Por serem objetos, tais tipos possuem métodos e comportamentos que outras linguagens não suportam – por exemplo, multiplicar uma string por um valor inteiro.
Operadores numéricos
Como já destacamos, todo objeto em Python possui um identificador (o nome), um tipo e o conteúdo. Diferentes tipos de objetos vão suportar diferentes operações. Cada uma destas deve ser escolhida de acordo com o problema a ser resolvido.
Os tipos numéricos, naturalmente, suportam operações matemáticas entre si, devendo ser respeitada a ordem de precedência dos operadores:
1 Primeiro resolvem-se os parênteses, do mais interno para o mais externo.
2 Exponenciação.
3 Multiplicação e divisão.
2 Soma e subtração.
Exemplos de operações matemáticas
Se a ordem de precedência não for respeitada, o resultado pode ser equivocado, conforme apresenta a ilustração seguinte.
Estruturas Condicionais de repetição e lógicas em Python
Em geral, em um programa você tem opções de caminhos ou lista de comandos que nada mais são que trechos de códigos que podem ser executados, devendo-se tomar decisões sobre qual trecho de código será executado em um determinado momento. Em Python estruturas são bem definidas, como podemos observar a seguir.
Python
Estruturas condicionais de repetição e lógica
Estruturas condicionais em Python
Em Python o comando para as estruturas condicionais é dado por if, else, elif.
if.. (se) – Estrutura de condição que avalia uma expressão executando caso essa seja verdadeira.
if .....:
 print (....)
else (senão) – Instrução dependente que completa a estrutura if executada quando expressão não ser satisfatória (falsa).
else .....:
 print (....)
elif – Abreviação do else if executa expressões intermediárias.
elif .....:
 print (....)
Estruturas de repetição em Python: while e for
Essas estruturas são criadas para a necessidade de se executar várias vezes o mesmo 
trecho de código.
while (enquanto) – Permite que um conjunto de instruções seja executada enquanto 
uma condição for verdadeira.
while .....:
 print (....)
for – Executa uma instrução por uma certa quantidade de vezes.
for .....:
 print (....)
Estruturas lógicas em python: and, or, not
Em Python utilizamos operadores booleanos para construir estruturas de decisões mais complexas.
and – Retorna verdadeiro quando ambos A E B forem verdadeiros
A B A AND B
FALSE FALSE FALSE
FALSE TRUE FALSE
TRUE FALSE FALSE
TRUE TRUE TRUE
A = False
B = TRUE
print("Resultado de 'A and B': ", A and B) #Retorna FALSE
or – Retorna verdadeiro (TRUE), se A ou B ou ambos forem verdadeiros (TRUE).
A B A OR B
FALSE FALSE FALSE
FALSE TRUE TRUE
TRUE FALSE TRUE
TRUE TRUE TRUE
A = False
B = TRUE
print("Resultado de 'A OR B': ", A OR B) #retorna TRUE
not – Retorna verdadeiro (TRUE) se A for falso. Ou retorna falso, quando A for 
verdadeiro.
A = False
print("Resultado de 'A: ", NOT A) #retorna TRUE
Estruturas condicionais em Python: if, elif, else
Uma estrutura condicional verifica a condição dos argumentos passados e executa um comando caso a condição seja verdadeira. Para a construção de estruturas condicionais em Python são utilizados os comandos:
Por padrão, o bloco de instrução que estiver abaixo da instrução if será executado quando a expressão contida na estrutura if  for verdadeira.
Instrução complementar da estrutura if, deve ser executada quando a expressão definida for igual a falso.
Trata-se de uma abreviação do else if usado para fazer as condições intermediárias.
Além dos comandos, o bloco condicional é marcado pelos dois-pontos ao final da condição e pela identação do bloco de comandos a ser executado caso a condição seja verdadeira.
Exemplos
Sintaxe estrutura condicional:
No exemplo observamos que o interpretador Python identifica a relação de subordinação entre estruturas condicionais e blocos de comando pelo recuo que há na digitação das linhas do programa.
· Na linha 1 temos a condição inicial.
· Na linha 2 um exemplo de linhas subordinadas estão digitadas com alguns espaços em branco à esquerda. Isso recebe o nome de identação.
· Na linha 3, temos o primeiro elif, que está no mesmo nível de identação do if, pois um não está subordinadoa outro. O mesmo acontece para o elif da linha 5 e o else da linha 7.
Saiba mais
Em Python, a endentação é obrigatória sempre que houver um ou mais comandos subordinados a outro.
“Generalizando, em Python, todo conjunto de comandos subordinados deve estar identado em relação ao seu comando proprietário. Isso vale para if-else, while, for, try, def e qualquer outro em que exista a relação de subordinação” (BANIN, 2018, p. 51).
Praticando
Imagine que você deseja acessar pela primeira vez algum sistema protegido por senha. Nesse exercício vamos implementar um simples verificador de senha do usuário e para isso utilizaremos as estruturas condicionais para permitir o login de um usuário. Vamos aplicar apenas as estruturas if-else.
Observe a sintaxe para esse comando:
	
	login = input("Digite o seu login:")
	
	senha = input("Digite sua senha: ")
	
	if login == "userpy" and senha == "teste123":
	
	    print("Bem-vindo userpy01")
	
	else:
	
	    print("Login falhou, verifique sua senha e tente novamente")
Nas linhas 1 e 2, input é a função que requisita os dados de login e senha do usuário. A estrutura condicional if-else, linhas 3 e 4, determinam se a condição será satisfeita e qual linha será executada. Na linha 3, é testado se o login e a senha do usuário são iguais a "userpy" and senha == "teste123“.
Agora que você já entendeu como é comportamento da sintaxe utilize o emulador para testar o código.
		1
	login = input("Digite o seu login:")
	2
	senha = input("Digite sua senha: ")
	3
	if login == "userpy" and senha == "teste123":
	4
	    print("Bem-vindo userpy01")
	5
	else:
	6
	    print("Login falhou, verifique sua senha e tente novamente")
	
E se tivermos vários usuários python (userpy) para realizar a verificação da senha, como seria? Podemos utilizar a estrutura elif, para checar múltiplas condições e executar determinadas linhas de código.
Observe o código para verificação de senha de 4 usuários cadastrados no sistema:
	
	login = input("Digite o seu login:")
	
	senha = input("Digite sua senha: ")
	
	if login == "userpy01" and senha == "teste01":
	
	    print("Bem-vindo userpy01")
	
	elif login == "userpy02" and senha == "teste02":
	
	    print("Bem-vindo userpy02")
	
	elif login == "userpy03" and senha == "teste03":
	
	    print("Bem-vindo userpy03")
	
	elif login == "userpy04" and senha == "teste04":
	
	    print("Bem-vindo userpy04")
	
	else:
	
	    print("Login falhou!")
	
	
As linhas 5, 7 e 9 utilizamos a estrutura elif para verificar outras senhas de usuário. Na linha 11, temos a estrutura else, que só será acionada se a entrada das linhas 1 e 2 for diferente dos logins e senhas permitidos. 
Para testar esse código utilize o emulador.
	1
	login = input("Digite o seu login:")
	2
	senha = input("Digite sua senha: ")
	3
	if login == "userpy01" and senha == "teste01":
	4
	    print("Bem-vindo userpy01")
	5
	elif login == "userpy02" and senha == "teste02":
	6
	    print("Bem-vindo userpy02")
	7
	elif login == "userpy03" and senha == "teste03":
	8
	    print("Bem-vindo userpy03")
	9
	elif login == "userpy04" and senha == "teste04":
	10
	    print("Bem-vindo userpy04")
	11
	else:
	12
	    print("Login falhou!")
Estruturas de repetição
O comando for em Python
A instrução for em Python faz uma iteração sobre os itens de qualquer sequência – por exemplo, iterar sobre os caracteres de uma palavra, já que esta é um tipo de sequência.
O bloco de comandos a ser executado deve ser identado em razão da relação e da subordinação.
A sintaxe do comando envolve:
A palavra reservada “for” seguido de uma variável de controle; 
A palavra reservada “in”;
E uma sequência acompanhada por dois-pontos.
Exemplos
Sintaxe do comando for :
O comando while em Python
O comando while deve ser utilizado para construir e controlar a estrutura decisão, sempre que o número de repetições não seja conhecido. Por exemplo, quando queremos solicitar e testar se o número digitado pelo usuário é par ou ímpar. Quando ele digitar zero, o programa se encerra. Veja, não sabemos quando o usuário irá digitar, portanto somente o while é capaz de solucionar esse problema.
Pesquise mais
A construção de uma sequência numérica pode ser feita com o comando range(). Ao consultar a documentação oficial, encontramos range() na lista de funções built-in em Python (2020a ) . Veja o exemplo seguinte:
>>> list(range(10)) #Gera uma sequência de 0 à 9.
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1)11) #Gera uma sequência de 1 à 11.
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(range(0,30,5)) #Gera uma sequência de 0 à 30 com step = 5.
[0, 5, 10, 15, 20, 25]
>>> list(range(0,-10,-1)) #Gera uma sequência numérica negativa.
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> list(range(0)) )) #Gera uma lista vazia.
[]
Banin (2018), traz uma elucidação importante sobre o tipo range, apresentando-o como uma expressão, e não como uma função. Leia, para aprender mais sobre esse importante recurso, a seção 4.4 da obra: BANIN, S. L. Python 3 - conceitos e aplicações: uma abordagem didática. São Paulo: Érica, 2018.
Em Python, quando a mesma instrução precisa ser executada várias vezes seguidas podemos utilizar loop. Esse comando permite executar um bloco de código repetidas vezes, até que uma dada condição seja atendida. 
Praticando
Agora iremos colocar em prática a codificação do loop por meio dos comandos for e while.
O loop for é muito utilizado em conjunto com o range, o loop facilita a iteração dos valores sem a necessidade de escrever código para alterar esse valor, dificultando a ocorrência de um loop infinito. Observe a sintaxe do exemplo que a contagem inicia em 1 e para em 10.
	
	contagem = 0
	
	for contagem in range(1,10):
	
	print(contagem)
Python 3.6
	
	1
	contagem = 0
	
	2
	for contagem in range(1,10):
	
	3
	         print(contagem)
A estrutura de repetição while executa um conjunto de instruções enquanto uma condição for verdadeira. O loop é interrompido quando a condição passa a ser falsa. 
Observe o exemplo a seguir, o loop while continuará executando as duas linhas de código enquanto a contagem for menor que 10, no momento em que atingir 10, a execução é finalizada.
	
	contagem = 0
	
	while(contagem < 10):
	
	print(contagem)
	
	contagem = contagem + 1
	
	
Python 3.6
	
	1
	contagem = 0
	
	2
	while(contagem<10):
	
	3
	         print(contagem)
	
	4
	         contagem = contagem + 1
Estruturas lógicas em python: and, or, not
Em Python utilizamos operadores booleanos para construir estruturas de decisões mais complexas. Nesses operadores o Verdadeiro é chamado de True (igual a 1) e o Falso é chamado False (igual a 0).
Faz a expressão lógica E. Dessa forma esse operador retorna um valor verdadeiro somente se as duas expressões forem verdadeiras.
Faz a expressão lógica OU. Dessa forma esse operador retorna um valor falso somente se as duas expressões forem falsas.
Faz a expressão lógica NOT. Esse operador muda o valor de seu argumento, ou seja, se o argumento for verdadeiro, a operação o transformará em falso e vice-versa.
Os tipos de estruturas aqui apresentados, condicionais e de repetição, representam uma parte fundamental da linguagem de programação em Python, sendo assim, é muito importante conhecer a sintaxe e o funcionamento dessas estruturas. 
Funções em Python
Uma função é uma forma de organização, usada para delimitar ou determinar quais tarefas podem ser realizadas por uma determinada divisão. Em linguagem de programação, uma função é uma sequência de instruções que processa um ou mais resultados que são chamados de parâmetros. Em Python temos as funções built-in e as funções definidas pelo usuário. 
Funções built-in em Python
Uma função built-in é um objeto que está integrado ao núcleo do interpretador Python. Ou seja, não precisa ser feita nenhuma instalação adicional, já está pronto para uso. 
O interpretador Python possui várias funções disponíveis, conforme podemos conservar na tabela de Funções built-in em Python.
Built-in em Python
	abs()
	delattr()
	hash()
	memoryview()set()
	all()
	dict()
	help()
	min()
	setattr()
	any()
	dir()
	hex()
	next()
	slice()
	ascii()
	divmod()
	id()
	object()
	sorted()
	bin()
	enumerate()
	input()
	oct()
	staticmethod()
	bool()
	eval()
	int()
	open()
	str()
	breakpoint()
	exec()
	isinstance()
	ord()
	sum()
	bytearray()
	filter()
	issubclass()
	pow()
	super()
	bytes()
	float()
	iter()
	print()
	tuple()
	callable()
	format()
	len()
	property()
	type()
	chr()
	frozenset()
	list()
	range()
	vars()
	classmethod()
	getattr()
	locals()
	repr()
	zip()
	compile()
	globals()
	map()
	reversed()
	__import__()
	complex()
	hasattr()
	max()
	round()
	
Veja a descrição de algumas dessas funções:
Usada para imprimir um valor na tela.
Usada para retornar a posição de um valor em uma sequência.
Usada para capturar um valor digitado no teclado.
Usadas para converter um valor no tipo inteiro ou float.
Usada para saber qual é o tipo de um objeto (variável).
Função definidas pelo usuário
Além das Funções built-in, muitas vezes as soluções exigem a implementação de funções específicas, as quais são chamadas de funções definidas pelo usuário. 
Funções, também conhecidas como subprogramas ou sub-rotinas, são pequenos blocos de código aos quais se dá um nome, desenvolvidos para resolver tarefas específicas. Tais funções constituem um elemento de fundamental importância na moderna programação de computadores, a ponto de ser possível afirmar que atualmente nenhum programa de computador é desenvolvido sem o uso desse recurso.
A sintaxe de uma função em Python é feita com:
· A palavra reservada def.
· O nome da função.
· Os parênteses que indicam se existem ou não parâmetros para a função.
· E o comando return (que é opcional);
A seguir, veja que existem três sintaxes diferentes:
1Uma função que não recebe e não retorna valores.
2Uma função que não recebe argumento, mas retorna valores.
3Uma função que recebe argumento e retorna valor.
Funções anônimas em Python
Expressões lambda (às vezes chamadas de formas lambda) são usadas para criar funções anônimas. Uma função anônima é uma função que não é construída com o "def " e que, por isso, não possui nome. Esse tipo de construção é útil quando a função faz somente uma ação e é usada uma única vez.
Listas, tuplas, set, dicionário em Python
Em Python, é permitido a utilização de vários tipos de estruturas de dados. As principais estruturas são as listas, tuplas, set e dicionário. Nesta webaula vamos conhecer cada uma delas.
Listas
Lista é uma estrutura de dados do tipo sequencial que possui como principal característica ser mutável. Ou seja, novos valores podem ser adicionados ou removidos da sequência. 
Na lista, os dados são posicionais e sequenciais, conforme a figura a seguir.
Listas
Observe que o primeiro valor ocupa a posição zero da lista, já o último ocupa a posição n – 1, em que n é a quantidade de elementos que a lista é capaz de armazenar.
Como criar uma lista em Python
Em Python, uma das maneiras de criar uma lista é colocando os valores entre colchetes, conforme código a seguir:
vogais = ['a', 'e', 'i', 'o', 'u']
A lista pode ser criada sem nenhum elemento, e a inserção pode ser feita posteriormente:
vogais = []
vogais.append('a')
vogais.append('e')
vogais.append('i')
vogais.append('o')
vogais.append('u')
Para acessar o valor guardado em uma lista, basta indicar o nome da variável e, entre colchetes, a posição do elemento, ou a fatia (slice) de valores que se deseja:
vogais[3]
vogais[3:]
List comprehension
Uma maneira muito elegante de criar uma lista é usando a list comprehension. Também chamada de listcomp, é uma forma pythônica de criar uma lista com uso de um objeto iterável.
Esse tipo de técnica é utilizado quando, dada uma sequência, deseja-se criar uma nova sequência, porém com as informações originais transformadas ou filtradas por um critério.
Sua sintaxe básica é:
[item for item in lista]
Os comandos for-in são obrigatórios. 
As variáveis item e lista dependem do nome dado no programa. Veja um exemplo de sintaxe utilizando a listcomp:
[2*x for x in range(10)]
Tuplas
As tuplas também são estruturas de dados do grupo de objetos do tipo sequência.
A grande diferença entre listas e tuplas é que, com as primeiras, uma vez que são mutáveis, conseguimos fazer atribuições a posições específicas (por exemplo, lista[2] = 'maça'), o que, nas segundas, não é possível, pois estas são objetos imutáveis.
Em Python, uma das maneiras de criar uma tupla é colocando os valores entre parênteses, conforme código a seguir:
vogais = ('a', 'e', 'i', 'o', 'u')
Ao contrário da lista, uma tupla não permite a inserção posterior de dados, mas os dados podem ser acessados pela sua posição na sequência.
Sets
Um objeto do tipo set habilita operações matemáticas de conjuntos, tais como: união, intersecção, diferença, etc. Esse tipo de estrutura pode ser usado em testes de associação e remoção de valores duplicados de uma sequência.
m Python, uma das maneiras de se criar um objeto do tipo set é colocando os valores entre chaves, conforme código a seguir:
vogais = {'a', 'e', 'i', 'o', 'u'}
Um set permite a inserção de valores posteriores à sua criação, com a função add(), mas não permite acessar valores pela sua posição.
Dicionários
As estruturas de dados que possuem um mapeamento entre uma chave e um valor são consideradas objetos do tipo mapping. Em Python, o objeto que possui essa propriedade é o dict (dicionário). Tal objeto é mutável, ou seja, com ele conseguimos atribuir um novo valor a uma chave já existente.
Em Python, uma das maneiras de criar um objeto do tipo dicionário é colocando as chaves e os valores entre estas, conforme código a seguir:
cadastro = {'nome': 'João', 'idade': 30, 'cidade': 'São Paulo'}
Para acessar um valor em um dicionário, basta digitar:
nome_dicionario[chave]
E, para atribuir um novo valor, use:
nome_dicionario[chave] = novo_valor
Dicionários são estruturas de dados não sequenciais que permitem o acesso a um valor por meio de uma chave. O tipo dicionário apresenta diversos métodos. 
Algoritmos de busca
Os algoritmos computacionais são desenvolvidos e usados para resolver os mais diversos problemas. Algoritmos de busca, nesse universo, como o nome sugere, resolvem problemas relacionados ao encontro de valores em uma estrutura de dados.
Diversas são as aplicações que utilizam esse mecanismo. 
Você já fez alguma pesquisa no Google hoje? Já utilizou seu app do banco? Já procurou alguém nas redes sociais?
Todas essas aplicações utilizam mecanismos de busca. Um grande diferencial entre uma ferramenta e outra é a velocidade da resposta: quanto mais rápido ela for, mais gostamos dela.
Por trás de qualquer tipo de pesquisa existe um algoritmo de busca implementado. 
Nesta Webaula vamos aprender sobre os algoritmos computacionais.
Busca linear ou sequencial
O algoritmo de busca sequencial, ou busca exaustiva, percorre os itens da sequência procurando o valor de destino, conforme ilustra a figura.
Busca sequencial
A busca começa por uma das extremidades da sequência e vai percorrendo-a até encontrar (ou não) o valor desejado. Com essa imagem fica claro que uma pesquisa linear examina todos os itens da sequência até encontrar o item de destino, o que pode ser muito custoso computacionalmente.
	Código
	Explicação
	def executar_busca_linear(lista, valor):
	Definição da função
	  tamanho_lista = len(lista)
	Definição do tamanho da lista
	  tamanho_lista = len(lista)
	Estrutura de repetição para percorrer toda a lista
	    if valor == lista[i]:
	Condição para verificar se é o valor.
	      return True
	Retorno, caso encontre o valor
	  return False
	Retorno, caso não encontre o valor
Algoritmos de busca sequencial
Para procurar elementos em uma lista por meio de algoritmo de busca sequencial, é necessário percorrer todos os elementos da lista até encontrar o elemento procurado. Para isso, é realizada uma comparação do valor do elemento que se deseja encontrar na lista com o valor de cada posição na lista.
saiba mais
Mesmo quando um dos elementos não estiver na lista, todoseles devem ser visitados. Os elementos da lista podem já estar dispostos em uma sequência ordenada, ou não. Para cada um dos casos, haverá um comportamento diferenciado em termos de tempo de execução do algoritmo.
No exemplo de algoritmo de busca sequencial que considera um vetor de entrada com números desordenados. Temos uma estrutura de repetição “while”.
	
	def busca_sequencial(lista, elemento):
	
	pos = 0 
	
	encontrado = False
	
	
	
	while pos < len(lista) and not encontrado:
	
	if lista[pos] == elemento:
	
	encontrado = True
	
	else:
	
	pos = pos+1
	
	
	
	return encontrado
	
	
	
	testelista = [2, 10, 8, 15, 18, 20, 12, 1]
	
	print(busca_sequencial(testelista, 5))
	
	print(busca_sequencial(testelista, 15))
Analisando a estrutura de busca sequencial
Linha 5 do código
A estrutura de repetição “while” permitirá percorrer a lista e comparar o elemento procurado com o elemento que está na posição da lista, nesse caso, enquanto a posição for menor que o tamanho da lista e o elemento não for encontrado.
Linha 6 do código
Na linha 6 do código, a estrutura condicional “if”, “else” traz a condição para encontrar ou não o elemento do vetor – no caso, se a posição da lista corresponde ao elemento procurado (valor), será exibido True (verdadeiro), se não corresponder, haverá um incremento e o próximo elemento será visitado na sequência da lista.
Linha 13 do código
Na linha 13 é mostrado um vetor com 8 elementos (0 a 7 elementos). E, na linha 14, é buscado o elemento 5 na lista. Como o elemento não está na lista, observe que todas posições serão percorridas, razão pela qual todos os elementos da lista serão visitados.
Linha 14 do código
Na linha 14, temos um teste em que se busca o elemento de valor 15. Nesse caso, quatro elementos da lista serão percorridos até que se encontre o valor 15.
Para testar o comportamento desse algoritmo de busca sequencial vamos acessar o código com o Python Tutor.
Python 3.6
	
	1
	def busca_sequencial(lista, elemento):
	
	2
	    pos = 0 
	
	3
	    encontrado = False
	
	4
	     
	
	5
	    while pos < len(lista) and not encontrado:
	
	6
	          if lista[pos] == elemento:
	
	7
	               encontrado = True
	
	8
	          else:
	
	9
	              pos = pos+1
	
	10
	  
	
	11
	    return encontrado
	
	12
	   
	
	13
	testelista = [2, 10, 8, 15, 18, 20, 13, 1]
	
	14
	print(busca_sequencial(testelista, 5))
	
	15
	print(busca_sequencial(testelista, 15))
Busca sequencial em um vetor ordenado
E, se a lista já estiver ordenada, como é realizada a busca do elemento procurado?
Muito bem já conhecemos como se processa uma busca sequencial que considera um vetor de entrada com números desordenados. Mas e, se a lista já estiver ordenada, como é realizada a busca do elemento procurado?
Observe a seguinte estrutura.
	
	def busca_sequencial_ordenada(lista, elemento):
	
	pos = 0
	
	encontrado = False
	
	para = False
	
	while pos < len(lista) and not encontrado and not para:
	
	if lista[pos] == elemento:
	
	encontrado = True
	
	else:
	
	if lista[pos] > elemento:
	
	para = True
	
	else: 
	
	pos = pos+1
	
	
	
	return encontrado
	
	
	
	testelista = [1, 2, 8, 10, 13, 15, 18, 20]
	
	print(busca_sequencial_ordenada(testelista, 5))
	
	print(busca_sequencial_ordenada(testelista, 15))
Para testar o comportamento desse algoritmo vamos acessar o código com o Python Tutor.
Python 3.6
	
	1
	def busca_sequencial_ordenada(lista, elemento):
	
	2
	 pos = 0
	
	3
	 encontrado = False
	
	4
	 para = False
	
	5
	 while pos < len(lista) and not encontrado and not para:
	
	6
	          if lista[pos] == elemento:
	
	7
	               encontrado = True
	
	8
	          else:
	
	9
	              if lista[pos] > elemento:
	
	10
	                  para = True
	
	11
	              else:  
	
	12
	                  pos = pos+1
	
	13
	  
	
	14
	 return encontrado
	
	15
	    
	
	16
	testelista = [1, 2, 8, 10, 13, 15, 18, 20]
	
	17
	print(busca_sequencial_ordenada(testelista, 5))
	
	18
	print(busca_sequencial_ordenada(tes
Algoritmo de busca binária
Outro algoritmo usado para buscar um valor em uma sequência é o de busca binária. 
A primeira grande diferença entre o algoritmo de busca linear e o algoritmo de busca binária é que neste os valores precisam estar ordenados. 
A lógica é a seguinte:
1. Encontra o item no meio da sequência.
2. Se o valor procurado for igual ao item do meio, a busca encerra.
3. Se não, verifica se o valor buscado é maior ou menor que o valor central.
4. Se for maior, então a busca acontecerá na metade superior da sequência (a inferior é descartada), se não for maior, a busca acontecerá na metade inferior da sequência (a superior é descartada).
5. Repete os passos: 1, 2, 3, 4.
Atenção: Veja que o algoritmo, ao encontrar o valor central de uma sequência, a divide em duas partes, o que justifica o nome de busca binária.
A figura seguinte ilustra o funcionamento do algoritmo, na busca pelo número 14 em uma certa sequência numérica.
Busca binária
Veja que o algoritmo começa encontrando o valor central, o qual chamamos de m1. Como o valor buscado não é o central, e é maior que o elemento do meio da lista, a busca, então, passa a acontecer na metade superior. Dado o novo conjunto, novamente é localizado o valor central, o qual chamamos de m2, que também é diferente e menor do valor buscado. Mais uma vez a metade superior é considerada e, ao localizar o valor central (m3), agora sim o valor procurado, então o algoritmo encerra.
O código que representa a figura apresentada será escrito da seguinte maneira:
	
	def busca_binaria(lista, elemento):
	
	minimo = 0 
	
	maximo = len(lista)-1
	
	encontrado = False
	
	
	
	while minimo < =maximo and not encontrado:
	
	meio_lista = (minimo + maximo)//2
	
	if lista[meio_lista] == elemento:
	
	encontrado = True
	
	else:
	
	if elemento < lista[meio_lista]:
	
	maximo = meio_lista-1
	
	else:
	
	minimo = meio_lista+1
	
	
	
	return encontrado
	
	
	
	testelista = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
	
	print(busca_binaria(testelista, 14)
Para testar o comportamento desse algoritmo de busca binária vamos acessar o código com o Python Tutor.
	Python 3.6
	
	1
	def busca_binaria(lista, elemento):
	
	2
	        minimo = 0 
	
	3
	        maximo = len(lista)-1
	
	4
	        encontrado = False
	
	5
	    
	
	6
	        while minimo<=maximo and not encontrado:
	
	7
	            meio_lista = (minimo + maximo)//2
	
	8
	            if lista[meio_lista] == elemento:
	
	9
	                encontrado = True
	
	10
	            else:
	
	11
	                if elemento < lista[meio_lista]:
	
	12
	                    maximo = meio_lista-1
	
	13
	                else:
	
	14
	                    minimo = meio_lista+1
	
	15
	    
	
	16
	        return encontrado
	
	17
	    
	
	18
	testelista = [1, 2, 3, 4, 5, 6, 7, 8
	lobal frame
	busca_binaria
	 
	testelista
	 
busca_binaria
	lista
	 
	elemento
	14
	minimo
	8
	maximo
	14
	encontrado
	False
	meio_lista
	11
	Objects
	function
busca_binaria(lista, elemento)
	list
	0
	1
	2
	3
	4
	5
	6
	7
	8
	9
	10
	11
	12
	13
	14
	1
	2
	3
	4
	5
	6
	7
	8
	9
	10
	11
	
	
	
	
Vamos a outro exemplo de aplicação do algoritmo de busca binária com utilização do mesmo vetor ordenado apresentado para a busca sequencial.
O código para esse exemplo será escrito da seguinte maneira:
	
	def busca_binaria(lista, elemento):
	
	minimo = 0 
	
	maximo = len(lista)-1
	
	encontrado = False
	
	
	
	while minimo< =maximo and not encontrado:
	
	meio_lista = (minimo + maximo)//2
	
	if lista[meio_lista] == elemento:
	
	encontrado = True
	
	else:
	
	if elemento < lista[meio_lista]:
	
	maximo = meio_lista-1
	
	else:
	
	minimo = meio_lista+1
	
	
	
	return encontrado
	
	
	
	testelista = [1, 2, 8, 10, 13, 15, 18, 20]
	
	print(busca_binaria(testelista, 5))
	
	print(busca_binaria(testelista, 15))
Para testar o comportamento desse algoritmo vamos acessar o código com o Python Tutor.
Python 3.6
	
	1
	def busca_binaria(lista, elemento):2
	        minimo = 0 
	
	3
	        maximo = len(lista)-1
	
	4
	        encontrado = False
	
	5
	    
	
	6
	        while minimo<=maximo and not encontrado:
	
	7
	            meio_lista = (minimo + maximo)//2
	
	8
	            if lista[meio_lista] == elemento:
	
	9
	                encontrado = True
	
	10
	            else:
	
	11
	                if elemento < lista[meio_lista]:
	
	12
	                    maximo = meio_lista-1
	
	13
	                else:
	
	14
	                    minimo = meio_lista+1
	
	15
	    
	
	16
	        return encontrado
Agora vamos analisar alguns pontos importantes desse exemplo de aplicação de busca.
Linha 6
Na linha 6, temos a estrutura de repetição “while”, que será executada enquanto o primeiro elemento da lista (mínimo) for menor ou igual ao máximo (último elemento) e o elemento procurado não for
Linha 7
Na linha 7, identificamos o índice associado à metade da lista.
Linha 8
Na linha 8, temos uma estrutura de condição “if” em razão da qual, basicamente, verifica-se que, se o elemento do meio da lista for o valor procurado, será retornado o True (linha 9).
Linha 10
Na linha 10, temos a condição “else”, que verifica se o elemento procurado é menor que o valor do meio da lista. Se for maior, então a busca acontecerá na metade superior da sequência (a inferior é descartada); se não for, a busca acontecerá na metade inferior da sequência (a superior é descartada).
Algoritmos de busca compõem o arsenal de algoritmos tradicionais da computação. Quando é conhecida a sequência de passos, ou seja, o pseudocódigo, basta escolher uma linguagem de programação e implementá-la.
 Todo algoritmo deve ter uma medida de complexidade – ou seja, a quantidade de recurso computacional é necessária para executar tal solução. A análise da complexidade do algoritmo fornece mecanismos para medir o desempenho de um algoritmo em termos de “tamanho do problema versus tempo de execução” (TOSCANI; VELOSO, 2012). A análise da complexidade é feita em duas dimensões: espaço e tempo. Embora ambas as dimensões influenciem na eficiência de um algoritmo, o tempo que ele leva para executar é tido como a característica mais relevante.
Algoritmos de ordenação
Os algoritmos de ordenação determinam uma forma de organizar os dados em uma determinada sequência. Em geral, pode-se ordenar os elementos nas ordens numérica ou alfabética. Existem diversas aplicações do dia a dia; por exemplo, os objetos podem ser ordenados por tamanho, altura, peso, cor, nomes em ordem alfabética, entre outras opções.
Como uma aplicação do cotidiano, imagine que você vai utilizar algum sistema de compra on-line e deseja listar os itens por ordem de preço (do mais barato para o mais caro). Essa é uma simples aplicação de ordenação utilizada na rotina diária.
Classificação dos algoritmos 
Antes de exploramos o funcionamento dos algoritmos de ordenação, é importante conhecer um pouco sobre a classificação deles. Os algoritmos de ordenação podem ser classificados quanto à complexidade da seguinte forma:
Complexidade O(N2)
Nesse grupo estão os algoritmos selection sort, bubble sort e insertion sort. Esses algoritmos são lentos para ordenação de grandes listas, porém são mais intuitivos de entender e possuem codificação mais simples.
Complexidade O(N log N)
Deste grupo, vamos estudar os algoritmos merge sort e quick sort. Tais algoritmos possuem performance superior, porém são um pouco mais complexos de serem implementados.
A seguir podemos verificar e testar o algoritmo no emulador implementado em Python.O algoritmo de ordenação por inserção é iniciado a partir do segundo valor no vetor, pois o primeiro elemento será uma referência para a ordenação. Ou seja, o segundo elemento do vetor será comparado com o primeiro.
O vetor é percorrido da esquerda para a direita. Nesse caminho, compara-se sempre o elemento da direita com os elementos à esquerda de modo que os elementos mais à esquerda sejam organizados e ordenados. O algoritmo de ordenação por inserção tem funcionamento similar ao das pessoas que ordenam cartas em um jogo de baralho.
A seguir podemos verificar e testar o algoritmo no emulador implementado em Python.
	Python 3.6
	
	1
	def executar_insertion_sort(lista):
	
	2
	    n = len(lista)
	
	3
	    for i in range(1, n):
	
	4
	        valor_inserir = lista[i] 
	
	5
	        j = i - 1
	
	6
	        
	
	7
	        while j >= 0 and lista[j] > valor_inserir:
	
	8
	            lista[j + 1] = lista[j]
	
	9
	            j -= 1
	
	10
	        lista[j + 1] = valor_inserir
	
	11
	    
	
	12
	    return lista
	
	13
	
	
	14
	
	
	15
	lista = [10, 8, 7, 3, 2, 1]
	
	16
	executar_insertion_sort(lista)
	
Algoritmo de ordenação por seleção (selection sort)
Seleção pelo valor mínimo
O princípio de funcionamento deste algoritmo é transferir o menor valor do vetor para a primeira posição e, em seguida, o segundo menor valor para a segunda posição, e assim sucessivamente, para os n-1 elementos até os últimos dois elementos.
Agora podemos verificar e testar o algoritmo em Python no emulador. O pseudocódigo apresentado na animação foi implementado em Python considerando um vetor de n-1 elementos.
Python 3.6
	
	1
	def executar_selection_sort(lista):
	
	2
	    n = len(lista)
	
	3
	    
	
	4
	    for i in range(0, n-1):
	
	5
	        min = i
	
	6
	        for j in range(i+1, n):
	
	7
	            if lista[j] < lista[min]:
	
	8
	                min = j
	
	9
	        lista[i], lista[min] = lista[min], lista[i]
	
	10
	    return lista
	
	11
	
	
	12
	
	
	13
	lista = [10, 8, 7, 3, 2, 1]
	
	
	
	
	
	
	
	14
	executar_selection_sort(lista)
Algoritmo de ordenação por bolha (bubble sort)
O algoritmo de ordenação por bolha (ou flutuação) consiste naquele baseado em comparações, em que se percorre vetor ou lista múltiplas vezes. A cada passagem, os pares de elementos adjacentes do vetor são comparados e, depois disso, são trocados se não estiverem ordenados. Esse processo segue para todos os elementos não ordenados da lista.
É importante destacar que esse tipo de algoritmo não é indicado para uma grande quantidade de dados.
Agora podemos verificar e testar o algoritmo em Python no emulador.
	Python 3.6
	
	1
	def executar_bubble_sort(lista):
	
	2
	    n = len(lista)
	
	3
	    for i in range(n-1):
	
	4
	        for j in range(n-1):
	
	5
	            if lista[j] > lista[j + 1]:
	
	6
	                lista[j], lista[j + 1] = lista[j + 1], lista[j]
	
	7
	    return lista
	
	8
	
	
	9
	lista = [10, 8, 7, 3, 2, 1]
	
	10
	executar_bubble_sort(lista)
Algoritmo de ordenação merge sort
O algoritmo de ordenação merge sort é baseado no princípio dividir para conquistar. Basicamente, o vetor é dividido em duas metades e, em seguida, novamente é dividido novamente em outras duas partes – ao repetir a divisão do vetor, em um determinado momento teremos vários vetores com apenas um elemento.
Cada metade é ordenada recursivamente, bem como o são as partes com um elemento. Assim, realizamos a junção (merge) dos subvetores ordenados, iniciando a junção de dois a dois de todos os vetores de um elemento e gerando vetores de tamanho dois. Depois disso, o processo é repetido para vetores de tamanho três, quatro, e assim sucessivamente.
Python 3.6
	
	1
	def executar_merge_sort(lista):
	
	2
	    if len(lista) <= 1: return lista
	
	3
	    else:
	
	4
	        meio = len(lista) // 2
	
	5
	        esquerda = executar_merge_sort(lista[:meio])
	
	6
	        direita = executar_merge_sort(lista[meio:])
	
	7
	        return executar_merge(esquerda, direita)
	
	8
	
	
	9
	    
	
	10
	def executar_merge(esquerda, direita):
	
	11
	    sub_lista_ordenada = []
	
	12
	    topo_esquerda, topo_direita = 0, 0
	
	13
	    while topo_esquerda < len(esquerda) and topo_direita < len(direita):
	
	14
	        if esquerda[topo_esquerda] <= direita[topo_direita]:
	
	15
	            sub_lista_ordenada.append(esquerda[topo_esquerda])
	
	16
	            topo_esquerda += 1
	
	17
	        else:
	
	18
	            sub_lista_ordenada.append(direita[topo_direita])19
	            topo_direita += 1
	
	20
	    sub_lista_ordenada += esquerda[topo_esquerda:]
	
	21
	    sub_lista_ordenada += direita[topo_direita:]
	
	22
	    return sub_lista_ordenada
	
	23
	
	
	24
	
	
	25
	lista = [10, 8, 7, 8, 3, 2, 1]
	
	26
	executar_merge_sort(lista)
	
Algoritmo de ordenação quick sort
Nos algoritmos quick sort, primeiramente escolhemos o pivô, que corresponde ao elemento do meio do vetor. Depois, nós trocamos os elementos no início do vetor com os elementos do final – até no início do vetor serão apenas esses elementos, os quais são menores ou iguais ao pivô; e no final do vetor, este permanecerá apenas com esses elementos, que são menores ou iguais ao pivô. Por fim, se no início ou no fim há mais que um elemento, repetimos todo o processo para essas partes (elementos).
	Python 3.6
	
	1
	def executar_quicksort(lista, inicio, fim):
	
	2
	    if inicio < fim:
	
	3
	        pivo = executar_particao(lista, inicio, fim)
	
	4
	        executar_quicksort(lista, inicio, pivo-1)
	
	5
	        executar_quicksort(lista, pivo+1, fim)
	
	6
	    return lista
	
	7
	
	
	8
	        
	
	9
	def executar_particao(lista, inicio, fim):
	
	10
	    pivo = lista[fim]
	
	11
	    esquerda = inicio
	
	12
	    for direita in range(inicio, fim):
	
	13
	        if lista[direita] <= pivo:
	
	14
	            lista[direita], lista[esquerda] = lista[esquerda], lista[direita]
	
	15
	            esquerda += 1
	
	16
	    lista[esquerda], lista[fim] = lista[fim], lista[esquerda]
	
	17
	    return esquerda
Bibliotecas e módulos em Python
Implementamos algoritmos, nas diversas linguagens de programação, para automatizar soluções e acrescentar recursos digitais, como interfaces gráficas e processamento em larga escala. Uma solução pode começar com algumas linhas de códigos, mas, em pouco tempo, se tornar centenas, milhares e até milhões delas. Nesse cenário, trabalhar com um único fluxo de código se torna inviável, dando origem a técnicas de implementação para organizar a solução.
rganização em módulos
Uma opção para organizar o código é implementar funções, contexto em que cada bloco passa a ser responsável por uma determinada funcionalidade. Outra forma é utilizar a orientação a objetos e criar classes que encapsulam características e comportamentos de um determinado objeto. Conseguimos utilizar ambas as técnicas para melhorar nosso código, mas, ainda assim, estamos falando de toda a solução agrupada em um arquivo Python (.py). 
Atenção
Considerando a necessidade de implementar uma solução, o mundo ideal é: 
Modular uma solução, ou seja, fazer a separação em funções ou classes e ainda realizar a separação em vários arquivos .py (PSF, 2020b). 
Segundo a documentação oficial do Python, é preferível implementar, em um arquivo separado, uma funcionalidade que você possa reutilizar, criando assim um módulo. 
"Um módulo é um arquivo contendo definições e instruções Python. O nome do arquivo é o nome do módulo acrescido do sufixo .py." (PSF, 2020b, [s.p.]). 
Contínuo versus módulo
Bibliotecas
Falamos em módulo, mas em Python se ouve muito o termo biblioteca. O que será que eles têm em comum? 
Na verdade, um módulo pode ser uma biblioteca de códigos! Veja a seguir que temos o módulo math, que possui diversas funções matemáticas, e o módulo os, que possui funções de sistema operacional, como capturar o caminho (getcwd), listar um diretório (listdir), criar uma nova pasta (mkdir), dentre inúmeras outras. 
Esses módulos são bibliotecas de funções pertinentes a um determinado assunto (matemática e sistema operacional), as quais possibilitam a reutilização de código de uma forma elegante e eficiente.
Módulo como biblioteca
Como utilizar um módulo
Para utilizar um módulo, é preciso importá-lo para o arquivo. Essa importação pode ser feita de maneiras distintas:
· 1. import moduloXX
· 1.2 import moduloXX as apelido
Desta forma todas as funcionalidades de um módulo são carregadas na memória.
A diferença entre elas é que, na primeira, usamos o nome do módulo e, na segunda, atribuímos um apelido (as = alias) ao módulo. 
· 2. from moduloXX import itemA, itemB
Nesta forma de importação, somente funcionalidades específicas de um módulo são carregadas na memória. A forma de importação também determina a sintaxe para utilizar a funcionalidade. Com podemos observar nos exemplos a seguir:
Exemplo 1: Importando todas as funcionalidades da biblioteca
	
	import math
	
	
	
	math.sqrt(25)
	
	math.log2(1024)
	
	math.cos(45)
Exemplo 2: Importando todas as funcionalidades da biblioteca com alias
	
	import math as m
	
	
	
	math.sqrt(25)
	
	math.log2(1024)
	
	math.cos(45)
Exemplo 3: Importando funcionalidades específicas de uma biblioteca
	
	from math import sqrt, log2, cos
	
	
	
	sqrt(25)
	
	log2(1024)
	
	cos(45)
Classificação dos módulos (bibliotecas)
Podemos classificar os módulos (bibliotecas) em três categorias:
·  Módulos built-in
· São embutidos no interpretador. Ao instalar o interpretador Python, também é feita a instalação de uma biblioteca de módulos, que pode variar um de sistema operacional para outro.
·  Módulos de terceiros
· São criados por terceiros e disponibilizados via PyPI. 
PyPI é a abreviação para Python Package Index, que é um repositório para programas Python. Programadores autônomos e empresas podem criar uma solução em Python e disponibilizá-la em forma de biblioteca no repositório PyPI. Dessa forma, todos usufruem e contribuem para o crescimento dalinguagem.
·  Módulos próprios
· São criados pelo desenvolvedor. Cada módulo pode importar outros módulos, tanto os pertencentes ao mesmo projeto, quanto os built-in ou de terceiros.
Aplicação de banco de dados com Python
Grande parte dos softwares que são desenvolvidos (senão todos) acessam algum tipo de mecanismo para armazenar dados. A persistência dos dados pode ser feita em arquivo, em um banco de dados relacional ou em um banco de dados NoSQL.
A teoria base dos bancos de dados relacional existe desde a década de 1970. Nessa abordagem os dados são persistidos em uma estrutura bidimensional, chamada de relação (que é uma tabela) e baseada na teoria dos conjuntos pertencentes à matemática. 
Cada unidade de dados é conhecida como coluna, ao passo que cada unidade do grupo é conhecida como linha, tupla ou registro.
A linguagem SQL 
Para se comunicar com um banco de dados relacional, existe uma linguagem específica conhecida como SQL, que significa Structured Query Language ou, traduzindo, linguagem de consulta estruturada. As instruções da linguagem SQL são divididas em três grupos: DDL; DML; DCL (ROCKOFF, 2016).
DDL é um acrônimo para data definition language (linguagem de definição de dados). Fazem parte desse grupo as instruções destinadas a criar, deletar e modificar banco de dados e tabelas. Nesse módulo, vão aparecer comandos como CREATE, ALTER e DROP.
DML é um acrônimo para data manipulation language (linguagem de manipulação de dados). Fazem parte deste grupo as instruções destinadas a recuperar, atualizar, adicionar ou excluir dados em um banco de dados. Nesse módulo vão aparecer comandos como INSERT, UPDATE e DELETE.
DCL é um acrônimo para data control language (linguagem de controle de dados). Fazem parte deste grupo as instruções destinadas a manter a segurança adequada para o banco de dados. Nesse módulo vão aparecer comandos como GRANT e REVOKE.
Banco de dados SQLite
O SQLite é uma biblioteca em linguagem C, que implementa um mecanismo de banco de dados SQL pequeno, rápido, independente, de alta confiabilidade e completo. Por ser leve e não precisar da instalação de um servidor é uma ótima opção para diversos cenários. 
O SQLite lê e grava diretamente em arquivos de disco, ou seja, um banco de dados SQL completo com várias tabelas, índices, triggers e visualizações está contido em um único arquivo de disco.
O interpretador Python possui o módulo built-in sqlite3, que permite utilizar o mecanismo de banco de dados SQLite. Com esse módulo, é bastante simples criar um banco de dados SQLite e fazera conexão. 
A seguir, criamos um banco de dados chamado aulaDB. Esse comando criará um arquivo chamado aulaDB com extensão db, que o identifica como um arquivo de banco.
	
	import sqlite3
	
	
	
	conn = sqlite3.connect('aulaDB.db')
O CRUD no banco de dados SQLite
Quando o assunto é banco de dados, um termo muito comum é o CRUD, um acrônimo para as quatro operações de DML que podemos fazer em uma tabela no banco de dados – podemos inserir informações (create), ler (read), atualizar (update) e apagar (delete). 
Os passos necessários para efetuar uma das operações do CRUD são sempre os mesmos:
1. Estabelecer a conexão com um banco
2. Criar um cursor e executar o comando
3. Gravar a operação
4. Fechar o cursor e a conexão
Aplicação do CRUD no banco de dados SQLite
Agora que já conhecemos o CRUD vamos inserir as informações para cada uma de suas operações:
· CREATE
A variável conn guarda a instância de conexão com o banco de dados. Agora é preciso criar um cursor para executar as instruções e, por fim, gravar as alterações com o método commit().
	
	cursor = conn.cursor()
	
	cursor.execute("""
	
	INSERT INTO fornecedor (nome_fornecedor, cnpj, cidade, estado, cep, data_cadastro)
	
	VALUES ('Empresa A', '11.111.111/1111-11', 'São Paulo', 'SP', '11111-111', '2020-01-01')
	
	""")
	
	conn.commit()
· READ
Para ler os dados em uma tabela, também precisamos estabelecer uma conexão e criar um objeto cursor para executar a instrução de seleção. Ao executar a seleção, podemos usar o método fetchall(), para capturar todas as linhas mediante uma lista de tuplas.
	
	cursor.execute("SELECT * FROM fornecedor")
	
	resultado = cursor.fetchall()
	
	for linha in resultado:
	
	print(linha)
· UPDATE
Ao inserir um registro no banco, pode ser necessário alterar o valor de uma coluna, o que pode ser feito por meio da instrução SQL UPDATE.
	
	cursor.execute("UPDATE fornecedor SET cidade = 'Campinas' WHERE id_fornecedor = 5")
	
	conn.commit() 
· DELETE
Ao inserir um registro no banco, pode ser necessário removê-lo no futuro, o que pode ser feito por meio da instrução SQL DELETE.
	
	cursor.execute("DELETE FROM fornecedor WHERE id_fornecedor = 2") 
	
	conn.commit() 
Introdução a Bibliotecas Pandas
Dentre as diversas bibliotecas disponíveis no repositório PyPI, pandas é um pacote Python que fornece estruturas de dados projetadas para facilitar o trabalho com dados estruturados (tabelas) e de séries temporais. 
Como uma ferramenta de alto nível, pandas possui duas estruturas de dados que são as principais para a análise/manipulação de dados: a Series e o DataFrame. Nesta webaula vamos conhecer cada uma delas. 
Uma Series é um como um vetor de dados (unidimensional), capaz de armazenar diferentes tipos de dados. 
Um DataFrame é um conjunto de Series, ou, como a documentação apresenta, um contêiner para Series. 
Ambas as estruturas possuem como grande característica a indexação das linhas, ou seja, cada linha possui um rótulo (nome) que a identifica, o qual pode ser uma string, um inteiro, um decimal ou uma data. 
A figura a seguir ilustra uma Series (A) e um DataFrame (B), veja que:
·  Uma Series possui somente "uma coluna" de informação e seus rótulos (índices). 
·  Um DataFrame pode ter uma ou mais colunas e, além dos índices, também há um rótulo de identificação com o nome da coluna. 
Para utilizar os recursos da biblioteca é preciso importar no projeto. Usa-se a seguinte convenção:
import pandas as pd
Series
Para construir um objeto do tipo Series, é preciso utilizar o método Series() do pacote pandas. O método possui o seguinte construtor:
pandas.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)
Como todos os parâmetros possuem valores padrão (default), o que permite instanciar um objeto de diferentes formas. Veja algumas dessas formas:
pd.Series(data=5) # Cria uma Series com o valor a
pd.Series('Howard Ian Peter Jonah Kellie'.split()) # Cria uma Series com uma lista de nomes
DataFrame
Para construir um objeto do tipo DataFrame é preciso utilizar o método DataFrame() do pacote pandas. O método possui o seguinte construtor: 
pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
Veja alguns exemplos:
# Cria um DataFrame, de uma coluna a partir de uma lista
pd.DataFrame('Howard Ian Peter Jonah Kellie'.split(), columns=['nome']) 
Resultado:
	
	nome
	0
	Howard
	1
	Ian
	2
	Peter
	3
	Jonah
	4
	Kellie
lista_nomes = 'Howard Ian Peter Jonah Kellie'.split()
lista_cpfs = '111.111.111-11 222.222.222-22 333.333.333-33 444.444.444-44
555.555.555-55'.split()
lista_emails = 'risus.varius@dictumPhasellusin.ca
Nunc@vulputate.ca fames.ac.turpis@cursusa.org non@felisullamcorper.org
eget.dictum.placerat@necluctus.co.uk'.split()
lista_idades = [32, 22, 25, 29, 38]
dados = list(zip(lista_nomes, lista_cpfs, lista_idades, lista_emails)) # cria
uma lista de tuplas # Cria um DataFrame a partir de uma lista de tuplas
pd.DataFrame(dados, columns=['nome', 'cpfs', 'idade', 'email'])
Resultado:
	
	nome
	cpfs
	emails
	idades
	0
	Howard
	111.111.111-11
	risus.varius@dictumPhasellusin.ca
	32
	1
	Ian
	222.222.222-22
	nunc@vulputate.ca
	22
	2
	Peter
	333.333.333-33
	fames.ac.turpis@cursusa.org
	25
	3
	Jonah
	444.444.444-44
	non@felisullamcorper.org 
	29
	4
	Kellie
	555.555.555-55
	eget.dictum.placerat@necluctus.co.uk
	38
Saiba mais
Estruturas de dados são utilizadas para armazenar dados e diferentes estruturas possuem diferentes atributos e métodos. Com as estruturas de dados do pandas não é diferente, tais objetos possuem atributos e métodos específicos. Existem atributos e métodos que extraem informações estruturais da Series ou do DataFrame, por exemplo, o atributo shape ou dtypes. Por outro lado, existem recursos que permitem transformar os dados em informações, por exemplo, as estatísticas, como o método mean() ou median().
Na documentação oficial da biblioteca pandas você encontrará o método read_html(), que permite fazer a leitura de tabelas em páginas web.
Introdução a manipulação de dados em Pandas
Dataset Titanic
Nesta webaula vamos utilizar um dos datasets (conjunto de dados) clássicos para quem inicia o estudo na área de ciência de dados, o Titanic. Essa base foi inicialmente lançada em um desafio do portal kaggle.com ( https://www.kaggle.com/) e possui 8 colunas, conforme a tabela a seguir.
Amostra do dataset Titanic.csv
	
	Survived
	Pclass
	Name
	Sex
	Age
	Siblings/Spouses Aboard
	Parents/Children
Aboard
	Fare
	0
	0
	3
	Mr. Owen Harris Braund
	male
	22.0
	1
	0
	7.2500
	1
	1
	1
	Mrs. John Bradley (Florence Briggs Thayer Cumings
	female
	38.0
	1
	0
	71.2833
	2
	1
	3
	Miss. Laina Heikkinen
	female
	26.0
	0
	0
	7.9250
	3
	1
	1
	Mrs Jacques Heath (Lily May Peel) Futrelle
	female
	35.0
	1
	0
	53.10000
	4
	0
	3
	Mr. William Henry Allen
	male
	35.0
	0
	0
	8.0500
Seleção de colunas
1 . Para selecionar uma coluna usa-se a sintaxe: meu_df['coluna']
df_titanic['Age']
df_titanic['Survived'] 
2. Para selecionar mais de uma coluna é preciso passar uma lista de colunas: meu_df[['coluna1', 'coluna2', 'coluna3']]
df_titanic[['Age', 'Fare']]
df_titanic[['Name', 'PClass', 'Fare']] 
Seleção de linhas - Filtros
Um dos recursos mais utilizados por equipes das áreas de dados é a aplicação de filtros. Imagine a seguinte situação: uma determinada pesquisa quer saber qual é a média de idade de todas as pessoas na sua sala de aula, bem como a média de idades somente das mulheres e somente dos homens. A distinção por gênero é um filtro! Esse filtro vai possibilitar comparar a idade de todos com a idade de cada grupo e entender se as mulheres ou os homens estão abaixo ou acima da média geral.
DataFrames da biblioteca pandas possuem uma propriedade chamada loc. Essa propriedade permite acessar um conjunto de linhas (filtrar linhas), por meio do índice ou por um vetor booleano (vetor de True ou False). 
·  Ao criar uma condição booleana para os dados de uma colun, obtém-se uma Series de valores True ou False. 
·  Ao usar essa Series como parâmetro no loc, somente os registros quetiverem valor True são exibidos.
Exemplo:
Filtrar somente os homens que estavam a bordo e guardar dentro de um novo DataFrame.
filtro_homem = df_titanic['Sex'] == 'male'
df_titanic_homens = df_titanic.loc[filtro_homem] 
Ou ainda, criar um novo DataFrame somente com os passageiros que sobreviveram:
filtro_sobreviventes = df_titanic['Survived'] == 1
df_titanic_sobreviventes =
df_titanic[filtro_sobreviventes] 
O filtro sempre é criado com base em condições sobre uma ou mais colunas.
Filtros com operadores relacionais e lógicos
É possível criar filtros usando operadores relacionais e lógicos para criar condições compostas. Cada condição deve estar entre parênteses e deve ser conectada pelos operadores lógicos AND (&), OR (|).
Por exemplo, criar um novo DataFrame contendo todos os homens que sobreviveram.
filtro_sobreviventes = df_titanic['Survived'] == 1
filtro_homem = df_titanic['Sex'] == 'male'
df_titanic_homens_sobreviventes = df_titanic.loc[(filtro_sobreviventes) &
(filtro_homem)] 
Ou um novo DataFrame com todos os passageiros do sexo feminino que estavam na primeira ou segunda classe. Nesse caso, é preciso utilizar um parênteses extra para garantir a ordem de execução: primeiro faz o OU entre pessoas que estavam na primeira e segunda classe e depois faz o E com pessoas do sexo feminino.
filtro_mulher = df_titanic['Sex'] == 'female'
filtro_classe1 = df_titanic['Pclass'] == 1
filtro_classe2 = df_titanic['Pclass'] == 2
df_titanic_mulheres_c1_c2 = df_titanic.loc[(filtro_mulher) & ((filtro_classe1) | 
(filtro_classe2))]
df_titanic_mulheres_c1_c2
Visualização de dados em Python
Biblioteca matplotlib
Ao se falar em criação de gráficos em Python, o profissional precisa conhecer a biblioteca matplotlib, pois diversas outras são construídas a partir desta. 
A criação e grande parte da evolução dessa biblioteca se deve a John Hunter, que a desenvolveu como uma opção ao uso dos softwares gnuplot e MATLAB (MCGREGGOR, 2015). Com a utilização da linguagem Python na área científica para trabalhar com dados, após a extração dos resultados, o cientista precisava criar seus gráficos nos outros softwares mencionados, o que se tornava inconveniente, motivando a criação da biblioteca em Python.
Figura e eixo
Ao utilizar a biblioteca matplotlib é preciso entender o conceito de figura e eixo (axes).
Ao criar uma figura estamos criando um espaço (tipo uma tela em branco) para se plotar o gráfico nesse espaço. Naturalmente, uma figura pode ter “subfiguras”, ou seja, uma figura pode ser dividida. 
· Quando uma figura possui um único espaço, ela também possui um único eixo para plotagem. 
· Quando uma figura possui duas divisões, ela possui dois eixos; quando possui três divisões, três eixos, e assim por diante. 
Figura e eixo matplotlib
 
Método plt.plot(dados)
Existem algumas opções de sintaxe para se criar figuras e eixos. Podemos deixar que a própria biblioteca gerencie para nós, dessa forma basta utilizar o método plt.plot(dados) que o gráfico será construído sobre uma figura e um eixo criados automaticamente.
A forma automática, embora prática, não permite que o desenvolvedor tenha controle sobre o eixo que gostaria de plotar, nesse caso o ideal é criar, explicitamente, uma figura com os eixos, usando a função  plt.subplots().
Para criar uma figura com um eixo, de forma explícita, usamos: 
fig, ax = plt. Subplots (1, 1)
Resultado:
Figura com 1 eixo criado de forma explícita
Para criar uma figura com dois eixos (1 linha, 2 colunas), de forma explícita, usamos:
fig, ax = plt. Subplots (1, 2)
Resultado:
Figura com 2 eixos criados de forma explícita
Ao criar uma figura com mais de um eixo, temos que informar em qual vamos criar um gráfico. A variável “ax”, criada no último exemplo, é um vetor de eixos, ou seja, podemos acessar cada eixo pelo índice, começando por 0. 
Portanto, para plotar na figura mais à esquerda escolhemos ax[0].plot() e na da direita, ax[1].plot(). 
Veja a seguir:
	
	fig, ax = plt. Subplots (1, 2)
	
	
	
	Dados = range(S)
	
	
	
	ax[0].plot(dados)
	
	ax[1].plot(dados)
Plotagem sobre eixos
As figuras podem ser criadas sem nenhum eixo, com o comando:
fig = plt.subplots()
Dessa forma, para se plotar teremos que usar a função plt.subplot(), que adiciona um subplot em um figura existente.
1)
A condição para um aluno ser aprova é ter média final, de 7 pontos ou superior. Essa condição pode ser implementada na linguagem Python, por meio de uma estrutura condicional.
Considerando a linguagem Python, escolha a opção que implementa corretamente a condição para o aluno ser aprovado.
Alternativas:
· a)
if media_final > 7:
print("aprovado")
· b)
elif media_final >= 7:
print("aprovado")
· c)
if media_final >= 7:
print("aprovado")
Alternativa assinalada
· d)
if media_final < 7:
print("aprovado")
· e)
elif media_final < 7:
print("aprovado")
2)
A condição para que um aluno seja aprovado é que ele tenha média final de 7 ou superior e tenha 5 ou menos faltas. Tal condição pode ser implementada através de uma estrutura condicional na linguagem Python.
Considerando a linguagem Python, escolha a opção que implementa corretamente a condição para o aluno ser aprovado.
Alternativas:
· a)
if media_final >= 7 and faltas <= 5:
print("aprovado")
Alternativa assinalada
· b)
if media_final > 7 and faltas < 5:
print("aprovado")
· c)
if media_final > 7 and faltas <= 5:
print("aprovado")
· d)
if media_final >= 7 and faltas < 5:
print("aprovado")
· e)
if media_final >= 7 or faltas <= 5:
print("aprovado")
3)
Funções em Python, podem ser argumentos definidos ou indefinidos. Ao invocar uma função, os parâmetros podem ser passados de forma posicional ou nominal.
 
O código a seguir é uma implementação em Python
Considerando o código apresentado, escolha a opção que representa o retorno da função para a chamada: calcular(1, 4, 5)
Alternativas:
· a)
A função irá retornar o valor 10.
· b)
A função irá retornar o valor 20.
Alternativa assinalada
· c)
A função irá retornar o valor 5.
· d)
A função irá retornar o valor 15.
· e)
A função irá retornar o valor 25.
4)
Um texto é um objeto da classe _____, que é um tipo de ________. Os objetos da classe str, possuem certas operações, como por exemplo, in, _____, dentre outras. Esse tipo de objeto é _________, ou seja, não é possível atribuir um novo valor a uma _________.
Escolha a opção que completa corretamente as lacunas.
Alternativas:
· a)
string / lista / not in / imutável / posição específica
· b)
str / sequência / not in / imutável / posição específica
Alternativa assinalada
· c)
string / lista / none in / mutável / posição específica
· d)
string / lista / none in / imutável / variável
· e)
str / tupla / not in / imutável / posição específica
5)
Os algoritmos criados para resolver o mesmo problema geralmente diferem dramaticamente em sua eficiência. Essas diferenças podem ser muito mais significativas do que as diferenças devido ao hardware e software.
 
O algoritmo a seguir é uma implementação em Python.
def procurar_valor(lista, valor):
    minimo = 0
    maximo = len(lista) - 1
    while minimo <= maximo:
        meio = (minimo + maximo) // 2
        if valor < lista[meio]:
            maximo = meio - 1
        elif valor > lista[meio]:
            minimo = meio + 1
        else:
            return meio
    return None
Considerando a função apresentada é correto o que se afirma em
I. A função representa um algoritmo de busca linear.
II. A função retornará verdadeiro ou falso caso encontre um valor.
III. Na primeira iteração o menor índice a ser considerado é o zero.
Escolha a opção correta.
Alternativas:
· a)
Somente a asserção I está correta.
· b)
Somente a asserção II está correta.
· c)
Somente a asserção III está correta.
Alternativa assinalada
· d)
Somente as asserções I e II estão corretas.
· e)
Somente as asserções II e III estão corretas.
1)
O desenvolvimento de um software envolve boas práticas de programação. Em Python, todos os import devem ficar no _______ do arquivo. Ainda segundo a documentação, é uma boa prática declarar primeiro as bibliotecas______, seguido das bibliotecas _______ e por fim, _______ criados para a aplicação. Cada bloco deve ser separado por uma linha em branco.
Escolha a opção que completa corretamente as lacunas.
Alternativas:
· a)
começo; de terceiros; padrão; os módulos específicos
· b)
final; padrão; de terceiros; os módulos específicos
· c)
começo; padrão; de terceiros; os módulos específicos
Alternativa assinalada
· d)
começo; padrão; built-in; módulos de terceiros
· e)
final; padrão; built-in; módulos de terceiros
2)
Para se comunicar com um bando de dados relacional existe uma linguagem específica conhecida como ________, que significa _________ ou, traduzindo, linguagem de consulta estruturada. Em outras palavras, ________ é a linguagem que permite aos usuários se comunicarem com banco de dados ____________.
Escolha a opção que completa corretamente as lacunas.
Alternativas:
· a)
SQL; Select Query Language; SQL; relacionais
· b)
Query; instrução; query; NoSql
· c)
Query; Select Query Language; queyr; relacionais
· d)
SQL; Structured Query Language; SQL; relacionais
Alternativa assinalada
· e)
SQL; Single Query Language; SQL; relacionais
3)
O objetivo de um modelo de dados é ter certeza de que todos os objetos de dados existentes em determinado contexto e requeridos pela aplicação e pelo banco de dados estão completamente representados e com precisão. O modelo de dados também deve ser detalhado o bastante para ser usado pelo implementador (DBA) do banco de dados como uma espécie de fotocópia para construir o banco de dados físico. Será utilizada toda a informação que está no modelo de dados lógico para definir as tabelas de um banco de dados relacional, chaves primárias e chaves estrangeiras, procedimentos armazenados (stored procedures) e gatilhos (triggers) (MACHADO, p. 17, 2020).
 
Considerando o mecanismo de banco de dados relacional SQLite em Python, julgue as afirmativas a seguir em (V) Verdadeiras ou (F) Falsas.
 
I. (     ) O comando cursor.fetchall() é usado para capturar as linhas em um tabela, resultantes de uma instrução SQL SELECT.
II. (     ) O comando resultado = cursor.fetchall(), guarda na variável "resultado" uma lista de tuplas, na qual cada tupla é uma linha da tabela no banco de dados.
III. (     ) A estrutura de repetição for, pode ser usada para iterar sobre cada registro capturado com o comando cursor.fetchall().
Assinale a alternativa correta.
Alternativas:
· a)
V - V - V
Alternativa assinalada
· b)
V - F - F
· c)
V - V - F
· d)
F - V - V
· e)
F - F - V
4)
A visualização explicativa dos dados é apropriada quando você já sabe o que os dados têm a dizer e está tentando contar essa história para outra pessoa. Pode ser o chefe do seu departamento, um comitê de doações ou o público em geral. Quem quer que seja o público, a história que você está tentando contar (ou a resposta que você está tentando compartilhar) é conhecida por você desde o início e, portanto, você pode projetar para acomodar e destacar especificamente essa história. Em outras palavras, você precisa tomar certas decisões editoriais sobre quais informações ficam. Este é um processo de seleção de dados focados que darão suporte à história que você está tentando contar (ILIINSKY e STEELE, 2011).
 
Figura 1 - Gráfico gerado com biblioteca pandas
Fonte: Elaborada pela autora.
Escolha a opção que contém o comando usado para gerar o gráfico da Figura 1.
Alternativas:
· a)
df_etanol[['ANO', 'JAN', 'FEV']].plot(x='ANO', kind='bar', figsize=(12, 5), rot=45, fontsize=12)
Alternativa assinalada
· b)
df_etanol.loc[['ANO', 'JAN', 'FEV']].plot(x='ANO', kind='bar', figsize=(12, 5), fontsize=12)
· c)
df_etanol[['ANO', 'JAN', 'FEV']].plot(x='ANO', kind='barh', figsize=(12, 5), rot=45, fontsize=12)
· d)
df_etanol.loc[['ANO', 'JAN', 'FEV']].plot(x='ANO', kind='barh', rot=45, figsize=(12, 5), fontsize=12)
· e)
df_etanol['ANO', 'JAN', 'FEV'].plot(x='ANO', kind='bar', figsize=(12, 5), rot=45, fontsize=12)
5)
Uma visualização informativa serve principalmente ao relacionamento entre o leitor e os dados. Ele visa a uma apresentação neutra dos fatos de maneira a educar o leitor (embora não necessariamente o persuadir). As visualizações informativas são frequentemente associadas a amplos conjuntos de dados e buscam destilar o conteúdo de forma gerenciável e consumível. Idealmente, eles formam a maior parte das visualizações que a pessoa comum encontra no dia-a-dia, seja no trabalho, no jornal ou no site de um provedor de serviços (ILIINSKY e STEELE, 2011).
 
Sobre a biblioteca seaborn, avalie as asserções a seguir.
I. A biblioteca seaborn possui o método barplot(), que é usado para construir gráficos de barras. O parâmetro estimator=count é usado para construir uma barra contando a quantidade de elementos.
II.  O parâmetro "estimator" do método barplot(), possui como valor padrão a média, ou seja, para o dado selecionado, será exibida uma barra com a média dos valores.
III. O parâmetro estimator=len, usado no método barplot() cria o mesmo gráfico da função countplot().
Escolha a opção correta.
Alternativas:
· a)
Somente a asserção III está correta.
· b)
Somente as asserções I e II estão corretas.
· c)
Somente as asserções I e III estão corretas.
· d)
Somente as asserções II e III estão corretas.
Alternativa assinalada
· e)
Todas as asserções estão corretas.
Questão 1
Analise o código a seguir:
Anexo - Consulte a imagem em melhor resolução no final do cadernos de questões.
Agora, analise as afirmativas a seguir sobre o código apresentado:
I- Este código apresenta as palavras de p e a quantidade de letras respectivas de cada palavra;
II- A função len(w) analisa a quantidade de letras total de p;
III- O valor impresso para o usuário será: [gato, cachorro, olá];
Agora, assinale a alternativa que apresenta a resposta CORRETA: 
A)
 
Apenas as afirmativas II e III estão corretas;
B)
 
As afirmativas I, II e III estão corretas.
C)
 
Apenas a afirmativa II está correta;
D)
 
Apenas as afirmativas I e II estão corretas;
E)
 
Apenas a afirmativa I está correta;
Questão 2
O algoritmo de ordenação tem o objetivo de produzir uma nova sequência em que os elementos aparecem em ordem crescente ou descrescente. Analise as afirmativas a seguir sobre a ordenação:
I- O bubble sorte é um algoritmo de ordenação que que utiliza o método de divisão e conquista para criar a nova sequência de elementos;
II- O quick sort percorrer o vetor várias vezes, a cada passagem fazer a troca para o topo o maior/menor elemento da sequência.
III- O selection sort seleciona em cada iteração um elemento para ser inserido na sequência ordenada produzida.
Agora, assinale a alternativa que apresenta a resposta CORRETA: 
A)
 
As afirmativas I, II e III estão corretas.
B)
 
Apenas a afirmativa II está correta;
C)
 
Apenas a afirmativa III está correta;
D)
 
Apenas a afirmativa I está correta;
E)
 
Apenas as afirmativas II e III estão corretas;
Questão 3
______________, também conhecidas como subprogramas ou sub-rotinas, são pequenos blocos de código aos quais se dá um nome, desenvolvidos para resolver tarefas específicas.
Agora, assinale a alternativa que completa corretamente a lacuna:
A)
 
Funções Built-in;
B)
 
JSON;
C)
 
Objetos;
D)
 
Funções;
E)
 
Classes;
Questão 4
_____________ é um tipo sequencial em muitos aspectos semelhante à lista, porém, imutável como um string. Essas estruturas são definidas, atribuindo uma lista de dados separados por vírgulas ou, como é mais frequente, encapsulando os dados em parênteses. Uma vez criada, não pode ser modificada.
Agora, assinale a alternativa que completa corretamente a lacuna:
A)
 
A tupla;
B)
 
O set;
C)
 
A matriz;
D)
 
O dicionário;
E)
 
O range;
Questão 5
As estruturas de condição ou, estruturas condicionais, são muito comuns nas linguagens de programação. Elas são responsáveis por parte considerável das soluções propostas com código de programação. Em python, as estruturas condicionais se diferem das demais linguagens em um sentido: em python, para fazermos o famoso "senão se", ou else if como é conhecido, nós utilizamos um formatodiferente, que de certa forma, reduz o tamanho do código. Estamos falando do elif. Desse modo uma estrutura que trada de 3 ou mais condições, poderá ter if, elif e else. Qual das seguintes alternativas está apresentando corretamente a sintaxe de uma estrutura de condição escrita em Python:
A)
 
if condicao: instrucoes
B)
 
if condicao; {instrucoes}
C)
 
Nenhuma das alternativas
D)
 
if condicao: {instrucoes}
E)
 
if (condicao) {instrucoes}
Questão 6
Analise o código a seguir:
Anexo - Consulte a imagem em melhor resolução no final do cadernos de questões.
Agora, analise as afirmativas a seguir e marque V para verdadeiro e F para falso:
( ) A função está errada, pois o comando return só pode retornar um único valor;
( ) O interpretador encapsula os vários elementos de retorno em uma tupla que é atribuída ao identificador "s", o qual recebe o retorno da chamada da função;
( ) Os parâmetros X e Y são os valores digitados pelo usuário e atribuídos as variáveis a e b respectivamente;
Agora, assinale a alternativa que apresenta a sequência CORRETA:
A)
 
V-F-F;
B)
 
F-V-F;
C)
 
F-V-V;
D)
 
F-F-F;
E)
 
V-V-V;
Questão 7
Considere a linha de código em Python a seguir:
v = [i + 10 for i in range(5)]
O valor da variável v após a execução do código é:
A)
 
[10, 11, 12, 13, 14, 15]
B)
 
None
C)
 
[11, 12, 13, 14, 15, 16]
D)
 
[10, 11, 12, 13, 14]
E)
 
[11, 12, 13, 14, 15,]
Questão 8
Analise o trecho de código a seguir:
Anexo - Consulte a imagem em melhor resolução no final do cadernos de questões.
Assinale a alternativa correta que apresenta qual é a operação básica de banco de dados relacional que está apresentada no trecho do código anterior:
A)
 
Atualização (update);
B)
 
Criar (create);
C)
 
Deletar (delete);
D)
 
Consulta (read);
E)
 
Não é possível utilizar SQL com Python;
Questão 9
Sobre as estruturas de dados Lista em Python, analise as afirmativas a seguir:
I- Para acessar um elemento de uma posição específica de uma lista em Python deve-se percorrer toda a lista até a posição requerida, pois em Python as listas não possuem índices;
II- A função sort() ordenar a lista por valor;
III- A função index(elemento) descobre a posição de um elemento na lista;
Agora, assinale a alternativa que apresenta a resposta CORRETA: 
A)
 
Apenas a afirmativa I está correta;
B)
 
Apenas as afirmativas II e III estão corretas;
C)
 
Apenas as afirmativas I e II estão corretas;
D)
 
Apenas a afirmativa II está correta;
E)
 
As afirmativas I, II e III estão corretas.
Questão 10
Analise a descrição de um algoritmo de ordenação:
Este algoritmo seleciona em cada iteração um elemento para ser inserido na sequência ordenada produzida.
Agora, assinale a alternativa que apresenta o algoritmo anterior:
A)
 
Insertion sort;
B)
 
Bubble sort;
C)
 
Merge sort;
D)
 
Selection sort;
E)
 
Quick sort;
Questão 11
Analise a função em Pyhton a seguir:
Anexo - Consulte a imagem em melhor resolução no final do cadernos de questões.
Sobre o trecho de código anterior, analise as afirmativas a seguir e marque V para verdadeiro e F para falso.
( ) É preciso utilizar o operador "*" para informar ao interpretador que a lista deve ser desempacotada.
( ) Esta função deve ser obrigatoriamente chamada pela função main.
( ) Esta função está errada, pois não especifica a quantidade de parâmetros que deve ser passado para a função.
Agora, assinale a alternativa que apresenta a sequência CORRETA:
A)
 
F-V-V;
B)
 
V-V-V;
C)
 
F-V-F;
D)
 
V-F-F;
E)
 
F-F-F;
Questão 12
Relacione as bibliotecas de Python a seguir com a sua respectiva descrição:
I- NumPy;
II- Pandas;
III- Math;
1- Biblioteca relacionada com funções matemáticas;
2- Esta biblioteca é utilizada para o processamento de matrizes;
3- Utilizada para a análise de dados.
A seguir, assinale a alternativa que contém a sequência correta da associação:
A)
 
I-3; II-2; III-1;
B)
 
I-2; II-3; III-1;
C)
 
I-1; II-2; III-3;
D)
 
I-2; II-1; III-3;
E)
 
I-3; II- 1; III-2;
image6.png
image7.png
image8.png
image9.png
image10.png
image11.png
image12.png
image13.png
image14.png
image15.png
image16.png
image17.png
image18.png
image19.png
image20.png
image21.png
image22.png
image23.png
image24.png
image25.png
image26.png
image27.jpeg
image28.png
image29.png
image30.png
image31.png
image32.png
image1.png
image33.png
image34.png
image35.png
image36.png
image37.png
image38.png
image39.png
image40.png
image41.png
image2.png
image42.png
image43.png
image44.png
image45.png
image46.png
image3.png
image4.png
image5.png

Mais conteúdos dessa disciplina