输出
用print加上字符串,就可以向屏幕上输出指定的文字。比如输出'hello, world'
>>>print 'hello, world'
print语句也可以跟上多个字符串,用逗号“,”隔开,就可以连成一串输出:
>>>print('hello world','hello python')
hello world hello python
print也可以打印整数,或者计算结果:
>>> print 300
300
>>> print 100 + 200
300
我们可以把计算100 + 200的结果打印得更漂亮一点:
>>> print '100 + 200 =', 100 + 200
100 + 200 = 300
在写代码过程中,经常遇到一行代码很长的情况。为了让代码显得整齐干净,就需要把一行代码分成多行来写,Python中有两种小技巧可以实现该功能:
1.用反斜杠链接多行代码,示例输出:55
a = 22 + \
33
print a
2.用小括号括起来,示例输出:55
a = (22+
33)
print a
提示:针对较长字符串分成多行书写的还有一种简单的方法:用三个单引号,但是该方法只针对字符串有用。下面代码输出:
a = '''32 +
45'''
print a
如果想要分几行输入字符串,并且希望行尾的换行符自动包含到字符串当中,可以使用三对引号:"""...""" 或 '''...''' 。
print('''
文能提笔安天下,
武能上马定乾坤.
心存谋略何人胜,
古今英雄唯是君.
''')
格式化输出
age = 10
print ('我的年龄是%d岁'%age)
name = 'Tom'
age = 10
print ('%s的年龄是%d岁'%(name,age))
>>> mathScore=100
>>> print('my math score is %d'%mathScore)
my math score is 100
>>>
在引号内用%d,引号外用%变量名来输出
>>> mathScore=100
>>> englishScore=99
>>> print('my math score is %d,my englist score is %d'%(mathScore,englishScore))
my math score is 100,my englist score is 99
如果有多个变量需要调用,在引号内用多个%d,在引号外用%(变量名1,变量名2)来输出
格式化符号
说明
%c 转换成字符(ASCII 码值,或者长度为一的字符串)
%r 优先用repr()函数进行字符串转换
%s 优先用str()函数进行字符串转换
%d/%i 转成有符号十进制数
%u 转成无符号十进制数
%o 转成无符号八进制数
%x/%X 转成无符号十六进制数(x / X 代表转换后的十六进制字符的大小写)
%e/%E 转成科学计数法(e / E控制输出e / E)
%f/%F 转成浮点数(小数部分自然截断)
%g/%G %e和%f/%E和%F 的简写
%% 输出%(格式化字符串里面包括百分号,那么必须使用%%)
还有一种{}.format格式
import math
r = 2
s = math.pi*r*r
print('%.10f'%s)
print('{:.10f}'.format(s))
Python提供了一个raw_input,可以让用户输入字符串,并存放到一个变量里。
在Python2中如果使用input(),则用户输入的内容必须是表达式,并会进行计算,所以Python2中建议用raw_input(),如果输出的是字符,在python2中必须使用raw_input()
在Python3中只有input()一种输入方法,且用户输入的内容不会参与计算,全部认为是字符串
例子:
>>> a = input('提示:')
提示:100+200
>>> a
300
>>> a = raw_input('提示:')
提示:100+200
>>> a
'100+200'
>>>
例子:打印名片
使用多行输出,利用占位符打印
name=input('请输入姓名:')
qq=input('QQ:')
tel=input('手机号:')
msg = '''
===================
姓名:%s
QQ:%s
手机号:%s
地址:北京市xxx
===================
'''%(name,qq,tel)
print(msg)
#!/usr/bin/python //指定python命令的路径
print('hello world')
赋予执行权限
chmod u+x hello.py
执行程序
./hello.py
也可以python hello.py,这种方法在代码内不需要指定python命令的位置#!/usr/bin/python
也不需要赋予执行权限
注释
用#开头的内容是单行注释
用'''
注释内容
注释内容
注释内容
'''
是多行注释
编码
python2解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill),而python3对内容进行编码的默认为utf-8。
ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 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),如果是如下代码的话:
报错:ascii码无法表示中文
1 #!/usr/bin/env python 2 3 print "你好,世界"
改正:应该显示的告诉python2解释器,用什么编码来执行源代码,即:
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 print "你好,世界"
在Python2中默认编码是ascii
C:\Users\i>python2
Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AM
D64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
在Python3中默认编码是utf-8
C:\Users\i>python
Python 3.6.3 |Anaconda, Inc.| (default, Oct 15 2017, 03:27:45) [MSC v.1900 64 bi
t (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
python2是1989年创立的,而utf-8是1991年才有的,所以python2在设计的时候并没有utf-8支持
windows默认编码是gbk,默认可以支持unicode和gbk,Linux默认编码是utf-8
Python2 在windows上解码是必须的,编码成gbk这个动作不是必须的,因为window在内存里默认就是unicode,在Linux上如果源码不是utf-8则需要解码成utf-8,编码也不是必须的
Python3 默认编码是utf-8,解释器编码是utf-8,文件加载到内存后会自动解码成unicode,同时把字符转换成bytes格式。
Python3 中不需要解码和编码
#-*- coding:utf-8 -*-
msg = "你好"
print (msg)
通过dos窗口执行结果如下:
#C:\Users\i\Desktop>python2 test1.py
#浣犲ソ 因为dos解释器默认使用gbk编码,所以不能识别utf-8
#将utf-8编码转码为gbk编码
gbk_str = msg.decode(encoding="utf-8").encode(encoding="gbk")
#或
gbk_str = msg.decode(encoding="utf-8").encode("gbk")
print (gbk_str)
通过dos窗口执行结果如下:
#C:\Users\i\Desktop>python2 test1.py
#你好 将utf-8编码转换为gbk后就可以正常显示了
print (gbk_str.decode(encoding="gbk").encode("gb2312"))
#将gbk_str的gbk模式再转换为gb2312可以正常显示你好,因为gbk向下兼容gb2312
print (gbk_str.decode(encoding="gbk").encode("utf-8"))
#浣犲ソ 将gbk_str的编码再转换为utf-8后在dos窗口下就不能正常显示了
print (gbk_str.decode(encoding="gbk"))
#你好 直接将gbk_str解码,默认转换成了unicode编码,在dos窗口下也可以正常显示
msg = '你好'
print(msg.encode('gbk'))
#在python3中将msg编码成gbk编码并保存为bytes模式,便于其他解释器在解码时使用gbk编码格式进行解码
C:\Users\i\Desktop>python3 test1.py
b'\xc4\xe3\xba\xc3'
只有在需要保存文件时才需要将编码
unicode编码类型不能用于存储和传输,因为所有字符串都占用4个字节浪费空间
当str类型在内存中被加载时是unicode编码
当str类型在存储和传输时需要用bytes类型,bytes类型的编码方式是非unicode
#编码
#将str类型编码成utf-8的bytes类型
s1 = 'abc' #当str为英文时,编码成utf-8或者gbk编码的bytes类型显示是一样的
b1 = s1.encode('utf-8')
print(b1,type(b1))
#结果为:b'abc' <class 'bytes'>
#将str类型编码成gbk编码的bytes类型
b2 = s1.encode('gbk')
print(b2, type(b2))
#结果为:b'abc' <class 'bytes'>
s2 = '你好' #当str为中文时,编码成utf-8的bytes类型是6个字节,编码成gbk的bytes类型是4个字节
b3 = s2.encode('utf-8')
print(b3,type(b3))
#结果为:b'\xe4\xbd\xa0\xe5\xa5\xbd' <class 'bytes'>
b4 = s2.encode('gbk')
print(b4,type(b4))
#结果为:b'\xc4\xe3\xba\xc3' <class 'bytes'>
#解码
#当bytes类型是用utf-8编码时则解码也必须用utf-8去解,用gbk解码会报错或显示乱码
b10 = b'\xe4\xbd\xa0\xe5\xa5\xbd'
s10 = b10.decode('utf-8')
print(s10)
#结果为:你好
#如果用gbk解码显示乱码 浣犲ソ
#当bytes类型是用gbk编码时则解码也必须用gbk去解,用utf-8解码会报错
b11 = b'\xc4\xe3\xba\xc3'
s11 = b11.decode('gbk')
print(s11)
#结果为:你好