前序
9月份的蓝桥杯即将到来,也该着手准备一下了,报的Python组,许多零散的知识点都忘记了,复习并记录一下,加深影响,争取个好成绩。
零散知识点
多组输入
有时候题目需要的数据是一次性输入的,尽管可以输入到列表、元组等数据结构中,但很麻烦,input()函数自带一个split()方法,可以实现多组输入
num1, num2 = input().split()
split()是可以传入参数的
num1, num2 = input().split(',')
就可以在输入时以 ‘,’ 分开了。使用input()默认得到的是字符串,即str类型的数据,有时候想要int类型的咋整呢,就要这么办
num1, num2 = map(int, input().split())
map()函数的第一个参数是一个函数,第二个参数是一个或多个序列,返回一个迭代器。map()会将第一个参数作用到后一个参数上,上面栗子输入了两个数num1和num2,map()函数会将 “int” 这个函数分别作用到num1和num2这两个对象上的,使其类型由 str 变为 int 。
map()函数并不会改变原序列,生成的迭代器可以使用list()或tuple()转化为列表或元组进行输出。
def suqare(x):
return x ** 2
w = [1, 2, 3, 4, 5, 6]
q = map(suqare, w)
print(list(q)) # [1, 4, 9, 16, 25, 36]
print(w) # [1, 2, 3, 4, 5, 6]
多维数组
多维数组可以使用列表套列表的形式实现,不过有个点需要注意一下,就是浅复制问题
list_two = [[0] * 3] * 3
print(list_two) #[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
list_two[1][1] = 3
print(list_two) #[[0, 3, 0], [0, 3, 0], [0, 3, 0]]
一般为了省事,我会使用乘法去扩展一个列表,不过如上代码,更改某一位置的值整个列表其余相应的位置都会跟着改变的,这就是因为使用乘法扩充列表只是浅拷贝,深拷贝的话看下面
list_three = [[0 for i in range(3)] for j in range(3)]
print(list_three) #[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
list_three[1][2] = 3
print(list_three) #[[0, 0, 0], [0, 0, 3], [0, 0, 0]]
print("=================================")
list_one = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
print(list_one) #[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
list_one[0][2] = 3 #[[0, 0, 3], [0, 0, 0], [0, 0, 0]]
print(list_one)
蓝桥杯练习题
试题 算法提高 整商问题(ADV-377)
num1 = int(input("Please enter the dividend:"))
num2 = int(input("Please enter the divisor:"))
while num2 == 0:
print("Error: divisor can not be zero! Please enter a new divisor:")
num2 = int(input())
print(int(num1 / num2))
上面是我的代码,没有通过,完全错误,可能是格式有问题???看出问题的大神请指教一下。
试题 算法训练 猴子吃包子(ALGO-246)
问题描述
从前,有一只吃包子很厉害的猴子,它可以吃无数个包子,但是,它吃不同的包子速度也不同;肉包每秒钟吃x个;韭菜包每秒钟吃y个;没有馅的包子每秒钟吃z个;现在有x1个肉包,y1个韭菜包,z1个没有馅的包子;问:猴子吃完这些包子要多久?结果保留p位小数。
输入格式
输入1行,包含7个整数,分别表示吃不同包子的速度和不同包子的个数和保留的位数。
输出格式
输出一行,包含1个实数,表示吃完所有包子的时间。
样例输入
4 3 2 20 30 15 2
样例输出
22.50
数据规模和约定
0<x<100;0<y<100;0<z<100;0<x1<=1000000;0<y1<=10000000;0<z1<=10000000;0<p<=1000
num = input().split(' ')
a = [int(num[i]) for i in range(len(num))]
result = (a[3] / a[0] + a[4] / a[1] + a[5] / a[2])
temp = round(result, a[6])
if len(str(temp - round(temp))) - 2 < a[6]:
print(str(temp) + '0' * (a[6] - len(str(temp - round(temp))) + 2))
else:
print(temp)
上面是完全通过的代码,为什么要贴出这道看似平平无奇的题呢?这道题我复习了三种格式化输出的方法
format格式化输出:
内容 | 写法 | 输出 | 注释 |
---|---|---|---|
3.1415926 | {:.2f} | 3.14 | 保留两位小数 |
3.1415926 | {:+.2f} | +3.14 | 带符号保留两位小数 |
-2 | {:+.2f} | -1.00 | 带符号保留两位小数 |
5 | {:0>2d} | 05 | 数字补零 (填充左边, 宽度为2) |
5 | {:x<4d} | 5xxx | 数字补x (填充右边, 宽度为4) |
1000000 | {:,} | 1,000,000 | 以逗号分隔的数字格式 |
0.25 | {:.2%} | 25.00% | 百分比格式 |
1000000000 | {:.2e} | 1.00e+09 | 指数记法 |
13 | {:>10d} | 13 | 右对齐 (默认, 宽度为10) |
13 | {:<10d} | 13 | 左对齐 (宽度为10) |
13 | {:^10d} | 13 | 中间对齐 (宽度为10) |
11 | ‘{:b}’.format(11) ‘{:d}’.format(11) ‘{😮}’.format(11) ‘{:x}’.format(11) ‘{:#x}’.format(11) ‘{:#X}’.format(11) | 1011 11 13 b 0xb 0XB | 进制 |
表格参照的菜鸟教程,表情是一个 ‘:’ 和 ‘o’ 组合在一起合成了表情。
format会四舍五入
普通格式化输出:
print('%.2f' % 3.1415926) #3.14
print('%.6f' % 3.1415926) # 3.141593
会四舍五入
round()函数
print(round(3.1415926, 6)) # 3.141593
参数1是一个小数,参数2是保留的位数,会四舍五入
猴子吃包子这道题一开始想用上述方法进行格式化输出,但都不行,上述方法round()函数不会在右端自动补0,如
print('{:.6f}'.format(3.14)) # 3.140000
print('%.6f' % 3.14) # 3.140000
print(round(3.14, 6)) # 3.14
但这道题不能用,因为这道题要求保留的位数是人为输入的而不是程序中固定的,format和%这两种方法保留的小数的位数只能是数字而不能是变量,所以最后用了字符串拼接的方法做这道题。
这道题虽然很小,但我复习了很多格式化输出的方法,都是一些会日久易忘的知识,记录一下还是很有必要的。