Más

Usar bloque de código de función definido con Python en ArcGIS

Usar bloque de código de función definido con Python en ArcGIS


Estoy ejecutando un cálculo de campo dentro de una secuencia de comandos de Python en ArcGIS. Dentro de este Cálculo de campo, estoy llamando a una función definida dentro de un bloque de código.

Aquí está el diálogo que ejecuté y funciona:

Esto funcionó. Sin embargo, no puedo hacer que esto se traduzca a mi código Python:

Aquí está el código:

#Calcula YSLB expression = "output (! MTH_BRNT!,! YR_BRNT!,! YSLB!)" Code_block = "def output (MTH_BRNT, YR_BRNT, YSLB): / n mes = str (mes_val) / n mes_actual = int (mes) / n month_fire = int (MTH_BRNT) / n year = str (high_year) / n year_current = int (año) / n year_fire = int (YR_BRNT) / n Mc = (12 * (year_current-1)) + month_current / n Mf = (12 * (year_fire-1)) + month_fire / n return (Mc-Mf) / 12 "arcpy.CalculateField_management (fuel_age_out," YSLB ", expresión," PYTHON_9.3 ", code_block)

Me he encontrado con este problema antes. Intente utilizar "" "en lugar de" encima de la expresión.

De lo contrario, prueba este:

code_block = "" "def salida (MTH_BRNT, YR_BRNT, YSLB): month = str (month_val) month_current = int (mes) / n month_fire = int (MTH_BRNT) year = str (high_year) / n year_current = int (año) year_fire = int (YR_BRNT) Mc = (12 * (year_current-1)) + month_current Mf = (12 * (year_fire-1)) + month_fire return (Mc-Mf) / 12 "" "

a veces Python no reconoce el n


En Python, un bloque es una característica sintáctica (una sangría debajo de las declaraciones de apertura del bloque como if o def) y no un objeto. La característica que espera puede ser un cierre (que puede acceder a variables fuera del bloque), que puede lograr usando funciones internas, pero se podría usar cualquier invocable. Debido a cómo funciona lambda en Python, la definición de función en línea que ha mostrado con do | arg | está limitado a una sola expresión.

Aquí hay una reescritura aproximada de su código de muestra en Python.

Una variante usa un bucle for para dejar claro que el bucle es finito:

Con frecuencia, al pasar llamadas como esta, ya tendrá la función que desea disponible en algún lugar y no necesitará redefinirla. Por ejemplo, los métodos sobre objetos (métodos enlazados) son invocables perfectamente válidos.


Métodos

Marca el parámetro con un error (una X roja) con el mensaje proporcionado. Las herramientas no se ejecutan si alguno de los parámetros tiene un error.

Marca el parámetro con una advertencia (un triángulo amarillo) con el mensaje proporcionado. A diferencia de los errores, las herramientas se ejecutan con mensajes de advertencia.

setIDMessage (messageType: string, messageID: string, , )

Le permite configurar un mensaje del sistema. Los argumentos son los mismos que los de la función AddIDMessage.

Borra cualquier texto de mensaje y establece el estado en informativo (sin error ni advertencia).

Devuelve verdadero si el parámetro contiene un error.

Devuelve verdadero si el parámetro contiene una advertencia.

Devuelve verdadero si la herramienta se valida dentro de un modelo y el valor de entrada es la salida de otra herramienta en el modelo.

Propiedades

Dirección de entrada / salida del parámetro.

Cadena: "Obligatorio", "Opcional", "Derivado"

Una lista de índices de cada parámetro dependiente.

El valor del parámetro.

Falso si el parámetro no está disponible.

Verdadero si el usuario ha modificado el valor.

Verdadero si la rutina de validación interna ha verificado el parámetro.

La categoría del parámetro.

El esquema del conjunto de datos de salida.

El filtro que se aplicará a los valores del parámetro.

La ruta a un archivo de capa (.lyr) utilizado para dibujar la salida.

El mensaje que se mostrará al usuario. Consulte SetErrorMessage y SetWarningMessage más arriba.

ParameterDependencies

Normalmente, establece las dependencias de los parámetros para que las utilice el objeto Schema. Hay dos casos en los que es posible que las dependencias ya estén configuradas en el método getParameterInfo de la herramienta.

  • Para un parámetro de conjunto de datos de salida cuyo tipo es Derivado, la dependencia es el índice del parámetro del que derivar la salida.
  • Para ciertos tipos de datos de entrada, la dependencia es el índice del parámetro que contiene la información utilizada por el control, como se muestra en la tabla siguiente.

La tabla que contiene los campos.

Elemento INFO o expresión INFO

La tabla INFO que contiene los elementos.

La cobertura que contiene las funciones.

Unidades de área o unidades lineales

Un conjunto de datos geográficos que se utiliza para determinar las unidades predeterminadas.

Un espacio de trabajo utilizado para determinar el sistema de coordenadas predeterminado.

Configuración de jerarquía de Network Analyst

El conjunto de datos de red que contiene información de jerarquía.

Tabla de valores geoestadísticos

La capa de análisis que contiene tablas.

