作业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) 

执行过程:

  1. 全局变量 a 被赋值为 20
  2. 调用 func() 时,在函数内部创建局部变量 a = 40
  3. 函数内打印 a 得到 40,后面加空格(end=" "
  4. 函数调用结束后,局部变量 a 消失
  5. 最后一行打印全局变量 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 试图使用变量 bc
  • 但在函数内部后面有 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(__________)))

思路:

  1. 输入是一行整数,如:2 3 4
  2. 先用 map(int, ...) 将输入的字符串转换为整数
  3. 再用 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())
分类: Languages 标签: Python

评论

暂无评论数据

暂无评论数据

目录