基於ArcGIS的python編程:2.python基礎(一)

開始python基礎之前,跟大家分享一個經驗(英語大神可以忽略),我也是一個英語渣渣,當初剛剛接觸python的時候,它也噁心了我一段時間,什麼報錯,提示都是英文,當時就是挺鬱悶的。因為現在很多優秀的軟體,語言都是國外的,為了學好編程,英語這一關你必須得去正視,得跨過去,然後我不得不下載一個翻譯軟體,擼碼的同時打開它,遇到什麼不懂得可以立刻查。我的經驗告訴你只要你想學好編程,英語這道坎並不是你的借口,因為一門語言常用的單詞無非就是那些,第一次不懂查一下軟體,看多幾次,你漸漸就能克服「恐英」症了(個人經歷,僅供參考)。一萬個理由都是借口,好好加油(這是跟我自己說的,哈哈哈)

上一篇文章也說到python是一門「膠水」語言,功能強大,應用領域廣泛。Arcgis選擇其作為腳本語言之一很大程度上也是因為python具有以下優點:

  • 簡單易學:相對於其他高度結構化的編程語言,python相對來說比較簡單,容易被掌握。他的語法簡單,沒有太多的條條框框,編程者將會有更多的時間解決實際問題。
  • 免費且開源:python是一門免費的軟體,這就大大降低了我們的學習成本。另外,他是開源的,換句話來說,它擁有強大的資源來源,因為它有一個十分活躍的用戶社區,社區成員都積极參与到python的開發與維護。它有豐富的現成第三方類庫,這就使我們可以直接使用,從而跳過了「造輪子」的苦惱。
  • 跨平台:python支持Windows、Mac、Linux在內的各種平台,而且程序只需要修改一小部分就可以在其他平台上正常運行。
  • 解釋性:python是一門解釋性語言,不需要編譯就可以直接運行,這使python使用起來非常簡單。
  • 面向對象:面向對象的編程不再是功能的堆砌,而是由一系列相互作用的對象構建起來的。

現在的python共存兩個版本:python2.x和python3.x;至於為什麼會有這兩個版本的博弈,有興趣的可以去了解一下中間的故事。兩個版本可以說各有千秋吧,兩者之間大同小異,所以說學哪個版本都沒關係,因為只要掌握其中一個,另一個很快就可以轉過來。雖然現在的趨勢是python3.x,但是因為Arcgis綁定的版本是python2.6(Arcgis10.0版本)或者python2.7(Arcgis10.2版本),所以我這裡用的是python2.x版本。python2.x版本最大的問題就是對中文的兼容不太友好。其他的不多說,直接上碼(擼碼最實際),編程環境為在Windows10系統+python2.6

中文編碼:

在python自帶的IDLE窗口中輸入下面代碼

print "hello world"

運行後的結果如下

hello world

如果輸入的代碼為:

print "你好,中國"

運行後將會出錯,得到結果為:

File "D:/ArcPy/python????.py", line 2SyntaxError: Non-ASCII character xe4 in file D:/ArcPy/python????.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

這裡涉及的知識點有:print語句是用於輸出內容的,其中"hello world"和"你好,中國"用雙引號括起來是因為他們表示的數據類型為字元串;字元串除了可以用雙引號「 」,還可以用單引號『 』或者三引號 ;不過他們三個都要一對出現,同時使用他們之中的兩個或者三個的時候要特別注意。

print "你好,中國"運行出錯,是因為代碼中包含了中文字元,python默認的編碼格式是 ASCII 格式,在沒修改編碼格式時無法正確列印漢字,所以在讀取中文時會報錯。解決方法為只要在文件開頭加入 # -*- coding: UTF-8 -*- 或者 #coding=utf-8 就行了。修改後如下:

#coding=utf-8print "你好,中國"

運行後輸出的結果為:

你好,中國

變數命名規則:

  • 可以有數字,字母,下劃線組成。
  • 不能以數字開頭。
  • python中的關鍵詞不能用。
  • 使用描述性的變數名,易於編寫與解讀。
  • 盡量簡短。

數據類型:

數字:python的數字主要有整數和浮點數兩種,兩者區別就是有沒有小數。數字的運算與其他語言的差不多;下面看下面的一些例子

>>> 2+4 #加法6>>> 5-3 #減法2>>> 5-2.03.0>>> 5*3 #乘法15>>> 6/3 #除法2>>> 7/2 #注意區分 7/2.03>>> 7/2.03.5>>> 7%2 #取模1

