python介绍以及安装

1、python语言的介绍

python的创始人为Guido van Rossum(1956 -- ?),他在开发PYTHON语言之前曾使用过几年的ABC语言,ABC是一门主要用于教学目的语言(教计算机系的学生如何设计一门开发语言),Guido 在开发PYTHON时借鉴了很多ABC语言的特性,所以后来人们包括Guido自己也认为,PYTHON语言的前身就是ABC语言。

python的第一个版本实现是在MAC电脑上,一直在90年代,PYTHON的开放性、语法的简洁性大受很多程序员的喜欢,很多人拿它来快速的开发一些脚本和工具,并不断的向官方提交新的代码和第三方模块,因此PYTHON能做的事情也愈发多了起来,一些大公司像YAHOO、EBAY也开始在生产环境中使用PYTHON。到了2000年10月16号,PYTHON2.0发布了,相比之前的1.x版本,实现了完整的垃圾回收,并且支持UNICODE,同时整个开发过程更加透明,社区对PYTHON的开发进度的影响逐渐增大。从2000年第一个2.0版本发布到写本书的2015止,2.X版本最主流使用的工业版本,虽然PYTHON官方于2008年就发布了Python3.0,但由于此版本并不完全兼容之前的广泛使用的2.4版本,这导致很多基于2.4开发软件跟本无法在3.0的平台 上运行,因此3.0的推广也非常缓慢,为解决这个问题,python官方很快又推出兼容2.4和3.0两个版本的2.6,这个版本兼容了原来的2.4版本,又支持了很多3.0的特性,并且官方还开发了专门的帮助将2.x转为3.0版本的转换工具,因此,python3.0的使用才开始逐渐多了起来,不过,现在主流的工业版本依然是2.6和2.7过渡版本,因此本书主要还是围绕着2.7的版本来学习,不过同学们不用担心,因为2.7支持了非常多3.x版本的特性,等到几年后3.0版本广泛使用时,你由2.x转向3.x会像由 windows xp转向使用win 7一样简单。

2、python是一门怎么样的语言

编程语言主要从以下几个角度为进行分类,编译型和解释型、静态语言和动态语言、强类型定义语言和弱类型定义语言,每个分类代表什么意思呢,我们一起来看一下。

编译型和解释型
我们先看看编译型,其实它和汇编语言是一样的:也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码。这个过程说得专业一点,就称为编译(Compile),而负责编译的程序自然就称为编译器(Compiler)。如果我们写的程序代码都包含在一个源文件中,那么通常编译之后就会直接生成一个可执行文件,我们就可以直接运行了。但对于一个比较复杂的项目,为了方便管理,我们通常把代码分散在各个源文件中,作为不同的模块来组织。这时编译各个文件时就会生成目标文件(Object   file)而不是前面说的可执行文件。一般一个源文件的编译都会对应一个目标文件。这些目标文件里的内容基本上已经是可执行代码了,但由于只是整个项目的一部分,所以我们还不能直接运行。待所有的源文件的编译都大功告成,我们就可以最后把这些半成品的目标文件“打包”成一个可执行文件了,这个工作由另一个程序负责完成,由于此过程好像是把包含可执行代码的目标文件连接装配起来,所以又称为链接(Link),而负责链接的程序就叫……就叫链接程序(Linker)。链接程序除了链接目标文件外,可能还有各种资源,像图标文件啊、声音文件啊什么的,还要负责去除目标文件之间的冗余重复代码,等等,所以……也是挺累的。链接完成之后,一般就可以得到我们想要的可执行文件了。 

上面我们大概地介绍了编译型语言的特点,现在再看看解释型。噢,从字面上看,“编译”和“解释”的确都有“翻译”的意思,它们的区别则在于翻译的时机安排不大一样。打个比方:假如你打算阅读一本外文书,而你不知道这门外语,那么你可以找一名翻译,给他足够的时间让他从头到尾把整本书翻译好,然后把书的母语版交给你阅读;或者,你也立刻让这名翻译辅助你阅读,让他一句一句给你翻译,如果你想往回看某个章节,他也得重新给你翻译。 

