<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 [Py-Intro] Aula 03
Tipos básicos
O que você vai aprender nesta aula?
Após o término da aula você terá aprendido
Step1:  Tamanho da lista
Step2:  Concatenando listas
Step3:  Para modificar a lista é necessário usar +=
Step4:  Para anexar elementos no final da lista pode-se usar list.append()
Step5:  É possível ter listas aninhadas
Step6:  É possível repetir uma lista usando o operador *
Step7:  Funções de lista
lista.insert(i, x) - Insere um item em uma posição
Step8:  list.remove(i) ou del list[i] - Remove um item de uma posição
Step9:  list.pop([i]) - Remove o item na posição e o retorna. Se nenhum item é fornecido o último é removido. (os colchetes em volta do indicam que esse parâmetro é opcional)
Step10:  lista.extend(L) - Extende a lista anexando todos os elementos de L à lista.
Step11:  lista.index(x) - Fornece o índice (ou posição) do elemento x na lista
Step12:  lista.count(x) - Conta a quantidade de ocorrências do elemento x na lista
Step13:  lista.sort() - Ordena a lita in-place. Para saber mais sobre operações in-place veja este post do Rafael Correia.
Step14:  sorted() - ordena sequências sem ser in-place
Step15:  lista.reverse() - reverte a ordem da lista in-place.
Step16:  reversed() - reverte a ordem de uma sequência. Não é in-place.
Step17:  Iterando listas
Step18:  Iteração ao contrário
Step19:  Iteração de uma sequência de números
Step20:  Mais sobre a fução range(inicio, fim, passo) que gera uma lista de números começando de início, indo até fim, andando "passo" vezes.
Seu uso é demonstrado a seguir
Step21:  Iteração pelos índices
Step22:  List comprehension
List comprehension fornece uma maneira simples de de criar listas. É geralmente utilizada para criar novas listas que os elementes resultantes vem de operações aplicadas em cima da lista original. Também pode ser usada para criar sublistas desses elementos que satisfaçam certa condição.
Por exemplo para conseguir uma lista de quadrados a partir de uma lista de números
Step23:  Usando list comprehensions fica assim
Step24:  Números ímpares
Step25:  É o mesmo que
Step26:  Cuidado!
Tome cuidado ao criar listas de listas usando repetição de listas com o operador *
Step27:  Isso acontece pois a lista interna é criada apenas uma vez, quando o correto é criar 10 listas. Uma maneira elegante de fazer isso corretamente é usando list comprehension
Step28:  No exemplo anterior aprendemos como declarar uma matriz vazia, porém caso queiramos criar uma matriz de tamanho fixo populadas por um valor padrão usamos aninhamento de list comprehension.
Para criar uma matriz 5x5 preenchida com zero
Step29:  Exercícios
Complete a função para calcular a soma de uma lista de números dada
Step30:  Complete a função pra encontrar o menor (mínimo) valor de uma lista
Step31:  Agora que você já fez esses maravilhosos exercícios, vamos ver algumas funções úteis do Python
Step32:  min(sequencia) e max(sequencia) - retorna, respectivamente, o elemento mínimo e máximo da sequência dada
Step33:  all(sequencia) - retorna True se todos os valores da sequência forem verdadeiros
Step34:  any(sequencia) - retorna True se algum dos valores da sequência for verdadeiro
Step35:  round(numero, casas) - Arredonda um número para a quantidade de casas fornecido à função
Step36:  Extra
Step37:  Exemplos
Usando as funções apresentadas é simples calcular a médida de, por exemplo, uma lista de notas
Step38:  Mais fácil que
Step39:  Agora vamos separar as notas em duas listas, uma de aprovados (nota >= 5) e outra de reprovados
Step40:  Com list comprehension fica fácil filtrar os arquivos .txt de um diretório. Para isso usaremos a função listdir() do módulo os que lista todos os arquivos de um diretório e a função str.endswith() de strings que compara o final da string com uma substring.
Step41:  Suponhamos que administramos um sistema de gerenciamento de arquivos e um usuário envia 5 arquivos pesados. Precisamos verificar se esses arquivos cabem no espaço livre do sistema de arquivos para não dar problemas no servidor. Além disso também precisamos calcular a porcentagem de uso do espaço que cada arquivo ocupa.
Supondo que o sistema de arquivos esteja livre (ou seja, o espaço livre é o espaço total) essa verificação pode ser feita assim
Step42:  Esses arquivos cabem no espaço fornecido?
Step43:  Esses arquivos ocupam mais que 100% do espaço, então não cabe.
Exercícios
Escreva uma função que receba um diretório (ou seu caminho relativo como no exemplo anterior) e liste os arquivos com a extensão oferecida.
Step44:  Para testar essa função precisariamos usar mock para mudar o efeito da função os.listdir(), portanto dessa vez você mesmo terá que testar sua função.
Escreva uma função que gere uma matriz. Essa função deve receber os argumentos m e n que representam o tamanho da matriz e um argumento default para que essa matriz seja inicializada com esses valores
Step45:  Tuplas
Tupla é uma sequência imutável. Ela pode ser usada como listas imutáveis ou como registros sem nomes de campos.
Step46:  Tuplas não podem ser modificadas
Step47:  Tuplas também podem ser criadas sem o parêntes, pois o que realmente as define são as vírgulas
Step48:  É o mesmo que
Step49:  Slices também funcionam em tuplas
Step50:  Podemos fazer listas de tuplas para armazenar informações que não mudam, como
Step51:  Por ser uma sequência a tupla suporta diversas operações como
Step52:  Tuplas podem ser aninhadas
Step53:  Tuplas podem conter objetos mutáveis como listas
Step54:  Os objetos mutáveis dentro da tupla podem ser modificados
Step55:  Mas não a tupla
Step56:  "Mágica" do Python
Step57:  Iso permite iterar sequências de uma maneira mais semântica, conforme exemplo a seguir.
Como é feito normalmente
Step58:  Usando o empacotamento de tuplas
Step59:  Ou ainda
<ASSISTANT_TASK:>
Python Code:
numeros = [1, 2, 3, 4]
numeros
Explanation: [Py-Intro] Aula 03
Tipos básicos
O que você vai aprender nesta aula?
Após o término da aula você terá aprendido:
Como manipular listas e tuplas
Listas
Na aula passada vimos o básico de lista, o objetivo desta seção é se aprofundar um pouco mais nos usos de lista.
End of explanation
len(numeros)  # a função len funciona para todas as sequências
Explanation: Tamanho da lista:
End of explanation
numeros + [5, 6, 7, 8]
numeros
Explanation: Concatenando listas:
End of explanation
numeros += [5, 6, 7, 8]
numeros
Explanation: Para modificar a lista é necessário usar +=:
End of explanation
numeros
numeros.append(9)
numeros
Explanation: Para anexar elementos no final da lista pode-se usar list.append():
End of explanation
aninhada = [1, 2, 3, [4, 5, 6]]
aninhada
aninhada[3]
aninhada[3][2]
Explanation: É possível ter listas aninhadas:
End of explanation
zeros = [0] * 10
zeros
[1, 2, 3] * 5
Explanation: É possível repetir uma lista usando o operador *:
End of explanation
lista = [1, 2, 4, 5]
lista
lista.insert(2, 3)
lista
Explanation: Funções de lista
lista.insert(i, x) - Insere um item em uma posição:
End of explanation
lista = [1, 2, 3, 4, 5]
del lista[0]
lista
lista.remove(3)
lista
Explanation: list.remove(i) ou del list[i] - Remove um item de uma posição
End of explanation
lista = [1, 2, 3, 4, 5]
lista.pop()
lista
lista.pop(0)
lista
Explanation: list.pop([i]) - Remove o item na posição e o retorna. Se nenhum item é fornecido o último é removido. (os colchetes em volta do indicam que esse parâmetro é opcional)
End of explanation
lista = [1, 2, 3]
lista
lista.extend([4, 5, 6])
lista
Explanation: lista.extend(L) - Extende a lista anexando todos os elementos de L à lista.
End of explanation
lista = [1, 2, 3, 4, 5]
lista.index(3)
lista.index(5)
Explanation: lista.index(x) - Fornece o índice (ou posição) do elemento x na lista
End of explanation
lista = [1, 1, 2, 3, 3, 3]
lista.count(2)
lista.count(1)
lista.count(3)
Explanation: lista.count(x) - Conta a quantidade de ocorrências do elemento x na lista
End of explanation
lista = [3, 1, 7, 0, 6]
lista
lista.sort()  # ordena lista in-place
lista
Explanation: lista.sort() - Ordena a lita in-place. Para saber mais sobre operações in-place veja este post do Rafael Correia.
End of explanation
lista = [8, 2, 4, 1, 3]
sorted(lista)  # ordena lista
lista  # sorted não altera o valor da lista
s = 'dcba'
sorted(s)  # ordena todas as sequências e não só listas
Explanation: sorted() - ordena sequências sem ser in-place
End of explanation
lista = [1, 2, 3, 4, 5]
lista.reverse()  # reverte a lista in-place
lista
Explanation: lista.reverse() - reverte a ordem da lista in-place.
End of explanation
lista = [1, 2, 3, 4, 5]
list(reversed(lista))
lista
s = 'abcdefg'
list(reversed(s))  # reverted todas as sequências e não só listas
Explanation: reversed() - reverte a ordem de uma sequência. Não é in-place.
End of explanation
numeros = [1, 2, 3, 4, 5]
for num in numeros:
    print(num)
Explanation: Iterando listas:
End of explanation
lista = ['sou uma string', -1.5, 10, 'outra string', False]
for elemento in reversed(lista):  # usamos a função reversed!
    print(elemento)
Explanation: Iteração ao contrário:
End of explanation
for i in range(5):
    print(i)
Explanation: Iteração de uma sequência de números:
End of explanation
intervalo = range(5, 10)  # intervalo de 5 a 9
list(intervalo)
intervalo = range(0, 50, 5)  # intervalo de 0 a 50 de 5 em 5
list(intervalo)
intervalo = range(-10, -50, -7)  # intervalo de -10 a -50
list(intervalo)
Explanation: Mais sobre a fução range(inicio, fim, passo) que gera uma lista de números começando de início, indo até fim, andando "passo" vezes.
Seu uso é demonstrado a seguir:
End of explanation
lista = ['Estou', 'sem', 'criativdade', 'para', 'criar', 'lista']
for i in range(len(lista)):
    print(i, lista[i])
Explanation: Iteração pelos índices:
End of explanation
numeros = [1, 2, 3, 4, 5, 6, 7]
quadrados = []
for numero in numeros:
    quadrados.append(numero ** 2)
quadrados
Explanation: List comprehension
List comprehension fornece uma maneira simples de de criar listas. É geralmente utilizada para criar novas listas que os elementes resultantes vem de operações aplicadas em cima da lista original. Também pode ser usada para criar sublistas desses elementos que satisfaçam certa condição.
Por exemplo para conseguir uma lista de quadrados a partir de uma lista de números:
End of explanation
numeros = [1, 2, 3, 4, 5, 6, 7]
quadrados = [numero ** 2 for numero in numeros]  # mais legível
quadrados
Explanation: Usando list comprehensions fica assim:
End of explanation
numeros = [1, 2, 3, 4, 5, 6, 7]
impares = [numero for numero in numeros if numero % 2 == 1]
impares
Explanation: Números ímpares:
End of explanation
numeros = [1, 2, 3, 4, 5, 6, 7]
impares = []
for numero in numeros:
    if numero % 2 == 1:
        impares.append(numero)
impares
Explanation: É o mesmo que:
End of explanation
matriz = [[]] * 5
matriz
matriz[0].extend([3, 1])
matriz
matriz[2].pop()
matriz
Explanation: Cuidado!
Tome cuidado ao criar listas de listas usando repetição de listas com o operador *:
End of explanation
matriz = [[] for _ in range(5)]
matriz
matriz[0].extend([3, 1])
matriz
matriz[0].pop()
matriz
Explanation: Isso acontece pois a lista interna é criada apenas uma vez, quando o correto é criar 10 listas. Uma maneira elegante de fazer isso corretamente é usando list comprehension:
End of explanation
[[0 for _ in range(5)] for _ in range(5)]
Explanation: No exemplo anterior aprendemos como declarar uma matriz vazia, porém caso queiramos criar uma matriz de tamanho fixo populadas por um valor padrão usamos aninhamento de list comprehension.
Para criar uma matriz 5x5 preenchida com zero:
End of explanation
def soma(numeros):
    soma = 0
    for numero in numeros:
        soma += numero
    return soma
# Testes para verificar a corretude da função soma
assert soma([3021.833, 8787.958, 8701.609, 9607.527, 2105.801]) == 32224.728000000003
assert soma([8612.141, -5273.932]) == 3338.209
assert soma([-8369.594, -5766.904, 7128.654]) == -7007.843999999999
assert soma([-6493.119, 647.921, -1889.898, 2814.045, 1443.082, -9671.503]) == -13149.472
assert soma([-4065.074, 8418.62]) == 4353.546
assert soma([2647.4, -3745.222, -1967.752]) == -3065.574
assert soma([-462.477, -4756.437, -6841.597]) == -12060.510999999999
assert soma([-9049.308, -8559.362]) == -17608.67
assert soma([-1311.291, 3207.467, -2685.757, 7758.034, 6556.007, 5677.477]) == 19201.936999999998
assert soma([7592.047, 8226.455, 5889.92, 3802.669]) == 25511.091
Explanation: Exercícios
Complete a função para calcular a soma de uma lista de números dada:
End of explanation
def minimo(numeros):
    minimo = numeros[0]
    for numero in numeros[1:]:
        if numero < minimo:
            minimo = numero
    return minimo
