PYTHON – EXEMPLOS DE PROGRAMAS

Valdemar W. Setzer
www.ime.usp.br/~vwsetzer (na seção Recursos Educacionais)
Versão 3.5 - 26/1/18

Os programas abaixo foram testados no ambiente Jupyter do Microsoft Azure. As palavras reservadas estão em negrito. Ver as tabelas de operadores, funções e comandos, com exemplos.

Os exemplos são progressivos, isto é, na especificação do que cada um exemplifica não é mencionado o que já foi exemplificado anteriormente.

Ver também o site

http://exercism.io/languages/python/exercises

com muitos exemplos; para os códigos, abrir as abas "Test Suite".

1. Geração da sequência de Fibonacci

Este item dá exemplos do seguinte: comandos de atribuição, while e print, expressões condicionais e concatenação de cadeias de caracteres (strings), bem como a ativação do módulo de matemática real, e a raiz quadrada (math.sqrt):

import math # Ativa o módulo de funções matemáticas
""" Gera a sequência de Fibonacci até ultrapassar um limite
    que deve ser menor do que 1000, para alinhar os resultados
    e razão entre cada dois elementos """
# O limite deve ser maior ou igual a 2
Limite=int(input('Entre com o limite (>= 2): '))
N=2 # Número de ordem de cada elemento da sequência
FibA = 1
FibB = 1
# Imprime os títulos da tabela
print(' N      Fib(N)          Razão')
# Imprime os dois primeiros
print ('001     001')
print ('002     001     1.0')
while FibB < Limite:
  Aux = FibA + FibB # Cada novo elemento será a soma dos dois anteriores
  FibA=FibB # O segundo elemento torna-se o primeiro
  FibB=Aux  # O segundo elemento recebe a soma dos dois anteriores
  N=N+1     # Número de ordem do próximo elemento
  # Concatena 00 à esquerda se Fib(N) for menor do que 10
  #   e um 0 se for maior do que 9 e menor do que 100
  print('00'+str(N) if N<10 else '0'+str(N) if N<100 else N,
      '   ', '00'+str(FibB) if FibB<10 else
      '0'+str(FibB) if FibB<100 else FibB,'   ', FibB/FibA)
  print('Compare com a razão áurea:\n','            ',(1+math.sqrt(5))/2)

Dando-se 200 como entrada para N, o resultado que apareceu foi (o espaçamento foi ajustado para o tipo de caractere sendo usado aqui):

Entre com o limite (>= 2): 200
 N     Fib(N)         Razão
001     001
002     001     1.0
003     002     2.0
004     003     1.5
005     005     1.6666666666666667
006     008     1.6
007     013     1.625
008     021     1.6153846153846154
009     034     1.619047619047619
010     055     1.6176470588235294
011     089     1.6181818181818182
012     144     1.6179775280898876
013     233     1.6180555555555556
Compare com a razão áurea:
                1.618033988749895

2. Exemplo de função recursiva

Este exemplo tem dupla finalidade: 1. Exemplificar como se declara uma função recursiva, isto é, uma função que, em seu corpo, ativa ela própria. 2. Mostrar como funções recursivas podem ser usadas para implementar diretamente uma definição matemática indutiva.

""" Esta funççao recursiva implementa diretamente
    a definição indutiva da soma dos inteiros de 1 até N:
    a) A soma dos inteiros positivos até 1 é 1;
    b) a soma dos inteiros positivos de 1 até N é
       a soma de N com a soma dos inteiros positivos até N-1"""

def Soma1aN(N):
if N==1: return(1)
else: return (N+Soma1aN(N-1)) # note-se a ativação recursiva

# Uso da função
N=int(input('Entre com o valor de N: '))
print('A soma de 1 a', N, 'é', Soma1aN(N))

Resultados da execução:

Entre com o valor de N: 5
A soma de 1 a 5 é 15

Entre com o valor de N: 10
A soma de 1 a 10 é 55

