基本概念
: J% r0 v+ O) b1 X5 M0 u) @8 u8 B% V7 j0 i+ l6 n# b
仅仅打印“Hello World”就足够了吗?你应该想要做更多的事——你想要得到一些输入,然后做操作,再从中得到一些输出。在 Python 中,我们可以使用常量和变量来完成这些工作。
% b! y7 i! e' f9 C6 ]1 M* a' w. O c
字面意义上的常量
6 N4 J3 x5 \+ A2 G8 A
7 b' f: g* K0 K一个字面意义上的常量的例子是如同 5、1.23、9.25e-3 这样的数,或者如同'This is a string'、"It's a string!"这样的字符串。它们被称作字面意义上的,因为它们具备 字面 的意义——你按照它们的字面意义使用它们的值。数 2 总是代表它自己,而不会是别的什么东西——它是一个常量,因为不能改变它的值。因此,所有这些都被称为字面意义上的常量。
/ S$ K& w! W! Z: Q7 R
9 u1 i; {) t0 A) ?( y数
; i/ h# W: t* N: f/ B
% X* A* e: u# V* x* Q, c* x* B8 O4 D在 Python 中有 4 种类型的数——整数、长整数、浮点数和复数。$ W- R Y8 r. L1 F1 a5 Y
- 2 是一个整数的例子。
- 长整数不过是大一些的整数。
- 3.23 和 52.3E-4 是浮点数的例子。E 标记表示 10 的幂。在这里,52.3E-4 表示 52.3 * 10-4。
- (-5+4j)和(2.3-4.6j)是复数的例子。
& J0 n9 F. N6 s' J- X) d4 X. T
! o& V6 a" n+ v. ^8 m5 H$ H
* R8 b$ a7 s& t, Q字符串$ {' Q0 \. J$ u7 J
* B% a7 R- g) x
字符串是 字符的序列 。字符串基本上就是一组单词。
# C8 g: L. |, D" j3 j+ a6 w( h) j
我几乎可以保证你在每个 Python 程序中都要用到字符串,所以请特别留心下面这部分的内容。下面告诉你如何在 Python 中使用字符串。- u( \( S E+ n. ]
: B4 [4 y# O: J" o. C. ~9 C
- 使用单引号(')
- 你可以用单引号指示字符串,就如同'Quote me on this'这样。所有的空白,即空格和制表符都照原样保留。
- 使用双引号(")
- 在双引号中的字符串与单引号中的字符串的使用完全相同,例如"What's your name?"。
- 使用三引号('''或""")
- 利用三引号,你可以指示一个多行的字符串。你可以在三引号中自由的使用单引号和双引号。例如:; K* {' \) A. Y& j, Z
. T. D, S4 s' ~$ g [0 y; S
. [7 Q& I$ E# {$ B7 u' t/ N7 F
- '''This is a multi-line string. This is the first line. This is the second line. "What's your name?," I asked. He said "Bond, James Bond." '''
复制代码 . S# Z. u' u, k6 A
' ~8 U& ?# P8 ?
4 b( p( t# r5 i$ u( `& Z- 转义符
- 假设你想要在一个字符串中包含一个单引号('),那么你该怎么指示这个字符串?例如,这个字符串是 What's your name?。你肯定不会用'What's your name?'来指示它,因为 Python 会弄不明白这个字符串从何处开始,何处结束。所以,你需要指明单引号而不是字符串的结尾。可以通过 转义符 来完成这个任务。你用\'来指示单引号——注意这个反斜杠。现在你可以把字符串表示为'What\'s your name?'。
( o' d: [% N8 U( W- w 7 N! D4 X, {8 D. ~: c0 ^
, J& V7 P$ c$ v( A# C5 ~' V另一个表示这个特别的字符串的方法是"What's your name?",即用双引号。类似地,要在双引号字符串中使用双引号本身的时候,也可以借助于转义符。另外,你可以用转义符\来指示反斜杠本身。
' b8 K. O3 Y, x/ q+ E
9 a0 B1 R: G! Z2 C值得注意的一件事是,在一个字符串中,行末的单独一个反斜杠表示字符串在下一行继续,而不是开始一个新的行。例如:
2 K3 f3 U: [& I; R& ]! _4 q
- K; y3 ?/ e2 J0 \- "This is the first sentence.\
复制代码
. t% {2 Q" ^' l2 _
* y+ O5 v7 s y; ^0 t7 ^等价于"This is the first sentence. This is the second sentence."6 `1 n# I3 v" H- L0 l! F# v0 H
- 自然字符串
- 如果你想要指示某些不需要如转义符那样的特别处理的字符串,那么你需要指定一个自然字符串。自然字符串通过给字符串加上前缀r或R来指定。例如r"Newlines are indicated by \n"。
- Unicode 字符串
- Unicode 是书写国际文本的标准方法。如果你想要用你的母语如北印度语或阿拉伯语写文本,那么你需要有一个支持 Unicode 的编辑器。类似地,Python 允许你处理 Unicode 文本——你只需要在字符串前加上前缀 u 或 U。例如,u"This is a Unicode string."。
) Q1 G) y! d/ h! S. t- x/ Q . p# ~& G# {( w/ a' H/ ^3 t) W6 ~
( w9 Y5 X2 ]( p7 H, ]
记住,在你处理文本文件的时候使用 Unicode 字符串,特别是当你知道这个文件含有用非英语的语言写的文本。, x! F/ r8 S( s I' V7 w2 M* o
- 字符串是不可变的
- 这意味着一旦你创造了一个字符串,你就不能再改变它了。虽然这看起来像是一件坏事,但实际上它不是。我们将会在后面的程序中看到为什么我们说它不是一个缺点。
- 按字面意义级连字符串
- 如果你把两个字符串按字面意义相邻放着,他们会被 Python 自动级连。例如,'What\'s' 'your name?'会被自动转为"What's your name?"。
- 给 C/C++程序员的注释
- 在 Python 中没有专门的 char 数据类型。确实没有需要有这个类型,我相信你不会为此而烦恼。
- 给 Perl/PHP 程序员的注释
- 记住,单引号和双引号字符串是完全相同的——它们没有在任何方面有不同。
- 给正则表达式用户的注释
- 一定要用自然字符串处理正则表达式。否则会需要使用很多的反斜杠。例如,后向引用符可以写成'\1'或r'\1'。
/ I. x1 Y1 l* v3 o
) @8 a3 Y4 J3 P7 g: i& F
1 a z7 G( d3 Z P4 R# v3 b% f变量
5 Y2 R5 t5 a! L+ x! }5 D# f
. R; T6 o8 o% X8 w# X9 T1 B仅仅使用字面意义上的常量很快就会引发烦恼——我们需要一种既可以储存信息 又可以对它们进行操作的方法。这是为什么要引入 变量 。变量就是我们想要的东西——它们的值可以变化,即你可以使用变量存储任何东西。变量只是你的计算机中存储信息的一部分内存。与字面意义上的常量不同,你需要一些能够访问这些变量的方法,因此你给变量名字。& D7 x2 H9 m- w+ ^7 N
* @* O% ]; Q) q9 d# y标识符的命名* X# S2 g2 |) @
9 t. v( T: t9 j# Y% `变量是标识符的例子。 标识符 是用来标识 某样东西 的名字。在命名标识符的时候,你要遵循这些规则:8 X8 G3 Q* M! d* v
7 R7 [1 k/ i X7 M; v- 标识符的第一个字符必须是字母表中的字母(大写或小写)或者一个下划线(‘ _ ’)。
- 标识符名称的其他部分可以由字母(大写或小写)、下划线(‘ _ ’)或数字(0-9)组成。
- 标识符名称是对大小写敏感的。例如,myname 和 myName 不是一个标识符。注意前者中的小写 n 和后者中的大写 N。
- 有效 标识符名称的例子有 i、__my_name、name_23 和 a1b2_c3。
- 无效 标识符名称的例子有 2things、this is spaced out 和 my-name。5 N3 U. B: R4 ?3 p: W
. J. ?6 x/ s0 X' q# N, P6 \( Q' g
& d/ {6 R2 y! D
% S. @/ N% U% U% K5 E. U* i) e o$ K数据类型
/ x5 S9 {$ l, i" K
! b; ^, d& F" o) q# R" r: X变量可以处理不同类型的值,称为数据类型。基本的类型是数和字符串,我们已经讨论过它们了。在后面的章节里面,我们会研究怎么用类创造我们自己的类型。
0 [% |5 H; y# A2 O, \% F
3 e) e* `9 }6 b( l2 B( A* i) _! ^对象7 J" `8 N$ e" x9 C" c5 \3 k
2 u0 ?8 C4 X# B: U
记住,Python 把在程序中用到的任何东西都称为 对象 。这是从广义上说的。因此我们不会说“某某 东西 ”,我们说“某个 对象 ”。; W7 e! W% `1 a8 w
& f Q1 B$ l# E! b8 b& }2 Y给面向对象编程用户的注释4 t- z' _, O( }4 K4 x8 e
就每一个东西包括数、字符串甚至函数都是对象这一点来说,Python 是极其完全地面向对象的。, [* `6 c- R% |6 z! A! E
8 Q3 U% Y) t* g; y* C$ F$ I. E( e
我们将看一下如何使用变量和字面意义上的常量。保存下面这个例子,然后运行程序。
; k' f' N$ N( {; g4 p1 c& s3 T, q$ r0 [! N3 }! k6 c* T( ~0 f8 V
如何编写 Python 程序8 Y. | r0 j& g) {$ i' I* A
下面是保存和运行 Python 程序的标准流程。4 [7 U, R' e. X
$ W B9 F; h" j# _' b7 ~- c2 m5 ~打开你最喜欢的编辑器。/ N- T- j2 g% f+ X
2 C6 n6 q1 C3 A" A& S$ F输入例子中的程序代码。8 u/ e+ e' p$ }$ D5 @9 ?/ r( E' C
1 f9 L3 h8 ?) q* X; H/ t2 Z用注释中给出的文件名把它保存为一个文件。我按照惯例把所有的 Python 程序都以扩展名.py 保存。8 `5 f/ g2 u" C$ S
9 X8 f# h! V7 F' n4 G6 B- C I运行解释器命令 python program.py 或者使用 IDLE 运行程序。你也可以使用先前介绍的可执行的方法。3 P! X6 ^" n! K' I
7 ?$ B/ j# l, X: _
例 4.1 使用变量和字面意义上的常量 k: a" v! S Y' v$ u6 J
- <p>
7 J' \) f, g' B% k - </p><p># Filename : var.py </p><p>i = 5 </p><p>print i</p><p> i = i + 1 </p><p>print i s = '''This is a multi-line string. This is the second line.''' </p><p>print s </p>
复制代码 / i* V* W- U6 [ H1 v
1 ~/ e- w ?- J/ z. P, F5 o- K0 T
(源文件:code/var.py)
: N* j Y) K8 }! U6 Z& Y, E8 |6 O0 P1 I ~0 ?% N% t0 I
输出8 v6 P1 P" G- T& y) o8 {, o
$ [# i" `. x( H6 {. X
! z$ e2 P( i3 ]0 s6 }9 d& R: U0 S5 B) [
它如何工作! L$ }, ?/ O* O" [
, ~' r7 q. i6 G9 M! _5 _5 Z下面来说明一下这个程序如何工作。首先我们使用赋值运算符(=)把一个字面意义上的常数 5 赋给变量 i。这一行称为一个语句。语句声明需要做某件事情,在这个地方我们把变量名 i 与值 5 连接在一起。接下来,我们用print 语句打印 i 的值,就是把变量的值打印在屏幕上。- k% N& @5 }4 _# N
6 z' F3 W- X# l2 V
然后我们对i中存储的值加 1,再把它存回 i。我们打印它时,得到期望的值 6。% H! ^- [- v/ m' d+ Z2 x
! e8 i g1 m4 \; ]
类似地,我们把一个字面意义上的字符串赋给变量 s 然后打印它。8 f6 L( Z, j9 F; W4 ]" A
1 T7 X5 r0 ]) z, C
给 C/C++程序员的注释
! y4 C+ f/ h) m- s9 S" h使用变量时只需要给它们赋一个值。不需要声明或定义数据类型。
$ z# Z6 Q& Y% b/ `8 z' C% o% S, s( k; p2 C
逻辑行与物理行# ]" _" L' ~; Z3 A- _/ @
! {" Z# ?8 r% V; a6 J% Y2 X$ x
物理行是你在编写程序时所 看见 的。逻辑行是 Python 看见 的单个语句。Python 假定每个 物理行 对应一个 逻辑行 。9 ]4 ~6 f$ p% F0 u1 f
5 X3 s% ]8 h- S/ a& o( ]
逻辑行的例子如 print 'Hello World'这样的语句——如果它本身就是一行(就像你在编辑器中看到的那样),那么它也是一个物理行。. ]8 s- I/ Q: K: ]' l& y- v
0 m; s# T" n$ ?+ d. }0 a5 s X默认地,Python 希望每行都只使用一个语句,这样使得代码更加易读。
4 m) G) J* D' A& u' k. T" K) v- Q" u! Z; i
* D n- X, @0 I: n% H& E如果你想要在一个物理行中使用多于一个逻辑行,那么你需要使用分号(;)来特别地标明这种用法。分号表示一个逻辑行/语句的结束。例如:
, `9 i g t0 X9 M# R+ M$ j7 H2 e# \! |' _- `2 w8 Q1 Y6 F
0 s4 w7 j# y/ H1 m& Z: j8 |
9 t1 ]3 L5 S9 Z& x ] {- J+ b' }与下面这个相同:( Z; f. I7 P% W2 U
5 J' B! V4 U" K% K/ P/ r0 }
}5 ]7 ~8 v* D$ Q- c/ z2 W9 M9 s8 G# y: Z
同样也可以写成:
; K" o. @( i) q+ e8 B. T' m& N* p2 v$ Q
! _2 w) |3 ^! {
4 `2 C3 _; ]- i# {
甚至可以写成:
( f O+ H1 a8 U/ Z8 O9 N9 r! P' p
* M' \; }: x2 Z6 i
0 f( A' @% ?8 v8 x! j: ]3 z( h8 [9 Z
然而,我强烈建议你坚持在每个物理行只写一句逻辑行。仅仅当逻辑行太长的时候,在多于一个物理行写一个逻辑行。这些都是为了尽可能避免使用分号,从而让代码更加易读。事实上,我 从来没有 在 Python 程序中使用过或看到过分号。; S, F# D" \' _
/ \' S9 d+ B; T# J8 @, U0 R下面是一个在多个物理行中写一个逻辑行的例子。它被称为明确的行连接。: E2 |$ M, g) S5 x: V
P% y. o& U$ n8 z. P
s = 'This is a string. \ This continues the string.' print s
: t9 Z# @& P: I( j7 t; ?
" z' ~) }& t2 @) O( {它的输出:
5 d2 t' G* A# |8 x, T {8 R, X9 a3 t- <p>
( n) m, m& O% A, R/ X - </p><p>This is a string. This continues the string. </p>
复制代码 * A' }( T. _! j& l1 a+ S! |. J
$ ?$ e. p4 f0 l5 E \1 b' h+ L! b
类似地,7 h, i, {4 W- x, E2 U- F, v( E
- M8 D9 o: {. u% M
; t- B) U8 e7 T6 l! d" J# k, V. g4 x* r$ D
与如下写法效果相同:: t ]- P+ l' D$ x# F2 w
! l' A7 a# Q% h# j0 b0 @
& S2 P* Z' J( G0 E+ F* _% a2 U: j* x
' N& o9 d* z. H/ r6 D" P4 P
有时候,有一种暗示的假设,可以使你不需要使用反斜杠。这种情况出现在逻辑行中使用了圆括号、方括号或波形括号的时候。这被称为暗示的行连接。你会在后面介绍如何使用列表的章节中看到这种用法。
# t9 O% q) {' w' X" I* y" h8 M! V% @
$ \+ N M7 N" i3 ~* O3 Y" g缩进
/ {) n2 S0 f6 Q2 C8 V; ?) o* S: f' c+ g' q6 F" V
空白在 Python 中是重要的。事实上行首的空白是重要的。它称为缩进。在逻辑行首的空白(空格和制表符)用来决定逻辑行的缩进层次,从而用来决定语句的分组。
$ L1 T: D) a0 {* v' d( w( q1 O1 e' y6 K
这意味着同一层次的语句必须有相同的缩进。每一组这样的语句称为一个块。我们将在后面的章节中看到有关块的用处的例子。6 V6 k! y, J' D
# ]7 w6 D2 U2 W# U& _8 Q( a" l
你需要记住的一样东西是错误的缩进会引发错误。例如:
3 |( S' L8 Z' L% v6 o4 B
0 w+ }5 p, P# ]6 I& y6 ^( A$ q
5 `! ^9 E2 v. \# V" K2 }
1 Z6 O4 L2 v+ f6 L2 s当你运行这个程序的时候,你会得到下面的错误:
# g; k0 k; B s3 g$ i* w! W: C" L
- File "whitespace.py", line 4
复制代码 & {+ F% ?9 A: g
9 C& V% E& N7 ~, @+ ^8 ]
注意,在第二行的行首有一个空格。Python 指示的这个错误告诉我们程序的语法是无效的,即程序没有正确地编写。它告诉你, 你不能随意地开始新的语句块 (当然除了你一直在使用的主块)。何时你能够使用新块,将会在后面的章节,如控制流中详细介绍。
5 j- h6 \( g( a0 m. U/ T1 J2 u4 Y/ V, y+ C
如何缩进
* b2 d. o( i$ y! U; ^4 s8 K$ a j不要混合使用制表符和空格来缩进,因为这在跨越不同的平台的时候,无法正常工作。我 强烈建议 你在每个缩进层次使用 单个制表符 或 两个或四个空格 。 选择这三种缩进风格之一。更加重要的是,选择一种风格,然后一贯地使用它,即 只 使用这一种风格。
1 `1 M9 r; u7 r5 j- m5 `2 s' C5 d3 q: J4 g3 X5 s5 ~
1 I6 V% ^) _7 K; ~3 g( S6 y概括
: w4 e# d; J* E0 V' x* w" B9 d2 M3 P' [( H6 `
现在我们已经学习了很多详细的内容,我们可以开始学习更加令你感兴趣的东西,比如控制流语句。在继续学习之前,请确信你对本章的内容清楚明了。( T$ {0 O, a2 y7 z2 a2 l
9 B8 s: P+ N U& p) L- @ c* D
|