domingo, 16 de marzo de 2025

Thinkcspy. 6.1 Funciones

 
Como introduccion al tema de funciones puedes ver este video (en ingles), de Thinkcspy

 

En Python, una función es una secuencia nombrada de declaraciones que pertenecen juntos. Su objetivo principal es ayudarnos Organizar programas en fragmentos que coincidan con la forma en que pensamos la solución al problema.

La sintaxis para una definición de función es:

def name( parameters ):
    statements

Puede inventar cualquier nombre que desee para las funciones que cree, excepto que No puede usar un nombre que sea una palabra clave de Python, y los nombres deben seguir las reglas para identificadores legales que se dieron anteriormente. Los parámetros especifican Qué información, si la hay, debe proporcionar para usar la nueva función. Otra forma de decir esto es que los parámetros especifican lo que la función necesita hacer su trabajo.

Puede haber cualquier cantidad de declaraciones dentro de la función, pero tienen que ser sangrado del def. En los ejemplos de este libro, usaremos el Allorización estándar de cuatro espacios. Las definiciones de funciones son la segunda de Varias declaraciones compuestas que veremos, todas las cuales tienen lo mismo patrón:

  1. Una línea de encabezado que comienza con una palabra clave y termina con un colon.

  2. Un cuerpo que consta de una o más declaraciones de Python, cada una sangría la misma cantidad - 4 espacios es el estándar de Python - de la línea de encabezado. 

    Ya hemos visto el for bucle que sigue este patrón.

    En una definición de función, la palabra clave en el encabezado es def, que es seguido por el nombre de la función y algunos parámetros encerrados en paréntesis. La lista de parámetros puede estar vacía, o puede contener cualquier número de Parámetros separados entre sí por comas. En cualquier caso, se requieren los paréntesis.

    Necesitamos decir un poco más sobre los parámetros. En la definición, la lista de parámetros se conoce más específicamente como el parámetros formales . Esta lista de nombres describe esas cosas que la función Necesita recibir del usuario de la función. Cuando usa una función, proporciona valores a los parámetros formales .

    La siguiente figura muestra esta relación. Una función necesita cierta información para hacer su trabajo. Estos valores, a menudo llamados argumentos o parámetros reales , se pasan a la función por el usuario. 

     ../_images/blackboxproc.png

    Este tipo de diagrama a menudo se llama diagrama de caja negra porque solo establece los requisitos desde la perspectiva del usuario. El usuario debe conocer el nombre de la función y qué argumentos deben aprobarse. Los detalles de cómo funciona la función se ocultan dentro de la "caja negra".

    Supongamos que estamos trabajando con tortugas y una operación común que necesitamos es dibujar cuadrícula. Tendría sentido si no tuviéramos que duplicar todos los pasos cada vez que queremos hacer un cuadrado. Se puede considerar "dibujar un cuadrado" como una abstracción de varios pasos más pequeños. Tendremos que proporcionar dos piezas de información para que la función haga su trabajo: una tortuga para hacer el dibujo y un tamaño para el costado del cuadrado. Podríamos representar esto usando el siguiente diagrama de caja negra.

    ../_images/turtleproc.png

    Aquí hay un programa que contiene una función para capturar esta idea. Probar. 

    >>import turtle

    >>def drawSquare(t, sz):
        """Make turtle t draw a square of with side sz."""

    >>    for i in range(4):
    >>        t.forward(sz)
    >>        t.left(90)


    >>wn = turtle.Screen()              # Set up the window and its attributes
    >>wn.bgcolor("lightgreen")

    >>alex = turtle.Turtle()            # create alex
    >>drawSquare(alex, 50)             # Call the function to draw the square passing the actual turtle and the actual side size

    >>wn.exitonclick()

    Esta función se nombra drawSquare. Tiene dos parámetros: uno para decir la función que tortuga moverse y la otra para decirle el tamaño de la plaza queremos dibujar. En la definición de función se llaman ty sz respectivamente. Asegúrese de saber dónde el cuerpo de la función termina: depende de la sangría y las líneas en blanco no cuentan para ¡Este propósito!

    cajas

    Si lo primero después del encabezado de la función es una cadena (algunas herramientas insisten en que Debe ser una cadena citada triple), se llama DOCSTRING y recibe un tratamiento especial en Python y en algunas de las herramientas de programación.

    Otra forma de recuperar esta información es usar el interactivo intérprete e ingresa la expresión <function_name>.__doc__, que recuperará el DOCSTRING para la función. Entonces, la cadena que escribe como documentación al comienzo de una función es recuperable por Python Tools en tiempo de ejecución . Esto es diferente de los comentarios en su código, que se eliminan por completo cuando se analiza el programa.

    Por convención, los programadores de Python usan documentos para la documentación clave de sus funciones.

    Definir una nueva función no hace que la función se ejecute. Para hacer eso necesitamos un llamada de función . Esto también se conoce como una función de invocación . Ya hemos visto cómo llamar a algunas funciones incorporadas como print, rangey int. Las llamadas de la función contienen el nombre de la función que se ejecutado seguido de una lista de valores entre paréntesis, llamados argumentos , que se asignan a los parámetros en la definición de función. Entonces en el segundo a la última línea de el programa, llamamos a la función y pasamos alex como la tortuga a ser manipulada, y 50 como el tamaño del cuadrado que queremos.

    Una vez que hemos definido una función, podemos llamarla tan a menudo como nos gustamos y es Las declaraciones se ejecutarán cada vez que lo llamemos. En este caso, podríamos usarlo para obtener Una de nuestras tortugas para dibujar un cuadrado y luego podemos mover la tortuga y hacer que dibuje un cuadrado diferente en un Diferente ubicación. Tenga en cuenta que levantamos la cola para que cuando alex Movimientos No hay rastro. Ponemos la cola Vuelva a bajar antes de dibujar el siguiente cuadrado. Asegúrese de poder identificar ambas invocaciones del drawSquare función.

    Comprueba tu comprensión

    ¿Qué es una función en Python?






    Actividad: 6.1.6 Opción múltiple (test_Question5_1_1)

    ¿Cuál es un propósito principal de una función?






    Actividad: 6.1.7 Opción múltiple (test_Question5_1_2)

    ¿Cuál de los siguientes es un encabezado de función válido (primera línea de una definición de función)?






    Actividad: 6.1.8 Opción múltiple (test_Question5_1_3)

    ¿Cuál es el nombre de la siguiente función?

    def drawSquare(t, sz):
        """Make turtle t draw a square of with side sz."""
        for i in range(4):
            t.forward(sz)
            t.left(90)
    





    Actividad: 6.1.9 Opción múltiple (test_Question5_1_4)

    ¿Cuáles son los parámetros de la siguiente función?

    def drawSquare(t, sz):
        """Make turtle t draw a square of with side sz."""
        for i in range(4):
            t.forward(sz)
            t.left(90)
    





    Actividad: 6.1.10 Opción múltiple (test_Question5_1_5)

    Teniendo en cuenta la función a continuación, ¿cuál de las siguientes afirmaciones invoca correctamente o llama, esta función (es decir, hace que se ejecute)? Suponga que ya tenemos una tortuga llamada Alex.

    def drawSquare(t, sz):
        """Make turtle t draw a square of with side sz."""
        for i in range(4):
            t.forward(sz)
            t.left(90)
    






    Actividad: 6.1.11 Opción múltiple (test_Question5_1_6)

    Verdadero o falso: se puede llamar a una función varias veces colocando una llamada de función en el cuerpo de un bucle.




    Actividad: 6.1.12 Opción múltiple (test_Question5_1_7)



     



