蓝桥杯python组————笔记整理
Posted .214-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯python组————笔记整理相关的知识,希望对你有一定的参考价值。
现状:分母一枚明年争取做分子;
目的:因为刚接触python也没学几天整个思路就很混乱想整理一下笔记,顺便学下咋写博客,也能当个免费笔记本。
***内容可能有很多错误,等我升级打怪发现了再改吧qvq***
目录
3.再哪里不懂输哪里,至于因为是英文嘛,就只能自求多福了<_<
一、常用的一些emm(不知道咋形容这一堆...)
1.常用输入格式
- n=int(input ( )) # 输入一个整数
- a,b=map(int , input().split()) # 输入多个整数,输入时格式:整数与整数之间有空格
- a=[[0 for i in range(n+1) for j in range(m+1)]] # 建立一个空二维列表 a[m][n]
- a=list(map(int,input().split())) # 将输入的整数存入转化为列表格式
- input() # 输入的所有数据都为字符串类型
2.常用函数
1).十进制转化为二、八、十六
- bin() #十转二 bin(24)——>'0b11000'
- oct() #十转八 oct(24)——>'0o30'
- hex() #十转十六 hex(24)——>'0x18'
2).判断字符串以什么开头,结尾
- startswith()
- endswith()
3).字符串全变为大(小)写
- upper() #变为大写
- lower() #变为小写
4).列表常用函数
- len(list) #可以计算列表和字符串的长度
- max(list) #返回列表的最大值
- min(list) #返回列表的最小值
- list(seq) #将元组转换为列表
- append(obj) #在尾部添加(一次性添加单个)
- count(obj) #统计某元素出现的次数
- extend(obj) #在尾部一次性添加多个
- pop(index) #默认移除最后一个元素(按下标删除),并返回移除的元素值
- remove(obj) #按元素删除
- reverse() #反向输出列表
- sort() #排序:默认升序,改变原数列
- sorted() #临时排序,再次输出时原数列不变
......有那么亿点点晕了
5).数据类型转换
- chr(x) #编码转换为相应字符
- ord(x) #字符转换为相应编码
经常和ASCII结合,或者大小ABCD之类的
6).与集合相关的一些知识点
- 创建空集合:set()
- set.add(x) #添加元素
- 集合中没有重复元素 #(和数学结合一下下,梦回俺的青春岁月,就高一时候,数学一开始学的那个集合,集合的特性之一)
可以利用没有重复元素这点,储存一些不能重复出现的数据
3.常用模块
1).datetime 模块
下面只是列举了一些常用的,详细的可以参考这位大佬的!:https://blog.csdn.net/u011250186/article/details/103972471
import datetime ##引用模块前一定要先导入
#a= datetime.date(年,月,日)
a= datetime.date(2002, 6, 7)
b= datetime.date(2022, 4, 8)
# print(b-a) ————> datetime.timedelta(days=7245)
# 若要得到整型
print(a.__sub__(b).days) # a-b
print(b.__sub__(a).days) # b-a
print(a.__rsub__(b).days) #b-a
print(a.day) #输出日期
print(a.month) #输出月份
print(a.year) #输出年份
print(a.weekday()) #输出星期几 **输出范围为(0-6)相对应(星期一 - 星期天)
print(a.isoweekday()) #也是输出星期几 **输出范围为(1-7)相对应(星期一 - 星期天)
tmp = datetime.timedelta(days=1) #时间间隔
2)itertools模块
permutations():全排列
from itertools import *
for i in permutations(range(n)): #将0到n-1这n个数字排序的所有情况都罗列出来
print(i)
combinations():求取组合数
from itertools import *
n=0
for i in combinations([i for i in range(5)], 2): # n:列表中两个数组合的次数
n+=1
print(i)
print(n)
"""以下是输出内容
(0, 1)
(0, 2)
(0, 3)
(0, 4)
(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)
10
"""
二、使用help()找模块
1.输入help()
2.输入需要查找的模块
举个栗子:
往下翻翻就能知道查找内容类的关系:
3.再哪里不懂输哪里,至于因为是英文嘛,就只能自求多福了<_<
三.常见的算法(python)
代码源于大佬:
https://www.bilibili.com/video/BV1uA411N7c5?spm_id_from=444.41.header_right.fav_list.click
1.二分查找(折半查找)
def binary_search(li,val): # li:列表 val:查询值
left=0 # left:查询范围最左边的下标
right=len(li)-1 # right:查询范围最右边的下标
while left<=right: # 必要条件:left<=right
mid=(left+right)//2
if li[mid] == val:
return mid
elif li[mid]> val: #查询值val 在 li[mid]值 的左边时,查询范围重新划分(li[left],li[mid-1])
right = mid-1
else:
left =mid+1
else:
return None
真题运用实例:http://lx.lanqiao.cn/problem.page?gpid=T2912
2.冒泡排序
(砸门就是说,上上链接视频的ppt真的是好厉害啊)
**冒泡排序大体上说就是:相邻两数比较大小然后换位,一直到数列有序。
import random
def bubble_sort(li):
for i in range(len(li)-1): #第i趟(为什么-1:排序完倒数第二个数时,剩下的最后一个数就不需要再排一趟)
for j in range(len(li)-i-1): #j:是相邻两数比较的前一个数的下标,
#排序范围为(len(li)-1)其中每走完1趟,排序的范围就少1一个数,走i趟排序范围就少i个数(len(li)-1-i)
if li[j]>li[j+1]:
li[j],li[j+1]=li[j+1],li[j] #利用元组性质互换值
3.冒泡排序(升级版)
加了个判断,判断序列是否发生交换,时间复杂度减小了
import random
def bubble_sort(li):
exchange=False
for i in range(len(li)-1):
exchange=False
for j in range(len(li)-i-1):
if li[j]>li[j+1]:
li[j],li[j+1]=li[j+1],li[j]
exchange=True
print(li)
if not exchange:
return
4.选择排序
思路:将列表中没有排序的第一个数作为交换位,每次遍历完一趟让后面的最小值和它进行交换。
def select_sort(li):
for i in range(len(li)-1): #i是第几趟,为什么-1?和冒泡排序类似
min_loc=i #假定最小值下标为i
for j in range(i,len(li)): #j:从哪到哪。第0趟:从0到最后;第1趟:从1到最后(其中有序区在开头和冒泡排序相反)
if li[j]<li[min_loc]:
min_loc=j
li[i],li[min_loc]=li[min_loc],li[i] #找到了最小值,让无序区第一个值和最小值交换
print(li)
*选择排序和冒泡排序的不同
- 一趟交换的次数不同:选择排序一趟只交换一次;冒泡排序一趟交换多次
- 有序区和无序区的位置不一样:选择排序的有序区在列表前端;冒泡排序的有序区在列表尾端。
5.欧几里得算法(求取最大公约数,以及最小公倍数)
#gcd(a,b):求a,b之间最大约数
import math
def gcd(a,b):
a=math.gcd(a,b)
return a
#利用最大约数求取最小倍数
import math
def gongbeishu(a,b):
x=a*b//math.gcd(a,b) #a*b一定是两数的倍数,再除以两个数共有的最大约数,剩下就是最小倍数啦
return x
6.!!插入排序
我的理解:
场景:武林大赛
事件:全武林高手相聚一堂,先按照上一届的武林排名依次坐在位置上,上一届的武林第一我们就叫他小琦吧!是小琦!!!然后顺位第二(发起比武者)向小琦(第一位:接受比武)发起比武,若第二位赢了小琦,则小琦就暂时排名第二(赢了的条件就是对应的值小的),然后顺位第三位(下一个发起比武者)和刚刚暂时已经排好序的第二名(接受比武者),第一名(接受比武者)依次比试切磋(若连暂时第二位都没打过,就不用和第一位打了,就排在第二位的后面,也就是暂时排名第三位)由此类推。
def insert_sort(li):
for i in range(1,len(li)): #为什么从1开始?因为发起比武的人从第二名开始
tmp=li[i] #发起比武的人对应的值
j=i-1 #接受比武的人的位置下标
while j>=0 and li[j]>tmp: #若接受比武的人在这次比试范围内,且接受比武者的值大于发起比武的值,则接受比武者输了,排在发起比武者后
li[j+1]=li[j] #对应排名位置下标后移
j-=1
li[j+1]=tmp
print(li)
7.动态分析算法(暂无)
(*学的时间太短了,还没来得及看,先挖个坑以后慢慢填*)
**比赛时如何查看自己代码运行的时间?
import time
t=time.time()
<填写相关题的代码>
print(time.time()-t) #可输出自己代码的运行的时间
#注意在最后提交的过程中记得删去哦!!!
四.根据往年真题总结的内容(模板)
参考代码指路,小蓝大佬主页:https://blog.csdn.net/m0_55148406?type=blog
1.第十一届蓝桥杯省赛真题
代码参考还是来源于小蓝:蓝桥杯python组十一届省赛真题+解析+代码(通俗易懂版)_小蓝刷题的博客-CSDN博客_蓝桥杯python省赛历年真题
省赛题目:https://www.lanqiao.cn/courses/2786/learning/?id=88912
1).门牌制作
问题其终极目标只有一个,那就是!!!
——1到2020(包括2020)一共有几个数字2
关键:将1到2020的整型数转化为字符型再利用count()来统计含有2的个数
关键代码:str(i).count('2')
该题和美丽的数字2类似,但是美丽的数字2的问题和它不一样(因为粗心理解错了它的题目,自己打出来的代码和答案不一样郁闷了贼久,所以一定一定要细心细心再细心)
要求的是:1到2020的整数中含有2 的个数
关键代码:if str(i).count("2")>0: #判断有没有2,有就进入if内
2).寻找2020
这个题有个文件读取的考点!!!
lines=[] with open('2020.txt','r') as f: #和代码保存在同文件下 for line in f.readlines(): lines = line.strip('\\n') lines.append(line) result=0
其次矩阵的话,就很好遍历出列表的每个数(**因为是矩阵,所以其行和列相等**)采用两层for循环
for i in range(len(lines)): for j in range(len(lines)-3): #为什么减3?因为下一排j要多加3,为了保证列数和行数相等 if lines[i][j] == '2' and lines[i][j+1] == '0' and lines[i][j+2]== '2' and lines[i][j+3] == '0': result +=1
3).跑步锻炼
这个题要写代码的话,重点就是调用datetime模块,然后再累加计算
若要计算日期差值的话可以用电脑的计算器(比赛也可以用哦!!)
方法: win+r (打开运行窗口)
然后输入calc (计算器就自动跳出来了)
点击左上角的三根横线,出现下面的界面,再点击日期计算(还能进制转换哦!!!)
以上是关于蓝桥杯python组————笔记整理的主要内容,如果未能解决你的问题,请参考以下文章
2020年软件类第十一届蓝桥杯 省赛 python组(人生苦短,我用python)
2020年第十一届蓝桥杯 - 省赛 - Python大学组 - D.蛇形填数
2020年第十一届蓝桥杯 - 国赛 - Python大学组 - H.答疑