<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 01
Instalando Python, introdução a bibliotecas e estruturas de dados
O que você vai aprender nesta aula?
Após o término da aula você terá aprendido
Step1:  Agora é hora de por as mãos na massa! Vamos do começo
Step2:  Agora vamos fazer uma requisição HTTP ao Github para baixar o conteúdo do repositório deste curso (através da URL https
Step3:  200 é o código de resposta que informa que a requisição foi bem sucedida (ou OK).
PS
Step4:  O atributo headers de response (response.headers) nos trouxe os cabeçalhos em forma de um dicionário (ou dict). O dict é uma estrutura de dados do Python utilizada para armazenar informações na forma de chave e valor envoltas por chaves {}. Dicts serão explicados mais para frente.
Por motivos técnicos a saída foi apresentada em um formato difícil de ler, para melhorá-la podemos fazer um pequeno workaround
Step5:  Para acessar um cabeçalho específico por sua chave fazemos
Step6:  Como visto anteriormente a biblioteca requests permite o envio de requisições HTTP de maneira extremamante fácil. Para obter mais informações sobre a requests acesse a doumentação oficial.
Agora que já aprendemos o básico podemos partir para um exemplo mais interessante.
Acessando os dados da API do github
O Github oferece uma API que fornece dados de seus repositórios públicos. São dadas informações como quantos projetos estão cadastrados na plataforma, quantos contribuidores trabalharam em quais repositórios, a quais organizações essas fazem parte e muito mais. (mais informações na documentação oficial)
O acesso aos dados dessa API é feito através do envio de requisições HTTP para diferentes caminhos na URL base https
Step7:  A resposta trouxe todos os repositórios do usuário lamenezes em uma string no padrão JSON.
Essa string não é interessante para nós, pois é difícil acessar dados específicos do JSON através dela. Seria muito melhor para nós se essa resposta fosse traduzida para um dicionário do Python (que possui sintaxe muito parecida com o JSON).
Normalmente teríamos que importar a biblioteca json e realizar a conversão, no pior caso poderia ser necessário escrever um parser específico para tratar casos especiais.
No entanto, a biblioteca requests já faz esse trabalho para nós
Step8:  A resposta nos trouxe uma lista de dicionários com as informações dos repositórios do usuário lamenezes. Agora fica a dúvida
Step9:  Listas podem armazenar qualquer tipo de dados
Step10:  Fazemos assim para verificar se um elemento faz parte de uma lista
Step11:  Para saber o tamanho de uma lista basta usar a função len()
Step12:  Para remover elementos de uma lista existe a palavra reservada del que é utilizada assim
Step13:  Iterar uma lista é simples
Step14:  O for do Python, diferentemente de outras linguagens como C e Java, faz o controle dos índices internamente.
Vamos fazer mais um exemplo para deixar claro
Step15:  A função range(inicio, fim) cria listas de valores no intervalo de inicio até fim - 1. Ao lidar com intervalos no python o primeiro número é sempre incluso e o último excluído. Segue alguns exemplos de uso da função range()
Step16:  Exercício
Crie uma lista de números de 2 a 8 e imprima cada número vezes pi. Substiua os ... por código python.
Step17:  Exercicio
Crie uma lista de preços de produtos em dólar (somente números) e imprima seu valor convertido para reais.
Step18:  Dicionários
Dicionários são estruturas de dados utilizadas para armazenar conjuntos de chaves e valores. Em algumas linguagens também são conhecidos como mapaemento.
A diferança de uso entre lista e dicionáro é que o último é acessado por chaves e não pela posição. As chaves podem ser inteiros, strings, booleanos e tuplas (este será visto na próxima aula).
A seguir temos alguns simples exemplos de uso de diconários.
Criar um dict é simples
Step19:  Para acessar os elementos basta usar sua chave
Step20:  Para alterar algum valor fazemos
Step21:  Verificamos se uma chave existe no dicionário da seguinte maneira
Step22:  Para acessar somente as chaves fazemos
Step23:  Para acessar somente os valores
Step24:  Para ter uma lista contendo as chaves e valores
Step25:  Para iterar dicionáros é preciso ter cuidado. Por padrão as chaves do dicionário são iteradas
Step26:  Caso você queira imprimir os valores é preciso usar notas.values()
Step27:  Para iterar tanto a chave quanto o valor use a função notas.items() como mostrado a seguir
Step28:  Para ficar mais claro podemos mudar os nomes das variáveis e para ficar mais inteligível formatar a saída
Step29:  Como visto acima o notas.items() retorna uma lista de chaves e valores. Por esse motivo a cada iteração temos acesso a cada chave e valor do dicionário notas, tornando possível essa iteração mais simples e semântica.
Agora que já temos uma noção das estruturas de dados utilizadas, podemos continuar a visualizar as informações dos repositórios do github
Step30:  Também temos os dados do dono (owner) do repositório
Step31:  'owner' é um dicionário dentro do dicionário do repositório (sim, é possível guardar dicionários dentro de dicionários)
Também podemos acessar as informações diretamente sem recorrer à variável intermediária dono
Step32:  Exercicios
Quantos repositórios o usuário lamenezes possui?
Lembrando que esses repositórios estão armazenados na lista repositorios
Step33:  Imprima as URLs de todos os repositórios
Step34:  Para os próximos exercícios será necessáro pegar os repositórios do usuário gvanrossum. Use a biblioteca requests e faça uma requição à API do github (https
Step35:  Agora pegue o conteúdo da resposta em formato JSON e atribua à variável repos
Step36:  Imprima o nome e descrição de todos os repositórios do gvanrossum
Step37:  Quantos forks o repositório gvanrossum/asyncio possui?
Step38:  Qual o link do perfil do dono dos repositórios?
<ASSISTANT_TASK:>
Python Code:
import this
Explanation: [Py-Intro] Aula 01
Instalando Python, introdução a bibliotecas e estruturas de dados
O que você vai aprender nesta aula?
Após o término da aula você terá aprendido:
- Informações úteis sobre a linguagem Python
- Instalar o python
- O que é o Jupyter Notebook, como instalá-lo e rodá-lo 
- Usar o ambiente virtual
- Instalar bibliotecas
- Acessar páginas usando Python
- Estruturas de dados do Python: listas e dicionários
Sobre a linguagem Python
Se você já conhece a linguagem e está animado em aprendê-la já pode seguir para a próxima seção.
Se, mesmo assim, você ainda estiver curioso para saber mais sobre Python fique convidado a ler os próximos parágrafos.
Python é uma linguagem simples, enxuta e poderosa. Com poucas linhas e sintaxe clara é possível executar tarefas complexas. Essa característica se dá, pois os tipos de dados de alto nível permitem fazer operações complexas de uma única vez, além de não ser necessário declarar variáveis ou tipos dos argumentos.
Python vem com pilhas inclusas. Em sua biblioteca padrão há soluções para diversos tipos de problemas recorrentes, como:
- Interface gráfica (tkinter)
- Internet (requisições HTTP, email, sockets etc.)
- Data, hora e calendário
- Acesso a arquivos e pastas
- Execução de outras aplicações/processos
- E muito mais: https://docs.python.org/3/library/
A linguagem foi criada em 1991 e desde então vem crescendo constantemente ano a ano, tanto no quesito de número de usuário quanto em atualizações e melhorias do interpretador e da linguagem em si. Atualmente Python está na versão 3.5 que trouxe várias features interessantes que podem ser conferidas aqui.
Muitas empresas como Google, Facebook, Mozilla, Microsoft, Intel, IBM, Globo e Magazine Luiza usam Python em produtos como Instagram, YouTube e o g1 (portal de notícias da globo).
PS: Dica para vida: os patrocinadores de grandes eventos como, por exemplo PyCon 2015 e 2016,  usam e estão patrocinando a linguagem. E isso também vale para qualquer outra tecnlogia.
Python é uma linguagem interpretada, ou seja, seu código-fonte executado diretamente pelo interpretador, sem precisar de compilar o programa em instruções de linguagem de máquina.
PS: para agilizar a execução de módulos o interpretador do Python cria caches. Para saber mais, veja: “Compiled” Python files
Por ser interpretada a Python ganha diversas vantagens, como:
- Ganho de tempo por não precisar compilar/linkar o programa
- Interpretador pode ser usado de forma interativa tornando possível realizar testes e experimentos
- Este "caderno" - o jupyter notebook
A linguagem possui 20 príncipios que guiam seu desenvolvimento e podem ser conferidos rodando o seguinte comando:
End of explanation
import requests
Explanation: Agora é hora de por as mãos na massa! Vamos do começo:
Instalando o Python 3.5
Caso você já tenha o Python 3.5 siga para a próxima sessão!
Debian e derivados (ubuntu, mint etc.)
$ sudo apt-get install python3.5
Windows e OS X
https://www.python.org/downloads/
Caso você esteja usando o windows não esqueça de marcar a opção: "Add Python.exe to Path", como mostrado na seguinte imagem:
<center>(imagem retirada do Django Girls Tutorial)</center>
Virtualenv (Ambiente virtual)
O virtualenv é uma ferramenta que serve para manter as dependências de projetos diferentes em pastas separadas, desse modo é possível trabalhar me um projeto usando, por exemplo, o Django 1.9 enquanto se mantém um projeto antigo que usa a versão 1.5 do framework.
O virtualenv cria uma pasta contendo todas as dependências que um projeto Python necessita.
O virtualenv já vem instalado no Python 3.5, para criar um novo ambiente faça:
Linux e Mac
$ python3.5 -m venv env
Windows
Abra o programa de linha de comando do Windows e digite o comando abaixo. Isso pode ser feito apertando o botão do windows + R, digitando cmd e apertando ENTER.
&gt; C:\Python3.5\python -m venv env
Esse comando criará uma pasta chamada env/ contendo os executáveis do Python e uma cópia do pip para instalar outros pacotes. Vale lembrar que o nome do ambiente virtual env pode ser trocado por qualquer outro.
Para usar o virtualenv é necessário antes que ele seja ativado:
Linux e Mac
$ source env/bin/activate
Windows
&gt; env\Scripts\activate
Para sair de um ambiente virtual use o comando deactivate.
Agora nosso ambiente virtual está pronto para ser usado!
Instalando pacotes com o pip
O pip permite instalar pacotes Python (listados no PyPI: the Python Package Index) de forma fácil. O pip significa "pip install packages" (ou pip instala pacotes).
Por exemplo, vamos instalar a biblioteca requests que usaremos mais para frente nesta aula:
(env) $ pip install requests
Jupyter Notebook
O Jupyter Notebook é uma aplicação web que permite a criação e compatilhamento de documentos (notebooks) que contém código ao vivo, equações, visualizações e textos explanatórios. Ele é muito utilizado para transformação de dados, modelagem estatística, simulação numérica, aprendizado de máquina e ensino.
Para rodá-lo em sua máquina é preciso: instalar, rodar o servidor e acessr pelo navegador! É mais simples do que parece, vamos fazer esses passos.
Instalando
Vamos instalar o jupyter notebook executando o seguinte comando:
(env) $ pip install jupyter[notebook]
No linux
Caso não seja possível instalar o jupyter[notebook] rode:
$ sudo apt-get install build-essential python3.5-dev
    (env) $ pip install --upgrade pip
    (env) $ pip install jupyter[notebook]    
Rodando
Não esqueça de baixar este documento (Aula01.ipynb) e rodar o jupyter notebook na mesma pasta.
Para rodá-lo e tornar possivel o acesso do notebook pelo navegador, execute o seguinte comando:
(env) $ jupyter notebook
Agora é só acessar a página http://localhost:8888/notebooks (que deve ter sido aberta automaticamente) e abrir o notebook Aula01.ipynb que já estamos prontos para codificar!
Para rodar um código específico clique na caixa do código e pressione CTRL+Enter
Acessando páginas web
Nosso primeiro exemplo será criar o código de uma aplicação que nos permite baixar o código-fonte de sites.
Para isso vamos usar a biblioteca requests que foi instalada em um passo anterior (caso você não tenha instalado rode pip install requests).
Primeiro preciamos importar a requests:
End of explanation
url = 'https://github.com/lamenezes/python-intro'  # não é necessário declarar variáveis em python
response = requests.get(url)  # e nem especificar seu tipo
response.status_code
Explanation: Agora vamos fazer uma requisição HTTP ao Github para baixar o conteúdo do repositório deste curso (através da URL https://github.com/lamenezes/python-intro):
End of explanation
print(response.headers)
Explanation: 200 é o código de resposta que informa que a requisição foi bem sucedida (ou OK).
PS: No curso de Desenvolvimento Web com Django será explicado com calma como funciona o protocolo HTTP.
Agora vamos analisar os cabeçalhos dessa resposta:
End of explanation
dict(response.headers)
Explanation: O atributo headers de response (response.headers) nos trouxe os cabeçalhos em forma de um dicionário (ou dict). O dict é uma estrutura de dados do Python utilizada para armazenar informações na forma de chave e valor envoltas por chaves {}. Dicts serão explicados mais para frente.
Por motivos técnicos a saída foi apresentada em um formato difícil de ler, para melhorá-la podemos fazer um pequeno workaround:
End of explanation
response.headers['content-type']
response.headers['date']
response.text[:1000]  # retorna os 1000 primeiros caracteres do conteúdo da resposta
Explanation: Para acessar um cabeçalho específico por sua chave fazemos:
End of explanation
response = requests.get('https://api.github.com/users/lamenezes/repos')
response.status_code
response.text[:1000]  # pegando os primeiros 1000 caracters do conteúdo da resposta
Explanation: Como visto anteriormente a biblioteca requests permite o envio de requisições HTTP de maneira extremamante fácil. Para obter mais informações sobre a requests acesse a doumentação oficial.
Agora que já aprendemos o básico podemos partir para um exemplo mais interessante.
Acessando os dados da API do github
O Github oferece uma API que fornece dados de seus repositórios públicos. São dadas informações como quantos projetos estão cadastrados na plataforma, quantos contribuidores trabalharam em quais repositórios, a quais organizações essas fazem parte e muito mais. (mais informações na documentação oficial)
O acesso aos dados dessa API é feito através do envio de requisições HTTP para diferentes caminhos na URL base https://api.github.com/. Caso você queira testar a API, pode acessar o link anterior pelo navegador e mudar a URL manualmente, porém nosso foco aqui será usar a biblioteca requests para pegar esses dados.
Todas as respostas da API são em formato JSON. O JSON siginifca JavaScript Object Notation e pronuncia-se "djêizon" e é um formato fácil de processar e simples de utilizar. Para mais informações sobre o JSON acesse a página oficial. Falaremos mais sobre JSON no decorrer do curso, mas fique tranquilo que não segredo há algum nesse assunto.
Vamos testar a API e pegar os repositórios de um usuário específico através da URL https://api.github.com/users/lamenezes/repos:
End of explanation
repositorios = response.json()
repo = repositorios[0]  # pegando apenas o primeiro repositório por brevidade
repo
Explanation: A resposta trouxe todos os repositórios do usuário lamenezes em uma string no padrão JSON.
Essa string não é interessante para nós, pois é difícil acessar dados específicos do JSON através dela. Seria muito melhor para nós se essa resposta fosse traduzida para um dicionário do Python (que possui sintaxe muito parecida com o JSON).
Normalmente teríamos que importar a biblioteca json e realizar a conversão, no pior caso poderia ser necessário escrever um parser específico para tratar casos especiais.
No entanto, a biblioteca requests já faz esse trabalho para nós:
End of explanation
numeros = [1, 2.5, 3, 4.5, 5]
numeros
numeros[0]
numeros[3]
numeros[-1]  # -1 acessa o último elemento da lista!
Explanation: A resposta nos trouxe uma lista de dicionários com as informações dos repositórios do usuário lamenezes. Agora fica a dúvida: o que exatamente é uma lista e um dicionário?
Listas
Listas, como o próprio nome sugere, são estruturas de dados mutáveis que armanzenam listas de valores. Os valores da lista são acessados pelo número relativo a sua posição.
Ao invés de gastar dedos digitando mais sobre o que é uma lista é mais fácil demonstrá-la:
End of explanation
lista = ['foobar', False, ['a', 'b', 'c'], {'foo': 'bar'}, 10, -0.5]
lista
Explanation: Listas podem armazenar qualquer tipo de dados:
End of explanation
'foobar' in lista
'abc' in lista
-0.5 in lista 
Explanation: Fazemos assim para verificar se um elemento faz parte de uma lista:
End of explanation
len(lista)
len(lista[2])  # o segundo elemento da lista é uma lista com 3 elementos!
len(numeros)
Explanation: Para saber o tamanho de uma lista basta usar a função len():
End of explanation
lista
del lista[3]
lista
del lista[-1]  # remove último elemento
lista
Explanation: Para remover elementos de uma lista existe a palavra reservada del que é utilizada assim:
End of explanation
for numero in numeros:
    print(numero)
Explanation: Iterar uma lista é simples:
End of explanation
numeros = range(1, 11)  # cria uma lista de números de 1 a 10
list(numeros)
for numero in numeros:
    print(numero ** 2)  # numero elevado a segunda potência
Explanation: O for do Python, diferentemente de outras linguagens como C e Java, faz o controle dos índices internamente.
Vamos fazer mais um exemplo para deixar claro:
End of explanation
list(range(10))  # números de 0 a 9
list(range(10, 20))  # números de 10 a 19
list(range(10, 21))  # números de 10 a 20
Explanation: A função range(inicio, fim) cria listas de valores no intervalo de inicio até fim - 1. Ao lidar com intervalos no python o primeiro número é sempre incluso e o último excluído. Segue alguns exemplos de uso da função range()
End of explanation
from math import pi
numeros = ...  # crie a lista de números de 2 a 8
for numero in numeros:
    print( ... )  # imprime o número vezes pi
Explanation: Exercício
Crie uma lista de números de 2 a 8 e imprima cada número vezes pi. Substiua os ... por código python.
End of explanation
taxa_dolar = 3.53  # mude esse valor caso o valor do dólar tenha mudado
preços = ...  # python 3 permite declarar variáveis com acentos
for preço in preço:
    print(...)
Explanation: Exercicio
Crie uma lista de preços de produtos em dólar (somente números) e imprima seu valor convertido para reais.
End of explanation
notas = {'joao': 5, 'maria': 9, 'ana': 7}
notas
Explanation: Dicionários
Dicionários são estruturas de dados utilizadas para armazenar conjuntos de chaves e valores. Em algumas linguagens também são conhecidos como mapaemento.
A diferança de uso entre lista e dicionáro é que o último é acessado por chaves e não pela posição. As chaves podem ser inteiros, strings, booleanos e tuplas (este será visto na próxima aula).
A seguir temos alguns simples exemplos de uso de diconários.
Criar um dict é simples:
End of explanation
notas['ana']
notas['joao']
Explanation: Para acessar os elementos basta usar sua chave:
End of explanation
notas['joao'] = 6.5
notas
notas['ana'] = 7.5
notas
Explanation: Para alterar algum valor fazemos:
End of explanation
'joao' in notas  # verifica se o valor é uma chave do dicionário
'joana' in notas
'ana' in notas
Explanation: Verificamos se uma chave existe no dicionário da seguinte maneira:
End of explanation
list(notas.keys())
Explanation: Para acessar somente as chaves fazemos:
End of explanation
list(notas.values())
Explanation: Para acessar somente os valores:
End of explanation
list(notas.items())
Explanation: Para ter uma lista contendo as chaves e valores:
End of explanation
for chave in notas:
    print(chave)
Explanation: Para iterar dicionáros é preciso ter cuidado. Por padrão as chaves do dicionário são iteradas:
End of explanation
for valor in notas.values():
    print(valor)
Explanation: Caso você queira imprimir os valores é preciso usar notas.values():
End of explanation
for chave, valor in notas.items():
    print(chave, valor)
Explanation: Para iterar tanto a chave quanto o valor use a função notas.items() como mostrado a seguir:
End of explanation
for nome, nota in notas.items():
    print('{0} tirou {1}.'.format(nome.capitalize(), nota))
list(notas.items())
Explanation: Para ficar mais claro podemos mudar os nomes das variáveis e para ficar mais inteligível formatar a saída:
End of explanation
repositorios = response.json()  # lista de dicionários com dados de cada repositório
repo = repositorios[11]  # vamos analisar o décimo primeiro repositório
repo
repo['full_name']
repo['description']
repo['created_at']  # data de criação
repo['html_url']  # URL da página principal do repositório
Explanation: Como visto acima o notas.items() retorna uma lista de chaves e valores. Por esse motivo a cada iteração temos acesso a cada chave e valor do dicionário notas, tornando possível essa iteração mais simples e semântica.
Agora que já temos uma noção das estruturas de dados utilizadas, podemos continuar a visualizar as informações dos repositórios do github:
PS: relaxe, pois nas próximas aulas veremos a fundo essas estruturas!
De volta à API do github
Anteriormente realizamos uma requisição à API do github para pegar os repositórios do usuário lamenezes e armazenamos a resposta na variável response. Essa variável ainda está disponível para nós, o que nos permite continuar nosso exemplo anterior:
End of explanation
dono = repo['owner']
dono['login']
Explanation: Também temos os dados do dono (owner) do repositório:
End of explanation
repo['owner']['login']
Explanation: 'owner' é um dicionário dentro do dicionário do repositório (sim, é possível guardar dicionários dentro de dicionários)
Também podemos acessar as informações diretamente sem recorrer à variável intermediária dono:
End of explanation
# digite o código aqui
Explanation: Exercicios
Quantos repositórios o usuário lamenezes possui?
Lembrando que esses repositórios estão armazenados na lista repositorios
End of explanation
# digite o código aqui
Explanation: Imprima as URLs de todos os repositórios
End of explanation
response = ...
response.status_code  # status_code deve ser 200
Explanation: Para os próximos exercícios será necessáro pegar os repositórios do usuário gvanrossum. Use a biblioteca requests e faça uma requição à API do github (https://api.github.com/) como demostrado anteriormente.
End of explanation
repos = ...
len(repos)  # esta linha deve retornar 5
Explanation: Agora pegue o conteúdo da resposta em formato JSON e atribua à variável repos:
End of explanation
import requests
response = requests.get('https://api.github.com/users/gvanrossum/repos')
repositorios = response.json()
for repositorio in repositorios:
    print(repositorio['full_name'], repositorio['description'])
Explanation: Imprima o nome e descrição de todos os repositórios do gvanrossum:
End of explanation
# digite o código aqui
Explanation: Quantos forks o repositório gvanrossum/asyncio possui?
End of explanation
# digite o código aqui
Explanation: Qual o link do perfil do dono dos repositórios?
End of explanation
<END_TASK>