两种方式,前者就相当于我们刚才所说的编译型:一次把所有的代码转换成机器语言,然后写成可执行文件;而后者就相当于我们要说的解释型:在程序运行的前一刻,还只有源程序而没有可执行程序;而程序每执行到源程序的某一条指令,则会有一个称之为解释程序的外壳程序将源代码转换成二进制代码以供执行,总言之,就是不断地解释、执行、解释、执行……所以,解释型程序是离不开解释程序的。像早期的BASIC就是一门经典的解释型语言,要执行BASIC程序,就得进入BASIC环境,然后才能加载程序源文件、运行。解释型程序中,由于程序总是以源代码的形式出现,因此只要有相应的解释器,移植几乎不成问题。编译型程序虽然源代码也可以移植,但前提是必须针对不同的系统分别进行编译,对于复杂的工程来说,的确是一件不小的时间消耗,况且很可能一些细节的地方还是要修改源代码。而且,解释型程序省却了编译的步骤,修改调试也非常方便,编辑完毕之后即可立即运行,不必像编译型程序一样每次进行小小改动都要耐心等待漫长的Compiling…Linking…这样的编译链接过程。不过凡事有利有弊,由于解释型程序是将编译的过程放到执行过程中,这就决定了解释型程序注定要比编译型慢上一大截,像几百倍的速度差距也是不足为奇的。 

编译型与解释型,两者各有利弊。前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,像C/C++、Pascal/Object   Pascal(Delphi)、VB等基本都可视为编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如Java、JavaScript、VBScript、Perl、Python等等。 

但既然编译型与解释型各有优缺点又相互对立,所以一批新兴的语言都有把两者折衷起来的趋势,例如Java语言虽然比较接近解释型语言的特征,但在执行之前已经预先进行一次预编译,生成的代码是介于机器码和Java源代码之间的中介代码,运行的时候则由JVM(Java的虚拟机平台,可视为解释器)解释执行。它既保留了源代码的高抽象、可移植的特点,又已经完成了对源代码的大部分预编译工作,所以执行起来比“纯解释型”程序要快许多。而像VB6(或者以前版本)、C#这样的语言,虽然表面上看生成的是.exe可执行程序文件,但VB6编译之后实际生成的也是一种中介码,只不过编译器在前面安插了一段自动调用某个外部解释器的代码(该解释程序独立于用户编写的程序,存放于系统的某个DLL文件中,所有以VB6编译生成的可执行程序都要用到它),以解释执行实际的程序体。C#(以及其它.net的语言编译器)则是生成.net目标代码,实际执行时则由.net解释系统(就像JVM一样,也是一个虚拟机平台)进行执行。当然.net目标代码已经相当“低级”,比较接近机器语言了,所以仍将其视为编译语言,而且其可移植程度也没有Java号称的这么强大,Java号称是“一次编译,到处执行”,而.net则是“一次编码,到处编译”。呵呵,当然这些都是题外话了。总之,随着设计技术与硬件的不断发展,编译型与解释型两种方式的界限正在不断变得模糊。

动态语言和静态语言
通常我们所说的动态语言、静态语言是指动态类型语言和静态类型语言。

(1)动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。

(2)静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。

对于动态语言与静态语言的区分,套用一句流行的话就是:Static typing when possible, dynamic typing when needed。

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

(1)强类型定义语言:强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。

(2)弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。

强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。另外,“这门语言是不是动态语言”与“这门语言是否类型安全”之间是完全没有联系的!
例如:Python是动态语言,是强类型定义语言(类型安全的语言); VBScript是动态语言,是弱类型定义语言(类型不安全的语言); JAVA是静态语言,是强类型定义语言(类型安全的语言)。

通过上面这些介绍,我们可以得出,python是一门动态解释性的强类型定义语言。那这些基因使成就了Python的哪些优缺点呢?我们继续往下看。

3、python能做什么

Python是一门综合性的语言,你几乎能在计算机上通过Python做任何事情,以下是Python应该最广泛的几个方面

  1. 网络应用:包括web网站 、服务器后台服务等,在这方面Python有优秀的web框架如DjangoTornadoFlask等,网络服务框架有著名的Twisted,异步通信有牛X的eventlet.
  2. 科学运算:随着NumPy、SciPy、matplotlib、ETS等众多程序库的开发,Python越来越适合于做科学计算。与科学计算领域最流行的商业软件MATLAB相比,Python是一门真正的通用程序设计语言,比MATLAB所采用的脚本语言的应用范围更广泛,有更多程序库的支持,适用于Windows和Linux等多种平台,完全免费并且开放源码。虽然MATLAB中的某些高级功能目前还无法替代,但是对于基础性、前瞻性的科研工作和应用系统的开发,完全可以用Python来完成。
  3. GUI程序:python提供了多个图形开发界面的库,包括PyQt,WxPython,自带的有Tkinter,这些库允许Python程序员很方便的创建完整的、功能健全的GUI用户界面。
  4. 系统管理工具:Python可以是做运维人员最喜欢用的语言了,可以用它来轻松的开发自动化管理工具、监控程序等,事实上现在很多开源软件也都是用Python开发的,如用于IT配置管理的SaltStackAnsible, 做虚拟化的OpenStack,做备份用的Bacula等。
  5. 其它程序:你知道吗?Python 用来写爬虫也是很拿手的,还有做游戏,之前看社区里有个哥们花了不到300行代码就实现了《愤怒的小鸟》的游戏,还可以用来做嵌入式开发、做驱动程序等,总之,Python能做的事情还是非常多的,好好学吧,很快你就会fall in love with this great language

