Funções

  • Até agora, vimos diversos tipos de dados, atribuições, comparações e estruturas de controle.
  • A ideia da função é dividir para conquistar, onde:
    • Um problema é dividido em diversos subproblemas
    • As soluções dos subproblemas são combinadas numa solução do problema maior.
  • Esses subproblemas têm o nome de funções.

  • Funções possibilitam abstrair, ou seja permite capturar a computação realiza e tratá-la como primitiva.

  • Suponha que queremos que a variável z seja o máximo de dois números (x e y).
  • Um programa simples seria:

    if x > y:
      z = x
    else:
      z = y
  • A ideia é encapsular essa computação dentro de um escopo que pode ser tratado como primitiva.

    • É utilizado simplesmente chamando o nome e fornecendo uma entrada.
    • Os detalhes internos sendo escondidos dos usuários.
  • Uma função tem 3 partes importantes:

    def <nome> ( <parametros> ):
          <corpo da função>
  • def é uma palavra chave

  • <nome> é qualquer nome aceito pelo Python
  • <parametros> é a quantidade de parâmetros que será passado para a função (pode ser nenhum).
  • <corpo da função> contém o código da função.

Voltando ao exemplo:


In [1]:
def maximo(x, y):
    if x > y:
        z = x
    else:
        z = y

Ótimo temos uma função e podemos reaproveita-la. Porém, para de fato reaproveita-la temos que utilizar o comando return.


In [2]:
def maximo(x, y):
    if x > y:
        return x
    else:
        return y

Pronto agora sim! Já podemos reaproveitar nossa função!

E como fazer isso?


In [3]:
z = maximo(3, 4)

Quando chamamos a função maximo(3, 4) estamos definindo que x = 3 e y = 4. Após, as expressões são avaliadas até que não se tenha mais expressões, e nesse caso é retornado None. Ou até que encontre a palavra especial return, retornando como valor da chamada da função.


In [4]:
print(z)


4

Já entendemos o que é e como criar funções.

Para testar vamos criar uma função que irá realizar uma conta.


In [5]:
def economias (dinheiro, conta, gastos):
    total = (dinheiro + conta) - gastos
    return (total)

In [6]:
eco = economias(10, 20, 10)
print(eco)


20

Também podemos definir um valor padrão para um ou mais argumentos

Vamos reescrever a função economias para que os gastos sejam fixados em 150, caso não seja passado nenhum valor por padrão.


In [7]:
def economias(dinheiro, conta, gastos=150):
    total = (dinheiro + conta) - gastos
    return(total)

In [8]:
print(economias(100, 60))


10

In [9]:
print(economias(100, 60, 10))


150

É importante notar que uma variável que está dentro de uma função, não pode ser utilizada novamente enquanto a função não terminar de ser executada.

No mundo da programação, isso é chamado de escopo. Vamos tentar imprimir o valor da variável dinheiro.


In [10]:
print(dinheiro)


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-10-7f3f8da2b4c1> in <module>()
----> 1 print(dinheiro)

NameError: name 'dinheiro' is not defined

Por que isso aconteceu?

Esse erro acontece pois a variável dinheiro somente existe dentro da função economias, ou seja, ela existe apenas no contexto local dessa função.

Vamos modificar novamente a função economias:


In [11]:
def economias(dinheiro, conta, gastos=150):
    total = (dinheiro + conta) - gastos
    total = total + eco
    return(total)

In [12]:
print(economias(100,60))


30

Por que não deu problema?

Quando utilizamos uma variável que está fora da função dentro de uma função estamos utilizando a ideia de variáveis globais, onde dentro do contexto geral essa variável existe e pode ser utilizada dentro da função.

Isso não é recomendado! O correto seria ter um novo argumento!

Exercício de Funções

Crie uma função que receba dois argumentos.

  • O primeiro argumento é o valor de um determinado serviço
  • O segundo é a porcentagem da multa por atraso do pagamento. O valor padrão da porcentagem, se não passado, é de 7%. A função deve retornar o valor final da conta com o juros. Lembre-se de converter 7%.

In [ ]:
def conta(valor, multa=7):
     # Seu código aqui

Funções embutidas

Python tem um número de funções embutidas que sempre estão presentes. Uma lista completa pode ser encontrada em https://docs.python.org/3/library/functions.html.

Já utilizamos algumas delas! Quais?

input

Uma outra função que é bem interessante, é a input. Essa função permite que o usuário digite uma entrada, por exemplo:


In [ ]:
idade = input('Digite sua idade:')
print(idade)

In [ ]:
nome = input('Digite seu nome:')
print(nome)

In [ ]:
print(type(idade))

In [ ]:
print(type(nome))

Note que ambas as variáveis são strings. Portanto precisamos converter para inteiro a idade.


In [ ]:
idade = int(input("Digite sua idade:"))

In [ ]:
print(type(idade))

open

A função open, permite abrir um arquivo para leitura e escrita.

open(nome_do_arquivo, modo)

Modos:

    * r - abre o arquivo para leitura.
    * w - abre o arquivo para escrita.
    * a - abre o arquivo para escrita acrescentando os dados no final do arquivo.
    * + - pode ser lido e escrito simultaneamente.

In [13]:
import os
os.remove("arquivo.txt")

In [ ]:
arq = open("arquivo.txt", "w")

In [ ]:
for i in range(1, 5):
    arq.write('{}. Escrevendo em arquivo\n'.format(i))

In [ ]:
arq.close()

Métodos

  • read() - retorna uma string única com todo o conteúdo do arquivo.
  • readlines() - todo o conteúdo do arquivo é salvo em uma lista, onde cada linha do arquivo será um elemento da lista.

In [ ]:
f = open("arquivo.txt", "r")
print(f, '\n')
texto = f.read()
print(texto)
f.close()

In [ ]:
f = open("arquivo.txt", "r")
texto = f.readlines()
print(texto)
f.close()

In [ ]:
#help(f.readlines)

Para remover o \n podemos utilizar o método read que irá gerar uma única string e depois aplicamos o método splitlines.


In [ ]:
f = open("arquivo.txt", "r")
texto = f.read().splitlines()
print(texto)
f.close()