Más Herramientas para Control de Flujo - Documentación de Python - 3.10.8
Más Herramientas para Control de Flujo - Documentación de Python - 3.10.8
3.10.8 Ir
4.1. La sentencia if ¶
Tal vez el tipo más conocido de sentencia sea el if . Por ejemplo:
>>> if x < 0:
... x = 0
... elif x == 0:
... print('Zero')
... elif x == 1:
... print('Single')
... else:
... print('More')
...
More
Puede haber cero o más bloques elif , y el bloque else es opcional. La palabra reservada “ elif ’es una
abreviación de “else if”, y es útil para evitar un sangrado excesivo. Una secuencia if … elif … elif … sus-
tituye las sentencias switch o case encontradas en otros lenguajes.
Si necesitas comparar un mismo valor con muchas constantes, o comprobar que tenga un tipo o atributos es-
pecíficos puede que encuentres útil la sentencia keyword:!match. Para más detalles véase La sentencia
match.
...
cat 3
window 6
defenestrate 12
Código que modifica una colección mientras se itera sobre la misma colección puede ser complejo de hacer
bien. Sin embargo, suele ser más directo iterar sobre una copia de la colección o crear una nueva colección:
https://docs.python.org/es/3/tutorial/controlflow.html 1/17
18/10/22, 15:22 4. Más herramientas para control de flujo — documentación de Python - 3.10.8
for user,3.10.8
status in users.copy().items():
Ir
if status == 'inactive':
del users[user]
active_users = {}
if status == 'active':
active_users[user] = status
...
El valor final dado nunca es parte de la secuencia; range(10) genera 10 valores, los índices correspondien-
tes para los ítems de una secuencia de longitud 10. Es posible hacer que el rango empiece con otro número,
o especificar un incremento diferente (incluso negativo; algunas veces se lo llama “paso”):
[0, 3, 6, 9]
Para iterar sobre los índices de una secuencia, puedes combinar range() y len() así:
...
0 Mary
1 had
2 a
3 little
4 lamb
En la mayoría de los casos, sin embargo, conviene usar la función enumerate() , mira Técnicas de iteración.
>>> range(10)
>>>
range(0, 10)
De muchas maneras el objeto retornado por range() se comporta como si fuera una lista, pero no lo es. Es
un objeto que retorna los ítems sucesivos de la secuencia deseada cuando iteras sobre él, pero realmente no
https://docs.python.org/es/3/tutorial/controlflow.html 2/17
18/10/22, 15:22 4. Más herramientas para control de flujo — documentación de Python - 3.10.8
>>> sum(range(4)) # 0 + 1 + 2 + 3
>>>
6
Más adelante veremos otras funciones que aceptan iterables cómo argumentos o retornan iterables. En el ca-
pítulo Estructuras de datos, discutiremos en más detalle sobre la list() .
Las sentencias de bucle pueden tener una cláusula`!else` que es ejecutada cuando el bucle termina, después
de agotar el iterable (con for ) o cuando la condición se hace falsa (con while ), pero no cuando el bucle se
termina con la sentencia break . Se puede ver el ejemplo en el siguiente bucle, que busca números primos:
... if n % x == 0:
... break
... else:
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
(Sí, este es el código correcto. Fíjate bien: el else pertenece al ciclo for , no al if .)
Cuando se usa con un bucle, la cláusula else tiene más en común con el else de una sentencia try que
con el de un if : en una sentencia try la cláusula else se ejecuta cuando no se genera ninguna excepción, y
el else de un bucle se ejecuta cuando no hay ningún break . Para más sobre la declaración try y excepcio-
nes, mira Gestionando excepciones.
La declaración continue , también tomada de C, continua con la siguiente iteración del ciclo:
... continue
...
https://docs.python.org/es/3/tutorial/controlflow.html 3/17
18/10/22, 15:22 4. Más herramientas para control de flujo — documentación de Python - 3.10.8
Found an 3.10.8
odd number 9
Ir
...
...
Otro lugar donde se puede usar pass es como una marca de lugar para una función o un cuerpo condicional
cuando estás trabajando en código nuevo, lo cual te permite pensar a un nivel de abstracción mayor. El pass
se ignora silenciosamente:
...
La forma más simple compara un valor, el «sujeto», con uno o más literales:
def http_error(status):
match status:
case 400:
case 404:
case 418:
case _:
Observa el último bloque: el «nombre de variable» _ funciona como un comodín y nunca fracasa la coinciden-
cia. Si ninguno de los casos case coincide, ninguna de las ramas es ejecutada.
https://docs.python.org/es/3/tutorial/controlflow.html 4/17
18/10/22, 15:22 4. Más herramientas para control de flujo — documentación de Python - 3.10.8
Los patrones pueden también verse como asignaciones que desempaquetan, y pueden usarse para ligar
3.10.8 Ir
variables:
match point:
print("Origin")
print(f"Y={y}")
print(f"X={x}")
print(f"X={x}, Y={y}")
case _:
¡Observa éste con cuidado! El primer patrón tiene dos literales y puede considerarse una extensión del patrón
literal que se mostró anteriormente. Pero los siguientes dos patrones combinan un literal y una variable, y la
variable liga uno de los elementos del sujeto ( point ). El cuarto patrón captura ambos elementos, lo que lo
hace conceptualmente similar a la asignación que desempaqueta (x, y) = point .
Si estás usando clases para estructurar tus datos, puedes usar el nombre de la clase seguida de una lista de
argumentos similar a la de un constructor, pero con la capacidad de capturar atributos en variables:
class Point:
x: int
y: int
def where_is(point):
match point:
print("Origin")
print(f"Y={y}")
print(f"X={x}")
case Point():
print("Somewhere else")
case _:
print("Not a point")
Puedes usar argumentos posicionales en algunas clases incorporadas que proveen un orden para sus atribu-
tos (por ej. dataclasses). También puedes definir una posición especifica para los atributos de los patrones si
asignas en tu clase el atributo especial __match_args__ . Si le asignas («x», «y»), los siguientes patrones son
todos equivalentes entre sí (y todos ligan el atributo y a la variable var ):
Point(1, var)
Point(1, y=var)
Point(x=1, y=var)
Point(y=var, x=1)
Una recomendación para leer patrones es verlos como una forma extendida de lo que pondrías en el lado iz-
quierdo de una asignación, para así entender cuales variables tomarían que valores. Sólo los nombres que
aparecen por si solos (cómo var arriba) son asignados por una sentencia match. Nunca se asigna a los nom-
bres con puntos (como foo.bar ), nombres de atributos (los x= e y= arriba) o nombres de clases (reconoci-
dos por los «(…)» junto a ellos, como Point arriba).
Los patrones pueden anidarse arbitrariamente. Por ejemplo, si tuviéramos una lista corta de puntos, podría-
mos aplicar match así:
https://docs.python.org/es/3/tutorial/controlflow.html 5/17
18/10/22, 15:22 4. Más herramientas para control de flujo — documentación de Python - 3.10.8
match points:
3.10.8 Ir
case []:
print("No points")
print("The origin")
case _:
print("Something else")
Podemos añadir una clausula if a un patrón, conocida como «guarda». Si la guarda es falsa, match pasa a
intentar el siguiente bloque case. Obsérvese que la captura de valores sucede antes de que la guarda sea
evaluada:
match point:
case Point(x, y) if x == y:
print(f"Y=X at {x}")
Al igual que las asignaciones con desempaquetado, los patrones de lista o tupla tienen el mismo signifi-
cado y en realidad coinciden con cualquier secuencia. Una excepción importante es que no coinciden ni
con iteradores ni con cadenas de caracteres.
Los patrones de secuencia soportan desempaquetado extendido: [x, y, *otros] and (x, y, *otros)
funcionan de manera similar a las asignaciones con desempaquetado. El nombre luego de * también
puede ser _ , con lo cual (x, y, *_) coincide con cualquier secuencia de al menos del elementos, sin ligar
ninguno de los demás elementos.
capturará el segundo elemento de la entrada en p2 (siempre y cuando la entrada sea una secuencia de
dos puntos)
La mayoría de los literales se comparan por igualdad, pero los singletons True , False y None se comparan
por identidad.
En un patrón pueden usarse constantes con nombres. Los nombres deben tener puntos para impedir que
sean interpretados como variables a capturar:
class Color(Enum):
RED = 'red'
GREEN = 'green'
BLUE = 'blue'
match color:
https://docs.python.org/es/3/tutorial/controlflow.html 6/17
18/10/22, 15:22 4. Más herramientas para control de flujo — documentación de Python - 3.10.8
case Color.RED:
3.10.8
print("I see red!")
Ir
case Color.GREEN:
print("Grass is green")
case Color.BLUE:
Para una explicación más detallada y más ejemplos, puede leerse PEP 636 que está escrita en un formato de
tutorial.
... a, b = 0, 1
... a, b = b, a+b
... print()
...
... fib(2000)
La palabra reservada def se usa para definir funciones. Debe seguirle el nombre de la función y la lista de
parámetros formales entre paréntesis. Las sentencias que forman el cuerpo de la función empiezan en la lí-
nea siguiente, y deben estar con sangría.
La primera sentencia del cuerpo de la función puede ser opcionalmente una cadena de texto literal; esta es la
cadena de texto de documentación de la función, o docstring. (Puedes encontrar más acerca de docstrings en
la sección Cadenas de texto de documentación.). Existen herramientas que usan las docstrings para produ-
cir documentación imprimible o disponible en línea, o para dejar que los usuarios busquen interactivamente a
través del código; es una buena práctica incluir docstrings en el código que escribes, y hacerlo un buen
hábito.
La ejecución de una función introduce una nueva tabla de símbolos usada para las variables locales de la fun-
ción. Más precisamente, todas las asignaciones de variables en la función almacenan el valor en la tabla de
símbolos local; así mismo la referencia a variables primero mira la tabla de símbolos local, luego en la tabla
de símbolos local de las funciones externas, luego la tabla de símbolos global, y finalmente la tabla de nom-
bres predefinidos. Así, a variables globales y a variables de funciones que engloban a una función no se les
puede asignar directamente un valor dentro de una función (a menos que se las nombre en la sentencia
global , o mediante la sentencia nonlocal para variables de funciones que engloban la función local), aun-
que si pueden ser referenciadas.
Los parámetros (argumentos) reales para una llamada de función se introducen en la tabla de símbolos local
de la función llamada cuando se llama; por lo tanto, los argumentos se pasan usando llamada por valor
(donde el valor es siempre un objeto referencia, no el valor del objeto). [1] Cuando una función llama a otra
función, o se llama a sí misma de forma recursiva, se crea una nueva tabla de símbolos locales para esa
llamada.
Una definición de función asocia el nombre de la función con el objeto de función en la tabla de símbolos ac-
tual. El intérprete reconoce el objeto al que apunta ese nombre como una función definida por el usuario.
Otros nombres también pueden apuntar a ese mismo objeto de función y también se pueden usar para acce-
der a la función:
https://docs.python.org/es/3/tutorial/controlflow.html 7/17
18/10/22, 15:22 4. Más herramientas para control de flujo — documentación de Python - 3.10.8
>>> fib
>>>
3.10.8 Ir
<function fib at 10042ed0>
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89
Viniendo de otros lenguajes, puedes objetar que fib no es una función, sino un procedimiento, porque no re-
torna un valor. De hecho, técnicamente hablando, los procedimientos sin return sí retornan un valor, aunque
uno aburrido. Este valor se llama None (es un nombre predefinido). El intérprete por lo general no escribe el
valor None si va a ser el único valor escrito. Si realmente se quiere, se puede verlo usando la función print()
>>> fib(0)
>>>
>>> print(fib(0))
None
Es simple escribir una función que retorne una lista con los números de la serie de Fibonacci en lugar de
imprimirlos:
... result = []
... a, b = 0, 1
... a, b = b, a+b
...
La sentencia return retorna un valor en una función. return sin una expresión como argumento retorna
None . Si se alcanza el final de una función, también se retorna None .
La sentencia result.append(a) llama a un método del objeto lista result . Un método es una función que
“pertenece” a un objeto y se nombra obj.methodname , dónde obj es algún objeto (puede ser una expre-
sión), y methodname es el nombre del método que está definido por el tipo del objeto. Distintos tipos definen
distintos métodos. Métodos de diferentes tipos pueden tener el mismo nombre sin causar ambigüedad. (Es
posible definir tipos de objetos propios, y métodos, usando clases, mira Clases). El método append() mos-
trado en el ejemplo está definido para objetos lista; añade un nuevo elemento al final de la lista. En este
ejemplo es equivalente a result = result + [a] , pero más eficiente.
La forma más útil es especificar un valor por omisión para uno o más argumentos. Esto crea una función que
puede ser llamada con menos argumentos que los que permite. Por ejemplo:
while True:
ok = input(prompt)
https://docs.python.org/es/3/tutorial/controlflow.html 8/17
18/10/22, 15:22 4. Más herramientas para control de flujo — documentación de Python - 3.10.8
return True
3.10.8
if ok in ('n', 'no', 'nop', 'nope'):
Ir
return False
retries = retries - 1
if retries < 0:
print(reminder)
Este ejemplo también introduce la palabra reservada in , la cual prueba si una secuencia contiene o no un de-
terminado valor.
Los valores por omisión son evaluados en el momento de la definición de la función, en el ámbito de la defini-
ción, entonces:
i = 5
def f(arg=i):
print(arg)
i = 6
f()
…imprimirá `5 .
Advertencia importante: El valor por omisión es evaluado solo una vez. Existe una diferencia cuando el va-
lor por omisión es un objeto mutable como una lista, diccionario, o instancia de la mayoría de las clases. Por
ejemplo, la siguiente función acumula los argumentos que se le pasan en subsiguientes llamadas:
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
Imprimirá
[1]
[1, 2]
[1, 2, 3]
Si no se quiere que el valor por omisión sea compartido entre subsiguientes llamadas, se pueden escribir la
función así:
if L is None:
L = []
L.append(a)
return L
3.10.8
Las funciones Ir
también puede ser llamadas usando argumentos de palabras clave (o argumentos nombrados)
de la forma kwarg=value . Por ejemplo, la siguiente función:
…acepta un argumento obligatorio ( voltage )) y tres argumentos opcionales ( state , action , y type ). Esta
función puede llamarse de cualquiera de las siguientes maneras:
En una llamada a una función, los argumentos nombrados deben seguir a los argumentos posicionales. Cada
uno de los argumentos nombrados pasados deben coincidir con un argumento aceptado por la función (por
ejemplo, actor no es un argumento válido para la función parrot ), y el orden de los mismos no es impor-
tante. Esto también se aplica a los argumentos obligatorios (por ejemplo, parrot(voltage=1000) también es
válido). Ningún argumento puede recibir más de un valor al mismo tiempo. Aquí hay un ejemplo que falla de-
bido a esta restricción:
...
Cuando un parámetro formal de la forma **name está presente al final, recibe un diccionario (ver Tipos Mapa
— dict) conteniendo todos los argumentos nombrados excepto aquellos correspondientes a un parámetro for-
mal. Esto puede ser combinado con un parámetro formal de la forma *name (descrito en la siguiente sección)
que recibe una tuple conteniendo los argumentos posicionales además de la lista de parámetros formales.
( *name debe ocurrir antes de **name ). Por ejemplo, si definimos una función así:
print(arg)
print("-" * 40)
for kw in keywords:
https://docs.python.org/es/3/tutorial/controlflow.html 10/17
18/10/22, 15:22 4. Más herramientas para control de flujo — documentación de Python - 3.10.8
3.10.8 Ir
"It's really very, VERY runny, sir.",
shopkeeper="Michael Palin",
client="John Cleese",
----------------------------------------
Se debe notar que el orden en el cual los argumentos nombrados son impresos está garantizado para coinci-
dir con el orden en el cual fueron provistos en la llamada a la función.
Por defecto, los argumentos pueden enviarse a una función Python o bien por posición o explícitamente por
clave. Para legibilidad y rendimiento tiene sentido restringir como se pueden enviar los argumentos, así un
desarrollador necesitará mirar solamente la definición de la función para determinar si los argumentos se de-
ben enviar por posición, por posición o clave, o por clave.
| | |
| Positional or keyword |
| - Keyword only
-- Positional only
donde / y * son posicionales. Si se utilizan, esos símbolos indican el tipo de parámetro por como los argu-
mentos deben enviarse a la función: solo por posición (positional-only), por posición o clave (positional-or-key-
word) y solo por clave (keyword-only). Parámetros por clave pueden también denominarse parámetros por
nombre o nombrados.
Si / y * no están presentes en la definición de la función, los parámetros pueden ser pasados a una función
posicionalmente o por palabra clave.
En detalle, es posible señalar algunos parámetros como únicamente posicionales.. En ese caso el orden de
los parámetros es importante, y los parámetros no pueden ser indicados utilizando palabras claves. Paráme-
tros únicamente posicionales son ubicados antes de una / (barra). La / es utilizada para separar lógicamente
parámetros únicamente posicionales del resto. Si no existe una / en la definición de la función, no existen pa-
rámetros únicamente posicionales.
Los parámetros luego de una / pueden ser únicamente posicionales o unicamente de palabras claves.
Para señalar parámetros como unicamente de palabras clave, indicando que los parámetros deben ser pasa-
3.10.8 Ir
dos con una palabra clave, indiqué un * en la lista de argumentos antes del primer parámetro únicamente de
palabras clave.
Considere el siguiente ejemplo de definiciones de funciones prestando especial atención a los marcadores /
y *:
...
... print(arg)
...
... print(arg)
...
La primer definición de función, standard_arg , la forma mas familiar, no indica ninguna restricción en las con-
diciones para llamarla y los parámetros deben ser pasados por posición o utilizando palabras clave:
>>> standard_arg(2)
>>>
2
>>> standard_arg(arg=2)
La segunda función pos_only_arg está restringida a utilizar únicamente parámetros posicionales ya que
existe una / en la definición de la función:
>>> pos_only_arg(1)
>>>
1
>>> pos_only_arg(arg=1)
TypeError: pos_only_arg() got some positional-only arguments passed as keyword arguments: 'a
La tercer función kwd_only_args solo permite parámetros con palabras clave, indicado por un * en la defini-
ción de la función:
>>> kwd_only_arg(3)
>>>
Traceback (most recent call last):
>>> kwd_only_arg(arg=3)
>>> combined_example(1, 2, 3)
>>>
Traceback (most recent call last):
https://docs.python.org/es/3/tutorial/controlflow.html 12/17
18/10/22, 15:22 4. Más herramientas para control de flujo — documentación de Python - 3.10.8
3.10.8
>>> combined_example(1, 2, kwd_only=3)
Ir
1 2 3
1 2 3
Finalmente, considere esta definición de función que contiene una colisión potencial entre los parámetros po-
sicionales name y **kwds que incluye name como una clave:
No hay una llamada posible que lo haga retornar True ya que la palabra clave 'name' siempre se vinculará al
primer parámetro. Por ejemplo:
>>>
Pero utilizando / (parámetros únicamente posicionales), es posible ya que permite utilizar name como un pa-
rámetro posicional y name como un parámetro de palabras clave:
True
En otras palabras, los nombres de parámetros únicamente posicionales pueden ser utilizados en **kwds sin
ambigüedad.
4.8.3.5. Resumen
A modo de guía:
Utilice únicamente posicionales si quiere que el nombre del parámetro esté disponible para el usuario. Esto
es útil cuando el nombre del parámetro no tiene un significado real, si se quiere imponer el orden de los pa-
rámetros cuando una función es llamada o si necesita tomar algunos parámetros posicionales y palabras
claves arbitrarias.
Utilice parámetros únicamente de palabras clave cuando los nombres de los parámetros tienen un signifi-
cado y la definición de la función será más entendible usando nombres explícitos o cuando desea evitar
que los usuarios dependan de la posición de los parámetros que se pasan.
En el caso de una API, use solo posicional para evitar que se rompan los cambios de la API si el nombre
del parámetro se modifica en el futuro.
https://docs.python.org/es/3/tutorial/controlflow.html 13/17
18/10/22, 15:22 4. Más herramientas para control de flujo — documentación de Python - 3.10.8
Finalmente, la opción menos frecuentemente usada es especificar que una función puede ser llamada con un
número arbitrario de argumentos. Estos argumentos serán organizados en una tupla (mira Tuplas y secuen-
cias). Antes del número variable de argumentos, cero o más argumentos normales pueden estar presentes.:
file.write(separator.join(args))
...
'earth/mars/venus'
'earth.mars.venus'
La situación inversa ocurre cuando los argumentos ya están en una lista o tupla pero necesitan ser desempa-
quetados para llamar a una función que requiere argumentos posicionales separados. Por ejemplo, la función
predefinida range() espera los parámetros inicio y fin. Si estos no están disponibles en forma separada, se
puede escribir la llamada a la función con el operador * para desempaquetar argumentos desde una lista o
una tupla:
[3, 4, 5]
Del mismo modo, los diccionarios pueden entregar argumentos nombrados con el operador ** :
... print("if you put", voltage, "volts through it.", end=' ')
...
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised
Pequeñas funciones anónimas pueden ser creadas con la palabra reservada lambda . Esta función retorna la
suma de sus dos argumentos: lambda a, b: a+b Las funciones Lambda pueden ser usadas en cualquier lu-
gar donde sea requerido un objeto de tipo función. Están sintácticamente restringidas a una sola expresión.
Semánticamente, son solo azúcar sintáctica para definiciones normales de funciones. Al igual que las funcio-
nes anidadas, las funciones lambda pueden hacer referencia a variables desde el ámbito que la contiene:
https://docs.python.org/es/3/tutorial/controlflow.html 14/17
18/10/22, 15:22 4. Más herramientas para control de flujo — documentación de Python - 3.10.8
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
43
El ejemplo anterior muestra el uso de una expresión lambda para retornar una función. Otro uso es para pa-
sar pequeñas funciones como argumentos
>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>>
>>> pairs.sort(key=lambda pair: pair[1])
>>> pairs
Acá hay algunas convenciones sobre el contenido y formato de las cadenas de texto de documentación.
La primera línea debe ser siempre un resumen corto y conciso del propósito del objeto. Para ser breve, no se
debe mencionar explícitamente el nombre o tipo del objeto, ya que estos están disponibles de otros modos
(excepto si el nombre es un verbo que describe el funcionamiento de la función). Esta línea debe empezar
con una letra mayúscula y terminar con un punto.
Si hay más líneas en la cadena de texto de documentación, la segunda línea debe estar en blanco, sepa-
rando visualmente el resumen del resto de la descripción. Las líneas siguientes deben ser uno o más párrafos
describiendo las convenciones para llamar al objeto, efectos secundarios, etc.
El analizador de Python no quita el sangrado de las cadenas de texto literales multi-líneas, entonces las he-
rramientas que procesan documentación tienen que quitarlo si así lo desean. Esto se hace mediante la si-
guiente convención. La primera línea que no está en blanco siguiente a la primer línea de la cadena deter-
mina la cantidad de sangría para toda la cadena de documentación. (No podemos usar la primer línea ya que
generalmente es adyacente a las comillas de apertura de la cadena y el sangrado no se nota en la cadena de
texto). Los espacios en blanco «equivalentes» a este sangrado son luego quitados del comienzo de cada lí-
nea en la cadena. No deberían haber líneas con una sangría menor, pero si las hay todos los espacios en
blanco del comienzo deben ser quitados. La equivalencia de espacios en blanco debe ser verificada luego de
la expansión de tabuladores (a 8 espacios, normalmente).
...
... """
... pass
...
>>> print(my_function.__doc__)
https://docs.python.org/es/3/tutorial/controlflow.html 15/17
18/10/22, 15:22 4. Más herramientas para control de flujo — documentación de Python - 3.10.8
Las anotaciones de funciones son información completamente opcional sobre los tipos usadas en funciones
3.10.8 Ir
definidas por el usuario (ver PEP 484 para más información).
...
>>> f('spam')
Annotations: {'ham': <class 'str'>, 'return': <class 'str'>, 'eggs': <class 'str'>}
Para Python, PEP 8 se erigió como la guía de estilo a la que más proyectos adhirieron; promueve un estilo de
codificación fácil de leer y visualmente agradable. Todos los desarrolladores Python deben leerlo en algún
momento; aquí están extraídos los puntos más importantes:
4 espacios son un buen compromiso entre una sangría pequeña (permite mayor nivel de sangrado)y una
sangría grande (más fácil de leer). Los tabuladores introducen confusión y es mejor dejarlos de lado.
Esto ayuda a los usuarios con pantallas pequeñas y hace posible tener varios archivos de código abiertos,
uno al lado del otro, en pantallas grandes.
Usar líneas en blanco para separar funciones y clases, y bloques grandes de código dentro de funciones.
Usar docstrings .
Usar espacios alrededor de operadores y luego de las comas, pero no directamente dentro de paréntesis:
a = f(1, 2) + g(3, 4) .
Nombrar las clases y funciones consistentemente; la convención es usar NotacionCamello para clases y
minusculas_con_guiones_bajos para funciones y métodos. Siempre usa self como el nombre para el
primer argumento en los métodos (mirar Un primer vistazo a las clases para más información sobre clases
y métodos).
https://docs.python.org/es/3/tutorial/controlflow.html 16/17
18/10/22, 15:22 4. Más herramientas para control de flujo — documentación de Python - 3.10.8
De la misma manera, no uses caracteres no-ASCII en los identificadores si hay incluso una pequeñísima
chance de que gente que hable otro idioma tenga que leer o mantener el código.
Notas al pie
[1] En realidad, llamadas por referencia de objeto sería una mejor descripción, ya que si se pasa un objeto
mutable, quien realiza la llamada verá cualquier cambio que se realice sobre el mismo (por ejemplo
ítems insertados en una lista).
https://docs.python.org/es/3/tutorial/controlflow.html 17/17