1、python创世人:吉多.范罗苏姆
2、TIOBE排行榜
python的发展趋势,应用领域,使用的公司
由上图可见,Python整体呈现上升趋势,反映出Python应用越来越广泛并且也得到了行业内的认可。
Python的应用领域众多,如数据分析、组件集成、网络服务、图像处理、数值和科学计算等众多领域。
目前业内几乎所有大中型互联网企业都在使用Python,如:Youtub、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo、Fackbook、NASA、百度、腾讯、汽车之家、美团等
3、python的发展历程:
Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC 语言的一种继承。之所以选中Python(大蟒蛇的意思)作为该编程语言的名字,是因为他是一个叫Monty Python的喜剧团体的爱好者。
4、python是一门解释型语言
5、解释型、编译型、混合型语言常用的有那些:
编译型:
C、C++、GO、Swift、Object-C、Pascal
解释型:
JavaScript、Python、Ruby、PHP、Perl、Erlang
混合型:
JAVA、C#
6、解释型、编译型之间的优缺点
编译型:执行效率高、移植性查
优点:
1、编译器会对代码进行优化
2、编译只做一次,运行时不需要再编译
2、可以脱离语言环境独立运行
缺点:
1、编译后的代码,如果需要修改,就需要对整个模块进行重新编译
2、编译时会根据对应的运行环境生产机器码,不同的操作系统之间移植就会存在问题,需要根据运行的操作系统环境编译不同的可执行文件
解释型:良好的兼容性、灵活
优点:
1、良好的平台兼容性,在任何环境中都可以运行,前提是在安装了解释器(虚拟机)
2、灵活,可以直接进行代码修改,不用停机维护
3、部署速度快
缺点:
1、每次运行的时候都需要解释一遍,性能上不如编译型语言
7、动态类型言语、静态类型语言
1、动态类型语言
动态类型语言是指运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编译时,不需要给任何便利指定数据类型,该语言会在第一次赋值给变量时,在内部将数据类型记录下来
Python和Ruby是一种典型的动态类型语言,其他的各种脚本语言如VBSCript多少也属于动态类型语言
2、静态类型语言
静态类型语言与动态类型语言相反,它的数据类型是在编译期间检查的,也就是说,在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等
8、强类型定义语言、弱类型定义语言
1、强类型定义语言
强制数据类型定义的语言,变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型
2、弱类型定义语言
弱类型定义语言的数据类型可以被忽略,它与强类型定义语言相反,一个变量可以赋不同数据类型的值
强类型定义语言在速度上可能稍微逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误
Python是动态语言,强类型定义语言:解释性的强类型语语言
VBScript是动态语言,弱类型定义语言
JAVA是静态语言,强类型定义语言
9、Python的优缺点
优点:
1、Python的定位是"优雅"、"明确"、"简单",所有Python程序看上去总是简单易懂,Python,入门容易,深入下去也可以编写那些非常复杂的程序
2、开发效率高,Python有非常强大的第三方库,大大降低开发周期,避免重复造轮子
3、高级语言————当你编写Python程序时,无需考虑诸如如何管理你的程序使用的内存一类的底层细节
4、可移植性————由于它开源的本质,Python已经被移植在许多平台上。如果小心避免使用依赖于系统的特性,那么你的所有Python程序无需修改就几乎可以在市场上的所有平台上运行
5、可扩展性————如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们
6、可嵌入性———— 可以把Python嵌入C/C++程序,从而向程序用户提供脚本功能
缺点:
1、运行速度慢:Python的运行速度相比C语言确实慢很多,比JAVA也要慢一些,因此很多所谓的大牛不屑使用Python的主要原因,但其实这里所指的运行速度慢大多数情况下用户是无法直接感知到的,必须借组于测试工具才能体现出来,比如你用C运行一个程序花了0.01s,用Pyhon是0.1s,这也C语言直接比Python快了10倍,算是非常夸张的了,但是你是无法直接通过肉眼感知的,因为一个正常人所能感知的时间最小单位是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的存在,所以禁止多线程的并行执行。关于这个问题的折中解决方法,我们在以后线程和进程章节里再进行详细探讨
当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件。要运行代码,就需要Python解释器去执行.py文件
由于整个Python语言从规范到解释器都是开源的,所以理论上只有水平够高,任何人都可以编写Python解释器
10、Python的种类
CPython:这个解释器是C语言开发的,所以叫CPython,CPython是使用最广的Python的解释器
IPython:是基于CPython之上的一个交互解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的。好比很多国产的浏览器虽然外观不同,但是内核其实都是调用了IE
注意:CPython用>>>作为提示符,IPython 用In [序号]: 作为提示符
PyPy:是Python的解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意:不是解释),所以可以显著提高Python代码的执行速度
注意:绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些不同,这会导致相同的Python代码在两种解释器下执行可能会有不同的结果。如果你的代码放到PyPy下执行,需要了解PyPy和CPython的不同点
Jython:是在JAVA平台上的Python解释器,可以直接把Python代码编译成JAVA字节码执行
IronPython:和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码
小结:Python的解释器很多,但使用最广泛的还是CPython。如果要和JAVA或.Net平台交互,最好的办法不是用Jython或IronPython,而是通过网络调用来交互,确保各个程序之间的独立性
11、Python基础初始
1、运行Python代码
在H盘下创建一个 firstPython.py文件内容是:print('Hello World!')
打开windows命令行输入cmd,确定后,写入代码python H:firstPython.py
您已经运行了第一个python程序, 即:终端---->cmd-----> python 文件路径(python H:firstPython.py)。 回车搞定~
2、解释器
上一步中执行python H:firstPython.py 时,明确的指出firstPython.py脚本由python解释器来执行
如果想要类似于执行shell脚本一样执行python脚本,列:./firstPython.py,那么就需要在firstPython.py文件的头部指定解释器,代码如下:
#!/usr/bin/env python
print('Hello World!')
如此一来,执行:windows:H:firstPython.py ,Linux:./firstPython.py 即可
PS:Linux 执行前需要给予 firstPython.py执行权限,chmod 755 ./firstPython.py
12、内容编码
1、Python2解释器在加载.py 文件中代码时,会对内容进行编码(默认 ascill ),而Python3对内容进行编码的默认:utf-8
2、ASCII(American Standard Code for Information Inerchange,美国标准信息交换代码) 是基于拉丁字母的一套电脑编码系统,主要于显示现代英语和其他西欧语言,最多用8位来表示一个字节,即:2**8 = 256,所以,ASCII码最多只能表示256个符号。
Bin(二进制)
|
Oct(八进制) |
Dec(十进制)
|
Hex(十六进制)
|
缩写/字符
|
解释
|
0000 0000
|
0
|
0
|
00
|
NUL(null)
|
空字符
|
0000 0001
|
1
|
1
|
01
|
SOH(start of headline)
|
标题开始
|
0000 0010
|
2
|
2
|
02
|
STX (start of text)
|
正文开始
|
0000 0011
|
3
|
3
|
03
|
ETX (end of text)
|
正文结束
|
0000 0100
|
4
|
4
|
04
|
EOT (end of transmission)
|
传输结束
|
0000 0101
|
5
|
5
|
05
|
ENQ (enquiry)
|
请求
|
0000 0110
|
6
|
6
|
06
|
ACK (acknowledge)
|
收到通知
|
0000 0111
|
7
|
7
|
07
|
BEL (bell)
|
响铃
|
0000 1000
|
10
|
8
|
08
|
BS (backspace)
|
退格
|
0000 1001
|
11
|
9
|
09
|
HT (horizontal tab)
|
水平制表符
|
0000 1010
|
12
|
10
|
0A
|
LF (NL line feed, new line)
|
换行键
|
0000 1011
|
13
|
11
|
0B
|
VT (vertical tab)
|
垂直制表符
|
0000 1100
|
14
|
12
|
0C
|
FF (NP form feed, new page)
|
换页键
|
0000 1101
|
15
|
13
|
0D
|
CR (carriage return)
|
回车键
|
0000 1110
|
16
|
14
|
0E
|
SO (shift out)
|
不用切换
|
0000 1111
|
17
|
15
|
0F
|
SI (shift in)
|
启用切换
|
0001 0000
|
20
|
16
|
10
|
DLE (data link escape)
|
数据链路转义
|
0001 0001
|
21
|
17
|
11
|
DC1 (device control 1)
|
设备控制1
|
0001 0010
|
22
|
18
|
12
|
DC2 (device control 2)
|
设备控制2
|
0001 0011
|
23
|
19
|
13
|
DC3 (device control 3)
|
设备控制3
|
0001 0100
|
24
|
20
|
14
|
DC4 (device control 4)
|
设备控制4
|
0001 0101
|
25
|
21
|
15
|
NAK (negative acknowledge)
|
拒绝接收
|
0001 0110
|
26
|
22
|
16
|
SYN (synchronous idle)
|
同步空闲
|
0001 0111
|
27
|
23
|
17
|
ETB (end of trans. block)
|
结束传输块
|
0001 1000
|
30
|
24
|
18
|
CAN (cancel)
|
取消
|
0001 1001
|
31
|
25
|
19
|
EM (end of medium)
|
媒介结束
|
0001 1010
|
32
|
26
|
1A
|
SUB (substitute)
|
代替
|
0001 1011
|
33
|
27
|
1B
|
ESC (escape)
|
换码(溢出)
|
0001 1100
|
34
|
28
|
1C
|
FS (file separator)
|
文件分隔符
|
0001 1101
|
35
|
29
|
1D
|
GS (group separator)
|
分组符
|
0001 1110
|
36
|
30
|
1E
|
RS (record separator)
|
记录分隔符
|
0001 1111
|
37
|
31
|
1F
|
US (unit separator)
|
单元分隔符
|
0010 0000
|
40
|
32
|
20
|
(space)
|
空格
|
0010 0001
|
41
|
33
|
21
|
!
|
叹号 |
0010 0010
|
42
|
34
|
22
|
"
|
双引号 |
0010 0011
|
43
|
35
|
23
|
#
|
井号 |
0010 0100
|
44
|
36
|
24
|
$
|
美元符 |
0010 0101
|
45
|
37
|
25
|
%
|
百分号 |
0010 0110
|
46
|
38
|
26
|
&
|
和号 |
0010 0111
|
47
|
39
|
27
|
'
|
闭单引号 |
0010 1000
|
50
|
40
|
28
|
(
|
开括号
|
0010 1001
|
51
|
41
|
29
|
)
|
闭括号
|
0010 1010
|
52
|
42
|
2A
|
*
|
星号 |
0010 1011
|
53
|
43
|
2B
|
+
|
加号 |
0010 1100
|
54
|
44
|
2C
|
,
|
逗号 |
0010 1101
|
55
|
45
|
2D
|
-
|
减号/破折号 |
0010 1110
|
56
|
46
|
2E
|
.
|
句号 |
00101111
|
57
|
47
|
2F
|
/
|
斜杠 |
00110000
|
60
|
48
|
30
|
0
|
数字0 |
00110001
|
61
|
49
|
31
|
1
|
数字1 |
00110010
|
62
|
50
|
32
|
2
|
数字2 |
00110011
|
63
|
51
|
33
|
3
|
数字3 |
00110100
|
64
|
52
|
34
|
4
|
数字4 |
00110101
|
65
|
53
|
35
|
5
|
数字5 |
00110110
|
66
|
54
|
36
|
6
|
数字6 |
00110111
|
67
|
55
|
37
|
7
|
数字7 |
00111000
|
70
|
56
|
38
|
8
|
数字8 |
00111001
|
71
|
57
|
39
|
9
|
数字9 |
00111010
|
72
|
58
|
3A
|
:
|
冒号 |
00111011
|
73
|
59
|
3B
|
;
|
分号 |
00111100
|
74
|
60
|
3C
|
<
|
小于 |
00111101
|
75
|
61
|
3D
|
=
|
等号 |
00111110
|
76
|
62
|
3E
|
>
|
大于 |
00111111
|
77
|
63
|
3F
|
?
|
问号 |
01000000
|
100
|
64
|
40
|
@
|
电子邮件符号 |
01000001
|
101
|
65
|
41
|
A
|
大写字母A |
01000010
|
102
|
66
|
42
|
B
|
大写字母B |
01000011
|
103
|
67
|
43
|
C
|
大写字母C |
01000100
|
104
|
68
|
44
|
D
|
大写字母D |
01000101
|
105
|
69
|
45
|
E
|
大写字母E |
01000110
|
106
|
70
|
46
|
F
|
大写字母F |
01000111
|
107
|
71
|
47
|
G
|
大写字母G |
01001000
|
110
|
72
|
48
|
H
|
大写字母H |
01001001
|
111
|
73
|
49
|
I
|
大写字母I |
01001010
|
112
|
74
|
4A
|
J
|
大写字母J |
01001011
|
113
|
75
|
4B
|
K
|
大写字母K |
01001100
|
114
|
76
|
4C
|
L
|
大写字母L |
01001101
|
115
|
77
|
4D
|
M
|
大写字母M |
01001110
|
116
|
78
|
4E
|
N
|
大写字母N |
01001111
|
117
|
79
|
4F
|
O
|
大写字母O |
01010000
|
120
|
80
|
50
|
P
|
大写字母P |
01010001
|
121
|
81
|
51
|
Q
|
大写字母Q |
01010010
|
122
|
82
|
52
|
R
|
大写字母R |
01010011
|
123
|
83
|
53
|
S
|
大写字母S |
01010100
|
124
|
84
|
54
|
T
|
大写字母T |
01010101
|
125
|
85
|
55
|
U
|
大写字母U |
01010110
|
126
|
86
|
56
|
V
|
大写字母V |
01010111
|
127
|
87
|
57
|
W
|
大写字母W |
01011000
|
130
|
88
|
58
|
X
|
大写字母X |
01011001
|
131
|
89
|
59
|
Y
|
大写字母Y |
01011010
|
132
|
90
|
5A
|
Z
|
大写字母Z |
01011011
|
133
|
91
|
5B
|
[
|
开方括号 |
01011100
|
134
|
92
|
5C
|
\
|
反斜杠 |
01011101
|
135
|
93
|
5D
|
]
|
闭方括号 |
01011110
|
136
|
94
|
5E
|
^
|
脱字符 |
01011111
|
137
|
95
|
5F
|
_
|
下划线 |
01100000
|
140
|
96
|
60
|
`
|
开单引号 |
01100001
|
141
|
97
|
61
|
a
|
小写字母a |
01100010
|
142
|
98
|
62
|
b
|
小写字母b |
01100011
|
143
|
99
|
63
|
c
|
小写字母c |
01100100
|
144
|
100
|
64
|
d
|
小写字母d |
01100101
|
145
|
101
|
65
|
e
|
小写字母e |
01100110
|
146
|
102
|
66
|
f
|
小写字母f |
01100111
|
147
|
103
|
67
|
g
|
小写字母g |
01101000
|
150
|
104
|
68
|
h
|
小写字母h |
01101001
|
151
|
105
|
69
|
i
|
小写字母i |
01101010
|
152
|
106
|
6A
|
j
|
小写字母j |
01101011
|
153
|
107
|
6B
|
k
|
小写字母k |
01101100
|
154
|
108
|
6C
|
l
|
小写字母l |
01101101
|
155
|
109
|
6D
|
m
|
小写字母m |
01101110
|
156
|
110
|
6E
|
n
|
小写字母n |
01101111
|
157
|
111
|
6F
|
o
|
小写字母o |
01110000
|
160
|
112
|
70
|
p
|
小写字母p |
01110001
|
161
|
113
|
71
|
q
|
小写字母q |
01110010
|
162
|
114
|
72
|
r
|
小写字母r |
01110011
|
163
|
115
|
73
|
s
|
小写字母s |
01110100
|
164
|
116
|
74
|
t
|
小写字母t |
01110101
|
165
|
117
|
75
|
u
|
小写字母u |
01110110
|
166
|
118
|
76
|
v
|
小写字母v |
01110111
|
167
|
119
|
77
|
w
|
小写字母w |
01111000
|
170
|
120
|
78
|
x
|
小写字母x |
01111001
|
171
|
121
|
79
|
y
|
小写字母y |
01111010
|
172
|
122
|
7A
|
z
|
小写字母z |
01111011
|
173
|
123
|
7B
|
{
|
开花括号 |
01111100
|
174
|
124
|
7C
|
|
|
垂线 |
01111101
|
175
|
125
|
7D
|
}
|
闭花括号 |
01111110
|
176
|
126
|
7E
|
~
|
波浪号 |
01111111
|
177
|
127
|
7F
|
DEL (delete)
|
删除
|
显然ASCII码无法将世界上的各种文字和符号全部表示,所以,就需要新出一种可以代表所有字符和符号的编码,即:Unicode
Unicode:(统一码,万国码,单一码)是一种在计算机上使用的字符编码。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言的每个字符设定了统一并且唯一的二进制编码,规定定虽有的字符和符号最少由16为来表示(2个字节),即:2 **16 = 65536
注:此处说的的是最少2个字节,可能更多
UTF-8,是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行分类:ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存...
python2解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill),如果是如下代码的话:
#!/usr/bin/env python
print('你好 世界!')
报错:ascii码无法表示中文
改正:应该显示的告诉python解释器,用什么编码来执行源代码,即:
#!/usr/bin/env python
# -*- coding : utf-8 -*-
print('你好 世界!')
python3解释器默认编码utf-8,中文不会报错:
#!/usr/bin/env python
print('你好 世界!')
13、注释
单行注释:# 被注释的内容
多行注释:"""被注释内容""",'''被注释内容'''
14、变量
变量:把程序运行的中间结果临时的存在内存里,以便后续的代码调用
声明变量:name = "tail"
变量的作用:呢称,其代指向内存里某个地址中保存的内容
变量定义的规则:
变量名只能是 字母、数字、下划线的任意组合,变量名不能以数字开头
以下关键字不能声明为变量:
['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lamdba', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yeild']
变量的定义要具有可描述性
推荐定义方式
#驼峰体:AgeOfOldboy = 56
#下划线:age_of_oldboy = 56
变量的赋值:test1 = 56 test2 = 56 test3 = 57
定义变量不好的方式:
变量名为中文、拼音,变量名过长,变量名词不达意
15、常量
常量:指不变的量,如pai 3.1415926...,或在程序运行过程中不会改变的量
常量命名规则:AGE_OF_OLDBOY = 56