Funciones, marcos de llamada y resultados devueltos
Introducido| English | Significado |
|---|---|
| function/ˈfʌŋkʃn/ | función |
| side effect/saɪd ɪˈfekt/ | efecto secundario |
| contract/ˈkɒntrækt/ | contrato |
| parameter/pəˈræmɪtə/ | parámetro |
| argument/ˈɑːɡjuːmənt/ | argumento |
| call frame/kɔːl freɪm/ | marco de llamada |
| scope/skəʊp/ | ámbito |
| local variable/ˈləʊkl ˈveərɪəbl/ | variable local |
| decomposition/ˌdiːkɒmpəˈzɪʃn/ | descomposición |
Asignar a cada función un trabajo claro
- Una función agrupa una tarea con nombre. Establezca sus entradas, su resultado devuelto y cualquier efecto secundario, como la impresión, antes de escribir el cuerpo.
- Un contrato especifica qué pueden suministrar los llamadores y qué promete la función. Aquí, las cantidades son pence enteros y deben ser enteros no negativos.
def add_fee(amount):
"""Return amount plus a fixed fee of 3 pence."""
return amount + 3
add_fee(8) evalúa a 11. No imprime nada. Mantener el cálculo separado de la presentación permite que otra función reutilice el resultado.
¿Qué contrato permite que otro cálculo use directamente la cantidad con tarifa incluida?
Dificultad 1/5 · 100 monedas + un pequeño bono en el primer intento de hoy
Un resultado devuelto puede usarse en una expresión; la salida impresa es un efecto secundario separado.
Distinguir entre el nombre de entrada y el objeto de entrada
- En una definición,
amountes un parámetro. Enadd_fee(8), la expresión8proporciona un argumento. Las expresiones de argumento se evalúan antes de ejecutar el cuerpo de la función. - La llamada vincula el nombre del parámetro al objeto suministrado. No copia automáticamente ese objeto ni crea un enlace entre el nombre del llamador y el nombre del parámetro.
amount = 4
result = add_fee(amount * 2)
print(amount, result)
La expresión del argumento proporciona 8; dentro de la llamada, amount se refiere a ese entero. El 11 devuelto se convierte en result. El amount del módulo sigue refiriéndose a 4, por lo que la salida es 4 11.
Asocia cada término con su rol en add_fee(8).
Dificultad 2/5 · 140 monedas + un pequeño bono en el primer intento de hoy
El argumento se evalúa en la llamada; su objeto se vincula al parámetro; la devolución entrega un resultado de vuelta.
Mantener un marco separado para cada llamada
- Un marco de llamada registra una llamada de función activa, incluyendo sus parámetros y nombres locales. Cuando una función llama a otra, el llamador espera el valor devuelto.
- Lea este programa en orden de ejecución: módulo →
twice→add_fee→twice→ módulo. Las flechas inferiores representan un flujo de control conceptual, no una disposición física en memoria.
def twice(amount):
subtotal = amount * 2
return add_fee(subtotal)
amount = 4
result = twice(amount)
print(amount, result)

Utilice el trazado para inspeccionar las llamadas y devoluciones. Los detalles del marco muestran el estado en la llamada anidada. Es un trazado creado manualmente para este ejemplo específico, no un intérprete de Python.
Rastrear twice(4) llamando a add_fee(8)
Separar vinculaciones locales de los valores devueltos.
Coloque estos eventos en el orden seguido por result = twice(4).
Dificultad 3/5 · 200 monedas + un pequeño bono en el primer intento de hoy
La llamada anidada termina antes de que twice pueda completar su expresión de devolución.
¿Qué entero está vinculado a amount dentro de add_fee durante esta llamada anidada?
Dificultad 2/5 · 140 monedas + un pequeño bono en el primer intento de hoy
twice calcula subtotal como 4 multiplicado por 2, luego pasa ese 8 a add_fee.
Devolver un resultado; imprimir un mensaje
returnfinaliza la llamada actual y devuelve un objeto al llamador. Una función que llega a su fin sin usarreturnretornaNone.printescribe salida. También returnsNone, por lo que imprimir un cálculo dentro de una función no hace que ese cálculo sea su resultado devuelto.
def show_fee(amount):
print(amount + 3)
value = show_fee(8)
print(value)
Esto imprime 11, luego None, en líneas separadas. Si el llamador necesita el número, use return amount + 3 y permita que el llamador decida si debe imprimirlo.
show_fee imprime 11 pero no tiene sentencia de devolución. ¿Qué se almacena en value?
Dificultad 1/5 · 100 monedas + un pequeño bono en el primer intento de hoy
Al llegar al final de una función Python se devuelve None, independientemente de la salida impresa.
Resolver nombres en el alcance correcto
- Una variable local pertenece a una llamada de función. Su alcance determina dónde se puede resolver un nombre; otra función no accede automáticamente a los nombres locales del llamador.
- Asignar un nuevo entero a un parámetro cambia su enlace local. No reasigna una variable con el mismo nombre en el llamador.
def increase(amount):
amount = amount + 1
return amount
amount = 4
new_amount = increase(amount)
print(amount, new_amount)
La salida es 4 5. Ambos nombres comienzan refiriéndose al entero 4; la asignación dentro de la función reasocia su nombre local. Para actualizar el nombre del módulo, escriba amount = increase(amount).
Después de new_amount = increase(amount), ¿qué valor mantiene todavía amount en el módulo?
Dificultad 2/5 · 140 monedas + un pequeño bono en el primer intento de hoy
Solo el nombre local de la función fue reasignado; el invocador no asignó a amount.
Descomponer un cálculo en partes probables
- La descomposición separa una tarea grande en trabajos más pequeños con contratos claros. Para un pedido, calcule el subtotal de un artículo, agregue una tarifa, luego muestre el monto final.
- Pruebe los cálculos directamente, incluyendo cantidad cero y más de un artículo. Establezca que las entradas son enteros no negativos; la validación de entrada puede ser una función separada.
def item_subtotal(unit_pence, quantity):
return unit_pence * quantity
def order_total(unit_pence, quantity):
return add_fee(item_subtotal(unit_pence, quantity))
order_total(5, 2) da como resultado 13; order_total(5, 0) da como resultado 3 bajo este contrato de tarifa fija. Si los pedidos sin artículos deben costar cero, cambie el contrato y la implementación juntos.
Bajo el contrato de tarifa fija establecido, ¿qué devuelve order_total(5, 0) en peniques?
Dificultad 2/5 · 140 monedas + un pequeño bono en el primer intento de hoy
El subtotal del artículo es cero, pero add_fee aún añade 3. Los pedidos vacíos gratuitos requieren un contrato diferente.
Explicar toda la llamada antes de confiar en la respuesta
- Rastree las expresiones de argumento, los enlaces de parámetros, los cálculos locales y los valores devueltos. Verifique el estado del llamador después de la llamada y la salida por separado.
- No describa la transmisión de parámetros como copiar cada objeto. Una colección mutable puede modificarse a través de un parámetro; los diagramas de objetos para mutación y aliasing siguen en la unidad 1.5.
Un número impreso correcto no prueba un resultado devuelto correcto. Use comprobaciones directas como assert order_total(5, 2) == 13, luego inspeccione cualquier salida esperada por separado.
Referencias del lenguaje: funciones Python y enlace de nombres y alcance.
Llamar a una función Python copia automáticamente cada objeto de argumento.
Dificultad 1/5 · 100 monedas + un pequeño bono en el primer intento de hoy
Los parámetros se vinculan a los objetos proporcionados. La copia debe solicitarse explícitamente cuando sea necesario.