{"id":371,"date":"2024-11-13T18:51:46","date_gmt":"2024-11-13T18:51:46","guid":{"rendered":"https:\/\/equipomedios.com\/blog\/?p=371"},"modified":"2024-10-18T18:54:13","modified_gmt":"2024-10-18T18:54:13","slug":"funciones-python","status":"publish","type":"post","link":"https:\/\/equipomedios.com\/blog\/funciones-python\/","title":{"rendered":"Funciones | Python"},"content":{"rendered":"<h1>Funciones<\/h1>\n<p>Una funci\u00f3n es un bloque de c\u00f3digo con un nombre asociado, que recibe cero o m\u00e1s argumentos como entrada, sigue una secuencia de sentencias, la cuales ejecuta una operaci\u00f3n deseada y devuelve un valor y\/o realiza una tarea, este bloque puede ser llamados cuando se necesite.<\/p>\n<p>El uso de funciones es un componente muy importante del paradigma de la programaci\u00f3n llamada\u00a0<span class=\"std std-ref\">estructurada<\/span>, y tiene varias ventajas:<\/p>\n<ul class=\"simple\">\n<li><strong>modularizaci\u00f3n<\/strong>: permite segmentar un programa complejo en una serie de partes o m\u00f3dulos m\u00e1s simples, facilitando as\u00ed la programaci\u00f3n y el depurado.<\/li>\n<li><strong>reutilizaci\u00f3n<\/strong>: permite reutilizar una misma funci\u00f3n en distintos programas.<\/li>\n<\/ul>\n<p>Python dispone de una serie de\u00a0<span class=\"std std-ref\">funciones integradas<\/span>\u00a0al lenguaje, y tambi\u00e9n permite crear funciones definidas por el usuario para ser usadas en su propios programas.<\/p>\n<div id=\"sentencia-def\" class=\"section\"><span id=\"python-sent-def\"><\/span><\/p>\n<h2>Sentencia def<\/h2>\n<p>La sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">def<\/span><\/code>\u00a0es una definici\u00f3n de funci\u00f3n usada para crear objetos\u00a0<strong>funciones definidas por el usuario<\/strong>.<\/p>\n<p>Una definici\u00f3n de funci\u00f3n es una sentencia ejecutable. Su ejecuci\u00f3n enlaza el nombre de la funci\u00f3n en el\u00a0<em>namespace<\/em>\u00a0local actual a un objecto funci\u00f3n (un envoltorio alrededor del c\u00f3digo ejecutable para la funci\u00f3n). Este objeto funci\u00f3n contiene una referencia al\u00a0<em>namespace<\/em>\u00a0local global como el\u00a0<em>namespace<\/em>\u00a0global para ser usado cuando la funci\u00f3n es llamada.<\/p>\n<p>La definici\u00f3n de funci\u00f3n no ejecuta el cuerpo de la funci\u00f3n; esto es ejecutado solamente cuando la funci\u00f3n es llamada.<\/p>\n<p>La sintaxis para una definici\u00f3n de funci\u00f3n en Python es:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"k\">def<\/span> <span class=\"nf\">NOMBRE<\/span><span class=\"p\">(<\/span><span class=\"n\">LISTA_DE_PARAMETROS<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"sd\">\"\"\"DOCSTRING_DE_FUNCION\"\"\"<\/span>\r\n    <span class=\"n\">SENTENCIAS<\/span>\r\n    <span class=\"n\">RETURN<\/span> <span class=\"p\">[<\/span><span class=\"n\">EXPRESION<\/span><span class=\"p\">]<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>A continuaci\u00f3n se detallan el significado de pseudo c\u00f3digo fuente anterior:<\/p>\n<ul class=\"simple\">\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">NOMBRE<\/span><\/code>, es el nombre de la funci\u00f3n.<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">LISTA_DE_PARAMETROS<\/span><\/code>, es la lista de par\u00e1metros que puede recibir una funci\u00f3n.<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">DOCSTRING_DE_FUNCION<\/span><\/code>, es la cadena de caracteres usada para\u00a0<span class=\"std std-ref\">documentar<\/span>\u00a0la funci\u00f3n.<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">SENTENCIAS<\/span><\/code>, es el bloque de sentencias en c\u00f3digo fuente Python que realizar cierta operaci\u00f3n dada.<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">RETURN<\/span><\/code>, es la\u00a0<span class=\"std std-ref\">sentencia return<\/span>\u00a0en c\u00f3digo Python.<\/li>\n<li><code class=\"docutils literal notranslate\"><span class=\"pre\">EXPRESION<\/span><\/code>, es la expresi\u00f3n o variable que devuelve la sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">return<\/span><\/code>.<\/li>\n<\/ul>\n<p>Un ejemplo simple de funci\u00f3n esta seguidamente:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">def<\/span> <span class=\"nf\">hola<\/span><span class=\"p\">(<\/span><span class=\"n\">arg<\/span><span class=\"p\">):<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"sd\">\"\"\"El docstring de la funci\u00f3n\"\"\"<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"nb\">print<\/span> <span class=\"s2\">\"Hola\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">arg<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"!\"<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">hola<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"Plone\"<\/span><span class=\"p\">)<\/span>\r\n<span class=\"go\">Hola Plone !<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<div class=\"admonition warning\">\n<p class=\"first admonition-title\">Advertencia<\/p>\n<p class=\"last\">Los bloques de\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">function<\/span><\/code>\u00a0deben estar indentado como otros bloques estructuras de control.<\/p>\n<\/div>\n<p>La palabra reservada\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">def<\/span><\/code>\u00a0se usa para definir funciones. Debe seguirle el nombre de la funci\u00f3n en el ejemplo anterior\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">hola()<\/span><\/code>\u00a0y la lista de par\u00e1metros formales entre par\u00e9ntesis. Las sentencias que forman el cuerpo de la funci\u00f3n empiezan en la l\u00ednea siguiente, y deben estar indentado.<\/p>\n<p>La primer sentencia del cuerpo de la funci\u00f3n puede ser opcionalmente una cadenas de caracteres literal; esta es la cadenas de caracteres de documentaci\u00f3n de la funci\u00f3n, o\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">docstrings<\/span><\/code>.<\/p>\n<p>Hay herramientas que usan las\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">docstrings<\/span><\/code>\u00a0para producir autom\u00e1ticamente documentaci\u00f3n en l\u00ednea o imprimible, o para permitirle al usuario que navegue el c\u00f3digo en forma interactiva; es una buena pr\u00e1ctica incluir\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">docstrings<\/span><\/code>\u00a0en el c\u00f3digo que uno escribe, por lo que se debe hacer un h\u00e1bito de esto.<\/p>\n<p>La ejecuci\u00f3n de la funci\u00f3n\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">hola()<\/span><\/code>\u00a0muestra la impresi\u00f3n de un mensaje\u00a0<strong>Hola Plone !<\/strong>\u00a0que se imprime por consola. Devolver el objeto por los valores de retorno opcionales.<\/p>\n<p>La ejecuci\u00f3n de una funci\u00f3n introduce una nueva tabla de s\u00edmbolos usada para las variables locales de la funci\u00f3n. M\u00e1s precisamente, todas las asignaciones de variables en la funci\u00f3n almacenan el valor en la tabla de s\u00edmbolos local; as\u00ed mismo la referencia a variables primero mira la tabla de s\u00edmbolos local, luego en la tabla de s\u00edmbolos local de las funciones externas, luego la tabla de s\u00edmbolos global, y finalmente la tabla de nombres predefinidos. As\u00ed, no se les puede asignar directamente un valor a las variables globales dentro de una funci\u00f3n (a menos se las nombre en la sentencia\u00a0<span class=\"std std-ref\">global<\/span>), aunque si pueden ser referenciadas.<\/p>\n<p>Los par\u00e1metros reales (argumentos) de una funci\u00f3n se introducen en la tabla de s\u00edmbolos local de la funci\u00f3n llamada cuando esta es ejecutada; as\u00ed, los argumentos son pasados por valor (d\u00f3nde el valor es siempre una referencia a un objeto, no el valor del objeto). Cuando una funci\u00f3n llama a otra funci\u00f3n, una nueva tabla de s\u00edmbolos local es creada para esa llamada.<\/p>\n<p>La definici\u00f3n de una funci\u00f3n introduce el nombre de la funci\u00f3n en la tabla de s\u00edmbolos actual. El valor del nombre de la funci\u00f3n tiene un tipo que es reconocido por el interprete como una funci\u00f3n definida por el usuario. Este valor puede ser asignado a otro nombre que luego puede ser usado como una funci\u00f3n. Esto sirve como un mecanismo general para renombrar.<\/p>\n<\/div>\n<div id=\"argumentos-y-parametros\" class=\"section\"><span id=\"python-fun-args\"><\/span><\/p>\n<h2>Argumentos y par\u00e1metros<\/h2>\n<p>Al definir una funci\u00f3n los valores los cuales se reciben se denominan par\u00e1metros, pero durante la llamada los valores que se env\u00edan se denominan argumentos.<\/p>\n<div id=\"por-posicion\" class=\"section\">\n<h3>Por posici\u00f3n<\/h3>\n<p>Cuando envi\u00e1 argumentos a una funci\u00f3n, estos se reciben por orden en los par\u00e1metros definidos. Se dice por tanto que son argumentos por posici\u00f3n:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">def<\/span> <span class=\"nf\">resta<\/span><span class=\"p\">(<\/span><span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span><span class=\"p\">):<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">return<\/span> <span class=\"n\">a<\/span> <span class=\"o\">-<\/span> <span class=\"n\">b<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">resta<\/span><span class=\"p\">(<\/span><span class=\"mi\">30<\/span><span class=\"p\">,<\/span> <span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\r\n<span class=\"go\">20<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>En el ejemplo anterior el argumento\u00a0<em>30<\/em>\u00a0es la posici\u00f3n\u00a0<em>0<\/em>\u00a0por consiguiente es el par\u00e1metro de la funci\u00f3n\u00a0<em>a<\/em>, seguidamente el argumento\u00a0<em>10<\/em>\u00a0es la posici\u00f3n\u00a0<em>1<\/em>\u00a0por consiguiente es el par\u00e1metro de la funci\u00f3n\u00a0<em>b<\/em>.<\/p>\n<\/div>\n<div id=\"por-nombre\" class=\"section\">\n<h3>Por nombre<\/h3>\n<p>Sin embargo es posible evadir el orden de los par\u00e1metros si indica durante la llamada que valor tiene cada par\u00e1metro a partir de su nombre:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">def<\/span> <span class=\"nf\">resta<\/span><span class=\"p\">(<\/span><span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span><span class=\"p\">):<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">return<\/span> <span class=\"n\">a<\/span> <span class=\"o\">-<\/span> <span class=\"n\">b<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"p\">(<\/span><span class=\"n\">b<\/span><span class=\"o\">=<\/span><span class=\"mi\">30<\/span><span class=\"p\">,<\/span> <span class=\"n\">a<\/span><span class=\"o\">=<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\r\n<span class=\"go\">-20<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"llamada-sin-argumentos\" class=\"section\">\n<h3>Llamada sin argumentos<\/h3>\n<p>Al momento de llamar una funci\u00f3n la cual tiene definidos unos par\u00e1metros, si no pasa los argumentos correctamente provocar\u00e1 una excepci\u00f3n\u00a0<span class=\"std std-ref\">TypeError<\/span>:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">resta<\/span><span class=\"p\">()<\/span>\r\n<span class=\"gt\">Traceback (most recent call last):<\/span>\r\n  File <span class=\"nb\">\"&lt;stdin&gt;\"<\/span>, line <span class=\"m\">1<\/span>, in <span class=\"n\">&lt;module&gt;<\/span>\r\n<span class=\"gr\">TypeError<\/span>: <span class=\"n\">resta() takes exactly 2 arguments (0 given)<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"parametros-por-defecto\" class=\"section\">\n<h3>Par\u00e1metros por defecto<\/h3>\n<p>Para solucionar la excepci\u00f3n\u00a0<span class=\"std std-ref\">TypeError<\/span>\u00a0ejecutada al momento de la llamada a una funci\u00f3n sin argumentos, entonces usted puede asignar unos valores por defecto nulos a los par\u00e1metros, de esa forma puede hacer una comprobaci\u00f3n antes de ejecutar el c\u00f3digo de la funci\u00f3n:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">def<\/span> <span class=\"nf\">resta<\/span><span class=\"p\">(<\/span><span class=\"n\">a<\/span><span class=\"o\">=<\/span><span class=\"kc\">None<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span><span class=\"o\">=<\/span><span class=\"kc\">None<\/span><span class=\"p\">):<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">if<\/span> <span class=\"n\">a<\/span> <span class=\"o\">==<\/span> <span class=\"kc\">None<\/span> <span class=\"ow\">or<\/span> <span class=\"n\">b<\/span> <span class=\"o\">==<\/span> <span class=\"kc\">None<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>        <span class=\"nb\">print<\/span> <span class=\"s2\">\"Error, debes enviar dos n\u00fameros a la funci\u00f3n\"<\/span>\r\n<span class=\"gp\">... <\/span>        <span class=\"k\">return<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">return<\/span> <span class=\"n\">a<\/span> <span class=\"o\">-<\/span> <span class=\"n\">b<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">resta<\/span><span class=\"p\">(<\/span><span class=\"mi\">30<\/span><span class=\"p\">,<\/span> <span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\r\n<span class=\"go\">20<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">resta<\/span><span class=\"p\">()<\/span>\r\n<span class=\"go\">Error, debes enviar dos n\u00fameros a la funci\u00f3n<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>Como puede ver el el c\u00f3digo anterior, se indica el final de la funci\u00f3n luego de la\u00a0<span class=\"std std-ref\">sentencia print<\/span>, usando la\u00a0<span class=\"std std-ref\">sentencia return<\/span>\u00a0aunque no devuelva nada.<\/p>\n<\/div>\n<\/div>\n<div id=\"argumentos-indeterminados\" class=\"section\"><span id=\"python-fun-args-kwargs\"><\/span><\/p>\n<h2>Argumentos indeterminados<\/h2>\n<p>En alguna ocasi\u00f3n usted no sabe previamente cuantos elementos necesita enviar a una funci\u00f3n. En estos casos puede utilizar los par\u00e1metros indeterminados por posici\u00f3n y por nombre.<\/p>\n<div id=\"id1\" class=\"section\">\n<h3>Por posici\u00f3n<\/h3>\n<p>Usted debe crear una lista din\u00e1mica de argumentos, es decir, un tipo\u00a0<span class=\"std std-ref\">tupla<\/span>, definiendo el par\u00e1metro con un asterisco, para recibir los par\u00e1metros indeterminados por posici\u00f3n:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">def<\/span> <span class=\"nf\">indeterminados_posicion<\/span><span class=\"p\">(<\/span><span class=\"o\">*<\/span><span class=\"n\">args<\/span><span class=\"p\">):<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">for<\/span> <span class=\"n\">arg<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">args<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>        <span class=\"nb\">print<\/span> <span class=\"n\">arg<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">indeterminados_posicion<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span><span class=\"s2\">\"Hola Plone\"<\/span><span class=\"p\">,[<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span><span class=\"mi\">4<\/span><span class=\"p\">,<\/span><span class=\"mi\">5<\/span><span class=\"p\">])<\/span>\r\n<span class=\"go\">5<\/span>\r\n<span class=\"go\">Hola Plone<\/span>\r\n<span class=\"go\">[1, 2, 3, 4, 5]<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"id2\" class=\"section\">\n<h3>Por nombre<\/h3>\n<p>Para recibir un n\u00famero indeterminado de par\u00e1metros por nombre (clave-valor o en ingl\u00e9s\u00a0<em>keyword args<\/em>), usted debe crear un diccionario din\u00e1mico de argumentos definiendo el par\u00e1metro con dos asteriscos:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">def<\/span> <span class=\"nf\">indeterminados_nombre<\/span><span class=\"p\">(<\/span><span class=\"o\">**<\/span><span class=\"n\">kwargs<\/span><span class=\"p\">):<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"nb\">print<\/span> <span class=\"n\">kwargs<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">indeterminados_nombre<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"o\">=<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span> <span class=\"n\">c<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"Hola Plone\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">l<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span><span class=\"mi\">4<\/span><span class=\"p\">,<\/span><span class=\"mi\">5<\/span><span class=\"p\">])<\/span>\r\n<span class=\"go\">{'c': 'Hola Plone', 'l': [1, 2, 3, 4, 5], 'n': 5}<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>Al recibirse como un diccionario, puede iterarlo y mostrar la clave y valor de cada argumento:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">def<\/span> <span class=\"nf\">indeterminados_nombre<\/span><span class=\"p\">(<\/span><span class=\"o\">**<\/span><span class=\"n\">kwargs<\/span><span class=\"p\">):<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">for<\/span> <span class=\"n\">kwarg<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">kwargs<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>        <span class=\"nb\">print<\/span> <span class=\"n\">kwarg<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"=&gt;\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">kwargs<\/span><span class=\"p\">[<\/span><span class=\"n\">kwarg<\/span><span class=\"p\">]<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">indeterminados_nombre<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"o\">=<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span> <span class=\"n\">c<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"Hola Plone\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">l<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span><span class=\"mi\">4<\/span><span class=\"p\">,<\/span><span class=\"mi\">5<\/span><span class=\"p\">])<\/span>\r\n<span class=\"go\">c =&gt; Hola Plone<\/span>\r\n<span class=\"go\">l =&gt; [1, 2, 3, 4, 5]<\/span>\r\n<span class=\"go\">n =&gt; 5<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"por-posicion-y-nombre\" class=\"section\">\n<h3>Por posici\u00f3n y nombre<\/h3>\n<p>Si requiere aceptar ambos tipos de par\u00e1metros simult\u00e1neamente en una funci\u00f3n, entonces debe crear ambas colecciones din\u00e1micas. Primero los argumentos indeterminados por valor y luego los cuales son por clave y valor:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">def<\/span> <span class=\"nf\">super_funcion<\/span><span class=\"p\">(<\/span><span class=\"o\">*<\/span><span class=\"n\">args<\/span><span class=\"p\">,<\/span><span class=\"o\">**<\/span><span class=\"n\">kwargs<\/span><span class=\"p\">):<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"n\">total<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">for<\/span> <span class=\"n\">arg<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">args<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>        <span class=\"n\">total<\/span> <span class=\"o\">+=<\/span> <span class=\"n\">arg<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"nb\">print<\/span> <span class=\"s2\">\"sumatorio =&gt; \"<\/span><span class=\"p\">,<\/span> <span class=\"n\">total<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">for<\/span> <span class=\"n\">kwarg<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">kwargs<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>        <span class=\"nb\">print<\/span> <span class=\"n\">kwarg<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"=&gt;\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">kwargs<\/span><span class=\"p\">[<\/span><span class=\"n\">kwarg<\/span><span class=\"p\">]<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">super_funcion<\/span><span class=\"p\">(<\/span><span class=\"mi\">50<\/span><span class=\"p\">,<\/span> <span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mf\">1.56<\/span><span class=\"p\">,<\/span> <span class=\"mi\">10<\/span><span class=\"p\">,<\/span> <span class=\"mi\">20<\/span><span class=\"p\">,<\/span> <span class=\"mi\">300<\/span><span class=\"p\">,<\/span> <span class=\"n\">cms<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"Plone\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">edad<\/span><span class=\"o\">=<\/span><span class=\"mi\">38<\/span><span class=\"p\">)<\/span>\r\n<span class=\"go\">sumatorio =&gt;  380.56<\/span>\r\n<span class=\"go\">edad =&gt; 38<\/span>\r\n<span class=\"go\">cms =&gt; Plone<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>Los nombres\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">args<\/span><\/code>\u00a0y\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs<\/span><\/code>\u00a0no son obligatorios, pero se suelen utilizar por convenci\u00f3n.<\/p>\n<p>Muchos frameworks y librer\u00edas los utilizan por lo que es una buena practica llamarlos as\u00ed.<\/p>\n<\/div>\n<\/div>\n<div id=\"sentencia-pass\" class=\"section\"><span id=\"python-sent-pass\"><\/span><\/p>\n<h2>Sentencia pass<\/h2>\n<p>Es una operaci\u00f3n nula \u2014 cuando es ejecutada, nada sucede. Eso es \u00fatil como un contenedor cuando una sentencia es requerida sint\u00e1cticamente, pero no necesita c\u00f3digo que ser ejecutado, por ejemplo:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"c1\"># una funci\u00f3n que no hace nada (aun)<\/span>\r\n<span class=\"gp\">... <\/span><span class=\"k\">def<\/span> <span class=\"nf\">consultar_nombre_genero<\/span><span class=\"p\">(<\/span><span class=\"n\">letra_genero<\/span><span class=\"p\">):<\/span> <span class=\"k\">pass<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"nb\">type<\/span><span class=\"p\">(<\/span><span class=\"n\">consultar_nombre_genero<\/span><span class=\"p\">)<\/span>\r\n<span class=\"go\">&lt;type 'function'&gt;<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">consultar_nombre_genero<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"M\"<\/span><span class=\"p\">)<\/span>\r\n<span class=\"go\">&gt;&gt;&gt;<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"c1\"># una clase sin ning\u00fan m\u00e9todo (aun)<\/span>\r\n<span class=\"gp\">... <\/span><span class=\"k\">class<\/span> <span class=\"nc\">Persona<\/span><span class=\"p\">:<\/span> <span class=\"k\">pass<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">macagua<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Persona<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"nb\">type<\/span><span class=\"p\">(<\/span><span class=\"n\">macagua<\/span><span class=\"p\">)<\/span>\r\n<span class=\"go\">&lt;type 'classobj'&gt;<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"sentencia-return\" class=\"section\"><span id=\"python-sent-return\"><\/span><\/p>\n<h2>Sentencia return<\/h2>\n<p>Las funciones pueden comunicarse con el exterior de las mismas, al proceso principal del programa usando la sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">return<\/span><\/code>. El proceso de comunicaci\u00f3n con el exterior se hace\u00a0<em>devolviendo valores<\/em>. A continuaci\u00f3n, un ejemplo de funci\u00f3n usando\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">return<\/span><\/code>:<\/p>\n<div class=\"highlight-python notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"k\">def<\/span> <span class=\"nf\">devuelve_fibonacci<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"p\">):<\/span> \r\n    <span class=\"sd\">'''devuelve la sucesi\u00f3n Fibonacci hasta n'''<\/span>\r\n    <span class=\"n\">resultado<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[]<\/span>\r\n    <span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span>\r\n    <span class=\"k\">while<\/span> <span class=\"n\">b<\/span> <span class=\"o\">&lt;<\/span> <span class=\"n\">n<\/span><span class=\"p\">:<\/span>\r\n        <span class=\"n\">resultado<\/span><span class=\"o\">.<\/span><span class=\"n\">append<\/span><span class=\"p\">(<\/span><span class=\"n\">b<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span> <span class=\"o\">=<\/span> <span class=\"n\">b<\/span><span class=\"p\">,<\/span> <span class=\"n\">a<\/span> <span class=\"o\">+<\/span> <span class=\"n\">b<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">resultado<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>Esta funci\u00f3n se llama de la siguiente forma:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">devuelve_fibonacci<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\r\n<span class=\"go\">[1, 1, 2, 3, 5, 8]<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<div class=\"admonition note\">\n<p class=\"first admonition-title\">Nota<\/p>\n<p class=\"last\">Por defecto, las funciones retorna el valor\u00a0<span class=\"std std-ref\">None<\/span>.<\/p>\n<\/div>\n<div id=\"retorno-multiple\" class=\"section\">\n<h3>Retorno m\u00faltiple<\/h3>\n<p>Una caracter\u00edstica interesante, es la posibilidad de devolver valores m\u00faltiples separados por comas:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">def<\/span> <span class=\"nf\">prueba<\/span><span class=\"p\">():<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">return<\/span> <span class=\"s2\">\"Plone CMS\"<\/span><span class=\"p\">,<\/span> <span class=\"mi\">20<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"p\">]<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">prueba<\/span><span class=\"p\">()<\/span>\r\n<span class=\"go\">('Plone CMS', 20, [1, 2, 3])<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>En el c\u00f3digo anterior los valores m\u00faltiples se tratan en conjunto como una\u00a0<span class=\"std std-ref\">tupla<\/span>\u00a0inmutable y se pueden reasignar a distintas variables:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">def<\/span> <span class=\"nf\">prueba<\/span><span class=\"p\">():<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">return<\/span> <span class=\"s2\">\"Plone CMS\"<\/span><span class=\"p\">,<\/span> <span class=\"mi\">20<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"p\">]<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">prueba<\/span><span class=\"p\">()<\/span>\r\n<span class=\"go\">('Plone CMS', 20, [1, 2, 3])<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">cadena<\/span><span class=\"p\">,<\/span> <span class=\"n\">numero<\/span><span class=\"p\">,<\/span> <span class=\"n\">lista<\/span> <span class=\"o\">=<\/span> <span class=\"n\">prueba<\/span><span class=\"p\">()<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"nb\">print<\/span> <span class=\"n\">cadena<\/span><span class=\"p\">,<\/span> <span class=\"nb\">type<\/span><span class=\"p\">(<\/span><span class=\"n\">cadena<\/span><span class=\"p\">)<\/span>\r\n<span class=\"go\">Plone CMS &lt;type 'str'&gt;<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"nb\">print<\/span> <span class=\"n\">numero<\/span><span class=\"p\">,<\/span> <span class=\"nb\">type<\/span><span class=\"p\">(<\/span><span class=\"n\">numero<\/span><span class=\"p\">)<\/span>\r\n<span class=\"go\">20 &lt;type 'int'&gt;<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"nb\">print<\/span> <span class=\"n\">lista<\/span><span class=\"p\">,<\/span> <span class=\"nb\">type<\/span><span class=\"p\">(<\/span><span class=\"n\">lista<\/span><span class=\"p\">)<\/span>\r\n<span class=\"go\">[1, 2, 3] &lt;type 'list'&gt;<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>En el c\u00f3digo anterior puede observa como se asignar a distintas variables en base a los valores de la\u00a0<span class=\"std std-ref\">tupla<\/span>\u00a0inmutable.<\/p>\n<\/div>\n<\/div>\n<div id=\"ejemplos-de-funciones\" class=\"section\"><span id=\"python-fun-ejemplos\"><\/span><\/p>\n<h2>Ejemplos de funciones<\/h2>\n<p>A continuaci\u00f3n, se presentan algunos ejemplos de su uso:<\/p>\n<p><strong>Definici\u00f3n de funciones<\/strong><\/p>\n<p>A continuaci\u00f3n, se presenta un ejemplo del uso de definir funciones:<\/p>\n<div class=\"highlight-python notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"k\">def<\/span> <span class=\"nf\">iva<\/span><span class=\"p\">():<\/span>\r\n    <span class=\"sd\">'''funci\u00f3n b\u00e1sica para el calculo del IVA'''<\/span>\r\n    <span class=\"n\">iva<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">12<\/span>\r\n    <span class=\"n\">costo<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"nb\">input<\/span><span class=\"p\">(<\/span><span class=\"s1\">'\u00bfCual es el monto a calcular?: '<\/span><span class=\"p\">))<\/span>\r\n    <span class=\"n\">calculo<\/span> <span class=\"o\">=<\/span> <span class=\"n\">costo<\/span> <span class=\"o\">*<\/span> <span class=\"n\">iva<\/span> <span class=\"o\">\/<\/span> <span class=\"mi\">100<\/span>\r\n    <span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s2\">\"El calculo de IVA es: \"<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">str<\/span><span class=\"p\">(<\/span><span class=\"n\">calculo<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span> <span class=\"s2\">\"<\/span><span class=\"se\">\\n<\/span><span class=\"s2\">\"<\/span><span class=\"p\">)<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p><strong>Invocar funciones<\/strong><\/p>\n<p>A continuaci\u00f3n, se presenta un ejemplo del uso de llamar funciones:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">iva<\/span><span class=\"p\">()<\/span>\r\n<span class=\"go\">\u00bfCual es el monto a calcular?: 300<\/span>\r\n<span class=\"go\">36<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p><strong>Funciones con argumentos m\u00faltiple<\/strong><\/p>\n<p>A continuaci\u00f3n, se presenta un ejemplo del uso de funciones con argumentos m\u00faltiple:<\/p>\n<div class=\"highlight-python notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"k\">def<\/span> <span class=\"nf\">suma<\/span><span class=\"p\">(<\/span><span class=\"n\">numero1<\/span><span class=\"p\">,<\/span> <span class=\"n\">numero2<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"sd\">'''funci\u00f3n la cual suma dos n\u00fameros'''<\/span>\r\n    <span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"n\">numero1<\/span> <span class=\"o\">+<\/span> <span class=\"n\">numero2<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"nb\">print<\/span> <span class=\"p\">(<\/span><span class=\"s2\">\"<\/span><span class=\"se\">\\n<\/span><span class=\"s2\">\"<\/span><span class=\"p\">)<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>Y se llama de la siguiente forma:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">suma<\/span><span class=\"p\">(<\/span><span class=\"mi\">23<\/span><span class=\"p\">,<\/span> <span class=\"mi\">74<\/span><span class=\"p\">)<\/span>\r\n<span class=\"go\">97<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Funciones Una funci\u00f3n es un bloque de c\u00f3digo con un nombre asociado, que recibe cero o m\u00e1s argumentos como entrada, sigue una secuencia de sentencias, la cuales ejecuta una operaci\u00f3n deseada y devuelve un valor y\/o realiza una tarea, este bloque puede ser llamados cuando se necesite. El uso de funciones es un componente muy [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":331,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[39,40],"tags":[],"class_list":["post-371","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacion","category-python"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/equipomedios.com\/blog\/wp-content\/uploads\/2024\/08\/python-logo-master-v3-TM.png?fit=601%2C203&ssl=1","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/posts\/371","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/comments?post=371"}],"version-history":[{"count":1,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/posts\/371\/revisions"}],"predecessor-version":[{"id":372,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/posts\/371\/revisions\/372"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/media\/331"}],"wp:attachment":[{"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/media?parent=371"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/categories?post=371"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/tags?post=371"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}