| | | |

Algoritmos e Programação I

4 Funções

Compre o e-book deste material aqui! Consulte outras formas de colaborar.

4.3 Passagem de parâmetros

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 as que podem ser acessadas por subprogramas (como funções) e locais são as 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,

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

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

1fun(y=2, x=1)
x = 1
y = 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.

Complete as lacunas.

  1. a)

    Parâmetros de entrada são variáveis usadas para que uma função receba dados quando chamada.

  2. b)

    Variáveis globais são as que podem ser acessadas por subprogramas.

  3. c)

    Variáveis criadas dentro do escopo de uma função são locais.

  4. d)

    Parâmetros de entrada arbitrários podem ser definidos usando tuples ou dicts.

Resposta.

a) variáveis; b) globais; c) locais; d) tuples; dicts.

E. 4.3.2.

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.3.

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.4.

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.5.

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.6.

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.7.

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

Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!

Opcional. Preencha seu nome para que eu possa lhe contatar.
Opcional. Preencha seu e-mail para que eu possa lhe contatar.
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.

Licença Creative Commons
Este texto é disponibilizado nos termos da Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional. Ícones e elementos gráficos podem estar sujeitos a condições adicionais.

Algoritmos e Programação I

4 Funções

Compre o e-book deste material aqui! Consulte outras formas de colaborar.

4.3 Passagem de parâmetros

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 as que podem ser acessadas por subprogramas (como funções) e locais são as 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,

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

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

1fun(y=2, x=1)
x = 1
y = 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.

Complete as lacunas.

  1. a)

    Parâmetros de entrada são variáveis usadas para que uma função receba dados quando chamada.

  2. b)

    Variáveis globais são as que podem ser acessadas por subprogramas.

  3. c)

    Variáveis criadas dentro do escopo de uma função são locais.

  4. d)

    Parâmetros de entrada arbitrários podem ser definidos usando tuples ou dicts.

Resposta.

a) variáveis; b) globais; c) locais; d) tuples; dicts.

E. 4.3.2.

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.3.

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.4.

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.5.

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.6.

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.7.

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

Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!

Opcional. Preencha seu nome para que eu possa lhe contatar.
Opcional. Preencha seu e-mail para que eu possa lhe contatar.
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.

Licença Creative Commons
Este texto é disponibilizado nos termos da Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional. Ícones e elementos gráficos podem estar sujeitos a condições adicionais.

Pedro H A Konzen
| | | |