sábado, 15 de marzo de 2025

Thinkcspy. 5.7 Ejercicios de final de capitulo

 

5.7. Ejercicios del capitulo 

 

16. Usar un for Declaración para imprimir 10 números aleatorios. 

Solución de PPI:
 
>># Usar un for Declaración para imprimir 10 números aleatorios.
>>import random
>>i = 1
>>for i in range(10):
>>  print(random.randint(1,100))
>>  i += 1


>>>
22
10
48
95
84
17
80
87
92
57
 17. Repita el ejercicio anterior, pero este tiempo imprima 10 números 
aleatorios entre 25 y 35, inclusive. 
>>import random
>>i=1
>>for i in range(1,10):
>> print(random.randint(25,35))
>> i+=1

 
>>> 
29
26
35
31
25
27
29
29
26
 

18. El teorema pitagórico nos dice que la longitud de la hipotenusa de un triángulo rectangulo está relacionado con las longitudes de los otros dos lados. Mira a través del math Módulo y ver si puede encontrar una función que calcule esta relación para usted. Una vez que lo encuentre, escriba un programa corto para probarlo.

>>print('Inicio de codigo')
>>import math

>>print(math.hypot(3.0,4.0))
>>print('Fin de codigo') 
>>> 
Inicio de codigo
5.0
Fin de codigo 
 

