# Lógica de programação
## com `Python`
----
### criado por Bossa
----
# Aula 03
## Correndo
---
# Arquivos
O comando `open` abre arquivos para leitura e escrita
----
## Escrevendo em arquivos
```python
# a função `open` recebe dois argumentos
# o nome do arquivo e o modo de abertura
arquivo = open("aquivo.txt", "w") # w -> write
# agora arquivo é um objeto que tem métodos para escrita
arquivo.write("Primeira linha do arquivo.\n")
arquivo.write("Segunda linha do arquivo.\n")
arquivo.close()
# sempre temos que fechar o arquivo no final
```
----
## Lendo arquivos
```python
arquivo = open("aquivo.txt", "r") # r -> read
# agora arquivo é um objeto que tem métodos para escrita
conteudo = arquivo.read()
print(conteudo)
arquivo.close()
# sempre temos que fechar o arquivo no final
```
----
### Lendo linhas de um arquivo
```python
arquivo = open("texto.txt", "r")
# abrimos o arquivo em modo leitura
i = 1
for linha in arquivo: # podemos iterar pelas linhas
print(f"linha {i}: {linha}" )
i += 1
arquivo.close()
# fechamos o arquivo
```
----
### Gerenciador de contexto
- Para evitar o erro de esquecer de fechar o arquivo, usamos a cláusula `with`
```python=
i = 1
with open("texto.txt", "r") as arquivo:
# dizemos que arquivo vai ser igual a open([...])
for linha in arquivo: # podemos iterar pelas linhas
print(f"linha {i}: {linha}")
i += 1
# quando o python sai do bloco with, fecha automaticamente
```
----
:::danger
Abrir o arquivo com a opção `'w'` apaga o conteúdo existente no arquivo. Se não quiser apagar, use a opção `'a'` para acrescentar conteúdo.
:::
---
# Dicionários
----
## Dicionários
- Em listas e tuplas, acessamos os valores usando índices numéricos
- Nos *dicionários*, nomeamos os índices (também chamados _chaves_) como quisermos
- Sintaxe: `dicionario = {chave: valor}`
----
## Criando dicionários
```python
# criar diretamente
dicionário = {"nome": "Bossa", "cargo": "Matemático",
"código": 2504 }
# adicionar uma chave e um valor
dicionário["chave"] = "valor"
print(dicionário)
```
----
## Percorrendo dicionários
```python
# isso percorre as chaves do dicionário
for chave in dicionário:
print(chave)
# o método .values() retorna uma lista com os valores
for valor in dicionário.values():
print(valor)
# podemos percorrer ambos usando método .items()
for chave, valor in dicionário.items():
print(chave, valor, sep=": ")
```
----
## Verificando e atualizando
```python
verifica1 = "nome" in dicionário
verifica2 = "Bossa" in dicionário
# a notação x in dicionário só verifica se uma chave
# está num dicionário, e não um valor
verifica3 = "Bossa" in dicionário.values()
# para verificar valores, usamos o método .values()
print(verifica1, verifica2, verifica3)
# atualizando valores
dicionário.update({"nome": "Luiz", "cargo": "Instrutor"})
print(dicionário)
```
---
# Exercícios
----
## Exercício 01 - Lendo arquivo
Crie um algoritmo que lê um arquivo e imprime na tela cada linha do arquivo, precedida pelo número de caracteres daquela linha, e.g.,
```
(14) Primeira linha
```
```python
with open("texto.txt", "r") as arquivo:
for linha in arquivo:
n = len(linha)
print(f"({n}) {linha}", end="")
```
<!-- .element: class="fragment" data-fragment-index="1" -->
----
## Exercício 02 - Escrevendo em arquivo
Crie um algorito que lê um dicionário e para cada par `chave, valor`, escreve uma linha `chave:valor` no arquivo `dicionário.txt`
```python
dicionário = {"nome": "Bossa", "instituição": "UFSC", "cargo": "matemático"}
with open("dicionário.txt", "w") as arquivo:
for chave, valor in dicionário.items():
arquivo.write(f"{chave}:{valor}\n")
```
<!-- .element: class="fragment" data-fragment-index="1" -->
----
## Exercício 03 - Carregando dados do arquivo
Crie um algorito que lê o arquivo `dicionário.txt` do exercício anterior, e cria um dicionário usando os pares `chave:valor` de cada linha do arquivo
```python
dicionário = {}
with open("dicionário.txt", "r") as arquivo:
for linha in arquivo:
conteudo = linha.split(":")
chave = conteudo[0]
valor = conteudo[1]
dicionário[chave] = valor
```
<!-- .element: class="fragment" data-fragment-index="1" -->
---
# Coisas pythonicas :snake:
---
# Atribuição condicional
Também conhecido como `if` em linha
----
## `if` em linha
As duas construções abaixo fazem a mesma coisa
```python
variável = "Valor 1" if condição else "Valor 2"
```
```python
if condição:
variável = "Valor 1"
else:
variável = "Valor 2"
```
---
## Compressão de listas
----
Assim como em matemática temos descrições de conjuntos como $$ \{x^2+1\, | \, x\in \mathbb{N} \text{ e $x$ é par } \}, $$
podemos fazer o mesmo com listas em `python`
----
### Compressão de listas
Aplicando uma operação em elementos de uma lista
```python
universo = range(10) # definindo uma lista
quadrados = [x**2 + 1 for x in universo ]
# cria uma nova lista aplicando uma operação
# nos elementos de universo
```
----
### Compressão de listas
Selecionando elementos de uma lista
```python
pares = [ n for n in universo if n % 2 == 0 ]
# seleciona apenas alguns elementos do universo
```
----
### Compressão de listas
Selecionando com `if` e `else`
```python
# pegando só os elementos que satisfazem a condição do if
impares = [n if n % 2 == 0 else n**2 + 1 for n in universo]
# valores que dependem de uma condição
# mesma notação do if em linha
```
---
## Separando listas
```python
lista1 = [1, 2, 3]
x,y,z = lista1
# separa os elementos da lista e salva em cada variável
print(x,y,z)
lista2 = list("abcdefg")
a, b, *resto = lista2
#o resto é tudo o que não forem os dois primeiros elementos
```
---
## Bibliotecas não-padrão
---
## NumPy
- Biblioteca para computação científica
- Vários algoritmos já prontos
- Substituto ao MATLAB
----
### Exemplo `numpy`
```python
import numpy as np
A = np.array([[1,0,0,0], # matriz
[0,2,0,0],
[0,0,3,0],
[0,0,0,4] ])
b = np.array([[4,0,0,4]]).T # isso gera um vetor `de pé`
x = np.linalg.solve(A,b) # Resolve o sistema Ax=b
```
----
:::info
Mais infos em
- [NumPy for Matlab users](https://docs.scipy.org/doc/numpy/user/numpy-for-matlab-users.html)
- [numpy.org](https://numpy.org/)
:::
---
## SymPy
Biblioteca para computação simbólica
```python
from sympy import symbols, expand, factor, diff, integrate
x = symbols("x")
diff(x**3 + 2*x + 1) # derivada
expand((x+1)*(x+3)) # expansão
factor(x**2 + 4*x + 4) # fatoração
from sympy import sin
integrate(x*sin(x)) # integral
```
---
## pandas
Biblioteca para trabalhar com dados.
---
## matplotlib
- Pacote para criar gráficos fantásticos
- Não pode ser usado no terminal
> Alguns exemplos do site [matplolib.org](https://matplotlib.org/)
----
### matplotlib
![](https://matplotlib.org/_images/sphx_glr_filled_step_001.png)
----
### matplotlib
![](https://matplotlib.org/_images/sphx_glr_scatter_demo2_001.png)
----
### matplotlib
![](https://matplotlib.org/_images/sphx_glr_whats_new_99_mplot3d_001.png)
---
# Instalação
----
## Instalação
- Nas distribuições linux, o python já vem instalado por padrão.
- No windows você baixar os arquivos autoinstaláveis em [python.org](https://www.python.org/)
----
## Ubuntu
Para instalar um pacote completo com as bibliotecas científicas, basta executar
```bash!
sudo apt install python3-venv python3-pip
pip3 install numpy scipy matplotlib ipython jupyter jupyterlab pandas sympy nose spyder
```
----
## Windows
Instale o _Anaconda_, um gerenciador de pacotes que já inclui tudo o que precisamos.
Acesse [anaconda.com](https://www.anaconda.com/).
----
![](https://i.imgur.com/qeh8fP8.png)
---
# Onde codificar
----
## Terminal
- No Ubuntu basta digitar `python3` na linha de comando
- No Windows, após instalar o Anaconda, basta abrir o _Anaconda Prompt_ e digitar `python`
----
## `Ipython`
- No Ubuntu basta digitar `ipython` na linha de comando
- No Windows, após instalar o Anaconda, basta abrir o _Anaconda Prompt_ e digitar `ipython`
- É um `Python` interativo melhorado, com completamento usando `<TAB>`, ajuda com `?`, exibição de gráficos e mais
----
![](https://i.imgur.com/GQYqh0m.png)
----
## IDE
- O _Spyder_ é um *ambiente de desenvolvimento integrado* multiplataforma que se assemelha muito ao MATLAB.
----
![](https://i.imgur.com/llUE7H0.png)
----
## Notebooks
- O `Jupyter` é um projeto que permite usar _notebooks_, que são documentos que misturam conteúdo, código, resultado de código, visualização (programação literal). Ele é manipulado no seu próprio navegador.
----
![](https://i.imgur.com/q4xaT6c.png)
----
### Notebooks online
- https://colab.research.google.com
---
# Fim Aula 03
{"metaMigratedAt":"2023-06-15T01:54:06.701Z","metaMigratedFrom":"YAML","title":"Lógica de programação 3 - v2","breaks":true,"description":"Minicurso de lógica de programação.","slideOptions":"{\"theme\":\"blood\",\"transition\":\"none\"}","contributors":"[{\"id\":\"97cff931-683e-4939-8bd1-380f6caced12\",\"add\":9510,\"del\":499}]"}