Python之路【第一篇】:Python简介和入门

Python 简介

Python 前世今生

1989年,吉多·范罗苏姆(Guido van Rossum)为了打发圣诞节假期,决心开发一种新的语言,作为 ABC 语言的一种继承。这种语言能够像 C 语言那样,能够全面调用计算机的功能接口,又可以像 shell 那样,可以轻松的编程。Python 这个名字 来自Guido 所挚爱的电视剧 Monty Python‘s Flying Cirus。

● 1991年,第一个 Python 编译器诞生。它是用 C 语言实现的,并能够调用 C 语言的库文件。从一出生,Python 已经具有了:类,函数,异常处理,包含表和词典在内的核心数据类型,以及模块为基础的拓展系统。

● Granddaddy of Python web frameworks,Zope 1 was released in 1999

● Python 1.0 - January 1994 增加了 lambada,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

In November 2014 , it was announced that Python 2.7 would be supported until 2020 , and reaffirmed that there would be no 2.8 release as users were expected to move to Python 3.4+ as soon as possible

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

最新的TIOBE排行榜,Python赶超PHP占据第五!!!

由上图可见,Python整体呈上升趋势,反映出Python应用越来越广泛并且也逐渐得到业内的认可!!!

Python 可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用 Python,如:Youtube、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、 NASA、百度、腾讯、汽车之家、美团等。互联网公司广泛使用Python来做的事一般有:自动化运维自动化测试大数据分析、爬虫、Web 等。

Web Programming : DiangoPyramidBottleTornadoFlaskweb2py

GUI Devlopment:wxPythontklnterPyGtkPyGObjectPyQt

Scientific and Numeric:SciPyPandasIPython

Software Development:BuildbotTracRoundup

System Administration:AnsibleSaltOpenStack

Python 与其它语言对比

C 和 Python、Java、C#等    C语言: 代码编译得到 机器码 ,机器码在处理器上直接执行,每一条指令控制CPU工作
其他语言: 代码编译得到 字节码 ,虚拟机执行字节码并转换成机器码再后在处理器上执行
Python 和 C  Python这门语言是由C开发而来
  对于使用:Python的类库齐全并且使用简洁,如果要实现同样的功能,Python 10行代码可以解决,C可能就需要100行甚至更多.
  对于速度:Python的运行速度相较与C,绝逼是慢了
Python 和 Java、C#等
  对于使用:Linux原装Python,其他语言没有;以上几门语言都有非常丰富的类库支持
  对于速度:Python在速度上可能稍显逊色
所以,Python和其他语言没有什么本质区别,其他区别在于:擅长某领域、人才丰富、先入为主。

Python的种类

  • Cpython
        Python 的官方版本,使用C语言实现,使用最为广泛,CPython 实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在 Python 虚拟机上。如果再次运行时,会优先寻找字节码文件,若源码文件被修改,则会再次编译成字节码。
  • Jyhton
        Python 的 Java 实现,不仅提供Python的库,同时也提供所有的Java类。能运行在任何可兼容的Java1.1或更高的Java虚拟机平台上。Jython会将Python代码动态编译成Java字节码,然后在JVM上运行。由于最终执行会编译成java字节码,所以对Java类无缝存取,对于与Java语言的交互效率极高。
  • IronPython
        Python 的 C# 实现,由Jython的创始人创造,IronPython 将 Python 代码编译成 C# 字节码,然后在 CLR 上运行。(与 Jython 类似)
  • PyPy(特殊)
        Python 实现的 Python,准确得说应该是用 rPython 实现的 Python,rPython 是 Python 的一个子集,虽然 rPython 不是完整的 Python,但用 rPython 写的这个 Python 实现却是可以解释完整的 Python 语言。将 Python 的字节码再编译成机器码。
  • RubyPython、Brython ...

以上除PyPy之外,其他的Python的对应关系和执行流程如下:

 

PyPy,在Python的基础上对Python的字节码进一步处理,从而提升执行速度!

Python 环境

windows:
1、下载安装包
https://www.python.org/downloads/
2、安装
默认安装路径:C:\python27
3、配置环境变量
【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【Python安装目录追加到变值值中,用 ; 分割】
如:原来的值;C:\python27,切记前面有分号,或在命令提示框中(cmd) : 输入 

path=%path%;C:\Python27

linux:

无需安装,预装 Python 环境,可以直接使用

更新Python

windows:

  卸载重装即可。

linux:
Linux 的 yum 依赖自带 Python,为防止错误,此处更新其实就是再安装一个 Python。

查看默认 Python 版本
python -V

1、安装 gcc,用于编译 Python 源码
    yum install gcc
2、下载源码包,https://www.python.org/ftp/python/
3、解压并进入源码文件
4、编译安装
    ./configure
    make all
    make install
5、查看版本
    /usr/local/bin/python2.7 -V
6、修改默认Python版本
    mv /usr/bin/python /usr/bin/python2.6
    ln -s /usr/local/bin/python2.7 /usr/bin/python
