python 实验八 函数 (下)

15.重复元素判定。编写一个函数,接受一个列表最为参数,如果一个元素在列表中出现了不止一次,则返回True,但不要改变源列表的值。最后在主程序中测试该函数。

def fun(ls):
    for n in ls:
        if ls.count(n) > 1:
            return True
    else:
        return False


def fun2(ls):
    return len(set(ls)) < len(ls)


ls = eval(input('请按照列表格式输入列表元素:'))
if fun(ls) == True:
    print('该列表中存在重复元素')
else:
    print('该列表中不存在重复元素')

if fun2(ls) == True:
    print('该列表中存在重复元素')
else:
    print('该列表中不存在重复元素')

输出样例

请按照列表格式输入列表元素:11,16
该列表中不存在重复元素
该列表中不存在重复元素

16.将列表a中的数据线性转换成指定范围内的数据,并存放在列表b中。假设列表a中的元素的最大值为max_value,最小值为max_value。当指定列表b中的数据的取值范围为[low,high]时,将列表a中的元素a[i]线性转换为列表b中的元素b[i]的变换公式为
b[i]=low+(a[i]-min_value)*(high-low)/(max_value-min-value)

import random


def transfer(a, low, high):
    b = []
    max_value = max(a)
    min_value = min(a)
    for p in a:
        new_value = low + (p - min_value) * (high - low) / (max_value - min_value)
        new_value = round(new_value, 4)
        b.append(new_value)
    return b


def transfer2(a, low, high):
    max_value = max(a)
    min_value = min(a)
    b = [round(low + (p - min_value) * (high - low) / (max_value - min_value), 4) for p in a]
    return b


a = [random.randint(1, 100) for i in range(10)]
print(a)
low = int(input("low:"))
high = int(input("high:"))
b = transfer(a, low, high)
print(b)

b = transfer2(a, low, high)
print(b)

输出样例

[61, 89, 29, 42, 59, 65, 44, 84, 23, 86]
low:0
high:1
[0.5758, 1.0, 0.0909, 0.2879, 0.5455, 0.6364, 0.3182, 0.9242, 0.0, 0.9545]

17.输入一串字符作为密码,密码只能有数字与字母组成。编写一个函数judge(password),用来求出密码的强度level,并在主程序中测试该函数,根据输入,输出对应密码强度。密码强度判断准则如下(满足其中一项,密码增强一级):1,有数字;
2,有大写字母;3,有小写字母;4,位数不少于8位.
测试数据:

请输入测试密码:abc123
abc123的密码强度为2级
请输入测试密码:Abc123
Abc123的密码强度为3级
请输入测试密码:Abc12345
abc12345的密码强度为4级

def judge(password):
    level = 0

    n = len(password)
    if n >= 8:
        level += 1

    for ch in password:
        if '0' <= ch <= '9':
            level += 1
            break

    for ch in password:
        if 'A' <= ch <= 'Z':
            level += 1
            break

    for ch in password:
        if 'a' <= ch <= 'z':
            level += 1
            break

    return level


while True:
    s = input('请输入测试密码(直接回车为退出):')
    if s == '':
        break;

    level = judge(s)
    print(f'{s}的密码强度为{level}级')

输出样例

请输入测试密码(直接回车为退出):ABc123456
ABc123456的密码强度为4级

18.中位数是常见的统计量之一,在概率论和统计学中有广泛的应用,在偏态分布中有重要的价值。例如,想从一组数据中知道人们的平均财富,假设100人一个月没人收入100元,10人收入1000000元。如果算平均值,得到的是91000元,这是一个完没有向人们展现真实情况的奇怪值。在这种情况下,中位数会提供更有用的值和较好的描述。对于元素个数不同的列表而言,中位数的计算方式分为如下两种:
(1)若列表中的元素的个数为奇数,则中位数为排序后列表中间位置的那个数。
(2)若列表中的元素的个数为偶数,则中位数为排序后列表中间位置两个数的平均值。
请编写一个函数,该函数接受一个列表参数,返回高列表的中位数,最后在主程序中测试该函数。

import random


