Introducción a la programación en Python

clase 02a
Funciones (I)

Una función es un bloque de código con un nombre asociado, que recibe 0 o más argumentos como entrada, sigue una serie de instrucciones, y devuelve un valor y/o realiza una tarea.

El uso de funciones es un componente muy importante de la programación estructurada, y tiene varias ventajas:

  • modularización: permite segmentar un programa complejo en una serie de partes o módulos más simples, facilitando así la programación y el depurado
  • reutilización: permite reutilizar una misma función en distintos programas

Python dispone de una serie de funciones integradas al lenguaje (built-in), y también permite crear funciones definidas por el usuario.

Funciones integradas (built-in)

Veamos primero algunas de las funciones integradas de Python más usadas.

print()

La función print() recibe uno o más argumentos, que por defecto se imprimen en la salida estándar.

Si hay más de un argumento, deben ir separados por comas. Por defecto, se imprimen separados por espacios.

In [11]:
print(1, 12, 123, "hola")
1 12 123 hola

La función print() puede recibir también algunos argumentos opcionales, que deberán necesariamente pasarse con su nombre.

  • sep: cadena de separación entre los argumentos, si la función recibe más de uno. Por defecto es un espacio en blanco (sep=' '), pero puede ser cualquier otra cadena.
In [1]:
print(1, 12, 123, "hola", sep=' ; ')
1 ; 12 ; 123 ; hola

También puede ser un carácter extendido, como tabulador (\\t) o salto de línea (\\n).

In [13]:
print(1, 12, 123, "hola", sep='\t')
1	12	123	hola
In [14]:
print(1, 12, 123, "hola", sep='\n')
1
12
123
hola
  • end: cadena que se imprime al final de la línea de argumentos. Por defecto es un salto de línea (end='\\n'), pero puede ser otra cadena.
In [15]:
print(1, 12, 123, "hola", end=' - ')
print("otra llamada a la función, en la misma línea")
1 12 123 hola - otra llamada a la función, en la misma línea

Hay otros parámetros opcionales para la función print():

  • file: indica dónde se va a imprimir. Por defecto es la salida estándar (la terminal en la pantalla), pero se puede indicar cualquier objeto en el que se pueda escribir, como por ejemplo un archivo.
  • flush: determina la existencia de un buffer en la salida a file. Por defecto es False, pero si se explicita como True, se fuerza el volcado inmediato (flush).

Formato de las cadenas de impresión

En los argumentos que se pasan a la función print() se pueden alternar cadenas de caracteres y variables:

In [16]:
operacion = "raíz cuadrada de dos"
valor = 2**0.5
print("el resultado de", operacion, "es:", valor)
el resultado de raíz cuadrada de dos es: 1.4142135623730951

Una forma más clara y elegante es referenciar objetos dentro de la misma cadena, y usar el método .format() para sustituirlos con los objetos que se le pasan como argumentos.

Los objetos se referencian con números entre llaves ({ }) dentro de la cadena (llamados campos de formato), y son sustituidos en el orden con que aparecen como argumentos de .format(), contando a partir de cero (argumentos posicionales).

In [17]:
operacion = "raíz cuadrada de dos"
valor = 2**0.5
print("el resultado de {0} es {1}".format(operacion, valor))
el resultado de raíz cuadrada de dos es 1.4142135623730951

Los objetos también pueden ser referenciados por nombre (argumentos por clave).

In [18]:
operacion = "raíz cuadrada de dos"
print("el resultado de {nombre} es {resultado}".format(nombre=operacion, resultado=2**0.5))
el resultado de raíz cuadrada de dos es 1.4142135623730951

En una misma llamada a la función print() pueden combinarse argumentos posicionales con argumentos por clave.

Opcionalmente se puede poner el signo de dos puntos después del número o nombre, y explicitar el tipo del objeto:

  • s para cadenas (tipo str)
  • d para números enteros (tipo int)
  • f para números de coma flotante (tipo float)

Esto permite controlar el formato de impresión del objeto. Por ejemplo, podemos utilizar la expresión .4f para determinar que un número de coma flotante (f) se imprima con cuatro dígitos después de la coma (.4).

In [3]:
operacion = "raíz cuadrada de dos"
valor = 2**0.5
print("el resultado de {0} es {resultado:.4f}".format(operacion, resultado=valor))
el resultado de raíz cuadrada de dos es 1.4142

También puede aplicarse el operador % para dar formato a las cadenas.
La sintaxis es la siguiente:

