Python学习笔记

这篇博客详细记录了Python编程的学习心得,包括Python3导入子文件模块的特性和命名空间包,type与object的关系,以及Python2与Python3的差异,如print函数、除法操作和import方式。还探讨了C/C++中的unsigned char *转化为numpy.ndarray的方法,处理ModuleNotFoundError问题,使用pydoc工具快速了解模块方法,以及查看Python内置函数源码的方法。此外,博主分享了提取和验证IPv4地址的技巧,并介绍了Python新式类与经典类的区别。
摘要由CSDN通过智能技术生成

写博客主要是作为个人笔记,也方便有需要的人可以阅读。由于知识水平有限难以保证博文的准确性,仅供参考,欢迎指正。

笔记大杂烩

关于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'

搜索发现此类问题很多,各式回答都有,诸如:

  1. python2和3 中tkinter的库名不同,python2首字母大写,python3小写
  2. 系统没有安装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中mapzip函数返回的是迭代器(对象),而在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

参考文献

  1. Cheat Sheet: Writing Python 2-3 compatible code — Python-Future documentation
  2. 2to3 - Automated Python 2 to 3 code translation — Python 3.7.4 documentation

Python与其他语言差异较大之处总结

“万物皆对象”

  1. python编程中的所有数据由对象和对象的关系表示。
  2. python中一切皆是对象,对象有identity,value,type。
  3. python中的有些对象是mutable(可变的),有些对象是immutable(不可变的)。
  4. 一个对象的可变性取决于它的type,对于 instance(实例), numbers(数字), strings(字符串) and tuples(元组) 是 immutable, 而 dictionaries(字典) and lists(列表) 是 mutable.
  5. python中每个变量都是一个对象或者说是对象的引用或指针。也就是说变量可以理解为标签,对象有类型而变量无类型。
  6. 缩排规则
    必须使用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

retrying · PyPI

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值