X Tutup
Skip to content

Commit 866aef3

Browse files
committed
modify if
1 parent d018301 commit 866aef3

File tree

2 files changed

+95
-121
lines changed

2 files changed

+95
-121
lines changed

123.md

Lines changed: 84 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
for 循环规则:
1616
操作语句
1717

18-
从这个基本结构看,有着同if条件语句类似的地方:都有冒号;语句块都要缩进。是的,这是不可或缺的
18+
从这个基本结构看,有着同if条件语句类似的地方:都有冒号;语句块都要四个空格缩进
1919

20-
##简单的for循环例子
20+
##从例子中理解for循环
2121

2222
前面介绍print语句的时候,出现了一个简单例子。重复一个类似的:
2323

@@ -72,6 +72,88 @@
7272
I am qiwsir
7373
Welcome you
7474

75+
以上两个例子中,是将for循环用于字符串和列表,此外,还可以用于字典、元组。例如:
76+
77+
>>> d = dict([("website", "www.itdiffer.com"), ("lang", "python"), ("author", "laoqi")])
78+
>>> d
79+
{'website': 'www.itdiffer.com', 'lang': 'python', 'author': 'laoqi'}
80+
>>> for k in d:
81+
print k
82+
83+
上面的代码,输出结果是:
84+
85+
website
86+
lang
87+
author
88+
89+
注意到,上面的循环,其实是读取了字典的key。在字典中,有一个方法,`dict.keys()`,得到的是字典key列表。
90+
91+
>>> for k in d.keys():
92+
print k
93+
94+
website
95+
lang
96+
author
97+
98+
这种循环方法和上面的循环方法,结果是一样的,但是,这种方法并不提倡,以为它在执行速度上表现欠佳。
99+
100+
如果要获得字典的value怎么办?不要忘记`dict.values()`方法。读者可以自行测试一番。
101+
102+
除了可以单独获得key或者value的循环之外,还可以这么做:
103+
104+
>>> for k,v in d.items():
105+
print k + "-->" + v
106+
107+
website-->www.itdiffer.com
108+
lang-->python
109+
author-->laoqi
110+
111+
在工程实践中,你一定会遇到非常大的字典。用上面的方法,要把所有的内容都读入内存,内存东西多了,可能会出麻烦。为此,Python中提供了另外的方法。
112+
113+
>>> for k,v in d.iteritems():
114+
print k + "-->" + v
115+
116+
website-->www.itdiffer.com
117+
lang-->python
118+
author-->laoqi
119+
120+
这里是循环一个迭代器,迭代器在循环中有很多优势。除了刚才的`dict.iteritems()`之外,还有`dict.itervalues()``dict.iterkeys()`供你选用。
121+
122+
>>> d.iteritems()
123+
<dictionary-itemiterator object at 0x000000000322E368>
124+
125+
至于对元组的循环,读者自行尝试即可。
126+
127+
除了上述的对象之外,for循环还能应用到哪些对象上?能不能用在数字上呢?
128+
129+
>>> for i in 321:
130+
print i
131+
132+
Traceback (most recent call last):
133+
File "<pyshell#48>", line 1, in <module>
134+
for i in 321:
135+
TypeError: 'int' object is not iterable
136+
137+
报错了。这说明对于数字不能使用for循环。不过,光知道这个还不行,还要看看报错信息。
138+
139+
报错信息中告诉我们,‘int’对象不是可迭代的。言外之意是什么?那就是for循环所应用的对象,应该是可迭代的。那么,怎么判断一个对象是不是可迭代的呢?
140+
141+
>>> import collections
142+
143+
引入collections这个标准库。要判断数字321是不是可迭代的,可以这么做:
144+
145+
>>> isinstance(321, collections.Iterable)
146+
False
147+
148+
返回了False,说明321这个整数类型的对象,是不可迭代的。再判断一个列表对象。
149+
150+
>>> isinstance([1,2,3], collections.Iterable)
151+
True
152+
153+
从返回结果,我们知道,列表[1,2,3]是可迭代的。
154+
155+
当然,并不是要你在使用for循环之前,非要判断某个对象是否可迭代。因为至此,你已经晓得了字符串、列表、字典、元组都是可迭代的。
156+
75157
##range(start,stop[, step])
76158

77159
这个内建函数,非常有必要给予说明,因为它会经常被使用。一般形式是`range(start, stop[, step])`
@@ -201,114 +283,6 @@
201283
>>> range(3,100,3)
202284
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
203285

204-
##能够用来for的对象
205-
206-
所有的序列类型对象,都能够用for来循环。比如:
207-
208-
>>> name_str = "qiwsir"
209-
>>> for i in name_str: #可以对str使用for循环
210-
... print i,
211-
...
212-
q i w s i r
213-
214-
>>> name_list = list(name_str)
215-
>>> name_list
216-
['q', 'i', 'w', 's', 'i', 'r']
217-
>>> for i in name_list: #对list也能用
218-
... print i,
219-
...
220-
q i w s i r
221-
222-
>>> name_set = set(name_str) #set还可以用
223-
>>> name_set
224-
set(['q', 'i', 's', 'r', 'w'])
225-
>>> for i in name_set:
226-
... print i,
227-
...
228-
q i s r w
229-
230-
>>> name_tuple = tuple(name_str)
231-
>>> name_tuple
232-
('q', 'i', 'w', 's', 'i', 'r')
233-
>>> for i in name_tuple: #tuple也能呀
234-
... print i,
235-
...
236-
q i w s i r
237-
238-
>>> name_dict={"name":"qiwsir","lang":"python","website":"qiwsir.github.io"}
239-
>>> for i in name_dict: #dict也不例外,这里本质上是将字典的键拿出来,成为序列后进行循环
240-
... print i,"-->",name_dict[i]
241-
...
242-
lang --> python
243-
website --> qiwsir.github.io
244-
name --> qiwsir
245-
246-
在用for来循环读取字典键值对上,需要多说几句。
247-
248-
有这样一个字典:
249-
250-
>>> a_dict = {"name":"qiwsir", "lang":"python", "email":"qiwsir@gmail.com", "website":"www.itdiffer.com"}
251-
252-
曾记否?在[《字典(2)》](./117.md)中有获得字典键、值的函数:items/iteritems/keys/iterkeys/values/itervalues,通过这些函数得到的是键或者值的列表。
253-
254-
>>> for k in a_dict.keys():
255-
... print k, a_dict[k]
256-
...
257-
lang python
258-
website www.itdiffer.com
259-
name qiwsir
260-
email qiwsir@gmail.com
261-
262-
这是最常用的一种获得字典键/值对的方法,而且效率也不错。
263-
264-
>>> for k,v in a_dict.items():
265-
... print k,v
266-
...
267-
lang python
268-
website www.itdiffer.com
269-
name qiwsir
270-
email qiwsir@gmail.com
271-
272-
>>> for k,v in a_dict.iteritems():
273-
... print k,v
274-
...
275-
lang python
276-
website www.itdiffer.com
277-
name qiwsir
278-
email qiwsir@gmail.com
279-
280-
这两种方法也能够实现同样的效果,但是因为有了上面的方法,一般就少用了。但是,用也无妨,特别是第二个`iteritems()`,效率也是挺高的。
281-
282-
但是,要注意下面的方法:
283-
284-
>>> for k in a_dict.keys():
285-
... print k, a_dict[k]
286-
...
287-
lang python
288-
website www.itdiffer.com
289-
name qiwsir
290-
email qiwsir@gmail.com
291-
292-
这种方法其实是不提倡的,虽然实现了同样的效果,但是效率常常是比较低的。切记。
293-
294-
>>> for v in a_dict.values():
295-
... print v
296-
...
297-
python
298-
www.itdiffer.com
299-
qiwsir
300-
qiwsir@gmail.com
301-
302-
>>> for v in a_dict.itervalues():
303-
... print v
304-
...
305-
python
306-
www.itdiffer.com
307-
qiwsir
308-
qiwsir@gmail.com
309-
310-
单独取values,推荐第二种方法。
311-
312286
------
313287

314288
[总目录](./index.md)&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[上节:语句(2)](./122.md)&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[下节:语句(4)](./124.md)

n005.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010

1111
但如果想要用Python开发一个新项目,那么该如何选择Python版本呢?我可以负责任的说,大部分Python库都同时支持Python 2.7.x和3.x版本的,所以不论选择哪个版本都是可以的。但为了在使用Python时避开某些版本中一些常见的陷阱,或需要移植某个Python项目时,依然有必要了解一下Python两个常见版本之间的主要区别。
1212

13-
##'__future__'模块
13+
##`__future__`模块
1414

15-
Python3.x引入了一些与Python2不兼容的关键字和特性,在Python2中,可以通过内置的'__future__'模块导入这些新内容。如果你希望在Python2环境下写的代码也可以在Python 3.x中运行,那么建议使用'__future__'模块。例如,如果希望在Python2中拥有Python3.x的整数除法行为,可以通过下面的语句导入相应的模块。
15+
Python3.x引入了一些与Python2不兼容的关键字和特性,在Python2中,可以通过内置的`__future__`模块导入这些新内容。如果你希望在Python2环境下写的代码也可以在Python 3.x中运行,那么建议使用`__future__`模块。例如,如果希望在Python2中拥有Python3.x的整数除法行为,可以通过下面的语句导入相应的模块。
1616

1717
from __future__ import division
1818

19-
下表列出了'__future__'中其他可导入的特性:
19+
下表列出了`__future__`中其他可导入的特性:
2020

2121
![](./nimages/n005-01.png)
2222