3. Fibonacci usando a função recursiva

Além de exemplificar novamente o uso de uma função recursiva, este mostra como usar o comando for:

""" FIBONACCI USANDO A FUNÇÃO RECURSIVA FibRec """

""" Gera os primeiros N números da sequência de Fibonacci
    e calcula a razão entre cada 2 consecutivos.
    A partir do 26º haverá problema de alinhamento vertical
    dos resultados."""

"""Esta função calcula o n-ésimo elemento da sequência de Fibonacci
   a partir da definição indutiva: F(1)=1, F(2)=1, F(N)=F(N-1)+F(N-2)
   (a partir do 3o., cada elemento é a soma dos dois anteriores) """
   import math # Ativa o módulo de funções matemáticas
   def FibRec(N): # Dá o valor do N-ésimo elemento do sequência
   if N==1: return(1)
       if N==2: return(1)
     else: return (FibRec(N-1)+FibRec(N-2))

# Programa que usa a função FibRec para gerar a sequência
# O limite deve ser maior ou igual a 2
Limite=int(input('Entre com o número de elementos (>=2): '))
N=2 # Número de cada elemento da sequência
# Imprime os títulos da tabela
print(' N   Fib(N)   Razão')
print(' ', '1', 3*' ', '1')
print(' ', '2', 3*' ', '1',3*' ', '1.0')
FibA = 1
FibB = 1
while N < Limite:
     FibA=FibRec(N)
     N=N+1
     FibB=FibRec(N)
     """ Concatena 3 brancos à esquerda se Fib(N) for menor do que 10,
         2 se for maior do que 9 e menor do que 100,
         1 se for maior do que 99 e menor do que 1000.
         Se for maior do que 1000 haverá problema de alinhamento """
     print(2*' '+str(N) if N<10 else ' '+str(N) if N<100 else N,
      4*' '+str(FibB) if FibB<10 else
      3*' '+str(FibB) if FibB<100 else
      2*' '+str(FibB) if FibB<1000 else
      ' '+str(FibB) if FibB<10000 else FibB, 3*' ', FibB/FibA)
print('Compare com a razão áurea:\n', 12*' ',(1+math.sqrt(5))/2)

Resultado (o número de espaços em branco será diferente):

Entre com o número de elementos (>=2): 20
N Fib(N)     Razão
1     1
2     1 1.0
3     2 2.0
4     3 1.5
5     5 1.6666666666666667
6     8 1.6
7    13 1.625
8    21 1.6153846153846154
9    34 1.619047619047619
10   55 1.6176470588235294
11   89 1.6181818181818182
12  144 1.6179775280898876
13  233 1.6180555555555556
14  377 1.6180257510729614
15  610 1.6180371352785146
16  987 1.618032786885246
17 1597 1.618034447821682
18 2584 1.6180338134001253
19 4181 1.618034055727554
20 6765 1.6180339631667064
Compare com a razão áurea:
        1.618033988749895

4. Fibonacci generalizado

Este programa ilustra o uso dos comandos elif, for e break.

# GERA A SEQUÊNCIA DE FIBONACCI OU A GENERALIZADA USANDO A REGRA DE FIBONACCI
import math # Ativa o módulo de funções matemáticas
""" Usa a regra de Fibonacci (cada elemento é a soma dos dois anteriores)
    para gerar uma sequência de N números de Fibonacci ou de números positivos
    ou negativos (um dos dois iniciais deve ser diferente de zero) e a razão entre cada dois
    elementos consecutivos; estes ultrapassarem 999 haverá perda do alinhamento dos resultados."""
print('Deseja a sequência de Fibonacci (F) ou uma qualquer (Q)?')
Resposta='X'
# Verifica se a resposta foi F ou Q, senão insiste
while Resposta != 'F' and Resposta != 'Q':
   Resposta=input('Digite F ou Q: ')
   if Resposta == 'F':
      FibA = 1
      FibB = 1
   elif Resposta == 'Q':
     while True:
        FibA = int(input('Entre com o primeiro número: '))
        FibB = int(input('Entre com o segundo número: '))
        if FibA == 0 and FibB == 0:
          print('Um deles deve ser diferente de zero!')
        else: break
