全国计算机等级考试二级Python易错真题详解-4-函数和模块化编程-单选题
函数和模块化编程(单选题)
说明:
本文中的题目,全都来自全国计算机等级考试二级Python语言程序设计考试的真题,且都为易错题。题干最后如有编号,则是 python123 平台上的题号,以方便学生查找和索引。
在满分为 100 分的二级Python考试中,单选题总共占 40 分。本文为Python语言中函数和模块化相关的解析,这部分一般占 4分 左右。函数可能是二级考试中相对 知识点较少 ,但却 较难或最难理解 的一章,尤其是 全局变量和局部变量 等知识点。
面向对象:Python 学习爱好者、Python 二级备考的大学生
之前的相关文章在这儿:
以下代码的执行结果是( )。(#168882)
def maxcount():
a, b = 1000, 99
for i in range(10):
a *= b+1
b *= a-1
return a<b
maxcount()
A. False
B. 无输出
C. 执行错误
D. True
参考答案:B
解析:
做单选题有很多技巧,要想节省时间,需要先读下题干,再读下选项,然后像下面这样,先考虑下有无捷径可走!😄
正确答案是 无输出
。这题不需要精确计算,只要快速地判定:函数 maxcount()
虽然有返回值,但是在调用的地方(最后一行代码)却没有通过 print()
等方式输出其返回值,再加上 maxcount()
的函数体中也 没有任何输出语句 ,所以最终程序在控制台上没有产生任何输出。
以下关于Python的函数的描述,错误的是( )。(#168693)
A. 用def定义了函数之后,就等同于运行函数的代码
B. python支持可选参数传递,定义的时候设置参数的默认值
C. python函数可以没有return语句,不返回值
D. python支持用名称传递参数,调用的时候,带名称的参数可以改变在参数序列中的位置
参考答案:A
解析:
选项
用def定义了函数之后,就等同于运行函数的代码
错误。用def
定义了函数之后,一般来说,只有在显式地调用函数之后函数体才会运行。选项
python支持可选参数传递,定义的时候设置参数的默认值
正确。选项
python函数可以没有return语句,不返回值
正确。但语言表述不够严谨,没有return语句的函数体,显示不返回值,但其实会隐含地返回一个None
。选项
python支持用名称传递参数,调用的时候,带名称的参数可以改变在参数序列中的位置
正确,这是Python灵活便利的一个方面。
以下程序被调用后,能够正确执行的是( )。(#168848)
def f(x,y=1,z=2):
pass
A. f(y=2,z=3)
B. f(x=1,2)
C. f(1,3)
D. f(1,x=2,z=3)
参考答案:C
解析:
这题考察的是 非可选参数 和 可选参数 在调用时要注意的地方。
注意:在Python编程中,pass
是一个特殊的 空操作 关键字,用于表示一个语句的存在,但它不执行任何操作。pass
关键字在语法上需要一条语句,同时又不希望有任何实际操作的场景下非常有用。
选项
f(y=2,z=3)
错误。因为x
是必选参数,所以在调用f()
时必须在第一个参数的位置传一个实际参数给形式参数x
;选项
f(x=1,2)
错误。因为在调用f(x=1,2)
时,x=1
这样写是一个关键字参数,而2
是一个位置参数。按规定,关键字参数应该在位置参数的后面,而这儿正好反了;选项
f(1,3)
正确。此时实际参数1
传给第1个形式参数x
,实际参数3
传给第2个形参y
,而第3个形参z
则使用函数定义中等于号=
后面的默认值2
;选项
f(1,x=2,z=3)
错误。因为根据函数f()
的定义,在调用f(1,x=2,z=3)
时,第一个参数1
因为没有指明参数名称,那它就是一个位置参数,即给函数定义中的第1个形式参数x
传递一个值1
;但调用时的第二个参数又是x=2
,这样,对于同一个形式参数x
,它竟然有两个实际参数的赋值,就会报错:TypeError: f() got multiple values for argument 'x'
。
以下跟全局变量、局部变量相关的部分,可能是整个Python二级考试中最难理解的部分, 拿下它,其它的都不怕啦!
关于Python函数的描述错误的是( )。(#168642)
A. Python函数可以没有return语句,此时返回值为None
B. Python函数支持用名称传递参数
C. Python支持可选参数传递,但没有默认值的参数必须定义在有默认值参数的左侧
D. 函数内部使用的全局变量必须用global声明
参考答案:D
解析:
选项 Python函数可以没有return语句,此时返回值为None
正确。当函数体中没有一条 return 语句时,其实它在函数体的最后隐含实现了return None
这条语句,所以此时函数也有返回值,为None
,如下例:
def f():
... # 函数中啥也不做
print(f()) # 输出:None
选项
Python函数支持用名称传递参数
正确;选项
Python支持可选参数传递,但没有默认值的参数必须定义在有默认值参数的左侧
正确;选项
函数内部使用的全局变量必须用global声明
错误。因为在函数内使用全局变量,可以不必用global
声明它,如下例中对简单类型i
的读,以及列表类型ls
的写(追加):
i = 100 # 全局变量整数i
ls = [1, 2] # 全局变量列表ls
def f():
print(i) # 此处i为全局变量
ls.append(3) # 此处1s为全局变量
print(ls) # 此处1s为全局变量
f()
'''
调用f()后,输出如下两行:
100
[1, 2, 3]
'''
以下关于 Python 的函数的描述,正确的是( )。(#168578)
A. 函数内部使用外部定义的一个简单类型变量,需要显式声明其为全局变量
B. 函数内部定义了跟外部的全局变量同名的组合类型的变量,则函数内部引用的该名字的变量时不确定是外部的还是内部的
C. 函数内部改变了外部定义的组合类型变量的值,外部该变量的值不随之改变
D. 函数内部改变了外部定义的组合类型变量的值,外部该变量的值随之改变
参考答案:D
解析:
局部变量 可以简单理解成 在函数内部定义或创建的变量。与之对应的, 全局变量 可以简单理解成 在函数之外定义或创建的变量。“函数内外” 好理解,那啥叫 “定义或创建的变量” 呢?可以简单理解成:“定义或创建”是指通过“=”符号赋值以及调用函数等方式,创建出来的新的对象。如:
num = 10 # 定义了一个整型变量num
name = "AI" # 定义了一个字符串变量name
t = (1, 2, 3) # 定义了一个元组变量t
ls = list("abc") # 用内置函数list(),定义了一个列表变量ls
选项
函数内部使用外部定义的一个简单类型变量,需要显式声明其为全局变量
错误。简单类型
是相对组合类型
(或容器类型
)而言的,如:整型(int)、浮点型(float)、复数(complex)、布尔(bool)、字符串(str)这些数据类型。当函数内部使用外部定义的一个简单类型变量,不需要显式声明其为全局变量,如下面的例子:
def func(): # 函数要先定义再使用,故前面放函数定义,后面放主程序
print(a_global_var) # 内部使用(输出变量的值),不需要显示声明
a_global_var =100 # 函数外的主程序中定义的一个整数变量(简单类型),在函数func的外部
func() # 调用函数,通过第2行输出100
选项
函数内部定义了跟外部的全局变量同名的组合类型的变量,则函数内部引用的该名字的变量时不确定是外部的还是内部的
错误。这儿的
组合类型
也叫容器类型
,是指那些包含多个数据元素的数据类型,即:元组(tuple)、列表(list)、集合(set)、字典(dict)等。在函数中 “定义” 了同名变量,即
某变量名 = xx
这样,变量名出现在赋值符号=
左边的形式,那么某变量名
在函数中的身份就是一个 局部变量 ,而不再是全局变量了。比如下列情况中函数f()
中的列表ls
,出现在赋值号=
的左边后(ls = [4,5,6]
),ls
就成了一个仅在函数f()
中起作用的局部变量了:
ls = [1,2,3] # 定义一个全局变量,列表ls
def f():
ls =[4,5,6] # ls被赋值号定义,则此处为一个函数f()中的局部变量
print(ls) # 函数内部,同名情况下,局部变量优先级更高,执行到此输出:[4, 5, 6]
print(ls) # 函数外的主程序中,访问的ls是全局变量ls,故输出:[1, 2, 3]
f() # 函数中输出的ls是内部定义的局部变量ls,故输出:[4, 5, 6]
print(ls) # 内外有别,出了函数后,在外部访问的ls是全局变量ls,故输出:[1, 2, 3]
选项 函数内部改变了外部定义的组合类型变量的值,外部该变量的值不随之改变
错误。“函数内部改变了外部定义的组合类型变量的值”,类似如下代码,当这个组合类型变量是一个全局变量时,在函数内部改变了它的值,那么外部该变量的值也会随之改变,因为此时内外都是同一个全局变量。
ls = [1,2,3] # 定义一个全局变量,列表ls
def f():
ls.append(4) # 此处 ls 追加一个4,没被赋值号=定义,故跟全局变量是同一个
print(ls) # 输出全局变量ls
print(ls) # 调用f()函数之前,输出的全局变量ls中只有3个整数,故输出:[1, 2, 3]
f() # 在函数f()中输出的ls是全局变量ls追加一个4之后的值,故输出:[1, 2, 3, 4]
print(ls) # 出了函数后,在全局空间访问的列表ls是全局变量ls最新的值,故也输出:[1, 2, 3, 4]
选项 函数内部改变了外部定义的组合类型变量的值,外部该变量的值随之改变
正确。跟前一个相反,前面错误,则这个正确。
关于全局变量和局部变量的描述,错误的选项是( )。(#168883)
A. 在函数内部引用组合类型全局变量时,可以不通过global保留字声明
B. 局部变量标识符不能与任何全局变量的标识符相同,即严格不能重名
C. 在函数内部引用数值类型全局变量时,可以不使用global保留字声明
D. 全局变量在Python文件最外层声明时,语句前没有缩进
参考答案:B
解析:
在Python语言中局部变量可以是任意标志符,因为局部变量在函数结束时,并相当于被销毁,所以即使与全局变同名,也可以正常运行。在函数内部只是使用全局变量时,可以不用global声明。
选项
在函数内部引用组合类型全局变量时,可以不通过global保留字声明
正确。前题已结合样例代码详细解释。选项
局部变量标识符不能与任何全局变量的标识符相同,即严格不能重名
错误。局部变量的标识符(变量名)可以和全局变量的标识符(变量名)相同,只不过在函数内部,在全局变量没有被global
关键字修饰的前提下,同名的局部变量优先级更高,在函数中,局部变量的名称会屏蔽掉全局变量的名称。选项
在函数内部引用数值类型全局变量时,可以不使用global保留字声明
正确。看前题中的代码样例和解释。选项
全局变量在Python文件最外层声明时,语句前没有缩进
正确。全局变量在Python文件的最外层声明时,语句前没有缩进(空格或者Tab键)。