蓝桥杯python组————笔记整理

Posted .214-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯python组————笔记整理相关的知识,希望对你有一定的参考价值。

现状:分母一枚明年争取做分子;

目的:因为刚接触python也没学几天整个思路就很混乱想整理一下笔记,顺便学下咋写博客,也能当个免费笔记本。

***内容可能有很多错误,等我升级打怪发现了再改吧qvq***


目录

一、常用的一些emm(不知道咋形容这一堆...)

1.常用输入格式

2.常用函数

1).十进制转化为二、八、十六

2).判断字符串以什么开头,结尾

3).字符串全变为大(小)写

4).列表常用函数

 5).数据类型转换

6).与集合相关的一些知识点

3.常用模块

1).datetime 模块

2)itertools模块

二、使用help()找模块

1.输入help()

2.输入需要查找的模块

3.再哪里不懂输哪里,至于因为是英文嘛,就只能自求多福了<_<

三.常见的算法(python)

1.二分查找(折半查找)

2.冒泡排序

3.冒泡排序(升级版)

4.选择排序

*选择排序和冒泡排序的不同

5.欧几里得算法(求取最大公约数,以及最小公倍数)

6.!!插入排序

7.动态分析算法(暂无)

**比赛时如何查看自己代码运行的时间?

四.根据往年真题总结的内容(模板)

1.第十一届蓝桥杯省赛真题

1).门牌制作

2).寻找2020


一、常用的一些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)
           

*选择排序和冒泡排序的不同

  1. 一趟交换的次数不同:选择排序一趟只交换一次;冒泡排序一趟交换多次
  2. 有序区和无序区的位置不一样:选择排序的有序区在列表前端;冒泡排序的有序区在列表尾端。

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组————笔记整理的主要内容,如果未能解决你的问题,请参考以下文章

第十一届蓝桥杯python组试题解答

2020年软件类第十一届蓝桥杯 省赛 python组(人生苦短,我用python)

2020年第十一届蓝桥杯 - 省赛 - Python大学组 - D.蛇形填数

2020年第十一届蓝桥杯 - 国赛 - Python大学组 - H.答疑

蓝桥杯选拔赛真题02python奇偶数 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

蓝桥杯省赛真题01python输出偶数 青少年组蓝桥杯python编程省赛真题解析