守望的麦子

关于 for 循环

2017-11-27    东京 /python/2017/11/27/for.html python

Python 是一门优雅而健壮的编程语言,它继承了传统编译语言的强大性和通用性,同时也借鉴了简单脚本和解释语言的易用性。

Python 编程简明教程 https://wheat.at/python/

Python 中的 for 循环接受可迭代对象作为其参数,每次迭代其中的一个元素。例如:

 1 >>> fruits = ['apple', 'banana', 'pear', 'orange']
 2 >>> for i in fruits:
 3 	print i
 4 
 5 	
 6 apple
 7 banana
 8 pear
 9 orange
10 >>> 

print 语句默认会为每一行添加一个换行符,只要我们在 print 语句最后添加一个 , 就会取消换行符:

1 >>> for i in fruits:
2 	print i,
3 
4 	
5 apple banana pear orange
6 >>> 

print 为我们的每一个元素添加了一个空格,这样看起来更加清晰美观。如果要最大程度的控制输出布局,我们可以变量传递的方法,将数据放在一处,借助于格式化操作符号 %,然后将数据封装在元组或者字典中并放在 % 的右侧。例如:

1 >>> print "Do you want %s %s" % ("an apple?", "Bob.")
2 Do you want an apple? Bob.

我们还可以使用 for 来生成一个数字序列,例如:

1 >>> for i in [1, 2, 3]:
2 	print i
3 
4 	
5 1
6 2
7 3
8 >>> 

但如果我们需要一个 1-100 的数字序列,通过上面的方法显然不可行。这时候我们可以借助于 Python 的内置函数 range()。例如:

1 >>> range(3)
2 [0, 1, 2]

等等,怎么是从 0 开始?查看一下 range 的帮助文档:

 1 >>> help(range)
 2 Help on built-in function range in module __builtin__:
 3 
 4 range(...)
 5     range(stop) -> list of integers
 6     range(start, stop[, step]) -> list of integers
 7     
 8     Return a list containing an arithmetic progression of integers.
 9     range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
10     When step is given, it specifies the increment (or decrement).
11     For example, range(4) returns [0, 1, 2, 3].  The end point is omitted!
12     These are exactly the valid indices for a list of 4 elements.
13 
14 >>> 

原来 range(3) 中的 3 表示在遇到 3 时停止。而假如我们需要 1-10 的话,应该需要这样写 range(1, 11),测试一下:

1 >>> range(1,11)
2 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

所以 1-100 的正确写法应该是 range(1, 101)

for 循环不仅可以迭代元组类,对字符串也是可用的:

 1 >>> for i in 'abcdefg':
 2 	print i
 3 
 4 	
 5 a
 6 b
 7 c
 8 d
 9 e
10 f
11 g
12 >>> 

Python 中获取字符串长度的函数是 len(),例如对 abcdefg 取得字符串长度的写法是:

1 >>> len('abcdefg')
2 7
3 >>>

当然实际应用时,我们的字符串通常会是赋予一个变量名的:

1 >>> text = 'abcdefghijklmn'
2 >>> len(text)
3 14
4 >>>

那如果我们要取得一个字符串的索引值和其元素的对应关系,我们可以怎么写呢?

就可以使用 for 循环结合 range()len() 函数了,例如可以这样写:

 1 >>> for i in range(len(text)):
 2 	print i, text[i]
 3 
 4 	
 5 0 a
 6 1 b
 7 2 c
 8 3 d
 9 4 e
10 5 f
11 6 g
12 7 h
13 8 i
14 9 j
15 10 k
16 11 l
17 12 m
18 13 n
19 >>> 

美观一些,可以这样:

 1 >>> for i in range(len(text)):
 2 	print '(%d)' % i, text[i]
 3 
 4 	
 5 (0) a
 6 (1) b
 7 (2) c
 8 (3) d
 9 (4) e
10 (5) f
11 (6) g
12 (7) h
13 (8) i
14 (9) j
15 (10) k
16 (11) l
17 (12) m
18 (13) n
19 >>> 

不过,这样的循环写法有一个约束 —— 要么循环索引,要么循环元素。于是在 Python 2.3 后新推出了 enumerate() 函数,它同时做到了这两点,我们可以这样写:

 1 >>> for i, j in enumerate(text):
 2 	print '(%d)' % i, j
 3 
 4 	
 5 (0) a
 6 (1) b
 7 (2) c
 8 (3) d
 9 (4) e
10 (5) f
11 (6) g
12 (7) h
13 (8) i
14 (9) j
15 (10) k
16 (11) l
17 (12) m
18 (13) n
19 >>> 

关于 enumerate() 函数的语法是这样:

 1 >>> help(enumerate)
 2 Help on class enumerate in module __builtin__:
 3 
 4 class enumerate(object)
 5  |  enumerate(iterable[, start]) -> iterator for index, value of iterable
 6  |  
 7  |  Return an enumerate object.  iterable must be another object that supports
 8  |  iteration.  The enumerate object yields pairs containing a count (from
 9  |  start, which defaults to zero) and a value yielded by the iterable argument.
10  |  enumerate is useful for obtaining an indexed list:
11  |      (0, seq[0]), (1, seq[1]), (2, seq[2]), ...
12  |  
13  |  Methods defined here:
14  |  
15  |  __getattribute__(...)
16  |      x.__getattribute__('name') <==> x.name
17  |  
18  |  __iter__(...)
19  |      x.__iter__() <==> iter(x)
20  |  
21  |  next(...)
22  |      x.next() -> the next value, or raise StopIteration
23  |  
24  |  ----------------------------------------------------------------------
25  |  Data and other attributes defined here:
26  |  
27  |  __new__ = <built-in method __new__ of type object>
28  |      T.__new__(S, ...) -> a new object with type S, a subtype of T
29 
30 >>>
关于作者
麦子,80 后,现从事通信行业。安卓玩家一个人的书房朗读者。
MRJENGLISH
jsntn
jasonwtien
jasonwtien
更多…… /about.html

最近更新: