| | | | |

4.3 Passagem de Parâmetros

Compre o e-book deste material aqui!

Uma função pode ter parâmetros de entada, são as varáveis de entrada que são usadas para que ela receba dados no momento em que é chamada. Esta estrutura de passar dados para uma função é chamado de passagem de parâmetros. Os parâmetros de entrada são alocados como novas variáveis no chamamento da função e ficam livres ao término de sua execução.

Exemplo 4.3.1.

Consideramos o seguinte código:

1def fun(n):
2  print('Na função:')
3  print(f'\tn = {n}, id = {id(n)}')
4  n = n + 1
5  print(f'\tn = {n}, id = {id(n)}')
6  return n
7
8n = 1
9print(f'n = {n}, id = {id(n)}')
10
11m = fun(n)
12print(f'n = {n}, id = {id(n)}')
13print(f'm = {m}, id = {id(m)}')

Na linha 10, o identificador n é criado com valor 1. Na linha 13, a função fun é chamada, um novo identificador n é criado apontando para o mesmo valor. No escopo da função (linhas 4-8), apenas este novo n é afetado. Ao término da função, este é liberado e o programa principal segue com o identificador n original.

4.3.1 Variáveis Globais e Locais

Variáveis globais são aquelas que podem ser acessadas por subprogramas (como funções) e locais são aquelas que existem somente dentro do escopo de um subprograma.

Variáveis Locais

Variáveis criadas dentro do escopo de uma função (incluindo-se os parâmetros de entrada) são locais, i.e. só existem durante a execução da função.

Exemplo 4.3.2.

Consideramos o seguinte código:

1def fun(x):
2  y = 2*x - 1
3  return y
4
5z = fun(2)
6
7try:
8  print(f'id(y) = {id(y)}')
9except:
10  print(f'y não está definida.')

Ao executarmos, imprime-se a mensagem “y não está definida”. Isto ocorre, pois y é variável local na função fun, é criada e liberada durante sua execução.

Variáveis Globais

Variáveis definidas no programa principal são globais, i.e. podem ser acessadas3535endnote: 35Em modo somente leitura. no escopo de funções, mesmo que não sejam passadas por parâmetros.

Exemplo 4.3.3.

Consideramos o seguinte código:

1x = 3
2
3def fun():
4  y = 2*x - 1
5  return y
6
7y = fun()
8print(f'x = {x}, y = {y}')

A variável x é global, i.e. é acessível na função fun. Execute o código e verifique o valor impresso.

A instrução global permite que variáveis globais possam ser modificadas dentro do escopo de funções.

Exemplo 4.3.4.

Consideramos o seguinte código:

1def fun():
2  global x
3  x = x - 1
4  y = 2*x - 1
5  return y
6
7x = 3
8y = fun()
9print(f'x = {x}, y = {y}')

4.3.2 Parâmetros com Valor Padrão

Funções podem ter parâmetros com valor padrão, i.e. no caso que a função ser chamada sem esses parâmetros, eles assumem o valor predefinido na declaração da função.

Exemplo 4.3.5.

O seguinte código, imprime uma lista com a Sequência de Fibonacci3636endnote: 36Leonardo Fibonacci, 1170 - 1250, matemático italiano. Fonte: Wikipédia: Leonardo Fibonacci.. Por padrão, apenas os cinco primeiros números da sequência são retornados pela função declarada.

1def bigollo(n=5):
2  fibo = [1]*n
3  for i in range(2,n):
4    fibo[i] = sum(fibo[i-2:i])
5  return fibo
6
7print(bigollo())

4.3.3 Vários Parâmetros

Uma função pode ter vários parâmetros de entrada. A ordem em que os parâmetros são definidos na função devem ser seguidos na passagem de valores. Por exemplo, consideramos a função

1def fun(x, y):
2  print(f'x = {x}')
3  print(f'y = {y}')

Ao chamá-la, devemos passar os valores dos parâmetros x e y na mesma ordem em que aparecem na definição da função. Por exemplo,

1>>> fun(1,2)
2x = 1
3y = 2

Podemos superar esta restrição, passando os parâmetros de forma explícita. Por exemplo,

1>>> fun(y=2, x=1)
2x = 1
3y = 2

4.3.4 Parâmetros Arbitrários

hlUma função pode ter uma quantidade arbitrária de parâmetros.

tuple como Parâmetro Arbitrário

Usa-se a seguinte sintaxe para passar parâmetros arbitrários com tuple:

1def fun(*args):
2  pass
Exemplo 4.3.6.

Os seguinte código implementa funções para a computação de raízes (reais) de polinômios de até grau 1 e de grau 2.

1import math as m
2
3def raizPoli1(a, b):
4  '''
5  ax + b = 0
6  '''
7  return {-b/a}
8
9def raizPoli2(a, b, c):
10  '''
11  ax^2 + bx + c = 0
12  '''
13  delta = b**2 - 4*a*c
14  x1 = (-b - m.sqrt(delta))/(2*a)
15  x2 = (-b + m.sqrt(delta))/(2*a)
16  return {x1, x2}
17
18def raizPoli12(*coefs):
19  if (len(coefs) == 2):
20    return raizPoli1(coefs[0], coefs[1])
21  elif (len(coefs) == 3):
22    return raizPoli2(coefs[0], coefs[1], coefs[2])
23  else:
24    raise Exception('Polinômio inválido.')
25
26print('x - 2 = 0')
27print(f'x = {raizPoli12(1,-2)}')
28
29print('2x^2 - 3x + 1 = 0')
30print(f'x = {raizPoli12(2, -3, 1)}')

dict como Parâmetros Arbitrários

Usa-se a seguinte sintaxe para passar parâmetros arbitrários com dict:

1def fun(**kwargs):
2  pass
Exemplo 4.3.7.

Os seguinte código implementa funções para a computação de raízes (reais) de polinômios de até grau 1 e de grau 2.

1import math as m
2
3def raizPoli1(a, b):
4  '''
5  ax + b = 0
6  '''
7  return {-b/a}
8
9def raizPoli2(a, b, c):
10  '''
11  ax^2 + bx + c = 0
12  '''
13  delta = b**2 - 4*a*c
14  x1 = (-b - m.sqrt(delta))/(2*a)
15  x2 = (-b + m.sqrt(delta))/(2*a)
16  return {x1, x2}
17
18def raizPoli12(**coefs):
19  if (len(coefs) == 2):
20    return raizPoli1(coefs['a'], coefs['b'])
21  elif (len(coefs) == 3):
22    return raizPoli2(coefs['a'], coefs['b'], coefs['c'])
23  else:
24    raise Exception('Polinômio inválido.')
25
26print('x - 2 = 0')
27print(f'x = {raizPoli12(a=1, b=-2)}')
28
29print('2x^2 - 3x + 1 = 0')
30print(f'x = {raizPoli12(a=2, b=-3, c=1)}')

4.3.5 Exercícios

E. 4.3.1.

Considere o seguinte código:

1x = 1
2def fun(x):
3  print(x)
4fun(2)

Sem executá-lo, diga qual seria o valor impresso no caso do código ser rodado. Justifique sua resposta.

Resposta.

2

E. 4.3.2.

Considere o seguinte código:

1def fun(x):
2  global x
3  x = x - 1

Ao executá-lo, Python gera um erro de sintaxe. Qual é esse erro e por quê ele ocorre?

Resposta.

Como parâmetro, x é variável local, mas está definida como global dentro do escopo da função. Isto causa uma ambiguidade que não é permitida em programas de computadores.

E. 4.3.3.

Considere o seguinte código:

1y = 1
2def fun(x=y):
3  y = 2
4  print(x)
5fun()

Sem executá-lo, diga qual seria o valor impresso no caso de o código ser rodado. Justifique sua resposta.

Resposta.

1

E. 4.3.4.

Defina uma função Python que retorna uma lista com os termos da Progressão Aritmética (P.A.) ai=ai1+r, i=0,1,2,,n. Como parâmetros de entrada, tenha a0 (termo inicial), r (razão da P.A.) e, por padrão, n=5 (número de termos a serem computados).

Resposta.
1def progAritm(a0, r, n=5):
2  return [a0 + i*r for i in range(n+1)]
E. 4.3.5.

Desenvolva uma função que retorna a lista de números primos entre n e m, mn. Caso n ou m não sejam fornecidos, a função deve usar n=1 e m=29 como padrão.

Resposta.
1def EhPrimo(n):
2  info = True
3  for i in range(2,n//2+1):
4    if (n % i == 0):
5      info = False
6      break
7  return info
8
9def primos(n=1, m=29):
10  lista = []
11  for x in range(n, m+1):
12    if EhPrimo(x):
13      lista.append(x)
14  return lista
E. 4.3.6.

Desenvolva uma função que verifica se um ponto pertence a um dado disco

(xa)2+(yb)2r2. (4.6)

Crie-a de forma que ela possa receber uma quantidade arbitrária de pontos para serem verificados. Os parâmetros do disco não sejam informados, ela deve usar, como padrão, o disco unitário com centro na origem.

Resposta.
1def inDisk(*pts, a=0, b=0, r=1):
2  for pt in pts:
3    if ((pt[0]-a)**2 + (pt[1]-b)**2 <= r**2):
4      print(f'({pt[0]}, {pt[1]}) pertence ao disco.')
5    else:
6      print(f'({pt[0]}, {pt[1]}) não pertence ao disco.')

Envie seu comentário

As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a Política de Uso de Dados para mais informações. Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!