基础语法
函数
设置递归深度:
sys.setrecursionlimit(3000)
sum() 函数 :求和计算
round() 函数: 四舍五入
pow(a,b) 函数 :计算任意N次方值
min() max()
bool() 函数 :将指定的参数转换成布尔类型
ord() 函数 :获取单个字符的ASCII数值
list() 函数: 将可迭代对象转换为列表。list(range(1,10))
sorted() 函数: 对可迭代对象进行排序
len()函数: 返回一个对象的元素或项目个数
map(fun, it) 函数:对it中所有元素依次作为fun函数的参数
向上取整 math.ceil(3.1)
向下取整 math.floor(3.1)
切片
简单切片
简单切片指的是这样的切片形式:a[start:stop]
,其行为是得到下标在这样一个前闭后开区间范围内的元素
扩展切片
扩展切片指的是这样的切片形式:a[start:stop:step]
,其中step
是一个非零整数,即比简单切片多了调整步长的功能,此时切片的行为可概括为:从start
对应的位置出发,以step
为步长索引序列,直至越过stop
对应的位置,且不包括stop
本身。
1 2 3 4 5 6 7 8 9 10 11 12 13
| >>> a = list(range(10)) >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> a[:5] [0, 1, 2, 3, 4] >>> a[5:] [5, 6, 7, 8, 9] >>> a[2:8] [2, 3, 4, 5, 6, 7] >>> a[::2] [0, 2, 4, 6, 8] >>> a[::-1] [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
|
字符串
返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数
1
| string.count(str, beg=0, end=len(string))
|
检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1
1
| string.find(str, beg=0, end=len(string))
|
以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
转换 string 中的小写字母为大写
string.upper() string.lower()
怎样将以下列表转化为整数?
1 2 3 4 5 6 7
| a=[1, 3, 5] b=['4', '5', '6'] r1 = int("".join(map(str, a))) r2 = int("".join(map(str, b)))
123 456
|
输入输出
两种输入方式,两种输出方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| try: while True: s = input() print(s) except: pass
n, m = (int(_) for _ in input().strip().split(" ")) a = [int(_) for _ in input().strip().split(" ")] for i in range(m): s = input()
a1 = list(map(int, input().split()))
ans = [1, 2, 3, 4] for j in ans[:-1]: print(j, end=" ") print(ans[-1])
print("{} {}".format("hello", "world)) print("{:.2f}".format(3.1415926));
|
快速读入
sys.stdin.readline(),和input()一样,需要import sys
常用模板
stack
用一个数组list和一个top指针标志栈顶,通过top指针的前后移动来模拟stack的出队和入队。
queue
在python就有Queue这个库,但速度较慢,且不能不出栈地访问头部元素,想要访问头部元素,只能用get方法出栈首部获取方法返回值的来进行访问,非常不方便。
Queue的底层实现用的是collections.deque,这是一个双端队列,大概同C++中的deque,首尾都可以添加删除元素,可以用来模拟queue。
1 2 3 4 5 6 7 8 9 10 11
| q = collections.deque() q.appendleft(10) q.appendleft(4) q.appendleft(11) print("top:{}".format(q[0])) q.popleft() print("after_pop_top:{}".format(q[0]))
|
名称 |
作用 |
q.append() |
右边加入 |
q.appendleft() |
左边加入 |
q.pop() |
右边弹出 |
q.popleft() |
左边弹出 |
优先队列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| import heapq
class PriorityQueue: def __init__(self): self.__queue = []
def push(self, priority): heapq.heappush(self.__queue, priority)
def pop(self): return heapq.heappop(self.__queue)
def front(self): return self.__queue[0]
q = PriorityQueue() q.push(2) q.push(1) q.push(3) q.push(1) print(q.front()) print(q.pop()) print(q.pop()) print(q.pop()) print(q.pop())
|
排序
Python列表有一个list.sort()方法可以直接修改原列表对象进行排序,Python还内置了一个sorted()函数对可迭代对象排序并返回新的列表对象。
1 2 3 4
| b = sorted([5, 2, 3, 1, 4])
a = [5, 2, 3, 1, 4] a.sort()
|
可以使用 functools.cmp_to_key( mycp ) 自定义排序函数,函数返回正、负、0表示三种状态。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import functools
def mycomp(x, y): if x[2] == y[2]: if x[1] == y[1]: return x[0] - y[0] else: return x[1] - y[1] else: return x[2] - y[2]
a = [(1, 3, 5), (2, 2, 2), (4, 7, 8), (10, 8, 1), (3, 8, 1)] a.sort(key=functools.cmp_to_key(mycomp)) print(a)
|
二分
bisect是python内置模块,用于有序序列的插入和查找。
- 查找: bisect(array, item)
- 插入: insort(array,item)
bisect还有bisect_left,insort_left的用法,和不带left的用法的区别是:当插入的元素和序列中的某一个(多个)元素相同时,该插入到该元素的前面(左边,left),还是后面(右边);如果是查找,则返回该元素(第一次出现)的位置还是该元素(最后一次出现)之后的位置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import bisect
li = [21, 4, 5, 61, 45, 45, 100] li.sort() print(li) print(bisect.bisect(li, 1000)) print(bisect.bisect(li, 45)) print(bisect.bisect_left(li, 45)) print(li)
bisect.insort(li, 5) print(li)
|
与C++不同的操作
- 判断是否为数字是否为字母,C++中一般用ascii码来比较,python中可以使用str的isdigit和isalpha方法直接判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| n = 119849 len1 = len(str(n))
str1 = ",123d{" num1 = 0 for j in str1: if j.isdigit(): num1 += 1 str2 = ",abc3{" num2 = 0 for j in str2: if j.isalpha(): num2 += 1 print("digit:{},aplha:{}".format(num1, num2))
digit:3,aplha:3 10
|
- python的def函数中假如想要使用外部全局变量,必须global说明,这点非常要当心
1 2 3 4 5 6 7 8 9 10
| def jishu(): global cnt1 cnt1 += 1
cnt1 = 0 for i in range(10): jishu() print(cnt1)
|
- deepcopy深拷贝的问题,关于这一点,可以尝试一下下面的代码,深刻体会一下浅拷贝和深拷贝的区别
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| import copy
list1 = [1, 2, 3, 4, 5, 5, 4, 3, 2, 1]
for i, x in enumerate(list1): print("{},{}".format(i, x))
list1 = [1, 2, 3] list2 = list1 list3 = copy.deepcopy(list1) list1[0] = 10 print(list2) print(list3)
0,1 1,2 2,3 3,4 4,5 5,5 6,4 7,3 8,2 9,1 [10, 2, 3] [1, 2, 3]
|