19. Busque en Internet una forma de calcular una aproximación para PI . Hay muchos que usan aritmética simple. Escriba un programa para calcular la aproximación y luego imprima ese valor, así como el valor de math.pi Del módulo matemático. 

>>print('Inicio de codigo')
>>import math
>># se tiene un circulo de diamtro 1 m; y de perimetro 3.141516
>>diametro = 1
>>perimetro = 3.141516
>>pi = perimetro / diametro
>>print(pi)
>>print(math.pi)
>>print('Fin de codigo')

 

>>>Inicio de codigo
>>>3.141516
>>>3.141592653589793
>>>Fin de codigo

 

domingo, 9 de marzo de 2025

Thinkcspy. 5.6 Glosario del capitulo 5

 

5.6. Glossary

determinista

Un proceso que es repetible y predecible .

documentation

Un lugar donde puede ir para obtener información detallada sobre aspectos de su lenguaje de programación.

module

Un archivo que contiene definiciones y declaraciones de Python destinadas a su uso en Otros programas de Python. El contenido de un módulo está disponible para el otro programa utilizando la de importación .

número de pseudo-aleatorio

Un número que no es genuinamente aleatorio, sino que se crea algorítmicamente.

Número

Un número que se genera de tal manera que exhibe aleatoriedad estadística.

Generador de números aleatorios

Una función que le proporcionará números aleatorios, generalmente entre 0 y 1.

Biblioteca estándar

Una colección de módulos que forman parte de la instalación normal de Python.

Python. Teoria de tipos de datos. Aprende con Alf

 

Tipos de Datos Primitivos Simples

Tipos de datos primitivos simples

  • Números (numbers): Secuencia de dígitos (pueden incluir el - para negativos y el . para decimales) que representan números.
    Ejemplo. 0, -1, 3.1415.
  • Cadenas (strings): Secuencia de caracteres alfanuméricos que representan texto. Se escriben entre comillas simples o dobles.
    Ejemplo. ‘Hola’, “Adiós”.
  • Booleanos (boolean): Contiene únicamente dos elementos True y False que representan los valores lógicos verdadero y falso respectivamente.

Estos datos son inmutables, es decir, su valor es constante y no puede cambiar.

Tipos de datos primitivos compuestos (contenedores)

  • Listas (lists): Colecciones de objetos que representan secuencias ordenadas de objetos de distintos tipos. Se representan con corchetes y los elementos se separan por comas.
    Ejemplo. [1, “dos”, [3, 4], True].
  • Tuplas (tuples). Colecciones de objetos que representan secuencias ordenadas de objetos de distintos tipos. A diferencia de las listas son inmutables, es decir, que no cambian durante la ejecución. Se representan mediante paréntesis y los elementos se separan por comas.
    Ejemplo. (1, ‘dos’, 3)
  • Diccionarios (dictionaries): Colecciones de objetos con una clave asociada. Se representan con llaves, los pares separados por comas y cada par contiene una clave y un objeto asociado separados por dos puntos.
    Ejemplo. {‘pi’:3.1416, ’e’:2.718}.

Clase de un dato (type())

La clase a la que pertenece un dato se obtiene con el comando type()

>>> type(1)
<class 'int'>
>>> type("Hola")
<class 'str'>
>>> type([1, "dos", [3, 4], True])
<class 'list'>
>>>type({'pi':3.1416, 'e':2.718})
<class 'dict'>
>>>type((1, 'dos', 3))
<class 'tuple'>

Números (clases int y float)

Secuencia de dígitos (pueden incluir el - para negativos y el . para decimales) que representan números. Pueden ser enteros (int) o reales (float).

>>> type(1)
<class 'int'>
>>> type(-2)
<class 'int'>
>>> type(2.3)
<class 'float'>

Operadores aritméticos

  • Operadores aritméticos: + (suma), - (resta), * (producto), / (cociente), // (cociente división entera), % (resto división entera), ** (potencia).

Orden de prioridad de evaluación:



1 Funciones predefinidas
2 Potencias
3 Productos y cocientes
4 Sumas y restas


Se puede saltar el orden de evaluación utilizando paréntesis ( ).

>>> 2+3
5
>>> 5*-2
-10
>>> 5/2
2.5
>>> 5//2
2
>>> (2+3)**2
25

Operadores lógicos con números

Devuelven un valor lógico o booleano.

  • Operadores lógicos: == (igual que), > (mayor que), < (menor que), >= (mayor o igual que), <= (menor o igual que), != (distinto de).
>>> 3==3
True
>>> 3.1<=3
False
>>> -1!=1
True

