基于ArcGIS的python編程:2.python基礎(chǔ)(一)

開始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)的參考資料:

ArcGIS 在線幫助文檔(10.2迟赃、10.2.1 和 10.2.2)

python基礎(chǔ)教程|菜鳥教程

廖雪峰老師的python基礎(chǔ)教程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市厂镇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌左刽,老刑警劉巖捺信,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異欠痴,居然都是意外死亡迄靠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門喇辽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掌挚,“玉大人,你說我怎么就攤上這事菩咨》褪剑” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵抽米,是天一觀的道長特占。 經(jīng)常有香客問我,道長云茸,這世上最難降的妖魔是什么是目? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮标捺,結(jié)果婚禮上懊纳,老公的妹妹穿的比我還像新娘。我一直安慰自己亡容,他們只是感情好嗤疯,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著萍倡,像睡著了一般身弊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天阱佛,我揣著相機與錄音帖汞,去河邊找鬼。 笑死凑术,一個胖子當(dāng)著我的面吹牛翩蘸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淮逊,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼催首,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泄鹏?” 一聲冷哼從身側(cè)響起郎任,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎备籽,沒想到半個月后舶治,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡车猬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年霉猛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片珠闰。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡惜浅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伏嗜,到底是詐尸還是另有隱情坛悉,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布承绸,位于F島的核電站吹散,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏八酒。R本人自食惡果不足惜空民,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望羞迷。 院中可真熱鬧界轩,春花似錦、人聲如沸衔瓮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽热鞍。三九已至葫慎,卻和暖如春衔彻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偷办。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工艰额, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人椒涯。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓柄沮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親废岂。 傳聞我的和親對象是個殘疾皇子祖搓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容