Python 函数知识梳理与经典编程题解析
一、问答题
(1)使用函数的好处是什么?
①提高代码的可复用性,避免重复编写相同功能代码;②使代码结构更清晰,将复杂功能拆分成多个函数,便于理解和维护;③实现模块化编程,不同函数负责不同功能,增强代码的逻辑性和可读性。
(2)如何定义一个函数?如何调用一个函数?
- 定义函数:在 Python 中,使用
def
关键字,语法格式为def 函数名(参数列表): 函数体
。例如def add(a, b): return a + b
。- 调用函数:直接写函数名并在括号内传入对应参数,如
result = add(3, 5)
,这里add(3, 5)
就是调用函数。
(3)给出术语函数头、形参、实参的定义
- 函数头:函数定义中以
def
开头,包括函数名和参数列表的部分,用于标识函数名称、参数情况,如def func_name(arg1, arg2):
中def func_name(arg1, arg2)
是函数头。- 形参:函数定义时参数列表中的参数,是形式上的占位符,在函数未被调用时没有实际值,如
def add(a, b):
中a
和b
是形参。- 实参:函数调用时传递给函数的实际参数,是具有具体值的参数,如
add(3, 5)
中3
和5
是实参。
(4)无返回值函数能不能有return语句?下面语句中的return函数是否会造成语法错误?
def xFunction(x,y):
print(x + y)
return
- 无返回值函数可以有
return
语句,在无返回值函数(返回值类型为None
)中,return
语句可用于提前结束函数执行。在题目中,return
语句不会造成语法错误,它只是提前结束函数执行,此函数默认返回None
。
(5)编写下面函数的函数头(并指出函数是否有返回值)
-
给定销售额和提成率,然后计算销售提成。
def sales_commission(sales, rate): # 函数头 # 有返回值,返回计算出的销售提成
-
给定年份和月份,然后打印该月的日历。
def print_calendar(year, month): # 函数头 # 无返回值,主要用于打印日历
-
计算平方根
def square_root(number): # 函数头 # 有返回值,返回计算出的平方根
-
判断一个数是不是偶数,如果是则返回true。
def is_even(number): # 函数头 # 有返回值,返回布尔值表示是否为偶数
-
按指定次数打印一条消息。
def print_messages(number): #函数头 #无返回值,只要用于打印消息
-
给定贷款额、还款年数和年利率,然后计算月支付额
def pay_total(amount, year, rate): #函数头 #有返回值,返回计算的月支付额
-
对于给定的小写字母,给出相应的大写字母。
def daxie_letter(small_letter): #函数头 #有返回值,返回相应的大写字母
(6)确定并改正下面程序中的错误
def function1(n,m):
function2(3.4)
def function2(n):
if n > 0:
return 1
elif n == 0:
return 0
elif n < 0:
return -1
function1(2,3)
函数调用的顺序有问题,在
function1
里调用function2
之前应该对function2
进行定义。
(7)下面代码的输出是什么?
def main():
print(min(5,6))
def min(n1,n2):
smallest = n1
if n2 < smallest:
smallest = n2
main()#Call the main function
5
(8)运行下面程序时会出现什么错误?
def main():
print(min(min(5,6),(51,6)))
def min(n1,n2):
smallest =n1
if n2 < smallest:
smallest =n2
main()# Call the main function
代码中
min(5, 6)
会正确返回5
,但接下来min(5, (51, 6))
会出现问题。因为内置min
函数期望比较的是可比较的元素,而(51, 6)
是一个元组,它不能直接和整数5
进行大小比较,会引发TypeError
异常。
(9)形参和实参能同名吗?
可以
形参是函数定义时括号里声明的参数,用于接收调用函数时传入的值;实参是在函数调用时实际传递给函数的参数。形参和实参同名不会产生语法错误。
(10)显示下面函数的结果
# 代码A
def main():
max=0
getMax(1,2,max)
print(max)
def getMax(value1,valaue2,max):
if value1 > value2:
max = vauel
else:
max = value2
main()
# 代码B
def main():
i=1
while i <= 6:
print(function1(i,2))
i+= 1
def functionl(i. num):a
line = ""
for j in range(1,i):
line += str(num) + " "
num *= 2
return line
main()
# 代码C
def main():
# Initialize times
times= 3
print("Before the call,variable","times is", times)
#Invoke nprintin and display times
nPrint("welcome to Cs!",times)
print("After the call,variable","times is",times)
# Print the message n times
def nPrint(message,n):
while n>0:
print("n=",n)
print(message)
n -= 1
main()
# 代码D
def main():
i=0
while i <= 4:
function1(i)
i+ 1
print("i is”,i)
def function1(i):
line = " "
while i >= 1:
if i % 3 != 0:
line += str(i) + " "
i -= 1
print(line)
main()
代码A:2
代码B:
2
2 4
2 4 8
2 4 8 16
2 4 8 16 32
代码C:
Before the call,variable times is 3
n= 3
welcome to Cs!
n= 2
welcome to Cs!
n= 1
welcome to Cs!
After the call,variable times is 3代码D:
1
2 1
2 1
4 2 1
i is 5
(11)下面代码的打印结果什么?
# 代码A
def function(x):
print(x)
x = 4.5
y = 3.4
print(y)
x=2
y=4
function(x)
print(x)
print(y)
# 代码B
def(x,y=1,z=2):
return x+y+Z
print(f(1,1,1))
print(f(y=1,x=2,z=3))
print(f(1,z=3))
代码A:
2
3.4
2
4
代码B:
3
6
5
(12)下面的代码有什么错误?
def function():
x = 4.5
y= 3.4
print(x)
print(y)
function()
print(x)
print(y)
没有对全局变量
x``y
进行定义,局部变量也没有应用到全局变量。
(13)下面代码能运行吗?如果能,打印结果是什么?
x= 10
if x < 0:
y = -1
else:
y = 1
print("y is", y)
能 。y is 1。
(14)显示下面代码的打印结果
def f(w=1,h=2):
print(w,h)
f()
f(w = 5)
f(h = 24)
f(4,5)
1, 2
5, 2
1, 24
4, 5
(15)确定下面程序的错误并改正
def main():
nPrintln(5)
def nPrintln(message = "Welcome to Python!",n):
for i in range(n):
print(message)
main() #Call the main function
函数定义顺序有误,有默认值的参数必须放在无默认值参数之后
def nPrintln(message = "Welcome to Python!",n):
for i in range(n):
print(message)
def main():
nPrintln(5)
main() #Call the main function
(16)如果在同一模块里定义两个同名的函数会发生什么?
后面定义的函数会覆盖前面定义的函数
(17)阐述函数的内存运行机制,举例代码并画图说明
def add(a, b):
result = a + b
return result
x = 3
y = 4
sum_value = add(x, y)

二、编程题
(18) 回文素数【录屏讲解】
视频链接:https://meeting.tencent.com/crm/NXwge6WP1e
回文素数是指一个数既是素数又是回文数,例如131既是素数也是回文数
输出显示前100个回文素数,每行显示10个
#即是素数也是回文数输出
def is_su(num):
for i in range(10,num // 2 + 1 ):
if num % i ==0:
return False
else:
return True
def reverse
(num):
ret = 0
while num !=0:
gewei = num % 10
num //= 10
ret =ret *10 + gewei
return ret
def is_hui(num):
return num == reverse(num)
num = 2
count = 0
while count < 100:
if is_su(num) and is_hui(num):
print(num, end=" ")
count += 1
if count % 10 == 0:
print()
num +=1
(19) 反素数
题目描述
反素数是指一个将其逆向拼写后也是一个素数的非回文数,例如17和71都是素数但不是回文数,且反转后依旧是素数
输出显示前100个反素数,每行显示10个
def is_su(num):
if num < 2:
return False
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
return False
return True
def reverse(num):
ret = 0
while num != 0:
gewei = num % 10
num // = 10
ret = ret * 10 + gewei
return ret
count = 0
num = 10
while count < 100:
reversed_num = reverse(num)
if is_su(num) and is_su(reversed_num) and num != reversed_num:
print(num, end=" ")
count += 1
if count % 10 == 0:
print()
num += 1
(20) 双素数
题目描述
双素数是指一对差值为2的素数,例如3和5就是一对双素数,5和7也是一对双素数
输出显示小于1000的双素数
def is_su(num):
if num < 2:
return False
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
return False
return True
for num in range(3, 999): # 从3开始遍历到998,因为要找差值为2的素数对
if is_su(num) and is_su(num + 2):
print(f"({num}, {num + 2})", end=" ")
(21) 梅森素数
如果一个素数可以写成 2 p − 1 2^p-1 2p−1的形式,其中p是某个正整数,那么这个素数就称作梅森素数
输出p≤31的所有梅森素数
def is_su(num):
#判断一个数是否为素数
if num < 2:
return False
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
return False
return True
p = 2
while p <= 31:
mei_num = 2 ** p - 1
if is_su(mei_num):
print(mei_num, end=" ")
p += 1
(22) 对三个数排序
提示用户输入三个数字,最后按照升序输出三个数字
def sort_numbers(num1, num2, num3):
def sort_numbers(num1, num2, num3):
min_num = min(num1, num2, num3)
max_num = max(num1, num2, num3)
mid_num = num1 + num2 + num3 - min_num - max_num
return max_num, mid_num, min_num
if __name__ == "__main__":
num1, num2, num3 =map(int,input("请输入:").split(" "))
result1, result2, result3 = sort_numbers(num1, num2, num3)
print(result1, result2, result3)
(23)显示模式【录屏讲解】
视频链接:http://meeting.tencent.com/crm/KeOBrDVdea
编写函数显示如下模式:
1
2 1
... 3 2 1
n n-1 ... 3 2 1
def display_pattern(n):
""" i(n) j k
1 1 1 2
2 1 2 21 1
... 3 2 1 3 321 0
n n-1 ... 3 2 1 n i~1 n - i
"""
def display_pattern(n):
#打印行数
for i in range(1, n+1):
#打印空格
for _ in range(n - i):
print(" ", end = " ")
#打印数字
for j in range(i, 0, -1):
print(j, end = " ")
print()
display_pattern(8)
(24)数列求和【录屏讲解】
视频链接:https://meeting.tencent.com/crm/KPGmAdG974
编写一个函数计算下面的数列:
m ( i ) = 1 2 + 2 3 + . . . + i i + 1 m(i) = \frac{1}{2} + \frac{2}{3} + ... + \frac{i}{i + 1} m(i)=21+32+...+i+1i
并输出测试结果:
i m(i)
1 0.500
2 1.16
...
19 16.40
20 17.35
def shulie(i):
m = 0
for i in range(1, i+1):
m += i / (i + 1)
print(i ,f'{m:.2f}' )
shulie(20)