Tipos de Dados, Variáveis e Interagindo com o Usuário #02
Tags: python, programming, beginners, tutorial
Published: 2022-03-28 18:57:20

{% youtube https://youtu.be/79rPOmXe89s %}
## Introdução

Neste tópico iremos aprender as primeiras instruções na linguagem _Python_, como escrever na tela do computador  e ler informações do teclado.

Também é abordado como utilizar variáveis para guardar os dados e quais são os tipos de dados básicos (primitivos) que podemos armazenar com simples instruções.

## Usando o **_shell_**

A linguagem **_Python_** acompanha um ambiente que você pode executar instruções e acompanhar a sua execução e resultado em tempo real, denominado **_shell_**.

Existem diversas formas de acessá-la, a foma mais simples é usando o terminal da sua máquina e  digitando o comando “**_python_**” (_não esqueça de dar “enter”_).

![descricao 1](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n2uhwh9rjnnsorqr802c.png)

Execute algumas *_expressões_* na *_shell_*, como *_2 + 2_*. Uma expressão consiste de *valores* (número *_2_*) e *operadores* (como a adição *_+_*) que podem ser calculados para um valor. Um valor sem operadores também é considerado uma expressão.

![descricao 2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xm0pmkrqw1tkoqh715vz.png)

Para sair do _shell_, basta digitar **_exit( )_** e dar _enter._


![descricao 3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lvx2vpj1wxjxflib0ttv.png)

A linguagem _Python_ fornece algumas operações predefinidas, como os operadores matemáticos.

### Operadores matemáticos

A linguagem Python possui os seguintes operadores matemáticos:

<table>
  <tr>
   <td><strong>Operador</strong>
   </td>
   <td><strong>Operação</strong>
   </td>
   <td><strong>Exemplo</strong>
   </td>
   <td><strong>Resultado</strong>
   </td>
  </tr>
  <tr>
   <td>**
   </td>
   <td>Exponenciação
   </td>
   <td>2 ** 4
   </td>
   <td>16
   </td>
  </tr>
  <tr>
   <td>%
   </td>
   <td>Resto da divisão
   </td>
   <td>20 % 7
   </td>
   <td>6
   </td>
  </tr>
  <tr>
   <td>//
   </td>
   <td>Divisão inteira
   </td>
   <td>20 // 7
   </td>
   <td>2
   </td>
  </tr>
  <tr>
   <td>/
   </td>
   <td>Divisão
   </td>
   <td>20 / 7
   </td>
   <td>2.857142
   </td>
  </tr>
  <tr>
   <td>*
   </td>
   <td>Multiplicação
   </td>
   <td>4 * 6
   </td>
   <td>24
   </td>
  </tr>
  <tr>
   <td>-
   </td>
   <td>Subtração
   </td>
   <td>7 - 3
   </td>
   <td>4
   </td>
  </tr>
  <tr>
   <td>+
   </td>
   <td>Adição
   </td>
   <td>7 + 3
   </td>
   <td>10
   </td>
  </tr>
</table>

Três operadores merecem a atenção para os novos programadores: o de exponenciação (**), o resto da divisão (%) e a divisão inteira (//).

A exponenciação calcula a base elevada à potência do expoente, por exemplo _2 ** 4 = 2<sup>4</sup> = 2 * 2 * 2 * 2._

O resto da divisão é literalmente o resto da divisão entre dois números, por exemplo, 20 % 7 = 6, uma vez que 20 dividido por 7 é 2, e 20 - 2 * 7 é igual a 6.

Já a divisão inteira retorna a parte inteira quando a divisão não é exata, por exemplo 20 // 7 = 2.

Experimente alguns operadores matemáticos no **_shell_**.

```python
>>> 2 + 3 * 6
20
>>> (2 + 3) * 6
30
>>> 48565878 * 578453
28093077826734
>>> 2 ** 8
256
>>> 23 / 7
3.2857142857142856
>>> 23 // 7
3
>>> 23 % 7
2
>>> 2 + 2
4
>>> (5 - 1) * ((7 + 1) / (3 - 1))
16.0
```

A ordem de precedência entre os operadores é semelhante aos matemáticos, a multiplicação tem mais prioridade de execução do que a adição, por exemplo. Da mesma forma, você pode alterar a ordem de precedência através da utilização de parênteses.

## Tipos de Dados

Todo valor que utilizamos em um programa, pertence a um tipo de dado. A linguagem _Python_ possui como tipos de dados mais comuns: **_inteiros, ponto flutuante, string, booleanos._** Inteiros representam os números que não possuem casas decimais, os de ponto flutuante são os números reais ou que possuem casas decimais. Já a **_string_** é uma sequência de caracteres ou representam texto.


<table>
  <tr>
   <td><strong>Tipo de Dado</strong>
   </td>
   <td><strong>Exemplos</strong>
   </td>
  </tr>
  <tr>
   <td>Inteiro
   </td>
   <td>-2, -1, 0, 1, 2, 3, 4, 5
   </td>
  </tr>
  <tr>
   <td>Ponto flutuante
   </td>
   <td>-1.25, -1.0, -0.5, 0.0, 0.5, 1.0, 1.25
   </td>
  </tr>
  <tr>
   <td><em>String</em>
   </td>
   <td>'a', 'aa', 'aaa', 'Ola!', '11 dias de aula'
   </td>
  </tr>
  <tr>
   <td><em>boolean</em>
   </td>
   <td>True, False.
   </td>
  </tr>
</table>


Observe que os valores _string_ devem estar entre aspas simples (‘)  ou duplas (“) e o tipo de dado _boolean_ somente pode assumir o valor **_True _** (valor verdade) ou o valor **_False_** (valor falso). Fique atento que o **_primeiro caracter é maiúsculo_**.

### Concatenação de _string_

O operador de adição, além de somar números, também é utilizado para “juntar” ou concatenar _strings_.

```python
>>> 'primeiro' + ' segundo nome'
'primeiro segundo nome'
>>> 'tenho ' + ' 15 anos'
'tenho  15 anos'
```

### Replicação de _string_

Com o operador de multiplicação, pode-se replicar uma _string_.

```python
>>> 'seis ' * 6
'seis seis seis seis seis seis '
>>> 6 * 'seis '
'seis seis seis seis seis seis '
```

## Armazenamento de Dados

Os dados usados por um programa de computador podem ser armazenados e acessados, a princípio, da memória principal ou memória _RAM_ (_Random Access Memory_ - memória de acesso aleatório) e do disco rígido. Neste útimo caso, os dados devem estar armazenados em algum arquivo.

A velocidade de acesso de uma informação armazenada na memória _RAM_ é superior ao armazenado em discos rígidos. Para fins de comparação, se um acesso a memória demorassem na escala de segundos, o acesso a um disco _SSD_ (_Solid State Drives_ - discos de estado sólido) levaria semanas e em um disco rígido mecânico, de meses a um ano!

Em compensação os dados armazenados na memória _RAM_ são voláteis, se o seu computador for desligado ou reiniciado, eles serão perdidos. Já em discos rígidos, estes dados ficarão armazenados permanentemente, até que você os decida apagar.

Além disso, a quantidade de memória _RAM_ é bem inferior que a quantidade de espaço de um disco. Sendo o preço do espaço de armazenamento da memória _RAM_ bem superior ao preço de armazenamento de um disco rígido. Por exemplo, é comum os computadores pessoais possuírem _terabytes (TB)_ de armazenamento em disco e _gigabytes (GB)_ de memória _RAM_, 1 TB = 1.000 GB.


## Variável

Uma variável é um local na memória principal (_RAM_) para a escrita e leitura de valores, identificado por um **_nome_**.

Criamos variáveis em um programa para facilitar o armazenamento de valores que poderão ser utilizados em outras instruções. O **nome de uma variável não pode ser alterado, mas o seu valor sim**(veremos que também podemos deixá-la imutável).

**As linguagens de programação podem ser tipadas ou não tipadas. Uma linguagem é tipada quando é obrigado declarar o nome e o tipo de dados que podem ser armazenados na variável. Já as linguagens não tipadas, pode-se armazenar o valor em uma variável sem declarar o tipo. A linguagem **_Python não é tipada._**


### Atribuição (=)	

O operador de atribuição, responsável para atribuir um valor à variável é o **_=_** (símbolo de igualdade). 

Veja o exemplo baixo: 

```python
>>> message = 'Ola, meu primeiro programa'
>>> print(message)
Ola, meu primeiro programa
```

A variável com nome **_message_** foi definida e o valor “**_Ola, meu primeiro programa_**” foi atribuído a ela. Podemos então usar o nome da variável para acessar o valor armazenado, como na linha **_print (message)_**.

```python
>>> message = 'Ola, meu primeiro programa'
>>> my_age = 30
>>> my_salary = 150.50
>>> is_Old = False
>>> message
'Ola, meu primeiro programa'
>>> my_age
30
>>> my_salary
150.5
>>> is_Old
False
```

<table>
  <tr>
   <td>REGRAS PARA NOMES DE VARIÁVEIS
   </td>
  </tr>
  <tr>
   <td>
<ol>

<li>O primeiro caractere não pode ser um número;

<li>Os outros caracteres podem ser letras, números, ou <em>underscore </em>(‘_’);

<li>As letras em maiúsculo e minúsculo tornam os nomes diferentes, ou seja, variávei <strong><em>VALOR </em></strong>é diferente de <strong><em>valor</em> </strong>ou <strong><em>Valor</em></strong>. Ou seja, as variáveis são <strong><em>CASE-SENSITIVE</em></strong>.
</li>
</ol>
   </td>
  </tr>
</table>


Você pode alterar livremente o valor de uma variável depois que ela foi inicializada, teste alguns exemplos.

```python
>>> ano_bissexto = 2016
>>> ano_bissexto
2016
>>> ano_bissexto = 2020
>>> ano_bissexto
2020
```

E criar expressões utilizando somente variáveis.

```python
>>> valor_produto = 350.50
>>> desconto = 0.15
>>> valor_desconto = valor_produto * desconto
>>> valor_desconto
52.574999999999996

>>> sobrenome = 'Silva'
>>> sobrenome = sobrenome + ' Sousa'
>>> sobrenome
'Silva Sousa'
```

## Solicitando entrada do usuário

A partir de agora vamos escrever programas mais elaborados do que o simples cálculo de variáveis a análise de expressões usando o **_shell_**.

### Escrevendo o código fonte

Utilizando um editor de texto ou alguma **_IDE_** como o **_Visual Studio Code_**, digite o seguinte conteúdo, explicaremos em breve o seu conteúdo:

```python
#Programa para ler e imprimir nome do usuario
print('Digite seu nome:')
name = input()
print('Bem vindo ' + name)
```

O código fonte de programas _Python_ deve possuir a extensão **.py**, então salve o arquivo com o nome _nomeUsuario.py_ em alguma pasta no seu computador. Mas o que é o código fonte?

Código fonte é o nome do arquivo que contém as instruções ou o algoritmo a ser executado pela máquina, escrito em instruções ou comandos da linguagem de programação utilizada.

### Executando o programa

Por ser uma **_linguagem interpretada_**, o próximo passo é executarmos o programa que acabamos de escrever com o interpretador _Python_.

Se você estiver utilizando uma IDE, basta executar pelo próprio ambiente, caso contrário, acesse o terminal da sua máquina e navegue até a pasta onde você salvou seu arquivo. Finalmente digite “**_python nomeUsuario.py”_** e interaja com o seu primeiro programa com interação com o usuário.

![descricao 1](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/22cyl9bruda0jclqyl50.png)

Ele é um programa bem simples que solicita que você digite seu nome e depois imprime a mensagem de boas vindas.


### Entendendo o programa

```python
#Programa para ler e imprimir nome do usuario
print('Digite seu nome:')
name = input()
print('Bem vindo ' + name)
```

Na linha 01, temos um **_comentário_**. Toda linha que se inicia com o _hashcode_ (_#_) é ignorado pelo _Python_. Isso significa que o desenvolvedor pode escrever livremente alguma informação sobre o código. O uso de comentários é importante para documentar o algoritmo, geralmente descrevendo a sua funcionalidade. Linhas em branco também são ignoradas pela linguagem.

Na linha 02, estamos utilizando a **função** _print_, responsável por imprimir na tela o texto localizado dentro dos parênteses.

Em _Python_, **uma função é reconhecida pela presença dos parênteses**, ela possui um nome e é seguida por parênteses que podem ou não receber ou conter algum valor. Isso vai depender da função que você está utilizando. Logo, se você quer usar o _print( )_ para imprimir algo na tela, você deverá passar o valor a ser impresso dentro dos parênteses.

Na linha 03, temos outra função: **_input( )_** e o seu valor é atribuído à variável **_name_**. A função _input( )_ é responsável por ler informações do teclado, até o usuário digitar _enter_ e capturar o valor digitado como uma _string_. Desta forma a variável **name** é do tipo **_string._**

Já na linha 04, estamos novamente invocando a função _print( )_ para imprimir na tela a mensagem _Bem vindo_ concatenado com o valor armazenado na variável _name_.

## Convertendo tipos de dados

### Função _int( ), str( ), float ( )_

Se tivéssemos que alterar o programa de boas vindas ao usuário, para imprimir além do nome, solicitar a idade do usuário e calcular a idade dele 15 anos depois?

Uma primeira tentativa, poderia ser:

```python
#Programa para ler e imprimir nome do usuario
#Solicitando a idade e calculando o valor em 15 anos
print('Digite seu nome:')
name = input()
print('Qual sua idade:')
age = input()
print('Bem vindo ' + name)
print('Voce tera ' + (age + 15) + ' anos daqui a 15 anos')
```

Mas ao executarmos, teremos um erro:

```python
Digite seu nome:
joao
Qual sua idade:
12
Bem vindo joao
Traceback (most recent call last):
  File "C:\Pessoal\Dropbox\Youtube\Python\codes\nomeIdadeUsuario.py", line 8, in <module>
    print('Voce tera ' + (age + 15) + ' anos daqui a 15 anos')
TypeError: can only concatenate str (not "int") to str
```

Se verificarmos a linha 08, estamos somando a variável **_age_** com o número **_15_**, e isso não é possível. O valor armazenado em **_age_** é uma _string_, lembre-se que o _**input( ) retorna uma string.**_

Para podermos converter um valor do tipo _string_ para um valor inteiro, a linguagem _Python_ possui a função **_int( )_**. E para converter o valor inteiro para uma _string_, a função **_str ( )_**.

Alterando a última linha para converter a idade de valor _string_ para um valor numérico, somar com 15 e depois converter novamente para uma _string _e ser impresso na tela, nosso código ficará:

```python
#Programa para ler e imprimir nome do usuario
#Solicitando a idade e calculando o valor em 15 anos
print('Digite seu nome:')
name = input()
print('Qual sua idade:')
age = input()
print('Bem vindo ' + name)
print('Voce tera ' + str(int(age) + 15) + ' anos daqui a 15 anos')
```

E sua execução:

```python
Digite seu nome:
joao
Qual sua idade:
20
Bem vindo joao
Voce tera 35 anos daqui a 15 anos
```

A função _float( )_ é similar à função _int( )_, mas converte o tipo de dado _string_ para o tipo ponto flutuante.

## Erros comuns

Não se pode misturar tipos de dados diferentes dos esperados no uso de um operador.

```python
>>> 'tenho ' + 15 + ' anos'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

>>> 'texto 1' * ' texto 2'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'str'

>>> 'texto ' * 5.0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'float'
```

Cuidado para não errar o nome da variável ao tentar utilizá-la.

```python
>>> mensagem = 'teste'
>>> print(mensage)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'mensage' is not defined. Did you mean: 'mensagem'?
```

Mantenha consistência no valor de uma _string_, se você abrir com aspas duplas, então você deve fechar com aspas duplas. Da mesma forma para aspas simples.

Exemplos de erros no _shell - consistência no valor de string_
```python
>>> mensagem = "Alguma mensagem aqui.'
  File "<stdin>", line 1
    mensagem = "Alguma mensagem aqui.'
               ^
SyntaxError: unterminated string literal (detected at line 1)
```

## LINKS DA SÉRIE:

[Instalando Python](https://dev.to/jcarlosvale/instalando-python-iniciantes-1d2m)

[Conceitos Iniciais #01](https://dev.to/jcarlosvale/aprendendo-a-programar-conceitos-iniciais-01-2ecf)