css選擇器和xpath對照表,webdriver一個標簽包含多個文本字段?
利用Xpath定位:
首先推薦用谷歌內核的瀏覽器,找到你要定位的元素源碼:F12—同時摁住ctrl+shift+c鍵——在網頁上點擊你需要定位的文本——調試框會自動選擇你點擊的文本源碼——點擊源碼框里面的源碼—右鍵copy——copy Xpath得到的Xpath就是你需要獲取的文本所在的HTML路徑:
比如,我拿到了一個這樣的Xpath: //*[@id='ajaxgrid']/tbody/tr[1]/td[3]
#點擊這個元素就可以這樣寫
browser.find_element_by_xpath('//*[@id='ajaxgrid']/tbody/tr[1]/td[3]').click()
怎樣學好python?
既然是毫無基礎,那就簡單介紹一下吧,python的入門其實只需要掌握幾個關鍵點就行,新手要先學會安裝環境、了解數據結構、函數這些東西,再配合實操進行實踐,基本就可以入門了。
提示!!文章內容較長,大約需要半個小時,可以先收藏再慢慢看,目錄如下:
一、了解環境
二、了解數據結構
三、了解基本函數
四、了解Nuypm計算包
——————正文警告!!——————
一、環境Python的編寫環境,用Anaconda足矣。Anaconda是專業的數據科學計算環境,已經集成絕大部分包和工具,不需要多余的安裝和調試。
Python版本建議3.0以上,不要選擇2.7的版本,否則你會被無盡的中文編碼問題困擾。
Anaconda在官網下載,選擇最新版本,約400MB。
完成安裝后,Win版本會多出幾個程序,Mac版本只有一個Navigator導航。數據分析最常用的程序叫Jupyter,以前被稱為IPython Notebook,是一個交互式的筆記本,能快速創建程序,支持實時代碼、可視化和Markdown語言。
點擊Jupyter進入,它會自動創建一個本地環境localhost。
點擊界面右上角的new,創建一個python文件。
開始你的Python
界面上部是工具欄,編輯撤回運行等,下面是快捷操作,大家以后會熟悉的。頁面正中便是腳本執行的地方,我們輸入自己第一行代碼吧:
(我就不用hello world)灰色框是輸入程序的地方,回車是換行,shift+回車執行灰色區域的代碼,它的結果會直接在下面空白處出現。這就是Jupyter交互式的強大地方,將Python腳本分成片段式運行,尤其適合數據分析的摸索調整工作。
這里的print叫函數,和excel的函數同理,是程序執行的主體,負責將輸入轉化成輸出(函數留在下一篇細講)。這里將hello qinlu這段文字輸出。新手可能會奇怪為什么要加引號,這種用引號括起來的文字在程序中叫字符串。
Python是一門計算機語言,它的邏輯和自然語言不一樣,編程語言的目的是執行任務,所以它不能有歧義。為了規避各種歧義,人們創造了語法規則,只有正確的語法,才能被轉換成CPU執行的機器碼。
先了解Python語法中的數據類型。計算機最開始只被用于數值運算,后來被賦予了各種豐富的數據類型。
上面兩個是小學生都會的四則運算,在計算機語言中可沒有那么簡單。它涉及了兩個數值類型,整數int和浮點數float。整數和浮點數在計算機內部存儲的方式是不同的,我們不用知道具體原理,明確一點,整數運算是永遠精確的,浮點運算則可能有誤差。
兩種數據類型也可以互換,通過int函數和float函數。
有了數值,必然有文本,程序中叫字符串,用英文引號括起來表示。單引號和雙引號沒有區別,所以"qinlu"和'qinlu'是等價的,引號是邊界,輸出的時候不會包含它。當字符串內本身包含引號時,也不影響使用。
需要注意的是,不論單引號還是雙引號,一旦混用很容易出現錯誤。因為程序并不知道它是字符串的邊界還是符號。
解決方法有兩種,一種是使用三引號,三引號代表整體引用,而且包含換行。第二種是引號前面加\,它是轉義字符,表示這個引號就是單純的字符。
三引號也可以用來注釋,通常是大段的文字解釋,如果一句話,我們更習慣用#,#后面的內容均不會作為程序執行。
時間是特殊的數值類型,它將結合datetime模塊講解。
還有兩個常見的數據類型,布爾值和空值。布爾值是邏輯判斷值,只有True和False。
布爾值在IF語句和數據清洗中經常使用,利用其過濾。布爾值能和布爾值運算,不過這里是and、not、or作為運算符,Ttue and True = True,False and True = False,False and False = False,not True = False,True or False = True等。
空值是一個特殊的值,表示為None,None不等于0,0具有數學意義而None沒有,None更多表示該值缺失。
整數,浮點數,字符串,布爾值,空值就是Python常見的數據類型。Python3對中文的支持比較友好,所以大家可以用中文作為字符串試一下print。
數據類型構成了變量的基礎,變量可以是任意的數據類型。想要用變量,必須先賦予變量一個值,這個過程叫賦值。
我首先給a賦予了一個整數值1,然后改變它為字符串abc,變量在Python中沒有固定的數值類型,這是Python最大的優點,所以它在數據分析中很靈活。這也是它被稱為動態語言的原因,相對應的叫靜態語言。
Python是大小寫敏感的語言,所以a和A是有區別的,這點請牢記。另外變量名盡可能使用英文,不要拼音,英文的可讀性是優于拼音的。
變量有兩種拼寫風格,一種叫駝峰,一種叫下劃線,以用戶ID為例。駝峰命名法為userId,以一串英文詞語user和id組成變量,第一個詞語的首字母小寫,第二個詞語開始的首字母均大寫。下劃線命名法為user_id,全部小寫,用_分割單詞。
一個變量的值可以被賦予另外一個變量,如果b變量之前有另外一個值,那么會被1覆蓋。呈從上而下的執行關系。
初看a = a + 1好像有邏輯問題,其實這涉及到了程序執行的先后順序,程序是先計算a+1的值得到2,然后將其賦予(覆蓋)了a。等號右邊的計算先于左邊,這是從右到左的邏輯關系。
有變量,自然有常量,常量是固定不變的量,可是在Python中沒有真正意義的常量,一切皆可變,它更多是習慣上的叫法,即一旦賦值,就不再改變了。
Python的基礎數學運算符號有+,-,*,/,//,%。前面四個就是加減乘除,其中除法的結果一定是浮點數。后面兩個符號是除法的特殊形式,//代表除法中取整數,%代表除法中取余數。
到這里,新手部分已經講解完成。再來講講數據結構。
二、數據結構Python一共有三大數據結構,它是Python進行數據分析的基礎,分別是tuple元組,list數組以及dict字典。本文通過這三者的學習,打下數據分析的基礎。
1、數組
數組是一個有序的集合,他用方括號表示。
num就是一個典型的數組。數組不限定其中的數據類型,可以是整數也可以是字符串,或者是混合型。
數組可以直接用特定的函數,函數名和Excel相近。
sum是求和,len則是統計數組中的元素個數。
上述列舉的函數是數組內整體元素的應用,如果我只想針對單一的元素呢?比如查找,這里就要用到數組的特性,索引。索引和SQL中的索引差不多,都是用來指示數據所在位置的邏輯指針。數組的索引便是元素所在的序列位置。
注意,索引位置是從0開始算起,這是編程語言的默認特色了。num[0]指數組的第一個元素,num[1]指數組的第二個元素。
我們用len()計算出了數組元素個數是5,那么它最后一個元素的索引是4。若是數組內的元素特別多呢?此時查找數組最后一位的元素會有點麻煩。Python有一個簡易的方法,可以用負數表示,意為從最后一個數字計算索引。
這里的num[4]等價于num[-1],num[-2]則指倒數第二個的元素。
再來一個新問題,如何一次性選擇多個元素?例如篩選出數組前三個元素。在Python中,用:表示范圍。
num[0:3]篩選了前三個元素,方括號左邊是閉區間,右邊是開區間,所以這里是num[0],num[1]和num[2],并不包含num[3]。這個方法叫做切片。
上述是索引的特殊用法,[0:]表示從第0個索引開始,直到最后一個元素。[:3]表示從第一個元素開始,直到第3個索引。
負數當然也有特殊用法。[-1:]表示從最后一個元素開始,因為它已經是最后一個元素了,所以只返回它本身。[:-1]表示從第一個元素開始到最后一個元素。num[-2:-1]和num[-3:-1]大同小異。
數組的增刪查
我們已經了解數組的基本概念,不過仍舊停留在查找,它不涉及數據的變化。工作中,更多需要操縱數組,對數組的元素進行添加,刪除,更改。
數組通過insert函數插入,函數的第一個參數表示插入的索引位置,第二個表示插入的值。
另外一種方式是append,直接在數組末尾添加上元素。它在之后講到迭代和循環時應用較多。
如果要刪除特定位置的元素,用pop函數。如果函數沒有選擇數值,默認刪除最后一個元素,如果有,則刪除數值對應索引的元素。
更改元素不需要用到函數,直接選取元素重新賦值即可。
到這里,數組增刪改查已經講完,但這只是一維數組,一維數組之上還有多維數組。如果現在有一份數據是關于學生信息,一共有三個學生,要求包含學生的姓名,年齡,和性別,應該怎么用數組表示呢?
有兩種思路,一種是用三個一維數組分別表示學生的姓名,年齡和性別。
學生屬性被拆分成多個數組,利用索引來表示其信息,這里的索引有些類似SQL的主鍵,通過索引查找到信息。但是這種方法并不直觀,實際應用會比較麻煩,更好的方法是表示成多維數組。
所謂多維數組,是數組內再嵌套數組,圖中表示的是一個寬度為3,高度為3的二維數組。此時student[0]返回的是數組而不是單一值。這種方法將學生信息合并在一起,比第一個案例更容易使用。
如果想選擇第一個學生的性別,應該怎么辦呢?很簡單,后面再加一個索引即可。
現在嘗試快速創建一個多維數組。
[0]*3將快速生成3個元素值為0的數組,這是一種快捷操作,而[row]*4則將其擴展成二維數據,因為是4,所以是3*4的結構。
這里有一個注意點,當我們想更改多維數組中的某一個元素而不是數組時,這種方式會錯誤。
按照正常的想法,martix[1][0]將會改變第二個數組中的第一個值為1,但是結果是所有數組的第一個值都變成1。這是因為在matrix = [row] * 4操作中,只是創建3個指向row的引用,可以簡單理解成四個數組是一體的。一旦其中一個改變,所有的都會變。
比較穩妥的方式是直接定義多維數組,或者用循環間接定義。多維數組是一個挺重要的概念,它也能直接表示成矩陣,是后續很多算法和分析的基礎(不過在pandas中,它是另外一種形式了)。
2、元組
tuple叫做元組,它和數組非常相似,不過用圓括號表示。但是它最大的特點是不能修改。
當我們想要修改時就會報錯。
而選擇和數組沒有差異。
元組可以作為簡化版的數組,因為它不可更改的特性,很多時候可以作為常量使用,防止被篡改。這樣會更安全。
3、字典
字典dict全稱dictionary,以鍵值對key-value的形式存儲。所謂鍵值,就是將key作為索引存儲。用大括號表示。
圖中的'qinlu'是key,18是value值。key是唯一的,value可以對應各種數據類型。key-value的原理不妨想象成查找字典,拼音是key,對應的文字是value(當然字典的拼音不唯一)。
字典和數組的差異在于,因為字典以key的形式存儲和查找,所以它的查詢速度非常快,畢竟翻字典的時候你只要知道拼音就能快速定位了。對dict數據結構,10個key和10萬個key在查找對應的value時速度沒有太大差別。
這種查找方式的缺點是占用內存大。數組則相反,查找速度隨著元素的增加逐漸下降,這個過程想象成程序在一頁頁的翻一本沒有拼音的字典,直到找到內容。數組的優點是占用的內存空間小。
所以數組和字典的優缺點相反,dict是空間換時間,list是時間換空間,這是編程中一個比較重要的概念。實際中,數據分析師的工作不太涉及工程化,選用數組或者字典沒有太嚴苛的限制。
細心的讀者可能已經發現,字典定義時我的輸入順序是qinlu,lulu,qinqin,而打印出來是lulu,qinlu,qinqin,順序變了。這是因為定義時key的順序和放在內存的key順序沒有關系,key-value通過hash算法互相確定,甚至不同Python版本的哈希算法也不同。這一點應用中要避免出錯。
既然字典通過key-value對匹配查找,那么它自然不能不用數組的數值索引,它只能通過key值。
如果key不存在,會報錯。通過in方法,可以返回True或False,避免報錯。
dict和list一樣,直接通過賦值更改value
能不能更改key的名字?不能,key一旦確定,就無法再修改,好比字典定好后,你能修改字的拼音么?
dict中刪除key和list一樣,通過pop函數。增加key則是直接賦予一個新的鍵值對。
dict的keys和values兩個函數直接輸出所有的key值和value值。如果要轉換成數組,則再外面嵌套一個list函數
items函數,將key-value對變成tuple形式,以數組的方式輸出。
字典可以通過嵌套應用更復雜的數據格式,和NoSQL與JSON差不多。
基礎的數據類型差不多了,更多函數應用大家可以網上自行查閱文檔,這塊掌握了,在數據清洗過程中將會非常高效,尤其是讀取Excel數據時。當然不要求滾瓜爛熟,因為后面將學習更加強大的Numpy和Pandas。
三、基本函數1. 函數是什么
函數(Functions)是指可重復使用的程序片段。它們允許你為某個代碼塊賦予名字,允許你通過這一特殊的名字在你的程序任何地方來運行代碼塊,并可重復任何次數。這就是所謂的調用(Calling)函數。
在 Python 中,函數可以通過關鍵字 def 來定義。這一關鍵字后跟一個函數的標識符名稱,再跟一對圓括號,其中可以包括一些變量的名稱,再以冒號結尾,結束這一行。隨后而來的語句塊是函數的一部分。
在定義函數時給定的名稱稱作“形參”(Parameters),在調用函數時你所提供給函數的值稱作“實參”(Arguments)。
2. 調用函數
要調用一個函數,需要知道函數的名稱和參數。函數的參數只是輸入到函數之中,以便我們可以傳遞不同的值給它,并獲得相應的結果。
Python 內置的常用函數包括數據類型轉換函數,比如int()函數可以把其他數據類型轉換為整數。用input()讀取用戶的輸入:
因為input()返回的數據類型是str,str不能直接和整數比較,必須先把str轉換成整數。Python 提供了int()函數來完成這件事情:
函數名其實就是指向一個函數對象的引用,完全可以把函數名賦給一個變量,相當于給這個函數起了一個“別名”:
如果函數調用出錯,一定要學會看錯誤信息。
3.定義函數
在 Python 中,定義一個函數要使用def語句,依次寫出函數名、括號、括號中的參數和冒號:,然后,在縮進塊中編寫函數體,函數的返回值用return語句返回。
在 Python 交互環境中定義函數時,注意 Python 會出現...的提示。函數定義結束后需要按兩次回車重新回到>>>提示符下:
如果你已經把my_abs()的函數定義保存為abstest.py文件了,那么,可以在該文件的當前目錄下啟動Python 解釋器,用from abstest import my_abs來導入my_abs()函數,注意abstest是文件名(不含.py擴展名)。
定義一個什么事也不做的空函數,可以用pass語句:
pass語句什么都不做,實際上它可以用作為占位符,比如現在還沒想好怎么寫函數的代碼,就可以先放一個pass,讓代碼能運行起來。
pass還可以用在其他語句里,比如:
缺少了pass,代碼運行就會有語法錯誤。
數據類型檢查可以用內置函數isinstance()實現。
Python 的函數返回多值其實就是返回一個tuple;Python 函數返回的是單一值時,返回值仍然是一個tuple。但是,在語法上,返回一個tuple可以省略括號,而多個變量可以同時接收一個tuple,按位置賦給對應的值。函數可以同時返回多個值,但其實就是一個tuple。
函數執行完畢也沒有return語句時,自動return None。
4.函數的參數
Python 的函數定義非常簡單,但靈活度卻非常大。除了正常定義的必選參數外,還可以使用默認參數、可變參數和關鍵字參數,使得函數定義出來的接口,不但能處理復雜的參數,還可以簡化調用者的代碼。
4.1 位置參數:
power(x, n)函數有兩個參數:x和n,這兩個參數都是位置參數,調用函數時,傳入的兩個值按照位置順序依次賦給參數x和n。
4.2 默認參數:
對于一些函數來說,你可能為希望使一些參數可選并使用默認的值,以避免用戶不想為他們提供值的情況。默認參數值可以有效幫助解決這一情況。你可以通過在函數定義時附加一個賦值運算符=來為參數指定默認參數值。要注意到,默認參數值應該是常數。更確切地說,默認參數值應該是不可變的。
n = 2 是默認參數
定義默認參數要牢記一點:默認參數必須指向不變對象。且只有那些位于參數列表末尾的參數才能被賦予默認參數值,意即在函數的參數列表中擁有默認參數值的參數不能位于沒有默認參數值的參數之前。
4.3 可變參數:
有時你可能想定義的函數里面能夠有任意數量的變量,也就是參數數量是可變的,這可以通過使用星號來實現。即傳入的參數個數是可變的。
我們聲明一個諸如 *param 的星號參數時,從此處開始直到結束的所有位置參數(Positional Arguments)都將被收集并匯集成一個稱為param的元組(Tuple)。
類似地,當我們聲明一個諸如 **param 的雙星號參數時,從此處開始直至結束的所有關鍵字參數都將被收集并匯集成一個名為 param 的字典(Dictionary)。
4.4 關鍵字參數:
如果你有一些具有許多參數的函數,而你又希望只對其中的一些進行指定,那么你可以通過命名它們來給這些參數賦值——這就是關鍵字參數(Keyword Arguments)——我們使用命名(關鍵字)而非位置來指定函數中的參數。
關鍵字參數允許你傳入 0 個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝為一個dict。
舉個例子,擴展函數的功能。試想你正在做一個用戶注冊的功能,除了用戶名和年齡是必填項外,其他都是可選項,利用關鍵字參數來定義這個函數就能滿足注冊的需求。
和可變參數類似,也可以先組裝出一個dict,然后,把該dict轉換為關鍵字參數傳進去:
4.5 命名關鍵字參數:
如果要限制關鍵字參數的名字,就可以用命名關鍵字參數,例如,只接收city和job作為關鍵字參數。這種方式定義函數并調用:
和關鍵字參數**kw不同,命名關鍵字參數需要一個特殊分隔符*,*后面的參數被視為命名關鍵字參數。
命名關鍵字參數必須傳入參數名,這和位置參數不同。如果沒有傳入參數名,調用將報錯。
使用命名關鍵字參數時,要特別注意,如果沒有可變參數,就必須加一個*作為特殊分隔符。如果缺少*,Python 解釋器將無法識別位置參數和命名關鍵字參數,即缺少 *,city和job被視為位置參數。
4.6 參數組合:
在 Python 中定義函數,可以用必選參數、默認參數、可變參數、關鍵字參數和命名關鍵字參數,這 5 種參數都可以組合使用。
但是參數定義的順序必須是:必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。雖然可以組合多達 5 種參數,但不要同時使用太多的組合,否則函數接口的可理解性很差。
通過一個tuple和dict,你也可以調用函數:
對于任意函數,都可以通過類似func(*args, **kw)的形式調用它,無論它的參數是如何定義的。
5. 遞歸函數
如果一個函數在內部調用自身本身,這個函數就是遞歸函數。理論上,所有的遞歸函數都可以寫成循環的方式,但循環的邏輯不如遞歸清晰。
使用遞歸函數需要注意防止棧溢出。在計算機中,函數調用是通過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由于棧的大小不是無限的,所以,遞歸調用的次數過多,會導致棧溢出。
通過下面的代碼可以查看你的電腦最大算到多少:
解決遞歸調用棧溢出的方法是通過尾遞歸優化,事實上尾遞歸和循環的效果是一樣的,所以,把循環看成是一種特殊的尾遞歸函數也是可以的。
尾遞歸是指,在函數返回的時候,調用自身本身,并且,return語句不能包含表達式。這樣,編譯器或者解釋器就可以把尾遞歸做優化,使遞歸本身無論調用多少次,都只占用一個棧幀,不會出現棧溢出的情況。
要改成尾遞歸方式,需要多一點代碼,主要是要把每一步的乘積傳入到遞歸函數中。Python 標準的解釋器沒有針對尾遞歸做優化,任何遞歸函數都存在棧溢出的問題
四、了解Mumpy包Python數據分析絕對繞不過的四個包是numpy、scipy、pandas還有matplotlib。
numPy是Python數值計算最重要的基礎包,大多數提供科學計算的包都是用numPy的數組作為構建基礎。專門用來處理矩陣,它的運算效率比列表更高效。
1、NumPy 的 ndarray:多維數組對象
numpy的數據結構是n維的數組對象,叫做ndarray。可以用這種數組對整塊數據執行一些數學運算,其語法跟標量元素之間的運算一樣。
創建并操作多維數組:
"/>這里沒寫 np.float64 只寫了 float,但是NumPy會將 Python 類型映射到等價的dtype上。
數組的dtype的另一個用法:
"/>u4(unit32):無符號的 32 位(4個字節)整型。
調用astype無論如何都會創建出一個新的數組(原始數據的一份拷貝)。
浮點數只能表示近似的分數值,在復雜計算中可能會積累一些浮點錯誤,因此比較操作只在一定小數位以內有效。
4、數組和標量之間的運算
數組:可對數據執行批量運算(不用編寫循環即可)。這通常叫做矢量化(vectorization)。
大小相等的數組之間,它們之間任何的算術運算都會應用到元素級(每個元素都做這個運算了),數組與標量的算術運算也是。不同大小的數組之間的運算叫做廣播(broadcasting)。5、索引和切片
數據不會被復制,任何修改都直接改了原數組。
如果僅是要一份副本,則用 .copy()。
對二維數組單個元素的索引:
這兩種方式等價。
若arr2d[2],則輸出的是一維數組[7,8,9]。
2*2*3的數組(2組2行3列):
6、布爾型索引
需要先引入:from numpy.random import randn
或將代碼改成:data = np.random.randn(7, 4)
布爾型數組的長度必須跟被索引的軸長度一致。每個名字對應 data 數組一行。
對條件進行否定的兩種方式:
組合應用多個布爾條件,可使用&、|等布爾算術運算符
通過布爾型索引選取數組中的數組,將總是創建數據的副本,即使返回一模一樣的數組也是一樣。
通過布爾型數組設置值:
通過一維布爾數組設置整行或列的值:
7、花式索引
指利用整數數組進行索引。
np.empty((8,4))
Return a new array of given shape and type, without initializing entries.
for i in range(8):
arr[i] = i
Return an object that produces a sequence of integers from start (inclusive)
to stop (exclusive) by step
為了以特定順序選取行的子集,只需傳入一個用于指定順序的整數列表或 ndarray,使用負數索引會從末尾開始選取行(最后一行是 -1)。
一次傳入多個索引組,返回一個一維數組:
取整列的兩種方法,相當于給列排了順序:
花式索引跟切片不一樣,總是將數據復制到新數組中。
數組轉置和軸對換
轉置返回的是源數據的視圖,不進行任何復制操作。數組有 transpose 方法,還有一個 T 屬性來完成轉置:
8、高維數組
Transpose 要一個軸編號:
<img class="capture deal" src="http://s3.pstatp.com/wenda/wenda_web/static/style/image/loading_a788ad0.gif" _src="data:image/svg+xml;utf8,<svg xmlns=" http:="" www.w3.org="" 2000="" svg'="" width="640" height="462">"/>arr是 2 組 2 行 4 列的數組,transpose的參數表示shape的形狀,對于這個例子來說,即2[0]、2[1]、4[2],transpose(1,0,2)轉置后變為2[1]、2[0]、4[2],看起來仍是 2 組 2 行 4 列的形狀,但數組內的元素經過轉換后索引已經改變,也要遵循(1,0,2)的順序。如轉置前的數組arr[0,1,0]索引值為 4,轉置后的數組arr'[1,0,0],索引值才為 4。其它同理。
ndarray 的 swapaxes 方法接受一對軸編號且返回源數據的視圖:
"/>np.meshgrid函數接受兩個一維數組,并產生兩個二維矩陣(對應于兩個數組中所有的(x, y)對。
將條件邏輯表述為數組運算
np.wherea函數是三元表達式x if condition else y的矢量化版本。
np.where的第二個和第三個參數不必是數組,傳遞給where的數組大小可以不相等,甚至可以是標量值。在數據分析工作中,where通常用于根據另一個數組而產生一個新的數組。
用where表述出更復雜的邏輯:(where的嵌套)
"/>10、排序
多維數組可以在任何一個軸向上進行排序,只需將軸編號傳給sort:
頂級方法np.sort返回的數組已排序的副本,就地排序則會修改數組。
唯一化以及其他的集合邏輯
np.unique找出數組中的唯一值并返回已排序的結果
np.in1d用于測試一個數組的值在另一個數組的情況。
如何用java進行移動端后臺開發?
java進行移動后臺開發與java進行web后臺開發完全一樣。java原生的后臺框架servlet,如果使用java后臺開源框架可以選用spring+springmvc+mybatis,或者使用ssh框架。
一 其實前臺與后臺交互常用兩種協議方式:
1 http協議。
HTTP是一個屬于應用層的面向對象的協議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統。它于1990年提出,經過幾年的使用與發展,得到不斷地完善和擴展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規范化工作正在進行之中,而且HTTP-NG(Next Generation of HTTP)的建議已經提出。HTTP協議的主要特點可概括如下:1.支持客戶/服務器模式。2.簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯系的類型不同。由于HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。3.靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。4.無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對于事務處理沒有記憶能力。缺少狀態意味著如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
2 webservice,例子有天氣預報接口。
Web service是一個平臺獨立的,低耦合的,自包含的、基于可編程的web的應用程序,可使用開放的XML(標準通用標記語言下的一個子集)標準來描述、發布、發現、協調和配置這些應用程序,用于開發分布式的互操作的應用程序。[1]
Web Service技術, 能使得運行在不同機器上的不同應用無須借助附加的、專門的第三方軟件或硬件, 就可相互交換數據或集成。依據Web Service規范實施的應用之間, 無論它們所使用的語言、 平臺或內部協議是什么, 都可以相互交換數據。Web Service是自描述、 自包含的可用網絡模塊, 可以執行具體的業務功能。Web Service也很容易部署, 因為它們基于一些常規的產業標準以及已有的一些技術,諸如標準通用標記語言下的子集XML、HTTP。Web Service減少了應用接口的花費。Web Service為整個企業甚至多個組織之間的業務流程的集成提供了一個通用機制。
二 前臺后臺數據傳遞格式常用的也有兩種:
1 xml
XML 三種解析方式簡介
大名鼎鼎的 DOM
說它大名鼎鼎可是一點不為過,DOM 是 W3C 處理 XML 的標準 API,它是許多其它與 XML 處理相關的標準的基礎,不僅是 Java,其它諸如 Javascript,PHP,MS .NET 等等語言都實現了該標準, 成為了應用最為廣泛的 XML 處理方式。當然,為了能提供更多更加強大的功能,Java 對于 DOM 直接擴展工具類有很多,比如很多 Java 程序員耳熟能詳的 JDOM,DOM4J 等等, 它們基本上屬于對 DOM 接口功能的擴充,保留了很多 DOM API 的特性,許多原本的 DOM 程序員甚至都沒有任何障礙就熟練掌握了另外兩者的使用,直觀、易于操作的方式使它深受廣大 Java 程序員的喜愛。
綠色環保的 SAX
SAX 的應運而生有它特殊的需要,為什么說它綠色環保呢,這是因為 SAX 使用了最少的系統資源和最快速的解析方式對 XML 處理提供了支持。 但隨之而來繁瑣的查找方式也給廣大程序員帶來許多困擾,常常令人頭痛不已,同時它對 XPath 查詢功能的支持,令人們對它又愛又恨。
默默無聞的 Digester:XML 的 JavaBean 化
Digester 是 apache 基金組織下的一個開源項目,筆者對它的了解源于對 Struts 框架的研究,是否有很多程序員想要一解各大開源框架的設計甚至想要自己寫一個功能強大的框架時會碰到這樣一個難題: 這些形形色色的用 XML 語言標記的框架配置文件,框架底層是用什么技術來解析呢? DOM 解析耗費時間,SAX 解析又過于繁瑣,況且每次解析系統開銷也會過大, 于是,大家想到需要用與 XML 結構相對應的 JavaBean 來裝載這些信息,由此 Digester 應運而生。它的出現為 XML 轉換為 JavaBean 對象的需求帶來了方便的操作接口,使得更多的類似需求得到了比較完美的解決方法, 不再需要程序員自己實現此類繁瑣的解析程序了。與此同時 SUN 也推出了 XML 和 JavaBean 轉換工具類 JAXB,有興趣的讀者可以自行了解。
2 json
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它基于ECMAScript的一個子集。 JSON采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習慣(包括C、C++、C#、Java、JavaScript、Perl、Python等)。這些特性使JSON成為理想的數據交換語言。 易于人閱讀和編寫,同時也易于機器解析和生成(一般用于提升網絡傳輸速率)。
三 安卓學習例子
如果想了解安卓與后臺交互的例子,請去360手機助手下載安卓學習手冊,里面有大量安卓的例子以及http協議詳解,源碼,文檔都可看。下面是例子截圖
萊卡我型我秀2005年的在哪可以看?
http://m.youku.com/video/id_XNDM5NDMzOTA0.html?&source=https%3A%2F%2Fm.baidu.com%2Ffrom%3D2001a%2Fbd_page_type%3D1%2Fssid%3D0%2Fuid%3D0%2Fpu%3Dusm%25403%252Csz%2540320_1003%252Cta%2540iphone_2_7.0_1_11.7%2Fbaiduid%3D0B0EA6412D9754DAA8E986A5FB3EB942%2Fw%3D0_10_%2Ft%3Diphone%2Fl%3D1%2Ftc%3Fref%3Dwww_iphone%26lid%3D14077032272746457723%26order%3D5%26waplogo%3D1%26waput%3D7%26fm%3Dwnor%26dict%3D-1%26tj%3Dwww_video_normal_5_0_10_title%26w_qd%3DIlPT2AEptyoA_ykxwh1cxeGuJzRSnIcoviQWcg9GQmbb%26sec%3D25982%26di%3D39e918d23ed04814%26bdenc%3D1%26tch%3D124.223.168.1202.1.312%26nsrc%3DIlPT2AEptyoA_yixCFOxXnANedT62v3IE2i1KjlPB8SxokDyqRLt0sNiXSSqAp7PJzbF7oKjt_2-jTrYS6Um6so4g43%26eqid%3Dc35baa44ccc32800100000065a2955a7%26wd%3D%26%26clk_info%3D%257B%2522srcid%2522%253A1508%252C%2522tplname%2522%253A%2522www_video_normal%2522%252C%2522t%2522%253A1512658375234%252C%2522xpath%2522%253A%2522div-a-h3%2522%257D