forked from xingkeyu/byte_of_python
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path06-basics.pd
317 lines (202 loc) · 11.8 KB
/
06-basics.pd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
# 基础
只是打印“Hello World”是不够的,是吗?你想要做的不仅仅是这些,你想带一些输入,操纵它,得到些输出。在Python中,我们使用常量和变量可以实现这些。在这一章,我们还将学习一些其他的概念。
## 注释
*注释*是#符号右边的任何文字,它对读程序的人有很大注释用处。
例如:
~~~python
print('Hello World') # 注意:print是一个函数
~~~
或者:
~~~python
# 注意:print是一个函数
print('Hello World')
~~~
在你的程序中,你尽可能使用有用的注释:
- 解释设想
- 解释重要决策
- 解释重要细节
- 解释你在试图解决的问题
- 解释程序中你在努力克服的问题,等等。
[*代码告诉你怎样做,注释告诉你这样做的原因。*](http://www.codinghorror.com/blog/2006/12/code-tells-you-how-comments-tell-you-why.html)
这对你的程序的读者是有用的,他们可以很容易地理解程序做什么。记住,六个月后这个人可以是你自己!
## 字面常量
字面常量的一个例子是一个数字就像“5”、“1.23”,或一个字符串像“这是一个字符串”或“它一个字符串!”。它被称为字面,因为它是*字面的*——你使用它的字面值。数字'2'总是代表本身并没有什么其他的——它是一个*常数*,因为它的价值是不能改变的,因此,所有这些被称为字面常量。
## 数字
数字主要有两种类型--整型和浮点数。
‘2’是整数的一个例子,它只是一个完整的数。
浮点数(或简称为*浮点*)的例子有`3.23`和`52.3E-4。符号`E`表示10的次方。在这种情况下,`52.3E-4`的意思是`52.3 * 10^-4^`。
有经验的程序要注意:
: Python中没有单独的`long`(长)整型。`int`(整型)可以是任意大小的整数。
## 字符串
字符串是*字符*的一个*序列*,字符串通常只是一串单词。
在你写的每一个Python程序中都要使用字符串,因此要注意以下部分:
### 单引号
你可以使用单引号例如`'Quote me on this'`指定字符串。所有的空白,例如空格和制表符都按原样保留。
### 双引号
在双引号中的字符串和在单引号中的字符串工作起来完全一样。例如`"What's your name?"`
### 三重引号
您可以使用三重引号-(`"""`或`'''`)指定多行字符串。在三重引号中您可以自由使用单引号和双引号。例如:
~~~python
'''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."
'''
~~~
### 字符串是不可改变的
这意味着,一旦您已经创建了一个字符串,你就不能改变它。虽然这看起来似乎是一件坏事,但它真不是(坏事)。在我们后面看到的各种程序中,将会明白这不是一个限制。
C/C++程序员要注意
: 在Python中没有单独的“char”(字符型)数据。这里没有真正的需要它,我相信你不会错过它。
Perl/PHP程序员要注意
: 记住,单引号字符串和双引号字符串是相同的——他们不以任何方式不同。
### 格式方法
有时,我们可能想要从其它信息构建字符串。这就是“format()”方法有用之处。
保存下面几行到文件"`str_format.py`"中:
~~~python
age = 20
name = 'Swaroop'
print('{0} was {1} years old when he wrote this book'.format(name, age))
print('Why is {0} playing with that python?'.format(name))
~~~
Output:
~~~
$ python3 str_format.py
Swaroop was 20 years old when he wrote this book
Why is Swaroop playing with that python?
~~~
它是如何工作的:
一个字符串可以使用特定的格式,随后调用*format*方法,用`format`方法替代那些使用适当参数的格式。
观察使用第一处,我们使用“{0}”对应于变量‘name’,这是format(格式)方法的第一个参数。类似的,第二个格式是“{1}”对应的“age”,这是格式方法的第二个参数。注意,Python从0开始计数,这意味着第一位置的索引是0,第二个位置的索引是1,等等。
注意,我们可以使用字符串的连接,`name+'is'+str(age)+'years old'` 实现同样的目的,但这非常讨厌、容易出错。第二,在这种情况下,通过`format`方法自动转换为字符串,而不是显式地转换为需要的字符串。第三,当使用的`format` 方法,我们可以改变消息,而无需处理使用的变量,反之亦然。
还要注意,这些数字(索引)都是可选的,所以你也可以写成:
~~~python
age = 20
name = 'Swaroop'
print('{} was {} years old when he wrote this book'.format(name, age))
print('Why is {} playing with that python?'.format(name))
~~~
这将给与前面的程序相同的输出。
Python在`format`方法中做的是,用每个参数值替代规格的地方。这里有更详细的规格,如:
~~~python
decimal (.) precision of 3 for float '0.333'
>>> '{0:.3}'.format(1/3)
fill with underscores (_) with the text centered
(^) to 11 width '___hello___'
>>> '{0:_^11}'.format('hello')
keyword-based 'Swaroop wrote A Byte of Python'
>>> '{name} wrote {book}'.format(name='Swaroop', book='A Byte of Python')
~~~
## 变量
仅仅使用字面常量会很快变得无聊——我们需要某种方式存储任何信息,同样操作它们。这就要引入*变量*。变量是它的名字所指示的东西——他们的值会有所不同。例如,你可以用变量存储任何值。变量是你电脑中存储信息的内存的一部分。不像字面常量,您需要某种方法来访问这些变量,因此你要给出他们的名字。
## 标识符命名
变量是标识符的一个示例。*标识符*是用来识别一些*东西*的名字。这里有一些你必须遵循的标识符命名规则:
- 标识符的第一个字符必须是字母表中的一个字母(大写或小写的ASCII或Unicode字符)或下划线(“_”)。
- 标识符名称的其余部分可以包含字母(大写或小写的ASCII或Unicode字符)、下划线(“_”)或数字(0 - 9)。
- 标识符的名称都是区分大小写的。例如,“myname”和“myName**不**相同。注意前者中“n”小写和后者中'N'大写。
- **有效*的标识符名称的例子有:“i”,“__my_name”,“name_23”。“无效”的标识符名字的例子有:“2things”,“this is spaced out”,“my-name”、“>a1b2_c3”和`"this_is_in_quotes"`。
## 数据类型
变量可以保存不同的被称为**数据类型**的数值。基本类型是数字和字符串,我们已经讨论了。在后面的章节中,我们将看到如何使用(类)(#面向对象的程序设计)创建自己的类型。
## 对象
记住,Python把程序中使用的任何东西作为一个*对象*。在常识中这意味着,我们说‘*对象*’,而不是说‘*一些东西*’,
面向对象编程的用户要注意
: 一切东西都是对象,包括数字、字符串和函数,在这个意义上讲,Python是坚定的面向对象的。
现在,我们将看到如何使用变量以及字面常量。保存下面的示例,运行这个程序。
## 怎样写Python程序
从此以后,保存和运行一个Python程序的标准过程如下:
#. 打开选择的编辑器,例如Komodo Edit。
#. 输入例子中给出的程序代码。
#. 用提到的文件名保存为文件。
#. 在命令行使用`python3 program.py`命令运行程序。
## 例如: 使用变量和常量
~~~python
Filename : var.py
i = 5
print(i)
i = i + 1
print(i)
s = '''这是一个多行字符串。
这是第2行。'''
print(s)
~~~
Output:
~~~
$ python3 var.py
5
6
这是一个多行字符串。
这是第2行。
~~~
它是如何工作的:
下面介绍这个程序如何工作的。首先,我们使用赋值运算符('=')为变量'i'指定了文字常量值‘5’,这一行叫做一个声明,因为它指出应该做一些事情,在这个例子中,我们将名为'i'的变量与值‘5’相联系。接下来,我们使用'print'函数打印'i'的值,不出所料,恰恰打印变量的值到屏幕上。
然后,我们给存储在变量'i'中的值加'1'后,再存回到'i'中。然后,我们把它打印出来,我我们想的一样,我们得到值'6'。
同样,我们为字符串变量's'指定了文字字符串,然后打印它。
静态语言程序员应注意
: 变量的使用只是通过给他们指定一个价。不需要/不使用声明或数据类型定义。
### 逻辑行与物理行
物理行是当你写程序时*看到*的一行。逻辑行是*Python 看和*的一个单独语句。Python默认一个*物理行*为一个*逻辑行*。
一个逻辑行是一个语句,像`print('Hello World')`--如果它本身在一行上(像你在一个编辑器中看到的),那么,它也是一个物理行。
默认情况下,Python鼓励一行写一个语句的用法,这使代码更可读。
如果您想要在一个物理行列举多个逻辑行,那么您必须使用一个表示逻辑行/语句结束的分号(“;”)显式地指明。例如:
~~~python
i = 5
print(i)
~~~
与
~~~python
i = 5;
print(i);
~~~
等效。
同样可写成:
~~~python
i = 5; print(i);
~~~
甚至是
~~~python
i = 5; print(i)
~~~
然而,我**强烈建议**你坚持**在每一个物理行编写一个最大的逻辑行**。这就是你永远都不要使用分号。事实上,我**从未**使用,甚至在python程序中从来没有见过一个分号。
这个观念是很有用的,还有一种情况:如果你有一个长代码行,你可以通过使用反斜杠把它分解为多个物理行。这是被称为**显式行连接**:
~~~python
s = '这是一个字符串。 \
这是字符串的继续。'
print(s)
~~~
输出结果为:
~~~
这是一个字符串。这是字符串的继续。
~~~
同样的,
~~~python
print\
(i)
~~~
与
~~~python
print(i)
~~~
相同
有时有一种隐含的假设,您不需要使用一个反斜杠。在这种情况下,逻辑行有一个开始圆括号、开始方括号或开始花括号,但不是一个结束的括号。这被称为**隐式连接**。当我们在以后的章节--编写程序使用[列表](#列表)时,你可以看到它的作用。
### 缩进
在Python中的空白是重要的。实际上,**在一行开始的空格是重要的**。这被称为**缩进**。在逻辑行开头的前导空白(空格和制表符)用于确定逻辑行的缩进级别,它用于依次确定语句的分组。
这意味着一起的语句**必须**有相同的缩进。每一个这样的语句组被称为**块**。在后面的章节,我们将看到的块是何等重要的例子。
你应该记住的一件事是,错误的缩进可以产生错误。例如:
~~~python
i = 5
print('值是 ', i) # 错误! 注意在行的开头有一个空格
print('重复,值是 ', i)
~~~
当运行它时,将会发生下面的错误:
~~~
File "whitespace.py", line 4
print('Value is ', i) # Error! Notice a single space at the start of the line
^
IndentationError: unexpected indent
~~~
请注意,这里第二行的开头有一个空格。这个错误表明:Python告诉我们程序的语法是无效的,即程序写的不正确。这意味着,*你不能任意开始语句中的新块*(当然,除了默认的主块,您一直已经使用的)。您可以使用新块的情况,将在后面的章节详细,如(控制流](#控制流)。
如何缩进
: 缩进只使用空白,用制表符使用4个空格。好的编辑器如Komodo Edit会为你自动这样做。确保你使用一致的数量的缩进空格,否则你的程序将显示错误。
静态语言程序员应注意
: Python为块总是使用缩进,从来不用花括号。运行`from __future__ import braces`可以了解更多。
## 小结
现在,我们已经经历了许多细节,我们可以转到更有趣的东西,如控制流语句。一定要熟悉这一章你所读的。