1. 题目
下面这段代码的输出是:
1 l = 'abcd'
2 def f(x,result=['a','b','c','d']):
3 if x:
4 result.remove(x[-1])
5 f(x[:-1])
6 return
7 print(f(l))
2. 答案
[]
3. 解析
3.1 预备知识
- x([-1]):表示取x中最后一个元素; x([:-1]):表示取x中除了最后一个元素的剩余元素1;
- result.remove(x([-1])): 删除result变量中首个符合条件的元素,这里的条件是(x中最后一个元素)2;
- 递归函数:在函数定义中调用函数本身,如这里定义f函数时,row 5 又出现f()3;
- 默认参数:函数定义阶段,已经为某个形参赋值,该形参被称为默认参数4。
3.2 迭代过程
下面给出代码解析的详细过程,row 1指代码的第一行,以此类推
- row 1:将字符串’abcd’赋值给字符变量l,注意字符变量和列表变量result的类型不同;
- row 2 - row 6:定义了一个f函数,注意默认参数result=[‘a’,‘b’,‘c’,‘d’],函数的功能可以简要描述为:移除默认参数result的最后一位,直到形式参数x为空。
- row 6: 函数调用无返回值
- row 7:打印输出调用函数f,自此进入迭代循环,具体地:
循环编号 | 内容 | |
第一轮 | - row 2: x = "abcd", result = ['a','b','c','d'] | |
- row 3: x = "abcd"不为空,所以执行if下的语句: | ||
- row 4: 移除result列表中“d”,即result = ['a','b','c'] | ||
- row 5: f(x[:-1]),即f(abc)再次调用f函数本身回到row 2,进入下一循环 | ||
第二轮 | - row 2: x = "abc", result = ['a','b','c'] | |
- row 3: x = "abc"不为空,所以执行if下的语句: | ||
- row 4: 移除result列表中“c”,即result = ['a','b'] | ||
- row 5: f(x[:-1]),即f(ab)再次调用f函数本身回到row 2,进入下一循环 | ||
第三轮 | - row 2: x = "ab", result = ['a','b'] | |
- row 3: x = "ab"不为空,所以执行if下的语句: | ||
- row 4: 移除result列表中“b”,即result = ['a'] | ||
- row 5: f(x[:-1]),即f(a)再次调用f函数本身回到row 2,进入下一循环 | ||
第四轮 | - row 2: x = "a", result = ['a'] | |
- row 3: x = "a"不为空,所以执行if下的语句: | ||
- row 4: 移除result列表中“a”,即result = [] | ||
- row 5: f(x[:-1]),即f([])再次调用f函数本身回到row 2,进入下一循环 | ||
第五轮 | - row 2: x = " ", result = [ ] | |
- row 3: x 为空,所以不再执行if下的语句,转到 row 6 | ||
- row 6: return 跳出函数,不传递任何参数,故 row 7 结果为None |