explicación Python profundidad de los parámetros utilizados en los parámetros de la función y la trampa de defecto

Este artículo describe los parámetros de función y los parámetros por defecto trampa de Python, la función se divide en parámetros de texto parámetros obligatorios, los parámetros por defecto, parámetros variables y parámetros de palabras clave se refiere, a los amigos puede hacer referencia a la siguiente
en C ++ función puede ajustar los parámetros por defecto, Java no puede, sólo puede lograrse por la sobrecarga de la forma, en Python también puede configurar los parámetros por defecto, el mayor beneficio es la reducción de la dificultad de la función, la definición de función es sólo uno, y Python es un lenguaje dinámico, en el mismo espacio de nombre no puede haber querido más que el nombre de la función, si existe, aparecerá después de cubrir la parte frontal de la función.

def power(x, n=2):
  s = 1
  while n > 0:
    n = n - 1
    s = s * x
  return s

Mira los resultados:

>>> power(5)
25
>>> power(5,3)
125

Nota: el parámetro necesario en primer lugar, seguido por los parámetros por defecto, de lo contrario el intérprete de Python se quejará.
Recomendación: * Cuando hay una función de varios parámetros, los parámetros ponen frente a grandes cambios, pequeños cambios en los parámetros de poner de nuevo. Pequeños cambios en los parámetros se pueden utilizar como los parámetros por defecto.
Los parámetros por defecto tienen hoyo, vistazo al código siguiente para definir una lista, añadir una parte final:

def add_end(L=[]):
  L.append('END')
  return L

Llamar para ver los resultados:

>>> add_end([1, 2, 3])
[1, 2, 3, 'END']
>>> add_end(['x', 'y', 'z'])
['x', 'y', 'z', 'END']
>>> add_end()
['END']
>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']

Se debe explicar, la función Python definido en el tiempo, el valor por defecto del parámetro L se calculó a cabo, es decir, []. En este punto L []. Así que si el contenido del cambio L de los contenidos de la siguiente llamada ya no se hace referencia a [] a. Así que tener en cuenta que la definición de los parámetros por defecto debe apuntar objetos inmutables! .

Variable parámetro
el primer método, el parámetro pasa a una lista o tupla.

def calc(numbers):
  sum = 0
  for n in numbers:
    sum = sum + n * n
  return sum

invocación:

>>> calc([1, 2, 3])
14
>>> calc((1, 3, 5, 7))
84

La segunda forma de realización, una pluralidad de parámetros directamente en la función interna recibido automáticamente por un tupla.

def calc(*numbers):
  sum = 0
  for n in numbers:
    sum = sum + n * n
  return sum

invocación:

>>> calc(1, 2)
5
>>> calc()
0

Si quieres esta vez una lista o tupla en la transferencia de datos en cuenta, puede ser:

>>> nums = [1, 2, 3]
>>> calc(*nums)
14

argumentos de palabra clave
de palabras clave permiten argumentos pasa 0 o cualquier número de parámetros, incluyendo el nombre del parámetro, estos parámetros de palabras clave se reúnan de forma automática en un diccionario dentro de la función.

def person(name, age, **kw):
  print 'name:', name, 'age:', age, 'other:', kw

llamar a:

>>> person('Michael', 30)
name: Michael age: 30 other: {}
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

combinación de parámetros
se definen en función de Python, puede ser un parámetro obligatorio, los parámetros por defecto y los parámetros de los parámetros variables de palabras clave, estos cuatro parámetros se pueden utilizar juntos, o sólo algunos, pero tenga en cuenta que los parámetros de orden se definen como ellos son: parámetros obligatorios, los parámetros por defecto, parámetros variables y parámetros de palabras clave.
función recursiva
nada básica de que hablar, y Java / C ++ en el mismo, el propio que la llamada de uno. Aquí centrarse en lo que la optimización de recursión de cola. De hecho la cola del bucle recursivo y el efecto es el mismo, es evidente que una de las ventajas es que podemos evitar que el desbordamiento de pila recursiva llamada.
Definición: llama a sí mismo cuando se devuelve la función y, instrucción de retorno no pueden contener expresiones. Compilador o intérprete puede hacer para optimizarlo, no importa cuántas veces se debe llamar, sólo se necesita un marco de pila, no se produce desbordamiento.
Aquí está un ejemplo sencillo de la función factorial como ejemplo:

def fact(n):
  if n==1:
    return 1
  return n * fact(n - 1)

Si el n entrante es grande, puede desbordarse, que se debe volver n * hecho de (n - 1) introduce una expresión de multiplicación, no es la recursión de cola. El cambio en el código:

def fact(n):
  return fact_iter(n, 1)
 
def fact_iter(num, product):
  if num == 1:
    return product
  return fact_iter(num - 1, num * product)

Los parámetros por defecto trampa
definición de función Python proporciona los parámetros por defecto se seleccionan de tal manera que la definición de función y el uso de más flexible, pero también llevar una cisterna, por ejemplo, antes de un ejemplo:
definición de función:

def add_end(L=[]):
  L.append('END')
  return L

El resultado de llamar a la función:

>>> add_end([1, 2, 3])
[1, 2, 3, 'END']
>>> add_end(['x', 'y', 'z'])
['x', 'y', 'z', 'END']
>>> add_end()
['END']
>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']

Está claro que la definición no coincide con la intención original de la función, una explicación frase es:
los valores predeterminados se calculan una sola vez, el entonces utilizada nuevamente.
Con el fin de estudiar este tema, nos fijamos en otro ejemplo:

# coding=utf-8
 
def a():
  print "a executed"
  return []
 
def b(x=a()):
  print "id(x):", id(x)
  x.append(5)
  print "x:", x
 
for i in range(2):
  print "不带参数调用,使用默认参数"
  b()
  print b.__defaults__
  print "id(b.__defaults__[0]):", id(b.__defaults__[0])
 
for i in range(2):
  print "带参数调用,传入一个list"
  b(list())
  print b.__defaults__
  print "id(b.__defaults__[0]):", id(b.__defaults__[0])

NOTA: explicar un poco, todos los valores por defecto se almacenan en __defaults__ objeto función propiedad, que es una lista de cada elemento son unos valores de los parámetros por defecto.
Echar un vistazo a la salida:

a executed
不带参数调用,使用默认参数
id(x): 140038854650552
x: [5]
([5],)
id(b.__defaults__[0]): 140038854650552
不带参数调用,使用默认参数
id(x): 140038854650552
x: [5, 5]
([5, 5],)
id(b.__defaults__[0]): 140038854650552
带参数调用,传入一个list
id(x): 140038854732400
x: [5]
([5, 5],)
id(b.__defaults__[0]): 140038854650552
带参数调用,传入一个list
id(x): 140038854732472
x: [5]
([5, 5],)
id(b.__defaults__[0]): 140038854650552

análisis simple de la salida:
Línea 1
en la definición de la función B (), es decir def ejecución de la declaración código línea 7 def b (x = a ( )): cuando estas palabras utilizando parámetros por defecto, definen en cuando se va a calcular el valor por defecto del parámetro x, y esta vez va a llamar a (), por lo que imprimir una ejecutado.
6 segundos para alinear
la primera vez a través del bucle, el código en la línea 14 para llamar a B () no pasa los parámetros, utilizando parámetros por defecto, cuando x = [], de modo que después de una sola llamada

print b.__defaults__

La salida es

([5],)

7 a 11 de la fila
del segundo ciclo, los primeros 14 líneas de código para llamar a B () no pasa los parámetros, utilizando parámetros por defecto.
Nota: los parámetros por defecto serán contados solamente una vez, lo que significa que el área de memoria es fija, pero la dirección apuntada a una lista, el contenido puede ser cambiado en este tiempo porque la última llamada x: [5], por lo

print b.__defaults__

La salida es

([5, 5],)

12 a 16 filas de
la segunda bucle, el primer bucle, la primera línea de código 20 de lista de entrada vacía, los parámetros por defecto no se utiliza, entonces x = [], por lo

print b.__defaults__

La salida es

([5],)

21, línea 18 a
la segunda bucle, el segundo ciclo, la línea de código 20 aprobó una lista vacía, que no utiliza los parámetros por defecto, sigue siendo el caso x = [], por lo

print b.__defaults__

La salida seguirá siendo

([5],)

Las funciones son objetos, por lo que cuando se ejecuta la definición, los parámetros por defecto están en función de la propiedad, su valor puede cambiar a medida que la función es llamada. Otros objetos que no son ciertas?
Tenga en cuenta: los parámetros por defecto deben apuntar a los mismos objetos! cambio de código como sigue:

# coding=utf-8
 
def a():
  print "a executed"
  return None
 
def b(x=a()):
  print "id(x):", id(x)
  if x is None:
    x = []
  x.append(5)
  print "x:", x
 
for i in range(2):
  print "不带参数调用,使用默认参数"
  b()
  print b.__defaults__
  print "id(b.__defaults__[0]):", id(b.__defaults__[0])
 
for i in range(2):
  print "带参数调用,传入一个list"
  b(list())
  print b.__defaults__
  print "id(b.__defaults__[0]):", id(b.__defaults__[0])

La producción en este momento para ver lo que el resultado es:

a executed
不带参数调用,使用默认参数
id(x): 9568656
x: [5]
(None,)
id(b.__defaults__[0]): 9568656
不带参数调用,使用默认参数
id(x): 9568656
x: [5]
(None,)
id(b.__defaults__[0]): 9568656
带参数调用,传入一个list
id(x): 140725126699632
x: [5]
(None,)
id(b.__defaults__[0]): 9568656
带参数调用,传入一个list
id(x): 140725126699704
x: [5]
(None,)
id(b.__defaults__[0]): 9568656

Me dirijo a usted, para todo el mundo para recomendar una muy amplia recolección de recursos de aprendizaje pitón, haga clic para entrar , hay un programador senior antes de aprender a compartir experiencias, notas de estudio, hay una posibilidad de experiencia en los negocios, y para todo el mundo para organizar cuidadosamente un cero pitón la base de los datos de proyecto real, pitón diariamente para que en la última tecnología, las perspectivas, aprender a dejar un mensaje de pequeños detalles

Publicado 34 artículos originales · ganado elogios 51 · Vistas a 40000 +

Supongo que te gusta

Origin blog.csdn.net/haoxun10/article/details/104806026
Recomendado
Clasificación