Python四六级考试来了,测一下你什么水平!
↑↑↑关注后"星标"简说Python 人人都可以简单入门Python、爬虫、数据分析 简说Python推荐 来源/Python作业辅导员 作者 / 天元浪子
1 选择题(每题2分,共20分)
1.1 关于C、C++、C#、Python和Java等编程语言的发展史,下面哪一种说法是错误的?
A C是其中最早古老的
B C#是其中最年轻的
C C++比Java的历史更久
D Java比Python的历史更久
1.2 以下四人中谁被称为“Python之父”?
A 詹姆斯·高斯林(James Gosling)
B 林纳斯·托瓦兹(Linus Torvalds)
C 吉多·范罗苏姆(Guido van Rossum)
D 廖雪峰
1.3 列表a=[1,2,3,4,5],print(a[::-2])的输出为()。
A [1,2,3]
B [4,5]
C [5,3,1]
D 显示异常信息
1.4 列表a=[1,2,3,4,5],执行a[2:4]=[9]后,print(a)的输出为()。
A [1,2,9,9,5]
B [1,2,9,5]
C [1,2,[9],5]
D 显示异常信息
1.5 字典d={'name':'xufive'},下面哪一种写法是错误的?
A d['name']
B d.name
C d.get('name')
D d.get('age')
1.6 元组a=(1,2),b=(3,4),下面哪一种写法是错误的?
A a[0] = b[1]
B a[0] == b[1]
C a+b
D (*a, *b)
1.7 字符串s='xyz',下面哪一种写法是错误的?
A list(s)
B set(s)
C tuple(s)
D dict(s)
1.8 应用三元表达式的语句中,下面哪一种写法是错误的?
A [i if i%2 else i*2 for i in range(5)]
B [i if i%2 for i in range(5)]
C [i for i in range(5) if i%2]
D x = 3 if 3*7==21 else 4
1.9 执行下面的语句,返回结果是()。
[True, 5, 0, False, None, '0', '', 'False'].count(False)
A 1
B 2
C 3
D 4
1.10 执行下面的语句,返回结果是()。
''.join(map(lambda s:s*2, 'abc'))
A 'abcabc'
B ['aa', 'bb', 'cc']
C ['abc', 'abc']
D 'aabbcc'
2 简答题(每题3分,共30分)
2.1计算十六进制数ab和二进制数1100的和,以十进制形式显示结果。
2.2生成从A到Z的字符串。
2.3从键盘输入变量名和变量值(以等号分隔),并创建该变量。
2.4返回给定字符串中出现频次最高的字符。
2.5如果一个整数的平方的右侧还是这个整数,则该整数被称为同构数。判断一个整数是否是同构数。
2.6列表内,若某个元素的索引号等于这个元素本身,则称该元素为幸运数。找出给定列表内的幸运数。
2.7判断一个数是否为2的整数次幂。
2.8运行如下代码,请写出输出结果。
3 and 4 * 5 or 6
2.9运行如下代码,请写出输出结果。
z = zip('xyz', (1,2,3))
for i in range(2):
for k, v in z:
print('%s=%d'%(k,v))
2.10运行如下代码,请写出最后一行输出。
import threading
import time
def func():
for i in range(5):
print(i)
time.sleep(1)
threading.Thread(target=func).start()
time.sleep(3)
print('程序结束')
3 应用题(每题5分,共50分)
3.1 庞大的牛群
3.2 古堡之门
ABCDE × G = EDCBA
他对华生说:“ABCDE应该代表不同的数字,G也代表某个数字!”
华生:“我猜也是!”
于是,两人沉默了好久,还是没有算出合适的结果来。
请利用计算机的优势,找到破解的答案。
3.3 二维列表转置
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
[ [1, 4, 7],
[2, 5, 8],
[3, 6, 9] ]
3.4 用print函数画圆
3.5 约瑟夫环
3.6 扑克牌中的顺子
3.7 青蛙上台阶
3.8 24点游戏
3.9 背包问题
3.10 空间直线相交问题
参考答案
1 选择题
2 简答题
2.1 计算十六进制数ab和二进制数1100的和,以十进制形式显示结果。
参考答案1
>>> 0xab + 0b1100
183
参考答案2
>>> int('0xab', base=16) + int('0b1100', base=2)
183
2.2 生成从A到Z的字符串。
参考答案
>>> ''.join([chr(ord('A')+i) for i in range(26)])
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
2.3 从键盘输入变量名和变量值(以等号分隔),并创建该变量。
参考答案
>>> cmd = input('请变量名和变量值(以等号分隔):')
请变量名和变量值(以等号分隔):x=5
>>> exec(cmd)
>>> x
5
2.4 返回给定字符串中出现频次最高的字符。
参考答案
>>> s = 'erwerflkfjsfldkfberwefrasdafsasfdadfasd'
>>> max(set(s), key=s.count)
'f'
2.5 如果一个整数的平方的右侧还是这个整数,则该整数被称为同构数。判断一个整数是否是同构数。
参考答案
def is_isomo(n):
return str(n*n)[-len(str(n)):] == str(n)
>>> is_isomo(5)
True
def is_isomo(n):
return str(n*n)[-len((s:=str(n))):] == s
>>> is_isomo(6)
True
2.6 列表内,若某个元素的索引号等于这个元素本身,则称该元素为幸运数。找出给定列表内的幸运数。
参考答案
>>> def find_lucky(arr):
return list(filter(lambda x:x==arr.index(x), arr))
>>> find_lucky([1, 1, 2, 5])
[2]
>>> def find_lucky(arr):
return [item[1] for item in filter(lambda x:x[0]==x[1], enumerate(arr))]
>>> find_lucky([1, 1, 2, 5])
[1, 2]
2.7 判断一个数是否为2的整数次幂。
参考答案
>>> def check_pow(num):
return num > 0 and num & num-1 == 0
>>> check_pow(256)
True
2.8 运行如下代码,请写出输出结果。
>>> 3 and 4 * 5 or 6
2.9 运行如下代码,请写出输出结果。
z = zip('xyz', (1,2,3))
for i in range(2):
for k, v in z:
print('%s=%d'%(k,v))
2.10 运行如下代码,请写出最后一行输出。
import threading
import time
def func():
for i in range(5):
print(i)
time.sleep(1)
threading.Thread(target=func).start()
time.sleep(3)
print('程序结束')
3 应用题
3.1 庞大的牛群
参考答案1(5分)
>>> def cows(n):
if n < 4:
return n+1
return cows(n-1) + cows(n-4)
>>> cows(5)
7
>>> cows(10)
36
>>> cows(20)
907
参考答案2(5分)
>>> def cows(n):
if n < 4:
return n+1
result = [1,2,3,4]
for i in range(4, n+1):
result.append(result[0]+result[-1])
result = result[1:]
return result[-1]
>>> cows(5)
7
>>> cows(10)
36
>>> cows(20)
907
3.2 古堡之门
ABCDE × G = EDCBA
他对华生说:“ABCDE应该代表不同的数字,G也代表某个数字!”
华生:“我猜也是!”
于是,两人沉默了好久,还是没有算出合适的结果来。
请利用计算机的优势,找到破解的答案。
参考答案1(3分)
>>> def cbble():
for i in range(10000, 100000):
a, quotient = divmod(i, 10000)
b, quotient = divmod(quotient, 1000)
c, quotient = divmod(quotient, 100)
d, e = divmod(quotient, 10)
parts =set([a,b,c,d,e])
if len(parts) == 5:
for j in range(1, 10):
k = 10000*e + 1000*d + 100*c + 10*b +a
if j not in parts and i*j == k:
print('%d x %d = %d'%(i, j, k))
break
>>> cbble()
21978 x 4 = 87912
参考答案2(5分)
>>> def cbble():
for i in range(10000, 100000):
a,b,c,d,e = map(int, str(i))
parts =set([a,b,c,d,e])
if len(parts) == 5:
k = 10000*e + 1000*d + 100*c + 10*b +a
for j in range(1, 10):
if j not in parts and i*j == k:
return('%d x %d = %d'%(i, j, k))
return '此题无解!'
>>> cbble()
'21978 x 4 = 87912'
3.3 二维列表转置
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
[ [1, 4, 7],
[2, 5, 8],
[3, 6, 9] ]
参考答案1(3分)
>>> def transpose(arr):
result = list()
for j in range(len(arr[0])):
result.append(list())
for i in range(len(arr)):
result[j].append(arr[i][j])
return result
>>> transpose([[1,2,3], [4,5,6], [7,8,9]])
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
参考答案2(5分)
>>> def transpose(arr):
return list(zip(*arr))
>>> transpose([[1,2,3], [4,5,6], [7,8,9]])
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
3.4 用print函数画圆
参考答案(5分)
x = R * cos(theta)
y = R * sin(theta)
>>> import math
>>> def print_circle(r, k): # r为半径,k为宽高比矫正系数
theta = range(0,360,5)
x = [round(r*math.cos(math.radians(i))+r) for i in theta]
y = [round(r*math.sin(math.radians(i))+r) for i in theta]
dots = set(zip(x,y))
for i in range(2*r+1):
for j in range(2*r+1):
if (i,j) in dots:
print('*'*k, sep='', end='')
else:
print(' '*k, sep='', end='')
print()
>>> print_circle(5, 3)
***************
****** ******
*** ***
*** ******
*** ***
*** ***
*** ***
*** ***
*** ***
****** ******
***************
3.5 约瑟夫环
参考答案(5分)
>>> def joseph(n, m):
queue, start = list(range(1, n+1)), 0
while len(queue) > 1:
start = (m+start-1)%len(queue)
queue.pop(start)
return queue[0]
3.6 扑克牌中的顺子
参考答案(5分)
从扑克牌中随机抽5张牌
随机取牌,可以使用Python的内置模块random中的sample()方法,该方法可以随机地从指定列表中提取出多个不同的元素。判断是不是顺子
将5张牌换成对应数字,剔除0后排序。若是顺子的话,前后元素之差均为1。若不是1,同时超过1的总和大于0的个数,则不是顺子,否则为顺子。
>>> import random
>>> import numpy as np
>>> def get_five():
poker = list(range(1,14))*4 + [0,0] # 生成54张扑克牌
return random.sample(poker, 5)
>>> def is_straight(five):
no_zero = list(filter(lambda x:x>0, five)) # 剔除0
if len(no_zero) > len(set(no_zero)): # 如有重复
return False # 则不是顺子
no_zero.sort() # 非零元素排序
no_zero = np.array(no_zero) # 转为numpy数组
diff = np.diff(no_zero) # diff为相邻元素的差组成的数组
if np.sum(diff - 1) > 5-no_zero.size: # 若diff各元素减1后的和大于0的个数
return False # 则不是顺子
else:
return True
>>> def test(n): # 测试函数
for i in range(n):
five = get_five()
if is_straight(five):
print(five)
>>> test(100) # 测试100次
[12, 10, 11, 0, 8]
[5, 1, 0, 3, 2]
[10, 6, 0, 7, 9]
3.7 青蛙上台阶
参考答案1(5分)
>>> def climb(n):
if n == 1:
return 1
elif n == 2:
return 2
else:
return climb(n-1) + climb(n-2)
>>> climb(10)
89
参考答案2(5分)
>>> def climb(n):
if n == 1:
return 1
elif n == 2:
return 2
c1, c2 = 1, 2
for i in range(2,n):
c1, c2 = c2, c1+c2
return c2
>>> climb(10)
89
3.8 24点游戏
参考答案(5分)
>>> from itertools import permutations, product
>>> def game24(n1,n2,n3,n4):
for a,b,c,d in permutations((n1,n2,n3,n4),4):
for o1,o2,o3 in product(['+','-','*','/'], repeat=3): # 笛卡尔积的另一种写法
cases = list()
cases.append('%d%s%d%s%d%s%d'%(a,o1,b,o2,c,o3,d))
cases.append('(%d%s%d)%s%d%s%d'%(a,o1,b,o2,c,o3,d))
cases.append('%d%s%d%s(%d%s%d)'%(a,o1,b,o2,c,o3,d))
cases.append('%d%s(%d%s%d)%s%d'%(a,o1,b,o2,c,o3,d))
cases.append('(%d%s%d)%s(%d%s%d)'%(a,o1,b,o2,c,o3,d))
cases.append('(%d%s%d%s%d)%s%d'%(a,o1,b,o2,c,o3,d))
cases.append('((%d%s%d)%s%d)%s%d'%(a,o1,b,o2,c,o3,d))
cases.append('(%d%s(%d%s%d))%s%d'%(a,o1,b,o2,c,o3,d))
cases.append('%d%s(%d%s%d%s%d)'%(a,o1,b,o2,c,o3,d))
cases.append('%d%s((%d%s%d)%s%d)'%(a,o1,b,o2,c,o3,d))
cases.append('%d%s(%d%s(%d%s%d))'%(a,o1,b,o2,c,o3,d))
for expression in cases:
try: # 捕获表达式中分母为0的异常
if eval(expression) == 24:
print('答案:%s = 24'%expression)
return
except:
pass
print('无解!')
>>> game24(5,5,5,1)
答案:5*(5-1/5) = 24
>>> game24(1,3,4,6)
答案:6/(1-3/4) = 24
>>> game24(10,10,4,4)
答案:(10*10-4)/4 = 24
>>> game24(7,7,3,3)
答案:7*(3/7+3) = 24
>>> game24(1,5,7,10)
答案:(1+7/5)*10 = 24
>>> game24(15,25,37,80)
无解!
3.9 背包问题
p = [
[0, 1, 3, 5, 7, 9],
[0, 1, 1, 3, 3, 7],
[0, 3, 4, 5, 6, 7]
]
参考答案(5分)
找出所有可能的装备分配方案
计算每一个方案的攻击值
选择攻击值最大的分配方案
>>> def bag(m, n, result, series=list()):
if n == 1:
for i in range(m+1):
result.append(series+[i])
#print(result[-1])
else:
for i in range(m+1):
bag(m-i, n-1, result, series+[i])
>>> result = list()
>>> bag(5, 3, result) # 将5件装备分配给3位英雄,共有56种分配方案
>>> p = [
[0,1,3,5,7,9],
[0,1,1,3,3,7],
[0,3,4,5,6,7]
]
>>> v = list()
>>> for item in result: # 计算每一种方案的攻击值
v.append(p[0][item[0]] + p[1][item[1]] + p[2][item[2]])
>>> max(v) # 最大攻击值是10
10
>>> result[v.index(max(v))] # 最佳分配方案
[4, 0, 1] # 第1位英雄持有4件装备,第2位英雄没有装备,第3位英雄持有1件装备。
3.10 空间直线相交问题
参考答案(5分)
计算向量ab和向量cd的叉积,得到一个新的向量orth
若向量orth的元素全部为零,则两直线平行,否则向量orth必定同时垂直于向量ab和向量cd
直线相交,则向量ac和向量orth的点积为零,否则直线必定不相交
>>> import numpy as np
>>> def is_orthogonal(a, b, c, d):
ab = np.array(a) - np.array(b)
cd = np.array(c) - np.array(d)
ac = np.array(a) - np.array(c)
orth = np.cross(ab,cd)
return orth.any() and np.dot(orth, ac) == 0
>>> a,b,c,d = (0,0,0),(1,0,0),(0,0,0),(0,1,0)
>>> is_orthogonal(a, b, c, d)
True
>>> a,b,c,d = (0,0,0),(1,0,0),(0,0,1),(0,1,1)
>>> is_orthogonal(a, b, c, d)
False
扫码回复:2021
获取最新学习资源
长按扫码关注,一起学Python 学习更多: 整理了我开始分享学习笔记到现在超过250篇优质文章,涵盖数据分析、爬虫、机器学习等方面,别再说不知道该从哪开始,实战哪里找了
“在看”和“点赞”是对文章最好的支持