def median(ls):
    _ls = sorted(ls)
    _len = len(_ls)
    if _len % 2 == 0:
        return (_ls[_len // 2 - 1] + _ls[_len // 2]) / 2
    else:
        return _ls[_len // 2]


data = [random.randint(1, 100) for i in range(5)]
print(sorted(data))
print(median(data))

data = [random.randint(1, 100) for i in range(6)]
print(sorted(data))
print(median(data))

输出样例

[2, 22, 57, 62, 84]
57
[44, 54, 69, 80, 81, 81]
74.5

import random
import math


def fun(ls):
    avg = sum(ls) / len(ls)

    ls2 = [(n - avg) ** 2 for n in ls]
    std = math.sqrt(sum(ls2) / (len(ls) - 1))
    variance = std ** 2

    return avg, std, variance


data = [random.randint(1, 100) for i in range(5)]
print(data)
print(fun(data))

data = [0, 8, 12, 20]
print(data)
print(fun(data))

data = [8, 9, 11, 12]
print(data)
print(fun(data))

输出样例

[2, 16, 15, 84, 66]
(36.6, 36.052739146977444, 1299.8)
[0, 8, 12, 20]
(10.0, 8.32666399786453, 69.33333333333333)
[8, 9, 11, 12]
(10.0, 1.8257418583505538, 3.3333333333333335)

20.定义一个函数delSame(li),参数li是一个列表;该函数返回一个新列表,新列表不包含重复元素,只保留第一次在原列表中出现的元素。如原列表为[1,2,3,4,5,2,1,4,5,3,8,8,9],经过处理后得到的列表为[1,2,3,4,5,8,9]。在主程序中定义一个列表并初始化,调用该函数,输出该函数,输出新的列表。

import random


def delSame(ls):  # 此方法可以保持元素的原始顺序
    t = []
    for p in ls:
        if p not in t:
            t.append(p)
    return t


def delSame2(ls):
    return list(set(ls))  # 使用集合去重,但不能保持元素的原始顺序


data = [random.randint(1, 100) for i in range(12)]
print(data)
print(delSame(data))
print(delSame2(data))

data = [1, 2, 3, 4, 5, 2, 1, 4, 5, 3, 8, 8, 9]
print(data)
print(delSame(data))
print(delSame2(data))

输出结果

[69, 75, 3, 54, 3, 100, 93, 12, 25, 75, 9, 86]
[69, 75, 3, 54, 100, 93, 12, 25, 9, 86]
[3, 100, 69, 9, 75, 12, 54, 86, 25, 93]
[1, 2, 3, 4, 5, 2, 1, 4, 5, 3, 8, 8, 9]
[1, 2, 3, 4, 5, 8, 9]
[1, 2, 3, 4, 5, 8, 9]

21.某公司采用公用电话传递数据,数据(明文)是4位数,且在传递过程中是加密的,加密规则:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。如明文是“1234”,则密文是“9876”;明文是“2345”,则密文是“0987”。
(1)定义一个函数encrypt(s),参数s为4位数字字符串,该函数根据加密规则返回密文。
(2)在主程序中输入明文,调用加密函数,并输入密文。

def encrypt(s):
    li = [str((int(i) + 5) % 10) for i in s]
    li.reverse()
    return ''.join(li)


s = input('input plaintext:')
print(f'明文:{s},密文:{encrypt(s)}')

输出样例

input plaintext:4567
明文:4567,密文:2109

22.求闭区间[low,high]中所有满足x*x的值的每一位数字互不相同的整数x。如分别输入low和high的值:2000,2100。在范围[2000,2100]内满足条件的整数及其平方数如下:

xx*x
20134052169
20274108729
20694280761
20954389025

总数为:4

def isdiff(n):
    li = [0] * 10

    s = str(n)
    flag = True

    for i in s:
        k = int(i)
        li[k] += 1
        if li[k] > 1:
            flag = False
            break

    return flag


def isdiff2(n):
    s = str(n)
    m = set(s)
    return len(m) == len(s)


low = int(input("low:"))
high = int(input("high:"))
print("x\tx*x")
k = 0
for n in range(low, high + 1):
    if isdiff(n * n) == True:
        print(f"{n}\t{n * n}")
        k += 1
print("总数为:", k)

输出样例

low:2000
high:2300
x x*x
2013 4052169
2027 4108729
2069 4280761
2095 4389025
2123 4507129
2126 4519876
2175 4730625
2199 4835601
2203 4853209
2277 5184729
总数为: 10

23.对于学生的成绩,学生关注的通常是自己的成绩而教师往往关注的是全班的成绩。现在有一个字典(键为学号,值为成绩),里面存放着若干名学生的成绩,如{“9601”:95,“9602”:96,“9603:87,…”},其中”9601″表示学号,95表示学生成绩。请编写一个程序。
(1)定义一个全局字典,用来保存学生的成绩。
(2)定义一个函数,接受一个参数,该参数表示学号,函数返回字典中该学号对应的成绩。若字典不存在该学号,则函数返回-1。
(3)定义一个函数,按照成绩降序输出学生信息,例如:
9602,96
9601,95
9603,87
(4)在主程序中测这两个函数。

dicScore = {
    '9601': 95,
    '9602': 96,
    '9603': 87,
}


def get_score(id):
    return dicScore.get(id, -1)


def sort_score():
    ls = sorted(dicScore.items(), key=lambda x: x[1], reverse=True)
    for i in ls:
        print(f'{i[0]},{i[1]}')


print(get_score('9602'))
sort_score()

输出结果

96
9602,96
9601,95
9603,87

24.一个人喜欢的颜色可以反应他的性格,颜色与性格的对应关系如图8-1所示。

表8-1
颜色性格描述
红色活泼而充满斗志的人
黄色智慧型的理论家
蓝色浪漫的人
绿色谨慎而知性的人
紫色注重美感和个性化的人
黑色神秘而自尊的人
白色诚实的人

请编写程序实现性格色彩测试,要求程序运行时首先显示7种颜色,并提示用户选择,选择好颜色输出对应的性格描述;接着询问用户是否继续测试,如果继续测试重复前面的操作,否则退出程序。请合理设计函数,并在主程序中测试该函数。

def menu():  # 显示用户颜色选择菜单
    print('1:红色\n2:黄色\n3:蓝色\n4:绿色')
    print('5:紫色\n6:黑色\n7:白色')
    while True:
        option = input("请输入您的选择(数字0-7,0代表停止测试):")
        if option.isdigit():
            return int(option)
        else:
            print('您输入的不是数字!')


def test(option):  # 根据颜色选项获取测试结果
    dic = {  # 用字典保存颜色与性格的对应关系
        1: "活泼而充满斗志的人",
        2: "智慧型的理论家",
        3: "浪漫的人",
        4: "谨慎而知性的人",
        5: "注重美感和个性化的人",
        6: "神秘而自尊的人",
        7: "诚实的人"
    }
    return dic.get(option, '颜色选择错误')


while True:
    op = menu()
    if op == 0:  # 输入0表示测试结束
        print('测试结束')
        break;
    result = test(op)
    print(result)
    print()

输出样例

1:红色
2:黄色
3:蓝色
4:绿色
5:紫色
6:黑色
7:白色
请输入您的选择(数字0-7,0代表停止测试):6
神秘而自尊的人

#25题
import random

fun = lambda n: n ** 2

data = [random.randint(1, 10) for i in range(5)]
print(data)
data2 = [fun(d) for d in data]
print(sum(data2))

输出样例

[4, 2, 8, 10, 9]
265

#26题
import math

fun = lambda n: (1 + math.log(n)) / (2 * math.pi)

a = math.e ** 3
b = [fun(k) for k in range(1, 101)]
print(a + sum(b))

输出结果

93.89195084920446

#27题
def fun(n):
    if n == 1:
        return 1
    else:
        return fun(n - 1) + 1 / n


print(fun(1))
print(fun(2))
print(fun(10))
print(fun(100))
print(fun(500))

输出结果

1
1.5
2.9289682539682538
5.187377517639621
6.79282342999052

#28题
def fun(n):
    if n == 1:
        return 1 / 3
    else:
        return fun(n - 1) + n / (2 * n + 1)


print(fun(1))
print(fun(2))
print(fun(10))
print(fun(100))
print(fun(500))

输出结果

0.3333333333333333
0.7333333333333334
4.409562711110699
48.85534134316012
248.4549709267233

#29题
def fun(n):
    if n <= 2:
        return n
    else:
        return fun(n - 1) + fun(n - 2) + fun(n - 3)


print(fun(1))
print(fun(2))
print(fun(3))
print(fun(9))     #当n为9时函数的值

输出结果

1
2
3
125

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2023年5月24日
下一篇 2023年5月24日

相关推荐