编程语言的分类及初识大蟒蛇
一 编程语言的分类
从第一台计算机诞生开始,人们为了使用计算机硬件就产生了编程语言。从最初的机器语言,到汇编语言再到现在应用广泛的高级语言。目前世界上的编程语言已经多达600种。
- 机器语言:直接使用二进制指令编写程序。
- 汇编语言:使用英文标签代替二进制指令编写程序。
- 高级语言:使用人能够理解的语言来编写程序。高级语言分为两中类型的语言。
- 编译型:程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。如C、C++、Delphi等.
- 解释型:程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要翻译一次。因此效率比较低。比如Basic语言,专门有一个解释器能够直接执行Basic程序,每个语句都是执行的时候才翻译。(在运行程序的时候才翻译,专门有一个解释器去进行翻译,每个语句都是执行的时候才翻译。效率比较低,依赖解释器,跨平台性好.)
二 蟒蛇(Python)
1 Python的由来
作为解释型语言的代表语言:Python,是由Guido van Rossum在1989年一个无聊的圣诞节为了打发时间而开发的编程语言。Python这个名字来源于龟叔最喜欢的一部电视剧,龟叔寄希望于Python是一门既有C语言的高效又有shell脚本的简洁,功能全面、简单易学、可扩展的编程语言。
目前的Python解释器版本众多有CPython、JPython等,应用最广泛的为CPython。
2 Python的应用范围
Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、腾讯、汽车之家、美团等。
3 Python的安装
Python几乎支持所有的平台,像Windows、MacOS、Linux等,而且Python2.7内置于MacOS和Linux操作系统。可去Python官网(https://www.Python.org)下载对应平台版本。
三 Python版本的区别
因为龟叔的编码哲学,希望Python更加Pythonic,龟叔在2008年推出Python3000,并且不兼容之前的Python2.7。因为这个原因,Python程序员不得不做出一个艰难的选择:
- 继续使用Python2编写当前项目
- 使用Python3,但要将整个项目梳理,防止出现bug
Python3和Python2的主要区别:
- print在Python3中变为函数,而不是Python2中的语句
- Python2的默认编码为ascii,所以在中文编码上会出现各种问题,而Python3默认编码为UTF-8,解决了很多中文编码问题。
- 迭代器,在 Python2中很多返回列表对象的内置函数和方法在 Python 3 都改成了返回类似于迭代器的对象因为迭代器的惰性加载特性使得操作大数据更有效率。
四 执行Python的两种方式
- 交互式执行:直接在Python解释器中编写代码,写一行,执行一行。优点为调试方便,但无法保存。
- 脚本式执行:将完整的代码全部写入文件,并用Python解释器执行。
五 Python中的变量
- 什么是变量?
计算机为了找到存在内存中的数据,把数据的内存地址‘赋值’给一个成为称为变量的东东。
变量的使用遵循先定义后使用的原则,如果在为定义一个变量之前使用变量,则会报错。
- 定义变量
a = 10
a为变量名(访问内存中存储的数据的唯一标识,保存的为内存地址)
=为赋值符号(将值的内存地址‘赋值’给变量名)
10为变量的值(用来记录状态)
- 变量的命名规则
- 变量名只能是字母、数字或下划线的任意组合
- 变量名的第一个字符不能是数字
- Python定义的关键词不能声明为变量名
- 变量的命名风格
驼峰体
如AgeOfZuan = 18
MoneyOfZuan = 0
下划线
age_of_zuan = 18
money_of_zuan = float('inf')
- 变量值具备三个特征
1. id: 变量值的唯一编号,内存地址不同id则不同
2. type:类型
3. value
六 运行Python程序的三个阶段
- 启动Python解释器
- Python解释器将要执行的Python文件从硬盘读入内存
- Python解释器解释并执行读入内存的Python代码,开始识别Python语法
七 Python垃圾回收机制
1 引用计数
Python默认采用的垃圾回收机制为引用计数法,引用计数法的原理是每个对象维护一个字段,用来记录当前对象被引用的次数,每当新的引用指向该对象时,引用计数➕1,每当该对象的引用失效时,引用计数➖1,一旦该对象的引用计数为零时,该对象立刻被回收,对象占用的内存空间将被释放。这种方法有两个缺点:一个是需要额外的空间来维护引用字段;二是对于循环引用的对象,即使使用del删除引用,但因为互相循环引用,结果仍然不能回收该对象的内存空间,造成内存泄漏(内存空间在使用后为释放)。为了解决循环引用的问题,Python引入的另外两种内存回收机制
2 标记清除
标记清除算法是基于追踪计数计数实现的垃圾回收算法。分为两个阶段:第一个阶段是标记阶段,算法会把所有的活动对象打上标记,第二个阶段是把那些没有标记的对象进行回收。那么算法是怎么判断哪些是活动对象,哪些是非活动对象呢?
对象之间通过引用一个个连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边。从根对象出发,沿着有向边遍历对象,可达的对象标记为活动对象,不可达的对象就是要被清除的非活动对象。根对象为全局变量、调用栈、寄存器。
标记清除算法作为Python的辅助垃圾收集计数主要用来处理一些容器对象,例如list、dict、tuple等,因为对于字符串、数值对对象是不可能造成循环引用问题。Python使用一个双向链表将这些容器对象组织起来。不过,这种简单粗暴的标记清除算法也有缺陷:清除非活动对象前它必须顺序扫描整个堆内存,哪怕只剩下小部分活动对象也要扫描所以对象。
3 分代回收
分代回收是一种以空间换时间的操作方式,Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为3代,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代),它们对应的是三个链表,垃圾手机频率随着对象的存活时间的增大而减小。新创建的对象都会分配在年轻代,年轻代链表的总数达到上限是时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,以此类推,老年代中的对象是存活时间最久的对象,甚至存活于整个系统的生命周期内。同时,分代回收是建立在标记清除技术基础上。分代回收同样作为Python的辅助垃圾收集技术处理容器对象。