# 函数

# 选择题

# 1. 题目

函数如下:
def showNnumber(numbers):
    for n in numbers:
         print(n)
下面哪些在调用函数时会报错(  )
A.showNumer([2,4,5])
B.showNnumber(‘abcesf’)
C.showNnumber(3.4)
D.showNumber((12,4,5))

答案:C

选项 A:传入列表 [2,4,5],列表是可迭代对象,能够被 for 循环遍历,不报错。

选项 B:传入字符串 'abcesf',字符串是可迭代对象,能够被 for 循环遍历,不报错。

选项 C:传入浮点数 3.4,浮点数是不可迭代对象,无法被 for 循环遍历,会报错,这是唯一会报错的选项。

选项 D:传入元组 (12,4,5),元组是可迭代对象,能够被 for 循环遍历,不报错。


# 2. 题目

函数如下: 
def chanageInt(number2):
    number2 = number2+1
    print("changeInt: number2= ",number2)
#调用
number1 = 2
chanageInt(number1)
print("number:",number1)
显示结果哪项是正确的(   )
A.
number: 2
changeInt: number2= 3
B.
changeInt: number2= 3
number: 2
C.
changeInt: number2= 3
number: 3
D.
number: 2
changeInt: number2= 2

答案:B

选项 A:执行顺序错误,应该先调用函数打印函数内部信息,再打印全局变量,错误。

选项 B:执行顺序正确,函数内部打印 changeInt: number2= 3,然后打印全局变量 number: 2(整数是不可变类型,函数内修改不影响外部变量),正确。

选项 C:错误认为外部变量 number1 会变为 3,整数是不可变类型,函数内修改不影响外部变量,错误。

选项 D:执行顺序错误,且函数内部 number2 的值错误,错误。


# 3. 题目

调用以下函数返回的值(  ) 
def myfun(): 
	pass 
A. 空字符串 
B. 0 
C. 出错不能运行 
D. None

答案:D

选项 A:空字符串是明确的字符串类型值,函数未显式返回,不会默认返回空字符串,错误。

选项 B:0 是整数类型值,函数未显式返回,不会默认返回 0,错误。

选项 C:pass 语句让函数定义合法,调用函数不会出错,错误。

选项 D:Python 函数无显式 return 语句时,默认返回 None,正确。


# 4. 题目

(多选)
已知函数定义 
def func(*p):
    return sum(p)
那么下列表达式能得到正确结果的是(  )。
A.func(1, 2, 3, 4)
B.func(*{1, 2, 3, 4})
C.func([1, 2, 3, 4])
D.func(*(1, 2, 3, 4))

答案:ABD

选项 A:直接传入 4 个整数位置实参,*p 打包为元组 (1,2,3,4),sum 计算结果为 10,正确。

选项 B:* 对集合解包为 4 个独立整数实参,*p 打包为元组,sum 计算结果为 10,正确。

选项 C:直接传入列表 [1,2,3,4],*p 打包为元组 ([1,2,3,4]),sum 无法对列表求和,错误。

选项 D:* 对元组解包为 4 个独立整数实参,*p 打包为元组,sum 计算结果为 10,正确。


# 5. 题目

(多选)
函数如下:
def chanageList(list): 
    list.append(" end")
    print("list",list) 
#调用
strs =['1','2'] 
chanageList(strs) 
print("strs",strs)
下面对 strs 和 list 的值输出正确的是(      )
A.list ['1','2',’end’]
B.strs  ['1','2',’end’]
C.list  ['1','2']
D.strs ['1','2']

答案:AB

选项 A:函数内调用 append ("end") 后,列表变为 ['1','2','end'],print 输出 list ['1','2','end'],正确。

选项 B:列表是可变对象,函数内修改会影响外部原始对象,因此 strs 的值也是 ['1','2','end'],正确。

选项 C:函数内已经调用 append ("end"),列表内容已修改,错误。

选项 D:列表是可变对象,函数内修改会影响外部原始对象,strs 的值已修改,错误。


# 判断题

# 1. 题目

在定义函数时,某个参数名字前面带有一个*符号表示可变长度参数,可以接收任意多个普通实参并存放于一个元组之中。  (   )

答案:对

解析:在函数定义中,参数名前加一个 * ,表示该参数用于接收任意数量的位置实参,将这些实参按顺序打包成一个元组,参数名指向这个元组。


# 2. 题目

定义函数时,即使该函数不需要接收任何参数,也必须保留一对空的圆括号来表示这是一个函数。(    )

答案:对

