一、填空题
- Python中定义函数的关键字是def。
- 在函数内部可以通过关键字global来定义全局变量。
- 如果函数中没有return语句或者return语句不带任何返回值,那么该函数的返回值为None。
- 表达式 list(filter(None, [0,1,2,3,0,0])) 的值为。
# filter()函数是python内置的另一个有用的高阶函数 # filter()函数接收一个函数f和一个list, # 这个函数f的作用是对每个元素进行判断,返回True或False # filter()根据判断结果自动过滤掉不符合条件的元素 # 返回由符合条件元素组成的新list
- 表达式 list(filter(lambda x:x>2, [0,1,2,3,0,0])) 的值为[3]。
- 表达式 list(filter(lambda x: x%2==0, range(10))) 的值为[0, 2, 4, 6, 8]。
- 表达式 list(filter(lambda x: len(x)>3, ['a', 'b', 'abcd'])) 的值为['abcd']。
- 已知 g = lambda x, y=3, z=5: x*y*z,则语句 print(g(1)) 的输出结果为15。
- 表达式 list(map(lambda x: len(x), ['a', 'bb', 'ccc'])) 的值为[1, 2, 3]。
- 已知 f = lambda x: x+5,那么表达式 f(3) 的值为8。
- 表达式 sorted(['abc', 'bcd', 'ade'], key=lambda x:(x[0],x[2])) 的值为['abc', 'ade', 'bcd']。
- 已知函数定义def demo(x, y, op):return eval(str(x)+op+str(y)),那么表达式demo(3, 5, '+')的值为8。
- 已知f = lambda n: len(bin(n)[bin(n).rfind('1')+1:]),那么表达式f(6)的值为1,那么表达式f(7)的值为0。
- 已知函数定义 def func(*p):return sum(p),那么表达式 func(1,2,3) 的值为6,那么表达式 func(1,2,3, 4) 的值为10。
- 已知函数定义 def func(**p):return sum(p.values()),那么表达式 func(x=1, y=2, z=3) 的值为6。
- 已知函数定义 def func(**p):return ''.join(sorted(p)),那么表达式 func(z=3, y=2, x=1)的值为'xyz'。
- 已知 f = lambda x: 5,那么表达式 f(3)的值为5。
二、判断题
- 调用函数时,在实参前面加一个星号*表示序列解包。(1)
- 在Python 3.x中语句 print(*[1,2,3]) 不能正确执行。(0)
- 函数是代码复用的一种方式。(1)
- 定义函数时,即使该函数不需要接收任何参数,也必须保留一对空的圆括号来表示这是一个函数。(1)
- 编写函数时,一般建议先对参数进行合法性检查,然后再编写正常的功能代码。(1)
- 一个函数如果带有默认值参数,那么必须所有参数都设置默认值。(0)
- 定义Python函数时必须指定函数返回值类型。(0)
- 定义Python函数时,如果函数中没有return语句,则默认返回空值None。(1)
- 函数中必须包含return语句。(0)
- 函数中的return语句一定能够得到执行。(0)
- 不同作用域中的同名变量之间互相不影响,也就是说,在不同的作用域内可以定义同名的变量。(0)
- 全局变量会增加不同函数之间的隐式耦合度,从而降低代码可读性,因此应尽量避免过多使用全局变量。(1)
- 函数内部定义的局部变量当函数调用结束后被自动删除。(1)
- 在函数内部,既可以使用global来声明使用外部全局变量,也可以使用global直接定义全局变量。(1)
- 在函数内部没有办法定义全局变量。(0)
- 在函数内部直接修改形参的值并不影响外部实参的值。(1)
- 在函数内部没有任何方法可以通过形参来影响实参的值。(0)
- 调用带有默认值参数的函数时,不能为默认值参数传递任何值,必须使用函数定义时设置的默认值。(0)
- 在同一个作用域内,局部变量会隐藏同名的全局变量。(1)
- 形参可以看做是函数内部的局部变量,函数运行结束之后形参就不可访问了。(1)
- 在函数内部没有任何声明的情况下直接为某个变量赋值,这个变量一定是函数内部的局部变量。(1)
- 在Python中定义函数时不需要声明函数参数的类型。(1)
- 在Python中定义函数时不需要声明函数的返回值类型。(1)
- 在定义函数时,某个参数名字前面带有一个*符号表示可变长度参数,可以接收任意多个普通实参并存放于一个元组之中。(1)
- 在定义函数时,某个参数名字前面带有两个*符号表示可变长度参数,可以接收任意多个关键参数并将其存放于一个字典之中。(1)
- 定义函数时,带有默认值的参数必须出现在参数列表的最右端,任何一个带有默认值的参数右边不允许出现没有默认值的参数。(1)
- 在调用函数时,可以通过关键参数的形式进行传值,从而避免必须记住函数形参顺序的麻烦。(0)
- 在调用函数时,必须牢记函数形参顺序才能正确传值。(0)
- 调用函数时传递的实参个数必须与函数形参个数相等才行。(0)
- 在编写函数时,建议首先对形参进行类型检查和数值范围检查之后再编写功能代码,或者使用异常处理结构,尽量避免代码抛出异常而导致程序崩溃。(1)
- lambda表达式中可以使用任意复杂的表达式,但是必须只编写一个表达式。(1)
- g = lambda x: 3不是一个合法的赋值表达式。(0)
- 包含yield语句的函数一般称为生成器函数,可以用来创建生成器对象。(1)
- 在函数中yield语句的作用和return完全一样。(0)
- 语句pass仅起到占位符的作用,并不会做任何操作。(1)
- 无法使用lambda表达式定义有名字的函数。(0)
- 修饰器是函数嵌套定义的一个重要应用。(1)
- 修饰器本质上也是一个函数,只不过这个函数接收其他函数作为参数并对其进行一定的改造之后使用新函数替换原来的函数。(1)
- 修饰器函数通常在被修饰的函数执行时进行一些额外的操作,改造被修饰函数的返回结果。(1)
- 修饰器生成的新函数会修改被修饰函数的返回结果。(1)
- 修饰器函数一般在模块加载时执行,并生成一个被修饰的新函数。(1)
三、程序分析题
- 写出下面代码的运行结果。
def Sum (a, b=3, c=5):
return sum([a, b, c])
print(Sum(a=8, c=2))
print(Sum(8))
print(Sum(8,2))
13
16
15
- 阅读下面的代码,分析其执行结果。
def demo(*p):
return sum(p)
print(demo(1,2,3,4,5))
print(demo(1,2,3))
#形参位置*p进行序列解包然后返回求和值
15
6
- 阅读下面的代码,分析其执行结果。
def demo(a, b, c=3, d=100):
return sum((a,b,c,d))
print(demo(1, 2, 3, 4))
print(demo(1, 2, d=3))
#形参cd有默认值,在输入实参时,demo(1,2,3,4)按照顺序输入,demo(1,2,d=3)可以指定cd的值,因为c有默认值
10
9
- 下面的代码输出结果为_____________。
def demo():
x = 5
x = 3
demo()
print(x)
3
- 下面函数的功能为将列表整体前移1位。
def demo(lst, k):
if k<len(lst):
return lst[k:]+lst[:k]
- 写出下面代码的运行结果。
def f():
a, b = 1, 1
while True:
yield a
a, b = b, a+b
a = f()
for i in range(10):
print(a.__next__(), end=' ')
1 1 2 3 5 8 13 21 34 55
- 写出下面代码的运行结果。
def f():
a, b = 1, 1
while True:
yield a
a, b = b, a+b
for i in f():
if i > 100:
print(i, end=' ')
Break
144
- 写出下面代码的运行结果。
def before(func):
def wrapper(*args, **kwargs):
print('Before function called.')
return func(*args, **kwargs)
return wrapper
@before
def test():
print('test')
if __name__ == '__main__':
test()
Before function called.
test
四、编程题(自行完成)
1、编写函数isPrime()用来测试正整数 n 是否为素数,如果是素数,返回True,否则返回False。
def isPrime(n):
s=0
tag = True
if n>0:
for i in range(1,n+1):
if (n%i)==0:
s+=1
if s > 2:
tag = False
return tag
(1)利用函数isPrime()找出1~100之间的所有孪生素数(若两个素数之差为2,则这两个素数就是一对孪生素数)。例如:3和5、5和7、11和13等都是孪生素数。
primes=[]
primes_twins=[]
for i in range(1,101):
if isPrime(i) == True:
primes.append(i)
for n in primes:
for u in primes:
if 2 == n - u:
primes_twins.append(n)
primes_twins.append(u)
print(primes_twins)
(2)使用列表推导式和标准库random生成一个包含50个介于1--100的随机整数的列表,使用filter()函数统计列表中所有非素数并打印输出。
import random
lst = [random.randint(1, 100) for _ in range(50)]
print(lst)
print(list(filter(lambda n:isPrime(n) is False, lst)))
2、编写函数TempConvert()实现摄氏温度C与华氏温度F相互转换,并测试。
公式:C*1.8+32=F
设输入温度的格式为:xxc、xxC、xxf、xxF
注:输入的温度值可以带+、-符号。
def TempConvert(TempStr):
if TempStr[-1] in ['F','f']:
C = (eval(TempStr[0:-1]) - 32)/1.8
print("转换后的温度是{:.2f}C".format(C))
elif TempStr[-1] in ['C','c']:
F = 1.8*eval(TempStr[0:-1]) + 32
print("转换后的温度是{:.2f}F".format(F))
else:
print("输入格式错误")
3、编写函数Leapyear(n)用来测试正整数 n 是否为闰年,如果是闰年,返回True;否则返回False。分行打印输出从1901到2050年之间所有的闰年(每行输出8个数)。
def Leapyear(year):
year = int(year)
if (year % 4 == 0) and (year % 100 != 0):
return True
elif year % 400 == 0:
return True
else:
return False
k = 0
for i in range(1901,2050):
if Leapyear(i)==True:
print(i,end=' ')
k+=1
if k%8==0:
print('\n')
4、编写计算三角形面积函数TriangleArea(a,b,c),其中a,b,c为分别为三角形三条边,并测试。面积公式为
。
def TriangleArea(x,y,z):
c=(x+y+z)*0.5
s=(c*(c-x)*(c-y)*(c-z))**0.5
print(s)
x,y,z=map(int,input("请输入三个数字并以空格隔开:").split())
TriangleArea(x,y,z)
5、编写函数isDaff(n)用来测试三位正整数 n 是否为水仙花数,如果是水仙花数,返回True,否则返回False。使用filter()函数统计所有水仙花数并打印输出。
def isDaff(n):
n_str = str(n)
n_1 = int(n_str[0])
n_2 = int(n_str[1])
n_3 = int(n_str[2])
sum = n_1**3+n_2**3+n_3**3
if sum == n:
return True
else:
return False
lst = [i for i in range(100,999)]
print(list(filter(lambda x:isDaff(x),lst)))
6、编写函数,计算形式如a + aa + aaa + aaaa + ... + aaa...aaa的表达式的值(最后一项有n个a),其中a为小于10的自然数,并测试。
7、编写一个递归函数Fab(n)实现求Fabonacci数列第n项的值,并测试。
8、编写一个递归函数Fact(n)计算n!,并依次分行输出1~20的阶乘。
9、编写函数,模拟Python内置函数sorted(),并测试。
10、编写函数,求任意整数的二进制形式中最后连续0的个数,并测试。
11、编写函数,给定任意字符串,找出其中只出现一次的字符,如果有多个这样的字符,就全部找出,并测试。
12、编写一个用时计时的修饰器函数,并测试它的使用效果。
13、编写一个函数,把用户密码设置为一个字符串,将用户输入的密码与设置的密码进行比较,如果相同,输出“密码输入正确!”;如果用户密码里包含‘*’,则不算输入错误,但需要重新输入;其他输入情况都算输入错误,计入输入错误的次数,当用户输入错误次数超过3次时,用户不能再输入密码。测试它的使用效果。