Python刷题提升解析:第一季

本文所述的题目来自于题目出处,作者为:Python程序员

本文只针对题目进行答案解析,题目的著作权由原作者享有。

第一题:

从键盘中输入两个数a,b,求他们的四则运算结果,要求保留两位小数。

题目分析:该题目要求我们需要掌握input函数的用法,以及四则运算的判定实施,并且掌握对浮点数的打印显式规则。由于该题目在描述上还是比较模糊,因此我选择了由用户直接键入四则运算表达式,然后程序处理后给出结果,这样不仅练习了题目要求的基本知识,也锻炼了特征信息提取的能力。

operator = ['/','*','+','-']   #四则运算符匹配集
flag = 0

print('please input your math expression, this experssion only have two arithmetic numbers and one operator')
s = input()
a = ''
b = ''
oper = ''

for i in s:
	if not flag:
		if i not in operator:
			a += i
		else:
			oper += i
			flag = 1
	else:
		b += i

aa = float(a)
bb = float(b)
if oper == '/':
	result = aa/bb
elif oper == '*':
	result = aa*bb
elif oper == '+':
	result = aa+bb
else:
	result = aa-bb

print("%.2f"%result)

第二题:

求表达式

的运算结果

题目解析:主要要求我们掌握基本的运算符的使用,即‘+’、‘-’、‘*’、‘/’,以及求余数(模)的‘%’,求幂的‘**’或函数power(x, y)。

result_1 = (2**5 + 6 - 4*7)/6
print(str(result_1))
result_2 = ((2 + 4**3)*(15%7))/9
print(str(result_2))

第三题:

使用math库提供的函数(具体自己去查阅哦~)

将键盘输入的角度值转换为弧度值

将键盘输入的弧度值转换为角度值

题目解析:该题目主要考察了我们对于math模块的了解程度,该模块为Python的内置标准模块。大家可以参考:

           math模块详解 或math模块官方文档


from math import degrees, radians
print('please input a degree or a radians.\n if you input a radians,please add rd in the end ')
key = input()
if 'rd' in key:
	key = key.strip('rd')
	print(str(degrees(float(key))) + 'degree')
else:
	print(str(radians(float(key))) + 'rd')

第四题:

假设你在复习考研,一个月假设有30天,第一天你的刷题能力为1000

当你认真复习一天时,该天的刷题能力会比前一天提高5%

当你吃鸡或者王者荣耀玩一天时,该天的刷题能力会比前一天降低10%

如果你每天认真复习持续一个月,和你每天吃鸡或者王者荣耀持续一个月

一个月后两种状态的能力值相差多少

保留小数点后2位

题目解析:该题目出的不是很好,考察内容与第一题与第二题有些重复,因此我选择了冗杂的程序实现,简要展示了以下while的使用。

a = 1000.0
b = 1000.0
i = 30
while i>0:
	a *= 1.05
	b *= 0.95
	i -= 1
else:
	print("The difference is ",'%.2f'%(a-b))

第五题:

从键盘输入要求和的浮点数个数n(n不超过10)

然后依次从键盘输入n个浮点数

使用列表存储这些数

使用math中的fsum对这些浮点数求和

题目解析:题目主要考察了我们对于用户输入的掌控能力,当用户输入错误时提示用户重新输入,知道用户输入的值符合要求为止。此外,它考察了我们对于列表的掌握能力,学会如何扩展一个空列表。

import math
s_list = []
n = int(input("Please input your number's sum amount:"))
while n >= 10 :       #当用户输入一个不符合要求的值,在此进行判断,提示用户输入合法值
	n = int(input("This input number should lower than 10! Please input again:"))
for i in range(1,n+1):
	s_list.append(float(input("Please input your " + str(i) +" float number:"))) #使用append函数在列表末尾扩展列表

a = math.fsum(s_list)

print("The sum of number is","%.2f"%a)
print(s_list)

第六题:

回文数指的是一个自然数反向排列后和原数相等,例如12321

要求从键盘输入一个多位的数字n

判断该数字是否为回文数

若是,返回True,反之返回False

要求代码尽可能简短

题目解析:我们首先要正确理解回文的概念,其次要思考用户输入的数字应当如何比较。比如一个字符串n_list其正常的索引是从前往后,但是如果我们携程n_list[::-1]形式它就是反向索引。对于一个列表或是字符串,::后加复数表示反向索引,复数的绝对值表示索引的步距,当其绝对值为1时,自然相当于反向索引。而两个字符串或列表使用==进行比较时,是按照其规定的索引逐元素的比较,因此引用这个特性,我们可以很简单的实现题目的要求。

n_list = input("Please input a int number!\n")
if n_list == n_list[::-1]:
	print("True")
else:
	print("False") 

第七题:

使用python的格式化输出方式输出如下图形

代码力求简洁


Python刷题提升解析:第一季_第1张图片
题目解析:Python的格式化输出为format函数,其使用比较复杂,具体用法可以参考 format函数使用教程。通过格式化字符串函数,我们可以轻松地实现布局操作,免去了使用循环函数进行拼图的困扰。由于本题目的解决代码比较长,因此在下方我会针对代码的各段进行解析。
print('\n'.join(map(lambda x: '{0:{1}<9}{0}{0:{1}>9}'.format(*('|','') if x%5 else ('+','-')),range(11))))
代码解析:
{0:{1}<9}'{0}{0:{1}>9}

format格式化的映射字符,其中{0}代表foramt()内的第1个参数,而{1}自然便是代表的是其中的第二个参数。<代表对齐格式为左对齐,>为右对齐,它们后面的数字9表示这个映射区间应当有9个字符,不足的的由':'(冒号)后面的映射参量{1}补齐。以填充字符为('+', '-')为例,结果为:+--------+--------+。如果冒号后无数字,填充以空格代替;如果冒号后为不加花括号的数字,那使用该数字本身填充。

format(*('|','') if x%5 else ('+','-'))

该段中时依据x的值为format选择参数值,如果X可以整除5,就以('+', '-')为参数,如果不能,则以('|', ' ')为参数。

map(lambda x: '{0:{1}<9}{0}{0:{1}>9}'.format(*('|','') if x%5 else ('+','-')),range(11))

当代码扩展到这里,由map映射类型我们知道,该程序使用x的值域创建了11行标准格式字符串。

print('\n'.join(map(lambda x: '{0:{1}<9}{0}{0:{1}>9}'.format(*('|','') if x%5 else ('+','-')),range(11))))

这时,join字符串连接函数为map的每行元素前都增加了一个换行符,然后print函数将map整体打印出来,这就实现了题目要求的操作。

第八题:

使用random中的randint函数随机生成一个1~100之间的预设整数

让用户键盘输入所猜的数,如果大于预设的数,屏幕显示“太大了,请重新输入”

如果小于预设的数,屏幕显示“太小了,请重新输入”

如此循环,直到猜中,显示“恭喜你,猜中了!共猜了N次”N为用户猜测次数

题目解析:randint(n, m)函数时生成一个[n, m]闭区间范围内一个随机整数值。然后提示用户输入,并将用户输入值与随机生成的值相比较,给出用户提示,用户输入的值在进行比较时进行计数,可以有效记录用户的输入次数,从而完成题目要求的反馈。

import random
g = 0
n = 0
aim = random.randint(1,100)
print(str(aim)) #only to convenient verification

while  g != aim:
	
	g = int(input("Please input a new number:"))
	if g > aim:
		print("Your input is bigger than target!")
	elif g < aim:
		print("Your input is lower than target!")

	n += 1

print("Perfect! You use ","%d"%n," times to achieve this target!")

第九题:

使用random中的randint函数随机生成一个1~100之间的预设整数

要求输入的是数值型(例如int或者float),如果不是整型(int)

屏幕提示“输入的数值必须为整数”

每次猜数太大或者太小时,根据已经猜过的数,给出数据范围。

如此循环,直到猜中,显示“恭喜你,猜中了!共猜了N次”N为用户有效猜测次数

题目解析:第九题是在第八题的基础上进行了拓展,实际上就是在比较前先判断数据类型,之后在比较时由语言模糊提示变为不断修改提示的区间。判断浮点数和整数我猜用的方法是看用户输入的数字中是否包含小数点,并依次为依据进行交互操作。(注:Python中键盘键入的数据为字符串,需要转化为数值才能使用其代表的数字)

import random
g = 0
n = 0
high = 100
lower = 1
aim = random.randint(1,100)
print(str(aim)) #only to convenient verification 

while  g != aim:
	
	g_str = input("Please input a int number:")
	
	if '.' in g_str:
		print("Please input a int number, not a float")
	else:
		g =int(g_str)
		if g > aim:
			if g < high:
				high = g
			print("Your input a number in [%d, %d]!"%(lower, high))
		elif g < aim:
			if g>lower:
				lower = g
			print("Your input a number in [%d, %d]!"%(lower, high))

	n += 1

print("Perfect! You use ","%d"%n," times to achieve this target!")

第十题:

使用匿名函数对1~1000求和

代码力求简单

题目解析:题目要求我们使用关键字lambda构造匿名函数求解求和问题,这个操作确实是我迷茫,我根据别人的回答找到了这个位于functools模块内的函数reduce,发现在官方文档里确实使用该函数做了一个集合内所有数求和的举例。functools模块官方文档

from functools import reduce
print(reduce(lambda x,y:x+y,range(1001)))

你可能感兴趣的:(Python刷题提升解析)