7、防止yum执行异常,修改yum使用的Python版本
    vi /usr/bin/yum
  将头部 #!/usr/bin/python 修改为 #!/usr/bin/python2.6

Python 环境变量

下面几个重要的环境变量,它应用于 Python:

变量名描述

PYTHONPATH

PYTHONPATH 是 Python 搜索路径,默认我们import的模块都会从 PYTHONPATH 里面寻找。
PYTHONSTARTUPPython 启动后,先寻找 PYTHONSTARTUP 环境变量,然后执行此文件中变量指定的执行代码。
PYTHONCASEOK加入 PYTHONCASEOK 的环境变量, 就会使 python 导入模块的时候不区分大小写.
PYTHONHOME另一种模块搜索路径。它通常内嵌于的 PYTHONSTARTUP 或 PYTHONPATH 目录中,使得两个模块库更容易切

以下为 Python 命令行参数:

选项描述
-d在解析时显示调试信息
-O生成优化代码 ( .pyo 文件 )
-S启动时不引入查找Python路径的位置
-V输出Python版本号
-X从 1.6版本之后基于内建的异常(仅仅用于字符串)已过时。
-c cmd执行 Python 脚本,并将运行结果作为 cmd 字符串。
file在给定的python文件执行python脚本。

Python 入门

一、第一句Python代码

在当前 home 目录下创建 hello.py 文件,内容如下:

print "hello,world

执行 hello.py 文件,即: python hello.py

python内部执行过程如下:

二、解释器

上一步中执行 python hello.py 时,明确的指出 hello.py 脚本由 python 解释器来执行。

如果想要类似于执行shell脚本一样执行python脚本,例: ./hello.py ,那么就需要在 hello.py 文件的头部指定解释器,如下:

#!/usr/bin/env python
 
print "hello,world"

如此一来,执行: ./hello.py 即可。

ps:执行前需给予 hello.py 执行权限,chmod 755 hello.py

三、内容编码

python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill)

ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号。

其中:
0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),

  如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;

  通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;

  ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。

  它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。

标准I表

32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字,65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

Bin
Dec
Hex
缩写/字符
解释
0000 0000
0
00
NUL(null)
空字符
0000 0001
1
01
SOH(start of headline)
标题开始
0000 0010
2
02
STX (start of text)
正文开始
0000 0011
3
03
ETX (end of text)
正文结束
0000 0100
4
04
EOT (end of transmission)
传输结束
0000 0101
5
05
ENQ (enquiry)
请求
0000 0110
6
06
ACK (acknowledge)
收到通知
0000 0111
7
07
BEL (bell)
响铃
0000 1000
8
08
BS (backspace)
退格
0000 1001
9
09
HT (horizontal tab)
水平制表符
0000 1010
10
0A
LF (NL line feed, new line)
换行键
0000 1011
11
0B
VT (vertical tab)
垂直制表符
0000 1100
12
0C
FF (NP form feed, new page)
换页键
0000 1101
13
0D
CR (carriage return)
回车键
0000 1110
14
0E
SO (shift out)
不用切换
0000 1111
15
0F
SI (shift in)
启用切换
0001 0000
16
10
DLE (data link escape)
数据链路转义
0001 0001
17
11
DC1 (device control 1)
设备控制1
0001 0010
18
12
DC2 (device control 2)
设备控制2
0001 0011
19
13
DC3 (device control 3)
设备控制3
0001 0100
20
14
DC4 (device control 4)
设备控制4
0001 0101
21
15
NAK (negative acknowledge)
拒绝接收
0001 0110
22
16
SYN (synchronous idle)
同步空闲
0001 0111
23
17
ETB (end of trans. block)
传输块结束
0001 1000
24
18
CAN (cancel)
取消
0001 1001
25
19
EM (end of medium)
介质中断
0001 1010
26
1A
SUB (substitute)
替补
0001 1011
27
1B
ESC (escape)
换码(溢出)
0001 1100
28
1C
FS (file separator)
文件分割符
0001 1101
29
1D
GS (group separator)
分组符
0001 1110
30
1E
RS (record separator)
记录分离符
0001 1111
31
1F
US (unit separator)
单元分隔符
0010 0000
32
20
(space)
空格
0010 0001
33
21
!
 
0010 0010
34
22
"
 
0010 0011
35
23
#
 
0010 0100
36
24
$
 
0010 0101
37
25
%
 
0010 0110
38
26
&
 
0010 0111
39
27
'
 
0010 1000
40
28
(
 
0010 1001
41
29
)
 
0010 1010
42
2A
*
 
0010 1011
43
2B
+
 
0010 1100
44
2C
,
 
0010 1101
45
2D
-
 
0010 1110
46
2E
.
 
00101111
47
2F
/
 
00110000
48
30
0
 
00110001
49
31
1
  
00110010
50
32
2
  
00110011
51
33
3
  
00110100
52
34
4
  
00110101
53
35
5
  
00110110
54
36
6
  
00110111
55
37
7
  
00111000
56
38
8
  
00111001
57
39
9
  
00111010
58
3A
:
  
