list、tuple、dict、set
共性:都是可以迭代的。
名称 | 可变性 | 值 | 可重复性 | 是否有序 | 其他特点 |
---|---|---|---|---|---|
list | 可变,可以修改元素 | [1,2] | 值可以重复 | 有序 | 相比于dict拥有占用内存小的特点,常用于堆栈的处理 |
set | 可以修改元素 | (1,2) | 值不可以重复 | 无序 | 常用于判断值是否存在 |
dict | 键不可变,值可变 | {1:1,2:2} | 键不可以重复,值可以重复 | 无序 | 符合内存换速度思想,常用于查找 |
tuple | 不可变(意思是tuple的每个元素的指向永远不变),但元素本身可以变化,例如元素为list时 | (1,2) | 值可以重复 | 有序 | 本身不可变,但相对比较稳定 |
生成器
第一种生成器创建方式:把列表的方括号,换成圆括号
g = (i*2 for i in range(5))
print(next(g))
print(next(g))
print(next(g))
第二种生成器创建方式:在函数里加yield
def fib(num):
a = 0
b = 1
i = 0
while i < num:
a,b = b,a+b
yield b
i += 1
fuc = fib(10)
print(next(fuc))
print(next(fuc))
装饰器
装饰器就是一个闭包
import time
def show_time(func):
def inner(*args,**kwargs):
start = time.time()
func(*args,**kwargs)
print(time.time() - start)
return inner
@show_time
def work(num):
for i in range(num):
print(i ** 2)
work(1000)
多线程
函数方式:
import threading
import time
def timeget(id):
num = 0
while num < 5:
num += 1
#time.sleep(1)
print("id:{}--------num:{}".format(id,num))
for i in range(5):
t = threading.Thread(target=timeget,args=(i,))
# 设置为守护线程,over总会在所有线程运行结束后才打印出来
# 如果不设置的话,over不一定会等待这些线程执行完以后才打印,可能在线程没执行完的时候就打印了
t.setDaemon(True)
t.start()
print('over')
requests的请求
get请求
import requests
headers = {
"User-Agent":user_agent,
"Cookie":cookie,
"Referer":referer
}
data = {
"start":1,
"end":10
}
requests.get(url = url,params = data,headers = headers)
requests.post(url = url,data = data,headers = headers)