Python “函数” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业
本文主要是作为Python中函数的一些题目,方便学习完Python的函数之后进行一些知识检验,感兴趣的小伙伴可以试一试,含选择题、判断题、实战题、填空题,答案在第五章。
在做题之前可以先学习或者温习一下Python的函数,推荐阅读下面这篇文章:
Python全网最全基础课程笔记(十二)——函数,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!-CSDN博客
通过这些题目,学习者可以检验自己对Python字典基础知识的掌握程度。
编程不仅是技术的堆砌,更是灵魂的创造,每一次代码的跳动,都是向世界宣告你的不凡!
- 博客主页:长风清留扬-CSDN博客
- 系列专栏:Python基础专栏
- 每天更新大数据相关方面的技术,分享自己的实战工作经验和学习总结,尽量帮助大家解决更多问题和学习更多新知识,欢迎评论区分享自己的看法
- 感谢大家点赞👍收藏⭐评论
第一章 选择题
1. 在Python中,定义一个函数时使用的关键字是?
A. def
B. function
C. func
D. create
2. 下列哪个不是Python函数的基本组成部分?
A. 函数名
B. 冒号(:)
C. 返回值
D. 缩进块
3. Python中,函数可以通过什么方式返回多个值?
A. 使用逗号分隔多个值
B. 使用列表或元组
C. 以上两者都可以
D. 只能返回一个值,不能返回多个
4. 哪个关键字用于调用Python中的函数?
A. call
B. execute
C. 函数名后加括号及参数(如果有)
D. invoke
5. 下列哪个是Python中的匿名函数(也称为lambda函数)的示例?
A. def my_func(x): return x*2
B. lambda x: x*2
C. function(x) { return x*2; }
D. anon_func = def(x) x*2
6. 在Python中,哪个内置函数用于获取函数的文档字符串?
A. doc()
B. docstring()
C. help()
D. __doc__
7. 如果一个函数没有定义返回值,那么它默认返回什么?
A. None
B. 0
C. 函数名
D. True
8. 下列哪个参数在函数定义时,允许你在函数调用时传递任意数量的参数给函数?
A. *args
B. **kwargs
C. 两者都是
D. 都不是,Python不支持这种参数
9. 哪个函数可以用来过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表?
A. map()
B. filter()
C. reduce()
D. lambda()
10. Python中,使用*
操作符作为函数调用时的参数,其作用是什么?
A. 传递一个列表作为参数
B. 将字典的键值对作为参数传递给函数
C. 将序列解包为位置参数
D. 调用函数的递归形式
11. 在Python中,哪个函数可以用来检查一个对象是否可调用?
A. callable()
B. is_callable()
C. can_call()
D. is_function()
12. 当你想要在函数内部修改一个从外部传入的可变对象(如列表),你应该怎么做?
A. 直接修改它,因为Python传递的是对象的引用
B. 返回一个新的对象
C. 使用全局变量
D. 传入对象的索引和值,让函数进行修改
13. 下列哪个是Python函数中的关键字参数(Keyword Argument)的示例?
A. func(10, 20)
B. func(x=10, y=20)
C. func(*args)
D. func(**kwargs)
14. 在Python中,递归函数是什么?
A. 调用自身的函数
B. 调用其他函数的函数
C. 永远不返回的函数
D. 不能被调用的函数
15. 哪个内置函数可以用来将函数作为参数传递给另一个函数?
A. apply()
B. map()
C. filter()
D. 以上都不是,Python不直接有这样的函数,但可以使用其他方式实现
16. 下列哪个不是Python中定义函数时可选的组成部分?
A. 参数列表
B. 文档字符串(docstring)
C. 返回值类型注解(在Python 3.5+中)
D. 函数体中的全局变量声明
17. 在Python中,如果你想在函数内部修改全局变量,你应该怎么做?
A. 直接修改它
B. 使用global
关键字声明
C. 将其作为参数传入函数
D. 返回一个修改后的新变量
18. 哪个内置函数可以用来返回函数对象的名称?
A. name()
B. __name__
C. function_name()
D. get_name()
19. 下列哪个是Python中局部变量的特点?
A. 只能在函数外部访问
B. 只能在定义它的函数内部访问
C. 可以在程序的任何地方访问
D. 以上都不是
20. Python中,*args
和**kwargs
在函数定义时的顺序是怎样的?
A. *args
必须在**kwargs
之前
B. **kwargs
必须在*args
之前
C. 它们可以互换位置
D. 它们不能同时使用
21. Python中,如何定义一个不接受任何参数的函数?
A. def my_func(x=None):
B. def my_func():
C. def my_func(x):
D. def my_func(*):
22. 下列哪个函数用于将一个函数作为参数,并对其可迭代对象的每个元素执行该函数?
A. filter()
B. map()
C. reduce()
D. lambda()
23. 在Python中,如何定义一个只接受关键字参数的函数?
A. 在参数列表前加上*
B. 在参数列表前加上**
C. 在函数定义时不使用位置参数
D. 使用*args
和**kwargs
,但只在函数体内使用**kwargs
24. 哪个内置函数可以用来将可迭代对象中的所有元素累积(结合)为一个单独的值?
A. sum()
B. reduce()
(注意:reduce()
在Python 3中需要从functools
模块导入)
C. accumulate()
D. combine()
25. 在Python中,嵌套函数指的是什么?
A. 在另一个函数内部定义的函数
B. 调用自己的函数
C. 定义在类中的函数
D. 接受另一个函数作为参数的函数
26. Python中,闭包(Closure)是如何形成的?
A. 当一个内部函数引用了其外部函数作用域中的变量时
B. 当一个函数返回另一个函数时
C. 两者都是(即,当内部函数引用了外部变量,并且这个内部函数被返回时)
D. 都不是
27. 哪个内置函数可以用来获取函数对象的内存地址?
A. id()
B. address()
C. memory_location()
D. location()
28. 下列哪个参数类型允许你传递任意数量的关键字参数给函数?
A. *args
B. **kwargs
C. 两者都可以
D. 两者都不可以
29. 在Python中,如何给函数添加类型注解(Type Hints)来指定参数和返回值的类型?
A. 在参数名和冒号之间添加类型
B. 在参数名之后、等号之前添加类型
C. 在函数定义结束后,使用特殊的注释语法
D. 使用typing
模块中的类型别名
30. 下列哪个是Python中装饰器(Decorator)的典型用途?
A. 修改或增强函数的功能,而不需要修改函数的内部代码
B. 定义类的特殊方法
C. 递归调用函数
D. 声明函数的文档字符串
31. 在Python中,如何定义一个返回多个值的函数?
A. 使用逗号分隔返回值
B. 使用列表或元组作为返回值
C. 定义一个包含多个return
语句的函数
D. 以上都是
32. 哪个内置函数可以用来检查一个对象是否是某个类的实例?
A. isinstance()
B. type()
C. issubclass()
D. class()
33. Python中的匿名函数是通过什么方式定义的?
A. 使用def
关键字
B. 使用lambda
关键字
C. 不能直接定义匿名函数
D. 使用@
符号
34. 下列哪个是Python中生成器函数的特点?
A. 使用return
语句返回值
B. 使用yield
语句返回值
C. 总是返回列表
D. 不能被迭代
35. 在Python中,如何定义一个函数,使其能够接收任意数量的位置参数?
A. 使用*args
B. 使用**kwargs
C. 使用*
符号作为函数名
D. 定义一个没有参数的函数
36. 下列哪个是Python中递归函数的终止条件(基准情形)的重要性?
A. 防止无限递归
B. 确保函数能够处理所有情况
C. 提高函数执行效率
D. 以上都是
37. 在Python中,如何调用一个函数并捕获其返回值?
A. 将函数名放在赋值语句的左侧
B. 使用print()
函数打印函数的返回值
C. 直接在函数名后加括号调用,并将结果赋值给变量
D. 以上都可以,但通常使用C选项
38. 哪个内置函数可以用来获取函数的文档字符串?
A. doc()
B. docstring()
C. __doc__
D. get_doc()
39. 在Python中,如何定义一个装饰器?
A. 使用@
符号和函数名
B. 定义一个接受函数作为参数的函数,并返回一个新的函数
C. 使用def
关键字定义一个特殊的函数
D. 以上都是定义装饰器的方式,但B选项最准确
40. 下列哪个不是Python中函数参数的类型?
A. 位置参数
B. 关键字参数
C. 默认参数
D. 静态参数
第二章 判断题
1. Python中的函数必须有一个返回值。
2. 使用def
关键字可以定义函数。
3. 函数内部定义的变量只能在函数内部访问。
4. 函数的参数可以是任意类型的数据,包括其他函数。
5. return
语句只能出现在函数的末尾。
6. 匿名函数(lambda函数)可以有多条执行语句。
7. Python中的函数可以嵌套定义,即在一个函数内部定义另一个函数。
8. 函数的文档字符串(docstring)应该紧跟在函数定义的第一行。
9. *args
用于接收任意数量的位置参数,而**kwargs
用于接收任意数量的关键字参数。
10. 递归函数必须有一个或多个基准情形(终止条件),以防止无限递归。
11. 函数的参数在函数被调用时才会被赋值。
12. Python中的函数参数传递默认是按值传递的,即使是列表或字典这样的可变类型。
13. 函数的返回值类型必须和函数定义时指定的返回类型一致(假设使用了类型注解)。
14. 装饰器是一个特殊的函数,它可以接受一个函数作为参数并返回一个新的函数。
15. Python中的全局变量在函数内部可以直接修改,而无需使用global
关键字。
16. Python中的函数可以没有参数。
17. 函数名可以是Python中的任何有效标识符。
18. 在函数内部定义的局部变量在函数外部是不可见的。
19. Python函数可以嵌套调用,即在一个函数内部调用另一个函数。
20. 使用yield
语句的函数是生成器函数,它返回一个生成器对象。
21. 函数的返回值可以是任意类型,包括None。
22. 关键字参数在函数调用时必须按照函数定义中的顺序提供。
23. 在Python中,可以通过locals()
函数获取当前函数的所有局部变量。
24. 递归函数必须谨慎使用,以避免栈溢出错误。
25. 匿名函数(lambda函数)不能用作装饰器。
26. Python中的*args
和**kwargs
可以同时在函数定义中使用。
27. 函数的文档字符串(docstring)是可选的,但它对代码的可读性和可维护性非常有帮助。
28. 函数可以修改通过参数传递的不可变类型(如整数、浮点数)的值。
29. 在Python中,可以使用*
操作符来解包列表或元组,作为位置参数传递给函数。
30. 装饰器可以改变函数的名称、文档字符串等属性。
31. 在Python中,所有函数都是对象。
32. 函数可以拥有属性,就像其他对象一样。
33. Python的闭包(Closure)是一个包含了额外作用域的函数。
34. globals()
函数返回当前全局符号表的字典。
35. 函数默认参数的值只在函数定义时计算一次。
36. Python的内置函数(如len()
, print()
)不能被重写或覆盖。
37. 使用map()
函数可以对可迭代对象中的每个元素应用一个函数。
38. filter()
函数用于过滤序列,过滤掉那些不符合条件的元素。
39. 嵌套函数中的外部函数必须先被调用,内部函数才能被调用。
40. 装饰器本质上是一个函数,但它返回一个函数对象,而不是执行被装饰的函数。
41. 在Python中,函数参数名在函数体内部是局部的,但在函数外部是全局的。
42. __name__
属性对于函数来说是可选的,它不是每个函数都必须有的。
43. 匿名函数(lambda函数)可以作为map()
或filter()
函数的参数。
44. 递归函数必须有至少一个基准情形,否则会导致无限递归。
45. 在Python中,可以通过help(function_name)
来获取函数的帮助信息,包括文档字符串。
第三章 填空题
1. Python中定义函数的关键字是 _______。
2. 函数定义的一般形式是 def 函数名(参数列表):
,其中def
是_______的缩写。
3. 函数通过关键字_______返回结果。
4. 如果函数没有返回值,或者没有执行到return
语句,则默认返回_______。
5. 在Python中,可以通过_______函数获取当前函数的局部变量字典。
6. 匿名函数(也称为lambda函数)使用_______关键字定义。
7. *args
用于在函数定义中接收_______数量的位置参数。
8. **kwargs
用于在函数定义中接收_______数量的关键字参数。
9. 装饰器是一种特殊的函数,它可以接受一个函数作为_______,并返回一个新的函数对象。
10. Python中,函数的_______属性包含了函数的文档字符串。
第四章 实战题
题目1:计算并返回学生成绩的平均分
题目描述:
编写一个Python函数calculate_average
,该函数接收一个包含学生分数的列表作为参数,计算这些分数的平均分(保留两位小数),并返回结果。假设分数列表中的每个元素都是有效的浮点数,且列表不为空。
学生分数列表:scores = [85.5, 92.0, 78.5, 88.0]
解题思路:
- 遍历分数列表,将所有分数累加到一个变量中。
- 使用列表长度(即学生人数)来除以总分,得到平均分。
- 使用
round()
函数保留两位小数。
题目2:反转字符串
题目描述:
编写一个Python函数reverse_string
,该函数接收一个字符串作为参数,返回该字符串的反转版本。
字符串示例:s = "hello world"
解题思路:
- 使用字符串切片功能,通过
[::-1]
来实现字符串的反转。
题目3:计算斐波那契数列的第10项
题目描述:
编写一个Python函数fibonacci
,该函数接收一个整数10作为参数,并返回斐波那契数列的第10项。斐波那契数列是一个每项都是前两项和的数列,且第一项和第二项都定义为1。
解题思路:
- 如果10小于等于1,直接返回1(因为斐波那契数列的前两项都是1)。
- 使用循环或递归计算第10项的值。为了简洁和效率,这里我们使用循环。
题目4:判断字符串是否为回文
题目描述:
编写一个Python函数is_palindrome
,该函数接收一个字符串作为参数,并判断该字符串是否为回文(即正读和反读都相同的字符串)。如果是回文,则返回True
;否则返回False
。
两个字符串示例:
s = "A man, a plan, a canal: Panama"
s2 = "racecar"
解题思路:
- 去除字符串两端的空格,并将字符串转换为小写(或大写),以忽略大小写和首尾空格的差异。
- 比较字符串和其反转字符串是否相等。
题目5:找出列表中的最大和最小值
题目描述:
编写一个Python函数find_max_min
,该函数接收一个整数列表作为参数,并返回一个包含两个元素的元组,第一个元素是列表中的最大值,第二个元素是列表中的最小值。
整数列表示例:numbers = [3, 1, 4, 1, 5, 9, 2, 6]
解题思路:
- 初始化两个变量来分别存储最大值和最小值,可以初始化为列表的第一个元素。
- 遍历列表中的每个元素,更新最大值和最小值变量。
- 返回包含最大值和最小值的元组。
第五章 答案
选择题
1. A (def
)
def
是Python中定义函数的关键字。
2. C (返回值)
- 返回值不是函数定义的基本组成部分,函数可以不返回任何值(即隐式返回
None
)。
3. C (以上两者都可以)
- 你可以在Python函数中使用逗号分隔返回多个值,这些值会被Python自动打包成元组。同时,你也可以显式地返回一个列表或元组来返回多个值。
4. C (函数名后加括号及参数(如果有))
- 在Python中,调用函数是通过在函数名后加括号(可包含参数)来实现的。
5. B (lambda x: x*2
)
lambda
是Python中定义匿名函数的关键字,它可以接收任意数量的参数但只能有一个表达式。
6. D (__doc__
)
__doc__
是一个特殊属性,用于存储函数的文档字符串。虽然help()
函数可以用来查看对象的帮助信息,但直接获取文档字符串是通过__doc__
属性。
7. A (None
)
- 如果函数没有定义返回值(即没有
return
语句),则函数执行完毕后默认返回None
。
8. C (两者都是)
*args
允许你将一个不定长度的参数序列传递给函数,这些参数在函数内部被打包成一个元组。**kwargs
允许你传递不定长度的关键字参数,这些参数在函数内部被打包成一个字典。
9. B (filter()
)
filter()
函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新迭代器。
10. C (将序列解包为位置参数)
- 在Python函数调用时,使用
*
操作符可以将一个可迭代对象(如列表、元组)解包为位置参数传递给函数。
11. A (callable()
)
callable()
函数用于检查一个对象是否是可调用的。如果对象是一个函数、方法、实现了__call__()
方法的类的实例等,则返回True
。
12. A (直接修改它,因为Python传递的是对象的引用)
- 在Python中,当你将一个可变对象(如列表)作为参数传递给函数时,实际上传递的是对象的引用(或地址)。因此,函数内部对对象的修改会反映到原始对象上。
13. B (func(x=10, y=20)
)
- 关键字参数允许你通过参数名来指定参数的值,而不是通过位置。在函数调用时,关键字参数必须放在位置参数之后。
14. A (调用自身的函数)
- 递归函数是一种直接或间接地调用自身的函数。它通常用于解决可以分解为更小、相似子问题的问题。
15. D (以上都不是,Python不直接有这样的函数,但可以使用其他方式实现)
- Python没有一个内置的
apply()
函数来直接将函数作为参数传递(尽管在Python 2中有,但在Python 3中已被移除)。但可以使用其他方式(如使用*args
和**kwargs
)来实现类似的功能。
16. D (函数体中的全局变量声明)
- 在Python中,函数定义时可以包含参数列表、文档字符串、返回值类型注解(在Python 3.5+中)等可选组成部分,但不需要在函数体内部声明全局变量。全局变量的声明通常在函数外部进行,如果需要在函数内部修改全局变量,则可以使用
global
关键字。
17. B (使用global
关键字声明)
- 在Python中,如果你想要在函数内部修改全局变量,你需要在函数内部使用
global
关键字来声明这个变量是全局的。
18. B (__name__
)
- 在Python中,每个函数对象都有一个
__name__
属性,它包含了函数的名称。这个属性可以被用来获取或检查函数的名称。
19. B (只能在定义它的函数内部访问)
- 局部变量是定义在函数内部的变量,它们只能在定义它们的函数内部被访问。
20. A (*args
必须在**kwargs
之前)
- 在Python函数定义时,
*args
必须位于**kwargs
之前。这是因为位置参数(*args
展开成位置参数)在关键字参数(**kwargs
展开成关键字参数)之前被处理。
21. B (def my_func():
)
- 当一个函数不接受任何参数时,其参数列表应该为空。
22. B (map()
)
map()
函数将指定的函数应用于可迭代对象的所有项,并返回一个迭代器,该迭代器包含应用函数后的结果。
23. C (在函数定义时不使用位置参数)
- 要定义一个只接受关键字参数的函数,你需要在函数定义时只使用关键字参数(即,不使用位置参数),并在调用时明确指定参数名。
24. B (reduce()
,注意:在Python 3中需要从functools
模块导入)
reduce()
函数会对参数序列中元素进行累积。但是,在Python 3中,reduce()
函数被移到了functools
模块中。
25. A (在另一个函数内部定义的函数)
- 嵌套函数是指在另一个函数内部定义的函数。
26. C (两者都是)
- 闭包是一个内部函数,它引用了其外部函数作用域中的变量,并且这个内部函数被返回或传递给了其他函数/作用域。
27. A (id()
)
id()
函数用于获取对象(包括函数对象)的唯一标识符,通常是一个整数值,表示对象的内存地址。
28. B (**kwargs
)
**kwargs
允许你传递任意数量的关键字参数给函数。
29. A (在参数名和冒号之间添加类型)
- 在Python中,你可以通过在参数名和冒号之间添加类型来给函数添加类型注解。从Python 3.5开始,这种类型注解是可选的,并且主要用于静态类型检查器和IDE中的代码分析。
30. A (修改或增强函数的功能,而不需要修改函数的内部代码)
- 装饰器是Python中用于修改或增强函数功能的一种高级技术,它允许你在不修改函数内部代码的情况下,给函数添加新的功能。
31. D (以上都是)
- 在Python中,你可以通过逗号分隔多个值来返回一个元组,这实际上是返回了多个值。你也可以直接返回一个列表或元组来包含多个值。此外,一个函数可以有多个
return
语句,但通常只执行到第一个return
语句就会结束函数并返回结果。
32. A (isinstance()
)
isinstance()
函数用于检查一个对象是否是一个已知的类型,类似类型的对象或者实现了特定接口的对象。
33. B (使用lambda
关键字)
- Python中的匿名函数是通过
lambda
关键字来定义的。这些函数通常用于需要函数对象的地方,但又不想正式命名一个函数的场合。
34. B (使用yield
语句返回值)
- 生成器函数使用
yield
语句来返回一个值给调用者,并保留当前执行状态,以便下次从该位置继续执行。
35. A (使用*args
)
- 在Python中,
*args
用于接收任意数量的位置参数,并将它们作为一个元组传递给函数。
36. A (防止无限递归)
- 递归函数的终止条件(也称为基准情形)是递归能够停止的关键。没有终止条件,递归将会无限进行下去,最终导致栈溢出错误。
37. C (直接在函数名后加括号调用,并将结果赋值给变量)
- 在Python中,调用函数通常是通过在函数名后加括号来实现的,并且可以将结果赋值给变量以捕获返回值。
38. C (__doc__
)
- 在Python中,每个函数对象都有一个
__doc__
属性,它包含了函数的文档字符串。你可以通过访问这个属性来获取函数的文档字符串。
39. D (以上都是定义装饰器的方式,但B选项最准确)
- 装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。虽然
@
符号和def
关键字在定义装饰器时也会用到,但B选项最准确地描述了装饰器的核心特征。
40. D (静态参数)
- Python中函数参数的类型主要包括位置参数、关键字参数、默认参数等,但并没有“静态参数”这一说法。静态参数可能是指静态类型注解(在Python 3.5+中通过类型提示实现),但这与函数参数的类型分类不同。
判断题
1. 错误。
- 解析:Python中的函数可以没有返回值,如果没有使用
return
语句或return
语句后没有跟任何值,则函数默认返回None
。
2. 正确。
- 解析:在Python中,使用
def
关键字后跟函数名和圆括号(可能包含参数)以及冒号来定义函数。
3. 正确。
- 解析:函数内部定义的变量(局部变量)默认只能在函数内部访问,除非它们被显式地返回或作为参数传递给其他函数。
4. 正确。
- 解析:Python函数的参数非常灵活,可以是任意类型的数据,包括其他函数、列表、字典等复杂数据结构。
5. 错误。
- 解析:
return
语句可以在函数中的任何位置出现,一旦执行到return
语句,函数就会结束并返回指定的值(如果有的话)。
6. 错误。
- 解析:匿名函数(lambda函数)只能包含一条表达式,不能包含多条语句。
7. 正确。
- 解析:Python支持函数的嵌套定义,即在一个函数内部定义另一个函数。
8. 错误。
- 解析:虽然文档字符串(docstring)通常紧跟在函数定义之后,但它不是必须位于第一行。它应该是一个字符串字面量,作为函数定义中的第一个语句。
9. 正确。
- 解析:
*args
用于接收任意数量的位置参数,并将它们作为元组传递给函数;**kwargs
用于接收任意数量的关键字参数,并将它们作为字典传递给函数。
10. 正确。
- 解析:递归函数必须有一个或多个基准情形(也称为终止条件),以确保递归能够停止,从而防止无限递归导致的栈溢出错误。
11. 正确。
- 解析:在Python中,函数的参数在函数被调用时才会被赋予实际的值。
12. 正确。
- 解析:Python中的函数参数传递默认是按值传递的,但这里的“值”对于可变类型(如列表、字典)来说,是对象的引用(或内存地址)。因此,如果在函数内部修改了可变类型的参数,这些修改会影响到原始对象。但是,从参数传递的角度来看,仍然是按值传递的。
13. 错误。
- 解析:虽然Python 3.5+引入了类型注解,但这些注解主要用于静态类型检查器和IDE中的代码分析,它们不会强制要求函数的返回值类型与指定的类型一致。
14. 正确。
- 解析:装饰器是Python中的一个高级特性,它允许你在不修改原有函数代码的情况下,给函数添加新的功能。装饰器本质上是一个函数,它接受一个函数作为参数并返回一个新的函数。
15. 错误。
- 解析:在Python中,如果在函数内部想要修改全局变量的值,需要使用
global
关键字来声明该变量是全局的。否则,Python会将其视为一个新的局部变量。
16. 正确。
- 解析:Python中的函数可以没有参数,这样的函数被称为无参函数。
17. 正确。
- 解析:函数名需要遵守Python的标识符命名规则,即可以包含字母、数字和下划线,但不能以数字开头,且不能与Python的保留关键字冲突。
18. 正确。
- 解析:函数内部定义的局部变量在函数外部是不可见的,这是局部作用域的基本规则。
19. 正确。
- 解析:Python支持函数的嵌套调用,即在一个函数内部可以调用另一个函数。
20. 正确。
- 解析:使用
yield
语句的函数被称为生成器函数,它执行时会返回一个生成器对象,该对象支持迭代操作。
21. 正确。
- 解析:函数的返回值可以是任意类型,包括Python中的基本数据类型(如整数、浮点数、字符串等)和复杂数据类型(如列表、字典、自定义对象等),当然也可以是
None
。
22. 错误。
- 解析:关键字参数在函数调用时不需要按照函数定义中的顺序提供,它们是通过参数名来指定的。
23. 正确。
- 解析:
locals()
函数用于返回当前局部符号表的字典,它包含了当前函数的所有局部变量(包括函数参数和函数内部定义的变量)。
24. 正确。
- 解析:递归函数需要谨慎使用,因为不恰当的递归可能会导致栈溢出错误。在设计递归函数时,必须确保有明确的基准情形来停止递归。
25. 错误。
- 解析:虽然匿名函数(lambda函数)通常用于简单的场景,但理论上它们也可以用作装饰器,只要它们满足装饰器的要求(即接受一个函数作为参数并返回一个新的函数)。然而,由于它们的表达能力有限,这种做法并不常见。
26. 正确。
- 解析:在Python中,
*args
和**kwargs
可以同时在函数定义中使用,以接收任意数量的位置参数和关键字参数。
27. 正确。
- 解析:虽然函数的文档字符串(docstring)是可选的,但它对代码的可读性和可维护性非常有帮助。它通常用于描述函数的功能、参数、返回值和可能的异常等信息。
28. 错误。
- 解析:在Python中,不可变类型(如整数、浮点数、字符串和元组)的值一旦创建就不能被修改。尝试在函数内部修改通过参数传递的不可变类型的值会导致创建一个新的对象,而原始对象保持不变。
29. 正确。
- 解析:在Python中,可以使用
*
操作符来解包列表或元组,作为位置参数传递给函数。这样做可以将列表或元组中的元素作为单独的位置参数传递给函数。
30. 错误。
- 解析:装饰器通常用于在不修改原始函数定义的情况下给函数添加额外的功能。它们通过接收一个函数并返回一个新的函数来实现这一点。然而,装饰器本身不会改变原始函数的名称、文档字符串等属性,除非在返回的新函数中显式地设置了这些属性。通常,装饰器会保留原始函数的这些属性,或者使用
functools.wraps
等工具来自动处理这些属性的复制。
31. 正确。
- 解析:在Python中,函数是第一类对象,这意味着它们可以被赋值给变量、作为参数传递给其他函数、从其他函数返回,以及被包含在数据结构中。
32. 正确。
- 解析:函数可以像其他对象一样拥有属性。这些属性可以是任意类型的值,并通过标准的点号(
.
)访问方式来访问。
33. 正确。
- 解析:闭包是一个函数值,它引用了其外部作用域的一个或多个变量。换句话说,闭包是一个包含了额外作用域的函数。
34. 正确。
- 解析:
globals()
函数返回当前全局符号表的字典,这个字典包含了当前模块中定义的所有全局变量和全局作用域中可用的内置名称。
35. 正确。
- 解析:函数默认参数的值只在函数定义时计算一次,并且在后续的函数调用中保持不变,除非显式地修改了这些参数的值。
36. 错误。
- 解析:虽然大多数Python的内置函数都是用C语言实现的,并且不能被直接重写或覆盖,但是用户可以通过定义与内置函数同名的函数来“隐藏”它们(在相同的作用域内)。然而,这并不是重写或覆盖内置函数,而是简单的名称冲突。
37. 正确。
- 解析:
map()
函数接收两个参数:一个函数和一个可迭代对象。然后,它将对可迭代对象中的每个元素应用该函数,并返回一个包含所有应用结果的迭代器。
38. 正确。
- 解析:
filter()
函数接收两个参数:一个函数和一个可迭代对象。这个函数用于判断可迭代对象中的元素是否满足某个条件(即函数返回True)。filter()
函数返回一个迭代器,该迭代器只包含满足条件的元素。
39. 错误。
- 解析:嵌套函数中的内部函数可以在外部函数被调用之前定义,但它通常需要在外部函数的作用域内被调用(除非它被返回或以其他方式被外部函数的作用域之外的代码访问)。然而,这并不要求外部函数必须先被调用;内部函数可以作为返回值返回,或者在外部函数内部的其他地方被调用。
40. 正确。
- 解析:装饰器是一个接受函数作为参数并返回一个新函数的函数。它不会执行被装饰的函数,而是返回一个新的函数对象,这个新函数在被调用时会执行装饰器内部定义的逻辑,并(通常)会调用原始函数。
41. 错误。
- 解析:函数参数名在函数体内部是局部的,它们只在该函数的作用域内可见。然而,函数名本身(而不是其参数名)在函数定义之后可以在全局作用域中被访问,前提是该函数没有在嵌套作用域内定义。
42. 错误。
- 解析:在Python中,每个函数都有一个
__name__
属性,该属性包含了函数的名称。这是每个函数都必须有的,它对于调试、文档化以及在某些情况下进行反射(reflection)非常有用。
43. 正确。
- 解析:匿名函数(lambda函数)由于其简洁性,经常被用作
map()
或filter()
函数的参数。这些函数期望一个可调用对象作为参数,而lambda函数恰好是一个简洁的可调用对象。
44. 正确。
- 解析:递归函数必须有一个或多个基准情形(也称为终止条件),以防止无限递归。如果没有基准情形,递归调用将永远不会停止,导致栈溢出错误。
45. 正确。
- 解析:在Python中,
help()
函数是一个内置函数,用于获取关于对象(如函数、模块、类等)的帮助信息。对于函数来说,这通常包括函数的文档字符串(如果存在的话)以及函数参数的信息。通过help(function_name)
,可以方便地获取有关特定函数的帮助信息。
填空题
1. Python中定义函数的关键字是 def
。
- 解析:
def
是 Python 中定义函数的关键字,后面跟函数名和圆括号内的参数列表。
2. 函数定义的一般形式是 def 函数名(参数列表):
,其中def
是 define(定义)的缩写。
- 解析:
def
是 define 的缩写,用于定义一个函数。
3. 函数通过关键字 return
返回结果。
- 解析:
return
关键字用于从函数中返回值。
4. 如果函数没有返回值,或者没有执行到 return
语句,则默认返回 None
。
- 解析:在 Python 中,如果没有
return
语句或没有返回值被明确指定,函数将隐式返回None
。
5. 在Python中,可以通过 locals()
函数获取当前函数的局部变量字典。
- 解析:
locals()
函数返回当前局部符号表的字典,包含当前函数的局部变量。
6. 匿名函数(也称为lambda函数)使用 lambda
关键字定义。
- 解析:
lambda
关键字用于创建匿名函数,即没有名称的函数。
7. *args
用于在函数定义中接收 不定 数量的位置参数。
- 解析:
*args
是一个特殊语法,允许函数接收任意数量的位置参数,这些参数被存储在一个名为args
的元组中。
8. **kwargs
用于在函数定义中接收 不定 数量的关键字参数。
- 解析:
**kwargs
是一个特殊语法,允许函数接收任意数量的关键字参数,这些参数被存储在一个名为kwargs
的字典中。
9. 装饰器是一种特殊的函数,它可以接受一个函数作为 参数,并返回一个新的函数对象。
- 解析:装饰器是一种高级Python特性,它允许你通过“包装”另一个函数来增强该函数的功能,而不改变其内部实现。
10. Python中,函数的 __doc__
属性包含了函数的文档字符串。
- 解析:每个函数都有一个
__doc__
属性,它包含了函数的文档字符串(如果有的话),这是一个字符串,用于描述函数的功能和用法。
实战题
题目1:计算并返回学生成绩的平均分
题目描述:
编写一个Python函数calculate_average
,该函数接收一个包含学生分数的列表作为参数,计算这些分数的平均分(保留两位小数),并返回结果。假设分数列表中的每个元素都是有效的浮点数,且列表不为空。
解题思路:
- 遍历分数列表,将所有分数累加到一个变量中。
- 使用列表长度(即学生人数)来除以总分,得到平均分。
- 使用
round()
函数保留两位小数。
答案代码:
def calculate_average(scores):
"""
计算并返回学生成绩的平均分
参数:
scores (list of float): 包含学生分数的列表
返回:
float: 学生成绩的平均分,保留两位小数
"""
# 初始化总分
total_score = 0
# 遍历分数列表
for score in scores:
total_score += score
# 计算平均分并保留两位小数
average_score = round(total_score / len(scores), 2)
return average_score
# 示例运行
scores = [85.5, 92.0, 78.5, 88.0]
print(f"学生成绩的平均分为: {calculate_average(scores)}")
#运行结果:学生成绩的平均分为: 86.00
题目2:反转字符串
题目描述:
编写一个Python函数reverse_string
,该函数接收一个字符串作为参数,返回该字符串的反转版本。
解题思路:
- 使用字符串切片功能,通过
[::-1]
来实现字符串的反转。
答案代码:
def reverse_string(s):
"""
反转字符串
参数:
s (str): 要反转的字符串
返回:
str: 反转后的字符串
"""
# 使用字符串切片功能反转字符串
reversed_s = s[::-1]
return reversed_s
# 示例运行
s = "hello world"
print(f"原字符串: {s}, 反转后的字符串: {reverse_string(s)}")
# 运行结果:原字符串: hello world, 反转后的字符串: dlrow olleh
题目3:计算斐波那契数列的第10项
题目描述:
编写一个Python函数fibonacci
,该函数接收一个整数10
作为参数,并返回斐波那契数列的第10
项。斐波那契数列是一个每项都是前两项和的数列,且第一项和第二项都定义为1。
解题思路:
- 如果
10
小于等于1,直接返回1(因为斐波那契数列的前两项都是1)。 - 使用循环或递归计算第
10
项的值。为了简洁和效率,这里我们使用循环。
答案代码:
def fibonacci(n):
"""
计算斐波那契数列的第10项
参数:
n (int): 斐波那契数列的项数
返回:
int: 斐波那契数列的第10项
"""
# 如果n小于等于1,直接返回1
if n <= 1:
return 1
# 初始化前两个数
a, b = 1, 1
# 循环计算第n项
for _ in range(2, n):
a, b = b, a + b
return b
# 示例运行
n = 10
print(f"斐波那契数列的第{n}项是: {fibonacci(n)}")
# 运行结果:斐波那契数列的第10项是: 55
题目4:判断字符串是否为回文
题目描述:
编写一个Python函数is_palindrome
,该函数接收一个字符串作为参数,并判断该字符串是否为回文(即正读和反读都相同的字符串)。如果是回文,则返回True
;否则返回False
。
解题思路:
- 去除字符串两端的空格,并将字符串转换为小写(或大写),以忽略大小写和首尾空格的差异。
- 比较字符串和其反转字符串是否相等。
答案代码:
def is_palindrome(s):
"""
判断字符串是否为回文
参数:
s (str): 待判断的字符串
返回:
bool: 如果字符串是回文则返回True,否则返回False
"""
# 去除字符串两端的空格,并转换为小写
s = s.strip().lower()
# 比较字符串和其反转字符串是否相等
return s == s[::-1]
# 示例运行
s = "A man, a plan, a canal: Panama"
print(f"\"{s}\" 是回文吗? {is_palindrome(s)}")
# 另一个示例
s2 = "racecar"
print(f"\"{s2}\" 是回文吗? {is_palindrome(s2)}")
# 运行结果
# "A man, a plan, a canal: Panama" 是回文吗? False
# "racecar" 是回文吗? True
题目5:找出列表中的最大和最小值
题目描述:
编写一个Python函数find_max_min
,该函数接收一个整数列表作为参数,并返回一个包含两个元素的元组,第一个元素是列表中的最大值,第二个元素是列表中的最小值。
整数列表示例:numbers = [3, 1, 4, 1, 5, 9, 2, 6]
解题思路:
- 初始化两个变量来分别存储最大值和最小值,可以初始化为列表的第一个元素。
- 遍历列表中的每个元素,更新最大值和最小值变量。
- 返回包含最大值和最小值的元组。
def find_max_min(numbers):
"""
找出列表中的最大和最小值
参数:
numbers (list of int): 整数列表
返回:
tuple: 包含两个元素的元组,第一个元素是最大值,第二个元素是最小值
"""
if not numbers: # 如果列表为空,则返回一个特定的值或抛出异常
return (None, None)
# 初始化最大值和最小值为列表的第一个元素
max_val = min_val = numbers[0]
# 遍历列表中的每个元素
for num in numbers[1:]: # 从第二个元素开始遍历
if num > max_val:
max_val = num
if num < min_val:
min_val = num
# 返回最大值和最小值的元组
return (max_val, min_val)
# 示例运行
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
print(f"列表中的最大值是: {find_max_min(numbers)[0]}, 最小值是: {find_max_min(numbers)[1]}")
# 运行结果:列表中的最大值是: 9, 最小值是: 1