一、选择题
1.下列选项中不属于函数优点的是( D )。
A.减少代码重复
B.使程序模块化
C.使程序便于阅读
D.便于发挥程序员的创造力
2.关于函数的说法中正确的是( B )。
A.函数定义时必须有形参
B.函数中定义的变量只在该函数体中起作用
C.函数定义时必须带return语句
D.实参与形参的个数可以不相同,类型可以任意
3.以下关于函数说法正确的是( D )。
A.函数的实际参数和形式参数必须同名
B.函数的形式参数既可以是变量也可以是常量
C.函数的实际参数不可以是表达式
D.函数的实际参数可以是其他函数的调用
4.关于装饰器,下列说法中错误的是( D )。
A.装饰器是用来包装函数的函数
B.装饰器有利于实现代码的复用
C.装饰器中一定要返回一个函数对象
D.一个函数只能用一个装饰器修饰
5.调用装饰器的格式是( B )。
A.#装饰器名 B.@装饰器名 C.$装饰器名 D.%装饰器名
6.有以下两个程序。
程序一:
- x=[1,2,3]
- def f(x):
- x=x+[4] #不同点
- f(x)
- print(x)
程序二:
- x=[1,2,3]
- def f(x):
- x+=[4] #不同点
- f(x)
- print(x)
下列说法正确的是( A )。
A.两个程序均能正确运行,但结果不同
B.两个程序的运行结果相同
C.程序一能正确运行,程序二不能
D.程序一不能正确运行,程序二能
运行结果:
程序一:

程序二:

- x=[1,2,3]
- def f(x):
- print(id(x)) #操作前的地址2
- x=x+[4] #不同点
- print(id(x)) #操作后的地址3
-
- print(id(x)) #传递参数之前的地址1
- f(x)
- print(id(x)) #传递参数之后的地址4
- print(x)

由输出可知,我们在进行了函数体内的操作后,x的地址发生了变化,我们接着看第二组代码:
- x=[1,2,3]
- def f(x):
- print(id(x)) #操作前的地址2
- x += [4] # 不同点
- print(id(x)) #操作后的地址3
-
- print(id(x)) #传递参数之前的地址1
- f(x)
- print(id(x)) #传递参数之后的地址4
- print(x)

x的地址始终没有变化
7.已知f=lambda x,y:x+y,则f([4],[1,2,3])的值是( C )。
A.[1, 2, 3, 4] B.10 C.[4, 1, 2, 3] D.{1, 2, 3, 4}
- f=lambda x,y:x+y
- print(f([4],[1,2,3]))

lambda函数又叫匿名函数,返回值时表达式的运算结果。以冒号为分隔,冒号前面的是参数,后面的是表达式。
8.下列程序的运行结果是( D )。
- f=[lambda x=1:x*2,lambda x:x**2]
- print(f[1](f[0](3)))
A.1 B.6 C.9 D.36

首先列表f有两个元素,分别是f[0]和f[1],然后print函数中首先调用f[1],参数是f[0](3)。因为参数是一个函数,所以先运算参数。
f[0]的函数是一个有默认值的函数,有默认值的函数如果不提供参数,参数就取默认值,否则取参数值。这里提供了参数为3,经过运算得6,然后代入函数f[1]即可。
9.下列程序的运行结果是( B )。
- def f(x=2,y=0):
- return x-y
- y=f(y=f(),x=5)
- print(y)
A.-3 B.3 C.2 D.5

注意这里使用了关键字参数。
10.output.py文件和test.py文件内容如下,且output.py和test.py位于同一文件夹中,那么运行test.py的输出结果是( A )。
- #output.py
- def show():
- print(__name__)
- #test.py
- import output
- if __name__=='__main__':
- output.show()
A.output B.__name__ C.test D.__main__
二、填空题
1.函数首部以关键字 def 开始,最后以 冒号 结束。
2.函数执行语句“return [1,2,3],4”后,返回值是 ([1, 2, 3], 4) ;没有return语句的函数将返回 None 。p147
如果函数返回多个值,那么就把这些值当成一个元组返回。
- def f():
- return [1,2,3],4
- print(f())

