Python 作业错题整理:作业4-用函数实现代码复用
作业4-用函数实现代码复用
1.什么是仅关键字参数?
仅关键字参数 是指在函数调用时,必须通过参数名来指定,而不能通过位置传递的参数。
如何定义仅关键字参数?
在函数参数列表中,它们被放置在 可变位置参数 (\*args
) 或一个单独的星号 (\*
) 之后。
def func(a, b, *, kw1, kw2): # kw1 和 kw2 是仅关键字参数
pass
# 或者
def func(a, b, *args, kw1, kw2): # 在 *args 之后的 kw1 和 kw2 是仅关键字参数
pass
在 *args
和 **kwargs
之间,只能放置 仅关键字参数。
2.g = lambda x: 3不是一个合法的赋值表达式。(T/F)
F
解释如下:
这是一个 合法 的赋值表达式。
lambda x: 3
是一个合法的 lambda 表达式,它定义了一个匿名函数- 这个函数接受一个参数
x
,但忽略它,总是返回常数3
g = ...
是将这个 lambda 函数赋值给变量g
3.下面的代码输出结果为( )。
x = 3
def demo ():
x = 5
demo ()
print (x)
A. 3
B. 5
C. 8
D. 以上都不是
在这段 Python 代码中:
- 首先定义了一个全局变量
x
,并将其赋值为3
。 - 然后定义了一个函数
demo()
,在这个函数内部又定义了一个局部变量x
,并将其赋值为5
。需要注意的是,函数内部的x
是局部变量,它的作用范围仅限于demo()
函数内部,不会影响到全局变量x
。 - 接着调用
demo()
函数,此时函数内部的局部变量x
被赋值为5
,但这一操作只在函数内部有效。 - 最后执行
print(x)
,这里打印的是全局变量x
,其值仍然是3
。
所以,代码的输出结果是 3
,答案选 A。
4.定义函数时,在形参前面加一个星号表示可以接收多个位置参数并存放于( )中。
A.列表
B.元组
C.字典
D.集合
正确答案是 B. 元组。
解释:
在 Python 函数定义中,在形参前加一个星号 *
表示可变位置参数,它会将调用时传入的多个位置参数收集到一个元组中。
*args
→ 元组(Tuple)**kwargs
→ 字典(Dictionary)
5.Python的内置函数( )可以求列表、元组、字典、集合、字符串以及range对象中元素个数。
A.type( )
B.index( )
C.len( )
D.count( )
正确答案是 C. len( )。
解释:
len()
函数用于返回容器类型(或可迭代对象)中元素的个数:
6.以下哪一项会将一个1到50之间的随机值赋给变量number?( )
A.random(1, 50) = number
B.number = random.randint(1, 50)
C.randint(1, 50) = number
D.number = random(range(1, 50))
正确答案是 B. number = random.randint(1, 50)。
解释:
B 选项使用了 random
模块中的 randint(a, b)
函数,它可以生成一个范围在 [a, b]
(包含两端)的随机整数,符合题目要求。
分析 D. number = random(range(1, 50)):
- 函数使用错误:
random.random()
不接受range
对象作为参数 - 正确用法可能是
random.choice(range(1, 50))
,但这样生成的是 1-49(不含50)
7.可变长度参数在定义函数时的形式有( )。
A.para=1
B.*para
C.**para
D.Para
可变长度参数有两种形式:
- B.
\*para
:接收任意数量的位置参数,存储为元组 - C.
\**para
:接收任意数量的关键字参数,存储为字典
答案:B, C ✅
8.关于lambda函数,下面说法正确的是( )。
A.lambda函数没有函数名,只有一个语句
B.lambda函数可用于代替简单的单行函数
C.lambda函数只能有一个参数和表达式
D.lambda函数可作为有些函数的参数
10.python中的Lambda表达式只能有一个表达式。(T/F)
T
11.Python3.x中,能输出一个列表,列表中的元素分别是列表 s中的元素的平方的是( )
A.
s=[1,2,3,4,5]
t=[n*n for n in s]
print(t)
B.
s=[1,2,3,4,5]
def square(x):
return x ** 2
print(map(square, s))
C.
s=[1,2,3,4,5]
def square(x):
return x ** 2
print(list(map(square, s)))
D.
s=[1,2,3,4,5]
print(list(map(lambda x:x*x, s)))
正确答案:A, C, D
分析B:
s=[1,2,3,4,5]
def square(x):
return x ** 2
print(map(square, s))
map()
返回的是迭代器对象,不是列表- 输出类似:
<map object at 0x...>
- ❌ 错误(没有输出元素平方的列表)
12.下面程序的输出是?
a=20
def func():
a=40
print(a,end=" ")
func()
print(a)
执行过程:
- 全局变量
a
被赋值为20
- 调用
func()
时,在函数内部创建局部变量a = 40
- 函数内打印
a
得到40
,后面加空格(end=" "
) - 函数调用结束后,局部变量
a
消失 - 最后一行打印全局变量
a
,仍然是20
输出结果:
40 20
13.下面程序的运行结果是?(如程序错误写"error")
b,c=3,4
def g_func():
a=b*c
b=b+1
d=a
print(a,b,end=" ")
g_func()
print(b,c)
问题所在:
在函数 g_func()
中:
- 第一行
a = b * c
试图使用变量b
和c
- 但在函数内部后面有
b = b + 1
这条赋值语句 - 由于在函数内部有对
b
的赋值,Python 会将b
视为局部变量 - 当执行
a = b * c
时,局部变量b
还未被赋值,因此会报错:
错误信息:
UnboundLocalError: local variable 'b' referenced before assignment
原因:
Python 在编译函数时,发现函数内有对变量 b
的赋值操作,因此将 b
标记为局部变量。但在使用这个局部变量 b
之前(a = b * c
),它还没有被赋值,所以出现"引用前未赋值"的错误。
运行结果:
程序会在 a = b * c
处报错,不会执行后面的打印语句。
最终答案:
error
14.程序会读入一行整数,输出这些整数累乘的结果。
from functools import reduce
print(reduce(__________, map(__________)))
思路:
- 输入是一行整数,如:
2 3 4
- 先用
map(int, ...)
将输入的字符串转换为整数 - 再用
reduce
进行累乘运算
完整代码:
from functools import reduce
print(reduce(lambda x, y: x * y, map(int, input().split())))
填空答案:
reduce
的第一个空:lambda x, y: x * y
(或int.__mul__
)map
的空:int, input().split()
15.如何读入逗号隔开的多个数字如"1,2"赋值给a,b
r1,r2=eval(input())
本文系作者 @xiin 原创发布在To Future$站点。未经许可,禁止转载。
暂无评论数据