機(jī)器人操作系統(tǒng)ros原理與應(yīng)用_第1頁(yè)
機(jī)器人操作系統(tǒng)ros原理與應(yīng)用_第2頁(yè)
機(jī)器人操作系統(tǒng)ros原理與應(yīng)用_第3頁(yè)
機(jī)器人操作系統(tǒng)ros原理與應(yīng)用_第4頁(yè)
機(jī)器人操作系統(tǒng)ros原理與應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩184頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

--PAGE10前機(jī)器人是集機(jī)械、電子、自動(dòng)化、計(jì)算機(jī)、傳感器、人工智能等多學(xué)科及前沿技術(shù)于一身的可編程設(shè)備,是國(guó)家制造技術(shù)能力發(fā)展的制高點(diǎn)。目前,工業(yè)機(jī)器人的發(fā)展已經(jīng)趨于標(biāo)準(zhǔn)化、模塊化、功能也越來(lái)越強(qiáng)大,可以說(shuō),工業(yè)機(jī)器人自第一次工業(yè)起到現(xiàn)在已經(jīng)進(jìn)入了穩(wěn)定家用服務(wù)、醫(yī)療服務(wù)等專(zhuān)業(yè)服務(wù)類(lèi)為代表的智能機(jī)器人呈現(xiàn)出欣欣向榮的發(fā)展態(tài)勢(shì)置,也與其軟件平臺(tái)的功能和性能密切相關(guān)。作為開(kāi)源的機(jī)器人操作系統(tǒng)(RobotOperatingSystem,ROS)不僅提供了智能機(jī)器人所需的環(huán)境感知、運(yùn)動(dòng)控制、于擴(kuò)展等特點(diǎn),逐漸已經(jīng)成為智能機(jī)器人開(kāi)發(fā)的標(biāo)準(zhǔn)平臺(tái)。在智能服務(wù)機(jī)器人、無(wú)人駕駛、工業(yè)機(jī)器人等領(lǐng)域都取得了良好的應(yīng)用。制技術(shù)制定行之有效的路徑規(guī)劃方法可以讓機(jī)器人更加智能化,而ROS提供了常用的SLAM提到無(wú)人駕駛就不得不提到的poo平臺(tái),其背后就隱藏著RS的身影,自動(dòng)駕駛系統(tǒng)非常復(fù)雜,包含感知、物檢測(cè)、決策、車(chē)輛控制等模塊,把這么多功能各異的模塊集成在一起,組成一個(gè)完整的系統(tǒng)并完成自動(dòng)駕駛的任務(wù),這是一個(gè)非常大。通過(guò)對(duì)ROS的集成與修改實(shí)現(xiàn)了ROS在無(wú)人駕駛領(lǐng)域的適配,并成功的造就了Apolo平臺(tái)的誕生。詳細(xì)內(nèi)容可參考 /poloAuoapolo-torm。就工業(yè)機(jī)器人來(lái)講,ROS有一個(gè)單獨(dú)的分支,叫做ROS-Industral(ROS-I)。ROS作為逐漸流行的軟件框架,當(dāng)然不會(huì)放過(guò)工業(yè)機(jī)器人這個(gè)龐大而成市場(chǎng),所以ROS-I出現(xiàn)的目的就是希望將ROS于工業(yè)機(jī)器人,在解決兼容性問(wèn)題的基礎(chǔ)上,拓展垂直行業(yè)的典型應(yīng)用。ROS-I針對(duì)工業(yè)機(jī)器人定義了一套通用協(xié)議—simpe_messae,已經(jīng)開(kāi)始對(duì)各大品牌工業(yè)機(jī)器人的支持。說(shuō)了這么多,那如何行之有效的學(xué)習(xí)ROS呢其次,雖然說(shuō)ROS不依賴(lài)任何特定的編程語(yǔ)言,也已經(jīng)支持多種不同的語(yǔ)言實(shí)現(xiàn),例如++、Python、Octave和LISP,但對(duì)于初學(xué)者來(lái)說(shuō),我們建議對(duì)Python有一定的了解和編程功底。最后,我們需要對(duì)ROS的基礎(chǔ)框架、通信協(xié)議、開(kāi)發(fā)工具、功能包等進(jìn)行系統(tǒng)的學(xué)習(xí)。本書(shū)的編寫(xiě)亦是按照這樣的步驟來(lái)編寫(xiě),并且對(duì)Linux和Pyhon知識(shí)點(diǎn)進(jìn)行了選擇性裁剪,希望能以微薄之力,幫助初學(xué)者盡快上手ROS,進(jìn)而為我國(guó)機(jī)器人事業(yè)添磚加瓦。由于編者能力有限,書(shū)中難免有不到之處,煩請(qǐng)各位指正預(yù)備 Chapter1LINUX基 Linux的 Linux應(yīng)用領(lǐng) 結(jié) 用戶(hù)管 查看用戶(hù)列 查看用戶(hù) 創(chuàng)建用戶(hù)賬 刪除用戶(hù)賬 文件管 查看文件屬 修改文件權(quán) 管 常用命 echo重定向與追 打包操 文本編 什么是 vim的三種模 vim的使用方 Chapter2PYTHON基 平臺(tái)搭 Python python平臺(tái)搭 語(yǔ)言基 語(yǔ)法初 數(shù)據(jù)類(lèi) 變量與常 控制 數(shù)據(jù)結(jié) 列表 元組 字典 集合 切片索 函數(shù)編 創(chuàng)建函 遞歸函 內(nèi)置函 面向?qū)?類(lèi)和實(shí) 數(shù)據(jù)封 繼承和多 實(shí)例屬性和類(lèi)屬 基礎(chǔ) Chapter1機(jī)器人及其發(fā)展概 機(jī)器人的概念及特 機(jī)器人的由 機(jī)器人的定 機(jī)器人的主要特 機(jī)器人的組成與分 機(jī)器人的組 機(jī)器人的分 按照機(jī)器人的技術(shù)發(fā)展水 按機(jī)器人的機(jī)構(gòu)特 按照機(jī)器人的用途 智能機(jī)器 智能機(jī)器人的定 腦科學(xué)與智能機(jī)器 人工智能在機(jī)器人中的應(yīng) 智能機(jī)器人發(fā)展展 Chapter2ROS概 初識(shí)ROS操作系 ROS架構(gòu)分 ROS通信機(jī) Chapter2ROS基 搭建ROS操作系 第一個(gè)ROS例 文件系統(tǒng)工 使用 使用 使用 使用 使用 創(chuàng)建工作空 創(chuàng)建工作空 工作空 解 功能包的創(chuàng)建與編 catkin功能包的組 創(chuàng)建程序 程序包依賴(lài)關(guān) 程序包命名規(guī) 刪除程序 編譯功能 啟動(dòng) 使用 控制turtle移 查看節(jié)點(diǎn)信 查看話題信 使用 ROS服務(wù)和參 使用rosparamdump和 創(chuàng)建ROS消息和ROS服 消息(msg)和服務(wù)(srv)介 使用 使用 編寫(xiě)發(fā)布器與訂閱 定義msg消 創(chuàng)建發(fā)布器節(jié) 創(chuàng)建訂閱器節(jié) 啟動(dòng)rqt查看節(jié)點(diǎn)信 編寫(xiě)服務(wù)端和客戶(hù) 定義srv服 編寫(xiě)服務(wù) 編寫(xiě)客戶(hù)端代 編寫(xiě)launch文 roslaunch使用方 編寫(xiě)launch文 Chapter3ROS常用工 RViz安裝和使 RViz界面顯 rqt安裝和使 rqt主要插 Chapter4SLAM技 激光SLAM框 數(shù)據(jù)和處 4.2.1測(cè)距的基本原 運(yùn)動(dòng)畸變?nèi)?激光SLAM前端配準(zhǔn)方 ICP匹配方法(Point- PL-ICP匹配方法(Point- 基于優(yōu)化的匹配方 后端優(yōu) 基于濾波器的激光SLAM方 貝葉斯濾 粒子濾 基于圖優(yōu)化的激光SLAM方 首先,我們需要考慮一個(gè)最簡(jiǎn)單的最小二乘問(wèn)題 回環(huán)檢 基于定位的地圖構(gòu) 地圖分 覆蓋柵格建圖算 SALM_Gmap功能 約束條 SLAM執(zhí)行過(guò) ROS機(jī)器人導(dǎo)航簡(jiǎn) 全局路徑規(guī) 局部實(shí)時(shí)路徑規(guī) 本章小 5競(jìng)速 預(yù)備ChapterLINUX基Linux簡(jiǎn)Linux內(nèi)核最初只是由芬蘭人·托瓦茲(LinusTorvalds)在赫爾辛基大學(xué)上學(xué)Lnux是一套免費(fèi)使用和自由的類(lèi)Unx操作系統(tǒng),是一個(gè)基于POSIX和UNIX的多用戶(hù)、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。它支持32位和64位硬件。Lnux繼承了Unix以網(wǎng)絡(luò)為的設(shè)計(jì)思想,是一個(gè)性能穩(wěn)定的多用戶(hù)網(wǎng)絡(luò)操作系統(tǒng)。Linux的Lnux的版說(shuō)簡(jiǎn)單點(diǎn)就是將Linux內(nèi)核與應(yīng)用軟件做一個(gè)打包。目前市面上較知名的版有:Ubunu、RedHat、CentOS、Deban、Fedora、SuSE、OpenSUSE、TurboLinux、Blueont、RedFag、Xterm、SlackWare等。如圖所示,本書(shū)采用ubunu1604作為軟件平臺(tái),ROS亦是安裝再u(mài)bunu之上的。Ubunu基于Deban版和GNOME桌面環(huán)境,而Ubunu的目標(biāo)在于為一般用戶(hù)提一個(gè)的、同時(shí)又相當(dāng)穩(wěn)定的主要由自由軟件構(gòu)建而成的操作系統(tǒng)。Ubuntu具有龐大的社區(qū)力量,用戶(hù)可以方便地從社區(qū)獲得幫助。Linux應(yīng)用領(lǐng)域今天各種場(chǎng)合都有使用各種Lnux版,從嵌入式設(shè)備到超級(jí)計(jì)算機(jī),并且在服務(wù)器領(lǐng)域確定了地位,通常服務(wù)器使用LAMP(Linux+Apache+MySQL+PHP)或LNMP(Linux+Nginx+MySQL+PHP)Linux不僅在家庭與企業(yè)中使用,并且在巴 由于支持Linux而世界聞名中民為取得技術(shù)獨(dú)立,在龍芯過(guò)程中排他性地使用Linux在西班牙的一些地區(qū)開(kāi)發(fā)了自己的Linux發(fā)布版,并且在與教育領(lǐng)域廣泛使用,Extremadura地區(qū)的gnuLinEx和Andalusia地區(qū)的Guadalinex葡萄牙同樣使用自己的Linux發(fā)布版CaixaMagica,用于Magalhes筆記本電腦和e-esc法國(guó)和德國(guó)同樣開(kāi)始逐步采用Linux結(jié)Linux下的文件系統(tǒng)為樹(shù)形結(jié)構(gòu),為/樹(shù)形結(jié)構(gòu)下的文件 :無(wú)論哪個(gè)版本的Li 但總體來(lái)說(shuō),還是大體相近的登錄linux系統(tǒng)后,點(diǎn)擊鼠標(biāo)右鍵 Terminal,在當(dāng)前命令窗口下輸入命令lsls可以看到如下所示 結(jié)構(gòu)$$lsbinbootdevetchomeliblib64mediamntoptprocrootrunsbinls指令時(shí)list單詞的縮寫(xiě),/類(lèi)似于windows的磁盤(pán)符,ls/相當(dāng)于再windows下打開(kāi)CLinux樹(shù) 結(jié)構(gòu)是Binary的縮寫(xiě) 這 存放著最經(jīng)常使用令這里存放的是啟動(dòng)Linux時(shí)使用的一些文件,包括連接文件以及鏡像文件dev是Device(設(shè)備)的縮寫(xiě),該 這 用來(lái)存放所有的系統(tǒng)管理所需要的配置文件和 ,在Linux中,每個(gè)用戶(hù)都有一個(gè)自己的 這 里存放著系統(tǒng)最基本的動(dòng)態(tài)連接共享庫(kù),其作用類(lèi)似 里 文件。幾乎所有的應(yīng)用程序都需要用到這些共享庫(kù)這 一般情況下是空的,當(dāng)系統(tǒng)關(guān)機(jī)后,這里就存放了一些文件 系統(tǒng)提供 是為了讓用戶(hù)臨時(shí)掛載別的文件系統(tǒng)的,我們可以將光驅(qū)掛載/mnt/上,然后進(jìn)入 就可以查看光驅(qū)里的內(nèi)容了 。比如你安裝一個(gè)ORACLE數(shù)據(jù)庫(kù)則就可 這 是一個(gè)虛擬 ,它是系統(tǒng)內(nèi)存的映射,我們可以通過(guò)直接這 某些文件,比如可以通過(guò)下面令來(lái)主機(jī)的命令,使別人無(wú)法你的機(jī)器echoecho1> 為系統(tǒng)管理員,也稱(chēng)作超級(jí)權(quán)限者的用戶(hù) s就是SuperUser 存放一些服務(wù)啟動(dòng)之后需要提取的數(shù)據(jù)這 是用來(lái)存放一些臨時(shí)文件的這是一個(gè)非常重要 ,用戶(hù)的很多應(yīng)用程序和文件都放在這 下,類(lèi)似 系統(tǒng)用戶(hù)使用的應(yīng)用程序超級(jí)用戶(hù)使用的比較高級(jí)的管理程序和系統(tǒng)守護(hù)程序內(nèi)核源代碼默認(rèn)的放 在lnux系統(tǒng)中,有幾個(gè) 是比較重要的,平時(shí)需要注意不要誤刪除或者隨意更改內(nèi)部文件。 系統(tǒng)配置文件,如果你更改了 下的某個(gè)文件可能會(huì)導(dǎo)致系統(tǒng)不能啟動(dòng)/bin,/sbin,/usr/bin,/usr/sbin:這是系統(tǒng)預(yù)設(shè)的執(zhí)行文件的放置,比如ls就是在/bin/ls下的。值得是,/bin,/usr/bin是給系統(tǒng)用戶(hù)使用的指令(除root外的通用戶(hù)),而/sbin,/usr/sbin則是給root使用的指令。var:這是一個(gè)非常重要的 ,系統(tǒng)上跑了很多程序,那么每個(gè)程序都會(huì)有相應(yīng)的日志產(chǎn)生,而這些日志就被記錄到這個(gè) 下,具體在/varlog 下。用戶(hù)管理Lux系統(tǒng)是一個(gè)多用戶(hù)多任務(wù)的分時(shí)操作系統(tǒng),任何一個(gè)要使用系統(tǒng)資源的用戶(hù),都必須首先向系統(tǒng)管理員申請(qǐng)一個(gè)賬號(hào),然后以這個(gè)賬號(hào)的進(jìn)入系統(tǒng)。用戶(hù)的賬號(hào)一方面可以幫助系統(tǒng)管理員對(duì)使用系統(tǒng)的用戶(hù)進(jìn)行,并控制他們對(duì)系統(tǒng)資源的;另一方面也可以幫助用戶(hù)組織文件,并為用戶(hù)提供安全性保護(hù)。每個(gè)用戶(hù)賬號(hào)都擁有一個(gè)惟一的用戶(hù)名和各自的口令。用戶(hù)在登錄時(shí)鍵入正確的用戶(hù)名和口令后,就能夠進(jìn)入系統(tǒng)和自己的主 。查看用戶(hù)列表$cat/etc/passwdsshd:x:74:74:Privilege-separatedSSH:/var/empty/sshd:/sbin/nologin 查看用戶(hù)組$cat/etc/group 相關(guān)知識(shí)點(diǎn):1Linux/etc/group與/etc/passwd文件都是有關(guān)于系統(tǒng)管理員對(duì)用戶(hù)或用戶(hù)組管2Linux/etc/group是用戶(hù)管理員對(duì)用戶(hù)或用戶(hù)組管理的文件。Linux用戶(hù)組的信息3、 用戶(hù)組的配置文件主要有ecrop和ecsho其ecshow是ecp的加密信息文件。創(chuàng)建用戶(hù)賬號(hào)useradduseradd 后才可以切換用戶(hù)(su用戶(hù)名實(shí)例演示$cd[silver@zkxs/]$useradd-bash:/usr/sbin/useradd:權(quán)限不夠[silver@zkxs/]$sudouseraddecho[silver@zkxs/]$sudopasswd更改用戶(hù)echo : passwd:所有 [silver@zkxs/]$su:[echo@zkxs這樣用戶(hù)和用戶(hù)就設(shè)置完成了,可以使用su+用戶(hù)名切換??梢允褂胹udo命令直接切換到root用戶(hù)下。注意[silver@zkxs[silver@zkxs/]$useradd在這一行代碼中slver是用戶(hù)名稱(chēng),zkxs是主機(jī)名稱(chēng),$表示目前是以普通用戶(hù)登陸主前面加sudo即可,添加sudo前置命令后,表示以超級(jí)用戶(hù)權(quán)限執(zhí)行改命令。[silver@zkxs[silver@zkxs/]$sudouseradd運(yùn)行sudo指令后會(huì)提示輸入,輸入之后就可以以超級(jí)用戶(hù)權(quán)限執(zhí)行命令,不刪除用戶(hù)賬號(hào)如果一個(gè)用戶(hù)的賬號(hào)不再使用,可以從系統(tǒng)中刪除。刪除用戶(hù)賬號(hào)就是要將/etc/passw 刪除一個(gè)已有的用戶(hù)賬號(hào)使用userdel命令,其格式如下userdeluserdel常用的選項(xiàng)是-r,它的作用是把用戶(hù)的 一起刪除。例如:我們刪除echo用戶(hù)$$userdel-r文件管理Lnux系統(tǒng)是一種典型的多用戶(hù)系統(tǒng),不同的用戶(hù)處于不同的地位,擁有不同的權(quán)限。為了保護(hù)系統(tǒng)的安全性,Linux系統(tǒng)對(duì)不同的用戶(hù)同一文件(包括文件)的權(quán)限做了不同的規(guī)定。查看文件屬性Linuxlllsl命令來(lái)顯示一個(gè)文件的屬性以及文件所屬的用戶(hù)$$total 2rootroot4096121412:03 3rootroot40963 2rootroot40969drwxr-xr-x19rootroot40003drwxr-xr-x145rootroot122883 3rootroot409691613131613:1382017實(shí)例中,boot文件的第一個(gè)屬性用"d"表示。"d"在Linux中代表該文件是一 文件1、在Linux中第一個(gè)字符代表這個(gè)文件 、文件或文件等等當(dāng)為[d當(dāng)為[-]若是[l]則表示為文檔(link若是[b]則表示為裝置文件里面的可供的接口設(shè)備(可隨機(jī)存取裝置若是[c]2、接下來(lái)的字符中,以三個(gè)為一組,且均為『rwx』的三個(gè)參數(shù)的組合。其中,[r]代表可讀(read)、w]代表可寫(xiě)(write)、[x]代表可執(zhí)行(execute)。要注意的是,這三個(gè)權(quán)限的位置不會(huì)改變,如果沒(méi)有權(quán)限,就會(huì)出現(xiàn)減號(hào)[-]而已。3、對(duì)于文件來(lái)說(shuō),它都有一個(gè)特定的所有者,也就是對(duì)該文件具有所有權(quán)的用戶(hù)。而在Lnux系統(tǒng)中,用戶(hù)是按組分類(lèi)的,一個(gè)用戶(hù)屬于一個(gè)或多個(gè)組。文件所有者以外的用戶(hù)又可以分為文件所有者的同組用戶(hù)和其他用戶(hù)。因此,Lnux系統(tǒng)按照文件所有者、文件所有者同組用戶(hù)和其他用戶(hù)規(guī)定了不同的文件權(quán)限。每個(gè)文件的屬性由左邊第一部分的10個(gè)字符來(lái)確定(如下圖)修改文件權(quán)限 文件屬性有兩種設(shè)置方法,一種是數(shù)字,一種是符號(hào)Linux文件的基本權(quán)限就有九個(gè),分別是owner/group/others三種各有自己read/write/execute權(quán)限 owner=rwx=4+2+1=7group=rwx=4+2+1=7others=--=0+0+0=0每種(oner/groupohers)各自的三個(gè)權(quán)限(r//x)分?jǐn)?shù)是需要累加的,例如當(dāng)權(quán)限為:-rowner=rwx=4+2+1=7group=rwx=4+2+1=7others=--=0+0+0=0所以我們?cè)O(shè)定權(quán)限的變更時(shí),該文件的權(quán)限數(shù)字就是770了!變更權(quán)限的指 的語(yǔ)法是這樣的)od[-R]xyz選項(xiàng)與參數(shù)xyzrwx-R:進(jìn)行遞歸(recursive)的持續(xù)變更,亦即連同次 [silver@zkxs~]$lla.txt-rw-rw-r--.1rootsilver06月1123:29a.txt[silver@zkxs~]$ od777a.txtod:更改"a.txt"的權(quán)限:不允許的操作[silver@zkxs~]$sudood777a.txt[sudo]passwordforsilver:[silver@zkxs~]$-rwxrwxrwx.1rootsilver06月1123:29a.txt[silver@zkxs~]$-rwxr-xr--[4+2+1][4+0+1][4+0+0]=份,那么我們就可以由u,g,o來(lái)代表三種的權(quán)限!此外,a則代表all亦即全部的!那么讀寫(xiě)的權(quán)限就可以寫(xiě)成r,w,x!也就是可+(加入-(除去=(設(shè)定文件#去掉group組的可執(zhí)行權(quán)限[silver@zkxs~]$sudo odg=rxa.txt[sudo]passwordforsilver:[silver@zkxs~]$ll-rwxr-xrwx1rootsilver#去掉group組的可執(zhí)行權(quán)限[silver@zkxs~]$sudo odg=rxa.txt[sudo]passwordforsilver:[silver@zkxs~]$ll-rwxr-xrwx1rootsilver06月1123:29a.txt#去掉othoer組的可執(zhí)行權(quán)限[silver@zkxs~]$sudo [silver@zkxs~]$ll-rwxr-xrw1rootsilver06月1123:29管 /,其他 常用命令lsls:rm:ls: 查看當(dāng) 包含哪里些內(nèi) 詳細(xì)方式列 中的內(nèi)ls- 以長(zhǎng)格式列 中所有的內(nèi)容,包括隱藏文cd(切 )ChangeDirectory的縮寫(xiě),這是用來(lái)變換工 令 路cd 回到上一cd 跳到cd 回到pwd(顯示目前所在 pwd是PrintWorkingDirectory的縮寫(xiě),也就是顯示目前所 令##mkdir(創(chuàng)建 如果想要?jiǎng)?chuàng)建新 的話,就使用mkdir(makedirectory)。語(yǔ)法mkdirmkdir 選項(xiàng)與參數(shù)-m-p[silver@localhost~]$mkdirtest[silver@localhost~]$lsperl5test[silver@localhost~]$lsperl5testtest1[silver@localhost~]$lstest1由此可見(jiàn)加了這個(gè)-p的選項(xiàng),可以自行幫你創(chuàng)建多 rwx--x--x[silver@localhost[silver@localhost~]$mkdir-m711test2[silver@localhost~]$lsperl5testtest1test2[silver@localhost~]$ll總用量0drwx--x--x2silversilver66月1014:11上面的權(quán)限部分,如果沒(méi)有加上- 來(lái)強(qiáng)制配置屬性,系統(tǒng)會(huì)使用默認(rèn)屬性rmdir(刪除空 如果想要?jiǎng)h除一個(gè)空 ,就使用rmdir(rmovedirectory)。語(yǔ)法rmdirrmdir 實(shí)例演示[silver@localhost[silver@localhost~]$rmdirtest[silver@localhost~]$lsperl5test1test2[silver@localhost~]$rmdirtest1rmdir:刪除"test1"失敗: [silver@localhost~]$rmdir-pperl5test2利用-p這個(gè)選項(xiàng),立刻就可以將test1/test2/test3/test4一次刪除。不過(guò)要注意的是,這個(gè)rmdir僅能刪除空的 ,通常使用rm-rf命令來(lái)刪除非空 touch創(chuàng)建文件如果想創(chuàng)建一個(gè)新的文件,可以使用touch命令,語(yǔ)法TouchTouch文件名實(shí)例演示[silver@localhost~]$touchtest.txt[silver@localhost~]$lsperl5test2[silver@zkxs~]$touchd.txtf.txtg.txt[silver@zkxs~]$lsb.txxc.txtcxfsd.pyd.txtf.txtcp(文件 如果要對(duì)文件進(jìn)行,可以使用cp命令,語(yǔ)法cpcpadfilprsu]來(lái)源檔(source)目標(biāo)檔實(shí)例演示[silver@localhost[silver@localhost~]$cptest.txttest2.txt[silver@localhost~]$lsperl5test2test2.txttest.txt[silver@localhost~]$cptest.txttest2/ccc.txt[silver@localhost~]$lstest2rm如果要對(duì)文件進(jìn)行刪除操作,可以使用rm命令,該命令包含兩個(gè)選項(xiàng)rmirmrf強(qiáng)制刪除[silver@localhost~]$lsperl5test2test.txt[silver@localhost~]$rmtest2rm:無(wú)法刪除"test2":是一個(gè)[silver@localhost~]$rmrftest2[silver@localhost~]$lsperl5 (移動(dòng)文件 ,或修改名稱(chēng)移動(dòng)文件[silver@localhost[silver@localhost~]$mkdirtest[silver@localhost~]$lsperl5testtest.txt[silver@localhost~]$mvtest.txttest[silver@localhost~]$lstest/修改名稱(chēng)perl5test[silver@localhost~]$mvtesttest1[silver@localhost~]$lsperl5文件內(nèi)容查看指令taccatmoremorecat查看文件[silver@localhost/]$cat/etc/passwd 利用cat快速##利用cat與追加進(jìn)行文件的快速[silver@zkxs~]$catb.txt[silver@zkxs~]$catd.txt[silver@zkxs~]$catb.txt>>d.txt[silver@zkxs~]$catd.txtdu查看文件大小dudu-dush文件du-sh*列出所有文件大小(*linux中代表所有的意思)實(shí)例演示[silver@zkxs[silver@zkxs~]$du-sh* [silver@zkxs~]$df-h SizeUsedAvailUse%Mounted 8% 0% 7%echo重定向與追加[silver@localhost~]$echo'iloveyou'>a.txt[silver@localhost~]$cata.txtiilove[silver@localhost~]$echo'!!!'>a.txt[silver@localhost~]$cata.txt[silver@localhost~]$echo'iloveyou'>a.txt[silver@localhost~]$cata.txtilove[silver@localhost~]$echo'!!!'>>a.txt[silver@localhost~]$cata.txtilove重定向會(huì)覆蓋原文件的內(nèi)容,追加會(huì)在原文件中加入內(nèi)容。打包操作使用tar命令打包文件格式如tartarcvf打包文件-c打-v顯示-f指定打包后的文件打包壓縮tartarzcvf壓縮包名.tar.gz解包解壓縮tartarzxvf壓縮包名tarzxvf壓縮包名.tar.gzC實(shí)例演示a.txtb.txtc.txtd.py[echo@zkxs~]$tar-zcvftxt.tar.gza.txtb.txtc.txt[echo@zkxs~]$a.txtb.txtc.txtd.pyf.txttxt.tar.gz[echo@zkxs~]$mkdir[echo@zkxs~]$a.txtb.txtc.txtd.pyf.txttxttxt.tar.bz2txt.tar.gz[echo@zkxs~]$tar-zxvftxt.tar.gz-Ctxt[echo@zkxs~]$lstxta.txtb.txt文本編輯什么是v(vim)是上Linux非常常用的編輯器,很多Lnux版都默認(rèn)安裝了vi(vim)。vi(vim)令繁多但是如果使用靈活之后將會(huì)大大提高效率。vi是“vsualnerace”的縮寫(xiě),vim是viMproved(增強(qiáng)版的vi)。vim是從vi發(fā)展出來(lái)的一個(gè)文本編輯器。代碼補(bǔ)全、編譯及錯(cuò)誤跳轉(zhuǎn)等方便編程的功能特別豐富,在程序員中被廣泛使用,和Emacs并列成為類(lèi)Unix系統(tǒng)用戶(hù)最喜歡的文本編輯器。vim的使用包含vim的基本介紹、使用模式、文件的打開(kāi)關(guān)閉保存、插入文本或新建行、移動(dòng)光標(biāo)、刪除、恢復(fù)字符或行、搜索等等vim的三種模式插入模式:在此模式下可以輸入字符,按ESC命令模式:可以移動(dòng)光標(biāo)、刪除字符底行模式:可以保存文件、退出vi、設(shè)置vi、查找等功能vim的使用方法例如我們要通過(guò)vim編輯器來(lái)編寫(xiě)一個(gè)o.sh,通過(guò)命令行輸入$$ ‘I’鍵,進(jìn)入插入模式(底行顯示INSERT),在插入模式下可以輸入有效的代碼。如下所示: o.sh文件,那么執(zhí)行vim o.sh這條指令時(shí), o.sh進(jìn)行修改,否則將直接創(chuàng)建 o.sh文件。次按鍵Shift+;(冒號(hào))進(jìn)入底行模式,在底行模式下輸入wq,即可保存退出。wqqq!ChapterPYTHON基平臺(tái)搭建Python()是一種面向?qū)ο蟮慕忉屝陀?jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,創(chuàng)始人為GuidovanRossum,圣誕節(jié)期間,在阿姆斯特丹,Guido為了打發(fā)圣誕節(jié)的無(wú)趣,決心開(kāi)發(fā)一個(gè)新的解釋程序,作為ABC語(yǔ)言的一種繼承。之所以選中Python(大蟒蛇的意思)作為該編程語(yǔ)言的名字,是因?yàn)樗且粋€(gè)叫MontyPython的喜劇團(tuán)體的者。.1版Python22000年年底,較之前版本,這是一種更加清晰和更具包容性的語(yǔ)言PythonPEPPython增強(qiáng)協(xié)議),這種技術(shù)規(guī)范能向Python社區(qū)成員提供信息或描述這種語(yǔ)言的新特性。Python3被視為Python的未來(lái),是目前正在開(kāi)發(fā)中的語(yǔ)言版本。作為一項(xiàng)重大,Python3于2008年年末發(fā)布以解決和修正以前語(yǔ)言版本的內(nèi)在設(shè)計(jì)缺陷。Python3開(kāi)發(fā)的重點(diǎn)是清理代碼庫(kù)并刪除冗余,清晰地表明只能用式來(lái)執(zhí)行給定的任務(wù)。在2008年P(guān)ython3.0的發(fā)布之后,Python2.7于發(fā)布,并計(jì)劃作為2.x使Python2.x的用戶(hù)更容易將功能移植到Python3上。這種兼容性支持包括了2.7版本的增強(qiáng)模塊,如支持測(cè)試自動(dòng)化的unittest,用于解析命令行選項(xiàng)的argparse,以及更Python2.7Python2Python3.0之間的早期迭代版本的獨(dú)特位置,它因?yàn)镻ython2時(shí),我們通常指的是Python2.7版本,因?yàn)樗亲畛S玫陌姹尽?duì)于該版本的支持將在2020年完全停止。Python的特點(diǎn)Python1Python語(yǔ)言的出發(fā)點(diǎn)就是為了便于學(xué)習(xí)。是目前所有計(jì)算機(jī)語(yǔ)言中最易2、Python是免費(fèi)的。你可以Python,還可以很多很多用Python編寫(xiě)的既3、Python是開(kāi)源(opensource)“開(kāi)源”的含義是指任何用戶(hù)都可以擴(kuò)展(extend)Python“工具”可以用Python做的事情,或者盡管是做同樣的事情,但是有了這些新工具后會(huì)比4、Python并不是一個(gè)“玩具”都有成千上萬(wàn)的專(zhuān)業(yè)在使用這種語(yǔ)言,甚至包括類(lèi)似NASA(航空航天局)和Python后,你不用轉(zhuǎn)換語(yǔ)言再去學(xué)一種“真正的”語(yǔ)言來(lái)編寫(xiě)“真正的”程序;很多工作都完全可以使用Python完成。5、yn可以在種不同型的計(jì)機(jī)上行。nos電腦、果電腦運(yùn)行Liux的計(jì)機(jī)上都以使用yn。多數(shù)情,如果一個(gè)yhn程可以在家里的 Wnos 電腦上運(yùn)行,那么這個(gè)程序同樣可以在你學(xué)校的蘋(píng)果電腦上運(yùn)行,兼容性高。python平臺(tái)搭建要搭建python開(kāi)發(fā)環(huán)境有兩個(gè)問(wèn)題需要考慮,第一是選擇什么操作系統(tǒng),是indows還是lnux?第二是選擇pyhon哪個(gè)版本,在上一節(jié)中我們闡述過(guò)pyhon的版,我們選用pyhon36版本作為本書(shū)的開(kāi)發(fā)版本。關(guān)于操作系統(tǒng),主要是在indos和lnux之間選擇。Python是跨平臺(tái)的語(yǔ)言,因此可以跨平臺(tái)運(yùn)行。然而,不同的平臺(tái)運(yùn)行效率是不一樣的,一般來(lái)說(shuō)在Lnux下運(yùn)行速度是比Wndos要快的,此外,在Lnux下搭建Pyhon環(huán)境相對(duì)來(lái)說(shuō)容易一些,很多Lnux版自帶了Python27版本。當(dāng)然,lnux的操作門(mén)檻比較高,對(duì)于初學(xué)者,還是建議先選擇Wndos開(kāi)發(fā),然后再考慮遷移到Lnux開(kāi)發(fā)環(huán)境中。python3.6版安Wndos系統(tǒng)安裝Python易戶(hù)直到Python官網(wǎng)相應(yīng)版本的msi安裝包即可,軟件分32位與64位,用戶(hù)可按照需求自行安裝,和一般的軟件安裝無(wú)異。Anaconda3安裝Python程序只是第一步,為了實(shí)現(xiàn)更豐富的功能,還需要安裝一些第的擴(kuò)展庫(kù),這對(duì)于初學(xué)者來(lái)說(shuō)是比較的,尤其實(shí)在Windows系統(tǒng)下,幸好,已經(jīng)有專(zhuān)門(mén)的軟件已經(jīng)為常用的第庫(kù)以及編譯器都安裝好了,Anaconda就是這樣的軟件。Anaconda具有如下特點(diǎn)1、包含了眾多流行的科學(xué)、數(shù)學(xué)、工程、數(shù)據(jù)分析的Python包2、包含了Spyder和 Notebook常用編譯器,無(wú)需再其他編譯器語(yǔ)言基礎(chǔ)Pyhon是一種計(jì)算機(jī)編程語(yǔ)言。計(jì)算機(jī)編程語(yǔ)言和我們?nèi)粘J褂玫淖匀徽Z(yǔ)言有所不同,套語(yǔ)法,編譯器或者解釋器就是負(fù)責(zé)把符合語(yǔ)法的程序代碼轉(zhuǎn)換成CPU能夠執(zhí)行的機(jī)器碼Python也不例外語(yǔ)法初探Python的語(yǔ)法比較簡(jiǎn)單,采用縮進(jìn)方式代替一般高級(jí)語(yǔ)言的 }括號(hào)對(duì)##printabsolutevalueofaninteger:a=100ifa>=1、以 # 開(kāi)頭的語(yǔ)句是注釋?zhuān)⑨屖墙o人看的,可以是任意帶有提示色彩內(nèi)容,解釋器編譯時(shí)會(huì)忽略掉注釋。2結(jié)尾時(shí),縮進(jìn)的語(yǔ)句視為代碼塊,冒號(hào)之后的所有代碼的縮進(jìn)量必須相同,直到代碼塊結(jié)束。等同于其他編程語(yǔ)言的{}對(duì)。3、縮進(jìn)好處是強(qiáng)迫你寫(xiě)出格式化的代碼,但沒(méi)有規(guī)定縮進(jìn)是幾個(gè)空格還是Tab。一般編譯器的默認(rèn)設(shè)置都是4個(gè)空格的縮進(jìn)。4、Pyhon語(yǔ)言的一個(gè)重要特性就是它的對(duì)象模型的一致性。每個(gè)數(shù)字、字符串、數(shù)據(jù)結(jié)構(gòu)、函數(shù)、類(lèi)、模塊等等,都是在Python解釋器的自有“盒子”內(nèi),它被認(rèn)為是Python對(duì)象。每個(gè)對(duì)象都有類(lèi)型(例如,字符串或函數(shù))和內(nèi)部數(shù)據(jù)。在實(shí)際中,這可以讓語(yǔ)言非常靈活,因?yàn)楹瘮?shù)也可以被當(dāng)做對(duì)象使用。數(shù)據(jù)類(lèi)型還具有功能。是能夠按照程序運(yùn)行,自動(dòng)、高速處理海量數(shù)據(jù)的現(xiàn)代化智能電子設(shè)備。各種各樣的數(shù)據(jù),不同的數(shù)據(jù),需要定義不同的數(shù)據(jù)類(lèi)型。在Python中,能夠直接處理的數(shù)據(jù)類(lèi)型有以下幾種:整數(shù)Python可以處理任意大小的整數(shù),當(dāng)然包括負(fù)整數(shù),在程序中的表示方法和數(shù)學(xué)上的寫(xiě)法一模一樣,例如:1,100,-8080,0,等等。>>>>>>ival=>>>ival*0.2浮點(diǎn)數(shù)數(shù)是數(shù)所稱(chēng)點(diǎn)是為科數(shù)示,浮數(shù)小數(shù)點(diǎn)位置是可變的,比如123x109和12.3x108是完全相等的。浮點(diǎn)數(shù)可以用數(shù)學(xué)寫(xiě)法,如1.23,314,-901,等等。但是對(duì)于很大或很小的浮點(diǎn)數(shù),就必須用科學(xué)表示,把10用e替代,123x109就是123e9,或者12.3e8,0. 可以寫(xiě)成2e-5,等等。另外整數(shù)的除法結(jié)果系統(tǒng)會(huì)自動(dòng)保存為浮點(diǎn)數(shù)類(lèi)型>>>>>>fval=>>>fval=>>>a='I>>>b='IamYX強(qiáng)大、靈活的內(nèi)建字符串操作時(shí)很多人喜歡python的原因。字符串是以單引號(hào)'或雙">>>a='I>>>b='IamYX布爾值>>>3>>>>3>布爾值和布爾代數(shù)的表示完全一致,一個(gè)布爾值只有TrueFalse兩種值,要么是True,要么是Fase,在Python中,可以直接用>>>3>>>>3>>>>TrueandTrue>>>TrueandFalse>>>5>3and3>>>>TrueandTrue>>>TrueandFalse>>>5>3and3>or運(yùn)算是或運(yùn)算,只要其中有一個(gè)為T(mén)rue,or運(yùn)算結(jié)果就是>>>>>>TrueorTrue>>>TrueorFalse>>>FalseorFalse>>>5>3or1>not運(yùn)算是非運(yùn)算,它是一個(gè)單目運(yùn)算符,把True變成False,F(xiàn)alse變成>>>not1>2布爾值經(jīng)常用在條件判斷中,比如ififage>=空空值是ython里一個(gè)特殊的值,用one表示。one不能理解為0,因?yàn)?是有意義的,而one是一個(gè)特殊的空值。類(lèi)型轉(zhuǎn)換Python數(shù)據(jù)類(lèi)型之間可以通過(guò)轉(zhuǎn)換來(lái)達(dá)到一致的效果,如下所示InIn[34]:str1=In[35]:type(str1)Out[35]:str1In[36]:fval=float(str1)In[37]:type(fval)Out[37]:floatIn[44]:ivla=int(fval)In[45]:type(ivla)Out[45]:int變量與常量變變量的概念基本上和初中代數(shù)的方程變量是一致的,只是在計(jì)算機(jī)程序中,變量不僅可以是數(shù)字,還可以是任意數(shù)據(jù)類(lèi)型。a= //a= //a是一個(gè)b //b是一個(gè)字符串Answer //變量Answer是一個(gè)布爾True”=“>>>a=當(dāng)在yhn中創(chuàng)建變量(或名字),如下圖所示,你就在等號(hào)右邊創(chuàng)建了一個(gè)對(duì)這個(gè)>>>a=假設(shè)將a賦值給一個(gè)新變量>>>>>>b= 3]也。在Python中,a和b實(shí)際上是同一個(gè)對(duì)象,即原有列表[1,2,3](如下圖)。你可以在a中添加一個(gè)元素,然后檢查b:>>>>>>>>>[1,2,3,>>>[1,2,3,上述執(zhí)行過(guò)程a和b兩個(gè)指向了同一個(gè)對(duì)象,理解python數(shù)據(jù)的時(shí)機(jī)、量PI=PI=但事實(shí)上PI仍然是一個(gè)變量,Pyhon根本沒(méi)有任何機(jī)制保證PI不會(huì)被改變,所以,用全部大寫(xiě)的變量名表示常量只是一個(gè)習(xí)慣上的用法??刂屏骱推渌Z(yǔ)言中的標(biāo)準(zhǔn)控制流概念一樣,yhn有若干內(nèi)建的關(guān)鍵字進(jìn)行條件邏輯、循環(huán)和其它控制流操作。條件語(yǔ)句>>>x=>>>ifx>所謂條件語(yǔ)句是通過(guò)一條或多條語(yǔ)句的執(zhí)行結(jié)果(True或者F>>>x=>>>ifx>if后面可以跟一個(gè)或多個(gè)elif,所有條件都是False時(shí),還可以添加一個(gè)ififelif條件2:elif條件3:elif用num=ifnum==print#num的elifnum>=80andnum<=100:print'good'elifnum60andelif用num=ifnum==print#num的elifnum>=80andnum<=100:print'good'elifnum60andnum #值在某個(gè)區(qū)間時(shí)輸出同結(jié)print #條件均不成立時(shí)輸出不及#輸出結(jié)>(大于)、<(小于)andor的優(yōu)aa=b=c=d=ifa<borc>d:#在這個(gè)例子中,c>d不會(huì)被執(zhí)行,因?yàn)榈谝粋€(gè)比較是Truefor循#statements(s)循環(huán)語(yǔ)句允許我們多次執(zhí)行一個(gè)語(yǔ)句或語(yǔ)句組,for循環(huán)是在一個(gè)集合(#statements(s)例如,我們對(duì)字符串以及列表進(jìn)行循環(huán)forforiinballs=['Basketball','football',' forballinballs:sequence=[1,2,None,5,6,7,None]total=0forvalueinsequence:ifvalue==totalsequence=[1,2,None,5,6,7,None]total=0forvalueinsequence:ifvalue==total計(jì)算結(jié)果為也可以用break直接跳出整個(gè)for循環(huán)。下面的代碼將各元素相加,直到遇到sequencesequence=total=total_limittotal_limit=forvalueinsequence:ifvalue==5:total+=value注意:break只中斷for循環(huán)的最內(nèi)層,其余的for循環(huán)仍會(huì)運(yùn)行forforiinforjinrange(4):ifj>i:(0,(1,(1,(2,(2,(2,(3,(3,(3,(3,while循環(huán)whilewhile條件表達(dá)式(null)的值均為true。當(dāng)判斷條件假false--PAGE42numnum=total=whilenum<=total=total+numnum+=1whilecontinue,break來(lái)跳過(guò)循環(huán),continue 則是用于退出整個(gè)循環(huán),此外"判斷條件"還可以是個(gè)常值,表示循環(huán)必定成立ii=whilei<i+=ifi%2>printi2468while1,則整個(gè)循環(huán)會(huì)陷入無(wú)法停止即“死循環(huán)”的狀態(tài),靈活使用while1循環(huán),對(duì)我們的代碼起重要作用。三元表達(dá)式Python中的三元表達(dá)式可以將一個(gè)if-else語(yǔ)句放到一行里,完成一項(xiàng)功能,語(yǔ)法如下valuevalue=true-exprifconditionelsefalse-true-expr或false-expr可以是任何Python代碼。它和下面的代碼效果相同ififcondition:value=true-exprvalue=false-來(lái)看一個(gè)具體xx='Yes'ifx>=0else數(shù)據(jù)結(jié)構(gòu)字、字符甚至是列表,或者是它們之間的組合。通俗的講,容器里說(shuō)明都可以,而且對(duì)列表列表(list)是Pyhon中最基本的數(shù)據(jù)結(jié)構(gòu),是一種有序的集合,可以隨時(shí)添加和刪除其(可以被隨時(shí)修改0開(kāi)始計(jì)數(shù),元素可通過(guò)索引方式檢索列表(lst)的數(shù)據(jù)項(xiàng)不需要具有相同的類(lèi)型,創(chuàng)建一個(gè)列表,只要把逗號(hào)分隔的不同的數(shù)據(jù)項(xiàng),使用方括號(hào)括起來(lái)即可。比如,列出班里所有同學(xué)的名字,就可以用一個(gè)list>>>>>>classmates=['Michael','Bob',>>>classmates變量classmates就是一個(gè)list。用len()函數(shù)可以獲得list元素的個(gè)數(shù)用索引來(lái)list中每一個(gè)位置的元素,記得索引是從0--PAGE43>>>Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>IndexError:listindexoutof當(dāng)索引超出了范圍時(shí),ython會(huì)報(bào)一個(gè)ndexError錯(cuò)誤,所以,要確保索引不要越界,記得最后一個(gè)元素的索引是en(cassmaes)-1。如果要取最后一個(gè)元素,除了計(jì)算索引位置外,還可以用-1做索引,直接獲取最后一個(gè)元素:>>>classmates[->>>classmates[-Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>IndexError:listindexoutoflist是一個(gè)可變的有序表,所以,可以利用append()方法往list末尾追加元素>>>>>>>>>['Michael','Bob','Tracy',也可以利用insert()方法把元素插入到指定的位置,比如索引號(hào)為1的位置>>>>>>classmates.insert(1,>>>['Michael','Jack','Bob','Tracy',如果要?jiǎng)h除list末尾的元素,用pop()方法>>>['Michael','Jack','Bob',如果要?jiǎng)h除指定位置的元素,用pop(i)方法,其中i是索引位置>>>classmates如果要把某個(gè)元素替換成別的元素,可以直接賦值給對(duì)應(yīng)的索引位置>>>>>>classmates[1]=>>>classmatesPython列表操作符另外列表還支持系列操作符,對(duì)+和*的操作符與字符串相似,+號(hào)用于組合列表,*號(hào)用于重復(fù)列表。如表所示:Python結(jié)描3長(zhǎng)組o’]*o’,o’,重ain歸forxin[a,b,c]:print迭元組>>>classmates=('Michael','Bob',另一種有序列表叫元組(tupetupe和li>>>classmates=('Michael','Bob',但是此處的cassmaes是不可變的,它也沒(méi)有append()insert()這樣的方法。其他獲取元素的方法和list是一樣的,可以正常地使用cassmates[0],cassmaes[-1],但不能賦值成另外的元素元組與列表最大的區(qū)別就是元組不能被修改,列表可以被修改。那不可變的tuple有什么意義?因?yàn)閡pe不可變,所以代碼更安全。如果可能,能用upe代替ist就盡量用upe。當(dāng)你定義一個(gè)tuple時(shí),tuple的元素就必須被確定下來(lái),比如>>>>>>t=(1,(1,如果要定義一個(gè)空的tuple,可以寫(xiě)成>>>>>>t=但是,要定義一個(gè)只有1個(gè)元素的tuple,如果你這么定義>>>>>>t=定義的不是upe,是1這個(gè)數(shù)!這是因?yàn)槔ㄌ?hào)()既可以表示upe,又可以表示數(shù)學(xué)中的小括號(hào),這就產(chǎn)生了歧義,因此,Python規(guī)定,這種情況下,按小括號(hào)進(jìn)行計(jì)算,計(jì)算結(jié)果自然是1。所以,只有1個(gè)元素的tuple定義時(shí)必須加一個(gè)逗號(hào),,來(lái)消除歧義t1,)#注意逗yhn在顯示只有1個(gè)元素的upe時(shí),也會(huì)加一個(gè)逗號(hào),以免你誤解成數(shù)學(xué)計(jì)算意義上的括號(hào)。最后來(lái)>>>>>>t=('a','b',['A',>>>t[2][0]=>>>t[2][1]=>>>('a','b',['X',這個(gè)upe定義的時(shí)候有3個(gè)元素,分別是'a''b'和一個(gè)lsttupe的元素確實(shí)變了,但其實(shí)變的不是tupe的元素,而是list的元素。tupe一開(kāi)始指向的list并沒(méi)有改成別的ist,所以,upe所謂的“不變”是說(shuō),upe的每個(gè)元素,指向不變。即指向'a',就不能改成指向'b',指向一個(gè)ist,就不能改成指向其他對(duì)象,但指向的這個(gè)lst本身是可變的!由ist和tupe都是Python內(nèi)置的有序集合,list中元素是的可變,tupe中元素是不可變。所以再創(chuàng)建數(shù)據(jù)時(shí),我們應(yīng)該根據(jù)需求來(lái)選擇使用list還時(shí)tupe。例如,如果希望被定義的數(shù)據(jù)不被篡改,應(yīng)該使用uple。字典字典(dict)是一個(gè)簡(jiǎn)單的結(jié)構(gòu),也叫關(guān)聯(lián)數(shù)組。ython內(nèi)置了字典,全稱(chēng)dictonary,使用鍵-值(key-vaue),具有極快的查找速度。例如,根據(jù)同學(xué)的名字查找對(duì)應(yīng)的成績(jī),如果用list實(shí)現(xiàn),則需要兩個(gè)namesnames=['Michael','Bob','Tracy']scores=[95,75,85]給定一個(gè)名字,要查找對(duì)應(yīng)的成績(jī),就先要在names中找到對(duì)應(yīng)的位置,再?gòu)膕cores取出對(duì)應(yīng)的成績(jī),lst越長(zhǎng),耗時(shí)越長(zhǎng)。>>>d={'Michael':95,'Bob':75,'Tracy':>>>d={'Michael':95,'Bob':75,'Tracy':為什么dict查找速度這么快?因?yàn)閐ict的實(shí)現(xiàn)原理和查字典是一樣的。假設(shè)字典包含了名字,比如'Michael',dict在內(nèi)部就可以直接計(jì)算出Michael對(duì)應(yīng)的存放成績(jī)的“頁(yè)碼”,也除了上面的直接創(chuàng)建非空字典外,也可以直接創(chuàng)建一個(gè)空字典,然后向其中加入東西。>>>d0=>>>>>>>>>>>>>>>{'name':'yx','age':18,'add':另外如果鍵值都相同的話,可以用fromkeys來(lái)完成初始化工作>>>d3>>>d3=>>>{'A':0,'B': >>>d3=可以像列表或元組中的元素一樣,、插入或設(shè)定字典中的元素。采用dict[key]形式字典,系統(tǒng)返回鍵key >>>d3=如果要修改某一項(xiàng)value值,可以通過(guò)key值來(lái)操作>>>adict[age'']=>>>Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>KeyError:由于一個(gè)key只能對(duì)應(yīng)一個(gè)vauekey賦值v>>>Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>KeyError:要避免key不存在的錯(cuò)誤,有兩種辦法,一是通過(guò)in判斷key是否存在##判斷Key>>>'Thomas'ind二是通過(guò)dict提供的e()key不存在,可以返回NoneNone在交互式環(huán)境下不顯示,當(dāng)然也可以自己指定的返回值:>>>>>>d.get('Thomas',--

None在交互狀態(tài)下不顯#指定返回##刪除>>>{'Michael':95,'Tracy':和list比較,dict的查找和插入的速度極快,不會(huì)隨著key的增加而變慢;而list相反,查找和插入的時(shí)間隨著元素的增加而增加;所以,dct是用空間來(lái)?yè)Q取時(shí)間的法。dct可以用在需要高速查找的很多地方,在Pythondct非常重要,但需要注意的是dict的key必須是不可變的對(duì)象。集合>>>s=set([1,2,>>>{1,>>>s=set([1,2,>>>{1,2,注意,傳入的參數(shù)[1,2,3]是一個(gè)list,而顯示的{1,2,3},這只是告訴你這個(gè)set內(nèi)部重復(fù)元素在set中自動(dòng)被過(guò)濾>>>>>>s=set([1,1,2,2,3,>>>>>>{1,2,通過(guò)add(key)方法可以添加元素到set中,可以重復(fù)添加,但不會(huì)有效果>>>>>>>>>{1,2,3,s.add(4)#重復(fù)添加無(wú)>>>{1,2,3,通過(guò)remove(key)方法可以刪除元素>>>>>>>>>{1,2,>>>x=>>>y=>>>x=>>>y=>>>({123434,5 #重復(fù)的>>>{3,>>>#交#并{1,2,3,4,5,x- #差{1,set和dict的唯一區(qū)別僅在于沒(méi)有對(duì)應(yīng)的vaue,但是,set的原理和dct一樣,所以,同樣不可以放入可變對(duì)象,因?yàn)闊o(wú)法判斷兩個(gè)可變對(duì)象是否相等,也就無(wú)法保證set內(nèi)部不會(huì)有重復(fù)元素。切片索引使用切片可以選取列表和元組中的子集,其基本形式是在方括號(hào)中使用sart:top,切片選取的原則是取前不取后,因此,結(jié)果中包含的元素個(gè)數(shù)是stop-start,而且start或sop都可以被省略,省略之后,分別默認(rèn)序列的開(kāi)頭和結(jié)尾。如下所示InIn[4]:data=In[5]:Out[5]:[4,5,7,In[6]:Out[6]:[1,4,5,7,In[7]:Out[7]:[7,3,13,In[8]:Out[8]:[13,35,657,768,'yx',切片也可以被序列賦InIn[9]:data[2:4]=In[10]:Out[10]:[1,4,6,34,3,13,35,657,768,'yx',在第二個(gè)冒號(hào)后面使用step表示選取的步長(zhǎng),可以隔step個(gè)位置取一個(gè)元素InIn[11]:Out[11]:[34,13,657,Out[34]:[768,'yx',從上圖可看出,PythoOut[34]:[768,'yx',函數(shù)編程可讀性。并且Python不但能非常靈活地定義函數(shù),而且本身內(nèi)置了很多有用的函數(shù),可創(chuàng)建函數(shù)首先我們來(lái)看一個(gè)示例,我們知道圓的面積計(jì)算為r1=r2=r3=s1=3.14*r1r1=r2=r3=s1=3.14*r1*r1s2=3.14*r2*r2s3=3.14*r3*defarea_of_circle(r):return3.14*r*當(dāng)代碼出現(xiàn)有規(guī)律的重復(fù)的時(shí)候,你就需要當(dāng)心了,每次寫(xiě)3.14*x*x不僅很麻煩,而 defarea_of_circle(r):return3.14*r*有了函數(shù),我們就不再每次寫(xiě)s=3.14*x*x數(shù)area_of_circle本身只需要寫(xiě)一次,就可以多次調(diào)用。如下所示InIn[16]:Out[16]:In[17]:Out[17]:ifz>0:returnx+yreturnx-在Pyhon中,定義一個(gè)函數(shù)要使用deifz>0:returnx+yreturnx-定義完函數(shù)主體之后,我們可以在有代碼需求的地方運(yùn)行函數(shù)調(diào)用InIn[19]:Out[19]:Out[20]:importimportdefmove(x,y,step,nx=x+step*math.cos(angle)ny=y-step*math.sin(angle)returnnx,ny>>>x,y=move(100,100,60,math.pi/>>>x,y=move(100,100,60,math.pi/>>>print(x,y)151.9615242270663270.0但其實(shí)這只是一種假象,Python函數(shù)返回的仍然是單一>>>>>>r=move(100,100,60,math.pi/>>>print(r)由此可知函數(shù)的返回值實(shí)際上是一個(gè)tupe,但是,在語(yǔ)法上,返回一個(gè)tupe可以省略括號(hào),而多個(gè)變量可以同時(shí)接收一個(gè)tupe,按位置賦給對(duì)應(yīng)的值,這樣使用起來(lái)會(huì)更加便捷。遞歸函數(shù)在函數(shù)內(nèi)部,可以調(diào)用其他函數(shù)。如果一個(gè)函數(shù)在內(nèi)部調(diào)用自己本身,這個(gè)函數(shù)就是遞歸函數(shù)。fact(n)=n!=1*2*3*...*(n-1)*n=(n-1)!*fact(n)=n!=1*2*3*...*(n-1)*n=(n-1)!*n=fact(n-1)*defifreturnreturndefifreturnreturnn*fact(n-上面就是一個(gè)遞歸函數(shù)??梢栽囋?gt;>>內(nèi)置函數(shù)Python的除了可以自己創(chuàng)建函數(shù)以外還提供了強(qiáng)大的內(nèi)置函數(shù)支持,了解學(xué)習(xí)這些內(nèi)置函數(shù)能有效的提高編程效率。sorted接比較數(shù)學(xué)上的大小是沒(méi)有意義的,因此,比較的過(guò)程必須通過(guò)函數(shù)抽象出 函數(shù)可以從任意序列的元素返回一個(gè)新的排好序的列表InIn[37]:a=In[38]:Out[38]:[2,4,5,7,8,12,In[39]:sorted([36,5,-12,9,-21],In[39]:sorted([36,5,-12,9,-21],Out[39]:[5,9,-12,-21,zipzip可以將多個(gè)列表、元組或其它序列成對(duì)組合成一個(gè)元組列表InIn[46]:seq1=In[47]:seq2=['one','two','three']In[48]:zipped=zip(seq1,seq2)In[49]:list(zipped)Out[49]:[('alex','one'),(18,'two'),('bj',zip可以處理任意多的序列,元素的個(gè)數(shù)取決于最短的InIn[50]:seq3=In[51]:Out[51]:[('alex','one','bj'),(18,'two',lambdareturnx*2data=lambdax:x*Pyhon支持一種被稱(chēng)為returnx*2data=lambdax:x*執(zhí)行函數(shù)調(diào)用,可得結(jié)果InIn[53]:Out[53]:In[55]:Out[55]:data=defapply_to_list(some_list,f):return[f(x)forxinsome_list][6,8,10,4,14,data=defapply_to_list(some_list,f):return[f(x)forxinsome_list][6,8,10,4,14,從上面的示例可以看到,函數(shù)有個(gè)限制,就是只能有一個(gè)表達(dá)式,不用寫(xiě)面向?qū)ο竺嫦驅(qū)ο缶幊獭狾bjectOrientedProgramming,簡(jiǎn)稱(chēng)OOP,是一種程序設(shè)計(jì)思想。面向過(guò)程的程序設(shè)計(jì)把計(jì)算機(jī)程序視為一系列令集合,即一組函數(shù)的順序執(zhí)行。為間傳遞。在Python中,所有數(shù)據(jù)類(lèi)型都可以視為對(duì)象,當(dāng)然也可以自定義對(duì)象。自定義的對(duì)象數(shù)據(jù)類(lèi)型就是面向?qū)ο笾械念?lèi)(Cass)的概念。我們以一個(gè)例子來(lái)說(shuō)明面向過(guò)程和面向?qū)ο笤诔绦蛄鞒躺系牟煌幖僭O(shè)我們要處理學(xué)生的成績(jī)表,為了表示一個(gè)學(xué)生的成績(jī),面向過(guò)程的程序可以用一dict表示std1std1={'name':'Michael','score':98std2={'name':'Bob','score':81而處理學(xué)生成績(jī)可以通過(guò)函數(shù)實(shí)現(xiàn),比如打印學(xué)生的成績(jī)defdefprint('%s:%s'%(std['name'],classdefinit(self,name,score):=nameself.score=scoredefprint('%s:%s'%(,如果采用面向?qū)ο蟮某绦蛟O(shè)計(jì)思想,我們首選思考的不是程序的執(zhí)行流程,而是Student這種數(shù)據(jù)類(lèi)型應(yīng)該被視為一個(gè)對(duì)象,這個(gè)對(duì)象擁有name和scoreclassdefinit(self,name,score):=nameself.score=scoredefprint('%s:%s'%(,ming=Student('Xiao_ming',59)hong=Student('Xiao_hong',(Methodming=Student('Xiao_ming',59)hong=Student('Xiao_hong',面向?qū)ο蟮脑O(shè)計(jì)思想是從自然界中來(lái)的,因?yàn)樵谧匀唤缰校?lèi)(Class)和實(shí)例(nsance)的概念是很自然的。Class是一種抽象概念,比如我們定義的Class——Student,是指學(xué)生這個(gè)概念,而實(shí)例(Insance)則是一個(gè)個(gè)具體的Student,比如,Xiao_mng和Xiao_hong是兩個(gè)具體的Student。所以,面向?qū)ο蟮脑O(shè)計(jì)思想是抽象出Class,根據(jù)lass創(chuàng)建nsance。面向?qū)ο蟮某橄蟪潭扔直群瘮?shù)要高,因?yàn)橐粋€(gè)Cass既包含數(shù)據(jù),又包含操作數(shù)據(jù)的方法。數(shù)據(jù)封裝、繼承和多態(tài)是面向?qū)ο蟮娜筇攸c(diǎn)。類(lèi)和實(shí)例面向?qū)ο笞钪匾母拍罹褪穷?lèi)(Class)和實(shí)例(Instance),必須牢記類(lèi)是抽象的模板,比如Student類(lèi),而實(shí)例是根據(jù)類(lèi)創(chuàng)建出來(lái)的一個(gè)個(gè)具體的“對(duì)象”,每個(gè)對(duì)象都擁有相同的方法,但各自的數(shù)據(jù)可能不同。仍以Student類(lèi)為例,在Python中,定義類(lèi)是通過(guò)class關(guān)鍵字>>>ming=>>><main.Studentobjectat>>><class'>>>ming=>>><main.Studentobjectat>>><class'mainmng指向的就是一個(gè)Student0x10a67a590是內(nèi)存地址,每個(gè)obect的地址都不一樣,而Student本身則是一個(gè)類(lèi)??梢宰?/p>

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論