{"id":59246,"date":"2022-03-09T13:00:56","date_gmt":"2022-03-09T12:00:56","guid":{"rendered":"https:\/\/eiposgrados.com\/?p=59246"},"modified":"2022-04-06T09:55:04","modified_gmt":"2022-04-06T07:55:04","slug":"improving-our-python-code-an-alternative-to-range","status":"publish","type":"post","link":"https:\/\/eiposgrados.com\/eng\/blog-python\/mejorando-nuestro-codigo-python-una-alternativa-a-range\/","title":{"rendered":"Improving our Python code: an alternative to range"},"content":{"rendered":"\n<h2 class=\"gb-headline gb-headline-23fb5f3d gb-headline-text\">Funci\u00f3n range<\/h2>\n\n\n\n<p>La conocida <strong>funci\u00f3n \u201crange\u201d de Python<\/strong>, que nos ense\u00f1aron en nuestros inicios de programaci\u00f3n a usar en un <strong>bucle \u201cfor\u201d<\/strong>, es posible que en muchas ocasiones la podamos sustituir por mejores opciones y con un c\u00f3digo m\u00e1s limpio y moderno. Esta funci\u00f3n tiene su origen en los lenguajes C\/C++\/Java, predecesores de este lenguaje de programaci\u00f3n, y que realmente necesitan una variable de bucle de \u00edndice, pero en este lenguaje de programaci\u00f3n no es necesario tener este \u00edndice.\u00a0<\/p>\n\n\n\n<p>El bucle para una secuencia iterable suele ser as\u00ed:<\/p>\n\n\n\n<p>for x in range(len(seq)):<\/p>\n\n\n\n<p>#haz_algo_con (seq[x])<\/p>\n\n\n\n<p>La variable x se utiliza solo para acceder al siguiente elemento desde el iterable. Dado que Python \u201c<em>for<\/em>\u201d es un bucle \u201c<em>foreach<\/em>\u201d, yo creo, que hay una mejor manera de hacer esto; iterando directamente sobre el iterable (de ah\u00ed el nombre) y que quedar\u00eda de esta manera:<\/p>\n\n\n\n<p><em>for<\/em> cosa in secuencia:<\/p>\n\n\n\n<p>#Haz_algo_con (cosa)<\/p>\n\n\n\n<p>&nbsp;Lo que en un caso sencillo quedar\u00eda de esta manera:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-122402.png\" alt=\"Captura De Pantalla 2022 03 09 A Las 12.24.02\" class=\"wp-image-59247\" width=\"903\" height=\"78\" title=\"\" srcset=\"https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-122402.png 910w, https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-122402-300x26.png 300w, https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-122402-768x66.png 768w, https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-122402-123x11.png 123w, https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-122402-200x17.png 200w\" sizes=\"(max-width: 903px) 100vw, 903px\" \/><\/figure>\n\n\n\n<p>y dar\u00eda el resultado esperado para cada valor en la iteraci\u00f3n y usando el valor definido en la secuencia:<\/p>\n\n\n\n<p>&gt;&gt;27<\/p>\n\n\n\n<p>&gt;&gt;64<\/p>\n\n\n\n<p>Esta manera de <strong>iteraci\u00f3n directa<\/strong> es aproximadamente un 30% m\u00e1s r\u00e1pido, no requiere crear los \u00edndices y es m\u00e1s f\u00e1cil de leer el c\u00f3digo (&#8220;para [cada] elemento en [esa] secuencia, haga algo con [ese elemento).&nbsp;<\/p>\n\n\n\n<h2 class=\"gb-headline gb-headline-87a8ba99 gb-headline-text\">Funci\u00f3n Enumerate<\/h2>\n\n\n\n<p>Para modificar cada elemento en un <strong>iterable mutable<\/strong>, tampoco tenemos problema por no tener \u00edndice. En ese caso tenemos otra funci\u00f3n disponible: <strong>\u201cenumerate\u201d<\/strong>, que nos devuelve un generador que produce tuplas de elementos y sus respectivos \u00edndices en la forma (x,seq[x]).&nbsp;<\/p>\n\n\n\n<p>Veamos el c\u00f3digo de un caso muy simple:<\/p>\n\n\n\n<p>for x, cosa in enumerate(seq):<\/p>\n\n\n\n<p>seq[x] = do_something_with(item)<\/p>\n\n\n\n<p>Vamos a hacerlo con un caso sencillo, donde lo que hacemos es que se eleve al cubo, teniendo en cuenta que usamos una cadena para la iteraci\u00f3n y por tanto el \u00edndice empieza en 0 y los n\u00fameros de iteraci\u00f3n vienen y es similar al anterior ejemplo:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"864\" height=\"76\" src=\"https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-122550.png\" alt=\"Captura De Pantalla 2022 03 09 A Las 12.25.50\" class=\"wp-image-59248\" title=\"\" srcset=\"https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-122550.png 864w, https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-122550-300x26.png 300w, https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-122550-768x68.png 768w, https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-122550-123x11.png 123w, https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-122550-200x18.png 200w\" sizes=\"(max-width: 864px) 100vw, 864px\" \/><\/figure>\n\n\n\n<p>Obtenemos el \u00edndice y el resultado siguiente:<\/p>\n\n\n\n<p>0 0<\/p>\n\n\n\n<p>1 1<\/p>\n\n\n\n<p>2 8<\/p>\n\n\n\n<p>3 27<\/p>\n\n\n\n<p>La funci\u00f3n \u201c<em>enumerate<\/em>\u201d nos da muchas ventajas y puede usarse para varios procesos, que aqu\u00ed no vamos a detallar y os animo a explorar.<\/p>\n\n\n\n<p>Se puede pensar que se requiere \u201c<em>range<\/em>\u201d para manipular <strong>iterables paralelos<\/strong>, como por ejemplo coordenadas. Veamos un ejemplo, donde las cadenas X e Y almacenan las coordenadas de los puntos bidimensionales.&nbsp;<\/p>\n\n\n\n<p>En este caso, si escribimos el c\u00f3digo de esta manera:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"908\" height=\"56\" src=\"https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-123101.png\" alt=\"Captura De Pantalla 2022 03 09 A Las 12.31.01\" class=\"wp-image-59251\" title=\"\" srcset=\"https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-123101.png 908w, https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-123101-300x19.png 300w, https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-123101-768x47.png 768w, https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-123101-123x8.png 123w, https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-123101-200x12.png 200w\" sizes=\"(max-width: 908px) 100vw, 908px\" \/><\/figure>\n\n\n\n<p>Obtenemos un sistema de coordenadas cuyo resultado es:<\/p>\n\n\n\n<p>1 b<\/p>\n\n\n\n<p>2 a<\/p>\n\n\n\n<p>Si queremos profundizar tenemos otras posibilidades, como este otro ejemplo simple, en el que usamos tuplas:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"910\" height=\"132\" src=\"https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-123432.png\" alt=\"Captura De Pantalla 2022 03 09 A Las 12.34.32\" class=\"wp-image-59256\" title=\"\" srcset=\"https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-123432.png 910w, https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-123432-300x44.png 300w, https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-123432-768x111.png 768w, https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-123432-123x18.png 123w, https:\/\/eiposgrados.com\/wp-content\/uploads\/2022\/03\/captura-de-pantalla-2022-03-09-a-las-123432-200x29.png 200w\" sizes=\"(max-width: 910px) 100vw, 910px\" \/><\/figure>\n\n\n\n<p>Conseguimos un resultado como este:<\/p>\n\n\n\n<p>(&#8216;Nombre&#8217;, &#8216;Juan&#8217;)<\/p>\n\n\n\n<p>(&#8216;Primer apellido&#8217;, &#8216;Lopez&#8217;)<\/p>\n\n\n\n<p>(&#8216;Segundo apellido&#8217;, &#8216;Garcia&#8217;)<\/p>\n\n\n\n<p>Vemos que <strong>Python nos permite m\u00faltiples formas de hacer la misma cosa<\/strong> y remiti\u00e9ndonos al zen de Python (import this) podemos decir:\u201d Now is better than never.\u201d<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you are a Python developer, this post interests you. In it we will discuss an improvement to our Python code: an alternative to range.<\/p>","protected":false},"author":90,"featured_media":59262,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[407,142],"tags":[],"class_list":["post-59246","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-python","category-blog"],"acf":[],"_links":{"self":[{"href":"https:\/\/eiposgrados.com\/eng\/wp-json\/wp\/v2\/posts\/59246","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/eiposgrados.com\/eng\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/eiposgrados.com\/eng\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/eiposgrados.com\/eng\/wp-json\/wp\/v2\/users\/90"}],"replies":[{"embeddable":true,"href":"https:\/\/eiposgrados.com\/eng\/wp-json\/wp\/v2\/comments?post=59246"}],"version-history":[{"count":0,"href":"https:\/\/eiposgrados.com\/eng\/wp-json\/wp\/v2\/posts\/59246\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/eiposgrados.com\/eng\/wp-json\/wp\/v2\/media\/59262"}],"wp:attachment":[{"href":"https:\/\/eiposgrados.com\/eng\/wp-json\/wp\/v2\/media?parent=59246"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/eiposgrados.com\/eng\/wp-json\/wp\/v2\/categories?post=59246"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/eiposgrados.com\/eng\/wp-json\/wp\/v2\/tags?post=59246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}