1、Python是一门什么样的语言?
Python是一门动态解释性的强类型定义语言。
1.1、编译型语言和解释型语言
1、编译型语言
编译器将源代码(高级语言)编译成CPU可执行的代码(机器语言),程序运行前编译。
编译型语言一般用作:开发操作系统、大型应用程序、数据库系统。
编译型语言:C、C++、GO、Pascal。
2、解释性语言
解释型语言在运行的时候才翻译,翻译一句执行一句。
解释型语言一般用作:网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序。
解释型语言:JavaScript、VBScript、Perl、Python、Ruby、MATLAB 、PHP。
3、二者最大区别
对解释执行而言,程序运行时的控制权在解释器而不在用户程序;对编译执行而言,运行时的控制权在用户程序。
4、编译型vs解释型
编译型:
优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。
缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。
解释型:
优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。
缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。
1.2、动态语言和静态语言
通常我们所说的动态语言、静态语言是指动态类型语言和静态类型语言。
1、动态类型语言
声明变量时不需要指定数据类型。
动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。
2、静态类型语言
声明变量时必须指定数据类型。
静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型, C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。
1.3、强类型定义语言和弱类型定义语言
1、强类型定义语言
强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。
2、弱类型定义语言
数据类型可以被忽略的语言。它与强类型定义语言相反,一个变量可以赋不同数据类型的值。
强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误
例如:
Python是动态语言,是强类型定义语言(类型安全的语言)
VBScript是动态语言,是弱类型定义语言(类型不安全的语言)
JAVA是静态语言,是强类型定义语言(类型安全的语言)。
Shell是动态语言,是弱类型定义语言(类型不安全的语言)
1.4、高级语言和低级语言
1、低级语言
无论是机器指令还是汇编指令都是面向机器的,统称为低级语言。因为是针对特定机器的机器指令的助记符,所以汇编语言是无法独立于机器(特定的CPU体系结构)的。
2、高级语言
高级语言不依赖于机器,是指在不同的机器或平台上高级语言的程序本身不变,而通过编译器编译得到的目标代码去适应不同的机器
2、Python的优缺点
2.1、优点
- Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序。
- 开发效率非常高,Python有非常强大的第三方库,基本上你想通过计算机实现任何功能,Python官方库里都有相应的模块进行支持,直接下载调用后,在基础库的基础上再进行开发,大大降低开发周期,避免重复造轮子。
- 高级语言,当你用Python语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内存一类的底层细节
- 可移植性,由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工 作在不同平台上)。如果你小心地避免使用依赖于系统的特性,那么你的所有Python程序无需修改就几乎可以在市场上所有的系统平台上运行
- 可扩展性,如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。
- 可嵌入性,你可以把Python嵌入你的C/C++程序,从而向你的程序用户提供脚本功能。
2.2、缺点
- 速度慢,Python 的运行速度相比C语言确实慢很多,跟JAVA相比也要慢一些,因此这也是很多所谓的大牛不屑于使用Python的主要原因,但其实这里所指的运行速度慢在大多数情况下用户是无法直接感知到的,必须借助测试工具才能体现出来,比如你用C运一个程序花了0.01s,用Python是0.1s,这样C语言直接比Python快了10倍。
- 代码不能加密,因为PYTHON是解释性语言,它的源码都是以明文形式存放的,不过我不认为这算是一个缺点,如果你的项目要求源代码必须是加密的,那你一开始就不应该用Python来去实现。
- 线程不能利用多CPU问题,这是Python被人诟病最多的一个缺点。GIL即全局解释器锁(Global Interpreter Lock)是计算机程序设计语言解释器用于同步线程的工具,使得任何时刻仅有一个线程在执行。Python的线程是操作系统的原生线程。在Linux上为pthread,在Windows上为Win thread,完全由操作系统调度线程的执行。一个python解释器进程内有一条主线程,以及多条用户程序的执行线程。即使在多核CPU平台上,由于GIL的存在,所以禁止多线程的并行执行。关于这个问题的折衷解决方法,我们在以后线程和进程章节里再进行详细探讨。
3、Python解释器
当我们编写Python代码时,Python代码存放在以.py为扩展名的文本文件。要运行代码,就需要Python解释器去执行.py文件。
由于整个Python语言从规范到解释器都是开源的,所以理论上,任何人都可以编写Python解释器。事实上,确实存在多种Python解释器。
CPython
当从Python官方网站下载并安装好Python2.7后,就直接获得了一个官方版本的解释器:Cpython,这个解释器是用C语言开发的,所以叫CPython,在命令行下运行python,就是启动CPython解释器,CPython是使用最广的Python解释器。
IPython
IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的,好比很多国产浏览器虽然外观不同,但内核其实是调用了IE。
PyPy
PyPy是另一个Python解释器,它的目标是执行速度,PyPy采用JIT技术,对Python代码进行动态编译,所以可以显著提高Python代码的执行速度。
Jython
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
IronPython
IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。
4、什么是pyc?
当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject中内容写到pyc文件中
当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。(比较源文件和pyc文件的时间)
5、Python安装
1、windows下安装python
下载:https://www.python.org/downloads/
Download Windows installer (64-bit)
添加环境变量:【右键计算机】-->【属性】-->【高级系统设置】-->【高级】-->【环境变量】
-->【系统变量,Path】
2、linux上安装python
(1)安装python3编译的依赖包:
# yum install -y gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
(2)下载:# wget https://www.python.org/ftp/python/3.8.7/Python-3.8.7.tgz
(3)解压:# tar -zxvf Python-3.8.7.tgz
(4)进入源码包文件夹:# cd Python-3.8.7/
(5)创建安装目录:# mkdir /usr/local/python38
(6)编译且安装:
# ./configure --prefix=/usr/local/python38 #指定安装目录为/usr/local/python38
# make #编译,相当于把源码包里面的代码编译成linux服务器可以识别的代码
# make install #安装,编译安装,此步才会最终生成/usr/local/python38
(后两步可以合并,make && make install)
(7)添加环境变量:
# vim /etc/profile
export PATH=/usr/local/python38/bin/:$PATH
# source /etc/profile
(8)测试
# python #进入python2.7的交互窗口,exit()退出
# python3 #进入python3.8的交互窗口
6、Hello World程序
1、linux上执行python程序
示例1:
# vim hello.py
print("Hello World!")
print("麦")
# python hello.py #使用python2的解释器,python2不能直接识别中文
# python3 hello.py #使用python3的解释器,python3可以直接识别中文
示例2:
# vim hello.py
#!/usr/bin/env python3 #注意:这里是python3,如果是python将是python2的解释器
print("Hello World!")
print("麦")
# chmod u+x hello.py
# ./hello.py
2、windows上执行python程序
示例:
创建文件hello.py
print("Hello World!")
d:\>python hello.py #windows上必须使用python命令
7、注释
单行注释:#被注释内容
多行注释:"""被注释内容""" #python中单双引号的作用是一样
8、变量
1、变量名的定义规则
(1)变量名只能是字母、数字或下划线的任意组合
(2)变量名的第一个字符不能是数字
(3)变量名区分大小写
(4)以下关键字不能做为变量名
>>> import keyword
>>> print(keyword.kwlist) #查看关键字
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
2、变量命名建议
(1)驼峰式
- 变量名:如果变量名有多个单词组成,除第一个单词外其他每个单词的首字母要大写
例如:getNameOfTom
- 类名:每个单词的首字母都要大写
例如:GetNameOfTom
(2)下划线式(python推荐)
例如:get_name_of_tom
3、变量的使用
使用Python变量前必须给它赋值,因为Python变量没有默认值。
值并非存储在变量中,而是存储在变量指向的计算机内存中。多个变量可指向同一个值。
4、常量
python没有常量,但可以设置常量,常量的变量名全部大写
(是假常量,即可以修改其值的,只是尽量不要修改)
10、新函数
python基础教程(第三版)每章后面的新函数。
1、快速上手:基础知识
2、列表和元组
3、字符串
4、当索引行不通时(字典)
5、条件、循环及其他语句
6、抽象(函数)
7、再谈抽象(类)
8、异常
9、魔法方法、特性和迭代器