开始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脚本编程》(有需要的也可联系我)
最后介绍几个相关的参考资料: