Python 3: Minimalismo e Legibilidade

Introdução a Python

Python é uma linguagem de programação orientada a objetos, dinamicamente tipificada e interpretada. A filosofia de design do Python é baseada em uma sintaxe não-tradicional e minimalista, girando em torno da legibilidade. Isso é feito usando-se espaço em branco para delinear escopos em vez das mais tradicionais chaves e ponto-e-vírgula. Geralmente todo o código python é executado usando um interpretador, sendo o mais popular e original chamado CPython, porque é implementado utilizando C e usa um coletor de lixo automático para gerenciar a memória. Existem vários outros intérpretes, muitos dos quais implementados em Java e C#.

Muitos desenvolvedores optam por escrever Python usando um ambiente de desenvolvimento integrado específico, como o Eclipse, o PyCharm e o NetBeans.

Versões do Python

Ao entrar em contato com Python pela primeira vez pode ser um pouco confuso porque, ao contrário de muitas outras linguidadens de programação, o Python tem duas versões principais, não compatíveis, que são atualmente amplamente utilizadas.

A versão 2.7.3 do Python é na maior parte, compatível com todas as versões anteriores. Ao refatorar a linguagem, foi criada Python 3, o qual foi adotado lentamente no início, principalmente pela incompatibilidade. Mas hoje em dia o ecossistema do Python 3 está em grande parte comprometido, tornando o Python 3 a escolha óbvia para novos desenvolvedores que desejam aprender a linguagem.

Printando

  print("Hello")
  print("World")      
  print("!")

Variáveis e Tipos de Dados

  # Nomes são case-sensitive e devem começar com: letras, $, _
  # Depois, devem incluir: letras, números, $, _
  # Segundo a conveção:
  #  "Comece com uma letra minúscula, e as palavras seguintes são separadas por underscores"
  # Exemplo: minha_primeira_variavel

  nome = "Mike"    # String
  idade = 30       # Inteiro
  peso = 3.5       # Decimal
  eh_alto = True   # Boolean (True/False)

Casting e Conversão

  print( int(3.14) )                 # 3
  print( float(3) )                  # 3.0
  print( str(True) )                 # "True"
  print( int("50") + float("70") )   # 120.0

Strings

  palavra = "String"
  # índices: 012345

  print( len(palavra) )         # 6
  print( palavra[0] )           # S
  print( palavra[-1] )          # g

  # A partir de qual índice encontramos uma substring
  print( palavra.find("ing") )  # 3
  print( palavra.find("z") )    # -1

  # Obter uma substring
  print( palavra[3:] )         # "ing"
  print( palavra[1:4] )        # "tri"

Números

  print( 2 * 3 )       # Aritmética Básica: +, -, /, %, *, **
  print( 2**3 )       
  print( 10 % 3 )      
  print( 1 + 2 * 3 )   # Precedência das operações é avaliada
  print(10 / 3.0)      # Inteiro (Operação) Decimal = Decimal


  num = 10
  num += 100           # Atualização de Variável: +=, -=, /=, *=

  ++num                # num += 1
  --num                # num -= 1

  # Módulo Matemático
  import math
  print( pow(2, 3) )       # Potenciação
  print( math.sqrt(144) )  # Raiz Quadrada
  print( round(2.7) )      # Arredondamento

Entrada do Usuário

  # Entrada Recebida como String
  nome = input("Enter your nome: ")        
  print("Hello", nome + "!")              

  # Entrada Convertida para Inteiro/Decimal
  num1 = int(input("Enter First Num: "))
  num2 = float(input("Enter Second Num: "))
  print(num1 + num2)

Listas

  lista_numeros = [2, 4, "six", 8.0, 10, 12]  # Listas, em Python, são Heterogêneas
  #  Índices:      0  1    2     3   4   5

  lista_numeros[0] = 100     # Alterando Valor Contido na Lista
  print(lista_numeros[0])    # Acessando Valor Contido na Lista: 100
  print(lista_numeros[-1])   # Acessando Valor Contido na Lista: 12
  print(lista_numeros[2:])   # Obtendo Sublista: ["six", 8.0, 10, 12]
  print(lista_numeros[2:4])  # Obtendo Sublista: ["six", 8.0]
  print(len(lista_numeros))  # Obtendo Tamanho da Lista

Listas Bidimensionais

  matriz = [ [1, 2], [3, 4] ]  # Definindo uma Lista Bidimensional
  print(matriz[0][1])          # Acessando Valor Contido na Lista[Linha][Coluna]: 2
  matriz[0][1] = 100           # Alterando Valor Contido na Lista

Funções de Listas

  friends = []

  friends.append("Oscar")            # Adicionando Elementos ao Final da Lista
  friends.append("Angela")

  friends.insert(1, "Kevin")         # Inserindo Elemento em uma Determinado Índice
  friends.remove("Kevin")            # Removendo a Primeira Ocorrência de um Elemento
  print( friends.index("Oscar") )    # Obtendo o Índice de um Determinado Elemento
  print( friends.count("Angela") )   # Obtendo Quantidade de Ocorrências de um Determinado Elemento
  friends.sort()                     # Ordenando a Lista
  friends.clear()                    # Esvaziando a Lista

Tuplas

  tupla_numeros = (2, 4, "six", 8.0, 10, 12)
  # Índices:       0  1    2     3   4   5

  tupla_numeros[0] = 100     # Alterando Valor Contido na Tupla      
  print(tupla_numeros[0])    # Acessando Valor Contido na Tupla: 100
  print(tupla_numeros[-1])   # Acessando Valor Contido na Tupla: 12
  print(tupla_numeros[2:])   # Obtendo Subtupla: ("six", 8.0, 10, 12)
  print(tupla_numeros[2:4])  # Obtendo Subtupla: ("six", 8.0)
  print(len(tupla_numeros))  # Obtendo Tamanho da Tupla

Funções

  def funcao(param1, param2 = valor_default):
       return resultado

  funcao(valor1)
  funcao(valor1, valor2)

Condicionais

a = True
b = False

if a and b:
	# Ações Executadas ao Validar o If
elif a or not(b):
	# Ações Executadas ao Validar o Else If
else:
	# Ações Executadas ao Validar o Else

# Comparações: >, <, >=, <=, !=, ==
if (1 < 3) or ("string1" == "string2"):
	# Execução ao validar condição

Dicionários


# Definindo um dicionário
dicionario = {
    "a" : "b",
    5 : ["a", 3],
    3 : 5
}

# Acessando o Valor, dado uma Chave, em um Dicionário
print( dicionario["a"] )

# Acessando o Valor, dado uma Chave, em um Dicionário. Caso a Chave não Exista,
# um Valor Passado como Parâmetro será Retornado
print( dicionario.get(5, "Chave não consta") )

Iterações (Loops)

# While Loop
indice = 1
while indice <= 5:
	print(indice)
	indice += 1

# For Loop
for indice in range(5):         # range(n) = [0, 1, ..., n-1]
    print(indice)

numeros = [4, 8, 15, 16, 23, 42]
for numero in numeros:
    print(numeros)

for letra in "Palavra":
    print(letra)

Tratamento de Exceções

  try:
      # Comandos a serem Executados
  except ExcecaoPrevista as e:
      # Tratamento de uma Exceção Prevista
      print(e)
  except:
      # Tratamento de uma Exceção Imprevista
      print("HOUVE UM ERRO")       

Classes e Objetos

  # Definindo o Objeto
  class Livro:
      # Construtor do Objeto
      def __init__(self, titulo, autor):
          self.titulo = titulo
          self.titulo = titulo

      # Função Inerente aos Atributos
      def ler_livro(self):
           print("Lendo ", self.titulo, " de ", self.autor)

  # Instanciando Objeto
  book1 = Book("Dracula", "Bram Stocker");

  # Acessando Atributo do Objeto
  print(book1.titulo)
  # Utilizando Função do Objeto
  book1.ler_livro()

Getters e Setters

  class Livro:
      def __init__(self, titulo, autor):
          self.titulo = titulo;
          self.autor = autor

      # Getter
      @property
      def title(self):
          return self._titulo     # Usamos Underscore antes do Atributo para
                                 # indicá-lo como Privado

      # Setter
      @titulo.setter
      def title(self, novo_titulo):
          self._titulo = novo_titulo

      # Setter to Null
      @titulo.deleter
      def titulo(self):
          del self._titulo

      def ler_livro(self):
         print("Lendo ", self.titulo, " de ", self.autor)

  book1 = Book("Dracula", "Bram Stocker");

  print(book1.titulo)
  book1.ler_livro()

Herança


  # Superclasse
  class Chef:

     def __init__(self, nome, idade):
         self.nome = nome
         self.idade = idade

     def cozinhar_frango(self):
         print("Frango Cozinhado")

     def temperar_salada(self):
         print("Salada Temperada")

     def cozinhar_prato_especial(self):
         print("Costeletas de Porco")

  # Subclasse
  class ChefEuropeu(Chef):

     def __init__(self, nome, idade, countryOfOrigin):
         self.countryOfOrigin = countryOfOrigin
         # Reaproveitamos o Construtor da Superclasse
         super().__init__(nome, idade)

     def cozinhar_massa(self):
         print("Macarronada")

     # Sobrescrevendo Função da Superclasse
     def cozinhar_prato_especial(self):
         print("Frango Parma")


  myChef = Chef("Gordon Ramsay", 50)
  myChefEuropeu = ChefEuropeu("Massimo Bottura", 55, "Itália")

  # Instâncias da Subclasse herdam Características da Superclasse
  myChef.cozinhar_frango()  
  myChefEuropeu.cozinhar_frango()

  # Instâncias da Subclasse podem Sobrescrever Características da Superclasse
  myChef.cozinhar_prato_especial()
  myChefEuropeu.cozinhar_prato_especial()