python二级考试题详解

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

4. 延伸阅读


  1. Python中[ : n]、[m : ]、[-1]、[:-1]、[::-1]、[2::-1]和[1:]的含义 ↩︎

  2. Python-列表元素删除与remove()方法 ↩︎

  3. Python 递归函数 ↩︎

  4. Python入门之函数的形式参数与实参/参数的具体使用方法 ↩︎

上一篇:java判断传入的字符串符合预期格式


下一篇:Java中参数传递问题