Las vacaciones pueden hacerte competente en Ph en segundos
Descubra los problemas que lo convertirán en un maestro de Python
Descubra los problemas que lo convertirán en un maestro de Python
1 ¿Por qué utilizar declaraciones de agrupación con sangría? ?
Guido van Rossum cree que usar sangría para agrupar declaraciones es muy elegante y puede mejorar enormemente
la claridad de los programas Python comunes. A la mayoría de las personas les gustará esta función después de aprenderla por un tiempo.
Debido a que no hay corchetes de apertura/cierre, no hay diferencia entre la agrupación percibida por el analizador y los lectores humanos
Los programadores de C ocasionalmente encuentran fragmentos de código como este:
Solo se ejecuta la instrucción x++ si la condición es verdadera, pero la sangría le haría pensar que ese no es el caso
. Incluso los programadores experimentados en C a veces lo miran fijamente durante mucho tiempo, preguntándose por qué x>y está disminuyendo.
Dado que no hay corchetes de apertura/cierre, Python es menos propenso a codificar impulsos
. En C, los paréntesis se pueden colocar en muchos lugares diferentes. Si estás acostumbrado a leer
y escribir código usando un estilo, te sentirás al menos un poco incómodo cuando leas (o te pidan que escribas)
otro estilo.
Muchos estilos de codificación colocan corchetes de apertura y cierre en líneas separadas. Esto hace que el programa sea bastante largo, desperdicia valioso espacio en la pantalla y agrega completamente
Comprenda esto y se convertirá en un maestro de Python en poco tiempo
. Idealmente, la función debería caber en una pantalla (por ejemplo, 20 - 30 líneas
). 20 líneas de Python pueden hacer más trabajo que 20 líneas de C. Esto no se debe solo a la falta de corchetes de apertura/cierre (las declaraciones faltantes y los tipos de datos avanzados también son un factor), sino que la sangría basada en sintaxis definitivamente ayudaría.
2. ¿Por qué las operaciones aritméticas simples producen resultados extraños?
Ver siguiente pregunta.
3. ¿Por qué las operaciones de punto flotante son inexactas?
Los usuarios suelen sorprenderse con resultados como este:
y piensan que es un error de Python.
Este no es el caso. Esto tiene menos que ver con Python y más con cómo la plataforma subyacente maneja los números de punto flotante.
El tipo flotante en CPython utiliza el tipo doble de C para almacenamiento.
El valor de un objeto flotante es un binario almacenado con precisión fija (normalmente 53 bits)
Número de coma flotante, dado que Python se ejecuta en lenguaje C, depende del procesador p> p>
Implementación de hardware para realizar operaciones en punto flotante. Esto significa que, en lo que respecta a las operaciones de punto flotante, Python
se comporta de manera similar a muchos lenguajes populares, incluidos C y Java.
Muchos números que se pueden representar fácilmente en decimal no se pueden representar en coma flotante binaria.
Por ejemplo, después de escribir la siguiente declaración:
Resuélvelo y serás un maestro de Pytho en poco tiempo
>>>x=1.2
p>El valor almacenado para x es una aproximación (muy cercana) del valor decimal 1,2, pero no exactamente igual a él
. En una máquina típica, el valor real almacenado es:
1.8811601198116911901160119911891190118011001180110011
(binario)
El valor decimal correspondiente es:
1.1999999999999555910790149 9373830547332763671875
(Decimal)
La precisión típica de 53 bits de los números de coma flotante de Python proporciona entre 15 y 16 dígitos de precisión decimal
-4.
¿Por qué las cadenas de Python son inmutables?
Tiene varias ventajas.
Uno es el rendimiento: saber que las cadenas son inmutables significa que podemos asignarles espacio cuando las creamos
y los requisitos de almacenamiento son fijos. Ésta es una de las razones de la diferencia entre tuplas y listas
.
Otra ventaja es que las cadenas en Python son tan "básicas" como los números
. En Python, no existe ninguna operación que cambie el valor 8 a otro valor, ni ninguna operación que cambie la cadena "8" a otro valor.
5. ¿Por qué es necesario utilizar "self" explícitamente en las definiciones y llamadas de métodos?
Esta idea está tomada del lenguaje Modula-3. Resulta muy útil por varios motivos.
Comprender esto te convertirá en un maestro de Pytho
En primer lugar, será más obvio usar métodos o propiedades de instancia en lugar de variables locales
Incluso si no conoce la definición de clase, leer self.x o self.meth() dejará claro que se utiliza una variable o método de instancia. En C++ esto puede ser determinado por
falta de declaraciones de variables locales (suponiendo que las variables globales sean pocas o fácilmente identificables)
pero en Python no hay declaraciones de variables locales, por lo que debes busque la definición de clase
para determinar. Algunos estándares de codificación de C++ y Java requieren que las propiedades de instancia tengan el prefijo m_
, por lo que esta claridad sigue siendo útil en estos lenguajes.
En segundo lugar, esto significa que si desea hacer referencia explícita o llamar a un método en una clase específica, no necesita utilizar
sintaxis especial. En C++, si desea anular un método en una clase base en una clase derivada, debe usar el operador ::, mientras que en Python puede escribir clase base .methodname(self,). Esto es útil para los métodos in it(),
especialmente cuando un método de clase derivada quiere extender un método de clase base con el mismo nombre, y el método de clase base debe ser llamado de alguna manera.
Finalmente, resuelve el problema sintáctico de la asignación de variables: para utilizar variables locales en Python
, asigne el valor en el cuerpo de la función (y no explícitamente
declararlo (para variables globales) (¡por definición!) debe decirle de alguna manera al intérprete que la asignación es
Asignar una variable de instancia en lugar de una variable local. Para mejorar la eficiencia, es mejor. pasa la sintaxis
¡Hagámoslo! Python no tiene declaraciones y sería una pena que se introdujeran sólo para este propósito.
El uso explícito de self.var resuelve muy bien este problema. Del mismo modo, para usar
Comprenda esto y se convertirá en un maestro de Pytho en segundos
Las variables de instancia deben escribirse self var significa internamente un nombre no calificado para el método
Las referencias no tienen que buscar en el directorio de la instancia. En otras palabras, las variables locales y las variables de instancia viven en dos espacios de nombres diferentes, y debes decirle a Python qué espacio de nombres usar.
6. ¿Por qué no puedo asignar un valor en una expresión?
La razón por la que no se permite la asignación en expresiones de Python es que en otros lenguajes estos errores
comunes
y difíciles de encontrar son causados por este estructura El:
El error es un simple error tipográfico: x=0, que asigna a la variable x un valor de 0, y la comparación x==
0 es, por supuesto, esperada.
Existen muchas alternativas.
Sin embargo, el uso de sintaxis o palabras clave arbitrarias o implícitas no cumple con los criterios simples de una propuesta de cambio de idioma
: debe ser intuitivo para los humanos que aún no entienden el concepto
p>
p>
Los lectores proporcionan el significado correcto.
La mejor manera de hacer esto es usar un iterador, que se puede usar para recorrer objetos usando una declaración for
.
Por ejemplo, los objetos de archivo admiten el protocolo iterador, por lo que simplemente puedes escribir:
Estas preguntas te convertirán en un maestro de Python en poco tiempo
7 Por qué se usa Python en ciertas funciones
p>
¿Métodos (como list.index()) pero no utilizados en otras funciones (como list.len(List)) Función
?
(a) Para algunas operaciones, la notación de prefijo es más fácil de leer que la notación de sufijo: las operaciones de prefijo (¡y de infijo!) tienen una larga tradición en matemáticas, al igual que los símbolos que ayudan a las matemáticas
Los atletas piensan en los problemas de manera intuitiva. Compare con qué facilidad podemos reescribir una fórmula como x*(a+b) como Qué torpe".
(b) Al leer el código que dice len(X), sabemos que está solicitando el
longitud de algo. Esto nos dice dos cosas: el resultado es un número entero y el argumento es una especie de contenedor.
Por el contrario, al leer x.len(), debemos Ya sé que x es algún tipo de contenedor que implementa la interfaz, o se hereda de una clase con len() estándar cuando no se implementa ningún mapeo
La clase proyectada tiene un método get() o key(), o la clase que no es un archivo tiene un método write()
p>, ocasionalmente nos confundimos
8 ¿Por qué join) es un método de cadena en lugar de una lista o tupla? ¿método
join() es un método de cadena porque cuando lo usas, le dices a la cadena delimitadora
que itere a través de la secuencia de cadenas y se inserte entre elementos adyacentes
Los parámetros del método pueden ser cualquier objeto que siga las reglas de secuencia, incluida cualquier clase nueva que defina. Hay métodos similares para objetos de bytes y de matrices de bytes.
Lo descubrirás pronto. conviértete en un maestro de Pytho
9. ¿Por qué las expresiones lambda no contienen declaraciones?
Las expresiones lambda de Python no pueden contener declaraciones debido a la sintaxis de Python
El marco no puede manejar declaraciones. anidado dentro de expresiones Sin embargo, en Python esto no es un problema grave con las formas lambda que agregan funcionalidad en otros lenguajes. De manera diferente, las lambdas de Python son solo una notación abreviada si eres demasiado vago para definir la función. La función ya es el primer tipo de objeto en Python y se puede declarar localmente.
Así que el único beneficio de usar una lambda en lugar de una función definida localmente es que no es necesario
. para crear un nombre para la función: es solo una variable local asignada al objeto de la función (como en
¡El tipo de objeto producido por la expresión lambda es exactamente el mismo)!
10. ¿No se pueden simular subprocesos en el intérprete en lugar de confiar en sistemas operativos específicos?
¿Están implementados los subprocesos?
Respuesta 1: Desafortunadamente, el intérprete enviará al menos un marco de pila C. para cada marco de pila de Python Además, las extensiones pueden volver a llamar a Python en cualquier momento. Por lo tanto, una implementación completa de subprocesos requiere el soporte de subprocesos de C.
Respuesta 2: Afortunadamente, Stackless Python rediseña completamente el
bucle del intérprete para evitar la pila de C.
.