Introdução à programação e aos algoritmos

João Araujo Ribeiro · Capítulo 52 de 103

Páginas do PDF

Introdução à programação e aos algoritmos

4.3.1 Funções Sem Retorno de Resultados

Até agora fomos apenas usuários das funções de Python. É hora de passar de usuários para criadores. Cada linguagem define sua forma de criar e utilizar uma função, mas quase todas se baseiam no fato de que uma função é chamada e depois retorna ao ponto original da chamada.

Python segue a seguinte sintaxe para definir uma função:

def nome_da_função(parâmetros separados por vírgula) :

corpo da função

Lembre-se dos dois pontos ao final da linha! Esta parte é o cabeçalho da função.

O nome de uma função segue as mesmas regras de um identificador qualquer em Python. Em seguida, o corpo da definição da função é escrito recuado de alguns espaços em relação à primeira coluna. Lembre-se de que em Python o recuo determina um bloco, por isso todas as linhas de uma função têm de ter este recuo ou mais, para o caso de blocos internos de uma função.

 

4.3.1 FUNÇÕES SEM RETORNO DE RESULTADOS

A lista de parâmetros, ou seja, as informações que a função vai tratar, vem entre parênteses com os parâmetros separados por vírgulas. Porém, uma função pode não receber nenhum parâmetro, ou seja, já tem toda a informação de que precisa para executar. Neste caso não haverá lista de parâmetros. Vamos começar por este caso simples.

def imprime_linha():

print(‘**********’)

imprime_linha()

 

■ Programa 4.8: Programa que imprime linha de asteriscos.

No Programa 4.8 definimos a função imprime_linha(), que

imprime uma sequência de asteriscos na tela.

Note que a função não recebe nenhum parâmetro e não retorna

nada a quem a chamou. Apenas imprime uma sequência de asteriscos e termina, retornando para o programa principal. Mesmo que a função não receba nada, é obrigatório o uso de parênteses logo após o nome, tanto na definição quanto na chamada. Isto faz com que fique evidente, na linha de execução, que se trata de uma chamada a uma função.

Contudo, digamos que você queira parametrizar o número de

asteriscos, imprimindo um número variável, de acordo com suas necessidades. Você não precisa escrever uma função para cada número diferente de asteriscos que queira imprimir. Basta escrever a função de impressão com um parâmetro. Este parâmetro vai dizer à sua função quantos asteriscos você quer que sejam impressos em cada linha. Veja o Programa 4.9.

def imprime_linha(n):

print(‘*’ * n)

imprime_linha(5)

 

■ Programa 4.9: Programa imprime linha de asteriscos com

parâmetro.

 

Um parâmetro é uma informação passada a uma função que irá

processá-la, no caso, o número de asteriscos.

O programa principal chama a função imprime_linha() com o

número 5. A função recebe este número e irá usá-lo para decidir quantos asteriscos serão impressos.

No corpo da função usei o parâmetro para multiplicar o caractere

‘*’ . Fazendo n vezes ‘*’ obtenho ‘****’.

Podemos parametrizar ainda mais esta função. Digamos que eu

não esteja contente com asteriscos. Quero poder imprimir qualquer caractere. Modificando o programa para que o mesmo solicite ao usuário essas duas informações: o número de caracteres e qual caractere imprimir.

def imprime_linha(n, carac):

print(carac * n)

num = int(input(‘Quantos caracteres você quer imprim ir?’))

qual = input(‘Qual será o caractere a ser impresso?’ )

imprime_linha(num, qual)

 

■ Programa 4.10: Programa que imprime linha de caracteres

com parâmetro.

 

Agora temos uma função com dois parâmetros. A posição destes parâmetros tem que ser a mesma na chamada e na definição da função. O primeiro parâmetro deve ser o número de caracteres, e o segundo qual caractere deverá ser impresso. O resultado é:

Quantos caracteres você quer imprimir?10 Qual será o caractere a ser impresso?# ##########

Finalmente, uma função pode chamar outra. Para ilustrar isto, veja o Programa 4.11 que desenha (ou tenta desenhar) uma “árvore de natal” com caracteres Ascii.

def imprime_linha(n1, carac1, n2, carac2):

print(carac1 * n1 + carac2 * n2)

def imprime_arvore():

imprime_linha(5, ‘ ‘, 1, ‘@’)

imprime_linha(4, ‘ ‘, 3, ‘*’)

imprime_linha(3, ‘ ‘, 5, ‘*’)

imprime_linha(4, ‘ ‘, 3, ‘*’)

imprime_linha(3, ‘ ‘, 5, ‘*’)

imprime_linha(2, ‘ ‘, 7, ‘*’)

imprime_linha(1, ‘ ‘, 9, ‘*’)

imprime_linha(3, ‘ ‘, 5, ‘*’)

imprime_linha(2, ‘ ‘, 7, ‘*’)

imprime_linha(1, ‘ ‘, 9, ‘*’)

imprime_linha(2, ‘ ‘, 7, ‘*’)

imprime_linha(1, ‘ ‘, 9, ‘*’)

imprime_linha(0, ‘ ‘, 11, ‘*’)

imprime_linha(4, ‘ ‘, 3, ‘|’)

imprime_linha(3, ‘ ‘, 5, ‘|’)

imprime_arvore()

 

■ Programa 4.11: Programa que desenha uma “árvore” com

caracteres Ascii.

 

Nesse programa, a função que imprime a linha recebe mais dois

parâmetros, permitindo que dois caracteres diferentes sejam impressos de acordo com quantidade determinada. A função imprime_arvore() chama imprime_linha() sucessivamente para desenhar uma árvore com alguns caracteres. O programa principal é composto somente de uma única chamada de imprime_arvore() , sem nenhum parâmetro. O resultado pode ser

visto na Figura 4.3.

 

Figura 4.3 Árvore impressa com caracteres Ascii.

Python ainda oferece opções bem interessantes para passar parâmetros a uma função. Veja o Programa 4.12.

def imprime_linha(n=5, carac=’*’):

print(carac * n)

num = int(input(‘Quantos caracteres você quer imprim ir?’))

qual = input(‘Qual será o caractere a ser impresso?’ )

imprime_linha(num, qual)

imprime_linha(num)

imprime_linha()

imprime_linha(carac=’@’, n=2)

 

■ Programa 4.12: Programa que imprime linha de caracteres

com parâmetro e opções padrão.

 

Neste ponto, a definição da função imprime_linha() permite valores que serão assumidos caso nada seja enviado. No exemplo, se imprime_linha() for chamada sem nenhum parâmetro, assume os valores 5 e ‘*’ para n e carac, respectivamente. Isso é útil se você deseja garantir um comportamento padrão da função, mesmo na ausência de parâmetros.

De fato, os parâmetros cujos valores foram indicados na definição de uma função passam a ser opcionais para quem chama. A equivalência de parâmetros funciona na ordem em que foram declarados. Assim, podemos fazer a chamada imprime_linha(num) e o valor padrão do caractere será assumido, mas se tentarmos chamar imprime_linha(qual), obteríamos um erro, pois a chamada tentaria atribuir uma letra a um inteiro.

Outra opção útil é atribuir diretamente os valores dos parâmetros já na chamada. Neste caso, a ordem não importa. No programa, imprime_linha(carac=’@’, n=2) é equivalente a imprime_linha(2,’@’) , porém com os parâmetros nomeados. EXERCÍCIO 4.5