00111011
59
3B
;
  
00111100
60
3C
<
  
00111101
61
3D
=
  
00111110
62
3E
>
  
00111111
63
3F
?
  
01000000
64
40
@
  
01000001
65
41
A
  
01000010
66
42
B
  
01000011
67
43
C
  
01000100
68
44
D
  
01000101
69
45
E
  
01000110
70
46
F
  
01000111
71
47
G
  
01001000
72
48
H
  
01001001
73
49
I
  
01001010
74
4A
J
  
01001011
75
4B
K
  
01001100
76
4C
L
  
01001101
77
4D
M
  
01001110
78
4E
N
  
01001111
79
4F
O
  
01010000
80
50
P
  
01010001
81
51
Q
  
01010010
82
52
R
  
01010011
83
53
S
  
01010100
84
54
T
  
01010101
85
55
U
  
01010110
86
56
V
  
01010111
87
57
W
  
01011000
88
58
X
  
01011001
89
59
Y
  
01011010
90
5A
Z
  
01011011
91
5B
[
  
01011100
92
5C
\
  
01011101
93
5D
]
  
01011110
94
5E
^
  
01011111
95
5F
_
  
01100000
96
60
`
  
01100001
97
61
a
  
01100010
98
62
b
  
01100011
99
63
c
  
01100100
100
64
d
  
01100101
101
65
e
  
01100110
102
66
f
  
01100111
103
67
g
  
01101000
104
68
h
  
01101001
105
69
i
  
01101010
106
6A
j
  
01101011
107
6B
k
  
01101100
108
6C
l
  
01101101
109
6D
m
  
01101110
110
6E
n
  
01101111
111
6F
o
  
01110000
112
70
p
  
01110001
113
71
q
  
01110010
114
72
r
  
01110011
115
73
s
  
01110100
116
74
t
  
01110101
117
75
u
  
01110110
118
76
v
  
01110111
119
77
w
  
01111000
120
78
x
  
01111001
121
79
y
  
01111010
122
7A
z
  
01111011
123
7B
{
  
01111100
124
7C
|
  
01111101
125
7D
}
  
01111110
126
7E
~
  
01111111
127
7F
DEL (delete)
删除
 
八进制
十六进制
十进制
字符
八进制
十六进制
十进制
字符
0
0
0
nul
100
40
64
@
1
1
1
soh
101
41
65
A
2
2
2
stx
102
42
66
B
3
3
3
etx
103
43
67
C
4
4
4
eot
104
44
68
D
5
5
5
enq
105
45
69
E
6
6
6
ack
106
46
70
F
7
7
7
bel
107
47
71
G
10
8
8
bs
110
48
72
H
11
9
9
ht
111
49
73
I
12
0a
10
nl
112
4a
74
J
13
0b
11
vt
113
4b
75
K
14
0c
12
ff
114
4c
76
L
15
0d
13
cr
115
4d
77
M
16
0e
14
so
116
4e
78
N
17
0f
15
si
117
4f
79
O
20
10
16
dle
120
50
80
P
21
11
17
dc1
121
51
81
Q
22
12
18
dc2
122
52
82
R
23
13
19
dc3
123
53
83
S
24
14
20
dc4
124
54
84
T
25
15
21
nak
125
55
85
U
26
16
22
syn
126
56
86
V
27
17
23
etb
127
57
87
W
30
18
24
can
130
58
88
X
31
19
25
em
131
59
89
Y
32
1a
26
sub
132
5a
90
Z
33
1b
27
esc
133
5b
91
[
34
1c
28
fs
134
5c
92
\
35
1d
29
gs
135
5d
93
]
36
1e
30
re
136
5e
94
^
37
1f
31
us
137
5f
95
_
40
20
32
sp
140
60
96
'
41
21
33
!
141
61
97
a
42
22
34
"
142
62
98
b
43
23
35
#
143
63
99
c
44
24
36
$
144
64
100
d
45
25
37
%
145
65
101
e
46
26
38
&
146
66
102
f
47
27
39
`
147
67
103
g
50
28
40
(
150
68
104
h
51
29
41
)
151
69
105
i
52
2a
42
*
152
6a
106
j
53
2b
43
+
153
6b
107
k
54
2c
44
,
154
6c
108
l
55
2d
45
-
155
6d
109
m
56
2e
46
.
156
6e
110
n
57
2f
47
/
157
6f
111
o
60
30
48
0
160
70
112
p
61
31
49
1
161
71
113
q
62
32
50
2
162
72
114
r
63
33
51
3
163
73
115
s
64
34
52
4
164
74
116
t
65
35
53
5
165
75
117
u
66
36
54
6
166
76
118
v
67
37
55
7
167
77
119
w
70
38
56
8
170
78
120
x
71
39
57
9
171
79
121
y
72
3a
58
:
172
7a
122
z
73
3b
59
;
173
7b
123
{
74
3c
60
<
174
7c
124
|
75
3d
61
=
175
7d
125
}
76
3e
62
>
176
7e
126
~
77
3f
63
?
177
7f
127
del

 

