版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章
初识Python——05三层汉诺塔1场景导入2知识小百科3AI实验室4分享评价1场景导入汉诺塔(TowerofHanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。三层汉诺塔游戏模型,如所示。根据游戏规则,a柱上从上往下叠放着3个从小到大的盘子,需要借助b柱将a柱上所有的盘子全部转移到c柱上,且搬运过程中每个柱子上的盘子都应该保证从上往下盘子按从小到大的顺序排列。1场景导入汉诺塔模型从游戏任务的特征入手:如果要将a柱上的第3个盘子移动到c柱上去,那么就需要将前面2个盘子借助c柱搬到b柱上,然后再将第3个盘子放到c柱上去,最后再将b柱上那2个盘子借助a柱搬到c柱上去。仔细分析上述过程,可以推出实现三层汉诺塔游戏最少需要7步完成,三层汉诺塔的最少搬运过程如图所示:1场景导入汉诺塔搬运流程2知识小百科活动目标:学习模块化编程的方法学习常用的标准库搭建机械臂执行汉诺塔游戏系统Python的一大特色就是拥有非常完善的标准库和大量丰富的第三方库,可以方便的实现各种功能。库是具有相关功能模块的集合,库中有数量庞大的模块可供使用。1、什么是模块?当程序的功能比较多,规模比较大,不但编写的思路不易理清,阅读和维护也不方便。此时可以将复杂的问题按功能分解成若干个子问题(模块),先解决每个子问题(模块),再“组装”解决最终问题,这就是程序设计的模块化思想。(一)模块化编程模块是Python程序架构中的一个核心概念。一个复杂的Python程序一般是由团队合作开发完成的,这就要求团队成员各自负责部分Python程序的代码编写。例如在一个图书馆借书管理系统中,可能会把整个系统划分为图书管理、借书管理、读者管理、财务结算四个功能模块,系统的每个功能模块由团队的一个成员负责编写程序代码。这就是模块化编程的概念,模块化编程既有利于把复杂的功能分解为简单的功能,也有利于团队成员工作的划分,而且能够增加代码的共用性和可读性。(一)模块化编程Python中的模块实际上就是一个python程序文件,该文件中包含了一些函数、类、变量或者常量等,该文件的扩展名为py,我们可以通过导入模块的方式引用该文件,并且在新的python程序文件中使用该模块中的函数、类或者变量。因此,同样的函数、类或者变量只需编写一次,节省时间和精力,便于维护与修改。除了可以将其他程序员或者自己编写的python文件作为模块导入至程序中外,python系统自带了大量已经被安装好的模块,它们被称为“标准库”,它们可以直接被导入到程序中进行使用。(一)模块化编程特别说明:(1)模块如同工具包,通过导入模块来使用工具包中的工具。(2)每一个以扩展名py结尾的python代码文件都可以作为一个模块。(3)模块中的函数、类、常量、变量等都可以作为被使用的工具。2、模块如何导入?Python中导入模块使用import关键字。为了便于学习,先在同一路径下新建两个python文件模块:(一)模块化编程模块1为ModuleTestNumber1.py,代码如下:(一)模块化编程#定义变量name,赋值为"我是模块1"name="我是模块1"#定义一个函数AddTwoNumbers,返回两个数的和defAddTwoNumbers(a,b):returna+b模块2为ModuleTestNumber2.py,代码如下:(一)模块化编程#定义变量name,赋值为"我是模块2"name="我是模块2"#定义一个函数AddTwoNumbers,返回两个数和defAddTwoNumbers(a,b):returna+bimport使用语法有如下四种:(1)import模块名在模块1和2的相同路径下新建示例1程序ModuleTest1.py,代码如下:(一)模块化编程#导入ModuleTestNumber1模块importModuleTestNumber1#导入ModuleTestNumber2模块importModuleTestNumber#调用ModuleTestNumber1模块中的变量与函数,并打印执行结果示例1程序ModuleTest1.py代码的执行结果如所示:(一)模块化编程print(ModuleTestN)print(ModuleTestNumber1.AddTwoNumbers(3,2))#调用ModuleTestNumber2模块中的变量与函数,并打印执行结果print(ModuleTestN)print(ModuleTestNumber2.AddTwoNumbers(4,5))我是模块15我是模块29从执行结果可以看出:1)通过“模块名.函数名”或“模块名.变量”的方式就能轻松地使用模块中的函数或者变量了。2)导入时使用模块原名,如果该名字特别复杂,那么在代码中每次调用模块中的变量或函数都需要书写模块的全名,将会使代码整体显得臃肿、可读性差。3)该方法会导入模块中的所有变量、函数或类(尽管大部分变量或函数并没有被使用),使系统占用更多不必要的内存空间。(2)import模块名as别名在模块1和2的相同路径下新建一个示例2程序ModuleTest2.py,代码如下:(一)模块化编程(一)模块化编程#导入ModuleTestNumber1模块,别名为Module1importModuleTestNumber1asModule1#导入ModuleTestNumber2模块,别名为Module2importModuleTestNumber2asModule2#调用Module1中的变量与函数,并打印执行结果print(M)print(Module1.AddTwoNumbers(3,2))#调用Module2中的变量与函数并打印执行结果。print(M)print(Module2.AddTwoNumbers(4,5))示例2程序ModuleTest2.py代码的执行结果如下所示:(一)模块化编程我是模块15我是模块29从执行结果可以看出:与示例1程序执行结果相同,但是通过as关键字使用别名代替模块的原名,使代码更加精简、可读性更好;(3)from模块名import函数名/变量名/类名在模块1和2的相同路径下新建一个示例3程序ModuleTest3.py,代码如下:(一)模块化编程#导入ModuleTestNumber1模块中的name变量fromModuleTestNumber1importname#导入ModuleTestNumber2模块中的AddTwoNumbers函数fromModuleTestNumber2importAddTwoNumbers#调用name变量,并打印执行结果print(name)#print(AddTwoNumbers(3,2))(一)模块化编程#调用AddTwoNumbers函数,并赋值和执行打印结果#print(name)print(AddTwoNumbers(4,5))示例3程序ModuleTest3.py代码的执行结果如下所示。我是模块19从执行结果可以看出:1)可以正确使用模块中的变量与函数,单未被导入的变量或函数是无法被使用的。2)如果将代码中注释的print内容取消注释,那么程序会报错,因为该变量或函数未被导入,无法使用特别说明:当导入多个模块中重名的变量或函数时,应当避免使用from...import方法,因为该方法是直接调用导入的变量名或函数名,那么重名的变量或函数在调用时将无法准确确定对应的模块,系统默认对应最后调用的模块。因此,我们导入不同模块中包含相同函数名或变量名时,需要对该函数名或变量名取别名进行调用。(一)模块化编程(3)from模块名import*在模块1和2的相同路径下新建一个示例4程序ModuleTestFromImportAll.py,代码如下:(一)模块化编程#导入ModuleTestNumber1模块中的所有变量、函数fromModuleTestNumber1import*#调用name变量与AddTwoNumbers函数,并打印执行结果print(name)print(AddTwoNumbers(3,2))示例4程序ModuleTestFromImportAll.py的执行结果如下所示:(一)模块化编程我是模块15从执行结果可以看出:1)该方法可以导入模块中的所有“工具”或者所有的变量、函数等。使用时不需要模块名,直接使用变量名或函数名即可2)如果存在导入的多个模块出现变量名或函数名重名时,可以用别名的解决办法。3、模块说明文档在实际开发中,为了使自己或他人更加方便地使用模块,需要给模块编写说明文档;否则,其他开发者使用该模块时,将不知道它的功能及作用。给模块编写说明文档非常简单,只需要在说明文档的开头与结尾分别加上三个英文模式下的单引号即可。特别说明:一般模块说明位于模块程序的最前面,即模块的一般结构是“模块说明”+“import导入程序”+“程序代码正文”。(一)模块化编程标准库非常庞大,所提供的组件涉及范围十分广泛。这个库包含了多个内置模块,Python程序员必须依靠它们来实现系统级功能,此外还有大量以Python编写的模块,提供了日常编程中许多问题的标准解决方案。其中有些模块经过专门设计,通过将特定平台功能抽象化为平台中立的API来鼓励和加强Python程序的可移植性。以下介绍几种常用系统标准库的功能及使用方法。(二)常用标准库1、random模块random模块的作用是生成随机数,主要包括random()、randint()、choice()、seed()等函数,下面分别举例介绍3个。(1)random()函数random()函数在2.4节中已有介绍,这里不再赘述。需要强调的是,该函数在使用时,一定要先引入random模块才可使用,否则系统报错。(2)randint()函数randint(a,b)函数可以用于生成一个在a~b之间的随机整数(该取值包括a和b),(二)常用标准库例如新建程序RandintTest.py,代码如下:(二)常用标准库#导入random标准库importrandom#使用random()函数,打印该随机数a=random.randint(1,10)print(a)程序RandintTest.py的执行结果是4,多次执行时,该数据均不同,且每次均是1~10之间的整数。(3)choice()函数choice(seq)函数的作用是从序列seq中随机选取一个元素,例如新建程序ChoiceTest.py,代码如下(二)常用标准库#导入random标准库importrandom#使用random()函数,打印该随机数a=random.choice([1,2,"a",4,5])print(a)程序ChoiceTest.py的执行结果是4,多次执行时,该数据均不同,且每次均是序列中的元素。2、time模块time模块是一个与时间相关的模块,主要包括sleep()、time()、localtime()、ctime()、strftime()等函数,下面分别举例介绍其中两个。(1)sleep()函数sleep(x)函数是延时函数,推迟调用线程的运行,x指秒数,如新建程序SleepTest.py,代码如下:(二)常用标准库(二)常用标准库#导入time标准库importtime#每隔1秒,循环输出"你好"whileTrue:time.sleep(1)print("你好")程序SleepTest.py的执行结果是每隔1秒循环输出1次“你好”。(2)time()函数time()函数是一个时间戳函数,可以获得从1970年1月1日0时0分0秒起至今的秒数总和,例如新建程序TimeTest.py,代码如下:(二)常用标准库#导入time标准库importtime#每隔1秒,循环输出时间戳whileTrue:time.sleep(1)a=time.time()print(a)程序TimeTest.py的执行结果如下所示:(二)常用标准库1574705008.18201571574705009.18248921574705010.18331481574705011.1833432时间戳单位最适于做日期运算。但是1970年之前的日期就无法以此表示了。太遥远的日期也不行,UNIX和Windows只支持到2038年。3、sys模块sys模块是一个与python解释器亲密相关的模块,主要包括path属性、platform属性、exit()函数等。(1)path属性path用于记录python中已经安装的库(模块)的路径,它以列表的形式进行存储,例如新建程序PathTest.py,代码如下:(二)常用标准库#导入sys模块importsys#打印python中已经安装的库(模块)的路径print(sys.path)以上程序的执行结果是打印了python已安装的库(模块)的路径。(2)exit()函数exit()函数用于退出当前程序,通常用于退出主线程,执行时会抛出SystemExit(系统退出)异常,该异常需要通过异常捕获代码进行捕获。例如新建程序ExitTest.py,代码如下:(二)常用标准库(二)常用标准库#导入sys模块importsys#打印"hello"print('hello')#退出进程sys.exit(0)#打印"python"print('python')以上程序的执行结果是打印了“hello”之后便结束了程序,打印“python”的语句没有执行;通常用exit(0)表示正常退出,用exit(1)表示异常退出。(3)platform属性platform属性用于返回当前系统的平台标识。例如新建程序PlatformTest.py,代码如下:(二)常用标准库#导入sys模块importsys#打印当前操作系统print(sys.platform)以上程序的执行结果是打印了"win32",表明当前操作系统是window操作系统;如果是linux操作系统则返回"linux",如果是Mac操作系统则返回"darwin"。4、os模块os模块提供了非常丰富的方法用来处理文件和目录。主要包括系统操作与目录操作。下面主要介绍getcwd()函数、getsize()函数、remove()函数、rename()函数、exists()函数。首先在同级目录下新建文件夹(osTest),并在文件夹内创建2个文本文件test1.txt、test2.txt和GetcwdTest.py。(二)常用标准库(1)getcwd()函数getcwd()函数用于获得当前执行程序的文件路径,程序GetcwdTest.py,代码如下:(二)常用标准库#导入os模块importos#打印当前路径print(os.getcwd())以上程序GetcwdTest.py执行的结果是“H:\Python教材\代码清单\osTest”,路径打印结果正确。(2)path.getsize()函数path.getsize()函数用于获得某个文件的大小,例如在test1.txt同级目录下新建GetSizeTest.py,代码如下:(二)常用标准库importos#打印同级目录下test1.txt文件的大小print(os.path.getsize('test1.txt'),'字节')以上程序GetSizeTest.py执行的结果是“0字节”,文件大小打印结果正确(3)remove()函数remove()函数用于删除某个文件,例如在test1.txt同级目录下新建RemoveTest.py,代码如下:(二)常用标准库importos#删除同级目录下的test1.txt文件os.remove('test1.txt')以上程序RemoveTest.py执行的结果是将“H:\Python教材\代码清单\osTest”文件夹下的test1.txt文件删除了,执行结果正确(4)rename()函数rename()函数用于重命名某个文件,例如在osTest目录下新建RenameTest.py,代码如下:(二)常用标准库importos#将test2.txt文件重命名为hello.pngos.rename("test2.txt","hello.png")以上程序RenameTest.py执行的结果是将“H:\Python教材\代码清单\osTest”文件夹下的test2.txt文件重命名为hello.png,执行结果正确。(5)path.exists()函数path.exists()函数用于判断某个文件是否存在,例如在osTest目录下新建ExistsTest.py,继续对osTest文件夹进行操作,代码如下:(二)常用标准库importos#判断test1.txt、test2.txt和hello.png是否存在print(os.path.exists("test1.txt"))print(os.path.exists("test2.txt"))print(os.path.exists("hello.png"))以上程序ExistsTest.py执行的结果是False,False和True,执行结果正确。5、urllib模块urllib模块同样是python自带的标准库,无需安装,直接可以使用。该模块用于通过http请求对URL进行处理,常用于爬取网页。Python3的urllib模块整合了urllib2等模块,包含较多子模块。request子模块是最基本的http请求模块,用来模拟发送请求;本书重点介绍request子模块中的urlopen()函数。urlopen()函数用于打开网页,通过请求对象,返回一个HTTPResponse类型的对象,该对象包含以下方法和属性:(二)常用标准库(1)方法:read()、readinto()、getheader(name)、getheaders()、fileno()等;(2)属性:msg、version、status、reason、bebuglevel、closed等;例如新建UrlopenTest.py,执行以下程序代码:(二)常用标准库#加载urllib模块importurllib.request#请求站点获得一个HTTPResponse对象response=urllib.request.urlopen('')(二)常用标准库#返回网页内容#print(response.read().decode('utf-8'))#返回检索的URL#print(response.geturl())#返回网页的头信息#print(())#返回响应的HTTP状态码#print(response.getcode())#访问成功则返回ok#print(response.msg)#返回状态信息#print(response.reason)上述程序UrlopenTest.py执行中,读者可以根据需要,在运行前去掉相应print函数前的#,验证对应注释中的内容;改变代码中response对应的URL地址,再次运行代码可以获得不同的输出结果;代码中的decode()表示以指定的编码格式输出,编码格式主要包括UTF-8,GBK,GB2312,ASCII等。特别说明:Python中模块使用之前必须进行导入,尽量按照这样的顺序:Python标准库、第三方库、自定义模块。(二)常用标准库3AI实验室(一)任务发布目标设计机械臂三层汉诺塔游戏控制系统要求(1)利用机械臂自动完成三层汉诺塔游戏的搬运控制系统,如图所示。(2)使用模块化编程与常用标准库,结合机械臂运动起来完成任务。示意图本任务软件环境需要配置好python3.x语言环境,并安装有相应的编程集成开发环境,本书使用VScode集成开发环境(Windowsx64UserInstaller版本)硬件环境如下表所示:(二)任务环境硬件图示名称数量机械臂1台USB串口通信线1条电源适配器1套汉诺塔模型1套1、实现三层汉诺塔游戏程序利用机械臂自动完成三层汉诺塔游戏的搬运控制系统,根据游戏规则,完成三层汉诺塔游戏至少需要7步点到点运动控制指令,具体如下所示:第1步:A-->C第2步:A-->B第3步:C-->B第4步:A-->C第5步:B-->A第6步:B-->C(三)任务实施第7步:A-->C特别说明:(1)代码中A柱、B柱、C柱的坐标,以及每个盘子的高度希望要根据实际情况进行设置。(2)本任务控制系统中,主要通过dexarm.move_to(x,y,z,feedrate)函数控制机械臂的移动轨迹,通过dexarm.air_picker_pick()、dexarm.air_picker_place()函数控制吸盘拿起、放下汉诺塔圆盘。因此,程序中的坐标点位置需要根据实际情况进行设置。(三)任务实施会因为盘子个数的不同而发生变化,所以每次移动都要注意A柱、B柱、C柱Z轴坐标的变化。(三)任务实施(2)代码分析#机械臂控制类frompydexarmimportDexarm#通信类importsocket#连接机械臂,并初始化dexarm=Dexarm("COM3")#移动到安全位dexarm.go_home()print('Starting...')(三)任务实施#汉诺塔#
创建变量PointA=[90,240,-56]PointB=[25,245,-66]PointC=[-27,250,-66]i=0#将A柱上的圆盘分别拆到B柱和C柱foriinrange(2):#运动到上方
dexarm.move_to(PointA[0],
PointA[1],PointA[2]+40)(三)任务实施#汉诺塔#
创建变量PointA=[90,240,-56]PointB=[25,245,-66]Poin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 统计师资格考试统计推断专项训练题库及答案
- 广东省深圳市龙岗区2019-2020学年七年级上学期期末道德与法治试题(含答案)
- 吉林成考专升本语文全套真题汇编
- 2026镇宁自治县工商业联合会公开招聘公益性岗位人员1人考试参考题库及答案解析
- 2026山东威海市乳山市大孤山镇城镇公益性岗位招聘1人考试备考题库及答案解析
- 2026重庆铜梁区政府专职消防员和消防车驾驶员招录15人考试参考题库及答案解析
- 2026年锦州市公安局招聘警务辅助人员127人考试备考题库及答案解析
- 康定市卫生健康局公开招募中医类临聘人员(2人)考试参考题库及答案解析
- 2026年中石化山西石油分公司人员招聘考试模拟试题及答案
- 2026年甘肃省兰州大学威尔士学院聘用制外籍教师招聘笔试参考题库及答案解析
- 精益生产管理培训制药
- 公共关系处理培训课件
- 2026年团员入团知识测试题(各地真题)
- 船舶新能源技术
- JJG(交通) 179-2022 锚杆拉拔仪检定规程
- 上海上海市2026年教师职称考试(自然、科学学科知识)在线题库及答案解析(小学)
- 《“十五五”规划建议》时政考试300题(附答案)
- 2025国家基层糖尿病防治管理指南解读课件
- 肝炎病毒检测指南培训
- 麻精应急预案
- 林木居间协议合同范本
评论
0/150
提交评论