parameterDependencies es equivalente a la configuración Obtained From del asistente de la herramienta de secuencia de comandos.

Las dependencias se establecen normalmente en el método getParameterInfo:

Valor

Este es el valor del parámetro que el usuario ingresó o que estableció mediante programación. Puede establecer el valor en el método getParameterInfo, en cuyo caso sirve como el valor predeterminado inicial para el parámetro. También puede establecer el valor en updateParameters en respuesta a la entrada del usuario como se muestra a continuación.

La propiedad de valor de un parámetro devuelve un objeto, a menos que el parámetro no se complete, en cuyo caso el valor devuelve Ninguno. Para protegerse contra un parámetro que no se completa, use una verificación if antes de usar su valor.

El fragmento de código siguiente prueba si el valor es igual a la cadena "Obtener pesos espaciales del archivo". Esta prueba funciona porque el tipo de datos del parámetro es una cadena.

Como un objeto Value no admite la manipulación de cadenas, use la propiedad value del objeto Value siempre que una cadena deba manipularse o analizarse. El ejemplo de código usa el método os.path.dirname para devolver el directorio desde un conjunto de datos.

Con la excepción de Describe, no use métodos que tomen una ruta de catálogo, como ListFields, en la validación. Es posible que el conjunto de datos no exista cuando su herramienta está validada en ModelBuilder y el método puede fallar o dar resultados inesperados.

En el caso específico de ListFields, la propiedad de campos del objeto Describe proporcionará la información equivalente.

No establezca un valor de parámetro en updateMessages () ya que el valor no será validado por la rutina de validación interna.

Alterado

alterado es verdadero si el usuario cambió el valor de un parámetro, ingresando una ruta de salida, por ejemplo. Una vez que un parámetro ha sido alterado, permanece alterado hasta que el usuario vacía (borra) el valor, en cuyo caso vuelve a estar inalterado. El cambio programático de un valor con código de validación no cambia el estado alterado. Es decir, si establece un valor para un parámetro, el estado alterado del parámetro no cambia.

alterado se utiliza para determinar si puede cambiar el valor de un parámetro. Como ejemplo, suponga que una herramienta tiene un parámetro de clase de entidad y un parámetro de palabra clave. Si la clase de entidad contiene puntos o polígonos, las palabras clave son ROJO, VERDE y AZUL, y si hay líneas, NARANJA, AMARILLO, PÚRPURA y BLANCO.

Suponga que el usuario ingresa una clase de entidad puntual. Si el parámetro de palabra clave no se modifica, establece el valor en ROJO, ya que es el valor predeterminado.

Si se ingresa una clase de entidad de línea, usted establece el valor predeterminado en NARANJA siempre que el parámetro de palabra clave no se modifique.

Sin embargo, si el usuario ha modificado el parámetro de la palabra clave (es decir, la palabra clave está configurada en VERDE), no debe restablecer la palabra clave; el usuario ha hecho su elección (VERDE) y usted no conoce su intención: ellos pueden cambiar la clase de entidad para que VERDE sea válido o pueden cambiar la palabra clave (a PÚRPURA, por ejemplo). Dado que VERDE no es miembro del conjunto de palabras clave que creó para las líneas, la validación interna marca el parámetro como un error. El usuario tiene dos opciones en este punto: cambiar la clase de entidad de entrada o cambiar la palabra clave.

HasBeenValidated

hasBeenValidated es falso si el usuario ha modificado el valor de un parámetro desde la última vez que se llamó a updateParameters y a internal validate. Una vez que se ha llamado a la validación interna, el geoprocesamiento establece automáticamente hasBeenValidated en verdadero para cada parámetro.

hasBeenValidated se utiliza para determinar si el usuario ha cambiado un valor desde la última llamada a updateParameters. Puede utilizar esta información para decidir si desea realizar su propia comprobación del parámetro.


Flujo de control en Python

Una de las características más distintivas de Python es su uso de sangría para marcar bloques de código. Considere la declaración if de nuestro sencillo programa de verificación de contraseñas:

Las líneas print ('Iniciar sesión') y print ('Contraseña incorrecta') son dos separados bloques de código. Estos resultan tener solo una línea de longitud, pero Python le permite escribir bloques de código que constan de cualquier número de declaraciones.

Para indicar un bloque de código en Python, debe sangrar cada línea del bloque por la misma cantidad. Los dos bloques de código en nuestro ejemplo if-statement están sangrados con cuatro espacios, que es una cantidad típica de sangría para Python.

En la mayoría de los otros lenguajes de programación, la sangría se usa solo para ayudar a que el código se vea bonito. Pero en Python, es necesario para indicar a qué bloque de código pertenece una declaración. Por ejemplo, el final print ('¡Todo listo!') es no sangrado, y también no parte del bloque else.