大小规则:
(1)数字0~9比字母要小。如"7"<"F";

(2)数字0比数字9要小,并按0到9顺序递增。如"3"<"8"

(3)字母A比字母Z要小,并按A到Z顺序递增。如"A"<"Z"

(4)同个字母的大写字母比小写字母要小。如"A"<"a"。      

记住几个常见字母的ASCII码大小:

“换行LF”为0x0A;“回车CR”为0x0D;空格为0x20;"0"为0x30; "A"为0x41;"a"为0x61。另外还有128-255的ASCII字符。

查询ASCII技巧,方便查询ASCII码对应的字符:新建一个文本文档,按住ALT+要查询的码值(注意,这里是十进制),

扩展 ASCII:

扩展ASCII 字符是从128 到255(0x80-0xff)的字符。扩展ASCII不再是国际标准。

汉字编码:  

0-127 是7位ASCII 码的范围,是国际标准。至于汉字,不同的字符集用的ascii 码的范围也不一样,常用的汉字字符集有GB2312-80,GBK,Big5,unicode 等。

  GB_2312 字符集是目前最常用的汉字编码标准,windows 95/98/2000 中使用的 GBK字符集 就包含了GB2312,或者说和GB2312 兼容,

  GB_2312 字符集包含了 6763个的 简体汉字,和682 个标准中文符号。在这个标准中,每个汉字用2个字节来表示,每个字节的ascii码为 161-254

     (16 进制A1 - FE),第一个字节 对应于 区码的1-94 区,第二个字节 对应于位码的1-94 位。

      161-254 其实很好记忆,大家知道英文字符中,可打印的字符范围为33-126。将这对数加上128(或者说最高位置1),就得到汉字使用的字符的围。

  GB18030的规范是汉字第一个字节在0x81-0xFE之间,第二个字节位于区间0x40-0x7E以及0x80-0xFE。每个字节转化为整数大于128。

显然ASCII码无法将世界上的各种文字和符号全部表示,所以,就需要新出一种可以代表所有字符和符号的编码,即:Unicode

Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定虽有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536,
注:此处说的的是最少2个字节,可能更多

UTF-8,是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行分类:ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存...

所以,python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill),如果是如下代码的话:

#!/usr/bin/python

print "你好,世界";

以上程序执行输出结果为:

  File "test.py", line 2
SyntaxError: Non-ASCII character '\xe4' in file test.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

Python中默认的编码格式是 ASCII 格式,在没修改编码格式时无法正确打印汉字,所以在读取中文时会报错。

解决方法为只要在文件开头加入 # -*- coding: UTF-8 -*- 或者 # coding=utf-8 就行了。

四、注释

  python有两种方式注释,一种是单行注释,在语句前加#这个符号,,也可以使用多行注释,使用连续的三个单引号在需要注释的内容范围两侧添加,也可以使用连续的三个双引号。例如:

  '''这里是

    注释

  '''

  """

    这里也是

    注释

  """

五、执行脚本传入参数

Python有大量的模块,从而使得开发Python程序非常简洁。类库有包括三中:

  • Python内部提供的模块
  • 业内开源的模块
  • 程序员自己开发的模块

Python内部提供一个 sys 的模块,其中的 sys.argv 用来捕获执行执行python脚本时传入的参数:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import sys
 
print sys.argv 

六、python版本间的差异

2.x 与 3.x 版本比较
version2.x3.x
print print " "或者print()打印都可以正常输出

只能 print() 这种形式打印,否则会出现

SyntaxError

input

raw_input

input:输出原生的数据类型,输入什么类型的值,就输出什么类型

raw_input:全部以字符串形式输出

3.x取消了raw_input方法,只能使用 input()

方式提示输入字符串, 该方法和2.x版本的raw_input()

如果想要实现与2.x input() 输出原生数据类型的值,可以使用eval(input())

class2.x支持新式类,和经典类,使用新式类时,类继承顺序会影响最终继承的结果必须使用新式类,解决了类间继承顺序问题
 _winregwinreg
 ConfigParserconfigparser
 copy_regcopyreg
 Queuequeue
 SocketServersocketserver
 markupbase_markupbase
 reprreprlib
 test.test_supporttest.support

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1/2 终于等于0.5了

class Foo: 写法不能用了,只能 class Foo(object)

python编码:

  python 2.x版本默认string字符编码,1个字符只能存8bit,可以使用内置函数,chr()和ord() 进行字符转换

  python 3.x默认使用unicode编码格式,可以使用内置函数unichr()和ord()进行字符转换

 七、pyc文件

执行Python代码时,如果导入了其他的 .py 文件,那么,执行过程中会自动生成一个与其同名的 .pyc 文件,该文件就是Python解释器编译之后产生的字节码。

ps:代码经过编译可以产生字节码;字节码通过反编译也可以得到代码。

八、变量

1、声明变量

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
 
name = "wupeiqi"

上述代码声明了一个变量,变量名为: name,变量name的值为:"wupeiqi"