4、python的优缺点

先看优点

  1. Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序。
  2. 开发效率非常高,Python有非常强大的第三方库,基本上你想通过计算机实现任何功能,Python官方库里都有相应的模块进行支持,直接下载调用后,在基础库的基础上再进行开发,大大降低开发周期,避免重复造轮子。
  3. 高级语言————当你用Python语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内存一类的底层细节
  4. 可移植性————由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工 作在不同平台上)。如果你小心地避免使用依赖于系统的特性,那么你的所有Python程序无需修改就几乎可以在市场上所有的系统平台上运行
  5. 可扩展性————如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。
  6. 可嵌入性————你可以把Python嵌入你的C/C++程序,从而向你的程序用户提供脚本功能。

再看缺点:

  1. 速度慢,Python 的运行速度相比C语言确实慢很多,跟JAVA相比也要慢一些,因此这也是很多所谓的大牛不屑于使用Python的主要原因,但其实这里所指的运行速度慢在大多数情况下用户是无法直接感知到的,必须借助测试工具才能体现出来,比如你用C运一个程序花了0.1s,用Python是0.01s,这样C语言直接比Python快了10s,算是非常夸张了,但是你是无法直接通过肉眼感知的,因为一个正常人所能感知的时间最小单位是0.15-0.4s左右,哈哈。其实在大多数情况下Python已经完全可以满足你对程序速度的要求,除非你要写对速度要求极高的搜索引擎等,这种情况下,当然还是建议你用C去实现的。
  2. 代码不能加密,因为PYTHON是解释性语言,它的源码都是以名文形式存放的,不过我不认为这算是一个缺点,如果你的项目要求源代码必须是加密的,那你一开始就不应该用Python来去实现。
  3. 线程不能利用多CPU问题,这是Python被人诟病最多的一个缺点,GIL即全局解释器锁(Global Interpreter Lock),是计算机程序设计语言解释器用于同步线程的工具,使得任何时刻仅有一个线程在执行,Python的线程是操作系统的原生线程。在Linux上为pthread,在Windows上为Win thread,完全由操作系统调度线程的执行。一个python解释器进程内有一条主线程,以及多条用户程序的执行线程。即使在多核CPU平台上,由于GIL的存在,所以禁止多线程的并行执行。关于这个问题的折衷解决方法,我们在以后线程和进程章节里再进行详细探讨。

5、python的安装

安装在OS上:

执行操作:写一个文件中按照python的规则写,将文件交给python软件,读写文件中的内容,然后进行转换及执行,最终获取结果

python软件-->python解释器(内存管理,不用的内存使用垃圾回收机制进行回收)

下载:

python3:在继续更新

python2:在继续向python3更新

6、python的解释器

当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件。要运行代码,就需要Python解释器去执行.py文件。

由于整个Python语言从规范到解释器都是开源的,所以理论上,只要水平够高,任何人都可以编写Python解释器来执行Python代码(当然难度很大)。事实上,确实存在多种Python解释器。

CPython

当我们从Python官方网站下载并安装好Python 2.7后,我们就直接获得了一个官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。

CPython是使用最广的Python解释器。教程的所有代码也都在CPython下执行。

IPython

IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的。好比很多国产浏览器虽然外观不同,但内核其实都是调用了IE。

CPython用>>>作为提示符,而IPython用In [序号]:作为提示符。

PyPy

PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度。

绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。如果你的代码要放到PyPy下执行,就需要了解PyPy和CPython的不同点

Jython

Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。

IronPython

IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。

小结

Python的解释器很多,但使用最广泛的还是CPython。如果要和Java或.Net平台交互,最好的办法不是用Jython或IronPython,而是通过网络调用来交互,确保各程序之间的独立性。

7、python脚本

1、所有的Python程序的命名规范都应该以.py结尾,只有这样,别人才能一看你的文件后缀名就知道这是个Python程序。