A los programadores familiarizados con otros lenguajes a menudo les irrita la idea de que la sangría importa: a muchos programadores les gusta la libertad de formatear su código como les plazca. Sin embargo, las reglas de sangría de Python son bastante simples y la mayoría de los programadores ya utilizan sangría para hacer que su código sea legible. Python simplemente lleva esta idea un paso más allá y le da significado a la sangría.

  • IDLE está diseñado para sangrar el código automáticamente. Por ejemplo, presionar Retorno después de escribir el : en un encabezado if sangra automáticamente el cursor en la siguiente línea.
  • La cantidad de sangría es importante: un espacio extra o faltante en un bloque de Python podría causar un error o un comportamiento inesperado. Las declaraciones dentro del mismo bloque de código deben tener sangría en el mismo nivel.

If / elif-declaraciones

Una sentencia if / elif es una sentencia if generalizada con más de una condición. Se utiliza para tomar decisiones complejas. Por ejemplo, suponga que una aerolínea tiene las siguientes tarifas de boletos & # 8220child & # 8221: Los niños de 2 años o menos vuelan gratis, los niños mayores de 2 pero menores de 13 pagan una tarifa de niño con descuento y cualquier persona de 13 años o más paga una tarifa regular. tarifa de adulto. El siguiente programa determina cuánto debe pagar un pasajero:

Después de que Python obtiene edad del usuario, ingresa la declaración if / elif y verifica cada condición una tras otra en el orden en que se dan. Así que primero comprueba si edad es menor que 2, y si es así, indica que el vuelo es libre y salta fuera de la condición elif. Si edad no es menor que 2, luego verifica la siguiente condición elif para ver si edad está entre 2 y 13. Si es así, imprime el mensaje apropiado y salta de la declaración if / elif. Si ni la condición if ni la condición elif son Cierto, luego ejecuta el código en el bloque else.

  • elif es la abreviatura de si no, y puede usar tantos bloques elif como necesite.
  • Como de costumbre, cada uno de los bloques de código en una instrucción if / elif debe tener la misma sangría consistentemente. Python no solo requiere esta sangría para que pueda reconocer los bloques de código, sino que la sangría consistente facilita que las personas reconozcan las condiciones if / elif y sus bloques de código correspondientes.
  • Al igual que con una sentencia if normal, el bloque else es opcional. En una declaración if / elif con un otro bloque, exactamente uno de los bloques if / elif se ejecutarán. Si no hay otro bloque, entonces es posible que ninguna de las condiciones sea Cierto, en cuyo caso no se ejecuta ninguno de los bloques if / elif.
  • Una sentencia if / elif debe tener exactamente un bloque if, cero o más bloques elif y cero o uno else-blocks.

Expresiones condicionales