变量的作用:昵称,其代指内存里某个地址中保存的内容

变量定义的规则:

  • 变量名只能是 字母、数字或下划线的任意组合,不能有特殊字符,不能有空格
  • 变量名的第一个字符不能是数字
  • python保留的关键字不能声明为变量名,这样等于重写python的内置方法,可能会影响其他方法的调用
#通过导入keyword模块,我们可以查看当前python保留了哪些关键字
import keyword

#查看python保留关键字
keyword.kwlist

#2.x 输出 ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']

#3.x 输出 ['False', 'None', 'True', 'and', 'as', 'assert', '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']


#注意,3.x新增了['False','None','True','nonlocal']同时去除了2.x ['exec']的关键字,大家在命名规范时,应该遵循3.x的关键字,便于向后兼容

#如果不确定该变量名是否为关键字,也可以通过下面这种方法,检查是为关键字
keyword.iskeyword('name')

#返回False,说明该变量名不是系统保留关键字,即,可用

为了书写规范,建议变量名使用统一的风格书写,例如:驼峰式  SunOfBeach 或者 sun_of_beach

单个前导下划线开头的标识符,意味着约定为私有的

两个前导下划线开头的标识符,表示强烈专用的标识符

如果标识符还有两个下划线结束,则该标识符是语言的特殊名称

python的语法:
  python以简洁著称,摒弃了其他如c的{}花括号方式书写方式,以及为了追求语言的可读性,强制要求语法缩进,同一个语句快的代码缩紧必须相同,否则会出现缩进错误 IndentationError,如果想一行写多条语句,可以使用分号;隔开

2、变量的赋值

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
name1 = "wupeiqi"
name2 = "alex"

 
 
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
name1 = "wupeiqi"
name2 = name1

 
a = 2  #给a变量赋值为2
b = a  #将变量a 的值赋给变量b,相当于是将a指向的内存空间3同时指向了b,此时b也等于3
a = 5  #给a变量赋值为5,此时由于之前的a已经被赋予一次值,python解释器会将a指向的内存空间改为指向5

print(a,b)
(5,2)
#此时打印输出为5,2,因为虽然b=a,且a的值被改变了,但是b=a仅仅只是将b指向了a指向的内存地址,并不是真正意义上的指向
a,a的值改变,仅仅是改变a指向的内存地址,当多个变量指向同一个地址空间时,python自身的内存回收机制,会在这块内存空间
做一个标记,有多少个人引用了这块内存空间,就在+多少个1,直到引用为0,此时python解释器会将该内存空间收回,这也是有
别于其他开发语言的最大特点之一,不需要关注内存的回收,
#当想查看当前的两个变量是否指向同一个内存地址时,可以使用id()方法
a = 2
print(id(a))
#打印结果为 140723441682448

b = a
print(id(b))
#打印结果为 140723441682448
#可见,a和b指向的都是同一块地址空间,注:以上两个值与使用的平台有关,不一定都是一样的数值,但是这两个数值一定是相等的

a = 5
print(id(a))

#打印结果为 140723441682376

print(id(b))
#打印结果为 140723441682448
#通过观察两个变量的指针变化,可以发现,a值的改变并不会影响到已经被赋值的b

九、交互输入

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# 将用户输入的内容赋值给 name 变量 
name = raw_input("请输入用户名:")

# 打印输入的内容
print name

输入密码时,如果想要不可见,需要利用getpass 模块中的 getpass方法,即:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
 
import getpass
 
# 将用户输入的内容赋值给 name 变量
pwd = getpass.getpass("请输入密码:")
 
# 打印输入的内容
print pwd

十、条件及循环语句控制

1、Python 条件语句

Python程序语言指定任何非0和非空(null)值为true,0 或者 null为false。
Python 编程中 if 语句用于控制程序的执行,基本形式为:

if 判断条件:
    执行语句……
else:
    执行语句……

其中"判断条件"成立时(非零),则执行后面的语句,而执行内容可以多行,以缩进来区分表示同一范围。
else 为可选语句,当需要在条件不成立时执行内容则可以执行相关语句,具体例子如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 例1:if 基本用法

flag = False
name = 'luren'
if name == 'python':         # 判断变量否为'python'
    flag = True          # 条件成立时设置标志为真
    print 'welcome boss'    # 并输出欢迎信息
else:
    print name              # 条件不成立时输出变量名称

输出结果为:

>>> luren	# 输出结果

if 语句的判断条件可以用>(大于)、<(小于)、==(等于)、>=(大于等于)、<=(小于等于)来表示其关系。
当判断条件为多个值是,可以使用以下形式:

if 判断条件1:
    执行语句1……
elif 判断条件2:
    执行语句2……
elif 判断条件3:
    执行语句3……
else:
    执行语句4……

实例如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 例2:elif用法

num = 5     
if num == 3:            # 判断num的值
    print 'boss'        
elif num == 2:
    print 'user'
elif num == 1:
    print 'worker'
elif num < 0:           # 值小于零时输出
    print 'error'
else:
    print 'roadman'     # 条件均不成立时输出

