首先我们要知道Python是有着大量的库(模块、类、函数)的,所谓善借其器,善用其利
Q1、日期问题
掌握
datetime
库
eg:小蓝每周六、周日都晨跑,每月的 1、11、21、31日也晨跑。其它时间不晨跑。已知 2022年1月1日是周六,请问小蓝整个2022年晨跑多少天?
学过c的话知道,写的话逻辑还是比较复杂的且易错
import datetime
start = datetime.datetime(year=2022,month=1,day=1)
#print(start) ----- 2022-01-01 00:00:00
end = datetime.datetime(year=2023,month=1,day=1)
cnt = 0 #count
while start != end:
if start.isoweekday() in [6,7] or start.day in [1,11,21,31]:# isoweekday 查找某天是星期几 返回数字1 ~ 7
cnt += 1
start += datetime.timedelta(days=1) # 真正意义上的日期上加一天
#print(datetime.timedelta(days=1) )-----1 day, 0:00:00
print(cnt)
通过这个题我们会发现,python内置函数绝对是一把利器,但随之有个问题:如此多的函数,函数名我们记不清怎么办,所以我们也必须掌握如何查找函数的方法
例如:我现在想使用isoweekday函数
,但拼写记不清了怎么办?or 想知道它的功能是什么?
现在你只知道它来自datetime
模块,按如下③即可:
import datetime
#①使用dir()命令可查找模块下的包(类)
dir(datetime)
#output:
#['MAXYEAR', 'MINYEAR', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'date', 'datetime', 'datetime_CAPI', 'sys', 'time', 'timedelta', 'timezone', 'tzinfo']
import datetime
#②使用dir()命令可查找库函数
dir(datetime.datetime)
#output:
#['__add__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__radd__', '__reduce__', '__reduce_ex__', '__repr__', '__rsub__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', 'astimezone', 'combine', 'ctime', 'date', 'day', 'dst', 'fold', 'fromisocalendar', 'fromisoformat', 'fromordinal', 'fromtimestamp', 'hour', 'isocalendar', 'isoformat', 'isoweekday', 'max', 'microsecond', 'min', 'minute', 'month', 'now', 'replace', 'resolution', 'second', 'strftime', 'strptime', 'time', 'timestamp', 'timetuple', 'timetz', 'today', 'toordinal', 'tzinfo', 'tzname', 'utcfromtimestamp', 'utcnow', 'utcoffset', 'utctimetuple', 'weekday', 'year']
import datetime
#③使用help()命令查看函数简介
help(datetime.datetime.isoweekday)
#output:
#Help on method_descriptor:
#
#isoweekday(...)
# Return the day of the week represented by the date.
# Monday == 1 ... Sunday == 7
建议刚入门python的小白把Q1 code默写一遍
Q2、经典进制问题
掌握 ①
bin()、oct()、hex()
函数;②格式format
化转进制
eg:
2 在十进制中是 1 位数,在二进制中对应 10 ,是 2 位数
22 在十进制中是 2 位数,在二进制中对应 10110 ,是 5 位数。
请问十进制整数 2022 在二进制中是几位数?
# 解
print(len(bin(2022)) -2) #减2是因为 有进制标识符(eg:0b、0o、0x)
#output: 11
#print(bin(2022)) ----- 0b11111100110
Ⅰ. 十转二、八、十六
bin()、oct()、hex()
(注意结果带进制标识符)
Ⅱ. 互相转换
print('{:d}'.format(0xef)) #十六进制转十进制:239
print('{:b}'.format(2022)) #十进制转二进制:11111100110
print('{:#o}'.format(0xef)) #十六进制转八进制:0o357 (如果 ':'后有#则表示输出结果带标识符)
小白注意掌握0o/0x/0b标识符
Q3、排列组合问题
掌握组合迭代器
itertools
①可迭代笛卡尔积
1 正常for
循环
a, b = 'abc', '123'
c = [(i, j) for i in a for j in b]
print(c)
#output:[('a', '1'), ('a', '2'), ('a', '3'), ('b', '1'), ('b', '2'), ('b', '3'), ('c', '1'), ('c', '2'), ('c', '3')]
2 product()
import itertools
for i in itertools.product('abc', '123'):
print(i)
#output:
('a', '1')
('a', '2')
('a', '3')
('b', '1')
('b', '2')
('b', '3')
('c', '1')
('c', '2')
('c', '3')
print(list(itertools.product(['1','2', '3'], ['a', 'b', 'c'])))
#output:[('1', 'a'), ('1', 'b'), ('1', 'c'), ('2', 'a'), ('2', 'b'), ('2', 'c'), ('3', 'a'), ('3', 'b'), ('3', 'c')]
②全排列(无序 不重复)
permutation
import itertools
print(list(itertools.permutations([1, 2, 3])))
#output:[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
import itertools
for i in itertools.permutations('abc', 3):# 3 代表迭代序列长度 不写就是全排列
print(i)
#output:
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')
③有序,不重复组合
combinations
import itertools
for i in itertools.combinations('abc', 2):
print(i)
#output:
('a', 'b')
('a', 'c')
('b', 'c')
④有序,可重复组合
combinations_with_replacement
for i in itertools.combinations_with_replacement('abcd', 2):
print(i)
#output:
('a', 'a')
('a', 'b')
('a', 'c')
('a', 'd')
('b', 'b')
('b', 'c')
('b', 'd')
('c', 'c')
('c', 'd')
('d', 'd')
以上着重记全排列
,其余可查好说
库函数的使用写法问题
# 写法一:
from itertools import permutations
print(list(permutations([1, 2, 3]))) # [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
# 写法二:
import itertools
print(list(itertools.permutations([1, 2, 3])))
enumerate()遍历索引和元素
lyh_list = ['A', 'B', 'C']
for index, item in enumerate(lyh_list ):#可以直接用在字典上
print(f'{index}: {item}')
#output:
0: A
1: B
2: C
字符串函数
字符转换问题
.lower()
转小写
.upper()
转大写
.swapcase()
将字符串str中的大小写字母同时进行互换。
chr()
ord()
字符串搜索
.find(" ", start, end)
搜索字符串,没有返回-1, start\end 可省
.index(" ")
返回字符串开始的索引值
.rfind(" ")
从右边开始寻找
.count(" ")
字符串计数
插入
str1.join(str2)
:在str2中每个两个字符中间面插入str1中内容,构造出一个新的字符串
.replace()
字符串类型判断
.isspace()
:只包含空格
.isdigit()
:只包含数字
.isalpha()
:只包含字母
A = input()
B = input()
for j in range(len(A)):
if A[j] not in B:
print(A[j], end='')
#法二
n = input()
m = input()
for i in m:
if i in n:
n = n.replace(i, ")
print(n)
最小公倍数和最大公约数
def gcd(x, y):
if x % y == 0:
return y
elif x % y == 1:
return 1
else:
return gcd(y, x%y)
x*y/gcd(x, y)#最大公约数
import math
math.gcd()
.zfill()
补零操作
s_list1 = list(map(list, zip(*s_list1)))
逆转矩阵