Python 刷题作业

第7题

函数main()接收一个包含若干整数的列表lst,要求返回一个新列表,新列表包含原列表lst中的唯一元素(重复的元素只保留一个),并且所有元素保持在原列表中首次出现的相对顺序。例如,调用函数main([1,2,3,1,4])会输出[1,2,3,4]。删除下面代码中的pass语句,替换为自己的代码,完成要求的功能。不能使用循环结构和任何形式的推导式。

# 解题思路:使用集合的唯一性去除重复元素,使用sorted保留相对位置
def fun(lst):
    new_list = sorted(set(lst), key=lst.index)
    return new_list
    
lst = [1, 5, 3, 1, 4, 5]
print(fun(lst))

第138题

山东省新高考政策中,考生必考科目有语文、数学、英语,然后需要在物理、化学、生物地理、历史、政治这6科中任选3个科目,自主选择的3个科目按等级分计入高考成绩。把每个科目的卷面原始成绩参照正态分布原则划分为8个等级,确定每个考生成绩所处的比例和等级,然后把原始成绩转换为对应的等级成绩。考生原始成绩所处的位次越靠前,计算得到的等级成绩越高。原始成绩的等级划分与等级成绩的对应关系如下:A等级(排名前3%)>[91,100];B+等级(3%-10%)>[81,90];B等级(10%-26%)>[71,80];C+等级(26%-50%)>[61,70];c等级(50%-74%)>[51,60];D+等级(74%-90%)>[41,501;D等级(90%-97%)>[31,401;E等级(97%-100%)>[21,30]。例如,小明选了化学,卷面原始成绩为77分,全省选考化学成绩从高到低排序后,小明的分数落在前3%-10%这个区间,这个区间内的最高分和最低分分别为79和70分,对应的等级成绩区间为[81,90],那么转换为等级成绩之后小明的分数为(77-70)/(79-70)*(90-81)+81=88分,小明最终成绩为88分。
函数main()接收参数score、grade、high、low分别表示考生卷面原始分数、所处等级、该等级卷面原始分数的最高分和最低分,要求计算并返回考生的等级成绩,结果保留最多3位小数。例如,main(77,‘B+’,79,70)返回88.0。删除下面代码中的pass语句,替换为自己的代码,完成要求的功能。

#从示例入手
grades = {'A': (91,100), 'B+': (81,90), 'B': (71,80),\
          'C+': (61,70), 'C': (51,60), 'D+': (41,50),\
          'D': (31,40), 'E': (21,30)}
def Score(score, grade, high, low):
    grade_low,grade_high = grades[grade]
    score_f = (score-low) / (high-low)*(grade_high-grade_low)+grade_low
    return score_f

if __name__ == '__main__':
    print(Score(77, 'B+', 79, 70))

第18题

函数main()接收一个包含若干整数的列表lst,要求判断列表中是否存在重复的整数。如果列表中所有整数完全一样则返回整数0,如果列表中的所有整数互不相同则返回整数1,如果列表中有部分整数相同则返回整数2。删除下面代码中的pass语句,替换为自己的代码,完成要求的功能。

#判断分支练习
def T_list(lst):
    lst_l = len(lst)
    set_l = len(set(lst))
    if set_l == 1:
        return 0
    elif set_l == lst_l:
        return 1
    else:
        return 2

if __name__ == '__main__':
    lst1 = [1, 2, 3, 4, 5]
    lst2 = [1, 2, 2, 5, 5]
    lst3 = [1, 1, 1]
    print(T_list(lst1))
    print(T_list(lst2))
    print(T_list(lst3))

第115题

函数main()接收两个正整数start和stop,要求返回区间[start,stop]上能够被17整除的最大正整数,如果没有这样的正整数就返回字符串’不存在"。删除下面代码中的pass语句,替换为自己的代码,完成要求的功能。

def demo(start,stop):
    if (not isinstance(start,int)) or (not isinstance(start,int)) or (start<0) or (stop<0) or(stop<start):
        return ('参数错误')
    n = stop
    while n >= start:
        if n%17 ==0:
            return n
        n -= 1
    else:
        return('不存在')

if __name__ == '__main__':
    print(demo(17,17))

第90题

编写程序,模拟报数游戏。有n个人围成一圈,从0到n-1按顺序编号,从第一个人开始从1到k报数,报到k的人退出圈子,然后圈子缩小,从下一个人继续游戏,问最后留下的是原来的第几号。函数main()接收一个表示初始编号的列表1st和一个正整数k,要求返回上述游戏中最后一个人的原始编号。删除代码中的pass语句,替换为自己的代码,完成预期的功能。

from itertools import cycle
#圈子游戏
def func(lst, k):
    #切片,以免影响原来的数据
    t_lst = lst[:]
    #游戏一直进行到只剩下最后一个人
    while len(t_lst)>1:
        #创建cycle对象
        c= cycle(t_lst)#创建一个循环迭代器,无限循环遍历列表中的元素
        #从1到k报数
        for i in range(k):
            t = next(c)
        #一个人出局,圈子缩小
        index = t_lst.index(t)
        t_lst = t_lst[index+1:] + t_lst[:index]
    #游戏结束
    return t_lst[0]

lst = list(range(1,11))
print(func(lst,3))

第185题

函数main()接收两个datetime日期时间对象dt1和dt2,要求返回二者之间相差的总秒数,结果应为大于等于8的实数。例如,main(datetime(2021,2,3,7,52,15),datetime(20212,3,7,52,50))返回35.0,main(datetime(2021,2,2,2,2,2),datetime(2020,2,2,2,22))返回31622400.0,main(datetime(2021,2,3,7,52,0),datetime(2021,2,4,7,52,0))返回86400.0。删除下面代码中的pass语句,替换为自己的代码,完成要求的功能。

from datetime import datetime
def totalseconds_diff(dt1, dt2):
    time_difference = (dt2 - dt1).total_seconds()   #计算两个对象之间的总秒数差异。这里的差异:如果dt2在dt1之前,则是负数。
    return abs(time_difference) #取绝对值

dt1 = datetime(2021,2,3,7,52,15)
dt2 = datetime(2021,2,3,7,52,50)
print(totalseconds_diff(dt1, dt2))
dt1 = datetime(2021,2,2,2,2,2)
dt2 = datetime(2020,2,2,2,2,2)
print(totalseconds_diff(dt1, dt2))
dt1 = datetime(2021,2,3,7,52,0)
dt2 = datetime(2021,2,4,7,52,0)
print(totalseconds_diff(dt1, dt2))

第173题

函数main()接收一个任意类型参数obi,检查其是否为迭代器对象,是则返回True,否则返回False。所谓迭代器对象,是指同时具有特殊方法__iter__()__next__()的对象,例如生成器对象、map对象、enumerate对象、zip对象等都是迭代器对象。例如,main(enumerate(‘Python’))返回True.删除下面代码中的pass语句,替换为自己的代码,完成要求的功能

def is_iterator(obj):
    '''
    getattr()是一个Python内置函数,用于获取对象的属性值。函数的作用是从指定的对象中获取属性的值。如果属性存在,则返回属性的值;如果属性不存在,则根据情况返回默认值或者抛出AttributeError异常。
    callable()是一个Python内置函数,用于检查对象是否可调用
    '''
    if callable(getattr(obj, '__iter__', None)) and callable(getattr(obj, '__next__', None)):
        return True
    else:
        return False

# 示例测试
lst = [1, 2, 3]
print(is_iterator(lst)) # False
it = iter(lst)
print(is_iterator(it)) # True

第255题

在下面的代码中,函数main()用来计算并返回表达式ax+b的值,但要求使用outer类的对象来实现,不能在main()函数中直接计算。例如,main(3,5,7)返回37+5的结果26。阅读下面的代码,根据main()函数中的调用语句分析outer类可能的实现,删除pass语句替换为自己的代码,完成预期的功能。不能导入任何模块,不能修改main()函数中的代码。

class outer:
    def __init__(self,a,b):
        self.a = a
        self.b = b
    def __call__(self, x):
        return self.a * x + self.b

def func(a, b, x):
    return outer(a,b)(x)

print(func(3,5,7))

第117题

函数main()接收两个表示从坐标原点出发的二维向量的元组vector1和vector2,例如(3,0)表示从坐标原点(0,0)到坐标(3,0)的向量,要求返回两个向量vector1和vector2的夹角(单位为度,数值大小在0到180之间),并且要求结果恰好保留2位小数,例如向量(3,0)和(0,4)的夹角为90.00。删除下面代码中的pass语句,替换为自己的代码,完成要求的功能。代码已导入的标准库对象不是必须使用的,可以自己决定是否使用。

from operator import mul
from math import acos,degrees
def vector_angle(vector1, vector2):
    ax, ay = vector1
    bx, by = vector2
    dot_product = mul(ax, bx) + mul(ay, by) #点积
    #求模长
    from math import sqrt
    norm_a = sqrt(ax ** 2 + ay ** 2)
    norm_b = sqrt(bx ** 2 + by ** 2)
    #求夹角
    cos_theta = dot_product / (norm_a * norm_b)
    theta_rad = acos(cos_theta)
    theta_deg = degrees(theta_rad)
    return '{:.2f}'.format(theta_deg)

vector1 = (3, 0)
vector2 = (0, 4)
print(vector_angle(vector1, vector2))

第238题

函数main()接收一个元组digits作为参数,元组digits中每个元素都是range(10)范围内的数字,要求把digits中的数字按顺序拼接为一个整数,digits中第一个元素的数字为结果整数的最高位,最后一个元素的数字为结果整数的最低位。例如,main((1,2,3,4))返回1234。
删除下面代码中的pass语句,替换为自己的代码,完成要求的功能。不能使用for循环,不能使用lambda表达式,不能导入任何模块,要求使用int()、map()函数。

def demo(digits):
    result = int(''.join(map(str, digits)))
    return result

digits = (1,4,3,5)
print(demo(digits))

第143题

函数main()接收一个任意字符串s,检查字符串s是否长度恰好为11且都为数字字符,返回True或False。删除下面代码中的pass语句,完成要求的功能。已导入的标准库re不是必须使用的,是否使用可以自己决定。

def func(s):
    result = re.findall('\d',s)
    if len(result)== 11:
        return True
    else:
        return False

s = '12345678910'
print(func(s))

第231题

函数main()接收一个正整数参数num,要求返回其二进制形式中最多有多少个连续的1。例如,main(9875716481)返回4,因为9875716481的二进制形式为0b1001001100101000110111100110000001,其中最多有4个连续的1。删除下面代码中的pass语句,替换为自己的代码,完成要求的功能。已导入的re模块不是必须用的,是否使用可以自己决定。

import re
def func(num):
    s = str(bin(num))
    # print(s)
    for i in range(len(s)):
        result = re.findall('1*', s)
        if result:
            longest_match = max(result, key=len)
            return len(longest_match)

print(func(9875716481))		#答案为4

你可能感兴趣的:(python笔记,python,开发语言)