1.1Python发展历程
1989,为了度过圣诞假期,(龟叔)Guido开始编写Python语言编译器。Python这个名字来自Guido的喜爱的电视连续剧《蒙蒂蟒蛇的飞行马戏团》。他希望新的语言Python能够满足他在C和Shell之间创建全功能、易学、可扩展的语言的愿景。
1989年由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年
Granddaddy of Python web frameworks, Zope 1 was released in 1999
Python 1.0 - January1994增加了 lambda, map, filter and reduce.
Python 2.0 - October 16,2000,加入了内存回收机制,构成了现在Python语言框架的基础
Python 2.4 - November 30,2004, 同年目前最流行的WEB框架Django诞生
Python 2.5 - September 19,2006
Python 2.6 - October 1,2008
Python 2.7 - July 3,2010
Python 3.0 - December 3,2008
Python 3.1 - June 27,2009
Python 3.2 - February 20,2011
Python 3.3 - September 29,2012
Python 3.4 - March 16,2014
Python 3.5 - September 13,2015
1.2编程语言排行榜
今天,世界上有将近600种编程语言,但也有20种流行语言。如果你听说过TIOBE排名,你知道编程语言的普遍流行。这是过去10年中最常用的20种编程语言的变化图。
【2019年11月】
1.3Python的应用领域
0、WEB开发
Python拥有很多免费数据函数库、免费web网页模板系统、以及与web服务器进行交互的库,可以实现web开发,搭建web框架,目前比较有名气的Python web框架为Django(相当于JavaEEssm)。从事该领域应从数据、组件、安全等多领域进行学习,从底层了解其工作原理并可驾驭任何业内主流的Web框架。
1. 桌面软件
Python在图形界面开发上很强大,可以用tkinter/PyQT框架开发各种桌面软件!
2. 网络编程
网络编程是Python学习的另一方向,网络编程在生活和开发中无处不在,哪里有通讯就有网络,它可以称为是一切开发的“基石”。对于所有编程开发人员必须要知其然并知其所以然,所以网络部分将从协议、封包、解包等底层进行深入剖析。
3. 爬虫开发
在爬虫领域,Python几乎是霸主地位,将网络一切数据作为资源,通过自动化程序进行有针对性的数据采集以及处理。从事该领域应学习爬虫策略、高性能异步IO、分布式爬虫等,并针对Scrapy框架源码进行深入剖析,从而理解其原理并实现自定义爬虫框架。
4. 云计算开发
Python是从事云计算工作需要掌握的一门编程语言,目前很火的云计算框架OpenStack就是由Python开发的,如果想要深入学习并进行二次开发,就需要具备Python的技能。
5. 人工智能
MASA和Google早期大量使用Python,为Python积累了丰富的科学运算库,当AI时代来临后,Python从众多编程语言中脱颖而出,各种人工智能算法都基于Python编写,尤其PyTorch之后,Python作为AI时代头牌语言的位置基本确定。
6. 自动化运维
Python是一门综合性的语言,能满足绝大部分自动化运维需求,前端和后端都可以做,从事该领域,应从设计层面、框架选择、灵活性、扩展性、故障处理、以及如何优化等层面进行学习。
7. 金融分析
金融分析包含金融知识和Python相关模块的学习,学习内容囊括Numpy\Pandas\Scipy数据分析模块等,以及常见金融分析策略如“双均线”、“周规则交易”、“羊驼策略”、“Dual Thrust 交易策略”等。
8. 科学运算
Python是一门很适合做科学计算的编程语言,97年开始,NASA就大量使用Python进行各种复杂的科学运算,随着NumPy、SciPy、Matplotlib、Enthought librarys等众多程序库的开发,使得Python越来越适合做科学计算、绘制高质量的2D和3D图像。
9. 游戏开发
在网络游戏开发中,Python也有很多应用,相比于Lua or C++,Python比Lua有更高阶的抽象能力,可以用更少的代码描述游戏业务逻辑,Python非常适合编写1万行以上的项目,而且能够很好的把网游项目的规模控制在10万行代码以内。
1.4Python特点
(1)Python是完全面向对象的语言。
1.函数模块数学字符串都是对象,在python中一切皆对象。
2.完全支持继承,重载,多重继承。
3.支持重载运算符,也支持泛型设计。
(2)Python拥有一个强大的标准库,Python语言的核心只包含数字,字符串,列表,字典,文件等常见的类型和函数,而由Python标准提供了系统管理,网通通信,文件处理,数据库接口,图形系统,XML处理等额外的功能。
(3)Python社区提供了大量的第三方模块,使用方式与标准库类似,他的功能涵盖科学计算、人工智能、机器学习、Web开发、数据库接口、图形系统多个领域。
(4)解释性语言
编译型:一次性将【源代码】编译成【二进制文件010010】。
缺点:开发效率低,不能跨平台。
优点:运行速度高。
语言:CC++等…
C和C++编译型语言:源代码à0100000
Python和java都是解释性语言源代码à字节码à010000
解释型:当程序执行先将【源代码py】编译成【字节码pyc】,再有解释器对【字节码pyc】
逐行解释成【二进制01001101】最后交给CPU执行。
优点:开发效率高,可以跨平台。
缺点:运行速度慢。
(5).强类型定于语言
1.一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个类型了。
2.在速度上可能略逊色于弱类型语言。
3.严谨性能够有效的避免许多错误。
(6).动态类型语言
1.运行期间采取对数据类型进行检查
2.不用给任何变量指定数据类型,该语言会在你第一次被变量赋值,
在内部将数据类型记录下来。
1.5Python版本与分类
版本
Python2源码不标准,混乱、重复代码太多。
Python3统一标准,去除重复代码。
分类
cpython先转换C语言能识别的【字节码】=>再转换成CPU能识别的【01001010】
jypython先转换成Java能识别的【字节码】=>在转换成系统能识别的01001010
ironpython
MicroPython用于微控制器
pypy一次性全部编译成字节码,运行速度快,但开发效率相对慢。
其他语言python
1.6Python的安装
1).安装python2和3的虚拟机
2).配置环境变量
Path=C:\Users\Administrator\AppData\Local\Programs\Python\Python37\
Path=C:\Users\Administrator\AppData\Local\Programs\Python\Python27\
3).测试
Python3x:python文件路径filename.py回车
Pytnon2x:python2文件路径filename.py回车
cmdàpythonà回车
4).编写第一个python程序
创建python代码源文件Test1.py
5).打开命令行
pythonE:\python\Test1.py回车
python2E:\python\Test1.py 回车
6).退出python
exit()
7).python2 和python3的区别
Python2 ascii码
Python3 utf-8
解决方法:在源代码文件头增加
#-*- encoding:utf-8 -*-
1.7Pycharm使用
1、首先去Pycharm官网,或者直接输入网址:http://www.jetbrains.com/pycharm/download/#section=windows,下载PyCharm安装包,根据自己电脑的操作系统进行选择,对于windows系统选择下图的框框所包含的安装包。
2、选择Windows系统的专业版,将其下载到本地,如下图所示:
3、双击下载的安装包,进行安装,然后会弹出界面:
4、选择安装目录,Pycharm需要的内存较多,建议将其安装在D盘或者E盘,
不建议放在系统盘C盘:
5、点击Next,进入下图的界面:
Create Desktop Shortcut创建桌面快捷方式,一个32位,一个64位,我的电脑是64位系统,
所以选择64位。勾选Create Associations是否关联文件,选择以后打开.py文件就会用PyCharm打开。
6、点击Next,进入下图:
默认安装即可,直接点击Install。
7、耐心的等待两分钟左右,如下图:
8、之后就会得到下面的安装完成的界面:
9、点击Finish,Pycharm安装完成。接下来对Pycharm进行配置,双击运行桌面上的Pycharm图标,进入下图界面:
选择Do not import settings,之后选择OK,进入下一步。
10、选择Accept,进入下一步:
11、进入激活界面,选择第二个License server,如下图所示:
之后在License server address中随意输入下面两个注册码中的任意一个即可,Pycharm新注册码1:http://idea.liyang.io或pycharm新注册码2:http://xidea.online,之后点击OK,便可以激活Pycharm了。
12、Pycharm激活后
13、激活之后会自动跳转到下图界面,选择IDE主题与编辑区主题:
建议选择Darcula主题,该主题更有利于保护眼睛,而且看上去也非常不错~~~
14、选择OK之后进入下图界面:
选择Yes即可,更换IDE主题。
15、之后进入下图界面:
16、点击Create New Project,进入如下图的界面:
自定义项目存储路径,IDE默认会关联Python解释器。选择好存储路径后,点击create。
17、IDE提供的提示,直接close即可,不用理会。
18、进入的界面如下图所示,鼠标右击图中箭头指向的地方,然后选择New,最后选择python file,在弹出的框中填写文件名(任意填写),本例填写:helloworld。
19、之后得到下图,然后点击OK即可:
20、文件创建成功后便进入如下的界面,便可以编写自己的程序了。
这个界面是Pycharm默认的界面,大家完全可以自己去setting中设置自己喜欢的背景和字体大小、格式等等。
1.8运行原理
1).程序要在计算机中运行,三个核心硬件必不可少,分别是CPU、内存和硬盘。
CPU:中央处理器,负责处理数据和计算
内存:临时存储数据(断电之后,数据会消失),读取速度快,空间小
硬盘:永久存储数据,读取速度慢,空间大
2).python程序执行原理
(1).操作系统会首先让CPU把【python解释器】的程序加载到内存中
(2).[python解释器]读取硬盘中的【python源代码】,解释器让CPU根据语法规则
从上到下翻译【python原代码】翻译成【字节码】
(3).然后【python解释器】再将【字节码】解释【二进制机器码】。
(4).最后CPU执行【二进制机器码】。
Python源代码 【py】à字节码 【pyc】à二进制码【010001010】
#将源代码编译成字节码
Python -m源代码.py
1.9内存与对象管理
*变量无须事先声明
*变量无须指定类型
*程序员不用关心内存管理
*变量名会被回收
*del语句直接释放资源
*id语句检查引用地址
【变量定义】
Python中的变量只要在使用之前声明且位置不受限制,但需要注意的是变量
只有赋值之后才会分配内存块供外界访问。
[控制台输出]
【清理对象】
使用del(地址)的方式清理内存中,不再使用的地址。
[控制台输出]
【动态类型】
Python声明变量无须类型,对象的类型和内存占用量是在运行时根据等于号(=)
值类型和大小确定的。
[控制台输出]
【内存分配与销毁】
Python创建对象分配内存时,解析器根据代码借用系统资源。使用结束后,
在适当的时候释放系统资源。所以python程序员不用担心内存释放问题。
尽管去声明对象python内部有垃圾回收GC程序自动释放资源。但python
也提供手动释放资源的方法,格式:del(地址)注意:del(地址)不是必须的!!!
【引用计数和类型引用】
Python中的对象,分为引用和对象,对象中存储数据保存在堆中,
引用中保存对象在堆中的具体位置保存在栈中。在对象的内存块中,
有一个 HEAD部分存储着引用计数器(指向对象的引用个数count)
和类型引用(该对象属于什么类型)type(地址)
【引用计数】
当程序执行到第一行Num1=100,此时指向100这个对象的引用只有一个为Num1
当程序执行到第二行Num2=Num1,此时指向100这个对象的引用有两个Num1,Num2
当程序执行到到第三行Num3=Num2,此时指向100这个对象的引用有三个Num1,Num2,
Num3.
当程序执行到第四行,Num2=200, Num2引用指向200这个对象,不再指向100,
所以指向100这个对象的引用随之减少。执行两个Num1和Num3
【获取地址】
Python语言提供获取对象地址的函数id(引用名称)。
通过该函数就可以轻松获得对象的引用地址。
[控制台输出]
【类型检查】
Python提供类型检查函数type(引用),就可以获得该地址指向对象的具体类型。
[控制台输出]
注意:type类型是python语言中的顶级类型。
[id语句]
Id(引用)可以查看引用的具体内存地址
[控制台输出]
【None对象】
None代表空,它的布尔值总是False
[del语句]
Python中提供手动删除引用语句[del引用名]。
注意:当删除掉一个对象的引用,如果这个对象没有任何引用指向它,
它就是待回收对象,随时会被垃圾回收程序从内存中擦除。
【垃圾回收】
没有任何引用(地址)指向的对象(内存块),会被垃圾收集器回收并释放,python的
解释器负责跟踪对象的引用计数器,垃圾收集器负责查找引用计数器等于0
的对象。它也负责哪些虽然引用计数大于0但也需要被销毁的对象。因为python
中存在特定情况会导致循环引用。
【循环引用问题】
当至少两个对象互相引用时,也就是所有的引用都消失是,这个对象的引用依然存在。
也就是说引用计数器并不能准确判断这种情况。Python的垃圾收集器实际上是一个
引用计数器和一个循环垃圾收集器。当一个对象的引用计数为0时,解释器会暂停
对该对象的跟踪。作为引用计数器的补充,垃圾回收器也会留心哪些分配总量大,
但是没有通过引用计数销毁的对象。这种情况解释器会暂停,并清理所有未引用的循环。
【总结】
CPython都是基于堆栈的虚拟机 字节码 解释型语言。
不同于Java语言的是,cpython将所有类型(基本类型和引用类型)对象都保存到堆中,
而不是像Java将基本类型保存到栈空间,将体积比较大的对象保存到堆空间。
以cpython3.6为例,使用自定义分配器管理堆,根据对象大小在堆中开辟相应的内存空间。
如果使用cpython声明一个基本类型的变量,例如:x=1,虚拟机将会为1在堆上创建对象。
每个对象包含两个部分,头部(PyObject_HEAD)和一些可变对象的特定字段。
头部对象包含两个8字节,一个是引用计数器,一个是指向对象类型的指针。
这意味着16字节是一个CPython对象大小的下限。
Cpython中的ASCII字符串对象(PyASCIIObject)使用48字节的头部,所以一个长度为
1两个字节的字符串(如a加一个空白终止符)占用50个字节;长度为10的字符串将
占用59个字节;
可变对象
在cpython中,可变对象以pyGC_HEAD结构体增加了头部。这个机构用来进行回收跟踪。
占用24个字节。总的来说,一个PyListObject长度为64字节,但同样需要为列表中的
每个对象添加指针,这些指针存储在一个数组中,并分配每个对象的存储空间。
垃圾回收
头部如何跟踪cpython对象的牢记回收可能是程序员最不容易理解的部分,cpython使用
计数器,可以很容易的追溯一个对象的引用;每当一个对象被复制,或许放入列表,插入
一个字典等等,他的计数器都会增加,而当一个引用变小,例如使用del()操作或许一个变量超出范围,计数器相应的减少。而当计数器为0是,对象将会被回收。
参考原文:
http://www.safebase.cn/portal.php?mod=view&aid=229430
【Python中堆栈】
内存中的堆栈和数据结构堆栈不是一个概念,可以说内存中的堆栈是真实存在的物理区。
内存空间在逻辑上分为三部分:代码区、静态数据区和动态数据区,动态数据区又分为栈区
和堆区。
代码区:存储方法体的二进制代码。高级调度(作业调度)、中级调度(内存调度)、低级
调度(进程调度)控制代码区执行代码的切换。
静态数据区:存储全局变量、静态变量、常量,常量包括final修饰的常量和String常量。系
统自动分配和回收。
栈区:存储运行方法的形参、局部变量、返回值。由系统自动分配和回收。
堆区:new一个对象的引用或地址存储在栈区,指向该对象存储在堆区中的真实数据。

被折叠的 条评论
为什么被折叠?



