在嵌入式智能小车项目中,涉及到很多模块的控制,比如小车的移动方式,避障以及循迹导航等,这就涉及到更高级的编程策略,需要用到模块化编程,面向对象思想以及多线程运行方式。
1,模块化编程相关内容:
在python中,将一些常用变量,方法等定义到.py文件中,之后在编程的时候通过import该文件,进而调用该文件中的方法的方式即为模块化编程,而这个被调用文件即为模块。python中有很多标准库,可以直接拿来用,不用自己定义,比如sys,math,最为出色的就是机器学习相关的一些库,如scikit-learn,pandas等
在我们自定的模块调用中,需要将待调用的文件放到当前文件目录或者python的系统搜索路径(import sys; print sys.path获取)中,下面是对于标准库和自定义模块的示例:
代码文件 | 测试输出 |
#!/usr/bin/python3 # 文件名: using_sys.py import sys #标准库 print('命令行参数如下:') for i in sys.argv: print(i) print('\n\nPython 路径为:', sys.path, '\n') |
$python using_sys.py param1 param2 -->output: 命令行参数如下: using_sys.py param1 param2 |
#!/usr/bin/python3 # 文件名: support.py #自定义模块库 def print_func( par ): print ("Hello : ", par) return #!/usr/bin/python3 # test.py 调用模块 import support # 导入模块 # 调用模块里包含的函数 support.print_func("Runoob") |
$python test.py -->output Hello: Runoob |
直接import modulename则可通过modulename.function()方式调用模块函数,或者可以通过from .... import仅调用我们需要的模块,比如斐波那契(fibonacci)数列模块名为fibo,包含函数fib(n) & fib2(n),用法1:import fibo ; fibo.fib(20) 调用 用法2:from fibo import fib ; fib(20)调用(from modulename import *则是导入该模块中的所有函数)
- 特点:
__name__属性:模块被引入时,若要模块中的某一程序块不执行,可以用__name__属性来使该程序块仅在该模块自身运行时执行。
dir()函数:内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回: >>>dir(fibo) -->output: ['__name__', 'fib', 'fib2']
- 包:包是一种管理 Python 模块命名空间的形式,采用"点模块名称"
比如一个模块的名称是 A.B, 那么他表示一个包 A中的子模块 B
比如下面对音频处理的包结构:
sound/ | 顶层包 |
__init__.py formats/ __init__.py wavread.py wavwrite.py 。。。 |
初始化sound包 文件转换格式子包
|
effects/ __init__.py echo.py |