@@ -28,7 +28,7 @@ Python3.x引入了一些与Python2不兼容的关键字和特性,在Python2中
2828

2929
虽然print语法是Python3中一个很小的改动,且应该已经广为人知,但依然值得提一下:Python2中的print语句被Python3中的print()函数取代,这意味着在Python3中必须用括号将需要输出的对象括起来。
3030

31-
在Python2中使用额外的括号也是可以的。但反过来在Python3中想以Python2的形式不带括号调用print函数时,会触发'SyntaxError'
31+
在Python2中使用额外的括号也是可以的。但反过来在Python3中想以Python2的形式不带括号调用print函数时,会触发`SyntaxError`
3232

3333
###Python 2
3434

@@ -77,7 +77,7 @@ Python3.x引入了一些与Python2不兼容的关键字和特性,在Python2中
7777

7878
由于人们常常会忽视Python3在整数除法上的改动(写错了也不会触发Syntax Error),所以在移植代码或在Python2中执行Python3的代码时,需要特别注意这个改动。
7979

80-
所以,我还是会在Python3的脚本中尝试用float(3)/2或 3/2.0代替3/2,以此来避免代码在Python2环境下可能导致的错误(或与之相反,在Python 2脚本中用'from __future__ import division'来使用Python3的除法)。
80+
所以,我还是会在Python3的脚本中尝试用float(3)/2或 3/2.0代替3/2,以此来避免代码在Python2环境下可能导致的错误(或与之相反,在Python 2脚本中用`from __future__ import division`来使用Python3的除法)。
8181

8282
###Python 2
8383

@@ -163,7 +163,7 @@ Python2有基于ASCII的str()类型,其可通过单独的unicode()函数转成
163163

164164
##xrange
165165

166-
在Python2.x中,经常会用'xrange()'创建一个可迭代对象,通常出现在“for循环”或“列表/集合/字典推导式”中。
166+
在Python2.x中,经常会用`xrange()`创建一个可迭代对象,通常出现在“for循环”或“列表/集合/字典推导式”中。
167167

168168
这种行为与生成器非常相似(如”惰性求值“),但这里的xrange-iterable无尽的,意味着可能在这个xrange上无限迭代。
169169

@@ -221,9 +221,9 @@ Python2有基于ASCII的str()类型,其可通过单独的unicode()函数转成
221221

222222
NameError: name 'xrange' is not defined
223223

224-
##Python 3中的range对象中的'__contains__'方法
224+
##Python 3中的range对象中的`__contains__`方法
225225

226-
另一个值得一提的是,在Python 3.x中,range有了一个新的'__contains__'方法。'__contains__'方法可以有效的加快Python 3.x中整数和布尔型的“查找”速度。
226+
另一个值得一提的是,在Python 3.x中,range有了一个新的`__contains__`方法。`__contains__`方法可以有效的加快Python 3.x中整数和布尔型的“查找”速度。
227227

228228
x = 10000000
229229
def val_in_range(x, val):
@@ -242,7 +242,7 @@ Python2有基于ASCII的str()类型,其可通过单独的unicode()函数转成
242242
1 loops, best of 3: 742 ms per loop
243243
1000000 loops, best of 3: 1.19 µs per loop
244244

245-
根据上面的timeit的结果,查找整数比查找浮点数要快大约6万倍。但由于Python 2.x中的range或xrange没有'__contains__'方法,所以在Python 2中的整数和浮点数的查找速度差别不大。
245+
根据上面的timeit的结果,查找整数比查找浮点数要快大约6万倍。但由于Python 2.x中的range或xrange没有`__contains__`方法,所以在Python 2中的整数和浮点数的查找速度差别不大。
246246

247247
print 'Python', python_version()
248248

@@ -261,7 +261,7 @@ Python2有基于ASCII的str()类型,其可通过单独的unicode()函数转成
261261
1 loops, best of 3: 658 ms per loop
262262
1 loops, best of 3: 556 ms per loop
263263

264-
下面的代码证明了Python 2.x中没有'__contain__'方法:
264+
下面的代码证明了Python 2.x中没有`__contain__`方法:
265265

266266
print('Python', python_version())
267267
range.__contains__
@@ -503,7 +503,7 @@ Python 3中另一个优秀的改动是,如果我们试图比较无序类型,
503503
4 print("[1, 2] > (1, 2) = ", [1, 2] > (1, 2))
504504
TypeError: unorderable types: list() > str()
505505

506-
##通过'input()'解析用户的输入
506+
##通过`input()`解析用户的输入
507507

508508
幸运的是,Python 3改进了input()函数,这样该函数就会总是将用户的输入存储为str对象。在Python 2中,为了避免读取非字符串类型会发生的一些危险行为,不得不使用raw_input()代替input()。
509509

0 commit comments

Comments
 (0)
X Tutup