3.使用关键字 global 可以在一个函数中设置一个全局变量。
4.下列程序的输出结果是:
before f1
f1
before f1
- def deco(func):
- print('before f1')
- return func
- @deco
- def f1():
- print('f1')
- f1()
- f1=deco(f1)

5.下列程序的输出结果是4 0。
- counter=1
- num=0
- def TestVariable():
- global counter
- for i in (1,2,3):counter+=1
- num=10
- TestVariable()
- print(counter,num)
6.设有f=lambda x,y:{x:y},则f(5,10)的值是 {5: 10} 。
7.Python包含了数量众多的模块,通过 import 语句,可以导入模块,并使用其定义的功能。
8.设Python中有模块m,如果希望同时导入m中的所有成员,则可以采用 from m import * 的导入形式。
9.Python中每个模块都有一个名称,通过特殊变量 __name__ 可以获取模块的名称。特别地,当一个模块被用户单独运行时,模块名称为 __main__ 。
10.建立模块a.py,模块内容如下。
- def B():
- print('BBB')
- def A():
- print('AAA')
为了调用模块中的A()函数,应先使用语句 from a import A
三,问答题
1.什么叫递归函数?举例说明。p155
递归函数是指一个函数的函数体中又直接或间接地调用该函数本身的函数。
比如求n的阶乘:
- def getN(n):
- if n==1:
- return 1
- return n*getN(n-1)
-
- print(getN(3))
2.什么叫lambda函数?举例说明。p154
使用lambda关键字可以在同一行内定义函数,可以不用指定函数名。
格式:
lambda [参数1[,参数2,……,参数n]]:表达式
返回值就是表达式的值。
例如:
- f=lambda x,y:x+y
- print(f(2,3))

3.什么叫装饰器?他有什么作用?
装饰器分为无参装饰器与有参装饰器。
可以理解为,为已经存在的函数添加额外功能的函数。
- def improve_func(func):
- def improve():
- print("is improved")
- return func()
- return improve
-
- def func():
- print("abc")
-
- @improve_func
- def func2():
- print("def")
-
- #方法1
- func=improve_func(func)
- func()
-
- #方法2
- func2()
4.什么叫模块?如何导入模块?
(1)使用import语句
import 模块名
使用时需要模块名.函数,例如:
- import math
-
- print(math.e)
(2)使用from-import语句,只能导入一个函数
from 模块名 import 函数名
使用时直接用函数就行
- from math import pow
-
- print(pow(2,3))
(3)依旧是使用from-import语句,但是导入全部函数
from 模块名 import *
- from math import *
-
- print(pow(2,3))
- print(e)
5.写出下列程序的输出结果。
- def ff(x,y=100):
- return {x:y}
- print(ff(y=10,x=20))

6.分析下面的程序。
- x=10
- def f():
- #y=x
- x=0
- print(x)
- print(x)
- f()
(1)函数f()中的x和程序中的x是同一个变量吗?程序的输出结果是什么?
不是一个变量

(2)删除函数f()中第一一个语句前面的“#”,此时运行程序会出错,为什么?
- x=10
- def f():
- y=x
- x=0
- print(x)
-
- print(x)
- f()

这个错误是提示你引用了一个没有分配的变量。
在Python中,如果你在一个作用域定义了某变量,那外部的变量就会被屏蔽。考虑下面的例子:
- x=3
- def func():
- x = x + 3
- func()
运行代码则会报错local variable ‘x’ referenced before assignment
原因是我们调用func()的时候想要得到x+3,但是表达式从左向右,在x=的时候已经默许了x是local variable,因此外部作用域的x=3是被屏蔽的。所以x+3中的x相当于一个没有赋值的变量,从而报错。
(3)删除函数f()中第一个语句前面的“#”,同时在函数f()中第二个语句前面加“#”,此时程序能
正确运行,为什么?写出运行结果。
- x=10
- def f():
- y=x
- #x=0
- print(x)
-
- print(x)
- f()