# Testes para verificar a corretude da função soma
assert minimo([-6473.695, 438.199, 7959.093, 7842.664, 7233.021, -4149.884]) == -6473.695
assert minimo([6505.843, -7075.108]) == -7075.108
assert minimo([9151.244, -4605.586, -2920.8]) == -4605.586
assert minimo([-6586.813, -2264.44, 4460.277]) == -6586.813
assert minimo([1553.196, 1631.333]) == 1553.196
assert minimo([6876.253, 9349.21, -382.322]) == -382.322
assert minimo([9604.147, -378.112, 2574.795, -5597.589, 8751.16]) == -5597.589
assert minimo([2761.954, 4439.859, 9361.367, 884.972]) == 884.972
assert minimo([2989.882, 346.282, 9051.012, 4973.448, 1821.907]) == 346.282
assert minimo([4996.027, -5269.592]) == -5269.592
Explanation: Complete a função pra encontrar o menor (mínimo) valor de uma lista:
End of explanation
numeros = [1, 2, 3, 4]
sum(numeros)
numeros = [684.97, 514.68, 475.69, 194.07]
sum(numeros)
Explanation: Agora que você já fez esses maravilhosos exercícios, vamos ver algumas funções úteis do Python:
sum(sequencia) - retorna a soma de uma sequência de números
End of explanation
numeros = [1, 2, 3, 4]
min(numeros)
max(numeros)
min('abracadabra')
max('abracadabra')
Explanation: min(sequencia) e max(sequencia) - retorna, respectivamente, o elemento mínimo e máximo da sequência dada
End of explanation
seq = [True, True, False, False, True]
all(seq)
seq = [True] * 10
seq
all(seq)
numeros = [-2, 9, 0, 4, -7]
all(numeros)
Explanation: all(sequencia) - retorna True se todos os valores da sequência forem verdadeiros
End of explanation
seq = [False, True, False, False, True]
any(seq)
seq = [False] * 10
seq
any(seq)
numeros = [0, 9, 0, 0, -7]
any(numeros)
Explanation: any(sequencia) - retorna True se algum dos valores da sequência for verdadeiro
End of explanation
import random
random.random()  # gera um número aleatório entre 0 e 1
numero = random.random() * 1000  # multiplica por 1000 para gerar um número com 3 dígitos significantes
numero
round(numero, 2)
round(numero, 5)
Explanation: round(numero, casas) - Arredonda um número para a quantidade de casas fornecido à função
End of explanation
numero = 431637
round(numero, -1)
round(numero, -2)
round(numero, -3)
Explanation: Extra: também é possível arredondar os dígitos significatios especificando uma quantidade negativa de casas:
End of explanation
# gerando aleatóriamente as notas
import random
notas = [random.random() * 10 for i in range(5)]  # gera 5 notas aleatórias
notas = [round(nota, 1) for nota in notas]  # arredonda as notas para 1 casa decimal
notas
media = sum(notas) / len(notas)
media
Explanation: Exemplos
Usando as funções apresentadas é simples calcular a médida de, por exemplo, uma lista de notas:
End of explanation
soma_notas = 0
for nota in notas:
    soma_notas += nota
soma_notas / len(notas)
Explanation: Mais fácil que:
End of explanation
aprovados = [nota for nota in notas if nota >= 5]
aprovados
reprovados = [nota for nota in notas if nota < 5]
reprovados
Explanation: Agora vamos separar as notas em duas listas, uma de aprovados (nota >= 5) e outra de reprovados
End of explanation
import os
os.listdir('..')  # pegando arquivos do diretório acima do diretório deste notebook
[nome for nome in os.listdir('..') if nome.endswith('.txt')]
Explanation: Com list comprehension fica fácil filtrar os arquivos .txt de um diretório. Para isso usaremos a função listdir() do módulo os que lista todos os arquivos de um diretório e a função str.endswith() de strings que compara o final da string com uma substring.
End of explanation
espaço_total = 1500000  # espaço livre total do sistema de arquivos em KB
tamanhos_arquivos = [388428.5, 189310.1, 310710.3, 160701, 898853.6]  # tamanhos em KB dos arquivos enviados pelo usuário
porcentagens_uso = [tamanho / espaço_total for tamanho in tamanhos_arquivos]
porcentagens_uso = [round(porcentagem * 100, 2) for porcentagem in porcentagens_uso]
porcentagens_uso
Explanation: Suponhamos que administramos um sistema de gerenciamento de arquivos e um usuário envia 5 arquivos pesados. Precisamos verificar se esses arquivos cabem no espaço livre do sistema de arquivos para não dar problemas no servidor. Além disso também precisamos calcular a porcentagem de uso do espaço que cada arquivo ocupa.
Supondo que o sistema de arquivos esteja livre (ou seja, o espaço livre é o espaço total) essa verificação pode ser feita assim:
End of explanation
sum(porcentagens_uso) <= 100
Explanation: Esses arquivos cabem no espaço fornecido?
End of explanation
def lista_arquivos_por_extensao(diretorio, extensao):
    ...
