实验五 Python函数设计

本文介绍了Python编程中的一些基本函数应用,包括元组作为函数返回值、数字加密、字典操作、素数判断以及递归和斐波那契数列计算。同时展示了如何调试代码和设计递归解决汉诺塔问题。涉及的编程概念包括输入输出、条件判断、循环、函数定义和调用等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 编写程序,利用元组作为函数的返回值,求序列类型中的最大值、最小值和元素个数 , 并编写测试代码 , 假设测试数据分别为 s1=[9,7,8,3,2,1,55,6] 、 s2=[" apple","pear" melon","kiwi"] 和 s3=" TheQuickBrownFox"。运行效果参见下图。

def f(s):
    return max(s), min(s), len(s)

list1 = eval(input("请输入元组:"))
print(f"list={list1}")
xl = f(list1)  # 利用返回值索引分别对应
print(f"最大值={xl[0]},最小值={xl[1]},元素个数={xl[2]}")  # 根据返回值的索引分别对应

2. 设计一个函数,实现输入一个五位数的正整数(程序要对输入数据的合法性进行检查),对输入的数据加密后再返回,加密规则:每位数字都加上 7,然后用 10 取模,再将得到的结果交换顺序:第一位和第二位交换,第三位和第五位交换,第一位和第四位交换。

def jiami(x):
    s = []
    for i in range(6):
        s.append((x % 10 + 7) % 10)
        x = x // 10
    s.reverse()  # 排序
    s[0], s[1] = s[1], s[0]
    s[2], s[4] = s[4], s[2]
    s[0], s[3] = s[3], s[0]
    return int(''.join(map(str, s)))  # 连接 无任何连接符

n = int(input("请输入一个五位数的正整数:"))
if n > 99999 or n <= 0:
    n = int(input("请输入一个五位数的正整数:"))
print("加密前:", n)
print("加密后:", jiami(n))

3. 请编写一个程序,使用字典存储学生信息(自己编写至少十个学生的信息),学生信息包括学号和姓名,请根据学生学号从小到大输出学生的信息。提示:使用sorted函数并指定其对应的参数key的值。

def f(a):
    b = sorted(a)  # sorted直接对键排序
    name = []
    for i in b:
        name.append(a[i])
    c = dict(zip(b, name))
    return c

student = {1: 'l', 3: 'c', 2: 'x'}  # 学号为键 姓名为值
print(f(student))

4. 首先,使用标准库 random 生成一个包含 50 个介于 1~100 的随机整数的列表,编写函数 def isPrime(n)用来测试整数 n 是否为素数;接下来使用内置函数 filter(把函数 isPrime()作用到包含若干随机整数的列表 lst 上,最后程序输出一个列表,其中只包含列表 lst 中不是素数的那些整数。

def isPrime(a):
    if a == 1:  # 1不是素数,不过滤
        return 1
    for i in range(2, int(a ** 0.5) + 1):
        if a % i == 0:  # 不是素数
            return 1
        else:
            return 0
    return 0  # 返回值为0的是素数,为过滤范围内的

import random

list1 = [random.randint(1, 101) for i in range(50)]
print(list1)
print(list(filter(isPrime, list1)))  # 过滤函数返回值为0的,即过滤素数

5. 编写程序,清分别使用递归和非递归方式实现。定义一个求阶乘的函数 fact(n),并编写测试代码,要求输入整数(n≥0)。运行效果如下图所示。

####递归
def fact(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n * fact(n - 1)

a = int(input("请输入整数n(n>=0):"))
print("S!=", fact(a))


####非递归
def fact(n):
    num = 1
    for i in range(1, n + 1):
        num = num * i
    return num

a = int(input("请输入整数n(n>=0):"))
print("S!=", fact(a))

6. 编写程序实现斐波那契数列,斐波那契数列:1、1、2、3、5、8、 13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)。

def f(n):
    for i in range (1,n+1):
        if n==1 or n==2:
            return 1
        else:
            return f(n-1) + f(n-2)

n=int(input('请输入n的值:'))
for i in range(1,n+1):
    print(f(i),end='、')

7. 阅读并适当增加必要的代码来调试下面的代码,分析代码功能, 发现并解决代码中的错误。提示:此代码计算C{n}^{i}

def cni(n, i):
    minNI = min(i, n - i)
    result = 1
    for j in range(1, minNI + 1):
        result = result * (n - j + 1) // j  # 修改计算方式
    return result

n = eval(input('请输入n的值:'))
i = eval(input('请输入i的值:'))
print(cni(n, i))

8. 小球从 100m 的高度自由落下,每次落地后反弹回原高度的一半;再落下,定义函数 cal 计算小球在第 n 次落地时,共经过多少米以及第 n 次反弹多高。定义全局变量 Sn和 Hn分别存储小球经过的路程和第 n 次的高度。主函数输入 n 的值,并调用 cal 函数计算输出 Sn和 Hn的值。

def cal(n):
    global Sn  # 定义全局变量Sn
    global Hn  # 定义全局变量Hn
    Sn = 0
    Hn = 100
    for i in range(n):
        Sn = Sn + Hn
        Hn = 0.5 * Hn
    return Sn, Hn

n = eval(input('请输入n的值:'))
result = cal(n)
print(f"Total of road is {result[0]} meter")
print(f"The heighth is {result[1]} meter")

9. 爬虫问题:(选做)

(1)利用以下代码段获取指定 url 链接对应网页源代码 url=“https://www.cnhnb.com/hangqing/cdlist-2001762-0-0-0-0-2/

import requests

strs=requests.get(url).text #当前网页的源代码(字符串类型)

(2)从当前源代码中提取出“所在产地”和“价格”信息

(3)观察一下当前 5 页网页 url 链接的规律,并编写函数,实现抓取全部网页中的“所在产地”和“价格”信息,存入一个列表

10.(选做)编写程序,利用可变参数定义一个求任意个数数值的最小值的函数 min_n(a,b,c), 并编写测试代码。例如,对 于 “ print(min_n(8,2))”以及“ print(min_n(16,1,7,4,15)”的测试代码, 程序运行结果如图所示。

def min_n(*n):  #  *n为动态参数
    n=min(*n)
    print("最小值为",end="")
    return n

print(min_n(8,2))
print(min_n(16,1,7,4,15))

 11.(选做)设计一个程序,用递归求解汉诺塔。(选做

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

再见以前说再见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值