x = 1.0                 # isso é uma alocação

x, y = 3.0, 4.5         # python permite fazer alocações multiplas

u, v = 2*x+1, (x+y)/3   # podemos usar expressões matemáticas nas alocações

"""
Explanation: Programação básica
programas são um conjunto de instruções para o computador
variáveis
quantidades são representadas por variáveis no mesmo sentido que são aplicadas em algebra
podemos alocar valores para variáveis:
End of explanation
"""


print (1 + 1)
a = 4
type(a)

"""
Explanation: vamos usar variáveos extensivamente para representar grandezas físicas
em python podemos usar nomes com várias letras ou mesmo numeros e letras
variáveis não podem começar com um número
alguns caracterers com & não podem ser usados em nomes de variáveis pois são reservados
python distingue entre maiúsculas e minúsculas, logo, x é diferente de X e podem ter valores distintos
de a suas variáveis nomes que tenham significado relacionado ao que elas são. Por exemplo, se voce vai usar uma variavel para energia, não a denomine de E, use energia ou ener
Tipos básicos
em física usamos três tipos básicos de variáveis: inteiro, ponto flutuante e complexo
Inteiro
End of explanation
"""


c = 2.1
print('the value in c is a ',type(c))

"""
Explanation: Floats
End of explanation
"""


a = 1.5 + 0.5j
print (a.real)
print (a.imag)
type(1. + 0j)

"""
Explanation: Complexos
note que em python a unidade de complexo é o j e não i como usual
End of explanation
"""


print (3 > 4)
test = (3 > 4)
print (test)
type(test)

"""
Explanation: Boleanos
End of explanation
"""


x = 'isso é uma string'
print (x)
print ('a variável x é ',type(x))

y = '1.23'
print ('a variável y é ',type(y))


"""
Explanation: strings
End of explanation
"""


print (3 + 5)    # adição
print (10 - 5.)  # subtração
print (7 * 3.)   # multiplicação
print (2**10)    # potencia

print (7./2)

print (14 % 3)    # retorna o resto da divisão
print (14.3 % 3)

print (14//3)     # retorna a parte inteira da divisão
print (14/3.)

"""
Explanation: é importante tentar sempre usar o tipo de variável adequada pois um integer ocupa menos memoria que um float e este ocupa menos que um complexo. Em programas que operam com milhões ou bilhões de números essa diferença pode ficar relevanterecebem
inteiros não sofrem com problemas de precisão
em python variáveis não precisam ser declaradas com tipo definido antes de serem usadas. As variáveis definem o tipo baseado no input que recebem 
operações básicas
em python as operações aritiméticas funcionam como esperado em algebra, seguindo as regras usuais
End of explanation
"""


x = 0

x += 1        # adicione 1 a x
print (x)

x -= 4        # subtraia 4 de x
print (x)

x *= -2.6     # multiplique x por -2.6
print (x)

y = 2

x /= 5*y     # divide por 5 vezes y
print (x)

x //= 0.4    # divide x por 3.4 e arredonda para inteiro
print (x)

"""
Explanation: python também permite algumas construções que podem ter utilidade em programas mais complexos:
End of explanation
"""


# um exemplo de uso do print

x=1
y=2

print("o valor de x é",x,'e o valor de y é',y)

"""
Explanation: Entrada e saída
já vimos acima uma das principais formas de saída: print
exitem diferenças do print em python 2.7 e 3: fiquem atentos!
End of explanation
"""


x = input('Entre com o valor de x:')

print ('o valor de x é', x, 'e o seu tipo é', type(x))

"""
Explanation: input
fazer input é um pouco mais elaborado
o formato básico é:
End of explanation
"""


x = input('Entre com o valor de x:')
print ('o valor de x é', x, 'e o seu tipo é', type(x))

# quando pre-definimos o tipo de entrada desejada
x = float(input('Entre com o valor de x:'))
print ('ovalor de x é', x, 'e o seu tipo é', type(x))

"""
Explanation: ATENÇÃO: nessa função também existe diferença entre python 2.7 e 3.
Em python 3 input sempre recebe a variável como string e a definição de tipo de variável é feita depois. Em 2.7 a variável é definida com base no que foi entrado.
End of explanation
"""


from math import log, log10        # esse é o formato para importar pacotes

print (log(100.0), log10(100.0))

# se tentarmos usar uma função não importada teremos um erro

print (sqrt(4.0))

# uma solução é importar todo o pacote
from math import *
print (sqrt(4.0))

"""
Explanation: módulos, pacotes e funções
muitas operações que vamos precisar fazer são mais complicadas que pura aritmética
python tem pacotes e funções prontas para lidar com boa parte dessas complicações
normalmente as coisas são organizadas em pacotes com um dado nome, que contém coisas relacionadas.
por exemplo o pacote math contém funções matemáticas:
End of explanation
"""


