【蓝桥杯】—— Python组比赛技巧
蓝桥杯是大学生IT学科赛事,由工业和信息化部人才交流中心主办,所以对于大学生还说还是非常值得去参加的,2020年第十一届蓝桥杯新增了大学Python组,不分组别,第一届没有历届的真题,但是蓝桥杯作为一个算法竞赛,没有真题也影响不大,难度借鉴Java组或者C/C++组就可以了,因为看上了Python是第一届,而且Python的语法简单,内置了非常丰富的函数,特别是对字符串的操作,正则表达式等,用起来就一句话,人生苦短,我用Python。
运气的加成,笔者有幸进入了国赛,国赛前这段时间好好整理了一下本人参加比赛的一些技巧,正是本文章的由来,若有出错的地方,请各位高手不吝赐教。
一、Python最常用的内置函数
内置函数就是不需要导包就可以直接使用的函数
数学函数
abs() 函数:取绝对值
print(abs(-10))
10
divmod() 函数 :同时取商和余数
print(divmod(7,2))
(3, 1)
sum() 函数 :求和计算
print(sum([1,2,3]))
6
round() 函数: 四舍五入
print(round(5.1))
print(round(5.5))
5
6
pow() 函数 :计算任意N次方值
print(pow(2,3))
#也可以使用**
print(2**3)
8
8
min() 函数 :获取最小值
print(min(9,5,2,7))
2
max() 函数 :获取最大值
print(max(9,5,2,7))
9
数据转换函数
hex() 函数: 十进制转换成十六进制
print(hex(100))
0x64
oct() 函数: 十进制转换成八进制
print(oct(100))
0o144
bin() 函数 :十进制转换成二进制
print(bin(100))
0b1100100
bool() 函数 :将指定的参数转换成布尔类型
print(bool(1))
print(bool(0))
True
False
ord() 函数 :获取单个字符的ASCII数值
print(ord('A'))
65
float() 函数 :转换成浮点数
print(float(10))
10.0
chr() 函数: 转换一个整数并返回所对应的字符
print(chr(65))
A
list() 函数: 将可迭代对象转换为列表
print(list(range(1,10)))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
对象创建函数
open()函数:打开文件并返回文件对象
f1 = open('E:\Hello.txt','r')
print(f1.readline())
Hello Python
range()函数:创建一个可迭代对象,内容是指定范围内的连续整数
for i in range(5):
print(i)
0
1
2
3
4
set()函数:创建一个无序不重复元素集合
set([1,2,1,1,3,4,4,6,5])
{1, 2, 3, 4, 5, 6}
迭代器操作函数
all() 函数: 判断指定序列中的所有元素是否都为 True,则返回 True,如果有一个为 False,则返回 False。
a = [1,2,0]
all(a)
False
any()函数: 判断指定序列中的所有元素是否都为 False,则返回 False,如果有一个为 True,则返回 True。
a = [1,0,0]
any(a)
True
sorted() 函数: 对可迭代对象进行排序
a = [3,1,4,2]
sorted(a)
[1, 2, 3, 4]
map()函数: 通过自定义函数实现对序列的元素映射操作并返回操作后的结果
list(map(int,['1','2','3']))
[1, 2, 3]
基本常用函数
format()函数: 格式化数据
"{} {}".format("hello", "world")
print("{:.2f}".format(3.1415926));
'hello world'
3.14
input()函数: 接受用户输入并返回所输入的 string 类型数据
s = input() #输入abc回车
print(s)
abc
len()函数: 返回一个对象的元素或项目个数
len([1,2,3,4])
4
二、python中字符串操作
返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数
string.count(str, beg=0, end=len(string))
以 encoding 指定的编码格式编码 string,如果出错默认报一个ValueError 的异常,除非 errors 指定的是’ignore’或者’replace’
string.endswith(obj, beg=0, end=len(string))
检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1
string.find(str, beg=0, end=len(string))
跟find()方法一样,只不过如果str不在 string中会报一个异常.
string.index(str, beg=0, end=len(string))
以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
string.join(seq)
在 string 上执行 lstrip()和 rstrip()
string.strip([obj])
转换 string 中的小写字母为大写
string.upper()
转换 string 中所有大写字符为小写.
string.lower()
翻转 string 中的大小写
string.swapcase()
怎样将以下列表转化为整数?
a=[1, 3, 5]
b=['4', '5', '6']
r1 = int("".join(map(str, a)))
r2 = int("".join(map(str, b)))
123
456
三、python中math的使用
要使用math函数必须先导入math包,这里列举几个做题中常用的。
import math
向上取整
print(math.ceil(3.1))
4
向下取整
print(math.floor(3.1))
3
乘方 开方
print(math.pow(10,3))
print(math.pow(27,1/3))
1000.0
1.0
四、正则表达式的基本使用
Python的正则表达式(Regular Expression )的模块是 ‘re’,它能帮你非常方便的检查一个字符串是否与某种模式匹配,比如你要在一个字符串s=’Regular 123 Expression’ 中查找‘123’、‘456’,只要这样写:
import re
s = 'Regular 123 Expression 456'
re.findall(r'\d+',s)
['123', '456']
是不是感觉自己写代码的技术又上升了一个档次,这里用到的函数 ”findall(rule , target [,flag] )” 是正则里面最常用的函数之一,作用就是在目标字符串target 中查找符合规则rule 的字符串,后面还可以跟一个规则选项flag用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。返回结果结果是一个列表,中间存放的是符合规则的字符串。如果没有符合规则的字符串被找到,就返回一个空列表。
上面的参数 r’\d+’ 很多同学可能就有疑惑了,’\d+'是一个字符串相信大家都看得出来,那字符串前面加个r是什么意思呢?其实在正则表达式的字符串前面加上r表示这个是一个raw字符串,只以正则表达式的元字符进行解析,不用理会ASCII的特殊字符。
比如,特殊符号“\b”在ASCII 字符中代表退格键,但同时“\b”也是一个正则表达式的特殊符号,代表“匹配一个单词边界”。
为了让re编译器把两个字符“\b”当成你想要表达的字符串,而不是一个退格键,你需要用另一个反斜线对它进行转义,即可以这样写:“\b”。
但这样做会把问题复杂化,特别是当你的正则表达式字符串里有很多特殊字符时,就更容易令人困惑了。
看到这里,相信大家都看懂了吧。
在比赛中使用以下正则符基本满足大部分的情况了:
^:匹配字符串开头
" * " 匹配前面的子表达式零次或多次
" + " 匹配前面的子表达式一次或多次
" ? " 匹配前面的子表达式零次或一次
" [abc]" :方括号表示字符集合,例子表示一个字符串有一个 "a" 或 "b" 或 "c" 等价于 [z|b|c]
" [a-z]": 表示一个字符串中存在一个 a 和 z 之间的所有字母
" [^a-z]" :表示一个字符串中不应该出现 a 到 z 之间的任意一个字母
" [0-9]": 表示一个字符串中存在一个 0 和 9 之间的所有数字
" \d " 匹配一个数字字符,等价[0-9]
" \D " 匹配一个非数字字符,等价[^0-9]
" \w" 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”
" \W" 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”
五、文件操作
蓝桥杯比赛中经常出现需要输入多行多列数据的题目,如果手动一个个输入也可以,就是太浪费时间,如果利用好文件操作的方法,做题就会得心应手。
例如:hello.txt文件含30 行 50 列字符,怎样把它读到列表里?
最基本的文件操作方式
fp = open('E:\hello.txt','r')
res = []
s = fp.readlines()
for i in s:
res.append(i.strip('\n')) #使用strip()去掉换行符,如果不去的话会把‘\n’也读进来
fp.close() #记得要关闭连接,养成良好习惯
print(res[:])
输出结果:
利用Python自身的字符串操作优势,两行搞定,推荐此方法。
fp = open('E:\hello.txt','r')
res = [s.strip('\n') for s in fp.readlines()]
fp.close()
print(res[:])
输出结果: