Yahboom jetbot开源机器人学习(一)之RGB编程灯条的使用

看懂开源代码之前,先了解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 namemain:”也像是一个标志,象征着Java等语言中的程序主入口,告诉其他程序员,代码入口在此——这是“if namemain:”这条代码的意义之一。

详细使用参考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等属性绑上去:

猜你喜欢

转载自blog.csdn.net/Sonia8/article/details/112962616