Funciones en Python. Entrada y salida
Aunque las hayamos usado con frecuencia y nos sean conocidas, no por ello estas funciones merecen menos nuestra atención, antes al contrario.
Me estoy refiriendo a las dos funciones básicas que nos facilitan al entrada de datos por teclado (input()) y la salida por pantalla (print()). Ambas pertenecen al conjunto de built-in functions relacionadas con las cadenas de caracteres y las variables string, y dada su importancia para el input y el output, he creído necesario tratarlas de forma específica.
Además de los datos que introducimos directamente cuando programamos un script desde el IDE, cuando necesitamos que sea el usuario o usuaria quien introduzca datos, la forma más simple de hacerlo (otras requieren el uso de interfaces graficas) es mediante la función input(), cuya formulación básica ya muestra que se trata de una función asociada a los datos alfanuméricos:
input("Dame un número: ") -> devuelve Dame un número: 4 -> '4'
Esta vinculación se observa aun más claramente cuando asignamos el resultado de la función a una variable para contener en ella el datos pasado por el usuario o usuaria. Por cierto, como es fácil de entender, esta es la forma más lógica y más usada de utilizar la función input() y no la que utilizamos antes.
num1 = input("Dame un número: ")
print(num1 * 2)
Si damos 23 como respuesta, el programa dará como salida 2323, esto es: duplicará la cadena inicial, no multiplicará el número 23 por dos, ya que 23, en esta formulación de la función input() es un dato alfanumérico, una cadena, no un número.
Si lo que deseamos es que num1 contenga un dato numérico, primero deberemos convertir ese dato alfanumérico a dato numérico, bien convirtiendo el tipo de variable a posteriori...
num1 = input("Dame un número: ")
num1 = int(num1)
print(num1 * 2)
... o bien directamente en la orden de asignación de la variable.
num1 = int(input("Dame un número: "))
print(num1 * 2)
En ambos casos, dando 23 como respuesta obtendremos como salida 46, que es el resultado esperado de multiplicar 23 x 2.
NOTA 1. También podemos utilizar la función eval() en lugar de int(). De este modo el programa funcionará aunque se introduzca un número real (v.g. 23.12), cosa que no sucederá en caso de utilizar int(). Las razones se explican en esta entrada.
Por su parte print() es, en realidad, una función más compleja de lo que parece teniendo en cuenta el uso simplificado que solemos hacer de ella, pero este suele ser suficiente para el objetivo principal de esta función, así que nos limitaremos a explicarla con cierto detalle.
En este sentido print() nos permite la escritura de los datos que le pasamos directamente como argumento, o el cato o datos contenido/s en la variable. en este sentido las dos expresiones siguientes son equivalentes a nivel funcional:
print(123) -> devuelve 123
a=123
print(a) -> devuelve 123
Por frecuente que resulte esta formulación, lo cierto es que print() consta de varios parámetros, algunos de ellos complejos, pero poco usados, por lo que no es frecuente encontrarse con ellos expresados de forma explícita:
print(*objects,sep=' ',end='\n',file=sys.stout,flush=false)
- El primer parámetro (*objects) se formula de este modo para indicar que es posible pasar un número variable de datos de diferente tipo, tanto directamente, como por medio de variables.
print(1+2+3) -> devuelve 6
print("dame la mano"+" "+"mi hermano") -> devuelve dame la mano mi hermano
print(str(1)+" dame la mano "+str(2))-> devuelve 1 dame la mano 2
print('1'+'2'+'3') -> devuelve 123
NOTA 2. Aunque print() admite diferentes tipos de variables, en un uso concreto todas ellas han de ser del mismo tipo (en caso contrario da error). La tercera línea es un ejemplo de ello: hemos tenido que utilizar la función str() para convertir los números en datos alfanuméricos y evitar así el mensaje de error. Frente a ello, la primera línea evidencia que print() admite valores numéricos y las operaciones que éstos pueden realizar, al igual que valores alfanuméricos (línea 4). En este caso, + pasa a ser un operador de concatenación, en lugar de la función de operador algebraico que asume en la línea primera.
- El segundo parámetro (sep=' ' como ejemplo) establece el separador entre los elementos del primer parámetro. De no usar este segundo parámetro, los elementos del primero se mostrarán juntos...
print("Buenos dias"+"amigo Carlos" -> devuelve Buenos diasamigo Carlos
... por lo que si lo queremos evitar deberemos incorporar la solución dentro de cada elemento del primer parámetro...
print("Buenos días "+"amigo Carlos") -> devuelve Buenos días amigo Carlos
... o como un elemento más.
print("Buenos dias"+" "+"amigo Carlos") -> devuelve Buenos dias amigo Carlos
Utilizando el parámetro sep, se establece esta separación de forma mucho más eficiente y flexible. Además disponemos de dos soluciones:
- Utilizar el valor por defecto (un espacio de separación) que se activa cuando separamos los elementos del primer parámetro mediante comas.
print("Buenos dias","amigo Carlos") -> devuelve Buenos dias amigo Carlos
... lo mismo que
print("Buenos dias","amigo Carlos",sep=' ') -> devuelve Buenos dias amigo Carlos
- por lo que podemos utilizar otro formato para la separación:
print("Buenos dias","amigo Carlos",sep=' ---') -> devuelve Buenos dias ---amigo Carlos
- El tercer parámetro que analizaré es el de finalización del segmento textual (end='\n', por ejemplo). este parámetro establece la separación entre la salida de una función print() y la siguiente, siendo por defecto (cuando no se indica expresamente) la secuencia de escape o salto de línea.
print("Buenos días")
print("Buenas noches")
devuelven...
Buenos días
Buenas noches
mientras que..
print("Buenos días","amigo Carlos")
print("Buenas noches")
devuelve
Buenos días amigo Carlos
Buenas noches
En el primer ejemplo, la ausencia de explicitación del tercer parámetro no altera el resultado: tras la ejecución de la primera función print() se produce un salto de línea; también en el segundo ejemplo, sólo que en este también provocamos la ausencia del segundo, observando que del tercero se deriva el salto de línea y del segundo la separación de los dos componentes del primer parámetro mediante un espacio. En el ejemplo que sigue utilizaremos el parámetro end 0ara introducir otra forma de separar lo resultante de dos print() sucesivos, en este caso mediante una tabulación.
print("Buenos dias",end='\t')
print("Buenas noches")
devuelve Buenos dias Buenas noches
NOTA 3. Además de para provocar salto de línea (\n) o salto de tabulador (\t) tras cada uso de la función print(), el carácter \ se usa también para hacer visible sin generar errores determinados caracteres, como, por ejemplo, las comillas (\" o \') dentro de un string o para insertar caracteres en formato octal (\ooo), hexadecimal de 8 bits (\xhh) (ASCII) o hexadecimal del 16 bits (\uxxxx) (Unicode).
Dado que la opción por defecto es provocar un salto de línea tras cada print(), si deseáramos evitar este efecto y que los textos de sendos usos de la función se mantengan en la misma línea, podemos utilizar el parámetro end precisamente para inhibir su funcionamiento por defecto:
print("Buenos dias",end='')
print("Buenas noches")
devuelve Buenos diasBuenas noches