Explanation: Esses arquivos ocupam mais que 100% do espaço, então não cabe.
Exercícios
Escreva uma função que receba um diretório (ou seu caminho relativo como no exemplo anterior) e liste os arquivos com a extensão oferecida.
End of explanation
def gera_matriz(m, n, default):
    ...
Explanation: Para testar essa função precisariamos usar mock para mudar o efeito da função os.listdir(), portanto dessa vez você mesmo terá que testar sua função.
Escreva uma função que gere uma matriz. Essa função deve receber os argumentos m e n que representam o tamanho da matriz e um argumento default para que essa matriz seja inicializada com esses valores
End of explanation
coordenadas = (40.716667, -74)
coordenadas
type(coordenadas)
coordenadas[0]
coordenadas[1]
Explanation: Tuplas
Tupla é uma sequência imutável. Ela pode ser usada como listas imutáveis ou como registros sem nomes de campos.
End of explanation
coordenadas[0] = 10.5931
Explanation: Tuplas não podem ser modificadas:
End of explanation
tupla = 'a', 'b', 'c', 'd'
tupla
Explanation: Tuplas também podem ser criadas sem o parêntes, pois o que realmente as define são as vírgulas:
End of explanation
tupla = ('a', 'b', 'c', 'd')
tupla
Explanation: É o mesmo que:
End of explanation
tupla[:2]
Explanation: Slices também funcionam em tuplas:
End of explanation
cidades = [
    ('Nova Iorque', 'E.U.A', (40.716667, -74)),
    ('Tóquio', 'Japão', (35.683333, 139.683333)),
    ('São Paulo', 'Brasil', (-23.547778, -46.635833))
]
cidades
cidades[1]
cidades[1][1]
Explanation: Podemos fazer listas de tuplas para armazenar informações que não mudam, como:
End of explanation
tupla = ('Abc', False, 100)
for item in tupla:
    print(item)
all(tupla)
any(tupla)
valores = (34, 40.1, -10.404)
sum(valores)
min(valores)
max(valores)
len(valores)
Explanation: Por ser uma sequência a tupla suporta diversas operações como:
End of explanation
dados = ('Cidadopolis', 'Paisópolis')
cidade = dados, (40.716667, -74)  # aninha a dados e coordenada dentro da tupla cidade
cidade
Explanation: Tuplas podem ser aninhadas:
End of explanation
t = ([1, 2, 3], [3, 2, 1])
t
Explanation: Tuplas podem conter objetos mutáveis como listas:
End of explanation
t[0][0] = 100
t
t[1][2] = -5
t
Explanation: Os objetos mutáveis dentro da tupla podem ser modificados:
End of explanation
t[0] = [1, 2, 3]
Explanation: Mas não a tupla:
End of explanation
cidade = ('Nova Iorque', 'E.U.A', (40.716667, -74))
cidade
nome, pais, coordenadas = cidade
nome
pais
coordenadas
Explanation: "Mágica" do Python: desempacotamento de tuplas
End of explanation
cidades = [
    ('Nova Iorque', 'E.U.A', (40.716667, -74)),
    ('Tóquio', 'Japão', (35.683333, 139.683333)),
    ('São Paulo', 'Brasil', (-23.547778, -46.635833))
]
for cidade in cidades:
    print(cidade[1])
Explanation: Iso permite iterar sequências de uma maneira mais semântica, conforme exemplo a seguir.
Como é feito normalmente:
End of explanation
for nome, pais, coordenadas in cidades:
    print(pais)
Explanation: Usando o empacotamento de tuplas:
End of explanation
cidades
for nome, pais, (x, y) in cidades:
    print(pais)
for nome, pais, (x, y) in cidades:
    print(x)
Explanation: Ou ainda:
End of explanation
<END_TASK>