什么是REST?
在大足等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需設(shè)計網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷,成都外貿(mào)網(wǎng)站建設(shè)公司,大足網(wǎng)站建設(shè)費(fèi)用合理。
REST (REpresentation State Transfer) 描述了一個架構(gòu)樣式的網(wǎng)絡(luò)系統(tǒng),比如 web 應(yīng)用程序。它首次出現(xiàn)在 2000 年 Roy Fielding 的博士論文中,他是 HTTP 規(guī)范的主要編寫者之一。REST 指的是一組架構(gòu)約束條件和原則。滿足這些約束條件和原則的應(yīng)用程序或設(shè)計就是 RESTful。
Web 應(yīng)用程序最重要的 REST 原則是,客戶端和服務(wù)器之間的交互在請求之間是無狀態(tài)的。從客戶端到服務(wù)器的每個請求都必須包含理解請求所必需的信息。如果服務(wù)器在請求之間的任何時間點(diǎn)重啟,客戶端不會得到通知。此外,無狀態(tài)請求可以由任何可用服務(wù)器回答,這十分適合云計算之類的環(huán)境??蛻舳丝梢跃彺鏀?shù)據(jù)以改進(jìn)性能。
在服務(wù)器端,應(yīng)用程序狀態(tài)和功能可以分為各種資源。資源是一個有趣的概念實體,它向客戶端公開。資源的例子有:應(yīng)用程序?qū)ο?、?shù)據(jù)庫記錄、算法等等。每個資源都使用 URI (Universal Resource Identifier) 得到一個惟一的地址。所有資源都共享統(tǒng)一的界面,以便在客戶端和服務(wù)器之間傳輸狀態(tài)。使用的是標(biāo)準(zhǔn)的 HTTP 方法,比如 GET、PUT、POST 和 DELETE。Hypermedia 是應(yīng)用程序狀態(tài)的引擎,資源表示通過超鏈接互聯(lián)。
另一個重要的 REST 原則是分層系統(tǒng),這表示組件無法了解它與之交互的中間層以外的組件。通過將系統(tǒng)知識限制在單個層,可以限制整個系統(tǒng)的復(fù)雜性,促進(jìn)了底層的獨(dú)立性。
當(dāng) REST 架構(gòu)的約束條件作為一個整體應(yīng)用時,將生成一個可以擴(kuò)展到大量客戶端的應(yīng)用程序。它還降低了客戶端和服務(wù)器之間的交互延遲。統(tǒng)一界面簡化了整個系統(tǒng)架構(gòu),改進(jìn)了子系統(tǒng)之間交互的可見性。REST 簡化了客戶端和服務(wù)器的實現(xiàn)。
RESTful的實現(xiàn):RESTful Web 服務(wù)與 RPC 樣式的 Web 服務(wù)
了解了什么是什么是REST,我們再看看RESTful的實現(xiàn)。最近,使用 RPC 樣式架構(gòu)構(gòu)建的基于 SOAP 的 Web 服務(wù)成為實現(xiàn) SOA 最常用的方法。RPC 樣式的 Web 服務(wù)客戶端將一個裝滿數(shù)據(jù)的信封(包括方法和參數(shù)信息)通過 HTTP 發(fā)送到服務(wù)器。服務(wù)器打開信封并使用傳入?yún)?shù)執(zhí)行指定的方法。方法的結(jié)果打包到一個信封并作為響應(yīng)發(fā)回客戶端??蛻舳耸盏巾憫?yīng)并打開信封。每個對象都有自己獨(dú)特的方法以及僅公開一個 URI 的 RPC 樣式 Web 服務(wù),URI 表示單個端點(diǎn)。它忽略 HTTP 的大部分特性且僅支持 POST 方法。
由于輕量級以及通過 HTTP 直接傳輸數(shù)據(jù)的特性,Web 服務(wù)的 RESTful 方法已經(jīng)成為最常見的替代方法??梢允褂酶鞣N語言(比如 Java 程序、Perl、Ruby、Python、PHP 和 Javascript[包括 Ajax])實現(xiàn)客戶端。RESTful Web 服務(wù)通??梢酝ㄟ^自動客戶端或代表用戶的應(yīng)用程序訪問。但是,這種服務(wù)的簡便性讓用戶能夠與之直接交互,使用它們的 Web 瀏覽器構(gòu)建一個 GET URL 并讀取返回的內(nèi)容。
在 REST 樣式的 Web 服務(wù)中,每個資源都有一個地址。資源本身都是方法調(diào)用的目標(biāo),方法列表對所有資源都是一樣的。這些方法都是標(biāo)準(zhǔn)方法,包括 HTTP GET、POST、PUT、DELETE,還可能包括 HEADER 和 OPTIONS。
在 RPC 樣式的架構(gòu)中,關(guān)注點(diǎn)在于方法,而在 REST 樣式的架構(gòu)中,關(guān)注點(diǎn)在于資源 —— 將使用標(biāo)準(zhǔn)方法檢索并操作信息片段(使用表示的形式)。資源表示形式在表示形式中使用超鏈接互聯(lián)。
Leonard Richardson 和 Sam Ruby 在他們的著作 RESTful Web Services 中引入了術(shù)語 REST-RPC 混合架構(gòu)。REST-RPC 混合 Web 服務(wù)不使用信封包裝方法、參數(shù)和數(shù)據(jù),而是直接通過 HTTP 傳輸數(shù)據(jù),這與 REST 樣式的 Web 服務(wù)是類似的。但是它不使用標(biāo)準(zhǔn)的 HTTP 方法操作資源。它在 HTTP 請求的 URI 部分存儲方法信息。好幾個知名的 Web 服務(wù),比如 Yahoo 的 Flickr API 和 del.icio.us API 都使用這種混合架構(gòu)。
RESTful的實現(xiàn):RESTful Web 服務(wù)的 Java 框架
有兩個 Java 框架可以幫助構(gòu)建 RESTful Web 服務(wù)。erome Louvel 和 Dave Pawson 開發(fā)的 Restlet(見 參考資料)是輕量級的。它實現(xiàn)針對各種 RESTful 系統(tǒng)的資源、表示、連接器和媒體類型之類的概念,包括 Web 服務(wù)。在 Restlet 框架中,客戶端和服務(wù)器都是組件。組件通過連接器互相通信。該框架最重要的類是抽象類 Uniform 及其具體的子類 Restlet,該類的子類是專用類,比如 Application、Filter、Finder、Router 和 Route。這些子類能夠一起處理驗證、過濾、安全、數(shù)據(jù)轉(zhuǎn)換以及將傳入請求路由到相應(yīng)資源等操作。Resource 類生成客戶端的表示形式。
JSR-311是 Sun Microsystems 的規(guī)范,可以為開發(fā) RESTful Web 服務(wù)定義一組 Java API。Jersey是對 JSR-311 的參考實現(xiàn)。
JSR-311 提供一組注釋,相關(guān)類和接口都可以用來將 Java 對象作為 Web 資源展示。該規(guī)范假定 HTTP 是底層網(wǎng)絡(luò)協(xié)議。它使用注釋提供 URI 和相應(yīng)資源類之間的清晰映射,以及 HTTP 方法與 Java 對象方法之間的映射。API 支持廣泛的 HTTP 實體內(nèi)容類型,包括 HTML、XML、JSON、GIF、JPG 等。它還將提供所需的插件功能,以允許使用標(biāo)準(zhǔn)方法通過應(yīng)用程序添加其他類型。
RESTful的實現(xiàn):構(gòu)建 RESTful Web 服務(wù)的多層架構(gòu)
RESTful Web 服務(wù)和動態(tài) Web 應(yīng)用程序在許多方面都是類似的。有時它們提供相同或非常類似的數(shù)據(jù)和函數(shù),盡管客戶端的種類不同。例如,在線電子商務(wù)分類網(wǎng)站為用戶提供一個瀏覽器界面,用于搜索、查看和訂購產(chǎn)品。如果還提供 Web 服務(wù)供公司、零售商甚至個人能夠自動訂購產(chǎn)品,它將非常有用。與大部分動態(tài) Web 應(yīng)用程序一樣,Web 服務(wù)可以從多層架構(gòu)的關(guān)注點(diǎn)分離中受益。業(yè)務(wù)邏輯和數(shù)據(jù)可以由自動客戶端和 GUI 客戶端共享。惟一的不同點(diǎn)在于客戶端的本質(zhì)和中間層的表示層。此外,從數(shù)據(jù)訪問中分離業(yè)務(wù)邏輯可實現(xiàn)數(shù)據(jù)庫獨(dú)立性,并為各種類型的數(shù)據(jù)存儲提供插件能力。
圖 1 展示了自動化客戶端,包括 Java 和各種語言編寫的腳本,這些語言包括 Python、Perl、Ruby、PHP 或命令行工具,比如 curl。在瀏覽器中運(yùn)行且作為 RESTful Web 服務(wù)消費(fèi)者運(yùn)行的 Ajax、Flash、JavaFX、GWT、博客和 wiki 都屬于此列,因為它們都代表用戶以自動化樣式運(yùn)行。自動化 Web 服務(wù)客戶端在 Web 層向 Resource Request Handler 發(fā)送 HTTP 響應(yīng)??蛻舳说臒o狀態(tài)請求在頭部包含方法信息,即 POST、GET、PUT 和 DELETE,這又將映射到 Resource Request Handler 中資源的相應(yīng)操作。每個請求都包含所有必需的信息,包括 Resource Request Handler 用來處理請求的憑據(jù)。
從 Web 服務(wù)客戶端收到請求之后,Resource Request Handler 從業(yè)務(wù)邏輯層請求服務(wù)。Resource Request Handler 確定所有概念性的實體,系統(tǒng)將這些實體作為資源公開,并為每個資源分配一個惟一的 URI。但是,概念性的實體在該層是不存在的。它們存在于業(yè)務(wù)邏輯層??梢允褂?Jersey 或其他框架(比如 Restlet)實現(xiàn) Resource Request Handler,它應(yīng)該是輕量級的,將大量職責(zé)工作委托給業(yè)務(wù)層。
Ajax 和 RESTful Web 服務(wù)本質(zhì)上是互為補(bǔ)充的。它們都可以利用大量 Web 技術(shù)和標(biāo)準(zhǔn),比如 HTML、JavaScript、瀏覽器對象、XML/JSON 和 HTTP。當(dāng)然也不需要購買、安裝或配置任何主要組件來支持 Ajax 前端和 RESTful Web 服務(wù)之間的交互。RESTful Web 服務(wù)為 Ajax 提供了非常簡單的 API 來處理服務(wù)器上資源之間的交互。
圖 1 中的 Web 瀏覽器客戶端作為 GUI 的前端,使用表示層中的 Browser Request Handler 生成的 HTML 提供顯示功能。Browser Requester Handler 可以使用 MVC 模型(JSF、Struts 或 Spring 都是 Java 的例子)。它從瀏覽器接受請求,從業(yè)務(wù)邏輯層請求服務(wù),生成表示并對瀏覽器做出響應(yīng)。表示供用戶在瀏覽器中顯示使用。表示不僅包含內(nèi)容,還包含顯示的屬性,比如 HTML 和 CSS。
業(yè)務(wù)規(guī)則可以集中到業(yè)務(wù)邏輯層,該層充當(dāng)表示層和數(shù)據(jù)訪問層之間的數(shù)據(jù)交換的中間層。數(shù)據(jù)以域?qū)ο蠡蛑祵ο蟮男问教峁┙o表示層。從業(yè)務(wù)邏輯層中解耦 Browser Request Handler 和 Resource Request Handler 有助于促進(jìn)代碼重用,并能實現(xiàn)靈活和可擴(kuò)展的架構(gòu)。此外,由于將來可以使用新的 REST 和 MVC 框架,實現(xiàn)它們變得更加容易,無需重寫業(yè)務(wù)邏輯層。
數(shù)據(jù)訪問層提供與數(shù)據(jù)存儲層的交互,可以使用 DAO 設(shè)計模式或者對象-關(guān)系映射解決方案(如 Hibernate、OJB 或 iBATIS)實現(xiàn)。作為替代方案,業(yè)務(wù)層和數(shù)據(jù)訪問層中的組件可以實現(xiàn)為 EJB 組件,并取得 EJB 容器的支持,該容器可以為組件生命周期提供便利,管理持久性、事務(wù)和資源配置。但是,這需要一個遵從 Java EE 的應(yīng)用服務(wù)器(比如 JBoss),并且可能無法處理 Tomcat。該層的作用在于針對不同的數(shù)據(jù)存儲技術(shù),從業(yè)務(wù)邏輯中分離數(shù)據(jù)訪問代碼。數(shù)據(jù)訪問層還可以作為連接其他系統(tǒng)的集成點(diǎn),可以成為其他 Web 服務(wù)的客戶端。
數(shù)據(jù)存儲層包括數(shù)據(jù)庫系統(tǒng)、LDAP 服務(wù)器、文件系統(tǒng)和企業(yè)信息系統(tǒng)(包括遺留系統(tǒng)、事務(wù)處理系統(tǒng)和企業(yè)資源規(guī)劃系統(tǒng))。使用該架構(gòu),您可以開始看到 RESTful Web 服務(wù)的力量,它可以靈活地成為任何企業(yè)數(shù)據(jù)存儲的統(tǒng)一 API,從而向以用戶為中心的 Web 應(yīng)用程序公開垂直數(shù)據(jù),并自動化批量報告腳本。
python2和python3的區(qū)別
1.性能
Py3.0運(yùn)行 pystone benchmark的速度比Py2.5慢30%。Guido認(rèn)為Py3.0有極大的優(yōu)化空間,在字符串和整形操作上可以取得很好的優(yōu)化結(jié)果。
Py3.1性能比Py2.5慢15%,還有很大的提升空間。?
2.編碼?
Py3.X源碼文件默認(rèn)使用utf-8編碼,這就使得以下代碼是合法的:?
中國 = 'china'?
print(中國)?
china
3. 語法
1)去除了,全部改用!=
在Python 2里,為了得到一個任意對象的字符串表示,有一種把對象包裝在反引號里(比如`x`)的特殊語法。在Python 3里,這種能力仍然存在,但是你不能再使用反引號獲得這種字符串表示了。你需要使用全局函數(shù)repr()。
Notes
Python 2
Python 3
①
`x` ? ?repr(x) ?
②
`'PapayaWhip' + `2`` ? ?repr('PapayaWhip'+?repr(2)) ?
Note:x可以是任何東西?—?一個類,函數(shù),模塊,基本數(shù)據(jù)類型,等等。repr()函數(shù)可以使用任何類型的參數(shù)。
2)去除``,全部改用repr()
3)關(guān)鍵詞加入as 和with,還有True,False,None
4)整型除法返回浮點(diǎn)數(shù),要得到整型結(jié)果,請使用//
由于人們常常會忽視Python 3在整數(shù)除法上的改動(寫錯了也不會觸發(fā)Syntax Error),所以在移植代碼或在Python 2中執(zhí)行Python 3的代碼時,需要特別注意這個改動。
所以,我還是會在Python 3的腳本中嘗試用float(3)/2或 3/2.0代替3/2,以此來避免代碼在Python 2環(huán)境下可能導(dǎo)致的錯誤(或與之相反,在Python 2腳本中用from __future__ import division來使用Python 3的除法)。
Python 2
print?'3?/?2?=',?3?/?2?print?'3?//?2?=',?3?//?2?print?'3?/?2.0?=',?3?/?2.0?print?'3?//?2.0?=',?3?//?2.0?
3?/?2?=?1?3?//?2?=?1?3?/?2.0?=?1.5?3?//?2.0?=?1.0?
默認(rèn),如果兩個操作數(shù)都是整數(shù),Python 2 自動執(zhí)行整型計算。
Python 3
print('3?/?2?=',?3?/?2)?print('3?//?2?=',?3?//?2)?print('3?/?2.0?=',?3?/?2.0)?print('3?//?2.0?=',?3?//?2.0)?
3?/?2?=?1.5?3?//?2?=?1?3?/?2.0?=?1.5?3?//?2.0?=?1.0
Note: 需要注意的是“雙劃線”(//)操作符將一直執(zhí)行整除,而不管操作數(shù)的類型,這就是為什么 5.0//2.0 值為 2.0。Python 3 中,/ 操作符是做浮點(diǎn)除法,而 // 是做整除(即商沒有余數(shù),比如 10 // 3 其結(jié)果就為 3,余數(shù)會被截除掉,而 (-7) // 3 的結(jié)果卻是 -3。這個算法與其它很多編程語言不一樣,需要注意,它們的整除運(yùn)算會向0的方向取值。而在 Python 2 中,/ 就是整除,即和 Python 3 中的 // 操作符一樣。
5)加入nonlocal語句。使用noclocal x可以直接指派外圍(非全局)變量
6)print
去除print語句,加入print()函數(shù)實現(xiàn)相同的功能。同樣的還有 exec語句,已經(jīng)改為exec()函數(shù)
在Python 2里,print是一個語句。無論你想輸出什么,只要將它們放在print關(guān)鍵字后邊就可以。
Python 3里,print()是一個函數(shù)。就像其他的函數(shù)一樣,print()需要你將想要輸出的東西作為參數(shù)傳給它。
例如:?
2.X: print "The answer is", 2*2?
3.X: print("The answer is", 2*2)?
2.X: print x, # 使用逗號結(jié)尾禁止換行?
3.X: print(x, end=" ") # 使用空格代替換行
在Python 2里,如果你使用一個逗號(,)作為print語句的結(jié)尾,它將會用空格分隔輸出的結(jié)果,然后在輸出一個尾隨的空格(trailing space),而不輸出回車(carriage return)。在Python 3里,通過把end=' '作為一個關(guān)鍵字參數(shù)傳給print()可以實現(xiàn)同樣的效果。參數(shù)end的默認(rèn)值為'\n',所以通過重新指定end參數(shù)的值,可以取消在末尾輸出回車符。
2.X: print # 輸出新行?
3.X: print() # 輸出新行?
2.X: print sys.stderr, "fatal error"?
3.X: print("fatal error", file=sys.stderr)
在Python 2里,你可以通過使用pipe_name語法,把輸出重定向到一個管道,比如sys.stderr。在Python 3里,你可以通過將管道作為關(guān)鍵字參數(shù)file的值傳遞給print()來完成同樣的功能。參數(shù)file的默認(rèn)值為std.stdout,所以重新指定它的值將會使print()輸出到一個另外一個管道。
2.X: print (x, y) # 輸出repr((x, y))?
3.X: print((x, y)) # 不同于print(x, y)!
exec語句
exec()函數(shù)使用一個包含任意Python代碼的字符串作為參數(shù),然后就像執(zhí)行語句或者表達(dá)式一樣執(zhí)行它。exec()跟eval()是相似的,但是exec()更加強(qiáng)大并更具有技巧性。eval()函數(shù)只能執(zhí)行單獨(dú)一條表達(dá)式,但是exec()能夠執(zhí)行多條語句,導(dǎo)入(import),函數(shù)聲明?—?實際上整個Python程序的字符串表示也可以。
Notes
Python 2
Python 3
①
exec?codeString ? ?exec(codeString) ?
②
exec?codeString?in?a_global_namespace ? ?exec(codeString,?a_global_namespace) ?
③
exec?codeString?in?a_global_namespace,?a_local_namespace ? ?exec(codeString,?a_global_namespace,?a_local_namespace) ?
在最簡單的形式下,因為exec()現(xiàn)在是一個函數(shù),而不是語句,2to3會把這個字符串形式的代碼用括號圍起來。
Python 2里的exec語句可以指定名字空間,代碼將在這個由全局對象組成的私有空間里執(zhí)行。Python 3也有這樣的功能;你只需要把這個名字空間作為第二個參數(shù)傳遞給exec()函數(shù)。
更加神奇的是,Python 2里的exec語句還可以指定一個本地名字空間(比如一個函數(shù)里聲明的變量)。在Python 3里,exec()函數(shù)也有這樣的功能。
execfile語句
就像以前的exec語句,Python 2里的execfile語句也可以像執(zhí)行Python代碼那樣使用字符串。不同的是exec使用字符串,而execfile則使用文件。在Python 3里,execfile語句已經(jīng)被去掉了。如果你真的想要執(zhí)行一個文件里的Python代碼(但是你不想導(dǎo)入它),你可以通過打開這個文件,讀取它的內(nèi)容,然后調(diào)用compile()全局函數(shù)強(qiáng)制Python解釋器編譯代碼,然后調(diào)用新的exec()函數(shù)。
Notes
Python 2
Python 3
execfile('a_filename') ? ?exec(compile(open('a_filename').read(),'a_filename','exec')) ? ?
7)輸入函數(shù)改變了,刪除了raw_input,用input代替: Python 2有兩個全局函數(shù),用來在命令行請求用戶輸入。第一個叫做input(),它等待用戶輸入一個Python表達(dá)式(然后返回結(jié)果)。第二個叫做raw_input(),用戶輸入什么它就返回什么。這讓初學(xué)者非常困惑,并且這被廣泛地看作是Python語言的一個“肉贅”(wart)。Python 3通過重命名raw_input()為input(),從而切掉了這個肉贅,所以現(xiàn)在的input()就像每個人最初期待的那樣工作。
2.X:guess = int(raw_input('Enter an integer : ')) # 讀取鍵盤輸入的方法?
3.X:guess = int(input('Enter an integer : '))
Note:如果你真的想要請求用戶輸入一個Python表達(dá)式,計算結(jié)果,可以通過調(diào)用input()函數(shù)然后把返回值傳遞給eval()。
I/O方法xreadlines()
在Python 2里,文件對象有一個xreadlines()方法,它返回一個迭代器,一次讀取文件的一行。這在for循環(huán)中尤其有用。事實上,后來的Python 2版本給文件對象本身添加了這樣的功能。
在Python 3里,xreadlines()方法不再可用了。2to3可以解決簡單的情況,但是一些邊緣案例則需要人工介入。
Notes
Python 2
Python 3
①
for line in a_file.xreadlines(): ? ?for line in a_file: ? ?
②
for line in a_file.xreadlines(5): ? ?no change (broken) ? ?
如果你以前調(diào)用沒有參數(shù)的xreadlines(),2to3會把它轉(zhuǎn)換成文件對象本身。在Python 3里,這種轉(zhuǎn)換后的代碼可以完成前同樣的工作:一次讀取文件的一行,然后執(zhí)行for循環(huán)的循環(huán)體。
如果你以前使用一個參數(shù)(每次讀取的行數(shù))調(diào)用xreadlines(),2to3不能為你完成從Python 2到Python 3的轉(zhuǎn)換,你的代碼會以這樣的方式失?。篈ttributeError: '_io.TextIOWrapper' object has no attribute 'xreadlines'。你可以手工的把xreadlines()改成readlines()以使代碼能在Python 3下工作。(readline()方法在Python 3里返回迭代器,所以它跟Python 2里的xreadlines()效率是不相上下的。)
8)改變了順序操作符的行為,例如xy,當(dāng)x和y類型不匹配時拋出TypeError而不是返回隨即的 bool值
9)去除元組參數(shù)解包。不能def(a, (b, c)):pass這樣定義函數(shù)了
10)新式的8進(jìn)制字變量,相應(yīng)地修改了oct()函數(shù)。
2.X的方式如下:?
0666?
438?
oct(438)?
'0666'
3.X這樣:?
0666?
SyntaxError: invalid token (pyshell#63, line 1)?
0o666?
438?
oct(438)?
'0o666'
11)增加了 2進(jìn)制字面量和bin()函數(shù)?
bin(438)?
'0b110110110'?
_438 = '0b110110110'?
_438?
'0b110110110'
12)擴(kuò)展的可迭代解包。在Py3.X 里,a, b, *rest = seq和 *rest, a = seq都是合法的,只要求兩點(diǎn):rest是list對象和seq是可迭代的。
13)新的super(),可以不再給super()傳參數(shù),
class C(object):?
def __init__(self, a):?
print('C', a)?
class D(C):?
def __init(self, a):?
super().__init__(a) # 無參數(shù)調(diào)用super()?
D(8)?
C 8?
__main__.D object at 0x00D7ED90
14)支持class decorator。用法與函數(shù)decorator一樣:
def foo(cls_a):?
def print_func(self):?
print('Hello, world!')?
cls_a.print = print_func?
return cls_a?
@foo?
class C(object):?
pass?
C().print()?
Hello, world!?
class decorator可以用來玩玩貍貓換太子的大把戲。更多請參閱PEP 3129
4. 字符串和字節(jié)串
Python 2有兩種字符串類型:Unicode字符串和非Unicode字符串。Python 2有基于ASCII的str()類型,其可通過單獨(dú)的unicode()函數(shù)轉(zhuǎn)成unicode類型,但沒有byte類型。
而在Python 3中,終于有了Unicode(utf-8)字符串,以及兩個字節(jié)類:bytes和bytearrays。Python 3只有一種類型:Unicode字符串(Unicode strings)。只有str一種類型,但它跟2.x版本的unicode幾乎一樣。
Notes
Python 2
Python 3
①
u'PapayaWhip' ? ?'PapayaWhip' ? ?
②
ur'PapayaWhip\foo' ? ?r'PapayaWhip\foo' ? ?
Python 2里的Unicode字符串在Python 3里即普通字符串,因為在Python 3里字符串總是Unicode形式的。
Unicode原始字符串(raw string)(使用這種字符串,Python不會自動轉(zhuǎn)義反斜線"\")也被替換為普通的字符串,因為在Python 3里,所有原始字符串都是以Unicode編碼的。
全局函數(shù)unicode()
Python 2有兩個全局函數(shù)可以把對象強(qiáng)制轉(zhuǎn)換成字符串:unicode()把對象轉(zhuǎn)換成Unicode字符串,還有str()把對象轉(zhuǎn)換為非Unicode字符串。
Python 3只有一種字符串類型,Unicode字符串,所以str()函數(shù)即可完成所有的功能。(unicode()函數(shù)在Python 3里不再存在了。)
Notes
Python 2
Python 3
unicode(anything) ? ?str(anything) ? ?
5.數(shù)據(jù)類型?
1)Python 2有為非浮點(diǎn)數(shù)準(zhǔn)備的int和long類型。int類型的最大值不能超過sys.maxint,而且這個最大值是平臺相關(guān)的。可以通過在數(shù)字的末尾附上一個L來定義長整型,顯然,它比int類型表示的數(shù)字范圍更大。
在Python 3里,只有一種整數(shù)類型int,大多數(shù)情況下,它很像Python 2里的長整型。
Note:檢查一個變量是否是整型,獲得它的數(shù)據(jù)類型,并與一個int類型(不是long)的作比較。你也可以使用isinstance()函數(shù)來檢查數(shù)據(jù)類型;再強(qiáng)調(diào)一次,使用int,而不是long,來檢查整數(shù)類型。
sys.maxint
由于長整型和整型被整合在一起了,sys.maxint常量不再精確。但是因為這個值對于檢測特定平臺的能力還是有用處的,所以它被Python 3保留,并且重命名為sys.maxsize。
Notes
Python 2
Python 3
①
from sys import maxint ? ?from sys import maxsize ? ?
②
元組是一種固定長度、不可變的Python對象序列。創(chuàng)建元組最簡單的辦法是用逗號分隔序列值:
tuple 函數(shù)將任意序列或迭代器轉(zhuǎn)換為元組:
中括號 [] 可以獲取元組的元素, Python中序列索引從0開始 :
元組一旦創(chuàng)建,各個位置上的對象是無法被修改的,如果元組的一個對象是可變的,例如列表,你可以在它內(nèi)部進(jìn)行修改:
可以使用 + 號連接元組來生成更長的元組:
元組乘以整數(shù),則會和列表一樣,生成含有多份拷貝的元組:
將元組型的表達(dá)式賦值給變量,Python會對等號右邊的值進(jìn)行拆包:
拆包的一個常用場景就是遍歷元組或列表組成的序列:
*rest 用于在函數(shù)調(diào)用時獲取任意長度的位置參數(shù)列表:
count 用于計量某個數(shù)值在元組中出現(xiàn)的次數(shù):
列表的長度可變,內(nèi)容可以修改??梢允褂?[] 或者 list 類型函數(shù)來定義列表:
append 方法將元素添加到列表尾部:
insert 方法可以將元素插入到指定列表位置:
( 插入位置范圍在0到列表長度之間 )
pop 是 insert 的反操作,將特定位置的元素移除并返回:
remove 方法會定位第一個符合要求的值并移除它:
in 關(guān)鍵字可以檢查一個值是否在列表中;
not in 表示不在:
+ 號可以連接兩個列表:
extend 方法可以向該列表添加多個元素:
使用 extend 將元素添加到已經(jīng)存在的列表是更好的方式,比 + 快。
sort 方法可以對列表進(jìn)行排序:
key 可以傳遞一個用于生成排序值的函數(shù),例如通過字符串的長度進(jìn)行排序:
bisect.bisect 找到元素應(yīng)當(dāng)被插入的位置,返回位置信息
bisect.insort 將元素插入到已排序列表的相應(yīng)位置保持序列排序
bisect 模塊的函數(shù)并不會檢查列表是否已經(jīng)排序,因此對未排序列表使用bisect不會報錯,但是可能導(dǎo)致不正確結(jié)果
切片符號可以對大多數(shù)序列類型選取子集,基本形式是 [start:stop]
起始位置start索引包含,結(jié)束位置stop索引不包含
切片還可以將序列賦值給變量:
start和stop可以省略,默認(rèn)傳入起始位置或結(jié)束位置,負(fù)索引可以從序列尾部進(jìn)行索引:
步進(jìn)值 step 可以在第二個冒號后面使用, 意思是每隔多少個數(shù)取一個值:
對列表或元組進(jìn)行翻轉(zhuǎn)時,一種很聰明的用法時向步進(jìn)值傳值-1:
dict(字典)可能是Python內(nèi)建數(shù)據(jù)結(jié)構(gòu)中最重要的,它更為常用的名字是 哈希表 或者 關(guān)聯(lián)數(shù)組 。
字典是鍵值對集合,其中鍵和值都是Python對象。
{} 是創(chuàng)建字典的一種方式,字典中用逗號將鍵值對分隔:
你可以訪問、插入或設(shè)置字典中的元素,:
in 檢查字典是否含有一個鍵:
del 或 pop 方法刪除值, pop 方法會在刪除的同時返回被刪的值,并刪除鍵:
update 方法將兩個字典合并:
update方法改變了字典元素位置,對于字典中已經(jīng)存在的鍵,如果傳給update方法的數(shù)據(jù)也含有相同的鍵,則它的值將會被覆蓋。
字典的值可以是任何Python對象,但鍵必須是不可變的對象,比如標(biāo)量類型(整數(shù)、浮點(diǎn)數(shù)、字符串)或元組(且元組內(nèi)對象也必須是不可變對象)。
通過 hash 函數(shù)可以檢查一個對象是否可以哈?;词欠窨梢杂米髯值涞逆I):
集合是一種無序且元素唯一的容器。
set 函數(shù)或者是用字面值集與大括號,創(chuàng)建集合:
union 方法或 | 二元操作符獲得兩個集合的聯(lián)合即兩個集合中不同元素的并集:
intersection 方法或 操作符獲得交集即兩個集合中同時包含的元素:
常用的集合方法列表:
和字典類似,集合的元素必須是不可變的。如果想要包含列表型的元素,必須先轉(zhuǎn)換為元組:
這篇文章翻譯而來。
讓我來給你們做一個非常簡單的,適用的解釋。
REST是一套用來創(chuàng)建Web Service的方法。
REST式的Web Service的主旨是讓事情盡量的簡單化。
REST式的Web Service使用HTTP里的方法:GET, POST, DELETE, PUT。你不需要使用URL或請求的內(nèi)容來指定這個方法。
REST式的Web Service使用HTTP狀態(tài)碼作為返回值。
REST式的Web Service調(diào)用產(chǎn)生的HTTP請求內(nèi)容只是用于服務(wù)數(shù)據(jù)不是用來指明調(diào)用方法,目標(biāo)對象或返回值的。
使用REST方法來開發(fā)Web Service的關(guān)鍵點(diǎn)是利用HTTP協(xié)議的簡單性,而不是去擴(kuò)展這個協(xié)議。你的Web Service調(diào)用最終應(yīng)該是非常的簡單而且非常的易于理解。
下面是一個調(diào)用REST式的Web Service的例子。用的是一個Javascript函數(shù),它從Web Service里取回一個任務(wù)對象。
functionsendGetTaskRequest(packet, template, task, handler){//這一行創(chuàng)建一個Web請求
requestGetTask=newXMLHttpRequest();//這一行指明請求的HTTP方法和URL。//注意這個URL是一個簡單的對象的路徑。
requestGetTask.open(GET, baseUrl+/v1/packets/+ packet +/templates/+ template +/tasks/+ task);//這一行調(diào)用一個方法來處理響應(yīng)的數(shù)據(jù)
requestGetTask.onreadystatechange=handler;//這一行用來發(fā)送請求
requestGetTask.send();}為了獲取一個任務(wù),你只要對這個任務(wù)的URL發(fā)送一個GET請求。為了添加一個任務(wù),你只需要向這個任務(wù)的URL發(fā)送一個POST請求。REST使Web Service用起來非常的簡單。
#?-*-?coding:utf-8?-*-
binaryDic={'+':float.__add__,
'-':float.__sub__,
'*':float.__mul__,
'/':float.__truediv__,
'%':float.__mod__,
'**':float.__pow__,}
unaryDic={'-':float.__neg__,
'+':float.__pos__,}
priorDic=dict((('**',3),('*',2),('/',2),('%',2),('+',1),('-',1)))
def?is_float(s):
'判斷是否浮點(diǎn)數(shù)字符'
return?s.isdigit()?or?s=='.'
def?is_prior(firOpf,secOpf):
'判斷運(yùn)算符的優(yōu)先級'
if?secOpf=='**':
return?False
return?priorDic[firOpf]=priorDic[secOpf]
def?wipe_brace(s,start=0):
's是以左括號開頭的字符串'
'此函數(shù)將消去括號,求出括號內(nèi)的值,并返回剩余字符'
pos=s.find(')',start)
if?s[1:pos].count('(')==s[1:pos].count(')'):
return?s[pos+1:]?,ieval(s[1:pos])?
return?wipe_brace(s,pos+1)
def?get_Longest_number(s,num=''):
's是以左括號或數(shù)字開頭的字符串'
'返回s首位開始的最長連續(xù)數(shù)字串和剩余字符串'
if?not?s?:
return?s,num
if?s[0]=='(':
return?wipe_brace(s)
if?is_float(s[0]):
return?get_Longest_number(s[1:],num+s[0])
return?s,num
def?get_val(fir='',opf='',sec=''):
'智能求值函數(shù).能進(jìn)行一元,二元或純值運(yùn)算'
if?opf:
if?sec:
return?str(binaryDic[opf](float(fir),float(sec)))
return?str(unaryDic[opf](float(fir)))
return?fir
def?get_safeSec(s,cmpOpf='**',neg='',safeSec='',):
'比較s的第一個二元運(yùn)算符和cmpOpf的優(yōu)先級'
'以便獲得安全的第二個值'
if?not?s:
return?s,get_val(safeSec,neg)
if?not?safeSec:
if?s[0]=='+':
return?get_safeSec(s[1:],cmpOpf,neg)
if?s[0]=='-':
return?get_safeSec(s[1:],cmpOpf,''?if?neg=='-'?else?'-')??
if?is_float(s[0])?or?s[0]=='(':
rest,safeSec=get_Longest_number(s)
return?get_safeSec(rest,cmpOpf,neg,safeSec)
opfNum=?2?if?s[:2]=='**'?else?1
if?is_prior(cmpOpf,s[:opfNum]):
return?s,get_val(safeSec,neg)
rest,safeNum=get_safeSec(s[opfNum:],s[:opfNum])
return?get_safeSec(rest,cmpOpf,neg,get_val(safeSec,s[:opfNum],safeNum))
def?ieval(s='',fir='',opf='',sec=''):
'控制整個解析流程'
if?not?s:
return?get_val(fir,opf,sec)
if?not?fir:
if?s[0]=='-':????????????
return?ieval(s[1:],fir,''?if?opf=='-'?else?'-')
if?s[0]=='+':
return?ieval(s[1:],fir,opf)
if?is_float(s[0])?or?s[0]=='(':
return?ieval(*get_Longest_number(s),opf=opf)
if?not?sec:
if?not?opf:
opfNum=?2?if?s[:2]=='**'?else?1
rest,sec=get_safeSec(s[opfNum:],s[:opfNum])
return?ieval(rest,fir,s[:opfNum],sec)
if?s[:2]!='**':
return?ieval(s,get_val(fir,opf))
rest,sec=get_safeSec(s[2:])
return?ieval(rest,get_val(fir,'**',sec),opf)
return?ieval(s,get_val(fir,opf,sec))
if?__name__=='__main__':
test=['1+2*3*4*5+20',
'1+2*3',
'1.1+20.02+300.003',
'-2**2',
'(-2)**2',
'1+2*3**-2**(2-3)*2',
'-2**-2**-2**-2',
'(1+2)*(2+3)/(1-3)',?
'((9+3)/2)',?
'((1234)-1)',?
'1-3*--+++-2**--+++((-2))**--+++-(1-2)**--+++-2*2+1*2**6%9',
'((1+3*(-2)**2)*((2%3+((3+3)*2**3+1))*(1-3)*(1+2)+5*6)*4)']
for?x?in?test:
print(ieval(x),'___',eval(x))
結(jié)果:
141.0?___?141
7.0?___?7
321.123?___?321.123
-4.0?___?-4
4.0?___?4
3.309401076758503?___?3.309401076758503
-0.5582965649524321?___?-0.5582965649524321
-7.5?___?-7.5
6.0?___?6.0
1233.0?___?1233
6.242640687119286?___?6.242640687119286
-14352.0?___?-14352
當(dāng)前題目:rest函數(shù)python rest命令
本文來源:http://jinyejixie.com/article12/dodoegc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、關(guān)鍵詞優(yōu)化、服務(wù)器托管、App開發(fā)、響應(yīng)式網(wǎng)站、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)