输出结果为:

>>> roadman		# 输出结果

由于 python 并不支持 switch 语句,所以多个条件判断,只能用 elif 来实现,如果判断需要多个条件需同时判断时,可以使用 or (或),表示两个条件有一个成立时判断条件成功;使用 and (与)时,表示只有两个条件同时成立的情况下,判断条件才成功。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 例3:if语句多个条件

num = 9
if num >= 0 and num <= 10:    # 判断值是否在0~10之间
    print 'hello'
>>> hello		# 输出结果

num = 10
if num < 0 or num > 10:    # 判断值是否在小于0或大于10
    print 'hello'
else:
	print 'undefine'
>>> undefine		# 输出结果

num = 8
# 判断值是否在0~5或者10~15之间
if (num >= 0 and num <= 5) or (num >= 10 and num <= 15):    
    print 'hello'
else:
    print 'undefine'
>>> undefine		# 输出结果

当if有多个条件时可使用括号来区分判断的先后顺序,括号中的判断优先执行,此外 and 和 or 的优先级低于>(大于)、<(小于)等判断符号,即大于和小于在没有括号的情况下会比与或要优先判断。

简单的语句组:

你也可以在同一行的位置上使用if条件判断语句,如下实例:

#!/usr/bin/python 
# -*- coding: UTF-8 -*-
 
var = 100 
 
if ( var  == 100 ) : print "变量 var 的值为100" 
 
print "Good bye!" 

以上代码执行输出结果如下:

变量 var 的值为100
Good bye!

 2、循环语句

(1)While循环语句

Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。

执行语句可以是单个语句或语句块。判断条件可以是任何表达式,任何非零、或非空(null)的值均为true。
当判断条件假false时,循环结束。

#!/usr/bin/python

count = 0
while (count < 9):
   print 'The count is:', count
   count = count + 1

print "Good bye!"

以上代码执行输出结果:

The count is: 0
The count is: 1
The count is: 2
The count is: 3
The count is: 4
The count is: 5
The count is: 6
The count is: 7
The count is: 8
Good bye!

while 语句时还有另外两个重要的命令 continue,break 来跳过循环,continue 用于跳过该次循环,break 则是用于退出循环,此外"判断条件"还可以是个常值,表示循环必定成立,具体用法如下:

# continue 和 break 用法

i = 1
while i < 10:   
    i += 1
    if i%2 > 0:     # 非双数时跳过输出
        continue
    print i         # 输出双数2、4、6、8、10

i = 1
while 1:            # 循环条件为1必定成立
    print i         # 输出1~10
    i += 1
    if i > 10:     # 当i大于10时跳出循环
        break

无限循环
如果条件判断语句永远为 true,循环将会无限的执行下去,如下实例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

var = 1
while var == 1 :  # 该条件永远为true,循环将无限执行下去
   num = raw_input("Enter a number  :")
   print "You entered: ", num

print "Good bye!"

以上实例输出结果:

Enter a number  :20
You entered:  20
Enter a number  :29
You entered:  29
Enter a number  :3
You entered:  3
Enter a number between :Traceback (most recent call last):
  File "test.py", line 5, in <module>
    num = raw_input("Enter a number :")
KeyboardInterrupt

以上的无限循环你可以使用 CTRL+C 来中断循环。

循环使用 else 语句
在 python 中,for … else 表示这样的意思,for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况下执行,while … else 也是一样。

#!/usr/bin/python

count = 0
while count < 5:
   print count, " is  less than 5"
   count = count + 1
else:
   print count, " is not less than 5"

以上实例输出结果为:

0 is less than 5
1 is less than 5
2 is less than 5
3 is less than 5
4 is less than 5
5 is not less than 5

简单语句组
类似if语句的语法,如果你的while循环体中只有一条语句,你可以将该语句与while写在同一行中, 如下所示:

#!/usr/bin/python

flag = 1

while (flag): print 'Given flag is really true!'

print "Good bye!"

(2)for 循环语句

Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

for letter in 'Python':     # 第一个实例
   print '当前字母 :', letter

fruits = ['banana', 'apple',  'mango']
for fruit in fruits:        # 第二个实例
   print '当前字母 :', fruit

print "Good bye!"

以上实例输出结果:

当前字母 : P
当前字母 : y
当前字母 : t
当前字母 : h
当前字母 : o
当前字母 : n
当前字母 : banana
当前字母 : apple
当前字母 : mango
Good bye!

通过序列索引迭代
另外一种执行循环的遍历方式是通过索引,如下实例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

fruits = ['banana', 'apple',  'mango']
for index in range(len(fruits)):
   print '当前水果 :', fruits[index]

print "Good bye!"

以上实例输出结果:

当前水果 : banana
当前水果 : apple
当前水果 : mango
Good bye!

以上实例我们使用了内置函数 len() 和 range(),函数 len() 返回列表的长度,即元素的个数。 range返回一个序列的数。

循环使用 else 语句
在 python 中,for … else 表示这样的意思,for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况下执行,while … else 也是一样。
如下实例:

