一、实验目的
1. 掌握函数定义和调用的用法。
2. 掌握递归函数的执行过程。
3. 掌握位置参数、关键参数、默认值参数与长度可变参数的用法。
4. 理解函数调用时参数传递的序列解包用法。
5. 理解变量作用域。
6. 掌握lambda表达式的定义与用法。
7. 掌握生成器函数工作原理。
二、实验内容及结果
1. 编写函数,实现根据键盘输入的长、宽、高之值计算长方体体积。
def main():
value = input("请输入长方体的长、宽、高(空格分隔):")
length, width, height = [eval(i) for i in value.split(" ")]
volume = length * width * height
print("长方体的体积为%.2f" % volume)
main()
2. 编写函数,使用递归函数f(n)实现斐波那契数列中小于等于参数n的所有值。
def f(n):
if n == 1 or n == 2:
return 1
return f(n - 1) + f(n - 2)
def main():
num = int(input("请输入斐波那契数列的阶数:"))
print("斐波那契数列中小于等于参数{}的所有值:".format(num), end="")
for i in range(num - 1):
print(f(i + 1), end=",")
print(f(num))
main()
3. 编写函数,从键盘输入一个整数,判断其是否为完全数。所谓完全数,是指这样的数,该数的各因子(除该数本身外)之和正好等于该数本身,例如:6=1+2+3,28=1+2+4+7+14。
def main():
num = int(input("请输入一个整数:"))
total = 0
for i in range(1, int(num / 2) + 1):
if num % i == 0:
total += i
if total == num:
print("%d是一个完全数" % num)
else:
print("%d不是一个完全数" % num)
main()
4. 编写函数,从键盘输入参数n,使用递归函数H(n)实现下列特征方程中小于等于参数n的所有值。 H(0)=0; H(1)=1; H(2)=2; H(n)= H(n-1)+9H(n-2)-9H(n-3)
def H(n):
if 0 <= n < 3:
return n
else:
return H(n - 1) + 9 * H(n - 2) - 9 * H(n - 3)
def main():
num = int(input("请输入参数n:"))
print("函数H(n)小于等于参数n的所有值为:")
for i in range(num):
print(H(i), end=',')
print(H(num))
main()
5. 编写函数,实现折半查找。
def B_search(array, target):
array.sort()
low = 0
height = len(array) - 1
while low <= height:
mid = (low + height) // 2
if target == array[mid]:
return mid
elif target < array[mid]:
height = mid - 1
else:
low = mid + 1
return False
def main():
my_array = [1, 3, 5, 7, 9, 11, 13]
num = eval(input("请输入要查找的数:"))
result = B_search(my_array, num)
if result:
print("要查找的数在数组中的下标为:", result)
else:
print("数组中不存在要查找的数")
main()
6. 编写函数,从键盘输入参数x和n,计算并显示形如x+xx +xxx + xxxx + xxxxx+xxx…xxx+ 的表达式前n项的值。
def main():
x = input("请输入参数x:")
n = eval(input("请输入参数n:"))
exp = x
for i in range(2, n + 1):
exp += ' + ' + x * i
print(exp + " =", eval(exp))
main()
7. 编写函数,从键盘输入参数n,计算并显示表达式1 +1/2 –1/3 + 1/4 –1/5 + 1/6+… +(-1)n/n 的前n项之和。
def main():
n = eval(input("请输入参数n:"))
exp = "1"
for i in range(2, n + 1):
if i % 2 == 0:
exp += " + "
else:
exp += " - "
exp += "1/" + str(i)
print(exp + " =", round(eval(exp), 5))
main()
8. 编写函数,从键盘输入一字符串,判断该字符串是否为会回文,所谓回文是指,从前向后读和从后向前读是一样的。
def main():
s = input("请输入一串字符串:")
is_palindrome = lambda string: string == string[::-1]
if is_palindrome(s):
print(s + "是回文")
else:
print(s + "不是回文")
main()
9. 编写函数,从键盘输入一字符串,把其中的各个字符颠倒,标点符号不颠倒,例如,‘I enjoy reading!’,经过函数调用后变为‘gnidaer yojne I’。
import re
def main():
s = input("请输入一串字符串:")
punctuation = '!,;:?"\'、,.'
s = re.sub(r'[{}]+'.format(punctuation), '', s)
s_inverse = s[::-1]
print("颠倒后的字符串为:", s_inverse)
main()
10. 佩奇去超市购买54元巧克力和53元果冻,货币面值有20、10、2、1元,按付款货币数量最少原则,佩奇需要付给超市多少数量的货币,编写函数实现该算法。
def main():
price = 54 + 53
money = [20, 10, 2, 1]
num = 0
for m in money:
if price >= m:
num += price // m
print("{}张{}元".format(price // m, m))
price %= m
else:
continue
print("最少需要{}张货币".format(num))
main()
三、实验小结
本周的题目类型基本都是函数相关的,虽然题目的难度属于初中级,但是亲自做的时候还是感到不是特别流畅,对python中的许多语法还是无法做到自如地运用。比如lamda函数的使用实际上是可以更灵活的,但我自身只了解一些基础的用法,使用得很牵强,之后应多去了解一下各种语法的使用技巧。