注意 : python的數據類型與其他語言有很大的區別,它的定義不需要在變數名前聲明數據類型,python是自動識別數據的類型。所以在進行運算的時後會出現7/2 與7/2.0的區別。

字元串:上文也說到字元串使用單引號( )、雙引號 ( " ")、或者三引號 ( )括起來的數據類型。

>>> print "hello world!" #單引號,雙引號,三引號都是英語符號,否則會報錯hello world!>>> print您好,中國!您好,中國!>>> print hello world!hello world!>>> print「hello world!」 #用了中文的符號報錯SyntaxError: invalid syntax#字元串的連接要確保彼此都是字元串,否則會報錯。例如字元串與int類型連接>>> print "我今年"+20+"歲了" Traceback (most recent call last): File "<pyshell#14>", line 1, in <module> print "我今年"+20+"歲了" #字元串的連接要確保彼此都是字元串,否則會報錯TypeError: cannot concatenate str and int objects#正確的連接應該如下>>> print "我今年"+"20"+"歲了"我今年20歲了>>> print "我今年"+str(20)+"歲了"我今年20歲了

字元串處理:

>>> mytext="GIS is cool">>> print mytext.upper() #upper方法把所有小寫轉換為大寫GIS IS COOL>>> print mytext.lower() #lower方法把所有大寫轉換為小寫gis is cool>>> print mytext.lower() #lower方法把所有大寫轉換為小寫gis is cool>>> print mytext.title() #title使字元串標題化,所有單詞首字母大寫Gis Is Cool>>> mytext[0] #通過字元串的索引提取字元(切片)G>>> mytext[2:] #獲取第三個字元開始獲取,直到最後S is cool>>> mytext[-1] #獲取最後一個字元l#find()方法用於查找字元串中的某個字元或者字元串,區分大小寫,返回找到的第一個索引>>> mytext.find("is") 4#in 的用法與find差不多,也是判斷是否包含某個字元串,返回值為bool類型>>> "GIS" in mytext True>>> mylist=["I","am","a","GIS"]>>> str="">>> str.join(mylist) #join方法將字元串列表中的所有元素合併為一個新的字元串IamaGIS#split方法剛好與join相對,它是把一個字元串按照一定的規則分割後轉為列表,這裡為空格(" ")>>> mytext.split(" ")[GIS, is, cool]

列表:列表是由方括弧[ ]來定義的;列表的每一個元素用逗號(,)隔開;這些元素可以是數字、字元串或者其他數據類型。

>>> list=[1,2,3,4,5] #定義一個列表list>>> print list #輸出列表[1, 2, 3, 4, 5]#元素的數據類型可以不一致>>> print[1,2,"a","b",6,7][1, 2, a, b, 6, 7]

列表的簡單操作:

>>> list.append("zfc") #增加元素>>> print list[1, 2, 3, 4, 5, zfc]>>> list.extend("jpg") #注意與append()對比>>> print list[1, 2, 3, 4, 5, zfc, j, p, g]#在對應的位置插入元素,0是列表的索引,表示第一位>>> list.insert(0,"xyz")>>> print list[xyz, 1, 2, 3, 4, 5, zfc, j, p, g]>>> list.remove(3) #刪除>>> print list[xyz, 1, 2, 4, 5, zfc, j, p, g]>>> list[2:4] #列表同樣可以通過索引來切片[2,4]表示截取第三個元素至第四個元素[2, 4]>>> list[3]4

類似的操作列表的方法還有很多,可以根據需要自行通過help()函數進行查看;另外我們也不用死記它每一個方法的單詞怎樣拼寫,因為有些編輯器有強大的補全提示功能,如下圖1

圖1

例如通過help(list)列出列表的常用方法的介紹如下:

append(...)

| L.append(object) -- append object to end

|

| count(...)

| L.count(value) -> integer -- return number of occurrences of value

|

| extend(...)

| L.extend(iterable) -- extend list by appending elements from the iterable

|

| index(...)

| L.index(value, [start, [stop]]) -> integer -- return first index of value.

| Raises ValueError if the value is not present.

|

| insert(...)

| L.insert(index, object) -- insert object before index

|

| pop(...)

| L.pop([index]) -> item -- remove and return item at index (default last).

| Raises IndexError if list is empty or index is out of range.

|

| remove(...)

| L.remove(value) -- remove first occurrence of value.

| Raises ValueError if the value is not present.

|

| reverse(...)

| L.reverse() -- reverse *IN PLACE*

|

| sort(...)

| L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;

| cmp(x, y) -> -1, 0, 1

字典:

字典是另一種可變容器模型,且可存儲任意類型對象。字典的每個鍵值(key=>value)對用冒號(:)分割,每個對之間用逗號(,)分割,整個字典包括在花括弧({})中 ,格式如下所示

d = {key1 : value1, key2 : value2 }

字典的條目與順序無關,可以修改,但關鍵字唯一,對應的值不唯一,創建的同時可以賦值

字典的操作:

#字典的創建(帶有中文,而沒有進行編碼的轉換,所以「男」的輸出為xc4xd0)>>> dict={"name":"zfc","Age":20,"sex":"男"} >>> print dict{Age: 20, name: zfc, sex: xc4xd0}>>> print dict["name"] #通過字典的鍵獲取對應的值zfc>>> print dict["Age"]20>>> print dict.keys() #keys()獲得字典的所有鍵[Age, name, sex]>>> print dict.values() #values()獲得字典所有值[20, zfc, xc4xd0]>>> print dict.items() #items()以列表的形式返回字典的鍵和值[(Age, 20), (name, zfc), (sex, xc4xd0)]>>> dict["Age"]=23 #通過鍵直接修改值>>> print dict{Age: 23, name: zfc, sex: xc4xd0}>>> dict["adress"]="Guangdong" #增加字典的元素>>> print dict{Age: 23, adress: Guangdong, name: zfc, sex: xc4xd0}>>> del dict["sex"] #刪除鍵為"sex"的條目>>> print dict{Age: 23, adress: Guangdong, name: zfc}>>> dict.clear() #清空字典>>> print dict{}>>> del dict #刪除字典>>> print dict<type dict>

元組:

Python的元組與列表類似,不同之處在於元組的元素不能修改。元組使用小括弧,列表使用方括弧。元組創建很簡單,只需要在括弧中添加元素,並使用逗號隔開即可。

>>> tup=(1,2,3,"a","b") #元組的創建與輸出>>> print tup(1, 2, 3, a, b)>>> tup2="a","b","c","f">>> print tup2(a, b, c, f)

元組的處理方式類似列表,但是元組是不能修改的(增、刪、改),所以要改變元組的處理方式就不能用;一般來說,如果不需要修改元素的值或順序的就用元組,否則就用列表。

寫這文章也只是簡單的介紹了python在Arcgis中常用到的知識,全部深入的介紹也不現實,只要在你遇到問題的時候,你能夠記起用什麼方法能夠解決這個問題,而且很快找到它就好。因為知識無窮多,而且在不斷的更新換代,個人感覺按照需求學習就好,一個人的精力有限,不可能面面俱到,把一樣東西學好,學精並在此基礎上往相關的的拓展就可以了。如果想深入的學習python,可以根據文末的鏈接進行學習,網上關於python基礎的教程也有很多。

最近實習都在學基於C#的Arcgis engine的二次開發,又是新的知識,又是英語比較多,被它虐得不要不要的,所以只能周末才有空進行更新。另外,建議不要同時學兩們語言,特別是新手,因為很容易搞混。如果有編程基礎,對比著學python還是挺好的,不要同時學就好。(現在我有時就不能很快的從C#轉回python當中。很尷尬。。。。。。)

基於ArcGIS的python編程相對於python的其他編程來說,對python的要求並不是很高,你只需要了解python的數據類型,常用的語句,語法規則就好。其的側重點會是Arcgis相關的函數,因為這些函數都相當於桌面版的一個個工具,這就要求你必須了解工具的含義,作用,地理含義等;這或許就是我們GIS開發的一大難點或者價值所在,那時我也在問自己:現在計算機學院科班出身的程序員一大堆,而相對於我們這些「外行人」來說搞編程,編程能力怎樣跟他們競爭?這也是值得思考的。(以上三段純屬自己的廢話,嘻嘻)

有什麼出錯的地方。歡迎大家一起交流,一起學習,一起進步!

本文參考書籍:《面向ArcGIS的python腳本編程》(有需要的也可聯繫我)

最後介紹幾個相關的參考資料:

  • ArcGIS 在線幫助文檔(10.2、10.2.1 和 10.2.2)
  • python基礎教程|菜鳥教程
  • 廖雪峰老師的python基礎教程

推薦閱讀:

不再寫 for 循環
翻譯|Stack Overflow上關於Python的高票問答(一)
Python基礎語法知識總結與實踐(二)
聊聊Python,談談未來
如何評價 Google 開發的,將 Python 轉譯為 Go 的 runtime:Grumpy?

TAG:Python | ArcGIS | GIS地理信息系统 |