/usr/bin/python
# -*- coding: UTF-8 -*-

for num in range(10,20):  # 迭代 10 到 20 之间的数字
   for i in range(2,num): # 根据因子迭代
      if num%i == 0:      # 确定第一个因子
         j=num/i          # 计算第二个因子
         print '%d 等于 %d * %d' % (num,i,j)
         break            # 跳出当前循环
   else:                  # 循环的 else 部分
      print num, '是一个质数'

以上实例输出结果:

10 等于 2 * 5
11 是一个质数
12 等于 2 * 6
13 是一个质数
14 等于 2 * 7
15 等于 3 * 5
16 等于 2 * 8
17 是一个质数
18 等于 2 * 9
19 是一个质数

Python 循环嵌套
Python 语言允许在一个循环体里面嵌入另一个循环。

Python for 循环嵌套语法:

for iterating_var in sequence:
   for iterating_var in sequence:
      statements(s)
   statements(s)

Python while 循环嵌套语法:

while expression:
   while expression:
      statement(s)
   statement(s)

你可以在循环体内嵌入其他的循环体,如在while循环中可以嵌入for循环, 反之,你可以在for循环中嵌入while循环。
实例:
以下实例使用了嵌套循环输出2~100之间的素数:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

i = 2
while(i < 100):
   j = 2
   while(j <= (i/j)):
      if not(i%j): break
      j = j + 1
   if (j > i/j) : print i, " 是素数"
   i = i + 1

print "Good bye!"

以上实例输出结果:

2 是素数
3 是素数
5 是素数
7 是素数
11 是素数
13 是素数
17 是素数
19 是素数
23 是素数
29 是素数
31 是素数
37 是素数
41 是素数
43 是素数
47 是素数
53 是素数
59 是素数
61 是素数
67 是素数
71 是素数
73 是素数
79 是素数
83 是素数
89 是素数
97 是素数
Good bye!

2、循环控制语句
循环控制语句可以更改语句执行的顺序。Python支持以下循环控制语句

控制语句描述
break 语句在语句块执行过程中终止循环,并且跳出整个循环
continue 语句在语句块执行过程中终止当前循环,跳出该次循环,执行下一次循环。
pass 语句pass是空语句,是为了保持程序结构的完整性。

十一、基本数据类型

1、数字

Python 支持四种不同的数值类型:

整型(Int):通常被称为是整型或整数,是正或负整数,不带小数点。如:1,11,111,-1,-111 ... ,2.x范围在-2**31~2**31-1之间,取决于操作系统,不会小于这个范围。

长整型(long integers):无限大小的整数,整数最后是一个大写或小写的L。

  跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。

  注意,自从Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,所以如今在长整数数据后面不加字母L也不会导致严重后果了。

浮点型(floating point real values):浮点型由整数部分与小数部分组成,浮点型也可以使用科学计数法表示(2.5e2 = 2.5 x 102 = 250),如:1.11.1.111,-1.111 ...

  浮点数用来处理实数,即带有小数的数字。类似于C语言中的double类型,占8个字节(64位),其中52位表示底,11位表示指数,剩下的一位表示符号。

复数( (complex numbers)):复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型。

注:Python中存在小数字池:-5 ~ 257

2、布尔值

布尔类型,只有两个值,真:True  假:False,任何非零的数据类型,结果都为真,当结果为int 0 时,则为False

3、字符串

字符串,如:'hello' , 'python' , '1' , 'string' ...,注意,字符串需要使用引号(' ')或者双引号("")引起来

万恶的字符串拼接:
  python中的字符串在C语言中体现为是一个字符数组,每次创建字符串时候需要在内存中开辟一块连续的空,并且一旦需要修改字符串的话,就需要再次开辟空间,万恶的+号每出现一次就会在内从中重新开辟一块空间。

字符串格式化:

name = "alex"
print "i am %s " % name
 
#输出: i am alex

字符串是 %s;整数 %d; 浮点数%f

字符串常用功能:

  • 移除空白
  • 分割
  • 长度
  • 索引
  • 切片

4、列表

序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。

Python有6个序列的内置类型,但最常见的是列表和元组。

序列都可以进行的操作包括索引,切片,加,乘,检查成员。

此外,Python已经内置确定序列的长度以及确定最大和最小的元素的方法。

列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。

列表的数据项不需要具有相同的类型

创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。如下所示:

list1 = ['physics', 'chemistry', 1997, 2000];
list2 = [1, 2, 3, 4, 5 ];
list3 = ["a", "b", "c", "d"];
name_list = list(['alex', 'seven', 'eric'])

dir(list1)
# 2.x 输出 ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

# 3.x输出['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

基本操作:

  • 索引
  • 切片
  • 追加
  • 删除
  • 长度
  • 切片
  • 循环
  • 包含
