python中一些常用知识点

整理python中一些常用的,容易忘记的知识点,持续更新。。。

1. is == 区别

简单来说is是比较两个对象的占用内存地址是否相同,而==是比较两个对象的值是否相等
参考:https://www.cnblogs.com/kiko0o0/p/8135184.html

2. 深复制与浅复制

浅复制仅仅是赋值了对象的最外面一层,对象中嵌套的可变对象没有被赋值。深复制就是赋值对象中所有的元素。
注:切片操作与copy都是浅复制,deepcopy是深复制
参考:https://www.cnblogs.com/pinpin/p/9865228.html


3. 常用的一些数据结构
3.1 栈与队列

3.1.1 用python中的列表来实现栈与队列

list = []
for i in range(1, 4):
    list.append(i) #LIFO 后进先出,相当于栈
a = list.pop() #等价于 a = list.pop(-1)
print(list, a)

b = list.pop(0) #FIFO 先进后出,相当于队列
print(list, b)

3.1.2 python中自带的数据结构Queue

# Queue.Queue(maxsize=0) #创建队列,FIFO, 如果maxsize小于1就表示队列长度无限。
# Queue.LifoQueue(maxsize=0) #创建栈,LIFO, 如果maxsize小于1就表示队列长度无限。
# Queue.qsize() #返回队列的大小
# Queue.empty() #如果队列为空,返回True,反之False
# Queue.full() #如果队列满了,返回True,反之False
# Queue.get([block[, timeout]]) #出队,读队列,timeout等待时间。非阻塞get_nowait(),相当于get(block=False)
# Queue.put(item, [block[, timeout]]) #入队,写队列,timeout等待时间。非阻塞put_nowait(),相当于put("xxx",block=False)
# Queue.queue.clear() #清空队列


from queue import Queue
from queue import LifoQueue

q = Queue() #FIFO 队列
for i in range(1, 4):
    q.put(i)

while not q.empty():
    print(q.get())



s = LifoQueue() #LIFO 栈
for i in range(1, 4):
    s.put(i)

while not s.empty():
    print(s.get())

3.2 列表
list = []
list.append(1) #添加元素
list.index(1) #返回指定元素的下标,如果该元素不存在会报错
val = list.pop() #去掉列表中的最后一个值,等价于list.pop(-1)
val = list.pop(0) #去掉列表中的第一个值
list.remove(val) #移除列表中值为val的元素
list.insert(index, val) #在下标index之前插入val
cnt = list.count(val) #返回列表中值为val的元素个数

3.3 字典dict
dict = {1:'a', 2:'b', 3:'c', 4:'d'}

dict.get(1, 'not found') #在dict查找key为1的value,找不到返回'not found'
del dict[4] #删除dict中key为4的那个元素
dict.clear() #清空字典

#判断key是否存在与字典中
key in dict #或者key in dict.keys()

3.4 set集合
s = set(['a', 'b', 'c', 1, 2, 3])
s.add(4) #添加元素
s.clear() #清空集合
s1 = s.copy() #复制,改变s1不会影响s
s.remove(1) #移除元素,如果要移除的元素不存在则会报错
s.discard(1) #移除元素,如果要移除的元素不存在不会报错

s1 = set('acac')
s1 & s #交集
s1 | s #并集
s1 - s #差集

3.5 字符串
s = "abcde"
s.find('abc', 0, len(s)) #在s中从[0,len(s))查找子串'abc', 返回子串在s中第一次出现的起始位置,找不到返回-1
s.index('abc', 0, len(s)) #在s中从[0,len(s))查找子串'abc', 返回子串在s中第一次出现的起始位置,找不到抛出异常
s.rfind('abc', 0, len(s)) #在s中从[0,len(s))查找子串'abc', 返回子串在s中最后一次出现的起始位置,找不到抛出异常
4. * ** zip的用法

星号的用法相当于解压,与zip相反

在列表前面加*相当于将列表中的元素解开为独立的变量传入函数之中,同样适用于numpy中的array

list = [1, 2]
print(*list)

def f(a, b):
    print(a+b)
f(*list)

在字典前加**相当于将字典的各个value传入函数

data = {'a' : 4, 'b' : 3}
print(*data) #输出key

def f(a, b):
    print(a+b)
f(**data)

zip将可迭代的对象作为参数,返回这些对象元素依次组成的元组

a = [1, 2, 3]
b = [4, 5, 6]
print(list(zip(a, b)))
print(list(zip(*zip(a, b))))

同样适用于字典,对于字典用的是字典的key

a= {1: 1, 2: 2}  
b = {3: 3, 4: 4}
c = {5: 5, 6: 6}
print(list(zip(a, b, c)))
print(list(zip(*zip(a, b, c))))

用于循环语句

a = [2, 3, 4]
b = [4, 5, 6]
for x, y in zip(a, b):
    print(x, y)

参考:
https://www.cnblogs.com/wushuaishuai/p/7766470.html
https://blog.csdn.net/weixin_40877427/article/details/82931899
https://blog.csdn.net/breeze_blows/article/details/90475922
https://blog.csdn.net/liuweizj12/article/details/79893673

你可能感兴趣的:(python)