写博客主要是作为个人笔记,也方便有需要的人可以阅读。由于知识水平有限难以保证博文的准确性,仅供参考,欢迎指正。
笔记大杂烩
关于Python3 导入子文件中的模块问题
按我之前的理解,要import子文件夹的module,可以加__init__.py
将其变为包或者添加文件夹到默认搜索路径。可是这次突然发现Python3可以在没有__init__.py
的情况下import子文件夹的module。
经过一番搜索,初步断定是Namespace packages
所引起,Python3.3新增了命名空间包的特性,概念由PEP 420引入。
注:此处并非讨论 Absolute/Relative import
Python中的type和object
面向对象中有两大关系:父子关系和类与实例的关系
Python2.2引入了new-style classes统一了type和class概念。详情可参阅下文中新旧类的区别!
总结:object是type的父类,object又是type的实例
参考链接:
Types and Objects
python中的type和object详解 - lovekernel - 博客园:这篇文章是上面英文文章的译文
Python中type和object - Harvard_Fly - 博客园
__future__
模块
python通常会引入一些新特性,很容易出现新旧版本不兼容的问题,通过导入__future__
模块能够在旧版本中使用新版本特征。能避免产生混淆,帮助工具能够正确导入对应模块,在一定程度上检查对应错误并抛出异常。
# 代码中常用的带兼容性质的新特性
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
future — Future statement definitions — Python 2.7.15 documentation
使用__future__ - 廖雪峰的官方网站
c/c++中的unsigned char * 如何转为python中numpy.ndarray
- 背景
工业相机的驱动通常由C++编写,RGB裸数据通常存储为 unsigned char * 的形式,而很多利用深度学习的计算机视觉算法是由Python完成,通常希望图像数据存储在numpy.ndarray中。这样就会产生标题上所提到的需求。最近用的一款海康的摄像头,其提供的Python API是通过ctypes模块,调用驱动控制的动态链接库so实现。返回的数据存储在ctypes.Array
中,数组元素类型为ctypes.c_ubyte
,该类型对应C中的unsigned char
类型。
import numpy as np
from ctypes import *
img_size = 1920*1200*3
databuf = (c_ubyte*size)() #实例化一个数组对象
.... # 假设通过调用动态库中的函数将摄像头数据存储在databuf中
array = np.ctypeslib.as_array(databuf) # 这个函数也可以
array = np.array(databuf) #将对象数组转为numpy类型
frame = array.reshape(1200,1920,3)[...,::-1]
# 最后切片操作是将RGB转为BGR,要根据实际情况判断是否需要转换。
注意:ctypes.Array
可以使用标准下标和切片访问来读取和写入数组元素!!!
ModuleNotFoundError: No module named ‘_tkinter’
之前用源码编译了一个Python3.6,最近使用matplotlib时,发生下述错误
import _tkinter # If this fails your Python may not be configured for Tk
ModuleNotFoundError: No module named '_tkinter'
搜索发现此类问题很多,各式回答都有,诸如:
- python2和3 中
tkinter
的库名不同,python2首字母大写,python3小写 - 系统没有安装tk库,
sudo apt-get install python*-tk tk-dev
但是上述解决办法,明显和我的情况不同,ubuntu自带的Python2和3都能正常导入,如果是系统底层库缺失,按理都不能用。部分低票回答提及,重新编译一下,因此我尝试重新编译,发现问题确实可以解决。
快速查找并了解模块方法的方式
python2 -m pydoc -p 1234
参考链接:
pydoc — Documentation generator and online help system
pydoc用法 - 每天1990 - 博客园
源码编译的Python,未安装在系统目录,也没有添加环境变量,如何使用pip
cd python3.6/bin
./python3.6 pip3 --version # 刚安装的解释器+pip3, 与执行xx.py一致
要点:直接在bin
目录下输入pip3 --version
,不会成功执行,而需要像上面一样加上对应的解释器。
查看Python内建函数的源码
参考链接:
Finding the source code for built-in Python functions? - Stack Overflow
提取 / 验证 IPV4
Extract IP address from file using Python - GeeksforGeeks
核心思路:0-255拆分为三段:250-255,200-249,0-199
一个有趣的事情,看见过有资料将 0-199 的正则写成'[0-9]|[1-9][0-9]|1[0-9]{2}'
显然实际执行部分会出错,例如199会被匹配到1之后返回,主要就是|
导致。
'[01]?[0-9][0-9]?'
写法能够巧妙规避上述问题。
Python2和Python3的区别总结
关于print
print 在2.x中是语句,而在3.x中是内置函数
参考链接:
PEP 3105 – Make print a function | Python.org
What is the advantage of the new print function in Python 3.x over the Python 2 print statement? - Stack Overflow
【学习笔记】python2的print和python3的print() - 快斗之翼 - 博客园
关于除法
python2中/为取整
python3中/为除法(带小数),// 取整运算。 注:可记为python3与数学保持一致。
关于import 的绝对和相对导入
绝对和相对是针对包内导入而言
python2 默认使用Relative Imports(相对导入)
python3 所有的import
形式不能由.
开始且被解释为Absolute Imports(绝对导入:始终从sys.path访问的模块或包)。相对导入唯一可以接受的语法是from .[module] import name
。
参考链接:
PEP 328 – Imports: Multi-Line and Absolute/Relative | Python.org
Absolute vs Relative Imports in Python – Real Python
关于Raising Exceptions
python2支持raise ValueError, "not support parameter type"
python3只能raise ValueError( "not support parameter type")
关于迭代器
python3.x,迭代器对象实现的是__next__()方法,不是next()。并且,在python3.x中有一个内建函数next(),可以实现next(it),访问迭代器,这相当于于python2.x中的it.next()(it是迭代对象)
map 和 zip
python3中map
和zip
函数返回的是迭代器(对象),而在python2中直接返回对应列表。
这种改变碰到生成器和闭包的时候会带来截然不同的结果,例如下面的代码:
def test(cnt):
for i in range(cnt):
yield lambda x:x*i
d = [v(k) for k, v in zip(range(4), test(4))]
print(d)
# py2: [0, 3, 6, 9]
# py3: [0, 1, 4, 9]
关于字符编码
python2默认的编码是ascii,通过encode可以将对象的编码转换为指定编码格式(称作“编码”),而decode是这个过程的逆过程(称作“解码”)。避免中文乱码经验
关于nonlocal
Python2中没有nonlocal
关键字
Python的新式类和经典类
写这个源于我在看一篇关于@property
博文,我没有注意看该博文是针对Python3,当我在Python环境test 样例代码时发现@x.setter
不起作用。查询发现有人提及新类和旧类的区别,到官方手册查看property类的定义,发现果然是这个问题。
class P:
def __init__(self,x):
self.x = x
@property
def x(self):
return self.__x
@x.setter
def x(self, x):
if x < 0:
self.__x = 0
elif x > 1000:
self.__x = 1000
else:
self.__x = x
# 若是Python2可将上述旧类改为新类
class P(object):
参考链接:
New-style and classic classes
class property
参考文献
- Cheat Sheet: Writing Python 2-3 compatible code — Python-Future documentation
- 2to3 - Automated Python 2 to 3 code translation — Python 3.7.4 documentation
Python与其他语言差异较大之处总结
“万物皆对象”
- python编程中的所有数据由对象和对象的关系表示。
- python中一切皆是对象,对象有identity,value,type。
- python中的有些对象是mutable(可变的),有些对象是immutable(不可变的)。
- 一个对象的可变性取决于它的type,对于 instance(实例), numbers(数字), strings(字符串) and tuples(元组) 是 immutable, 而 dictionaries(字典) and lists(列表) 是 mutable.
- python中每个变量都是一个对象或者说是对象的引用或指针。也就是说变量可以理解为标签,对象有类型而变量无类型。
- 缩排规则
必须使用4个空格来表示每级缩排
Python编程
attrs
方便编写python类,具体体现在:类型注释,实例初始化,比较和排序,Hashing
attrs 22.1.0 documentation
这可能是 Python 面向对象编程的最佳实践_华为云开发者联盟的博客-CSDN博客
Probably the Best Practice of Object-Oriented Python — Attr | by Christopher Tao | Towards Data Science
cattrs
方便序列化和反序列化
cattrs 22.2.0.dev0 documentation
validator.py
validator.py — validator.py 0.4.0 documentation
其他特殊用途包
func_timeout
func-timeout · PyPI