解析:在 Python 中,函数的定义格式为 def 函数名(参数列表): ,其中圆括号 () 是语法必需项,用于明确标识这是一个函数定义,即使函数不需要接收任何参数,也必须保留空的圆括号。


# 填空题

# 1. 题目

表达式 list(filter(lambda x:x>2, [0,1,2,3,0,0])) 的值为______

答案:[3]

解析filter(lambda x:x>2, [0,1,2,3,0,0]) 过滤出大于 2 的元素(只有 3),返回迭代器; list() 将迭代器转换为列表 [3]。


# 2. 题目

已知formatter = 'good {0}'.format,那么表达式list(map(formatter, ['morning','afternoon']))的值为_______

答案:['good morning','good afternoon']

解析formatter 绑定了字符串 'good {0}' 的 format 方法,作用是接收一个字符串参数并返回格式化字符串; map() 将 formatter 应用到 ['morning','afternoon'] 的每个元素,得到 ['good morning','good afternoon']。


# 3. 题目

已知函数定义 def func(**p): return sum(p.values()), 那么表达式 func(x=1, y=2, z=3) 的值为_______

答案:6

解析**p 将关键字参数收集为字典 {'x':1, 'y':2, 'z':3}; sum(p.values()) 对字典的值求和,结果为 1+2+3=6。


# 4. 题目

已知 g = lambda x, y=3, z=5: x*y*z,则语句 print(g(1)) 的输出结果为______

答案:15

解析:lambda 函数定义了默认参数 y=3 和 z=5,调用 g (1) 时仅传入 x=1,y 和 z 使用默认值;计算 135=15。


# 5. 题目

已知函数定义 def func(**p): return ''.join(sorted(p)) 那么表达式 func(x=1, z=3, y=2)的值为____

答案:'xyz'

解析**p 将关键字参数收集为字典 {'x':1, 'z':3, 'y':2}; sorted(p) 对字典的键进行排序得到 ['x','y','z']; ''.join() 将排序后的键拼接为字符串 'xyz'。


# 6. 题目

如果函数中没有return语句或者return语句不带任何返回值,那么该函数的返回值为____

答案:None

解析:Python 规定,所有函数都有返回值,无论是否显式书写 return 语句。如果函数中没有 return 语句或 return 语句不带任何返回值,函数执行结束后都会默认返回 None。


# 7. 题目

表达式 list(map(list,zip(*[[1, 2, 3], [4, 5, 6]]))) 的值为_____

答案:[[1,4],[2,5],[3,6]]

解析*[[1,2,3],[4,5,6]] 解包为 [1,2,3] 和 [4,5,6]; zip() 按位置打包为 ((1,4),(2,5),(3,6)); map(list, ...) 将每个元组转换为列表; list() 转换为最终的二维列表 [[1,4],[2,5],[3,6]]。


# 8. 题目

下面的代码输出结果为_______。
def demo():
    x = 5
x = 3
demo()
print(x)

答案:3

解析:函数内部的 x 是局部变量,作用域仅局限于函数内部;外部的 x 是全局变量,值为 3;函数调用结束后,打印的是全局变量 x 的值 3。


# 9. 题目

表达式 list(map(lambda x: x+5, [1, 2, 3, 4, 5])) 的值为______

答案:[6,7,8,9,10]

解析lambda x: x+5 定义了给每个元素加 5 的规则; map() 将该规则应用到 [1,2,3,4,5] 的每个元素,得到 [6,7,8,9,10]。


# 10. 题目

已知formatter = 'good {0}'.format,那么表达式list(map(formatter, ['morning']))的值为_______

答案:['good morning']

解析formatter 绑定了字符串 'good {0}' 的 format 方法; map() 将 formatter 应用到 ['morning'] 的元素,得到 ['good morning']。


# 11. 题目

已知 f = lambda x: 5,那么表达式 f(3)的值为_______

答案:5

解析:该 lambda 函数无论传入什么参数,都固定返回 5,因此 f (3) 的值为 5。


# 12. 题目

已知函数定义 def demo(x, y, op): return eval(str(x)+op+str(y)) 那么表达式demo(3, 5, '*')的值为______

答案:15

解析str(x)+op+str(y) 拼接为字符串 '3*5'; eval() 执行该字符串表达式,计算 3*5=15。


# 13. 题目

已知有函数定义 def demo(*p): return sum(p) 那么表达式 demo(1, 2, 3, 4) 的值为_______

答案:10

解析*p 将位置参数收集为元组 (1,2,3,4); sum() 对元组的元素求和,结果为 1+2+3+4=10。