while True:
   Ult=int(input('Entre com o número de elementos: '))
   if Ult <=1:
      print('O número de elementos deve ser >= 2!')
   else: break    
# Imprime os títulos da tabela
if Resposta == 'F':
   print(' N Fib(N) Razão')
else: print(' N Qquer(N) Razão')
# Imprime os dois primeiros elementos
if Resposta == 'F':
   print ('001 001')
   print ('002 001 1.0')
else: # Resposta foi Q
# Imprime os dois primeiros elementos
if Resposta == 'F':
   print ('001 001')
   print ('002 001 1.0')
else: # Resposta foi Q
  if FibA>=0:
     print('001', '00'+str(FibA) if FibA<10 else '0'+str(FibA) if FibA<100 else FibA)
  else: print('001 ' ,'-00'+str(abs(FibA)) if abs(FibA)<10 else '-0'+str(abs(FibA)) if
     abs(FibA)<100 else FibA)
if FibB>=0:
   print('002', '00'+str(FibB) if FibB<10 else '0'+str(FibB) if FibB<100 else FibB,
   FibB/FibA if FibA != 0 else " ") # evita a divisão por 0
else: print('002' ,'-00'+str(abs(FibB)) if abs(FibB)<10 else '-0'+str(abs(FibB))
      if abs(FibB)<100 else FibB, FibB/FibA if FibA!=0 else " ") # evita a
      divisão por 0#
Gera a sequência a partir do 3o. elementeo
for N in range (1, Ult+1): #gera uma linha enquanto até o último elemento
   Aux = FibA + FibB # Cada novo elemento será a soma dos dois anteriores
   FibA = FibB # O segundo elemento torna-se o primeiro
   FibB = Aux # O segundo elemento recebe a soma dos dois anteriores
   # Concatena um 00 à esquerda se Fib(N) for menor do que 10
   # e 0 se for maior do que 9 e menor do que 100 inserindo - se for negativo
   if FibB>0:
     print('00'+str(N) if N<10 else '0'+str(N) if N<100 else N,
     '00'+str(FibB) if FibB<10 else
     '0'+str(FibB) if FibB<100 else FibB, FibB/FibA if FibA != 0 else " ")
   else: print('00'+str(N) if N<10 else '0'+str(N) if N<100 else N,
     '-00'+str(abs(FibB)) if abs(FibB)<10 else
     '-0'+str(abs(FibB)) if abs(FibB)<100 else FibB, FibB/FibA if FibA!=0 else " ")
RazAu = (1+math.sqrt(5))/2 #Razão Áurea
print('Compare com a razão áurea:\n','      '+str(RazAu)if FibB>0 else ' '+str(RazAu))

Resultados:

Deseja a sequência de Fibonacci (F) ou uma qualquer (Q)?
Digite F ou Q: F
Entre com o número de elementos: 10
 N Fib(N) Razão
001 001
002 001 1.0
003 002 2.0
004 003 1.5
005 005 1.6666666666666667
006 008 1.6
007 013 1.625
008 021 1.6153846153846154
009 034 1.619047619047619
010 055 1.6176470588235294
Compare com a razão áurea:
        1.618033988749895
Deseja a sequência de Fibonacci (F) ou uma qualquer (Q)?
Digite F ou Q: Q
Entre com o primeiro número: 0
Entre com o segundo número: -5
Entre com o número de elementos: 10
 N Qquer(N) Razão
001 000
002 -005
003 -005 1.0
004 -010 2.0
005 -015 1.5
006 -025 1.6666666666666667
007 -040 1.6
008 -065 1.625
009 -105 1.6153846153846154
010 -170 1.619047619047619
Compare com a razão áurea:
         1.618033988749895