quinta-feira, 11 de janeiro de 2018

Dia 6

Python - Visão Geral

Funções: Com Retorno:
Exemplo:
def fibonacci(n):
  a, b, f = 0, 1, ''
  while b < n:
    a, b, f = b, a+b, f+str(b)+' '
  return f

print(fibonacci(20)) # 1 1 2 3 5 8 13
--------------------------------------------------------------------
Funções: Argumento com Valor Padrão:
Podemos definir valores default para argumentos de entrada. 
Não utilize como valor default, listas, dicionários ou outros elementos mutáveis, podemos ter diferença nos resultados.
Exemplos:
def aplicar_multa(valor, taxa=0.15):
  return valor*(1. + taxa)

print ('Valor a pagar: %5.2f' % aplicar_multa(100))
print ('Valor a pagar: %5.2f' % aplicar_multa(100, .25))
# Valor a pagar: 115.00
Valor a pagar: 125.00

from math import sqrt
def eq2grau(a, b = .0, c = .0): # o ponto informa parâmetro float
  #print(type(a),type(b),type(c))
  delta = b**2 - 4*a*c
  if delta > 0:
    r1 = (-b + sqrt(delta))/(2*a)
    r2 = (-b - sqrt(delta))/(2*a)
  else:
    r1 = complex(-b/(2*a), sqrt(-delta)/(2*a))
    r2 = complex(-b/(2*a), -sqrt(-delta)/(2*a))
  return ( r1, r2 )
print(eq2grau(2))           # ((-0-0j), (-0+0j))
print(eq2grau(2,4))         # (0.0, -2.0)
print(eq2grau(2,5,3))       # (-1.0, -1.5)
print(eq2grau(2,c=2))       # ((-0+1j), (-0-1j))
print(eq2grau(a=2))         # ((-0-0j), (-0+0j))
print(eq2grau(b=4,a=2))     # (0.0, -2.0)
print(eq2grau(c=3,a=2,b=5)) # (-1.0, -1.5)
print(eq2grau(c=2,a=2))     # ((-0+1j), (-0-1j))

As variáveis b e c possuem valor padrão (opcionais).
Já a variável a é obrigatória e deve ser informada na chamada. Veja:
print(eq2grau(b=2, c=4))

Traceback (most recent call last):
File "<stdin>", line 12, in <module>
    print(eq2grau(b=2, c=4))
TypeError: eq2grau() missing 1 required positional argument: 'a'
--------------------------------------------------------------------
Funções: Conjunto de Argumentos:
Um conjunto de argumentos opcionais podem ser passados com o auxílio do curinga “*”.
Exemplo:
def media(*valores):
  soma = 0.
  for n in valores:
    soma += n
  return soma/len(valores)

print(media(1,2,3,4,5,6))
--------------------------------------------------------------------
Funções: 2 Conjuntos de Argumentos:
Podemos passar 2 conjuntos de argumentos opcionais, utilize '**'.
Este 2º conjunto deve ter a seguinte estrutura:
var_0='valor_0', var_1='valor_1', etc.
Se for usar '*' e '**', use sempre o '*' antes do '**'.
Exemplo:
def fnc2arg(nome, **numeros):
  print (nome + ':')
  for i in numeros.keys():
    print ('%10s : %d' % (i, numeros[i]))

def fnc3arg(nome, *strings, **numeros):
  print (nome + ':')
  for i in strings:
    print ('> ', i)
  keys = numeros.keys()
  for i in keys:
    print ('%10s : %d' % (i, numeros[i]))

print(fnc2arg('Numeros', um=1, dois=2, tres=3, quatro=4, cinco=5))
print(fnc3arg('Numeros', 'Os números são ordenados', 'pelos seus nomes', um=1, dois=2, tres=3, quatro=4, cinco=5))
print(fnc3arg('Numeros', um=1, dois=2, tres=3, quatro=4, cinco=5))
# Numeros:
#         um : 1
#       dois : 2
#       tres : 3
#     quatro : 4
#      cinco : 5
# None
# Numeros:
# >  Os números são ordenados
# >  pelos seus nomes
#         um : 1
#       dois : 2
#       tres : 3
#     quatro : 4
#      cinco : 5
# None
# Numeros:
#         um : 1
#       dois : 2
#       tres : 3
#     quatro : 4
#      cinco : 5
# None
--------------------------------------------------------------------
Escopo da Variável:
Se uma variável é definida no bloco principal do programa, ela estará disponível no escopo de todas as funções definidas adiante
Exemplo:
a = 5
b = 8
def soma(x,y):
  print ('a =',a, 'b =', b)
  return x+y

print(soma(2, 7))
# a = 5 b = 8
# 9

Os valores de a e b são exibidos, mesmo elas não tendo sido passadas para a função soma(). 
Assim, estas variáveis fazem parte do escopo da função soma().

Ao atribuirmos valores para a e b dentro da função produto(), os valores iniciais de a e b não são alterados, por causa do seu escopo original
Exemplo:
a = 5
b = 8
def produto(x,y):
  a, b = x, y
  print ('produto: a =',a, 'b =', b)
  return a * b

print(produto(2, 7))
# produto: a = 2 b = 7
# 14
print ('a =',a, 'b =', b)
# a = 5 b = 8
--------------------------------------------------------------------
Globals() e Locals():
A função globals() retorna um dicionário com todo o escopo global e os seus valores.
A função locals() retorna um dicionário semelhante ao da função glocals(), mas para escopo local.
Exemplo: 
a = 5
b = 8
def produto(x,y):
  print(locals())
  a, b = x, y
  print ('produto: a =',a, 'b =', b)
  return a * b

print(produto(2, 7))
print('a =',a, 'b =', b)
print(globals())
# {'y': 7, 'x': 2}
# produto: a = 2 b = 7
# 14
# a = 5 b = 8
# {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:\\Users\\M\\Desktop\\teste.py', 'a': 5, 'b': 8, 'produto': <function produto at 0x031D1B70>}
--------------------------------------------------------------------
Função Global():
Permite definir uma variável de escopo global de dentro da função.
Exemplo:
def potencia(x,n):

  global p
  p = n
  return x**p, locals()
print(potencia(3,3)) # (27, {'n': 3, 'x': 3})
print (p) # 3
print (n) #ERRO

#Traceback (most recent call last):
#File "<stdin>", line 8, in <module>
#NameError: name 'n' is not defined

Executando a função locals() para observar os argumentos passados:

**numeros é passado como um dicionário e *strings como uma tupla.
Veja a impressão na tela.
Exemplo:

def fnc3arg(nome, *strings, **numeros):
  print (nome + ":")
  for i in strings:
    print ('> ', i)
  keys = numeros.keys()
  for i in keys:
    print ('%10s : %d' % (i, numeros[i]))
  return locals()

print(fnc3arg('Numeros', 'Os números são ordenados', 'pelos seus nomes', um=1, dois=2, tres=3, quatro=4, cinco=5))
# Numeros:
# >  Os números são ordenados
# >  pelos seus nomes
#         um : 1
#       dois : 2
#       tres : 3
#     quatro : 4
#      cinco : 5
# {'keys': dict_keys(['um', 'dois', 'tres', 'quatro', 'cinco']), 'i': 'cinco', 'numeros': {'um': 1, 'dois': 2, 'tres': 3, 'quatro': 4, 'cinco': 5}, 'strings': ('Os números são ordenados', 'pelos seus nomes'), 'nome': 'Numeros'}
--------------------------------------------------------------------

Nenhum comentário:

Postar um comentário