为蓝桥杯而战!

前序

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)

截取自“蓝桥杯”练习系统(http://lx.lanqiao.cn/problem.page?gpid=T778)

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和%这两种方法保留的小数的位数只能是数字而不能是变量,所以最后用了字符串拼接的方法做这道题。

这道题虽然很小,但我复习了很多格式化输出的方法,都是一些会日久易忘的知识,记录一下还是很有必要的。

未完待续

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值