1、输入输出
print输出函数
- print()用于打印输出,是最常见的一个函数
- 语法: print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
- 参数说明:
- objects:表示输出一个或者多个对象。输出多个对象需要用sep分隔;
- sep:输出多个对象时使用sep分隔,默认值是一个空格;
- end:输出结束以end结尾,默认值是换行符\n,也可以换成其他字符串;
- file:要写入的文件对象,默认为终端输出;
- flush:输出是否被缓存通常取决于file,但如果flush关键字参数为True,流会被强制刷新。
python
print('Helllo', sep=' + ', end=' ')
print('world', sep=' = ', end=' ')
print('你好!')
input输入函数
- 语法:input([prompt])
- 参数说明:
- prompt:输入信息
- 输入变量均为 str 字符串类型
- int() 可以转换成整数
python
a = input() # 输入整数123
print(type(a)) # a的类型为string,字符串类型
a = int(a) # 将a的值转换为int,整数类型
print(type(a)) # 输出a的类型为int,整型
a = input("input:") # 在输入时,提示进行输入
print(type(a)) # 输出a的类型
例题

输入为3 、 4 、5
参考代码
python
# 使用海伦公式计算三角形面积
# 导入数学依赖包
import math
a = int(input())
b = int(input())
c = int(input())
p = (a + b + c) / 2
s = math.sqrt(p * (p - a) * (p - b) * (p - c))
print(s)
2、常量、变量、运算符
常量与变量
- 常量:程序中使用的具体的数、字符。在运行过程中,值无法更改
- 变量:表示一个存储单元,其中存储的值可以修改
- 变量命名:
- 只能包含字母、数字、下划线
- 只能以字母、下划线开头
- 不能使用关键字作为变量名称
基础数据类型
- 整型:int
- 浮点型:float
- 字符串:str
- 布尔:bool
- 获取变量类型:type()
运算时,会推理变量的类型,不需要进行声明变量的类型。
在输出连接时,需要进行数据转换成字符串进行连接。
数据类型转换的规则
- int 转 float:直接转换
- float 转 int:舍弃小数(直接舍弃小数部分,不是四舍五入)
- int 转 bool:非0:True、0:False
- bool 转 int:False:0、True:1
- 转 str:直接转换
运算符
- 算数运算符:+、-、*、/、//(整除)、%(取余)、**(幂)
- 关系运算符:>、<、==、!=、>=、<=
- 赋值运算符:=、+=、-=、*=、/=、%=、//=、**=
- 逻辑运算符:and、or、not
- 成员运算符:in、not in
- 身份运算符:is、is not
3、if语句
if 语句
-
格式
*pythonif [表达式]: [代码块] -
含义
- 如果表达式的值为True(1)则成立,执行代码块
- 若表达式的值为False(0)则表达式不成立,不执行代码块
-
代码块需要缩进(python中没有"[ ]"、"{ }",代码块是通过缩进进行区分的)
-
表达式可以是一个单一的值或者变量,也可以是由运算符组成的复杂语句,形式不限,只要表达式最后能得到一个值就行。
if - else 语句
-
格式
*pythonif [表达式]: [代码块1] else: [代码块2] -
含义:
- 如果满足表达式,则执行代码块1,表达式不成立,执行代码块2
-
注意
- if 和 else 必须要对齐
例题

参考代码
python
# 输入一个整数a,如果a为偶数,输出yes,否则输出no
a = int(input())
if a%2==0:
print("yes")
else:
print("no")
其他例题
python
# 范围判断:读入一个数a,若这个数a大于1并且小于100,输出yes,否则输出no
a = int(input())
if a>1 and a<100:
print("yes")
else:
print("no")
python
# 比大小:读入a、b,如果a>b,则交换a、b的值
a = int(input())
b = int(input())
if a>b:
c = a
a = b
b = c
print(a, b)
python
# 比大小:读入a、b,如果a>b,则交换a、b的值
a = int(input())
b = int(input())
if a>b:
a, b = b, a
print(a, b)
python
# 行李收费问题:乘坐飞机时,当乘客行李小于等于20公斤时,按每公斤1.68元收费,大于20公斤时,每公斤按1.98元收费,编程计算收费(保留2位小数)
weight = float(input())
if weight <= 20:
sum = weight * 1.68
else:
sum = weight * 1.98
print(f"{sum:.2f}")
if - elif - else 语句
-
格式
*pythonif [表达式1]: [代码块1] elif [表达式2]: [代码块2] elif [表达式3]: [代码块3] ...[这里可以有很多的 elif 语句] else: [代码块n] -
含义
- 表达式1,成立,执行代码块1,否则判断表达式2是否成立,如果表达式2成立,执行代码块2,一次类推,所有表达式都不成立,执行else后的代码块n
例题

参考代码
python
# 求位数:输入一个整数x(0 --- 10000),输出x的数字的位数,若x为100,则为3位数,输出为3
x = int(input())
if x<10:
print(1)
elif x>=10 and x<100:
print(2)
elif x>=100 and x<1000:
print(3)
else:
print(4)
其他例题
python
# 星期几:根据键盘上的输入判断表示星期几,对应输出其英文名称
# 1 -> Monday
# 2 -> Tuesday
# 3 -> Wednesday
# 4 -> Thursday
# 5 -> Friday
# 6 -> Saturday
# 7 -> Sunday
# 其他 -> Input Error!
num = int(input())
if num == 1:
print("Monday")
elif num == 2:
print("Tuesday")
elif num == 3:
print("Wednesday")
elif num == 4:
print("Thursday")
elif num == 5:
print("Friday")
elif num == 6:
print("Saturday")
elif num == 7:
print("Sunday")
else:
print("Input Error!")
python
# 买钢笔:期末来临,班长小Q决定使用班费x元用于购买钢笔若干,已知商店有钢笔三种,单价为6元、5元、4元。小Q想买尽量多的钢笔,同时花光所有钱,帮小Q指定方案。输入整数x,输出三个整数,分别代码6元、5元、4元钢笔的数量
x = int(input())
# a、b、c分别代表6元、5元、4元钢笔的数量
a, b, c = 0, 0, 0
if x % 4 == 0:
c = x // 4 # //:整除
elif x % 4 == 1:
c = x // 4
c -= 1
b += 1
elif x % 4 == 2:
c = x // 4
c -= 1
a += 1
elif x % 4 == 3:
c = x // 4
c -= 2
a += 1
b += 1
print(a, b, c)
python
# 已知闰年的定义为:
# 年份能被4整除但是不能被100整除的是闰年
# 输入给定年份判断是不是闰年,年份范围为(1000 - 9999),若为闰年,输出yes,否则输出no
year = int(input())
if year % 4 == 0 and year % 100 != 0:
print("yes")
else:
print("no")
python
# 输入2023年的一个日期,输出为星期几
def day_of_week_2023(month, day):
# 2023年各月天数(非闰年)
days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if month<1 or month>12:
print("month error!")
if day<1 or day>days_in_month[month - 1]:
print("day error!")
total_days = sum(days_in_month[:month - 1]) + (day - 1)
weekdays = ["Monday", "Thusday", "Wednesday", "Tuesday", "Friday", "Saturday", "Sunday"]
return weekdays[total_days % 7]
m,d = map(int, input().split( ))
print(f"2023年{m}月{d}日是 {day_of_week_2023(m, d)}")
4、for 循环
range 函数
- range()函数用于生成一系列数字,用于循环结构的遍历
- 在python2中生成一个数字列表,python3中是一个可迭代对象(可遍历的)
- range(start, stop, step)
- 传参都是整数
- 从start开始(默认为0),到stop结束(不含stop),步长为step(默认为1)
- range(5) 等价于 range(0, 5) 等价于 range(0, 5, 1): 0,1,2, 3, 4
for 语句
-
格式:
*pythonfor <var> in <seq>: 代码块 -
参数含义
- <var>:循环变量,一般为i,j,k
- <seq>:序列或者可迭代对象,一般为range(xx)
python# 循环打印 0 - 4 for i in range(5): print(i)
例题

参考答案
python
# 输入一个整数n,输出1 - n之间的所有偶数
n = int(input())
for i in range(1,n+1):
if i % 2 == 0:
print(i)
其他例题
python
# 输入一个整数n,分别输出1 - n之间的奇数和、偶数和
n = int(input())
sum_1 = 0
sum_2 = 0
for i in range(1, n + 1):
if i % 2 == 0:
sum_2 += i
else:
sum_1 += i
print(f"奇数和为{sum_1},偶数和为{sum_2}")
5、while 循环
while 语句
-
格式
*pythonwhile 条件表达式: 代码块 -
条件表达式成立,执行代码块
-
含义:
- 条件表达式成立,执行代码块,表达式不成立,则结束。
例题
python
# s = 1 + 2 + ... + n,求 s > 1000 时,n 最小为多少?当s不超过1000时,需要进行累加
s , i = 0, 0
while s < 1000:
s += i
i += 1
print(i)

参考答案
python
# 辗转相除法求最大公约数
# 两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数
m = int(input())
n = int(input())
if n > m:
m, n = n, m
s = 1
i = 0
while s != 0:
s = m % n
m = n
n = s
print(m)
break 和 continue
- break 语句可以跳出 for 和 while 的循环体
- 直接结束循环
- continue 语句被用来跳出当前循环块中的剩余语句,执行下一轮循环
- 跳过本次循环,执行下次循环
6、循环嵌套
两种循环区别
- for循环:常用于已知循环次数的情况,或者遍历List、Dict等数据结构
- while循环:不知道循环次数,但是可以通过终止条件停止循环
- 在一定程度上,while循环和for循环可以互相转换
例题
-
从1遍历到99
-
for循环
*python# 从1遍历到99 # for 循环 i = 0 for i in range(1,100): print(i) -
while循环
*python# 从1遍历到99 # while 循环 i = 1 while i < 100: print(i) i += 1
-
-
从1 + 2 + 3 + ... ,一直加到超过1000为止:用while循环
-
for循环
*python# 从1 + 2 + 3 + ... ,一直加到超过1000为止:用while循环 # for 循环 res, i = 0, 1 for i in range(1000): if res < 1000: res += i else: break print(i) -
while循环
*python# 从1 + 2 + 3 + ... ,一直加到超过1000为止:用while循环 # while 循环 res, i = 0, 1 while res < 1000: res += i i += 1 print(i)
-
嵌套循环
- 当2个(甚至多个)循环结构相互嵌套时,位于外层的循环结构常简称外层循环或外循环,位于内层的循环结构常简称内层循环或内循环
- 先执行外循环,对于外循环的每一个值,执行内循环
- 嵌套循环中的break和continue
- break语句用于嵌套循环,作用是使程序跳出本层循环
- continue语句用于循环结构中,作用是跳出本次循环,执行下次循环
例题

参考答案
python
# 求s = 1! + 2! + 3! + ... +n!
n = int(input())
s = 0
for i in range(1, n + 1):
s1 = 1
for j in range(1, i+1):
s1 *= j
s += s1
print(s)

参考答案
python
# 一个炊事员上街采购,用500元买了90只鸡,其中母鸡15元,公鸡一只10元,小鸡一只5元,正好把钱花完,问母鸡、公鸡、小鸡各买了多少只?
count = 0
for x in range(91):
for y in range(91):
for z in range(91):
if x + y + z == 90 and 15*x + 10 *y + 5*z == 500:
print(f"母鸡买了{x}只,公鸡买了{y}只,小鸡买了{z}只,")
count += 1
print(f"共有{count}种购买方法")

参考答案
python
n = int(input())
for i in range(1, n + 1):
for j in range(1, i + 1):
print("*",end="")
print()

参考答案
python
# 水仙花数
# 输入三位数abc,abc = a*a*a + b*b*b + c*c*c,则abc为水仙花数
n = int(input())
a = n % 10
b = n // 10 % 10
c = n // 100
if a**3 + b**3+ c**3 == n:
print(f"{n}为水仙花数")
python
# 水仙花数
# 输入三位数abc,abc = a*a*a + b*b*b + c*c*c,则abc为水仙花数
for i in range(100, 1000):
a = i %10
b = i // 10 % 10
c = i // 100
if a**3 + b**3 + c**3 == i:
print(f"{i}为水仙花数")

参考答案
python
# 素数
# 输入L、R,输出L - R之间的所有素数
L = int(input())
R = int(input())
for i in range(L, R + 1):
flag = True
for j in range(2, i):
if i % j == 0:
flag = False
break
if flag and i != 1:
print(i)
7、基本数据结构
列表
-
列表(list)由一系列按照特定顺序排列的元素组成
-
\] 表示列表,逗号分隔元素: * \[element 1, element 2, element 3, ..., element n
-
element i 表示列表中的元素,个数没有限制,可以是任意数据
-
列表是有顺序的,访问任何元素需要通过"下标"进行访问
-
所谓的"下标"就是指元素在列表中从左到右为第几个,下标从0开始
-
下标只能从[-n, n-1],分别为[0, n-1](顺数第几个)、[-n, -1](倒数第几个)
-
列表中的每个元素都可以像其他的变量一样进行使用
- 赋值、加减乘除各种运算、打印等
-
添加元素
- 在末尾添加单个元素
- a.append(x):列表a末尾添加元素x
- 在末尾添加多个元素:
- a.expend(x);列表a末尾添加x,x为可迭代对象,包括列表、元组、字符串等,不可为单个数字
- 在中间插入元素:
- a.insert(idx, x):列表a在下标为idx位置插入元素x,原来下标大于等于idx的元素往右移动一个位置
- 在末尾添加单个元素
-
删除元素
- 利用del删除列表中的元素
- del a[idx]:删除列表中下标为idx的元素
- 利用pop删除列表中的元素
- a.pop(idx):删除列表a中下标为idx的元素
- a.pop():删除列表a中最后一个元素
- del 删除没有返回值,pop 删除返回的是删除的那个元素
- 利用del删除列表中的元素
-
根据值删除元素:
-
a.remove(x):删除列表a中值为x的第一个元素
-
如何删除列表中所有值为x的元素
- 利用循环结构 + remove
pythona = [1,2,3,4,5,6,7,8,5,5,4,3,2,2,1,5] x= 2 while x in a: a.remove(x) print("a = ", a)
-
-
查找元素
- a.count(x):计算x在a中出现的次数,如果未出现则为0,否则为出现次数
- a.index(x, start, stop):计算元素x在列表a下标[start, stop)中第一次出现的位置
- 要保证x必须为区间[start, stop)中存在,否则报错
- start,stop不赋值,默认为在整个列表中查找
- 只赋值start、stop默认为列表长度
-
求出列表长度
- len(a):求出列表a的长度

-
操作列表
- 利用for循环遍历列表
- enumerate(a, start = 0)
- 将列表a每个元素和对应的下标组合为一个带索引的序列,下标默认从0开始,遍历的时候同步遍历下标和值
- 创建数值列表
- 利用range函数 + list
-
列表操作符
- +:连接两个列表
- a*x:a是list,x是int,构成一个新列表,其内容为a复制x次
-
内置函数
- sum(a):求序列a的和
- max(a):求序列a中的最大值
- min(a):求序列a中的最小值
-
列表解析式
- 列表解析式:可以基于已有列表生成相关的新列表

pythonb = [int(x) for x in a] # 列表解析式,对于每一个x,执行int(x) -
切片
-
复制列表
- 列表的赋值不等于复制,列表的赋值只是"引用",此时相当于两个变量名代表同一个列表

元组
- 元组:与列表类似,由一系列按额定顺序排列的元素组成
- 用 () 创建,或用 tuple 创建
- 与 list 区别
- list是可修改的序列,而元组是不可修改的,即创建无法修改当前元组

8、字符串
字符串简介
- 字符串:一系列字符,用单引号或者双引号括起
- python不支持单字符类型,单个字符也被看作为字符串,许多用法与 list 一致:
- 访问字符串中的元素:使用方括号 + 下标(从0开始)
- 切片:s[start: end: stop],在字符串s下标为[start, end)中,步长为stop
- len(s):求字符串的长度
- +:字符串连接
- *:重复字符串
- in、not in:存在、不存在
- str(x):把x强制转换成字符串
- 转义字符



字符串常用方法
- 判断类方法
- 转换类
- 查找类
- 字符串和List
-
字符串转换成 list (字符串本身是不可修改的,但是转换成list后可以进行修改)
-
形式
*pythons = "Hello world!" # 字符串s t = list(s) # 将字符串s转换为list -
利用 split() 方法对字符串进行分隔(很重要)
- str.split(str="", num=string.count(str))
- str表示分隔符,默认为空字符,包括空格、换行、制表符等
- 按分隔符进行分隔
- num表示分割次数,如果设置了这个参数,则最多分割成num + 1个子字符串。默认-1,即分隔所有
- 最大分隔次数,只分隔对应的次数
-
一行输入两个整数,输出两个数字的和
- split() 将输入的字符串进行分隔
- map(function, sequence):将序列sequence里面的每一个元素利用funcation进行转化,最终结果是一个可迭代的对象,一般需要将其转换成list
pythons = ['123', '456'] t = list(map(int, s))
-
- format 格式化
-
python字符串中 {} 表示占位符,format里面的参数将逐个放入字符串中的占位符
- 由于format的参数要逐个放入占位符中,此时参数数量必须大于等于占位符数量
- {0}、{1}表示占位符,其中非负整数表示这个位置为format中的第几个参数,从0开始奇数,{x}中的x不可以大于format中的参数数量

- {name}、{age}表示占位符,其中name、age表示format中传递参数的参数名称,此时是根据名称来找对应的位置,因此{}中的名称必须在format中出现


python# 输出两位小数 print("{:.2f}".format(a))
-
9、字典
字典
- 字典存储一系列的键值对:key:value
- 字典等价于数学中的映射,即一个key对应一个value
字典操作
- 字典创建
-
python中使用{}表示字典,可以使用{}创建一个字典
-
字典中的key只能为数字、字符串、元组,大多数情况使用字符串作为key
-
value的类型没有限制
-

-
利用dict创建字典:(此时key只能是字符串)
*pythona = dict(key1=value1,key2=value2,key3=value3) -
zip(seq1, seq2)
-

-

-
- 访问字典
- python的字典通过key来获取value,把key看作下标即可
- a[x]:a为dict,x为a中的一个key,必须存在否则会报错
- 如果不知道x是否在字典的key中,需要查询字典中x对应的value,可以使用get方法
- a.get(x,value=None):a表示字典,x表示查询的key,value表示默认值
- 如果x在字典的key中,则上述的结果为a[x],如果不在结果为value
- 添加元素和修改元素的值操作(通过key和value进行赋值即可)
- 删除元素
- 遍历字典
- 判断是否存在元素
- 拷贝字典
- 合并两个字典
例题

参考答案
python
# 输入一个字符串
s = input()
# 构建一个字典
C = {}
# 遍历字符串
for c in s:
C[c] = C.get(c,0) + 1
# 遍历字典
for x,y in C.items():
print("{},{}".format(x,y))
10、集合
集合
- python中的集合和数学中的集合一样,存储不重复的元素
- 集合中的元素都是唯一的,互不相同
- 集合中只能存储不可变的数据:数字、字符串、元组
- python用{}表示集合,其中元素使用逗号分隔
- python集合是无序的
集合的操作
- 创建集合

- 分别转换key、value、items
- 集合的基本操作

- 删除操作一般使用discard操作

11、日期与时间
time模块
- 获取时间戳,用于计算时间
python
import time
start_time = time.time()
time.sleep(3)
end_time = time.time()
print("start time: ", start_time)
print("end time: ", end_time)
print("total time: {:.2f} s".format(end_time - start_time))
-
获取本地时间
- time.localtime():返回本地时间,是一个struct_time对象,struct_time对象之间不可加减
-
时间转字符串函数
- time.strftime("%Y-%m-%d %H-%M-%S", t)
-
字符串时间转时间
- time.strptime(string, format)
datetime模块

- date日期类
- 获取年月日、星期几
- 年:a.year
- 月:a.month
- 日:a.day
- 星期几:a.weekday()



例题

参考答案
python
import datetime
start = datetime.date(1901,1,1)
end = datetime.date(2000,12,31)
ans = 0
while True:
if start.weekday() == 0:
ans += 1
start += datetime.timedelta(days = 1)
if start > end:
break
print(ans)

参考答案
python
import datetime
start = datetime.date(2022,1,1)
end = datetime.date(2022,12,31)
ans = 0
# 判断日期是不是顺子
while start <= end:
# 将日期转换成YYMMDD
now = start.strftime("%Y%m%d")
if "012" in now or "123" in now:
ans += 1
start += datetime.timedelta(days=1)
print(ans)

12、函数的定义与使用
函数定义与使用
- 函数:组织好的,可重复使用的,用来实现单一,或相关关联功能的代码段


- 返回值
- 使用return返回函数计算结果
- 可以有多个return语句,但是真正执行时最多运行一次,碰到return语句,函数结束
- 没有return语句,函数返回值为None
- return可以返回多个变量
例题

参考答案
python
def factorial(n):
num = 1
for i in range(1,n + 1):
num *= i
return num
num1 = 0
for i in range(1,11):
num1 += factorial(i)
print(num1)
函数传参机制
- 形式参数:定义函数时的输入参数
- 实际参数:调用函数时传递的参数
- 传参机制------值传递
- 值传递:函数中的形式参数变化,不会导致实际参数的变化,这是由于传递的是数值,单方向的
- 参数是不可变类型:字符串、数字、元组
- 传参机制------引用传递
- 引用传递:函数中形式参数变化,会导致实际参数一起变化,这是由于传递的是变量。参数为可变类型,列表、字典
- 如何传参不出错?
- 尽量不要传递列表、字典这种可变数据
- 即使传参,也尽量不要改动这些参数
- 技巧:传递列表、字典这类变量时,传递一个副本,这样就算修改实参也不会发生变化
- 传参机制------位置参数
- 参数个数不相同,顺序一 一对应
- 传参机制------关键字参数
- 根据形参的名字传递参数
- 传参机制------默认参数
- 默认参数:定义函数时,给一个形参默认值,所有的默认值必须放在最后
- 函数电泳时,如果省略该参数则该参数为默认值
- 传参机制------不定长参数( * )
- 形式参数前加 * ,表示不定长参数,可以按照位置参数的格式传递多个参数
- 加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数
变量作用域
- 作用域:变量的有效范围
- 局部变量:函数内部的变量,仅作用于函数内部
- 全局变量:函数外部的变量,作用于全局
- 如何在函数内部使用全局变量?
- 使用global声明
13、竞赛常用的标准库
math

- 常用函数

collections
- Counter:计数器
-

-
导入
*pythonfrom collections import Counter -

-

-
- deque:双端队列
- defaultdict:有默认值的字典
- OrderedDict:有序字典
heapq
- 堆:完全二叉树,每个节点小于等于子节点(默认为最小堆)

- 添加元素:先左后右


































