開始python基礎(chǔ)之前惩阶,跟大家分享一個經(jīng)驗(英語大神可以忽略),我也是一個英語渣渣扣汪,當(dāng)初剛剛接觸python的時候断楷,它也惡心了我一段時間,什么報錯崭别,提示都是英文冬筒,當(dāng)時就是挺郁悶的恐锣。因為現(xiàn)在很多優(yōu)秀的軟件,語言都是國外的舞痰,為了學(xué)好編程土榴,英語這一關(guān)你必須得去正視,得跨過去匀奏,然后我不得不下載一個翻譯軟件鞭衩,擼碼的同時打開它,遇到什么不懂得可以立刻查娃善。我的經(jīng)驗告訴你只要你想學(xué)好編程论衍,英語這道坎并不是你的借口,因為一門語言常用的單詞無非就是那些聚磺,第一次不懂查一下軟件坯台,看多幾次,你漸漸就能克服“恐英”癥了(個人經(jīng)歷瘫寝,僅供參考)蜒蕾。一萬個理由都是借口,好好加油(這是跟我自己說的焕阿,哈哈哈)
上一篇文章也說到python是一門“膠水”語言咪啡,功能強大,應(yīng)用領(lǐng)域廣泛暮屡。Arcgis選擇其作為腳本語言之一很大程度上也是因為python具有以下優(yōu)點:
簡單易學(xué):相對于其他高度結(jié)構(gòu)化的編程語言撤摸,python相對來說比較簡單,容易被掌握褒纲。他的語法簡單准夷,沒有太多的條條框框,編程者將會有更多的時間解決實際問題莺掠。
免費且開源:python是一門免費的軟件衫嵌,這就大大降低了我們的學(xué)習(xí)成本。另外彻秆,他是開源的楔绞,換句話來說,它擁有強大的資源來源唇兑,因為它有一個十分活躍的用戶社區(qū)墓律,社區(qū)成員都積極參與到python的開發(fā)與維護。它有豐富的現(xiàn)成第三方類庫幔亥,這就使我們可以直接使用,從而跳過了“造輪子”的苦惱察纯。
跨平臺:python支持Windows帕棉、Mac针肥、Linux在內(nèi)的各種平臺,而且程序只需要修改一小部分就可以在其他平臺上正常運行香伴。
解釋性:python是一門解釋性語言慰枕,不需要編譯就可以直接運行,這使python使用起來非常簡單即纲。
面向?qū)ο螅?/b>面向?qū)ο蟮木幊滩辉偈枪δ艿亩哑鼍甙铮怯梢幌盗邢嗷プ饔玫膶ο髽?gòu)建起來的。
現(xiàn)在的python共存兩個版本:python2.x和python3.x;至于為什么會有這兩個版本的博弈低斋,有興趣的可以去了解一下中間的故事蜂厅。兩個版本可以說各有千秋吧,兩者之間大同小異膊畴,所以說學(xué)哪個版本都沒關(guān)系掘猿,因為只要掌握其中一個,另一個很快就可以轉(zhuǎn)過來唇跨。雖然現(xiàn)在的趨勢是python3.x稠通,但是因為Arcgis綁定的版本是python2.6(Arcgis10.0版本)或者python2.7(Arcgis10.2版本),所以我這里用的是python2.x版本买猖。python2.x版本最大的問題就是對中文的兼容不太友好改橘。其他的不多說,直接上碼(擼碼最實際)玉控,編程環(huán)境為在Windows10系統(tǒng)+python2.6
中文編碼:
在python自帶的IDLE窗口中輸入下面代碼
print "hello world"
運行后的結(jié)果如下
hello world
如果輸入的代碼為:
print "你好飞主,中國"
運行后將會出錯,得到結(jié)果為:
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語句是用于輸出內(nèi)容的奸远,其中"hello world"和"你好既棺,中國"用雙引號括起來是因為他們表示的數(shù)據(jù)類型為字符串;字符串除了可以用雙引號“ ”懒叛,還可以用單引號‘ ’或者三引號''' ''';不過他們?nèi)齻€都要一對出現(xiàn)丸冕,同時使用他們之中的兩個或者三個的時候要特別注意。
print "你好薛窥,中國"運行出錯胖烛,是因為代碼中包含了中文字符,python默認(rèn)的編碼格式是 ASCII 格式诅迷,在沒修改編碼格式時無法正確打印漢字佩番,所以在讀取中文時會報錯。解決方法為只要在文件開頭加入# -*- coding: UTF-8 -*-或者#coding=utf-8就行了罢杉。修改后如下:
#coding=utf-8print "你好趟畏,中國"
運行后輸出的結(jié)果為:
你好,中國
變量命名規(guī)則:
可以有數(shù)字滩租,字母赋秀,下劃線組成利朵。
不能以數(shù)字開頭。
python中的關(guān)鍵詞不能用猎莲。
使用描述性的變量名绍弟,易于編寫與解讀。
盡量簡短著洼。
數(shù)據(jù)類型:
數(shù)字:python的數(shù)字主要有整數(shù)和浮點數(shù)兩種樟遣,兩者區(qū)別就是有沒有小數(shù)。數(shù)字的運算與其他語言的差不多身笤;下面看下面的一些例子
>>> 2+4? ? #加法
6
>>> 5-3? ? #減法
2
>>> 5-2.0
3.0
>>> 5*3? ? #乘法
15
>>> 6/3? #除法
2
>>> 7/2? ? ? #注意區(qū)分? 7/2.03
>>> 7/2.0
3.5
>>> 7%2? ? ? #取模
1
注意 :python的數(shù)據(jù)類型與其他語言有很大的區(qū)別豹悬,它的定義不需要在變量名前聲明數(shù)據(jù)類型,python是自動識別數(shù)據(jù)的類型展鸡。所以在進行運算的時后會出現(xiàn)7/2 與7/2.0的區(qū)別屿衅。
字符串:上文也說到字符串使用單引號(' ')、雙引號 (" ")莹弊、或者三引號 (''' ''')括起來的數(shù)據(jù)類型涤久。
>>> 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 "", line 1, in ? ? print "我今年"+20+"歲了"? #字符串的連接要確保彼此都是字符串吧彪,否則會報錯TypeError: cannot concatenate 'str' and 'int' objects#正確的連接應(yīng)該如下
>>> print "我今年"+"20"+"歲了"
我今年20歲了
>>> print "我今年"+str(20)+"歲了"
我今年20歲了
字符串處理:
>>> mytext="GIS is cool"
>>> print mytext.upper()? #upper方法把所有小寫轉(zhuǎn)換為大寫
GIS IS COOL
>>> print mytext.lower()? ? #lower方法把所有大寫轉(zhuǎn)換為小寫
gis is cool
>>> print mytext.lower()? ? #lower方法把所有大寫轉(zhuǎn)換為小寫
gis is cool
>>> print mytext.title()? ? #title使字符串標(biāo)題化待侵,所有單詞首字母大寫
Gis Is Cool
>>> mytext[0]? ? ? ? #通過字符串的索引提取字符(切片)
'G'
>>> mytext[2:]? ? ? ? #獲取第三個字符開始獲取,直到最后
'S is cool'
>>> mytext[-1]? ? ? ? ? ? #獲取最后一個字符'l'#find()方法用于查找字符串中的某個字符或者字符串姨裸,區(qū)分大小寫秧倾,返回找到的第一個索引
>>> mytext.find("is")??
4? ? ? ? ?#in 的用法與find差不多,也是判斷是否包含某個字符串傀缩,返回值為bool類型
>>> "GIS" in mytext?
True
>>> mylist=["I","am","a","GIS"]
>>> str=""
>>> str.join(mylist)? #join方法將字符串列表中的所有元素合并為一個新的字符串'IamaGIS'#split方法剛好與join相對那先,它是把一個字符串按照一定的規(guī)則分割后轉(zhuǎn)為列表,這里為空格(" ")
>>> mytext.split(" ")
['GIS', 'is', 'cool']
列表:列表是由方括號[ ]來定義的赡艰;列表的每一個元素用逗號(售淡,)隔開;這些元素可以是數(shù)字、字符串或者其他數(shù)據(jù)類型揖闸。
>>> list=[1,2,3,4,5]#定義一個列表list
>>> print list? ? ? ? #輸出列表
[1, 2, 3, 4, 5]? ?#元素的數(shù)據(jù)類型可以不一致
>>> 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']#在對應(yīng)的位置插入元素苦掘,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
類似的操作列表的方法還有很多楔壤,可以根據(jù)需要自行通過help()函數(shù)進行查看;另外我們也不用死記它每一個方法的單詞怎樣拼寫惯驼,因為有些編輯器有強大的補全提示功能蹲嚣,如下圖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
字典:
字典是另一種可變?nèi)萜髂P停铱纱鎯θ我忸愋蛯ο笏钌W值涞拿總€鍵值(key=>value)對用冒號(:)分割隙畜,每個對之間用逗號(,)分割,整個字典包括在花括號({})中 ,格式如下所示
d = {key1 : value1, key2 : value2 }
字典的條目與順序無關(guān)说贝,可以修改议惰,但關(guān)鍵字唯一,對應(yīng)的值不唯一乡恕,創(chuàng)建的同時可以賦值
字典的操作:
#字典的創(chuàng)建(帶有中文言询,而沒有進行編碼的轉(zhuǎn)換,所以“男”的輸出為\xc4\xd0)
>>> dict={"name":"zfc","Age":20,"sex":"男"}?
?>>> print dict
{'Age': 20, 'name': 'zfc', 'sex': '\xc4\xd0'}
>>> print dict["name"]? ? #通過字典的鍵獲取對應(yīng)的值zfc
>>> print dict
["Age"]20
>>> print dict.keys()? ? ? #keys()獲得字典的所有鍵['Age', 'name', 'sex']
>>> print dict.values()? ? #values()獲得字典所有值
[20, 'zfc', '\xc4\xd0']
>>> print dict.items()? ? #items()以列表的形式返回字典的鍵和值
[('Age', 20), ('name', 'zfc'), ('sex', '\xc4\xd0')]
>>> dict["Age"]=23? ? ? ? ? #通過鍵直接修改值
>>> print dict{'Age': 23, 'name': 'zfc', 'sex': '\xc4\xd0'}
>>> dict["adress"]="Guangdong"? #增加字典的元素
>>> print dict
{'Age': 23, 'adress': 'Guangdong', 'name': 'zfc', 'sex': '\xc4\xd0'}
>>> del dict["sex"]? ? ? ? ? #刪除鍵為"sex"的條目
>>> print dict
{'Age': 23, 'adress': 'Guangdong', 'name': 'zfc'}
>>> dict.clear()? ? ? ? ? ? ? #清空字典
>>> print dict{}
>>> del dict? ? ? ? ? ? ? ? #刪除字典
>>> print dict
元組:
Python的元組與列表類似傲宜,不同之處在于元組的元素不能修改运杭。元組使用小括號,列表使用方括號函卒。元組創(chuàng)建很簡單辆憔,只需要在括號中添加元素,并使用逗號隔開即可报嵌。
>>> tup=(1,2,3,"a","b")? #元組的創(chuàng)建與輸出
>>> print tup(1, 2, 3, 'a', 'b')
>>> tup2="a","b","c","f"
>>> print tup2('a', 'b', 'c', 'f')
元組的處理方式類似列表虱咧,但是元組是不能修改的(增、刪锚国、改)腕巡,所以要改變元組的處理方式就不能用;一般來說跷叉,如果不需要修改元素的值或順序的就用元組逸雹,否則就用列表。
寫這文章也只是簡單的介紹了python在Arcgis中常用到的知識云挟,全部深入的介紹也不現(xiàn)實梆砸,只要在你遇到問題的時候,你能夠記起用什么方法能夠解決這個問題园欣,而且很快找到它就好帖世。因為知識無窮多,而且在不斷的更新?lián)Q代,個人感覺按照需求學(xué)習(xí)就好日矫,一個人的精力有限赂弓,不可能面面俱到,把一樣?xùn)|西學(xué)好哪轿,學(xué)精并在此基礎(chǔ)上往相關(guān)的的拓展就可以了盈魁。如果想深入的學(xué)習(xí)python,可以根據(jù)文末的鏈接進行學(xué)習(xí)窃诉,網(wǎng)上關(guān)于python基礎(chǔ)的教程也有很多杨耙。
最近實習(xí)都在學(xué)基于C#的Arcgis engine的二次開發(fā),又是新的知識飘痛,又是英語比較多珊膜,被它虐得不要不要的,所以只能周末才有空進行更新宣脉。另外车柠,建議不要同時學(xué)兩們語言,特別是新手塑猖,因為很容易搞混竹祷。如果有編程基礎(chǔ),對比著學(xué)python還是挺好的萌庆,不要同時學(xué)就好溶褪。(現(xiàn)在我有時就不能很快的從C#轉(zhuǎn)回python當(dāng)中。很尷尬践险。猿妈。。巍虫。彭则。。)
基于ArcGIS的python編程相對于python的其他編程來說占遥,對python的要求并不是很高俯抖,你只需要了解python的數(shù)據(jù)類型,常用的語句瓦胎,語法規(guī)則就好芬萍。其的側(cè)重點會是Arcgis相關(guān)的函數(shù),因為這些函數(shù)都相當(dāng)于桌面版的一個個工具搔啊,這就要求你必須了解工具的含義柬祠,作用,地理含義等负芋;這或許就是我們GIS開發(fā)的一大難點或者價值所在漫蛔,那時我也在問自己:現(xiàn)在計算機學(xué)院科班出身的程序員一大堆,而相對于我們這些“外行人”來說搞編程,編程能力怎樣跟他們競爭莽龟?這也是值得思考的蠕嫁。(以上三段純屬自己的廢話,嘻嘻)
有什么出錯的地方毯盈。歡迎大家一起交流剃毒,一起學(xué)習(xí),一起進步搂赋!
本文參考書籍:《面向ArcGIS的python腳本編程》(有需要的也可聯(lián)系我)
最后介紹幾個相關(guān)的參考資料: