Principiante en aprender Python, siente la diferencia con C
Ha pasado más de medio mes desde que comencé a leer Python. He leído dos libros: Python Core Programming y Dive into
Python. Leí dos libros en medio mes y todos saben cuánto cuesta tragarlos todos. Esto también se debe a que no necesito usarlo para el desarrollo a gran escala por el momento, y se usa principalmente para los pequeños diarios. pruebas del programa. Entonces
Mi estrategia es explorarlo en su totalidad y consultarlo cuando lo necesite. Se dice que la primera edición de Core Programming es demasiado antigua. Siempre habla de cosas anteriores a la 2.2. La versión electrónica traducida que leí no está bien traducida y es muy oscura. Después de leer esto, todavía estaba confundido. Leí en Internet que la gente decía que DIP era bueno y que Woodpecker también tenía documentos electrónicos gratuitos, así que busqué esto. ¿Cómo puedo decirlo? Es mejor que la programación básica, pero no es adecuada para principiantes que la ven por primera vez. La razón por la que creo que está bien explicado es porque algunos conceptos todavía son un poco vagos al analizar la programación básica. Después de leer este libro, entiendo mucho. Si es un principiante, lea este libro; le garantizamos que será difícil de entender.
Las siguientes son algunas de las diferencias obvias entre C y Python que se resumieron en el proceso de aprendizaje y lectura de los materiales, incluidas instrucciones generales y detalles. Definitivamente no he terminado de resumirlo. Por ejemplo, funciones dinámicas, lambdas, etc., soy demasiado vago para escribir. De hecho, al ser dos idiomas completamente diferentes, las siguientes diferencias son sólo la punta del iceberg. Debería ser una buena idea, al menos debería ser útil para amigos que tienen los mismos intereses de investigación que yo y están considerando aprender otro idioma. Este artículo también puede considerarse como notas de estudio del DIP. Por cierto, si tienes amigos que lo saben, puedes ayudar recomendando algunos materiales prácticos de enseñanza de Python. Es imposible aprender bien el idioma sin mucha práctica y solo gestos.
Propósito del aprendizaje
Mi dirección de investigación futura está integrada. Obviamente, el lenguaje C es mi lenguaje principal. No soy un entusiasta de los idiomas. Solía pensar que para las personas que investigan en lugar de aplicar, conocer varios idiomas no es tan bueno como 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 si quieres afianzarte en la competencia de la ingeniería informática, debes conocer el lenguaje C. Debido a que realmente desea realizar programación de alto rendimiento,
Es imposible dejar atrás 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 más núcleos de CPU y cuellos de botella cada vez más aterradores en el rendimiento de la memoria no son importantes para los desarrolladores de nivel superior, pero para los desarrolladores de programas de alto rendimiento, estos no son transparentes. Para muchas aplicaciones, es más eficaz controlarlas usted mismo.
En estas situaciones, el montaje y la C siguen siendo irremplazables. Sin embargo, no basta con saber C. Dominar un lenguaje orientado a objetos, un lenguaje de nivel relativamente superior, no sólo será beneficioso para el desarrollo personal futuro, sino que también ayudará a su propia comprensión técnica.
Si quieres preguntar quién es más importante para mí, creo que C es más importante. La curva de aprendizaje de C es más pronunciada. Parece simple, pero en realidad está llena de trampas. Incluso un programa aparentemente simple e ineficaz no se puede completar aprendiéndolo durante 1 o 2 meses.
En cuanto a la profundidad y dificultad de la optimización, las habilidades necesarias se calculan anualmente. Pero una vez que tenga una buena base en el lenguaje C, su comprensión de las computadoras y otros lenguajes será de gran beneficio. Por ejemplo,
Si tienes conocimientos de C, se puede decir que después de aprender Python por un día, podrás escribir algunos programas cortos. La optimización posterior no es gran cosa para el algoritmo, es solo un intercambio de declaraciones muy básico. Por supuesto, esto no quiere decir que Python no sea bueno. De hecho, en aplicaciones de nivel superior, Python no es tan conveniente como C.
Muchas personas piensan que, dado que entienden C, dominar aún más C ++ debería ser una cuestión de rutina. Sin embargo, C no es un superconjunto de C y no me gusta la complejidad y complejidad de C ++. Decidí echarle 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 según la siguiente descripción:
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 exigir que el tipo de datos de cualquier variable se declare antes de su uso. Java y C son lenguajes de tipado estático.
Lenguaje de escritura dinámica
Un lenguaje que determina los tipos de datos durante el tiempo de ejecución, a diferencia de la escritura estática. Python se escribe dinámicamente porque determina el tipo de una variable la primera vez que le asigna un valor.
Lenguaje fuertemente tipado
Un lenguaje que siempre impone definiciones de tipo. Java y Python tienen aplicación de tipos. Tienes un número entero y no puedes tratarlo como una cadena sin convertirlo explícitamente.
Lenguaje débilmente tipado
Un lenguaje en el que los tipos se pueden ignorar, a diferencia del lenguaje fuertemente tipado. VBScript tiene tipos débiles. En VBScript, puede concatenar la cadena '12' y el número entero 3 para obtener la cadena '123', que luego puede tratarse como el número entero 123, todo sin ninguna conversión explícita.
Mecanismo de objeto
Cómo entender específicamente este "tipo de variable determinante dinámicamente" comienza con el mecanismo de objeto Objeto de Python. Los objetos (en lo sucesivo denominados objetos) son la abstracción de datos de Python
. Todos los datos en Python están representados por objetos o relaciones entre objetos. Las funciones son objetos y las cadenas son objetos. . Cada objeto tiene tres atributos:
Entidad, tipo y valor. Comprender las entidades es un paso muy importante para comprender los objetos. Una vez que se crea una entidad, nunca cambiará ni será destruida explícitamente. Al mismo tiempo, en un sentido general, determina las operaciones admitidas por el objeto. >El tipo de fórmula (tipo, incluido número, cadena, tupla y otros) no cambiará, solo puede cambiar su valor. Si buscas una explicación concreta, la entidad equivale a la dirección del objeto en la memoria y es su existencia esencial. Los tipos y valores son solo la presentación externa de entidades. Luego, Python proporciona algunas interfaces para que los usuarios interactúen con objetos. Por ejemplo, la función id() se usa para obtener la representación entera de la entidad del objeto (en realidad, la dirección aquí), y la función type() obtiene su tipo.
Este mecanismo de objeto es algo que c no tiene. Se refleja principalmente en los siguientes puntos:
1 Como acabo de decir, c es un lenguaje de tipo estático que podemos definir. int a, char
b, etc., pero debe especificarse de antemano en el código fuente. Por ejemplo, podemos especificar directamente a =
"lk" en cualquier lugar de Python. De esta manera, el tipo de a es una cadena, que se determina cuando se asigna. No es necesario que lo escribamos explícitamente. en el código.
En C, debemos especificar explícitamente char *a =
"lk", es decir, especificar manualmente el tipo de a por adelantado
2 Ya que en C no existe tal cosa. como objeto El concepto es solo "representación de datos". Por ejemplo, si hay dos variables int ayb, y queremos comparar los tamaños, podemos usar a ==
b para juzgar. , pero si son dos cadenas Para las variables a y b, tenemos que usar strcmp para comparar, porque en este momento, a y b son esencialmente punteros a cadenas. Si todavía usamos == para comparar directamente, entonces la comparación real es. 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. Esto se llama "identidad del objeto". Para comparar dos valores de cadena en Java, usa str1.equals(str2).
Y en Python es diferente a los dos anteriores. Debido a la introducción de objetos, podemos usar el operador "is" para comparar las entidades de dos objetos, que no tiene nada que ver con el tipo. del objeto específico.
Por ejemplo, ya sea que su objeto sea una tupla, una cadena o incluso una clase, puede usar "es" para comparar. Es esencialmente una comparación de la "identidad del objeto". que es lo mismo que en Java
El == es similar al puntero en C. También hay una comparación == en Python, que es una comparación de valores.
3
Debido a la introducción del mecanismo de objetos, el uso de Python es muy flexible. Por ejemplo, podemos usar el método de introspección para ver otros módulos y funciones que existen en. la forma de objetos en la memoria y obtener información sobre ellos y realizar
operaciones sobre ellos. 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.
4 Hay otro detalle muy interesante, es decir, el impacto del tipo en el comportamiento del objeto es desde todos los aspectos. Por ejemplo, a = 1; Lo que se activa en Python puede ser que a y b apunten a un objeto con un valor de 1 al mismo tiempo, o pueden apuntar a dos objetos con un valor de 1 respectivamente. Por ejemplo, en esta declaración, c = []; d
= [], entonces cyd definitivamente apuntan a listas vacías diferentes y recién creadas. No ha terminado, ¿y si es la declaración "c = d =
[]"? En este momento, cyd apuntan nuevamente al mismo objeto de lista. Estas diferencias no se encuentran en c.
Finalmente, hablemos de por qué Python es lento. La razón principal es que la sobrecarga de llamadas a funciones
es relativamente grande. Como ahora todo es un objeto, construir y destruir también es caro. Incluso 1 1 es una función
llamada, como ’12′ ’45′ para crear un tercer objeto de cadena, luego llama a la cadena
__add del obj. Es concebible, ¿cómo se puede aumentar la velocidad?
Listas y Arrays
Siempre es interesante analizar listas en Python y arrays en C. Creo que a algunos amigos les puede pasar lo mismo cuando aprendieron las listas por primera vez, las trataron como matrices. La caracterización inicial de la diferencia entre listas y matrices se centró principalmente en dos puntos. En primer lugar, la lista puede contener muchos tipos de datos diferentes, como
["this", 1, "is", "an", "array"]
Esta lista, si lo pones en C, en realidad es una matriz de cadenas, lo que equivale a dos dimensiones.
En segundo lugar, la lista tiene muchos métodos, que en sí misma es un objeto. Esto es diferente de la matriz simple de C. Hay muchas operaciones en Lista porque hay métodos y operadores sobrecargados. También trae algunos problemas, como el siguiente ejemplo:
Si queremos generar una lista multidimensional, use la siguiente declaración
A = [[Ninguno] * 2] * 3 p>
Como resultado, el valor de A será
[[Ninguno, Ninguno], [Ninguno, Ninguno], [Ninguno, Ninguno]]
No hay problema a primera vista, una lista típica en forma de matriz bidimensional. Bien, ahora queremos modificar el valor del primer Ninguno, usando la declaración
A[0][0] = 5
Ahora echemos un vistazo al valor de A :
[[5, Ninguno], [5, Ninguno], [5, Ninguno]]
¿Encontraste el problema? Esto se debe a que cuando usas * para copiar, solo creas una referencia al objeto en lugar de crearlo realmente. *3 crea una lista que contiene tres referencias, las tres referencias apuntan 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. Por supuesto que hay una solución, vamos a crearla así
A = [Ninguno]*3
for i in range(3):
A[ i] = [Ninguno] * 2
Esto crea una lista que contiene tres longitudes diferentes de 2.
Por eso, siempre se ha enfatizado que cuanto más complejo es algo, más flexible es y más propenso a errores.
Optimización de código
C es un lenguaje muy simple. Cuando pensamos en optimización, generalmente pensamos de manera muy simple, cuantas menos llamadas a nivel de sistema, mejor (mecanismo de búfer). ), eliminar la ineficiencia de los bucles y las referencias innecesarias al sistema, etc.
etc. De hecho, se basan 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 de sintaxis de Python varían ampliamente y hay muchas bibliotecas y módulos, no es adecuado para el lenguaje en sí. Hay muchos puntos de optimización que vale la pena señalar.
Por ejemplo, tenemos una lista L1 y queremos construir una nueva lista L2 que incluya los primeros 4 elementos de L1. Según la idea más sencilla, el código debería ser
L2 = []
for i in range[3]:
L2.append(L1[ i] )
La versión más optimizada y hermosa es
L2 = L1[:3]
Para otro ejemplo, si s1..s7 es un gran cadena (10K), luego unirse ([s1, s2, s3, s4, s5, s6, s7]) será mucho más rápido que s1 s2 s3 s4 s5 s6 s7, porque este último se calculará muchas veces como subexpresión y se unirá ( ) completa todas las copias de una sola vez. Además, para operaciones de cadena,
use el método reemplazar() en objetos de cadena. Utilice expresiones regulares sólo cuando no haya un patrón de cadena fijo.
Entonces, utilizando 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 tiene una forma única y un significado claro. Cuando necesite utilizar recursos como funciones externas, utilice incluir. Existe un mecanismo
similar en Python, que es la importación.
A primera vista, estos dos tipos son bastante similares. ¿No usamos esto para indicar cuándo queremos usar recursos externos (los más comunes son funciones o módulos (Python))? De hecho,
la diferencia esencial entre los dos mecanismos de procesamiento es que incluir en C se utiliza para decirle al preprocesador que el contenido del archivo especificado por esta inclusión será tratado como un archivo fuente local aparecido en. . En cuanto a la importación, no se trata simplemente de insertar el siguiente contenido *directamente* en el local. Esto es más flexible. De hecho, Python es más flexible que C para casi todos los mecanismos similares. Esto no quiere decir que C
no sea bueno, C es muy conciso y, de hecho, prefiero C.
Hablemos brevemente de esta flexibilidad. Hay tres formas de importación en Python, importar X, desde X importar *(o a, b, c...),
X = __import__('x'). El más utilizado es el segundo, porque es más conveniente y no siempre utiliza X.module para llamar al módulo como el primero. de
¿Cuándo debo utilizar qué formulario? Cabe decir que en la mayoría de la documentación del módulo se le indicará claramente qué formulario debe utilizarse. Si necesita usar muchos objetos, from X import
* puede ser más apropiado. Sin embargo, en la actualidad, la mayoría de las bibliotecas de Python de terceros no recomiendan usar from modulename import *
< p. >Este formato. Hacerlo saturará el espacio de nombres del presentador. Mucha gente no hace esto ni siquiera con módulos diseñados específicamente para este modo (incluidos Tkinter,threading y matplot). Y si solo necesita una determinada clase de objeto a, entonces usar from X import a es mejor que usar import
Add X.
¿Qué pasa si ni siquiera conoces el módulo que deseas importar? Tenga en cuenta que las ventajas de Python se reflejan en este momento. Podemos usar
__import__(módulo) para llamar al módulo, donde este módulo es una cadena. De esta manera, puede decidir en tiempo de ejecución si lo desea. a Qué módulo llamar. Dé
un ejemplo:
def classFromModule (módulo, Nombre):
mod = __import__ (módulo)
return getattr (mod , Nombre)
Aquí se define una función classFromModule, puedes llamarla en cualquier momento en el código,
o = classFromModule (ModuleOfTheClass, NameOfTheAttribute)()
Solo necesita pasar el módulo ModuleOfTheClass que desea importar y el nombre del atributo NameOfTheAttribute (por supuesto, puede ser datos o un método) en forma de cadena, y puede llamarlo con este nombre. No es necesario especificarlo de antemano, pero se basa en el nombre en ese momento. Juicio basado en las condiciones operativas.
Por cierto, el orden de importación en Python también tiene regulaciones predeterminadas. Esto es algo similar a incluir en C, porque generalmente incluimos primero los archivos del sistema y luego
incluimos los nuestros. propio archivo de encabezado (y también existe la diferencia entre lt; gt; y ""). En Python, los módulos generalmente deben importarse en el siguiente orden:
1. Módulos de biblioteca estándar, como sys, os, getopt, etc.
2. /p>
3. Módulos implementados localmente.
Variables globales
Cuando se habla aquí de variables globales, no significa que los conceptos de variables globales en Python y C sean diferentes. Existen algunas diferencias sólo en el mecanismo de uso. Por ejemplo:
– module.py –
globalvar = 1
def func():
imprimir globalvar
# Esto hace que algo global sea de solo lectura,
# cualquier intento de escribir en algún global
# crearía una nueva variable local.
def func2() :
global globalvar
globalvar = 2
# esto te permite manipular la variable global
#
En la función func, globalvar es de solo lectura. Si utiliza una declaración de asignación como globalvar =
xxx, Python recreará un nuevo objeto local y le asignará el nuevo valor, y el valor del objeto original permanecerá sin cambios. En la función func2, dado que hemos declarado de antemano que
globalvar es global, los cambios en este momento tendrán efecto directamente en la variable global.