Saltar al contenido

Trucos de Pitón – Magia Negra – Parte 2

Sentinel puede hacer un programa más simple: es un mecanismo para distinguir los datos útiles de los marcadores de posición , que indican que los datos están ausentes.

Por ejemplo, podemos poner la clave que buscamos después del final del arreglo. Esto asegura que finalmente encontraremos el elemento. Cuando lo encontremos, sólo tenemos que comprobar si hemos encontrado un elemento real o sólo el centinela.

Trucos de Pitón – Magia Negra – Parte 2
Trucos de Pitón – Magia Negra – Parte 2

Aquí comparamos dos funciones similares incorporadas: str.index sin centinela y str.find con centinela.

1234567891011"""find vs index"""""index sin centinela"""try: i = a.index(b)except:return"""find with sentinel"""i = a.find(b)if i ==-1:return

pitón

Como filosofía de diseño, la idea de centinela se utiliza ampliamente en Python. Discutiremos más a fondo el mecanismo centinela en una guía separada, incluyendo el valor por defecto, el terminador de bucle, el objeto centinela y el centinela funcional.

Ejemplos inspiradores

Estos ejemplos muestran la idea de centinela utilizada tanto en las funciones incorporadas como en los escenarios de aplicación.

12345678910111213141516171819202122232425262728293031323334353637"""sentinel in iter"""blocks =$0027$0027.join(iter(partial(f.read,32),$0027$0027))"""sentinel in dict.get"""sentinel =object()value = my_dict. get(key, sentinel)if value isnot sentinel:# Haz algo con valor"""add a sentinel n at the end (which is the appropriate last insertion index then)""# L47: dada una colección de números que podrían contener duplicados, devuelve todas las permutaciones únicas posibles. defpermute_unique(nums: List[int])- > List[List[int]]: perms =[[]]for n in nums: perms =[p[:i]+[n]+ p[i:]for p in perms for i inrange((p +[n]). index(n)+1)]return perms"""sentinel en matriz"""deftraverse_neighbors(matrix: List[List[int]]): m, n =len(matrix),len(matrix[0])""aumentar la matriz para comprobar la longitud del vacío por el centinela""" matriz +=[0]* n,para fila en matriz: fila. append(0)para i inrange(m):para j inrange(n):# construye el iterador vecino para I, J in(i +1, j),(i -1, j),(i, j +1),(i, j -1): """no hay necesidad de comprobar el límite""" process_neighbor_logic(matrix[I][J])"""centinela funcional"""defget_element(matrix: List[List[int]], i:int, j:int)- >int:return matrix[i][j]if0<= i < m and0<= j < n else-1

pitón