呵呵,本节主要简单的讨论一下用for来实现递归操作。
先看一下本节设计的小程序要求,有这样一个list:
[1, 2, [3, 4], 5, 6, [7, 8, 9]]
用for循环打印结果是什么样的呢?
def p():
for i in [1, 2, [3, 4], 5, 6, [7, 8, 9]]:
print i
def main():
p()
main()
运行结果为:
我们能有办法打印出下面的结果么?
也就是说遇到了子list列表也一项项输出。
要想实现上边的要求这里需要学习一个python内建(built-in)函数,isinstance(),先看看该函数的帮助好了
Help on built-in function isinstance in module __builtin__:
isinstance(...)
isinstance(object, class-or-type-or-tuple) -> bool
Return whether an object is an instance of a class or of a subclass thereof.
With a type as second argument, return whether that is the object's type.
The form using a tuple, isinstance(x, (A, B, ...)), is a shortcut for
isinstance(x, A) or isinstance(x, B) or ... (etc.).
(END)
如果参数object是classinfo的实例,或者object是classinfo类的子类的一个实例, 返回True。如果object不是一个给定类型的的对象, 则返回结果总是False。
有了isinstance函数的帮助,我们就可以实现上图程序的要求了。
def p():
for i in [1, 2, [3, 4], 5, 6, [7, 8, 9]]:
if isinstance(i, list):
for j in i:
print j
else:
print i
def main():
p()
main()
程序第2行的for循环会分6次将数据依次取出赋值给i变量,当i =
[3, 4]的时候,第3行代码会判断此时的i是否是list类型?结果为真,则执行第4~5这嵌套的for循环,第4~5行的for循环会2
次从[3, 4]里取出数据赋值给j变量,这样[3, 4]被分别打印出来了,而[3, 4]前边的1和2不满足第3行的if条件判断则去执行print i打印语句了。第2行的list里后边的5和6也是不满足第3行的判断条件而被直接打印输出,当第2行的for循环遇到[7, 8, 9]时也是先赋值给i,第3行判断出了此时的i是list类型数据,从而又执行了第4~5行的for循环体,因此7,8,9三个数也能一一打印出来。程序运行结果如下图所示。
现留一个问题思考一下:如果list里有n层的list嵌套,该如何实现呢?用递归!我研究出来了!呵呵!
[1, 2, 4, [5, [6,[7,8],[9,10,[[11],1],2,4]]]]
n未知,该如何是好?