Python tiene un operador lógico más que les gusta a algunos programadores (¡y otros no & # 8217t!). Es esencialmente una notación abreviada para declaraciones if que se pueden usar directamente dentro de expresiones. Considere este código:

La expresión en el lado derecho de = en la segunda línea se llama expresión condicional, y se evalúa como 'puaj' o 'mmm'. Es equivalente a lo siguiente:

Las expresiones condicionales suelen ser más cortas que las correspondientes declaraciones if / else, aunque no son tan flexibles o fáciles de leer. En general, debería utilizarlos cuando simplifiquen su código.


7 respuestas 7

Es difícil ver en tu publicación cuál es el problema, pero un if-else tiene el formato así

Es decir, el resto debe estar en el mismo nivel como el correspondiente if.

A veces, cuando su editor hace la sangría automática por usted y usted edita manualmente, las cosas pueden estropearse, por lo que tendrá que averiguar cómo maneja su editor las sangrías (por ejemplo, ¿siempre usa tabulaciones o espacios? ¿Qué sucede si presiona regresar etc).

También, tenga cuidado de mezclar pestañas y espacios, eso también causará problemas (difícil de detectar ya que ambos son "invisibles")

El else debe estar en el mismo nivel de sangría que el if con el que está acoplado:

Incluso si su editor está sangrando automáticamente por usted, aún debe quitar la sangría para que el código sea sintácticamente correcto.

Obtener la sangría correcta no es realmente un problema de Python, sino más bien un problema con el editor que está utilizando para su código fuente.

La mayoría de los editores que entienden Python agregarán correctamente un nivel de sangría después de dos puntos (como está viendo). Debido a que puede tener tantas declaraciones como desee en ese bloque de código, el editor no tiene forma de saber cuándo & quot; salir & quot; de la siguiente línea para el resto.

Debe decirle al editor que anule la sangría de esa línea presionando la tecla de retroceso o Shift + Tab en la línea antes de comenzar a escribir.

Si inserta la parte else después de escribir el resto del código, asegúrese de que los caracteres que usa para sangrar sean los mismos que para la instrucción if. Si la instrucción if tiene sangría con espacios, use el mismo número de espacios para else. Si la instrucción if tiene una sangría con una o más pestañas, use el mismo número de pestañas para la instrucción else. No mezcle espacios y tabulaciones para la sangría.

No asuma que solo porque las líneas & quot se ven & quot como si tuvieran la misma sangría que son sangrado lo mismo. Se pueden usar espacios y se pueden usar pestañas (o alguna combinación).


3 respuestas 3

Las listas negras simples son la peor forma de parchear una vulnerabilidad. Crearán muchos falsos positivos y cualquier atacante decidido generalmente encontrará una forma de evitarlos.

Los firewalls de aplicaciones web son un buen ejemplo. Las reglas de detección que emplean son mucho más complicadas que su lista negra simplista, sin embargo, no captan todo, y de vez en cuando, surgen omisiones para las cosas que son se supone que debe atrapar.

No veo ninguna posibilidad de escapar de esto.

O eso crees. Simplemente no has mirado lo suficiente.

Esto navega directamente a través de su filtro. Llama a la función exec () que luego imprime 'pwned'.

Ahora puede modificar su lista negra para detectar esto también, pero a alguien más se le ocurrirá otra forma.

El 99% de las veces que veo a alguien usando algo como exec o eval, es completamente innecesario. Si puede evitar el uso de exec, hágase un favor y elimine esta vulnerabilidad que espera ser explotada. Sin embargo, si absolutamente necesitar para usar exec, luego haga lo que @amon sugirió en los comentarios: cree una nueva tubería, bifurque y suelte tantos privilegios en el niño como sea posible, y luego ejecute el código. Utilice la tubería para comunicarse entre los procesos hijo y padre. O en una caja de arena como sugirió Steffen Ullrich.


7 ejemplos de funciones de Python con parámetros, devoluciones y tipos de datos

Las funciones son fragmentos de código en un bloque al que se le asigna un nombre. Toma la entrada, realiza un cálculo o una acción y devuelve la salida.

Funciones mejora la reutilización del código.

En este tutorial, discutiremos los siguientes ejemplos:

  1. Ejemplo de función básica de Python
  2. Funciones integradas de Python
  3. Funciones definidas por el usuario de Python
  4. Parámetros de la función Python
  5. Función Python Número desconocido de parámetros
  6. Valor de retorno de la función Python
  7. Tipo de datos para parámetros y valor de retorno

1. Ejemplo de función básica de Python

La siguiente es una función de Python de ejemplo que toma dos parámetros y calcula la suma y devuelve el valor calculado.

Hay dos amplias categorías de funciones en Python: funciones integradas y funciones definidas por el usuario.

2. Funciones integradas de Python

Hay muchas funciones que vienen junto con Python, cuando está instalado. El usuario no necesita preocuparse por las definiciones de las funciones. print () es una de las funciones integradas más utilizadas en Python.

Algunos ejemplos más de tales funciones son: len (), str (), int (), abs (), sum (), etc.

Todas las funciones integradas compatibles con Python3 están aquí.

3. Funciones definidas por el usuario de Python

Las funciones definidas por el usuario se declaran utilizando la palabra clave def. La palabra clave debe ir seguida del nombre de la función.

En esta función, el monto final se calcula aplicando un interés simple al principal. calculate_si_amount es el nombre de la función. principal, tasa y tiempo son los parámetros y la función devuelve los datos calculados.

No es necesario que una función acepte parámetros y devuelva valores. Puede hacer ambas cosas, una de ellas o ninguna. A continuación se muestra un ejemplo de una función que no toma ningún parámetro pero devuelve datos.

4. Parámetros de la función Python

Una función puede tener parámetros predeterminados.

En esta función, si el usuario no da el segundo parámetro b, asume que es 10, pero es necesario proporcionar el primer parámetro.

5. Número desconocido de parámetros de la función Python

NOTA: Si hay, digamos 4 parámetros en una función y se define un valor predeterminado para el segundo, entonces el tercer y cuarto parámetro también deben tener asignado un valor predeterminado.

Si se desconoce el número de parámetros que debe esperar una función, se agrega * args a la definición de la función como uno de los parámetros. Este parámetro espera una tupla. El asterisco (*) es importante aquí. El nombre args es solo una convención. Se le puede dar cualquier otro nombre.

De manera similar, ** kwargs espera un diccionario como parámetro.

El fragmento de código anterior hace referencia al bucle for. Consulte esto para obtener más detalles: 12 ejemplos de comandos esenciales de Python para bucle

6. Valor de retorno de la función Python

Python permite que la función devuelva múltiples valores.

Aquí se devuelven dos valores. Cuando se llama a esta función, los valores devueltos se almacenan en dos variables, simultáneamente.

NOTA: Si una función no devuelve nada, implícitamente devuelve None.

7. Tipo de datos para parámetros y valor de retorno

La definición de tipos de datos para los parámetros de función y el valor de retorno se puede utilizar para que el usuario conozca las expectativas de las funciones.

La definición de la función indica que necesita un parámetro de tipo int y devolverá dos valores de tipo int y list respectivamente.


El uso de recursos¶

Estas funciones se utilizan para recuperar información sobre el uso de recursos:

Esta función devuelve un objeto que describe los recursos consumidos por el proceso actual o sus hijos, según lo especificado por el OMS parámetro. El OMS El parámetro debe especificarse utilizando una de las constantes RUSAGE_ * que se describen a continuación.

Cada uno de los campos del valor de retorno describe cómo se ha utilizado un recurso del sistema en particular, p. Ej. la cantidad de tiempo que se pasa en ejecución es el modo de usuario o la cantidad de veces que el proceso se cambió de la memoria principal. Algunos valores dependen del tic del reloj interno, p. Ej. la cantidad de memoria que está usando el proceso.

Para compatibilidad con versiones anteriores, el valor de retorno también es accesible como una tupla de 16 elementos.

Los campos ru_utime y ru_stime del valor de retorno son valores de punto flotante que representan la cantidad de tiempo dedicado a la ejecución en modo de usuario y la cantidad de tiempo dedicado a la ejecución en modo de sistema, respectivamente. Los valores restantes son números enteros. Consultar el getrusage (2) página de manual para obtener información detallada sobre estos valores. Aquí se presenta un breve resumen:


Usar bloque de código de función definido con Python en ArcGIS - Geographic Information Systems

Preparándose para la tecnología entrevistas?

Aprende de los mejores
instructores en el campo.


Esta página lo guiará sobre cómo descifrar cualquier entrevista de programación de Python, que incluye:

1. Preguntas de entrevistas de Python del mundo real hechas en empresas como Microsoft, Google, Amazon y cómo responderlas (ahorrando tiempo de preparación de la entrevista).

2. Problemas de práctica de Python que puedes resolver de inmediato.

1. ¿Qué es Python?

Python es un lenguaje de programación de alto nivel, interpretado y de propósito general. Al ser un lenguaje de uso general, se puede utilizar para crear casi cualquier tipo de aplicación con las herramientas / bibliotecas adecuadas. Además, Python admite objetos, módulos, subprocesos, manejo de excepciones y administración automática de memoria que ayudan a modelar problemas del mundo real y crear aplicaciones para resolver estos problemas.

2. ¿Cuáles son los beneficios de usar Python?

Python es un lenguaje de programación de uso general que tiene una sintaxis simple y fácil de aprender que enfatiza la legibilidad y, por lo tanto, reduce el costo de mantenimiento del programa. Además, el lenguaje es capaz de realizar scripts, es completamente de código abierto y admite paquetes de terceros que fomentan la modularidad y la reutilización del código.
Sus estructuras de datos de alto nivel, combinadas con tipado dinámico y enlace dinámico, atraen a una gran comunidad de desarrolladores para el desarrollo e implementación rápidos de aplicaciones.

3. ¿Qué es un lenguaje escrito dinámicamente?

Antes de que entendamos qué es un lenguaje escrito dinámicamente, debemos aprender qué es escribir. Mecanografía se refiere a la verificación de tipos en lenguajes de programación. en un fuertemente tipado lenguaje, como Python, "1" + 2 dará como resultado un error de tipo, ya que estos lenguajes no permiten "tipo-coerción" (conversión implícita de tipos de datos). Por otro lado, un débilmente tipado lenguaje, como Javascript, simplemente generará "12" como resultado.

  • Estático - Los tipos de datos se verifican antes de la ejecución.
  • Dinámico - Los tipos de datos se verifican durante la ejecución.

4. ¿Qué es un idioma interpretado?

Un Interpretado el lenguaje ejecuta sus declaraciones línea por línea. Los lenguajes como Python, Javascript, R, PHP y Ruby son ejemplos principales de lenguajes interpretados. Los programas escritos en un lenguaje interpretado se ejecutan directamente desde el código fuente, sin un paso de compilación intermedio.

5. ¿Qué es PEP 8 y ​​por qué es importante?

PEP significa Propuesta de mejora de Python. Un PEP es un documento de diseño oficial que proporciona información a la comunidad de Python o describe una nueva característica de Python o sus procesos. PEP 8 es especialmente importante ya que documenta las pautas de estilo para el código Python. Aparentemente, contribuir en la comunidad de código abierto de Python requiere que sigas estas pautas de estilo de manera sincera y estricta.

6. ¿Cómo se administra la memoria en Python?

La gestión de la memoria en Python está a cargo del Administrador de memoria de Python. La memoria asignada por el administrador está en forma de un espacio de pila privado dedicado para Python. Todos los objetos de Python se almacenan en este montón y, al ser privados, es inaccesible para el programador. Sin embargo, Python proporciona algunas funciones básicas de la API para trabajar en el espacio de almacenamiento privado.
Además, Python tiene una colección de basura incorporada para reciclar la memoria no utilizada para el espacio de almacenamiento privado.

7. ¿Qué son los espacios de nombres de Python? ¿Por qué se utilizan?

  • Espacio de nombres local incluye nombres locales dentro de una función. el espacio de nombres se crea temporalmente para una llamada de función y se borra cuando la función regresa.
  • Espacio de nombres global incluye nombres de varios paquetes / módulos importados que se están utilizando en el proyecto actual. Este espacio de nombres se crea cuando el paquete se importa en el script y dura hasta la ejecución del script.
  • Espacio de nombres integrado incluye funciones integradas del núcleo de Python y nombres integrados para varios tipos de excepciones.

8. ¿Qué es Scope en Python?

  • A alcance local se refiere a los objetos locales disponibles en la función actual.
  • A alcance global se refiere a los objetos disponibles a través de la ejecución del código desde su inicio.
  • A alcance a nivel de módulo se refiere a los objetos globales del módulo actual accesibles en el programa.
  • Un alcance más externo se refiere a todos los nombres incorporados a los que se puede llamar en el programa. Los objetos de este ámbito se buscan en último lugar para encontrar el nombre al que se hace referencia.

9. ¿Qué es la resolución del alcance en Python?

  • Los módulos de Python, a saber, 'math' y 'cmath', tienen muchas funciones que son comunes a ambos: log10 (), acos (), exp (), etc. Para resolver esta ambigüedad, es necesario prefijarlos con sus respectivos módulo, como math.exp () y cmath.exp ().
  • Considere el código a continuación, un objeto temp se ha inicializado a 10 globalmente y luego a 20 en la llamada a la función. Sin embargo, la llamada a la función no cambió el valor de la temperatura globalmente. Aquí, podemos observar que Python traza una línea clara entre las variables globales y locales tratando ambos espacios de nombres como identidades separadas.

Este comportamiento se puede anular utilizando la palabra clave global dentro de la función, como se muestra en el siguiente ejemplo:

10. ¿Qué son los decoradores en Python?

Decoradores en Python son esencialmente funciones que agregan funcionalidad a una función existente en Python sin cambiar la estructura de la función en sí. Están representados por el @decorator_name en Python y se llaman de forma ascendente. Por ejemplo:

La belleza de los decoradores radica en el hecho de que además de agregar funcionalidad al resultado del método, pueden incluso aceptar argumentos para funciones y puede modificar aún más esos argumentos antes de pasarlos a la función en sí. El función anidada interna, es decir, la función 'envoltorio', juega un papel importante aquí. Se implementa para hacer cumplir encapsulamiento y así, mantenerse oculto al ámbito global.

11. ¿Qué son listas y tuplas? ¿Cuál es la diferencia clave entre los dos?

Liza y Tuplas son ambos tipos de datos de secuencia que puede almacenar una colección de objetos en Python. Los objetos almacenados en ambas secuencias pueden tener diferentes tipos de datos. Las listas se representan con corchetes ['sara', 6, 0.19], mientras que las tuplas se representan con paréntesis ('ansh', 5, 0,97).
Pero, ¿cuál es la diferencia real entre los dos? La diferencia clave entre los dos es que mientras las listas son mutables, tuplas en la otra mano son inmutables objetos. Esto significa que las listas se pueden modificar, agregar o dividir sobre la marcha, pero las tuplas permanecen constantes y no se pueden modificar de ninguna manera. Puede ejecutar el siguiente ejemplo en Python IDLE para confirmar la diferencia:

12. ¿Qué son las comprensiones Dict y List?

Las comprensiones de Python, como los decoradores, son azúcar sintáctica construcciones que ayudan construir alterado y filtrado listas, diccionarios o conjuntos de una lista, diccionario o conjunto determinados. El uso de comprensiones ahorra mucho tiempo y código que podría ser considerablemente más detallado (con más líneas de código). Veamos algunos ejemplos, donde las comprensiones pueden ser realmente beneficiosas:

  • Realización de operaciones matemáticas en toda la lista.
  • Realización de operaciones de filtrado condicional en toda la lista
  • Combinar varias listas en una
    Las comprensiones permiten múltiples iteradores y, por lo tanto, se pueden usar para combinar múltiples listas en una.
  • Acoplamiento de una lista multidimensional
    Se puede aplicar un enfoque similar de iteradores anidados (como el anterior) para aplanar una lista multidimensional o trabajar sobre sus elementos internos.

Nota: Las listas por comprensión tienen el mismo efecto que el método del mapa en otros idiomas. Siguen el notación matemática del constructor de conjuntos en lugar de funciones de mapa y filtro en Python.

13. ¿Cuáles son los tipos de datos integrados comunes en Python?

Hay varios tipos de datos integrados en Python. Aunque Python no requiere que los tipos de datos se definan explícitamente durante las declaraciones de variables, es probable que se produzcan errores de tipo si se descuida el conocimiento de los tipos de datos y su compatibilidad entre sí. Python proporciona las funciones type () e isinstance () para verificar el tipo de estas variables. Estos tipos de datos se pueden agrupar en las siguientes categorías:

  • Ninguno Tipo
    Ninguna palabra clave representa los valores nulos en Python. La operación de igualdad booleana se puede realizar utilizando estos objetos NoneType.
    Nombre de la claseDescripción
    NingunoTipoRepresenta el NULO valores en Python

  • Tipos numéricos
    Hay tres tipos numéricos distintos: enteros, Números de punto flotante, y números complejos. Adicionalmente, booleanos son un subtipo de números enteros.
    Nombre de la claseDescripción
    En tAlmacena literales enteros, incluidos números hexadecimales, octales y binarios como enteros
    flotadorAlmacena literales que contienen valores decimales y / o signo de exponente como números de punto flotante
    complejoAlmacena números complejos en la forma (A + Bj) y tiene atributos: real e imag
    boolAlmacena valor booleano (verdadero o falso)
    Nota: La biblioteca estándar también incluye fracciones para almacenar números racionales y decimal para almacenar números de punto flotante con precisión definida por el usuario.

14. ¿Qué es lambda en Python? ¿Por qué se usa?

  • Asignar funciones lambda a una variable
  • Envolviendo funciones lambda dentro de otra función

15. ¿Qué es pasar en Python?

La palabra clave pass representa una operación nula en Python. Generalmente se usa con el propósito de llenar bloques vacíos de código que pueden ejecutarse durante el tiempo de ejecución pero que aún no se han escrito. Sin el pasar en el siguiente código, podemos encontrar algunos errores durante la ejecución del código.

16. ¿Cómo se copia un objeto en Python?

En Python, la declaración de asignación ( = operador) no copia objetos. En su lugar, crea un vínculo entre el objeto existente y el nombre de la variable de destino. Para crear copias de un objeto en Python, necesitamos usar el Copiar módulo. Además, hay dos formas de crear copias para el objeto dado usando el Copiar módulo -

  • Copia superficial es una copia bit a bit de un objeto. El objeto copiado creado tiene una copia exacta de los valores del objeto original. Si alguno de los valores son referencias a otros objetos, solo se copian las direcciones de referencia para el mismo.
  • Copia profunda copia todos los valores de forma recursiva desde el origen al objeto de destino, es decir, incluso duplica los objetos a los que hace referencia el objeto de origen.

17. ¿Cuál es la diferencia entre xrange y range en Python?

xrange () y abarcar() son bastante similares en términos de funcionalidad. Ambos generan una secuencia de enteros, con la única diferencia de que range () devuelve un Lista de Python, mientras que xrange () devuelve un objeto xrange.

Entonces, ¿cómo hace eso la diferencia? Seguro que sí, porque a diferencia de range (), xrange () no genera una lista estática, crea el valor sobre la marcha. Esta técnica se usa comúnmente con un tipo de objeto generadores y ha sido denominado como "flexible".

Flexible es crucial en aplicaciones donde la memoria es una limitación. Crear una lista estática como en range () puede conducir a un error de memoria en tales condiciones, mientras que xrange () puede manejarlo de manera óptima usando solo la memoria suficiente para el generador (significativamente menos en comparación).

Nota: xrange ha sido obsoleto a partir de Python 3.x. Ahora range hace exactamente lo mismo que xrange solía hacer en Python 2.x, ya que era mucho mejor usar xrange () que la función range () original en Python 2.x.

18. ¿Qué son los módulos y paquetes en Python?

Los paquetes de Python y los módulos de Python son dos mecanismos que permiten programación modular en Python. Modularizar ahs varias ventajas -

  • Sencillez: Trabajar en un solo módulo le ayuda a concentrarse en una parte relativamente pequeña del problema en cuestión. Esto hace que el desarrollo sea más fácil y menos propenso a errores.
  • Mantenibilidad: Los módulos están diseñados para imponer límites lógicos entre diferentes dominios de problemas. Si están escritos de una manera que reduce la interdependencia, es menos probable que las modificaciones en un módulo afecten a otras partes del programa.
  • Reutilización: Las funciones definidas en un módulo se pueden reutilizar fácilmente en otras partes de la aplicación.
  • Alcance: Los módulos suelen definir una espacio de nombres, lo que ayuda a evitar confusiones entre identificadores de otras partes del programa.

Módulos, en general, son simplemente archivos Python con extensión .py y pueden tener un conjunto de funciones, clases o variables definidas e implementadas. Se pueden importar e inicializar una vez utilizando la declaración de importación. Si se necesita una funcionalidad parcial, importe las clases o funciones necesarias utilizando from foo import bar.

Packages allow for hierarchial structuring of the module namespace using dot notation. As, modules help avoid clashes between global variable names, in a similary manner, paquetes help avoid clashes between module names.
Creating a package is easy since it makes use of the system's inherent file structure. So just stuff the modules into a folder and there you have it, the folder name as the package name. Importing a module or its contents from this package requires the package name as prefix to the module name joined by a dot.

Nota: You can technically import the package as well, but alas, it doesn't import the modules within the package to the local namespace, thus, it is practically useless.

19. What are global, protected and private attributes in Python?

  • Global variables are public variables that are defined in the global scope. To use the variable in the global scope inside a function, we use the global keyword.
  • Protected attributes are attributes defined with a underscore prefixed to their identifier eg. _sara. They can still be accessed and modified from outside the class they are defined in but a responsible developer should refrain from doing so.
  • Privado attributes are attributes with double underscore prefixed to their identifier eg. __ansh. They cannot be accessed or modified from the outside directly and will result in an AttributeError if such an attempt is made.

20. What is self in Python?

Uno mismo is a keyword in Python used to define an instance or an object of a class. In Python, it is explicity used as the first paramter, unlike in Java where it is optional. It helps in disinguishing between the methods and attributes of a class from its local variables.

21. What is __init__?

__init__ is a contructor method in Python and is automatically called to allocate memory when a new object/instance is created. All classes have a __en eso__ method associated with them. It helps in distinguishing methods and attributes of a class from local variables.

22. What is break, continue and pass in Python?

Romper The break statement terminates the loop immediately
and the control flows to the statement after the body of the loop.
Continuar The continue statement terminates the current iteration of the statement,
skips the rest of the code in the current iteration and the control flows to the next iteration of the loop.
Pasar As explained above, pass keyword in Python is generally used to fill-up empty blocks
and is similar to an empty statement represented by a semi-colon in languages such as Java, C++, Javascript etc.

23. What is pickling and unpickling?

Python library offers a feature - serialization out of the box. Serializing a object refers to transforming it into a format that can be stored, so as to be able to deserialize it later on, to obtain the original object. Here, the pepinillo module comes into play.

Decapado
Pickling is the name of the serialization process in Python. Any object in Python can be serialized into a byte stream and dumped as a file in the memory. The process of pickling is compact but pickle objects can be compressed further. Moreover, pickle keeps track of the objects it has serialized and the serialization is portable across versions.
The function used for the above process is pickle.dump() .

Unpickling
Unpickling is the complete inverse of pickling. It deserializes the byte stream to recreate the objects stored in the file, and loads the object to memory.
The function used for the above process is pickle.load() .

Nota: Python has another, more primitive, serialization module called marshall, which exists primarily to support .pyc files in Python and differs significantly from pickle.

24. What are generators in Python?

Generators are functions that return an iterable collection of items, one at a time, in a set manner. Generators, in general, are used to create iterators with a different approach. They employ the use of yield keyword rather than return to return a generator object.
Let's try and build a generator for fibonacci numbers -

25. What is PYTHONPATH in Python?

PYTHONPATH is an environment variable which you can set to add additional directories where Python will look for modules and packages. This is especially useful in maintaining Python libraries that you do not wish to install in the global default location.


You should consider adding a main function to your project. This is usually done through the introduction of:

This allows for me to import your project and not have it automatically execute the game function at the bottom. Increasing re-usability.

1 For instance, It may be the project defaults to "" , but you need to print out " Hi " with the quotes, so print('" Hi "') may be chosen.

In addition to another answer I will add these places to improve (I will not repeat all things from that answer, my answer is just an addition):

1. Code inconsistency

You have several places in your code where your code is inconsistent

Both functions are checking collisions but one returns integer (0/1) and another - boolean (True/False).

For head you convert X*block_size to int (it is unnecessary anyway). For body you don't do it.

I recommend you to always check your code for possible inconsistency.

2. Names inconsistency

I moved it to an another point because it is not about how your code works - it is about how another programmers will read your code.

You use three different namings for direction entity:

Es lejos better to use consistent variable names. If you are using different direction variables, get them names with only one word for directions. Here is the example:

3. Small code improvements

Sometimes you look at your code and think: "Hmmm, it is working but looks not good". Often in these cases you can slightly reorganize your code to make it a bit better :)