Cadenas (clase str)

Secuencia de caracteres alfanuméricos que representan texto. Se escriben entre comillas sencillas ’ o dobles “.

'Python'
"123"
'True'
# Cadena vacía
''
# Cadena con un espacio en blanco
' '
# Cambio de línea
'\n'
# Tabulador
'\t'

Acceso a los elementos de una cadena

Cada carácter tiene asociado un índice que permite acceder a él.

Cadena P y t h o n
Índice positivo 0 1 2 3 4 5
Índice negativo -6 -5 -4 -3 -2 -1
  • c[i] devuelve el carácter de la cadena c con el índice i.

El índice del primer carácter de la cadena es 0.

También se pueden utilizar índices negativos para recorrer la cadena del final al principio.

El índice del último carácter de la cadena es -1.

>>> 'Python'[0]
'P'
>>> 'Python'[1]
'y'
>>> 'Python'[-1]
'n'
>>> 'Python'[6]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range

Subcadenas

  • c[i:j:k] : Devuelve la subcadena de c desde el carácter con el índice i hasta el carácter anterior al índice j, tomando caracteres cada k.
>>> 'Python'[1:4]
'yth'
>>> 'Python'[1:1]
''
>>> 'Python'[2:]
'thon'
>>> 'Python'[:-2]
'Pyth'
>>> 'Python'[:]
'Python'
>>> 'Python'[0:6:2]
'Pto'

Operaciones con cadenas

  • c1 + c2 : Devuelve la cadena resultado de concatenar las cadenas c1 y c2.
  • c * n : Devuelve la cadena resultado de concatenar n copias de la cadena c.
  • c1 in c2 : Devuelve True si c1 es una cadena concenida en c2 y False en caso contrario.
  • c1 not in c2 : Devuelve True si c1 es una cadena no concenida en c2 y False en caso contrario.
>>> 'Me gusta ' + 'Python'
'Me gusta Python'
>>> 'Python' * 3
'PythonPythonPython'
>>> 'y' in 'Python'
True
>>> 'tho' in 'Python'
True
>>> 'to' not in 'Python'
True

Operaciones de comparación de cadenas

  • c1 == c2 : Devuelve True si la cadena c1 es igual que la cadena c2 y False en caso contrario.
  • c1 > c2 : Devuelve True si la cadena c1 sucede a la cadena c2 y False en caso contrario.
  • c1 < c2 : Devuelve True si la cadena c1 antecede a la cadena c2 y False en caso contrario.
  • c1 >= c2 : Devuelve True si la cadena c1 sucede o es igual a la cadena c2 y False en caso contrario.
  • c1 <= c2 : Devuelve True si la cadena c1 antecede o es igual a la cadena c2 y False en caso contrario.
  • c1 != c2 : Devuelve True si la cadena c1 es distinta de la cadena c2 y False en caso contrario.

Utilizan el orden establecido en el código ASCII.

>>> 'Python' == 'python'
False
>>> 'Python' < 'python'
True
>>> 'a' > 'Z'
True
>>> 'A' >= 'Z'
False
>>> '' < 'Python'
True

Funciones de cadenas

  • len(c) : Devuelve el número de caracteres de la cadena c.
  • min(c) : Devuelve el carácter menor de la cadena c.
  • max(c) : Devuelve el carácter mayor de la cadena c.
  • c.upper() : Devuelve la cadena con los mismos caracteres que la cadena c pero en mayúsculas.
  • c.lower() : Devuelve la cadena con los mismos caracteres que la cadena c pero en minúsculas.
  • c.title() : Devuelve la cadena con los mismos caracteres que la cadena c con el primer carácter en mayúsculas y el resto en minúsculas.
  • c.split(delimitador) : Devuelve la lista formada por las subcadenas que resultan de partir la cadena c usando como delimitador la cadena delimitador. Si no se especifica el delimitador utiliza por defecto el espacio en blanco.
>>> len('Python')
6
>>> min('Python')
'P'
>>> max('Python')
'y'
>>> 'Python'.upper()
'PYTHON'
>>> 'A,B,C'.split(',')
['A', 'B', 'C']
>>> 'I love Python'.split()
['I', 'love', 'Python']

Cadenas formateadas (format())

  • c.format(valores): Devuelve la cadena c tras sustituir los valores de la secuencia valores en los marcadores de posición de c. Los marcadores de posición se indican mediante llaves {} en la cadena c, y el reemplazo de los valores se puede realizar por posición, indicando en número de orden del valor dentro de las llaves, o por nombre, indicando el nombre del valor, siempre y cuando los valores se pasen con el formato nombre = valor.