In [20]:
operacion = "raíz cuadrada de dos"
valor = 2**0.5
print("el resultado de %s es %f" % (operacion, valor))
el resultado de raíz cuadrada de dos es 1.414214

Con esta sintaxis hay que determinar el tipo del objeto:

  • %s = str
  • %d = int
  • %f = float

También aquí se puede controlar el formato de salida. Por ejemplo, para obtener el valor con 8 dígitos después de la coma:

In [21]:
operacion = "raíz cuadrada de dos"
valor = 2**0.5
print("el resultado de %s es %.8f" % (operacion, valor))
el resultado de raíz cuadrada de dos es 1.41421356

Una discusión más completa del control de la salida de Python se encuentra en https://docs.python.org/es/3/tutorial/inputoutput.html

input()

Como se vio en la clase 1, la función input() puede utilizarse para ingresar datos durante la ejecución del programa.
Opcionalmente, la función puede recibir un argumento, que de estar presente se imprime en la pantalla sin salto de línea final.
La función input() siempre devuelve un objeto de tipo str. Si el valor de entrada va a utilizarse como un número, deberá hacerse la conversión explícitamente.

In [22]:
entrada = int(input("ingrese un número entero: "))
print(entrada**2)
ingrese un número entero: 4
16

Hay funciones para convertir y procesar tipos numéricos.

int()

Devuelve un número entero, que dependerá del tipo de argumento o argumentos que reciba.

Si se ingresa un número de coma flotante (objeto tipo float), devuelve su parte entera.

In [15]:
int(3.6)
Out[15]:
3

También puede devolver el entero correspondiente a una cadena de caracteres (objeto tipo string).

Por defecto, usa la base 10, en cuyo caso la cadena debe estar conformada sólo por números decimales.

In [2]:
int("23")
Out[2]:
23

Pero también puede convertir cadenas en otras bases, si se explicita un segundo argumento. En ese caso, la cadena de caracteres debe ser coherente con una expresión numérica en la base.

In [3]:
int("10110101101", 2)
Out[3]:
1453
In [4]:
int("a0fc", 16)
Out[4]:
41212
In [5]:
int("3251", 8)
Out[5]:
1705
In [6]:
int("1012", 2)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-6-cae4b2c7d851> in <module>()
----> 1 int("1012", 2)

ValueError: invalid literal for int() with base 2: '1012'

round()

Si recibe un argumento numérico, por defecto devuelve el entero más próximo (a diferencia de int(), que trunca a la parte entera).

In [51]:
round(2.3)
Out[51]:
2
In [52]:
round(2.8)
Out[52]:
3
In [53]:
round(-2.8)
Out[53]:
-3
In [54]:
round(2.5)
Out[54]:
2

Si se agrega un segundo parámetro opcional (de tipo int), devuelve un número de coma flotante, con una cantidad de cifras después de la coma determinado por el segundo argumento.

In [55]:
a = 2**(0.5)
print(a)
print(round(a))
print(round(a, 2))
print(round(a, 4))
print(round(a, 8))
1.4142135623730951
1
1.41
1.4142
1.41421356

float()

Devuelve un número de coma flotante, y accepta argumentos de tipo numérico (int o float), o de tipo string que sean coherentes con un número entero o de coma flotante (cadenas de caracteres formadas por números y hasta un punto).

In [7]:
float(2)
Out[7]:
2.0
In [8]:
float(2.5)
Out[8]:
2.5
In [9]:
float("2")
Out[9]:
2.0
In [10]:
float("2.5")
Out[10]:
2.5

abs()

Devuelve el valor absoluto de un número (entero o de coma flotante).

In [23]:
abs(3)
Out[23]:
3
In [24]:
abs(-3)
Out[24]:
3
In [25]:
abs(-2.5)
Out[25]:
2.5

Aparte de los operadores ya vistos, hay funciones que hacen operaciones matemáticas.

divmod()

Debe recibir dos argumentos numéricos, y devuelve dos valores: resultado de la división entera, y el resto.

In [31]:
divmod(22, 4)
Out[31]:
(5, 2)

pow()

Si recibe dos argumentos, eleva el primero a la potencia del segundo.

In [47]:
pow(2, 3)
Out[47]:
8
In [48]:
pow(10, 2)
Out[48]:
100
In [49]:
pow(10, -2)
Out[49]:
0.01

Si recibe un tercer argumento opcional, éste funciona como módulo.

In [50]:
pow(2, 3, 3)
Out[50]:
2

Hay funciones que procesan o dan información de conjuntos de objetos, o de objetos llamados iterables: cadenas de caracteres u otras estructuras de datos que veremos más adelante.

len()

Devuelve la longitud (cantidad de elementos) de un objeto. Debe ser un objeto iterable; puede ser una cadena de caracteres, o alguno de los otros tipos de secuencia o colección que veremos más adelante.

In [35]:
len("Hola, Python")
Out[35]:
12
In [36]:
len("0123456789")
Out[36]:
10

max()

Si recibe más de un argumento, devuelve el mayor de ellos.

In [37]:
max(23, 12, 145, 88)
Out[37]:
145
In [8]:
max("a", "z")
Out[8]:
'z'

max("a", "Z")

Si recibe un solo argumento, devuelve el mayor de sus elementos. Debe ser un objeto iterable; puede ser una cadena de caracteres, o alguno de los otros tipos de secuencia o colección que veremos más adelante.

In [39]:
max("Hola, Python")
Out[39]:
'y'

min()

Tiene un comportamiento similar a max(), pero devuelve el mínimo.

In [40]:
min(23, 12, 145, 88)
Out[40]:
12
In [2]:
min("Hola, Python")
Out[2]:
' '

sorted()

Devuelve ordenados los elementos de un objeto. Debe ser un objeto iterable; puede ser una cadena de caracteres, o alguno de los otros tipos de secuencia o colección que veremos más adelante.

In [16]:
sorted("Hola, Python")
Out[16]:
[' ', ',', 'H', 'P', 'a', 'h', 'l', 'n', 'o', 'o', 't', 'y']

Hay algunas funciones que dan información y ayuda sobre el elemento que reciben como argumento.

type()

Devuelve el tipo del objeto que recibe como argumento.

In [56]:
type(2)
Out[56]:
int
In [57]:
type(2.3)
Out[57]:
float
In [58]:
type("hola")
Out[58]:
str
In [59]:
type(int)
Out[59]:
type

help()

Invoca el sistema integrado de ayuda, devolviendo información acerca del objeto que recibe como argumento.

In [7]:
help(min)
Help on built-in function min in module builtins:

min(...)
    min(iterable, *[, default=obj, key=func]) -> value
    min(arg1, arg2, *args, *[, key=func]) -> value
    
    With a single iterable argument, return its smallest item. The
    default keyword-only argument specifies an object to return if
    the provided iterable is empty.
    With two or more arguments, return the smallest argument.


Hay un par de funciones para convertir entre caracteres y valor de código Unicode.

chr()

Recibe como argumento un entero, y devuelve una cadena con el carácter cuyo código Unicode corresponde a ese valor. El rango válido para el argumento es de 0 a 1114111.

In [26]:
chr(97)
Out[26]:
'a'
In [27]:
chr(934)
Out[27]:
'Φ'
In [28]:
chr(1044)
Out[28]:
'Д'
In [13]:
chr(19989)
Out[13]:
'丕'
In [11]:
chr(23057)
Out[11]:
'娑'

ord()

Es el inverso de chr(): dada una cadena representando un carácter Unicode, devuelve el entero del código correspondiente.

In [44]:
ord('w')
Out[44]:
119

Como argumento se puede ingresar el carácter literalmente, o su correspondiente código Unicode, antecedido del prefijo '\u'.

In [45]:
ord('丕')
Out[45]:
19989
In [46]:
ord("\u4e15")
Out[46]:
19989

Hay funciones para convertir números enteros (int) a cadenas de caracteres (string) en distintas bases: decimal, binaria, octal y hexadecimal.

str()

Convierte un número entero a una cadena (tipo str) en base decimal.

In [14]:
str(123)
Out[14]:
'123'

bin()

Convierte un número entero a una cadena (tipo str) en base binaria, antecedida del prefijo '0b'.

In [1]:
bin(123)
Out[1]:
'0b1111011'

oct()

Convierte un número entero en una cadena (tipo str) en base octal, antecedida del prefijo '0o'.

In [42]:
oct(8)
Out[42]:
'0o10'
In [43]:
oct(123)
Out[43]:
'0o173'

hex()

Convierte un número entero a una cadena (tipo str) en base hexadecimal, antecedida del prefijo '0x'.

In [33]:
hex(16)
Out[33]:
'0x10'
In [34]:
hex(127)
Out[34]:
'0x7f'

 

Hay varias funciones integradas más en Python; la lista de todas las funciones disponibles en el lenguaje con la descripción correspondiente se puede encontrar en: https://docs.python.org/es/3/library/functions.html