This line of code is correct too but it is hard to read:

But it will be far better to read if you will change it to:

or even this (sometimes I use it for really long if's):

You never read size , and Python Lists already know their own length in case you did need it.

Simplemente está duplicando la funcionalidad que List ya le brinda al mantener manualmente el tamaño sincronizado con la longitud de la lista.

Separate game logic from screen rendering details

You keep snake coordinates scaled by pixels. This seems to complicate your code everywhere with block_size instead of 1 I suspect it would be easier to keep snake coordinates in units of blocks, and only scale to pixels for drawing purposes.

p.ej. then your outer-wall check could be something like s.head[0] >= bg_width instead of
s.head[0] > bg_width-block_size .

1 is special for integers because it's the difference between > and >=

I like your add_to_tail idea of putting multiple snake segments in the same place initially, so move on future turns actually makes the snake longer on screen. That high-level design might be worthy of a comment.

The other option would be a "future growth" counter that you check (and decrement) every move to decide whether to remove the last tail block. (That's what I was expecting because I hadn't thought of your idea). Your way is more efficient and will still work if you want food to cause multiple segments of growth. You can still do them all when the food is eaten.

Keeping a separate head : I'm not sure this is helping you. Functions that want to look at the first segment can do head = snake_.body[0] .

I don't understand why move needs to do this:

when it looks to me like inserting the modified head as a new first element will already create that condition. So either this is redundant (and confusing), or else it's extra work that you wouldn't need to do if you didn't redundantly keep the head coordinates in 2 places. (Front of the List, and in its own object.)

This should be an enum or integer, not a string. String compares are fairly cheap, but not as cheap as integers. There's no reason that a direction needs to be an arbitrary string when it can take only 1 of 4 possible values. A string isn't making your code any easier to read.

You probably still want the if/elif chain to turn a direction into an x or y offset, but another option for an integer would be a lookup table of [-1, 0] , [1, 0] etc. so you look up the x and y offsets for the given direction and just add them to the head's x and y coordinates without any conditionals.

Or direction could actually ser an XY vector, removing the lookup step.

But that might complicate change_dir . Or give you a different implementation: to check for reversing direction: if new_dir + old_dir == [0,0] then you tried to double back. Otherwise you puede set dir = new_dir .

I like your design for having the keyboard-input just call change_dir to check the game-logic of that input. That works very cleanly, and would still work if left was defined as [-1, 0] instead of "LEFT" .


Ver el vídeo: ArcGIS Lecture 1 Introduction