>>> 'Un {} vale {} {}'.format('€', 1.12, '$')
'Un € vale 1.12 $'
>>> 'Un {2} vale {1} {0}'.format('€', 1.12, '$')
'Un $ vale 1.12 €'
>>> 'Un {moneda1} vale {cambio} {moneda2}'.format(moneda1 = '€', cambio = 1.12, moneda2 = '$')
'Un € vale 1.12 $'

Los marcadores de posición, a parte de indicar la posición de los valores de reemplazo, pueden indicar también el formato de estos. Para ello se utiliza la siguiente sintaxis:

  • {:n} : Alinea el valor a la izquierda rellenando con espacios por la derecha hasta los n caracteres.
  • {:>n} : Alinea el valor a la derecha rellenando con espacios por la izquierda hasta los n caracteres.
  • {:^n} : Alinea el valor en el centro rellenando con espacios por la izquierda y por la derecha hasta los n caracteres.
  • {:nd} : Formatea el valor como un número entero con n caracteres rellenando con espacios blancos por la izquierda.
  • {:n.mf} : Formatea el valor como un número real con un tamaño de n caracteres (incluído el separador de decimales) y m cifras decimales, rellenando con espacios blancos por la izquierda.
>>> 'Hoy es {:^10}, mañana {:10} y pasado {:>10}'.format('lunes', 'martes', 'miércoles')
'Hoy es   lunes   , mañana martes     y pasado  miércoles'
>>> 'Cantidad {:5d}'.format(12)'
'Cantidad    12'
>>> 'Pi vale {:8.4f}'.format(3.141592)
'Pi vale   3.1416'

Datos lógicos o booleanos (clase bool)

Contiene únicamente dos elementos True y False que representan los valores lógicos verdadero y falso respectivamente.

False tiene asociado el valor 0 y True tiene asociado el valor 1.

Operaciones con valores lógicos

  • Operadores lógicos: == (igual que), > (mayor), < (menor), >= (mayor o igual que), <= (menor o igual que), != (distinto de).
  • not b (negación) : Devuelve True si el dato booleano b es False , y False en caso contrario.
  • b1 and b2 : Devuelve True si los datos booleanos b1 y b2 son True, y False en caso contrario.
  • b1 or b2 : Devuelve True si alguno de los datos booleanos b1 o b2 son True, y False en caso contrario.

Tabla de verdad

x y not x x and y x or y
False False True False False
False True True False True
True False False False True
True True False True True
>>> not True
False
>>> False or True
True
>>> True and False
False
>>> True and True
True

Conversión de datos primitivos simples

Las siguientes funciones convierten un dato de un tipo en otro, siempre y cuando la conversión sea posible.

  • int() convierte a entero.
    Ejemplo. int('12') 12
    int(True) 1
    int('c') Error
  • float() convierte a real.
    Ejemplo. float('3.14') 3.14
    float(True) 1.0
    float('III') Error
  • str() convierte a cadena.
    Ejemplo. str(3.14) '3.14'
    str(True) 'True'
  • bool() convierte a lógico.
    Ejemplo. bool('0') False
    bool('3.14') True
    bool('') False
    bool('Hola') True

Variables

Una variable es un identificador ligado a algún valor.

Reglas para nombrarlas:

  • Comienzan siempre por una letra, seguida de otras letras o números.
  • No se pueden utilizarse palabras reservadas del lenguaje.

A diferencia de otros lenguajes no tienen asociado un tipo y no es necesario declararlas antes de usarlas (tipado dinámico).

Para asignar un valor a una variable se utiliza el operador = y para borrar una variable se utiliza la instrucción del.

lenguaje = 'Python'
x = 3.14
y = 3 + 2
# Asignación múltiple
a1, a2 = 1, 2
# Intercambio de valores
a, b = b, a
# Incremento (equivale a x = x + 2)
x += 2
# Decremento (equivale a x = x - 1)
x -= 1
# Valor no definido
x = None
del x

Ejercicios de Funciones. Fuente: Aprende Con Alf

Estabamos siguiendo la secuencia del recurso de aprendizaje Thinkcspy y en la sección de módulos de programación se toco el tema de funciones, entonces es mi deber profundizar en este tema para ampliar la explicación y la comprensión del mismo ya que el recurso Thinkcspy originalmente esta en ingles y al traducir al español hay secciones de la teoría que no quedan muy claras.

En la entrada anterior explicamos la teoria sobre funciones de Aprende con Alf, en esta ocasión vamos a ver algunos ejercicios planteados por el profesor Alfredo pero con la solución propia de PPI, en google colab. 

Ejercicio 1

Escribir una función que muestre por pantalla el saludo ¡Hola amiga! cada vez que se la invoque.

Solución: De la teoría sabemos que una función tiene la siguiente estructura:

def <nombre-funcion> (<parámetros>):
     bloque código
     return <objeto>

nombre-funcion: saludo

parámetros: vacio

bloque de código: imprimir por pantalla el mensaje  ¡Hola amiga!

objeto retornado: el mensaje. 

>>print('Inicio de ejercicio 1')
>># Solucion de PPI (python para ingenieros)
>>def saludo()->str:
  """Esta función muestra por pantalla el saludo ¡Hola amiga! sin utilizar ningún parámetro 
y la salida es tipo str."""
>>  return print("¡Hola amiga!")

>>saludo()
>>print('Fin de ejercicio 1')
>>>Inicio de ejercicio 1
>>>¡Hola amiga!
>>>Fin de ejercicio 1

Ejercicio 2

Escribir una función a la que se le pase una cadena "nombre" y muestre por pantalla el saludo ¡hola nombre!.

Solución:

>>print('Inicio de ejercicio 2, funciones')
>># Solucion PPI
>>def saludo_dos(nombre:str)->str:
  """ Funcion que muestra el saludo ¡hola nombre!, siendo PPI el valor de la variable
  nombre"""
>>  return print('¡hola',nombre, '!')

>>saludo_dos('PPI')
>>print('Fin de ejercicio 2, funciones')

>>>Inicio de ejercicio 2, funciones

>>>¡hola PPI !
>>>Fin de ejercicio 2, funciones

 

Ejercicio 3

Escribir una función que reciba un número entero positivo y devuelva su factorial.

Solución:

 

>>print('Inicio de ejercicio 3, funciones')
>># python no cuenta con una funcion por defecto para el calculo del
  factorial de un numero
>># 3!= 3*2*1
>># n!= n*(n-1)*(n-2)*(n-i), con i>0 y i<n
 
>>def calc_factorial(numero:int)->int:
  """Esta funcion calcula el factorial de cualquier numero entero positivo
  Nombre de la funcion: calc_facturial
  parametro: numero entero positivo
  Devuelve: factorial del numero
  return: factorial del numero
  """
>>  factorial =1
>>  for i in range(1,numero):
>>    factorial *= (i+1)
>>  return print('El factorial de', numero, 'es: ',factorial)

>>calc_factorial(5)
>>print('Fin de ejercicio 3, funciones')

 

>>>Inicio de ejercicio 3, funciones
>>>El factorial de 5 es:  120
>>>Fin de ejercicio 3, funciones
 

Ejercicio 4

Escribir una función que calcule el total de una factura tras aplicarle el IVA. La función debe recibir la cantidad sin IVA y el porcentaje de IVA a aplicar, y devolver el total de la factura. Si se invoca la función sin pasarle el porcentaje de IVA, deberá aplicar un 21%.

Solución:

>>print('Inicio de ejercicio 4, funciones')
>>def total_factura(cantidad:float,iva:float)->float:
  """Esta funcion calcula el total de una factura tras aplicarle el IVA
  Nombre de la funcion: total_factura
  parametros: cantidad sin IVA y el porcentaje de IVA a aplicar
  Devuelve: total de la factura
  return: total de la factura
  """
>>  if iva == 0:
>>    iva = 21
>>  valor_factura = cantidad + (cantidad*iva/100)
>>  return print('El total de la factura es: ',valor_factura)

>>total_factura(100,19)
>>print('Fin de ejercicio 4, funciones')

 

>>>Inicio de ejercicio 4, funciones
>>>El total de la factura es:  119.0
>>>Fin de ejercicio 4, funciones
 
 

sábado, 8 de marzo de 2025

Aprende con Alf. Funciones

 

Funciones

Funciones (def)

Una función es un bloque de código que tiene asociado un nombre, de manera que cada vez que se quiera ejecutar el bloque de código basta con invocar el nombre de la función.

Para declarar una función se utiliza la siguiente sintaxis:

def <nombre-funcion> (<parámetros>):
     bloque código
     return <objeto>

>>> def bienvenida():
...     print('¡Bienvenido a Python!')
...     return
...
>>> type(bienvenida)
<class 'function'>
>>> bienvenida()
¡Bienvenido a Python!

