2023《Python程序设计》试题库:编程题(含答案)
四、编程题
1、编写程序,在D盘根目录下创建一个文本文献test.txt,并向其中写入字符串hello world。
答:
fp = open(r’D:\test.txt’, ‘a+’) print(‘hello world’, file=fp) fp.close()
2、写出下面代码的优化版本,提高运营效率。
x = list(range(500)) for item in x: t = 5**5 print(item+t)
答:
x = list(range(500)) t = 5**5 for item in x: print(item+t)
3、编写程序,生成一个包含20个随机整数的列表,然后对其中偶数下标的元素进行降序排列,奇数下标的元素不变。(提醒:使用切片。)
答:
import random x = [random.randint(0,100) for i in range(20)] print(x) y = x[::2] y.sort(reverse=True) x[::2] = y print(x)
4、写出下面代码的执行结果。
def Join(List, sep=None): return (sep or ',').join(List) print(Join(['a', 'b', 'c'])) print(Join(['a', 'b', 'c'],':'))
答:
a,b,c
a:b:c
5、写出下面代码的运营结果。
def Sum(a, b=3, c=5): return sum([a, b, c]) print(Sum(a=8, c=2)) print(Sum(8)) print(Sum(8,2))
答:
13
16
15
6、写出下面代码的运营结果。
def Sum(*p): return sum(p) print(Sum(3, 5, 8)) print(Sum(8)) print(Sum(8, 2, 10))
答:
16
8
20
7、编写函数,判断一个数字是否为素数,是则返回字符串YES,否则返回字符串NO。
答:
import math def IsPrime(v): n = int(math.sqrt(v)+1) for i in range(2,n): if v%i==0: return 'No' else: return 'Yes'
8、编写函数,模拟Python内置函数sorted()。
答:
def Sorted(v): t = v[::] r = [] while t: tt = min(t) r.append(tt) t.remove(tt) return r
9、编写程序,生成包含20个随机数的列表,然后将前10个元素升序排列,后10个元素降序排列,并输出结果。
答:
import random x = [random.randint(0,100) for i in range(20)] print(x) y = x[0:10] y.sort() x[0:10] = y y = x[10:20] y.sort(reverse=True) x[10:20] = y print(x)
10、编写程序,运营后用户输入4位整数作为年份,判断其是否为闰年。假如年份能被400整除,则为闰年;假如年份能被4整除但不能被100整除也为闰年。
答:
x = input('Please input an integer of 4 digits meaning the year:')
x = eval(x)
if x%400==0 or (x%4==0 and not x%100==0):
print('Yes')
else:
print('No')11、编写程序,实现分段函数计算,如下表所示。
x | y |
x<0 | 0 |
0<=x<5 | x |
5<=x<10 | 3x-5 |
10<=x<20 | 0.5x-2 |
20<=x | 0 |
答:
x = input('Please input x:')
x = eval(x)
if x<0 or x>=20:
print(0)
elif 0<=x<5:
print(x)
elif 5<=x<10:
print(3*x-5)
elif 10<=x<20:
print(0.5*x-2)12、阅读下面的程序,判断其是否可以正常运营,假如可以运营则写出执行结果,假如不能运营则写出理由。
class Test: def __init__(self, value): self.__value = value @property def value(self): return self.__value t = Test(3) t.value = 5 print(t.value)
答:
不能运营。程序中定义的是只读属性,不能修改属性的值。
13、下面代码的功能是,随机生成50个介于[1,20]之间的整数,然后记录每个整数出现频率。请把缺少的代码补全。
import random x = [random.____________(1,20) for i in range(_______)] r = dict() for i in x: r[i] = r.get(i, _____)+1 for k, v in r.items(): print(k, v)
答:
分别填写randint、50、0
14、假设有Python程序文献demo.py,代码如下:
def main(): if __name__ == '__main__': print(1) else: print(2) main()
将该程序文献直接运营时输出结果为_________,作为模块导入时得到结果___________-。(1、2)
15、下面程序的执行结果是__________________。(1)
s = 0 for i in range(1,101): s += i else: print(1)
16、下面程序的执行结果是______________。(1275)
s = 0 for i in range(1,101): s += i if i == 50: print(s) break else: print(1)
17、下面的程序是否可以正常执行,若不能,请解释因素;若能,请分析其执行结果。
from random import randint result = set() while True: result.add(randint(1,10)) if len(result)==20: break print(result)
答:无法对的执行,由于该程序的功能是从[1,10]区间中选择20个不同的随机整数,而该区间并没有这么多整数,所以程序死循环。
18、下面的代码是否可以对的运营,若不能请解释因素;若能,请分析其执行结果。
>>> x = list(range(20)) >>> for i in range(len(x)):
del x[i]
答:无法对的执行,由于删除列表元素时会影响其他元素在列表中的索引,上面的代码会抛出下标越界的异常。
19、阅读下面的代码,解释其功能。
>>> x = list(range(20)) >>> for index, value in enumerate(x): if value == 3: x[index] = 5
答:将列表x中值为3的元素修改为5。
20、阅读下面的代码,解释其功能。
>>> x = [range(3*i, 3*i+5) for i in range(2)] >>> x = list(map(list, x)) >>> x = list(map(list, zip(*x)))
答:一方面生成一个包含列表的列表,然后模拟矩阵转置。
21、阅读下面的代码,解释其功能。
>>> import string
>>> x = string.ascii_letters + string.digits
>>> import random
>>> print(''.join(random.sample(x, 10)))答:输出由英文字母大小写或数字组成的长度为10且不反复的随机字符串。
22、阅读下面的代码,分析其执行结果。
def demo(*p): return sum(p) print(demo(1,2,3,4,5)) print(demo(1,2,3))
答:输出结果为
15
6
23、阅读下面的代码,分析其执行结果。
def demo(a, b, c=3, d=100): return sum((a,b,c,d)) print(demo(1, 2, 3, 4)) print(demo(1, 2, d=3))
答:输出结果为
10
9
24、下面的代码输出结果为_____________。(3)
def demo(): x = 5 x = 3 demo() print(x)
25、下面函数的功能为_______________。(将序列循环左移k位,得到新序列并返回)
def demo(lst, k): if k<len(lst): return lst[k:]+lst[:k]
26、编写函数,求任意整数的二进制形式中最后连续0的个数。
def demo(n):
b_n = bin(n)
index = b_n.rfind('1') + 1
return len(b_n[index:])27、有n个乒乓球运动员打淘汰赛,编写函数计算至少需要多少场比赛才干决出冠军,不允许直接使用n-1。
def demo(n): if n == 1: return 0 if n == 2: return 1 m, c = divmod(n, 2) return m + demo(c+m)
28、使用循环和列表推导式两种方法求解百钱买百鸡问题。假设大鸡5元一只,中鸡3元一只,小鸡1元三只,现有100元钱想买100只鸡,有多少种买法?
(1)循环
>>> for x in range(21): for y in range(34): z = 100-x-y if z%3==0 and 5*x + 3*y + z//3 == 100: print(x,y,z)
0 25 75
4 18 78
8 11 81
12 4 84
(2)列表推导式
>>> [(x, y, 100-x-y) for x in range(21) for y in range(34) if (100-x-y)%3==0 and 5*x+3*y+(100-x-y)//3==100]
[(0, 25, 75), (4, 18, 78), (8, 11, 81), (12, 4, 84)]
29、编写函数,给定任意字符串,找出其中只出现一次的字符,假如有多个这样的字符,就所有找出。
def searchOne(s):
# 创建空字典
d = dict()
# 遍历字符串,并分别记录每个字符的出现次数
for ch in s:
# 这里重点演示字典的get()方法
# 假如这个字符出现过,加1
# 假如这个字符第一次出现,0+1
d[ch] = d.get(ch, 0) + 1
# 列表推导式,查找所有只出现一次的字符
chs = [ch for ch, n in d.items() if n==1]
# 返回最终结果,所有只出现一次的字符
return chs
print(searchOne('abcdddca'))30、阅读以下冒泡法排序代码,尝试写出优化代码,提高代码运营效率。
from random import randint
def bubbleSort(lst):
length = len(lst)
for i in range(0, length):
for j in range(0, length-i-1):
#比较相邻两个元素大小,并根据需要进行互换
if lst[j] > lst[j+1]:
lst[j], lst[j+1] = lst[j+1], lst[j]
lst = [randint(1, 100) for i in range(20)]
print('Before sort:\n', lst)
bubbleSort(lst)
print('After sort:\n', lst)参考答案:
from random import randint
def bubbleSort(lst):
length = len(lst)
for i in range(0, length):
flag = True
for j in range(0, length-i-1):
#比较相邻两个元素大小,并根据需要进行互换
if lst[j] > lst[j+1]:
lst[j], lst[j+1] = lst[j+1], lst[j]
flag = False
if flag:
break
lst = [randint(1, 100) for i in range(20)]
print('Before sort:\n', lst)
bubbleSort(lst)
print('After sort:\n', lst)31、编写程序,用户输入带有千分位逗号的数字字符串,然后输出不带千分位逗号的数字字符串。假如输入字符串'0'则退出程序。
参考答案:
def convert(strNumber):
return ''.join(strNumber.split(','))
while True:
x = input('输入带有千分位逗号的数字:')
if x == '0':
print('bye')
break
print(convert(x))32、编写程序,用户输入不带千分位逗号的数字字符串,然后输出带千分位逗号的数字字符串。
参考答案:
def convert(strNumber):
# 考虑小数的情况
temp = strNumber.split('.', 1)
# 整数部分
first = temp[0]
if not first.isdigit():
return '不是有效数字'
# 小数部分
try:
second = temp[1]
if not second.isdigit():
return '不是有效数字'
except:
second = ''
# 增长千分位逗号
def nested(s):
result = []
length = len(s)
index = length % 3
if index != 0:
result.append(s[:index])
for i in range(index, length, 3):
result.append(s[i:i+3])
return ','.join(result)
first = nested(first)
# 小数部分和整数部分的千分位不同样
if second:
second = ''.join(reversed(second))
second = nested(second)
second = ''.join(reversed(second))
# 删除两侧也许的0和千分位逗号
return '.'.join([first, second]).strip(',0')
# 删除整数左侧也许的0和逗号
return first.lstrip('0,')
# 测试
while True:
x = input('输入不带千分位逗号的数字:')
if x == '0':
print('bye')
break
print(convert(x))