list1.append('tail')       #在列表末尾追加一个元素'tail'
list1.count('python')      #统计列表中有多少个相同的元素'python' 
list1.extend('how')        #在列表后面追加三个字符串'h','o','w'
list1.index('python')      #显示元素‘python’的索引,这里将输出2
list1.insert(1,'niubi')    #在索引为的位置插入元素'niubi',及原来的元素从1往后加1
list1.pop()                #将列表最后一个元素删除
list1.remove('niubi')      #删除指定元素,即,将指定的'niubi'元素删除
list1.reverse()            #将列表的元素由原来的从左到右顺序变成从右到左方式排序
list1.sort()               #将列表按照assci?顺序排序,注意!3.x版本的排序是不能同时有多个数据类型一起排序的。
list1.clear()              #将列表list1清空,这个方法只有3.x才有
a = list1.copy()           #将列表list1复制给a,貌似没有发现有什么其它特别之处相对于直接使用a = list1方式,这个属性也是只有3.x版本才有

列表访问方式

list1[1]       #显示下标为1的元素,因为元组的下标是从0开始的,所以会显示元素'chenistry'
list1[0:2]     #显示元素从位置0(包括0)到2(不包括2),即显示['physics', 'chemistry']
list1[-1]      #显示倒数第一个元素,即'2000' 
list1[-2]      #显示倒数第二个元素,即'1997'
list1[:-2]     #显示元素从位置0(包括),到位置倒数第二个(不包括倒数第二个),之前的元素都显示出来,即['physics', 'chemistry']
list1[-2:]     #显示元素从位置倒数第二个(包括)到最后一个(包括),即[1997, 2000]
list1[0:4:2]   #该方式先将前面的[0:4]条件先筛选出来,然后再进行后面的:2,即每隔一位取一个值,所以这里将显示['physics', 1997]

5、元祖

Python的元组与列表类似,不同之处在于元组的元素不能修改。
元组使用小括号,列表使用方括号。
元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

a = ('a','hello','python','1')
或
a = tuple(('a','hello','python','1'))

基本操作:

  • 索引
  • 切片
  • 循环
  • 长度
  • 包含
#查看元组的内置方法
dir(a)
#将会输出一个列表形式的方法名称
# 2.x  输出['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']

#3.x输出 ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']

#元组提供了两个公有方法给我们使用
a.count('hello') #统计元组里面有多少个相同的元素'hello',很显然,这里只有1个,所以输出结果为 1 a.index('hello') #返回元素'hello'的索引位置,python的索引位置是从0开始的,所以这里的‘hello’元素的索引是1,而不是2.

元组的访问方法与列表一样

6、字典(无序)

字典是另一种可变容器模型,且可存储任意类型对象。

字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中。

创建字典:
person = {"name": "mr.wu", 'age': 18}
或
person = dict({"name": "mr.wu", 'age': 18})

常用操作:

  • 索引
  • 新增
  • 删除
  • 键、值、键值对
  • 循环
  • 长度

十二、运算

算数运算:

比较运算:


赋值运算:


逻辑运算:

成员运算:

身份运算:

位运算:

运算符优先级:

十二、文件处理

打开文件:

file_obj = open(file_name,[access_mode],[buffering])

file_name: file_name参数是一个字符串值,包含要访问的文件的名称。

access_mode: access_mode 确定该文件已被打开,即模式。读,写等追加。可能值的一个完整列表在下表中给出。这是可选的参数,默认文件访问模式是读(r)

buffering: 如果缓冲值被设置为0,没有缓冲将发生。如果该缓冲值是1,将在访问一个文件进行行缓冲。如果指定的缓冲值作为大于1的整数,那么缓冲操作将被用指定缓冲器大小进行。这是可选的参数。

文件访问模式:

模式描述
r以只读方式打开文件,文件指针放在文件开头,这个是默认模式
rb以二进制格式读取,文件指针放在文件开头
r+以读取和写入方式打开文件,文件指针在文件开头
rb+以二进制读取和写入方式打开文件
w以只写方式打开文件,如果文件存在,则覆盖文件内容,不存在则创建一个新文件
wb打开文件以二进制方式写入,文件存在则覆盖,不存在则创建新文件
w+以写入和读取方式打开文件,如果文件存在则覆盖,不存在则创建新文件
wb+以二进制方式写入和读取文件,存在则覆盖现有文件,不存在则创建新文件
a以追加方式写入文件末尾,如果不存在则创建该文件
ab以二进制格式追加在文件末尾,不存在则创建该文件
a+以追加和读取方式打开文件,如果文件存在,文件指针在文件的末尾,如果不存在,则创建新文件并写入和读取

读取文件的内容:

# 一次性加载所有内容到内存
obj.read()
 
# 一次性加载所有内容到内存,并根据行分割成字符串
obj.readlines()
 
# 每次仅读取一行数据
for line in obj:
  print line

写文件的内容:

obj.write('内容')

关闭文件句柄:

obj.close()

 

#文件操作有以下几种方法
#2.x 方法 ['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'closed', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 'readline', 'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines', 'xreadlines']

#3.x 方法['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline', 'readlines', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'writelines']

file 和 open 是一样的没有任何区别。

转载于:https://www.cnblogs.com/GongYJ/p/5440042.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值