Red de conocimiento informático - Problemas con los teléfonos móviles - Notas de análisis del código fuente de Python

Notas de análisis del código fuente de Python

Ha pasado más de medio mes desde que comencé a leer Python y he visto la programación central de Python y me sumergí en ella.

Python, dos libros. Es decir, leer dos libros en medio mes significa que todo el mundo sabe cuánto ha tragado. Esto también se debe a que por el momento no necesito usarlo para desarrollo a gran escala, principalmente para pruebas con programas pequeños habituales. Por eso

Mi estrategia es navegarlo en su totalidad y comprobarlo cuando lo uso. En otras palabras, la primera edición de esta programación básica es demasiado antigua y siempre habla de cosas anteriores a la 2.2. La versión electrónica que leí no estaba bien traducida y era muy oscura. Después de leer esto, todavía hay

En la niebla, vi en Internet que DIP es bueno y Woodpecker tiene documentos electrónicos gratuitos, así que eché un vistazo a esto. ¿Qué puedo decir? Mejor que la programación básica, pero no adecuada para principiantes que la miran por primera vez. La razón por la que creo que es bueno es que algunos conceptos aún son vagos después de analizar la programación central. Después de leer este libro, entiendo mucho. Si eres principiante y lees este libro, no lo entenderás.

Las siguientes son algunas diferencias obvias entre C y Python en el proceso de aprendizaje y lectura de materiales, tanto en dirección general como en detalles. Definitivamente aún no está terminado, como la dinámica.

Función, lambda, soy demasiado vago para escribirla. De hecho, al ser dos idiomas completamente diferentes, las siguientes diferencias son sólo la punta del iceberg. Es solo una sugerencia, al menos debes tener la misma investigación que yo.

Esto es útil para amigos interesados ​​que estén considerando aprender otro idioma. Este artículo también es una nota de estudio para DIP. Por cierto, si algún amigo lo sabe, puede ayudar a recomendar Python, que tiene una gran capacidad práctica.

Los libros de texto y el idioma no se pueden aprender bien sin muchos ejercicios y gestos.

Propósito del aprendizaje

Mi futura dirección de investigación está integrada. Obviamente, C es mi idioma principal. No soy un amante de los idiomas. Solía ​​​​pensar que las personas que investigan son mejores que las personas que realizan aplicaciones y conocen más de un idioma.

Dominar un idioma. La razón por la que fui a ver Python es principalmente porque Python es más propicio para desarrollar rápidamente algunos programas, y también porque ahora me doy cuenta de que la investigación y la aplicación no se pueden separar. Personalmente creo que es necesario

Si quieres afianzarte en la competencia de ingeniería informática, debes comprender el lenguaje C. Debido a que realmente desea realizar programación de alto rendimiento,

Es imposible dejar de lado la arquitectura de la máquina y dejar que la máquina virtual Python (o la máquina virtual Java, etc.) lo ayude a manejar todas las capas inferiores. Cada vez hay más núcleos de CPU, un cuello de botella cada vez más aterrador en el rendimiento de la memoria, que no importa a los desarrolladores de nivel superior, pero es opaco para los desarrolladores de alto rendimiento. Muchas aplicaciones todavía las controla usted mismo.

Válido. En estos casos, Asamblea y C siguen siendo irreemplazables. Pero no basta con saber C. Dominar un lenguaje orientado a objetos, un lenguaje de nivel relativamente superior, no sólo es bueno para el desarrollo personal futuro, sino también para sus propias habilidades.

El conocimiento técnico es útil.

Si quieres preguntar quién es más importante para mí, creo que C es más importante. C tiene una curva de aprendizaje pronunciada y parece fácil. De hecho, hay trampas por todas partes. Parece un programa relativamente simple e ineficiente, y no es suficiente aprender 1 en 2 meses.

Se puede hacer. En cuanto a la profundidad y dificultad de la optimización, las habilidades necesarias se calculan anualmente. Pero una vez que siente las bases del lenguaje C, su comprensión de las computadoras y otros lenguajes será de gran beneficio. Por ejemplo,

Si tienes conocimientos de C, puedes decir que puedes escribir algunos programas cortos después de aprender Python por un día. La optimización posterior no es gran cosa para el algoritmo, solo intercambia declaraciones muy básicas. Por supuesto, esto no quiere decir que Python no sea bueno. De hecho, para aplicaciones de nivel superior, Python no es un nivel más conveniente que C.