2、在程序的第一行声明要使用的解释器类型,这句话等于是告诉操作系统要用什么解释器来解释这个程序。写代码的时候一般都建议加上这句,但有的同学说,我不加这句的话,这个程序也是可以运行的唉,没错,如果你不加这句声明,你直接执行python myFirstPyProgram.py 也是可以执行的,这是因为你调用该程序时就已经明确的告诉操作系统要用python来解释这个代码,所以不会出错,但是如果你把myFirstPyProgram.py加上可执行权限,并且把代码的第一行声明去掉,再来执行的话,就会报错了,看下面:

所以,如果确定你的程序会变成可执行文件被调用的话,那么务必要加上解释器声明

3、用print 语法将后面的字符串打印到屏幕上,和shell脚本的echo、java和c的printf是一个意思噢。

写个猜年龄的小程序

刚才我们写了学习任何一门语言都要先写的仪式感很强的HelloWorld程序,感觉是不是有点太简单了?哈,那我们做一个稍微深入点的,需求如下:

我们在程序中先给一个人定义好年龄,然后让用户去猜测,用户输入他猜测的数字后,我们再来判断他猜测的是否正确。 

好的,我先来直接上代码:

1、先定义一个正确答案的变量,那什么是变量呢?变量就可变的量啊,就是我们先在内存里开辟一块空间,并给这块空间赋一个名称就是变量名,后面的29呢就是我们往这个空间里存的数据啦,以后我们想再调用这个数据的话,直接通过这个变量名就可以找到了哈。

2、首先看3所指向的raw_input(“Please input your guess num:”),这句代码在执行的时候会在屏幕上弹出“Please input your guess num:”并等待着用户输入,你不输入它可就一直在那等着呀,等你到天荒地老,但我们的需求是要求用户输入一个数字,并拿这个数字跟我前面定义的right_age_num变量进行对比,所以,在这里你输入了个数字后,计算机得把它先存到内存,然后才能再跟之前定义的right_age_num变量做对比,因此,我在这里把用户输入的值赋值给了变量usre_guess_num. 好,这里明白了之后,我们再来看2所指向的int(),这是个啥意思呢?这是python的内置函数(函数是什么现在你不需要了解),它做的事情就是把用户输入的值转成int类型,int就是指整数类型,这样我们才能进行2个数字之前的对比呀?那你可能要问了,我刚才明明是已经输入了数字了呀,为什么还要多此一举再转换一次呢?呵呵,这里要注意的是,raw_input()这个函数默认都会把接收到的用户输入变成字符串,无论你输入的是不是数字,都统统当成字符串来处理啦,所以我们这里需要转换一下。好的,如果这里还不明白,就先假装懂了,我们稍后再讲数据类型的时候你就彻底明白了。

3、这个if else 是啥意思呢,其实就是最简单的条件判断,如果if 后面的 条件成立,就执行它下面作用域中的代码,如果不成立呢,就执行else后面的代码。也就是,要么就执行if 作用域下的代码,要么就执行else作用域下的代码,反正绝对不会出现这两个作用域同时执行的情况。那么哪些才算是if 的作用域呢?瞪大眼睛看到4指向的:号没有,再往下一行就直接换行了,并且缩进了2格又开始了print代码,那这一行的print 就算是if 的作用域喽。这里要引出的概念你要消化下,就是python是强制缩进的,啥意思?就是指你每开始一个新的作用域,都要进行一次强制缩进,并且同一级别的作用域的代码缩进还必须要保持一致,不能这一行缩进2空格,下一行还是跟我同一级别的代码却缩进了4个空格,这样会报错。如果你写过其它的语言就会发现大多数语言都不要求强制缩进,只有python这么干,这么干其实也是Guido的一片苦心,通过强制缩进,你能很清晰的看轻整个程序的逻辑层次,保证了语言的简洁和明确性,也就是说,Python 是通过缩进来区分作用域的。没关系,写的多了你就习惯了,这里有聪明的同学要问了,其它的语言不用缩进的话,那是如何区分作用域的呢?Good question, 其它语言是通过起始和关闭符来确定一个作用域的开始和结束的,比如下的面JavaScript代码:

if (var1 == var2 ){

  console.log(‘yes,var1 equals to var2’);

}else{

    alert(‘no ,they are not equal.’);

}

看到上面的那么多大括号了么,没错,就是通过大括号来确定作用域的,所以他们不强制缩进。

1、再来看5指向的是一个逗号,代表要同时打印多个值,输出时会用空格将2个值分开显示。

2、6指向的也是:号,代表开始一个新的作用域,噢,刚才忘记说了,你发现没有,python 是只有作用域的起始标志冒号,但却没有关闭符对不对?没错,Python只能通过缩进来确定作用域是否关闭了,So,写代码的时候一定不要犯缩进错误噢。

原文地址:https://www.cnblogs.com/Yangyl00/p/10183488.html