看懂开源代码之前,先了解GPIO是什么……
GPIO,全称General-purpose input/output,也就是通用输入/输出端口,通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。
用户可以通过GPIO口和硬件进行数据交互(如UART),控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。
1. python中的模块、包、库的区别:
python模块:包含并且有组织的代码片段为模块。
表现形式为:写的代码保存为文件。这个文件就是一个模块。例如sample.py 其中文件名sample为模块名字。
[外链图片转存失败,源站可能有防盗在这里插入!链机制,建描述]议将图片上https://传(imblog.csdng.-n/2024bFw10122163908382.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHMibG9nLmNzZG4ubmV6L1NvbmlhOA==,size_1L,color_FFFFFF,t_70#pic_center968)(mhttps://img-blog.csdnimg.cn/20210122163908382.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NvbmlhOA==,size_16,color_FFFFFF,t_70#pic_center)]
上图是对Module的一些描述和介绍,可以用不同的方式引用module,比如下面要了解的import …//import…as…//from…import…等等。
python中的包:包是一个有层次的文件目录结构,它定义了由n个模块或n个子包组成的python应用程序执行环境。通俗一点:包是一个包含__init__.py 文件的目录,该目录下一定得有这个__init__.py文件和其它模块或子包。
再通俗一点,包的本质就是一个含有.py的文件的文件夹。
2. import 和 from和 as 用法:
import用来导入模块,进而可以访问模块中的对象,例如:
import math
print math.pi #导出圆周率的值
>>>3.14159265359
而我们也可以使用from 的方式,from会把变量名pi复制到另一个作用域,所以它就可以直接在脚本中使用复制后的变量名,而不用通过模块。
from A import B 是从A模块导入B工具(可以是某个 函数,全局变量,类),import A是导入整个A模块的全部内容(包括全部的函数,全局变量,类)。
例如:
from math import pi
print pi
>>>3.141592653589793
但是如果用到math里的其他变量还需要一个个的导入,所以我们也可以一批次导入:
from math import *
pi
cos(pi)
>>>3.141592653589793
>>>> -1.0
还有一个常用到的是import…as…
假如你嫌math这个包名称不好,想要给它取个别名,以后每次用到它的时候都用它的别名代替它,这时就需要用到import…as,例子如下:
import math as dt
print(dt.pi)
import Adafruit_GPIO as GPIO
想要快速看懂:
https://blog.csdn.net/colourful_sky/article/details/76114508
3. class … (object)
python用class定义类,定义方式:class后面加一个空格然后加类名。类名后面的小括号里是本类基于某个类定义,属于继承相关知识,暂时统一写object。继承object类是为了让自己定义的类拥有更多的属性,以便使用。当然如果用不到,不继承object类也可以。
class Programing_RGB(object):
4. if__name__=='main '怎么理解
Python是一种解释型脚本语言,在执行之前不同要将所有代码先编译成中间代码,Python程序运行时是从模块顶行开始,逐行进行翻译执行,所以,最顶层(没有被缩进)的代码都会被执行,所以Python中并不需要一个统一的main()作为程序的入口。
在某种意义上讲,“if name’main:”也像是一个标志,象征着Java等语言中的程序主入口,告诉其他程序员,代码入口在此——这是“if name’main:”这条代码的意义之一。
详细使用参考https://blog.konghy.cn/2017/04/24/python-entry-program/
5.def的用法
(扩展)函数分类:
● 内荐函数 如max() reverse()
● 库函数 如math() ceil()
● 自定义函数 使用def()关键字定义
函数定义
def function name (parameter):
function body
return
● 函数名就是标识符,命名要求与变量命名要求一样
● 语句块必须缩进,预定4个空格
● Python的函数若没有return语句,会隐式返回一个None值
● 定义中的参数列表称为形式参数,只是一种符号标识符
传参方式
(1) 位置传参
定义def fun(x,y,z),调用 fun(1,2,3),按照参数定义顺序传入实参.
(2) 关键字传参
定义时def fun(x, y, z),调用使用 fun(x=1, y=3, z=5),使用形参的名字来传入实参的方式,如果使用了形参名字,那么传参顺序就可和定义顺序不同
!!!要求位置参数必须在关键字参数之前传入!!!
def get_i2c_device(self,address, i2c, i2c_bus):
if i2c is not None:
return i2c.get_i2c_device(address)
else:
import Adafruit_GPIO.I2C as I2C
if i2c_bus is None:
return I2C.get_i2c_device(address)
else:
return I2C.get_i2c_device(address, busnum=i2c_bus)
6.try和except介绍
在python中,try/except语句主要是用于处理程序正常执行过程中出现的一些异常情况,如语法错(python作为脚本语言没有编译的环节,在执行过程中对语法进行检测,出错后发出异常消息)、数据除零错误、从未定义的变量上取值等;
格式:
try:
Normal execution block
except A:
Exception A handle
except B:
Exception B handle
except:
Other exception handle
else:
if no exception,get here
finally:
print("finally")
例如:
def Set_All_RGB(self, R_Value, G_Value, B_Value):
try:
self._device.write8(0x00,0xFF)
self._device.write8(0x01,R_Value)
self._device.write8(0x02,G_Value)
self._device.write8(0x03,B_Value)
except:
print ('Set_All_RGB I2C error')
正常执行的程序在try下面的Normal execution block执行块中执行,在执行过程中如果发生了异常,则中断当前在Normal execution block中的执行,跳转到对应的异常处理块中开始执行;
python从第一个except X处开始查找,如果找到了对应的exception类型则进入其提供的exception handle中进行处理,如果没有找到则直接进入except块处进行处理。except块是可选项,如果没有提供,该exception将会被提交给python进行默认处理,处理方式则是终止应用程序并打印提示信息;
如果在Normal execution block执行块中执行过程中没有发生任何异常,则在执行完Normal execution block后会进入else执行块中(如果存在的话)执行。
无论是否发生了异常,只要提供了finally语句,以上try/except/else/finally代码块执行的最后一步总是执行finally所对应的代码块。
需要注意的是:
1.在上面所示的完整语句中try/except/else/finally所出现的顺序必须是try–>except X–>except–>else–>finally,即所有的except必须在else和finally之前,else(如果有的话)必须在finally之前,而except X必须在except之前。否则会出现语法错误。
2.对于上面所展示的try/except完整格式而言,else和finally都是可选的,而不是必须的,但是如果存在的话else必须在finally之前,finally(如果存在的话)必须在整个语句的最后位置。
3.在上面的完整语句中,else语句的存在必须以except X或者except语句为前提,如果在没有except语句的try block中使用else语句会引发语法错误。也就是说else不能与try/finally配合使用。
7.self介绍
在介绍Python的self用法之前,先来介绍下Python中的类和实例……
我们知道,面向对象最重要的概念就是类(class)和实例(instance),类是抽象的模板,比如学生这个抽象的事物,可以用一个Student类来表示。而实例是根据类创建出来的一个个具体的“对象”,每一个对象都从类中继承有相同的方法,但各自的数据可能不同。
1、以Student类为例,在Python中,定义类如下:
class Student(object):
pass
(Object)表示该类从哪个类继承下来的,Object类是所有类都会继承的类。
2、实例:定义好了类,就可以通过Student类创建出Student的实例,创建实例是通过类名+()实现:
student = Student()
比如初始化RGB对象:
from RGB_Lib import Programing_RGB
RGB = Programing_RGB()
3、由于类起到模板的作用,因此,可以在创建实例的时候,把我们认为必须绑定的属性强制填写进去。这里就用到Python当中的一个内置方法__init__方法,例如在Student类时,把name、score等属性绑上去: