zoukankan      html  css  js  c++  java
  • Python简介

    Python是什么

    Python 是Guido van Rossum开发的一种动态类型、面向对象的脚本语言。

    Python主要的垃圾回收算法是引用计数。但是Python中对象可以分为容器对象和非容器对象。其中容器对象又用到了标记清除算法。而容器对象中的子对象根据存活时间长短而使用分代回收的GC算法

    之后我们会介绍到关于Python如何生成对象,以及容器对象的相关细节和如何对对象进行垃圾回收等。

    Python语言类型

    编程语言主要从以下几个角度进行分类编译型和解释型静态语言和动态语言强类型定义语言和弱类型定义语言

    • 编译器:把源程序的每一条语句都翻译程机器语言并保存为二进制文件,这样运行时可以直接用机器语言运行速度超级快。

    代码--》编译器--》机器能读懂的代码--》运行

    • 解释器:只有在程序运行时才一条一条解释成机器语言给计算机来执行,所以运行速度不是很快。

    代码--》解释器-》字节码--》虚拟机边执行边翻译--》机器能读懂的代码--》运行

    编译型 解释型 混合型
    C JavaScript Java
    C++ Python C#
    Go Ruby
    Swift Php
    Object-C Perl
    Pascal Erlang

    编译型与解释型

    编译器

    优点:

    编译器一般有预编译过程,对代码进行优化。因为运行前只编译一次,以后不许要编译。所以编译型语言运行效率高,不依赖环境(可以脱离环境独立运行)。

    缺点:

    编译后如果需要修改整个模块就需要重新编译。编译的时候根据不同环境生成的机器码,在不同机器之间移植时就会有问题。需要根据不同系统的环境去编译成不同的可执行文件。

    解释器
    优点:

    有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护

    缺点:

    每次运行的时候都要解释一遍,性能上不如编译型语言。

    动态语言和静态语言

    动态语言

    指运行期间才去做数据类型检查的语言,也就是说在用动态类型的编程语言时,永远也不用给任何变量指明数据类型,该语言会在第一次赋值时将数据类型记录下来。Python和Ruby就是典型的动态语言。

    静态语言

    在编译期间检查数据类型,也就是说在编写程序时需要指明数据类型例如c/c#/c++/java.

    强类型定义语言和弱类型定义语言

    强类型定义语言

    强制数据类型定义的语言,也就是说如果一个数据类型被定义了,如果不经过强制转换,它就永远是这个数据类型。比如你定义了一个整型变量a,那么程序不能把a当做字符串处理。强类型定义是安全的类型。

    弱类型定义语言

    数据类型可以被忽略的语言。一个变量可以赋不同类型的值。强类型在赋值速度上不及弱类型,但逻辑上的安全性能避免很多错误。例如Python是动态解释的强类型语言。

    Python的源代码(摘自垃圾回收的算法与实现)

    各位看官可以去下载Python的源码看看
    Python约有60万行源代码,大体分布如下。(Python3.0.1)

    语言 源代码行数
    Python 296215
    C 271109
    汇编 9565

    可以看出来,其中Python和c的行数几乎各占一半。实际上Python的库基本上使用Python写的,其核心部分是用C语言实现的

    目录结构如下

    目录 概要
    Demo Python的演示应用程序
    Doc 文档
    Grammer Python的语法文件
    Include 编译Python时引用的头文件
    Lib 标准附加库
    Mac mac用的工具等
    Misc gdbinit和vimrc等工具集合
    Modules Python对C语言模块的扩展
    Objects Python对象用的C语言代码
    PC 依存于OS等环境的程序
    PCbuild 构造Win34和x64时会用到
    Parser Python的解析器
    Python Python的核心

    Python的优缺点

    优点:

    • Python的定位是明确、优雅、简单,所以Python代码看上去易懂。初学者容易学习,可以编写复杂的程序。
    • 开发效率高,Python有非常丰富的第三方库,下载后直接调用,也可以进行二次开发,大大降低开发周期,避免重造轮子。
    • 高级语言---当你用python编程时无需考虑底层如何实现的。
    • 可以执行---Python是开源的,已经被移植到各种平台,python程序几乎不需要修改就能在各种平台上运行。
    • 可扩展性---如果你希望某一段关键代码运行的更快又不希望其公开,那你可以使用c语言编写然后再Python上使用它们。
    • 可嵌入性---把python嵌入到c/c++中,向你的程序提供脚本功能。

    缺点:

    • 速度慢(确实比c和java等都慢,但能满足大多数情况的需求。)
    • 代码不能加密(解释型语言,源码明文存放的)
    • 线程不能利用多cpu的问题---GIL全局解释锁,是计算机语言同步线程的工具,即任意一时刻只有一个线程在运行。Python的线程是操作系统的原生线程,在Linux上为pthread在windows上为Win thread,完全由操作系统调度线程的执行。一个解释器只有一条主线程,以及多条用户程序的执行线程。即使在多核平台上由于GIL的存在禁止多线程并行。

    Python有哪些种类

    • CPython

      官方下载的版本。这个解释器是用C语言开发的所以称为CPython,是用的最广泛的Python解释器。一般说的Python就是指CPython

    • IPython

      基于CPython的一个增强版本,执行Python代码的功能和CPython完全一样。

    • PyPy

      是另一种Python解释器,他的目标是速度。PyPy利用JIT技术,对Python代码进行编译,所以可以显著提高运行速度。

    • Jython

      运行在Java平台上的解释器,可以吧Python代码编译为java字节码执行。

    • IronPython

      与JPython类似,只不过是微软的.net平台。

    Python的解释器有很多,如果要与java或者.net平台进行交互,推荐使用网络的方式。

    对象管理

    对象的结构

    Python中将“列表”,“元组”等内置数据类型对应的结构体在内部进行定义。如下表示:

    结构体名称 对应的内置数据类型
    PyListObject 列表型
    PyTupleObject 元组型
    PyDictObject 字典型
    PyFloatObject 浮点型
    PyLongObject 长整型

    我们来看看浮点型的结构体。

    Include/floatobject.h

    typedef struct {
        PyObject_HEAD
        double ob_fval;
    } PyFloatObject;
    

    可以看到其中定义了一个和一个double类型的变量。我们知道Python使用的是引用计数。所以他不仅要保存对象的值,他还要去保存该对象的头信息(被引用 了多少次)。

    我们来看一看PyObject_HEAD

    Include/object.h

    /* PyObject_HEAD defines the initial segment of every PyObject. */
    #define PyObject_HEAD                   PyObject ob_base;
    
    

    之后我们找到了 PyObject这个结构体

    typedef struct _object {
        _PyObject_HEAD_EXTRA
        Py_ssize_t ob_refcnt;
        struct _typeobject *ob_type;
    } PyObject;
    
    

    好了,这个就是浮点型对象的头信息了。而其中ob_refcnt就是计数器,ob_type就是持有各种类型的信息。

    其他对象也是一样的,他们也是这样来定义计数器的。有兴趣可以自己查看。

    这样所有的内置型结构体都在开头保留了PyObject这个结构体。

    这就是对象的结构。它是有两部分构成,可以理解为头和体,头就是PyObject这个结构体。体呢就是自己定义的,与他人不相同的部分了。

  • 相关阅读:
    Winform 的一个多线程绑定DataGrid数据源的例子
    General Database Adapter for Biztalk Server 2006 介绍
    Developing a Transactional Biztalk adapter
    整理了一些DataGrid ColumnStyle
    Biztalk 调用带Soap Head WebService的方法
    提问:如何控制控制台程序的输入/输出焦点的位置
    Biztalk 2006 adapter的开发比2004容易的多
    数据库同步设计方案
    解决Microsoft Visual Studio Code Name "Orcas" 不能安装的问题
    C# 退出提示 事件提示两次问题
  • 原文地址:https://www.cnblogs.com/Leon-The-Professional/p/10137369.html
Copyright © 2011-2022 走看看