文章目录
Pip
Python包管理工具——Pip
更换pip源到国内镜像
Python 卸载一个第三方模块,并卸载其依赖包
Conda
Conda工具使用
remove命令和show命令的使用(场景conda删除channel )
uninstall anaconda
Python
Python命名规范
使用包setup.py安装
microsoft visual c++ 14.0 is required问题解决办法
Python中的classmethod和staticmethod的区别与应用
python-@staticmethod和@classmethod的作用与区别
python遍历类中所有成员的方法
python——时间与时间戳之间的转换
python中set集合如何决定是否重复?
Python正则表达式指南
lambda用法,:之前是接受参数,:之后是返回值
Python3.x和Python2.x的区别
jupytershortcut
Python Import详解
Python 中 import 的机制与实现
Python 绝对导入和相对导入详解
Python打印数组的全部元素
python单下划线/双下划线使用总结
and是逻辑运算,第一个为假的话就不必算完,&是位运算,必须算完
详解Python中的下划线,类中成员只要带了__就有效,类外方法和变量不遵守这个规则
python类特殊成员
Python的特殊属性和用法(全)
实习小记-python中可哈希对象是个啥?what is hashable object in python?
os._exit()vssys.exit()
Python中的闭包
Python闭包详解
Python进阶路线
python局部变量和全局变量global
列表合并
python中的列表解析和生成表达式
[Python]更加Pythonic的多个List合并
Python在函数中使用*和**接收元组和列表
Python异常处理
python之__iter__函数与__next__函数
python3自定义类:重写__eq__和__hash__函数
完全理解 Python 迭代对象、迭代器、生成器
python类的继承
Python: 你不知道的 super
class F1:
def __init__(self, f1):
self.f1 = f1
def print_f1(self):
print(self.f1)
class F2:
def __init__(self, f2_1, f2_2):
self.f2_1 = f2_1
self.f2_2 = f2_2
def print_f2(self):
print(self.f2_1, self.f2_2)
class C(F1, F2):
def __init__(self, c1, c2):
super(C, self).__init__(c1)
super(F1, self).__init__(c1, c2)
def print_c(self):
super(C, self).print_f1()
super(C, self).print_f2()
if __name__ == "__main__":
c = C(1, 2)
c.print_c()
由Python的super()函数想到的
Python字符串格式化 (%占位操作符)
Python中的函数柯里化
Python 声明变量类型的三种方式
Python判断文件是否存在的三种方法
Python中单引号,双引号,3个单引号及3个双引号的区别
python assert的作用
Python中eval的强大与危害
python中文件复制操作
python修改linux中文件(文件夹)的权限属性
yield
Python yield 使用浅析
Python中的可迭代对象、迭代器和生成器的异同点
Python编程:生成器yield与yield from区别简单理解
# yield接收值, 协程
def gen():
a = 0
while True:
x = yield a
a = x
print("x = %s" % x)
print("a = %s" % a)
g = gen()
# 需要调用一个next才行,因为是生成器,所以要求代码跑到生成器函数的yield位置,才能去用send进行双向数据交互
print(next(g)) # 执行到yield, 激活协程 send(None) ”预激(prime)“协程,返回的就是a
g.send(10)
g.send(20)
g.send(30)
g.close()
Python并发编程之深入理解yield from语法(八)
字符集
Python: Getting rid of \u200b from a string using regular expressions
不可见字符的坑
python字符编码与解码——unicode、str和中文:UnicodeDecodeError:'ascii’codeccan’tdecode
协程
async标记异步函数,意思就是当这个函数内部出现等待的时候,CPU可以去执行其他的函数,而await后面要跟一个异步函数的调用,意思就是说,后面的函数是个异步函数,告诉cpu,我这个函数要等一段时间,你可以去干别的事儿了
《python高级编程》异步IO和协程
异步IO
Python异步IO之协程(一):从yield from到async的使用
Python Async/Await入门指南
结合B站的那个视频,就是上面第一个链接的关于协程的讲解进行理解,协程就是说,某个函数执行到某个位置的时候,这个函数可以先暂停等一会儿,然后让cpu这时候别闲着,去做点其他的事情,比如那个代码,taskio_1走到yield from相当于把taskIO_1挂起,然后执行taskIO_2,然后同样遇到yield from,开始又挂起来,然后taskIO_1挂起的位置返回,跳回taskIO_1继续执行,单个taskIO_1执行完,然后如果taskIO_2挂起的位置返回了,继续执行
所谓任务挂起就是执行到某一位置,暂停,然后把这个程序放在等待队列里面等着
初步理解await的功能,首先我发现,代码里最多只能同时跑一个loop,不能同时存在两个loop再跑,这个存疑,因为我原来是这样写的:先定义了一个coroutine,这个coroutine里会定义一个loop并且run,然后吧这个coroutine送给一个另一个loop并执行run,发现会报错,报错信息是,loop已经在running了,不能再次run,就是说同时只能有一个loop在run
下面代码实现的是开了两个request,这两个request之间是异步的,然后每个request里都是一个支持异步http访问的方法,由aiohttp提供,这里不能用requests,因为requests并没有异步的功能。async代表着这个是一个异步的方法,需要靠asyncio来启动,await就是yield from,这个对理解await很重要,yield from的功能别忘了,有两个:从yield方法里读取返回值,处理异常。await也是一样,从异步方法里获取返回值,并且处理异常,之前一直强调的yield方法就是一个执行到一半可以暂停的方法,异步的核心思路也是这个。而await就是这个暂停的地方(尽管他是yield from,但同理,yield from也有暂停的功能,可以看前面的博客理解),就是在生命,当await的在等待的时候,当前线程可以去执行其他异步程序。
下面的程序简单说明一下,比如两个request分别是requestA和requestB,刚开始requestA跑到第一个await,程序发现可以执行,然后进入到requestA中的get(,,0),然后在里面遇到了第二个await,然后requestA中的get(,,0)被挂起等待返回。这时候,requestB中的开始执行了,同样的跑到get(,,0),然后在里面遇到了第二个await,挂起,然后大家都挂起了,然后看谁返回了,就先继续执行谁。
博客中写道,loop就是一个消息队列,既然是队列,就应该是先入先出的,就是先返回的先执行。
不能用requests,因为requests并不支持异步访问奥
from flask import Flask
import time
app = Flask(__name__)
@app.route('/')
def index():
time.sleep(1.5)
return 'Hello!'
import asyncio
import aiohttp
import time
async def get(session, count, img_name, url='http://127.0.0.1:5000/'):
print('getting Coroutine %d for %d' % (count, img_name))
async with session.get(url) as response:
result = await response.read()
return result
async def request(connt):
async with aiohttp.ClientSession() as session:
for i in range(5):
await get(session, connt, i)
print('ddddd')
start = time.time()
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait([request(i) for i in range(2)]))
end = time.time()
print('Cost time:', end - start)
多线程
python–threading多线程总结
Python 多线程 start()和run()方法的区别(三)
Python线程指南
argparse
python argparse传入布尔参数false不生效
使用Python中的argparse从命令行接收boolean类型的参数
PyMysql
使用pymysql插入语句时对execute与executemany两个方法进行测速
Python3MySQL数据库连接
Python中操作mysql的pymysql模块详解
Numpy
numpy的广播(Broadcasting)
两个arr从最后一个axis开始对齐,不足的位置补充0
Scipy
优化
矩阵操作
arr = np.arange(24).reshape((2,3,4))
# 先取第一维度的第1、2个元素,再第二维度的1、2、3个元素的方法,返回2*2*4的16个数
print(arr[[0,1],:,:][:,[1,2],:])
# 返回2*4的8个数
print(arr[[0,1],[1,2],:])
增加一个维度可以用下面两个方法,以np.expand_dims(arr,1)
为例,意思就是在第二个位置插入一个维度,将第一个维度上存在的四个元素包起来成为一个新的轴
import numpy as np
arr = np.array([[1,2,3],[1,2,3]])
print(arr[np.newaxis,:,:].shape)
print(arr[:,np.newaxis,:].shape)
arr=np.array([[[1,2],[3,4],[5,6]],[[1.1,2.2],[3.3,4.4],[3.3,4.4]],[[1.1,2.2],[3.3,4.4],[3.3,4.4]],[[1.1,2.2],[3.3,4.4],[3.3,4.4]]])
print(arr.shape) #(4, 3, 2)
new_arr=np.expand_dims(arr,1)
print(new_arr.shape) # (4, 1, 3, 2)
print(new_arr)
Numpy中stack(),hstack(),vstack()函数详解
文中箱子的含义只是帮助理解,但实际我觉得这个理解方式不是真正的含义,stack的意思是堆叠,对于两个形如(3,3,2)的array a,b
,那么np.stack((a,b),axis=1)
的含义是从二者的第1轴(从0算起)上取出元素进行堆叠,那么结果形状就应该是(3,2,3,2)。np.stack((a,b),axis=3)
的含义是取出二者的第3轴上的元素进行堆叠,当然我知道是不存在第3轴,这个的含义就是对每个数进行堆叠,结果就应该是(3,3,2,2)
至于上面的博客评论区对有没有增加维度的争论,其实对于a或者b来讲,是增加了的;但对于(a,b)整体来讲,的确没有增加维度。
Python numpy.transpose 详解
transpose
操作可以理解为移轴,例如一个数组A
的形状是(4,5,6,7)
,如B=A.transpose((1,0,3,2))
,那么A[1,2,3,:]
就等于B[2,1,:,3]
。具体的说明在tensorflow2的demo里也有记录
Matplotlib
画图
matplotlib绘制直方图、条形图和饼图
python 读取并显示图片的两种方法
Visualizing named colors matplotlib 颜色名
pylab与pyplot
在pycharm里用两个东西画出来的图不一样,用pylab画出来的类似一操作界面,可以放大缩小调整颜色之类的
pyplot.legend只显示一个字符的问题解决方法,在调用pyplot.legend()的时候,要指定参数名pyplot.legend(loc=‘upper right’),不可以只写pyplot.legend(‘upper right’),这样legend就不会只显示一个字符了,很弱智
matplotlib画布与坐标轴(figure and axes)
matplotlib绘图——再谈axes和pyplot方法
配置
matplotlib backend
%matplotlibinlineon/off
linux 服务器没有GUI时如何使用matplotlib绘图
字体
Python画图matplotlib展示图中中文乱码
mac下python matplotlib中文乱码解决方案
Matplotlib中文乱码的3种解决方案
matplotlib显示宋体和Times New Roman
如何将matplotlib中全局的中文设置成宋体
Pandas
CRUD
十分钟入门 Pandas
理解index和col 无非就是两边的title,数据类型都是index的,以堆叠(Stack)这一小节为例
A B
first second
bar one 0.029399 -0.542108
two 0.282696 -0.087302
baz one -1.575170 1.771208
two 0.816482 1.100230
上面的数据里,列(称为column)就是[A,B],是Index类型的,索引(称为index)是[(bar,one),(bar,two)…],是一个MultiIndex类型的
其实无所谓column还是index,类型要么是Index要么是MultiIndex,我觉得称之为行键和列键更合理,两者实际上没有任何差别,就是作为行和列的键,帮助定位数据,上述数据可以使用
df.loc[[('bar', 'one'),('bar', 'two')], ['A','B']]
来定位数据
也可以随意修改列键,例如
df = pd.DataFrame(np.random.randint(3,size=(4, 3)), index = ['apples','apples','oranges','oranges'], columns=['A','B','C'])
df_grouped = df.groupby(df.index).agg({'A':['sum','mean'],'B':'sum','C':'sum'})
df_grouped.columns = ['_'.join(col) for col in df_grouped.columns.values]
使用Pandas实现SQL基本操作
Pandas教程 | 超好用的Groupby用法详解
Pandas提取含有指定字符串的行(完全匹配,部分匹配)
python——修改Dataframe列名的两种方法
DataFrame 新增列的五种方法
Pandas Merging 101
left_index=True, right_on='keyRight'
的含义就是左表使用index作为join的key,右表使用keyRight列作为join的key
特性
pandas中关于set_index和reset_index的用法
就是把索引变成列,level可以是一个[1,2]
的列表,代表着取第几层的index
统计
pandas的dataframe 条件查询
pandas 数据索引与选取
Python Pandas修改列类型
Python dataframe.pivot()用法解析
python pandas库——pivot使用心得
pandas中DataFrame的stack()、unstack()和pivot()方法的对比
配置
pandas中关于DataFrame行,列显示不完全(省略)的解决办法
Jupyter
远程访问jupyter notebook
jupyter开启远程访问以及遇到No address associated with hostname问题
Scikit-learn
【原】关于使用sklearn进行数据预处理 —— 归一化/标准化/正则化
使用sklearn进行增量学习
absl
这个东西就是一个参数处理模块,可以让你python main.py --arg 5这样运行python文件
Python中的import以及__future__和absl的flags使用
其中mark_flag_as_required就是某个参数是强制要求输入的,不输入就有user warning,尽管定义了默认值= =
- 从另一个文件里引入flag的第一种方法
下面这个函数中flag_source是一个module,作用就是把这个module里定义的flag引入到当前这个文件里,免得多次定义
flags.adopt_module_key_flags(flag_source)
#下面的文件叫flag_source.py
from absl import flags
flags.DEFINE_string(name="my_flag", default="abc", help="a flag.")
flags.DEFINE_string(name="my_flag222", default="abc", help="a flag.222")
#下面的文件叫my_module.py
from absl import app as absl_app
from absl import flags
from flag_test import flag_source
flags.adopt_module_key_flags(flag_source)
def main(_):
print(flags.FLAGS.my_flag)
pass
absl_app.run(main)
#不过参数只对run()内的函数有效,下面一行啥也打印不出来
print(flags.FLAGS.my_flag)
- 另一种从另一个文件里引入flag的方法就是用declare_key_flag
#下面的文件叫flag_source.py
from absl import flags
def get_flags():
key_flags = []
flags.DEFINE_string(
name="data_dir", short_name="dd", default="/tmp",
help="The location of the input data.")
key_flags.append("data_dir")
return key_flags
#下面的文件叫my_module.py
from absl import app as absl_app
from absl import flags
from flag_test import flag_source
def main(_):
flags.declare_key_flag(flag_source.get_flags()[0])
print(flags.FLAGS)
pass
absl_app.run(main)
- 参数校验,如果给pal_flag的参数不满足下面的check_pal返回true,那么就会报错
flags.DEFINE_string(name="pal_flag", short_name="pf", default="", help="Give me a palindrome")
@flags.validator("pal_flag")
def _check_pal(provided_pal_flag):
return provided_pal_flag == provided_pal_flag[::-1]
FLAGS = flags.FLAGS
def main(argv=()):
print(FLAGS.pal_flag)
app.run(main)
下面flags_dict是个字典,key就是benchmark_logger_type和benchmark_log_dir
@flags.multi_flags_validator(
["benchmark_logger_type", "benchmark_log_dir"],
message="--benchmark_logger_type=BenchmarkFileLogger will require "
"--benchmark_log_dir being set")
def _check_benchmark_log_dir(flags_dict):
pass
- define_enum和define_list的用法
enum表明的是,接受的参数一定在后面那个list里
flags.DEFINE_enum('enum','123',['123','342'],help='no')
flags.DEFINE_list('l',[1,2,3],help='no')
def main(_):
flags.FLAGS.set_default('data_dir','asdfsadf')
print(flags.FLAGS.enum)
print(flags.FLAGS.l)
pass
absl_app.run(main)
Pillow
Opencv
应用OpenCV和Python进行SIFT、SURF、ORB算法的实现
knnMatch的返回值是一个列表,每个元素也是一个列表,这个列表的元素个数由k决定,就是找几个最近的描述子,DMatch的成员变量可以去Opencv的api里取找