Parámetros y argumentos de una función

Una función puede recibir valores cuando se invoca a través de unas variables conocidas como parámetros que se definen entre paréntesis en la declaración de la función. En el cuerpo de la función se pueden usar estos parámetros como si fuesen variables.

Los valores que se pasan a la función en una llamada o invocación concreta de ella se conocen como argumentos y se asocian a los parámetros de la declaración de la función.

>>> def bienvenida(nombre):
...     print('¡Bienvenido a Python', nombre + '!')
...     return
...
>>> bienvenida('Alf')
¡Bienvenido a Python Alf!

Paso de argumentos a una función

Los argumentos se pueden pasar de dos formas:

  • Argumentos posicionales: Se asocian a los parámetros de la función en el mismo orden que aparecen en la definición de la función.
  • Argumentos nominales: Se indica explícitamente el nombre del parámetro al que se asocia un argumento de la forma parametro = argumento.
>>> def bienvenida(nombre, apellido):
...     print('¡Bienvenido a Python', nombre, apellido + '!')
...     return
...
>>> bienvenida('Alfredo', 'Sánchez)
¡Bienvenido a Python Alfredo Sánchez!
>>> bienvenida(apellido = 'Sánchez', nombre = 'Alfredo')
¡Bienvenido a Python Alfredo Sánchez!

Retorno de una función

Una función puede devolver un objeto de cualquier tipo tras su invocación. Para ello el objeto a devolver debe escribirse detrás de la palabra reservada return. Si no se indica ningún objeto, la función no devolverá nada.

>>> def area_triangulo(base, altura):
...     return base * altura / 2
...
>>> area_triangulo(2, 3)
3
>>> area_triangulo(4, 5)
10

Una función puede devolver más de un objeto separándolos por comas tras la palabra reservada return. En tal caso, la función agrupará los objetos en una tupla y devolverá la tupla.

Argumentos por defecto

En la definición de una función se puede asignar a cada parámetro un argumento por defecto, de manera que si se invoca la función sin proporcionar ningún argumento para ese parámetro, se utiliza el argumento por defecto.

>>> def bienvenida(nombre, lenguaje = 'Python'):
...     print('¡Bienvenido a', lenguaje, nombre + '!')
...     return
...
>>> bienvenida('Alf')
¡Bienvenido a Python Alf!
>>> bienvenida('Alf', 'Java')
¡Bienvenido a Java Alf!

Los parámetros con un argumento por defecto deben indicarse después de los parámetros sin argumentos por defectos. De lo contrario se produce un error.

Pasar un número indeterminado de argumentos

Por último, es posible pasar un número variable de argumentos a un parámetro. Esto se puede hacer de dos formas:

  • *parametro: Se antepone un asterisco al nombre del parámetro y en la invocación de la función se pasa el número variable de argumentos separados por comas. Los argumentos se guardan en una lista que se asocia al parámetro.
>>> def menu(*platos):
...     print('Hoy tenemos: ', end='')
...     for plato in platos:
...         print(plato, end=', ')
...     return
...
>>> menu('pasta', 'pizza', 'ensalada')
Hoy tenemos: pasta, pizza, ensalada,
  • **parametro: Se anteponen dos asteriscos al nombre del parámetro y en la invocación de la función se pasa el número variable de argumentos por pares nombre = valor, separados por comas. Los argumentos se guardan en un diccionario que se asocia al parámetro.
>>> def contacto(**info):
...     print('Datos del contacto)
...     for clave, valor in info.items():
...         print(clave, ":", valor)
...     return
...
>>> contacto(Nombre = "Alf", Email = "asalber@ceu.es")
Datos del contacto
Nombre : Alf
Email : asalber@ceu.es
>>> contacto(Nombre = "Alf", Email = "asalber@ceu.es", Dirección = "Madrid")
Datos del contacto
Nombre : Alf
Email : asalber@ceu.es
Dirección : Madrid

Ámbito de los parámetros y variables de una función

Los parámetros y las variables declaradas dentro de una función son de ámbito local, mientras que las definidas fuera de ella son de ámbito ámbito global.

Tanto los parámetros como las variables del ámbito local de una función sólo están accesibles durante la ejecución de la función, es decir, cuando termina la ejecución de la función estas variables desaparecen y no son accesibles desde fuera de la función.

>>> def bienvenida(nombre):
...     lenguaje = 'Python'
...     print('¡Bienvenido a', lenguaje, nombre + '!')
...     return
...
>>> bienvenida('Alf')
¡Bienvenido a Python Alf!
>>> lenguaje
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'lenguaje' is not defined

Si en el ámbito local de una función existe una variable que también existe en el ámbito global, durante la ejecución de la función la variable global queda eclipsada por la variable local y no es accesible hasta que finaliza la ejecución de la función.

>>> lenguaje = 'Java'
>>> def bienvenida():
...     lenguaje = 'Python'
...     print('¡Bienvenido a', lenguaje + '!')
...     return
...
>>> bienvenida()
¡Bienvenido a Python!
>>> print(lenguaje)
Java

Paso de argumentos por asignación

En Python los argumentos se pasan a una función por asignación, es decir, se asignan a los parámetros de la función como si fuesen variables locales. De este modo, cuando los argumentos son objetos mutables (listas, diccionarios, etc.) se pasa al parámetro una referencia al objeto, de manera que cualquier cambio que se haga dentro de la función mediante el parámetro asociado afectará al objeto original.

>>> primer_curso = ['Matemáticas', 'Física']
>>> def añade_asignatura(curso, asignatura):
...     curso.append(asignatura)
...     return
...
>>> añade_asignatura(primer_curso, 'Química')
>>> print(primer_curso)
['Matemáticas', 'Física', 'Química']

Las funciones son objetos

En Python las funciones son objetos como el resto de tipos de datos, de manera que es posible asignar una función a una variable y luego utilizar la variable para hacer la llamada a la función.

>>> def saludo(nombre):
...     print("Hola", nombre)
...     return
... 
>>> bienvenida = saludo
>>> bienvenida("Alf")
Hola Alf

Esto permite, por tanto, pasar funciones como argumentos en la llamada a una función y que una función pueda devolver otras funciones.

>>> def impuesto(porcentaje):
...     def aplicar(base):
...             return base * porcentaje / 100
...     return aplicar
... 
>>> iva = impuesto(21)
>>> iva(1000)
210.0

Funciones recursivas

Una función recursiva es una función que en su cuerpo contiene una llama a si misma.

La recursión es una práctica común en la mayoría de los lenguajes de programación ya que permite resolver las tareas recursivas de manera más natural.

Para garantizar el final de una función recursiva, las sucesivas llamadas tienen que reducir el grado de complejidad del problema, hasta que este pueda resolverse directamente sin necesidad de volver a llamar a la función.

>>> def factorial(n):
...     if n == 0:
...         return 1
...     else:
...         return n * factorial(n-1)
...
>>> f(5)
120

Funciones recursivas múltiples

Una función recursiva puede invocarse a si misma tantas veces como quiera en su cuerpo.

>>> def fibonacci(n):
...     if n <= 1:
...         return n
...     else:
...         return fibonacci(n - 1) + fibonacci(n - 2)
...
>>> fibonacci(6)
8

Los riesgos de la recursión

Aunque la recursión permite resolver las tareas recursivas de forma más natural, hay que tener cuidado con ella porque suele consumir bastante memoria, ya que cada llamada a la función crea un nuevo ámbito local con las variables y los parámetros de la función.

En muchos casos es más eficiente resolver la tarea recursiva de forma iterativa usando bucles.

>>> def fibonacci(n):
...     a, b = 0, 1
...     for i in range(n):
...         a, b = b, a + b
...     return a
...
>>> fibonacci(6)
8

Documentación de funciones

Una práctica muy recomendable cuando se define una función es describir lo que la función hace en un comentario.

En Python esto se hace con un docstring que es un tipo de comentario especial se hace en la línea siguiente al encabezado de la función entre tres comillas simples ''' o dobles """.

Después se puede acceder a la documentación de la función con la función help(<nombre-función>).

>>> def area_triangulo(base, altura):
... """Función que calcula el área de un triángulo.
...
... Parámetros:
...     - base: Un número real con la base del triángulo.
...     - altura: Un número real con la altura del triángulo.
... Salida:
...     Un número real con el área del triángulo de base y altura especificadas.
... """
...     return base * altura / 2
...
>>> help(area_triangulo)
area_triangulo(base, altura)
    Función que calcula el área de un triángulo.

    Parámetros:
        - base: Un número real con la base del triángulo.
        - altura: Un número real con la altura del triángulo.
    Salida:
        Un número real con el área del triángulo de base y altura especificadas.

Entradas recientes

Thinkcspy. 6.1 Funciones

  Como introduccion al tema de funciones puedes ver este video (en ingles), de Thinkcspy   En Python, una función es una secuencia nombrada...

Entradas Populares