Muchas personas piensan que, dado que conocen C, naturalmente necesitan dominar aún más C++. Sin embargo, C++ no es un superconjunto de C. No me gusta la complejidad y la enormidad de C++, así que decidí hacerlo. Eche un vistazo a Python. Realmente me gusta la elegancia y velocidad de Python.

Tipo de lenguaje

A diferencia de C, Python es un lenguaje de tipado dinámico y un lenguaje fuertemente tipado.

¿Cómo entender esta clasificación? Probablemente se pueda clasificar de la siguiente manera:

Lenguaje de tipo estático

Un lenguaje en el que el tipo de datos se determina durante la compilación. La mayoría de los lenguajes de tipo estático garantizan esto al requerir que el tipo de datos de la variable se declare antes de usarla. Java y c son lenguajes de tipado estático.

Lenguaje escrito dinámicamente

Un lenguaje en el que los tipos de datos se determinan en tiempo de ejecución, a diferencia del tipado estático. Python se escribe dinámicamente porque determina el tipo de una variable cuando se la asigna por primera vez.

Lenguaje fuertemente tipado

Un lenguaje que siempre impone definiciones de tipo. Java y Python imponen definiciones de tipos. Tiene un número entero que no puede tratarse como una cadena a menos que se convierta explícitamente.

Lenguaje débilmente tipado

Un lenguaje cuyos tipos se pueden ignorar, a diferencia del lenguaje fuertemente tipado. VBScript tiene tipos débiles. En VBScript, puede concatenar la cadena '12' con el número entero 3, lo que da como resultado la cadena '123', que luego puede tratar como el número entero 123, todo sin ninguna conversión explícita.

Mecanismo de objetos

Cómo entender esta "determinación dinámica de tipos de variables" comienza con el mecanismo de objetos de Python. Los objetos (en lo sucesivo denominados objetos) son el enfoque de Python para los datos.

Resumen, todos los datos en Python están representados por objetos o relaciones entre objetos. Las funciones son objetos, las cadenas son objetos y todo es un concepto de objeto. Cada objeto tiene tres propiedades:

Entidad, tipo y valor. Comprender una entidad es un paso importante para comprender un objeto. Una vez que se crea una entidad, nunca se puede cambiar ni destruir explícitamente. Además, en general, determina los operadores soportados por el objeto.

El tipo de fórmula (tipo, incluidos números, cadenas, tuplas, etc.) no cambiará, solo su valor. Esta entidad equivale a

como una dirección en la memoria y es esencial si quieres encontrar un punto específico. Los tipos y valores son solo la representación externa de entidades. Luego, Python proporciona algunas interfaces para que los usuarios interactúen con objetos, como la función id () utilizada para obtener entidades de objetos.

Representación plástica (en realidad, la dirección aquí), la función type() obtiene su tipo.

Este mecanismo de objeto no está disponible en C y se refleja principalmente en los siguientes puntos:

1 Acabo de mencionar que C es un lenguaje de tipo estático, podemos definir int a, carbonizarse.

b etc., pero debe especificarse en el código fuente de antemano. Por ejemplo, podemos especificar directamente a = en cualquier lugar de Python.

"lk", de esta manera, el tipo de A es cadena, que se determina durante la asignación y no necesitamos escribirlo claramente en el código. En c, debemos especificar claramente char *a =

"lk", es decir, especificar manualmente el tipo de A por adelantado.

Porque no existe el concepto de objetos en C, sólo "representación de datos". Por ejemplo, si hay dos variables int A y B y queremos comparar sus tamaños, podemos usar A = =

B para juzgar, pero si hay dos variables de cadena A y B, debemos Utilice strcmp para comparar, porque en este momento A y B son esencialmente punteros a cadenas. Si usamos = = directamente, la comparación es en realidad el valor almacenado en el puntero: la dirección.

En Java, podemos determinar si dos variables de cadena apuntan a la misma ubicación de memoria física usando str1 == str2. Esta es la llamada "identificación de objeto". Para comparar dos valores de cadena en Java, se debe utilizar str1.equals(str2).

Entonces en Python, lo que se diferencia de los dos primeros es que debido a la introducción de objetos, podemos usar el operador "is" para comparar las entidades de dos objetos, lo cual no tiene nada que ver con la tipo del objeto específico.

Por ejemplo, si su objeto es una tupla, una cadena o incluso una clase, puede usar "es" para comparar, que es esencialmente una comparación de "identidad de objeto", relativa a Java.

== es similar, similar a los punteros en c. También hay una comparación == en Python, que es una comparación de valores.

Tres

Debido a la introducción del mecanismo de objetos, el uso de Python es muy flexible. Por ejemplo, podemos utilizar la introspección para ver otros módulos y funciones en la memoria en forma de objetos, obtener su información y ejecutarlos.

