基于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.0

3.0

>>> 5*3    #乘法

15

>>> 6/3  #除法

2

>>> 7/2      #注意区分  7/2.03

>>> 7/2.0

3.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 "", line 1, in     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 }

字典的条目与顺序无关,可以修改,但关键字唯一,对应的值不唯一,创建的同时可以赋值

字典的操作:

#字典的创建(带有中文,而没有进行编码的转换,所以“男”的输出为\xc4\xd0)

>>> dict={"name":"zfc","Age":20,"sex":"男"} 

 >>> print dict

{'Age': 20, 'name': 'zfc', 'sex': '\xc4\xd0'}

>>> print dict["name"]    #通过字典的键获取对应的值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的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

>>> 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基础教程

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341

推荐阅读更多精彩内容