Funcionamiento. De esta manera, puede definir funciones sin nombres, llamar funciones fuera del orden en que están declaradas o incluso hacer referencia a funciones cuyos nombres no se conocen de antemano. Estas operaciones son impensables en C.

Otro detalle interesante es que los tipos tienen varios efectos en el comportamiento del objeto, como a = 1; b =

En la declaración 1, lo que se activa en Python pueden ser todos A y B. apunta a un objeto con un valor de 1, o puede apuntar a dos objetos con un valor de 1 respectivamente. Otro ejemplo es esta declaración, c = []; d

= [], entonces cyd deben apuntar a listas vacías diferentes recién creadas. Sin fin, si es "c = d =

[]" ¿qué pasa con esta oración? En este momento, cyd apuntan nuevamente al mismo objeto de lista. Estas diferencias no existen en el lenguaje C.

Finalmente, hablemos de por qué Python es lento. La razón principal son las llamadas a funciones.

Los gastos generales son relativamente grandes. Como ahora todo es un objeto, también resulta caro construirlo y destruirlo. Incluso 1+1 es una función.

Llame, como '12'+'45', cree un tercer objeto de cadena y luego llame a la cadena.

obj's __add. Como puedes imaginar, ¿cómo se puede aumentar la velocidad?

Listas y matrices

Siempre es interesante analizar listas en Python y matrices en C. Creo que algunos amigos pueden ser como yo Cuando aprendieron por primera vez, consideraban las listas como. matrices Ven a aprender. Inicialmente, las diferencias cualitativas entre listas y matrices se centraron principalmente en dos puntos. Primero, las listas pueden contener muchos tipos de datos diferentes, por ejemplo

["this", 1, "is", "a", "array"]

Esta lista, si En C, en realidad es una matriz de cadenas, equivalente a dos dimensiones.

En segundo lugar, la lista tiene muchos métodos y es en sí misma un objeto. A diferencia de las matrices simples en C, hay muchas operaciones en la Lista porque hay métodos y operadores sobrecargados. Esto también trae algunos problemas, como el siguiente ejemplo:

Utilice la siguiente declaración para generar una lista multidimensional con nosotros.

a =[[Ninguno] * 2] * 3

Por lo tanto, el valor de será

[[Ninguno, Ninguno], [Ninguno, Ninguno ] , [Ninguno, Ninguno]]

A primera vista, se ve bien, una lista de matriz bidimensional típica. Bien, ahora queremos modificar el valor del primer Ninguno y usar la declaración.

A[0][0] = 5

Ahora veamos el valor de a:

[[5, Ninguno], [5, Ninguno] ],[5,Ninguno]]

¿Encontraste el problema? Esto se debe a que cuando usas * para copiar, simplemente creas una referencia al objeto en lugar de crearlo realmente. *3 crea una lista que contiene tres referencias, todas apuntando a la misma lista de longitud 2. Los cambios en una fila se mostrarán en todas las filas, lo que ciertamente no es lo que desea. La solución, por supuesto, es que lo creemos así.

a =[Ninguno]*3

Para I en el rango (3):

a[I]=[Ninguno] * 2

Esto creará una lista de longitud 2 de tres longitudes diferentes.

Por eso siempre se ha enfatizado que cuanto más complejo es algo, más flexible es y más fácil es cometer errores.

Optimización de código

C es un lenguaje muy simple. Cuando pensamos en optimización, generalmente pensamos de manera simple, como la menor cantidad posible de llamadas a nivel de sistema (mecanismo de almacenamiento en búfer), eliminar ineficiencias de bucle y referencias innecesarias al sistema, etc.

De hecho, se basa principalmente en detalles del sistema y del hardware. Python es completamente diferente.

Por supuesto, las formas de optimización mencionadas anteriormente siguen siendo prácticas para Python, pero debido a que las formas gramaticales de Python varían ampliamente y hay varias bibliotecas y módulos, hay muchas cosas que vale la pena señalar sobre el lenguaje en sí. Pongamos algunos ejemplos.

Por ejemplo, tenemos una lista L1 y queremos construir una nueva lista L2 que incluya los primeros cuatro elementos de L1. Según la idea más sencilla, el código debería ser

L2 = []

Para I en el rango [3]:

L2.append(L1[ i ])

Una versión más optimizada y elegante es

L2 = L1[:3]

Para otro ejemplo, si S1...S7 es un Cadena de caracteres grandes (10K+), luego Unirse ([S1, S2, S3, S4, S5, S6, S7]) será menor que.

S1+s2+s3+s4+s5+s6+s7 es mucho más rápido porque este último calculará muchas subexpresiones, mientras que join() completa todas las copias en un solo proceso. Además, para operaciones de cadena,

use el método reemplazar() en objetos de cadena. Las expresiones regulares sólo se utilizan cuando no existe un patrón de cadena fijo.

Entonces, partiendo de la optimización como criterio, si C es breve y conciso, Python es amplio y profundo.

Incluir e importar

Incluir en lenguaje C es muy simple porque la forma es simple y el significado es claro. Utilice include cuando necesite utilizar recursos como funciones externas. Y hay algo similar en Python.

El mecanismo es importante. A primera vista, estos dos tipos parecen bastante similares. ¿No es esto lo que usamos para indicar cuándo queremos usar un recurso externo (más comúnmente una función o módulo (Python))? De hecho, no existe

Sin embargo, la diferencia esencial entre los dos mecanismos de procesamiento es que incluir en C se usa para decirle al preprocesador que el contenido del archivo especificado por este incluir ya aparece en mi fuente local. archivo. Pero

Importar, en lugar de simplemente insertar el siguiente contenido directamente en el local, es más flexible. De hecho, Python es más flexible que C en casi todos los mecanismos similares. Esto no tiene nada que ver con c.

No, C es conciso. De hecho prefiero c.

Cuéntame brevemente sobre esta flexibilidad. Hay tres formas de importación en Python, import x, from import x *(or a, b, c...),

X = __import__('x '). Se usa comúnmente porque es más conveniente, a diferencia del primer método donde siempre se usa X.module para llamar al módulo. Desde X

Importar *Solo importe aquellos módulos públicos (generalmente no nombrados con _ _). También puede especificar A, B, C para importar.

¿Cuándo y de qué forma? Cabe decir que en la mayoría de la documentación del módulo se le indicará claramente qué formulario debe utilizarse. Si necesita utilizar muchos objetos, importe desde Hacerlo ofuscará el espacio de nombres del importador. Muchas personas incluso interesadas en módulos diseñados específicamente para este patrón (incluidos Tkinter,

Threading y matplot) no utilizan este enfoque. Y si solo necesita una clase de objeto a, utilice desde X importar a en lugar de importar.

X.a es mejor, porque cuando llames a la función de A en el futuro, puedes usar a.function() sin agregar x.

¿Qué pasa si ni siquiera conoces el módulo que deseas importar? Tenga en cuenta que las ventajas de Python salen a la luz en este momento y podemos usarlo.

__import__(module) para llamar al módulo, donde el módulo es una cadena, para que pueda decidir en tiempo de ejecución a qué módulo llamar.

rise

Un ejemplo:

def classFromModule(módulo, nombre):

mod = __import__(módulo)

return getattr (mod , Nombre)

Aquí se define una función classFromModule y puede llamarla en cualquier momento en su código.

o = classFromModule(ModuleOfTheClass, NameOfTheAttribute)()

Siempre que pases el módulo ModuleOfTheClass que deseas importar y el NameOfTheAttribute dentro (por supuesto, pueden ser datos o métodos). ), puedes llamarlo . Esta cadena de nombre se determina en función de las condiciones operativas actuales y no es necesario especificarla de antemano.

Por cierto, el orden de importación en Python también se especifica de forma predeterminada, similar a incluir en C, porque generalmente incluimos los archivos del sistema primero y luego.

Incluye tus propios archivos de encabezado (sí

1. Módulos de biblioteca estándar, como sys, os, getopt, etc.

2. Módulos de terceros

3. Módulos implementados localmente

Variables globales

Cuando digo variables globales aquí, no significa que Python y C tengan conceptos diferentes de variables globales; El concepto es el mismo, pero el mecanismo de uso es ligeramente diferente. Por ejemplo:

–module py–

globalvar = 1

Definir función(). :

p>

Imprimir variables globales

#Esto hace que algunos globales sean de solo lectura,

#Cualquier cosa escrita en un global

# creará una nueva variable local

Defina la función 2():

globalvar

globalvar = 2

#Esto le permite manipular el global

p>

#Variable

En func, globalvar es de solo lectura. Si usa globalvar =

use la declaración de asignación xxx. , Python recreará un nuevo objeto local y le asignará un nuevo valor, el valor del objeto original permanece sin cambios en la función func2, porque hemos declarado de antemano,

Globalvar es global, por lo que el cambio. en este momento entrará en vigor directamente en la variable global.