《Python地理数据处理》——2.5 控制流

2.5 控制流

你写的第一个脚本可能会包括一系列按顺序执行的语句,就像我们目前为止看到的所有例子一样。然而,编程的真正力量是根据不同的条件而改变的能力。类似于你可能会根据销售价格来决定在超市里买哪种蔬菜,你的代码应该基于数据类别,比如它是在处理点,还是线,来确定到底需要做什么。控制流是改变这种代码执行顺序的概念。

2.5.1 if语句
改变执行顺序最简单的方法是测试一个条件,并根据测试的结果做一些不同的事情。可以用一个if语句实现,下面是一个简单的例子:

if n == 1:
    print('n equals 1')
else:
   print('n does not equal 1')

如果n变量的值为1,则字符串“n equals 1”将被打印。否则,字符串“n does not equal 1”将被打印。要注意的是,if和else语句以冒号结尾,并且依赖if和else条件的代码会在该条件下缩进。这是一个要求,当你取消缩进代码时,代码随之退出所依赖的if或else条件。那么,下面的代码将打印什么?

n = 1
if n == 1:
    print('n equals 1')
else:
    print('n does not equal 1')
print('This is not part of the condition')

n等于1,所以相等的信息被打印出来,然后控制被转移到没有缩进的第1行代码,下面就是(输出)结果。

n equals 1
This is not part of the condition

也可以测试多个条件,例如:

if n == 1:
    print('n equals 1')
elif n == 3:
    print('n equals 3')
elif n > 5:
    print('n is greater than 5')
else:
    print('what is n?')

在这种情况下,n首先和1做比较。如果它不等于1,那么就和3做比较。如果它还是不等于3,然后检查n是否大于5。如果这些条件中没有一个是真的,执行else语句下的代码。只要想要,可以有多个elif语句,但只有一个if和else。类似于elif语句不是程序所必须的,else语句也不是必须的。如果喜欢,可以只用一个if语句。

这是一个很好的地方来阐述当测试条件时,不同的值可以判为真或假。记住,除非它们是空白的,否则字符串解析为真。下面用一个if语句来测试:

>>> if '':
...     print('a blank string acts like True')
... else:
...     print('a blank string acts like false')
...
a blank string acts like false

如果使用了一个包含任何字符的字符串,即使是一个空格,前面的例子也会解析为真,而不是假。如果你打开Python控制台,去试试看吧。下面再看一个解析为真的例子,因为列表不为空:

>>> if [1]:
...     print('a non-empty list acts like True')
... else:
...     print('a non-empty list acts like False')
...
a non-empty list acts like True

可以使用相同的想法来测试一个数字不等于零,因为零是False,但任何其他数字,正或负,都将被视为True。

2.5.2 while语句
一个while语句会执行一个代码块,只要条件为真。如果条件判为真,那么代码就被执行。然后再次检查条件,如果它仍然为真,代码将再次执行,直到条件判为假。如果条件一直为真,代码会永远执行下去,称为死循环,这是要极力避免的。下面是while循环的例子:

>>> n = 0
>>> while n < 5:
...     print(n)
...     n += 1
...
0
1
2
3
4

“+=”意味着累加,所以(每执行一次)n递增1。当n等于5时,不再小于5,因此这个条件变为假,然后代码不再执行。

2.5.3 for语句
一个for语句可以遍历一个序列,并为每个值做事。当写一个for语句时,不仅提供序列的遍历,也要提供一个变量名。每执行一次循环,该变量包含序列中一个不同的值。下面这个例子遍历了一个名单,并为每个人打印一条消息。

>>> names = ['Chris', 'Janet', 'Tami']
>>> for name in names:
...     print('Hello {}!'.format(name))
...
Hello Chris!
Hello Janet!
Hello Tami!

第1次执行循环时,名称变量等于“Chris”,第2次是“Janet”,最后一次是“Tami”。我称这个变量为name,但它可以是任何你想叫的名字。

range函数
range函数可以很容易地遍历一个序列。虽然这个函数有更多的参数,使用它最简单的方法是提供一个数字n,并且它将创建从0到n-1的序列。例如,下面这个例子将计算循环执行的次数:

>>> n = 0
>>> for i in range(20):
...     n += 1
...
>>> print(n)
20

这个代码中没有使用变量i,但没有什么阻止你使用它。让我们用它来计算20的阶乘,这次我们提供一个起始值为1的序列,并让它增长到21,但不包括21本身。

>>> n = 1
>>> for i in range(1, 21):
...     n = n * i
...
>>> print(n)
2432902008176640000

在后面的章节中,你将看到这个变量对于访问数据集中不能直接迭代的单个元素时也很有用。

2.5.4 break、continue和else
一些语句适用于while和for循环。第1个是break,它将执行完全跳出循环的操作,正如在这个例子中,i等于3时停止循环:

>>> for i in range(5):
...      if i == 3:
...           break
...      print(i)
...
0
1
2

如果没有break语句,这个循环将从0打印到4。

continue语句会跳过在当前循环迭代过程中通常会执行的其余部分代码,跳转到循环的顶部,并开始下一次迭代。在这个示例中,如果i等于3,contine语句用于跳过打印i这行代码。

>>> for i in range(5):
...     if i == 3:
...         continue
...     print(i)
...
0
1
2
4

循环也可以有else语句。该分句的代码在循环执行时被执行,除非被break语句中断。这里,我们将检查2是否在一个数字列表中。如果是,会跳出循环。否则,else语句用来通知我们数字没有找到。在第一种情况中,数字找到,break语句用于退出循环,else语句将被忽略。

>>> for i in [0, 5, 7, 2, 3]:
...     if i == 2:
...         print('Found it!')
...         break
... else:
...     print('Could not find 2')
...
Found it!

但如果数字找不到,就不调用break语句,而是执行else分句。

>>> for i in [0, 5, 7, 3]:
...     if i == 2:
...         print('Found it!')
...         break
... else:
...     print('Could not find 2')
...
Could not find 2

如果在一个列表中没有找到适当的值,可以使用这个模式来设置一个默认值。例如,你需要找到并编辑文件夹中一个特定格式的文件,如果你找不到正确的文件格式,需要创建一个。可以通过遍历文件夹中的文件,如果找到一个合适的文件,可以跳出循环。可以在else分句中创建一个新文件,只有在没有找到合适的现有文件时,代码才会执行。

时间: 2024-10-24 05:27:04

《Python地理数据处理》——2.5 控制流的相关文章

《Python地理数据处理》——导读

前言本书可以帮助你学习使用地理空间数据的基础知识,主要是使用GDAL / OGR.当然,还有其他选择,但其中一些都是建立在GDAL的基础之上,所以如果你理解了本书中的内容,就可以很轻松地学习其他知识.这不是一本关于地理信息系统或遥感的图书,虽然其中解释了一些相关的背景理论.相反,本书将教你如何编写用于操作和创建空间数据的Python代码以及一些简单的分析案例.你可以使用这些构建块来实现自己设计的.更复杂的分析.前言 [第1章 引言 1.1 为什么使用Python和开源工具](https://yq

《Python地理数据处理》——1.3 地理数据处理

1.3 地理数据处理 地理数据处理是处理空间数据的总称,不管处理的是栅格数据,还是矢量数据.可以想象一下,地理数据处理的覆盖面相当广泛.我一直认为,使用GIS的地理数据处理工具就像做数据统计一样,几乎可以应用于所有事情中,甚至在日常生活中也会用到地理数据处理,不管你是否意识到这一点.例如,我会根据是开车还是骑自行车来选取不同的出行路线,当我骑自行车上班时,我会选择避开没有护栏的高流量道路.对于有陡峭山坡的路线,开车时我不会顾虑太多,但骑自行车时就会比较关心.像这种基于上班所做的路线选择,不仅考虑

《Python地理数据处理》——第1章 引言1.1 为什么使用Python和开源工具

第1章 引言 本章内容 介绍空间数据的基本类型 什么是地理处理 QGIS软件的使用 人类制作地图的历史远比我们开始写作的时间久远,法国著名的拉斯科岩洞壁画上就有一幅星空图.古时候,世界各地的人们都曾使用过地图,如巴比伦人.希腊人和中国人.制图的艺术在这数千年中也在不断发展演化,从最初将洞壁岩穴作为介质,到后来将泥土沙盘.羊皮纸.纸作为介质,再到现在的电子地图.随着技术的发展和进步,地图上所包含的细节越来越多,每个要素也越来越精确.事实上,因为最早期的地图结构简单,大多数人可能很难将其作为真正意义

《Python地理数据处理》——2.8 小结

2.8 小结 Python解释器对于学习程序是如何运行或尝试编写少量代码很有用,但在脚本中编写多行代码,运行效率会更高.另外,可以保存脚本并在以后使用它们,这是程序设计的一个主要原因. 模块是代码库,可以加载到脚本中使用.如果需要用Python做某事,不管想做什么,在某处可能会有一个内置模块帮你搞定. 习惯在变量中存储数据,因为它会使代码更容易适应后期的变更. Python有几个核心数据类型,针对不同的数据类型和不同的应用场景,所有的这些数据类型都极有用. 可以通过使用控制流语句根据不同的条件改

《Python地理数据处理》——1.5 小结

1.5 小结 Python是一种功能强大的跨平台编程语言,比较容易学习. 免费和开源的软件不仅价格是免费的(免费软件),而且还给你充分应用它们的许多自由(开源软件). 存在许多用于处理矢量和栅格地理空间数据的优秀开源Python模块. 使用开源工具并不会降低你的软件品质,事实上许多代码包也被应用于专有软件.

《Python地理数据处理》——2.7 类

2.7 类 通读本书时,会遇到有其他数据和附有函数的变量,这些对象创建自类.虽然我们不会在这本书中讲述如何创建你自己的类,但需要知道它们,因为你会用到别人定义好的类.类是一个非常强大的概念,但在本书中你只需要理解它们是可以包含内部数据和函数的数据类型.对象或该类型的变量包含这些数据和函数,而函数在特定对象上运行.你已看到了几种数据类型,例如列表.可以有一个列表类型的变量,而该变量包含了列表类型所有的函数,如append函数.当在列表中调用append函数时,它只将数据追加到特定的列表,而不是其他

《Python地理数据处理》——2.2 一个脚本的基本结构

2.2 一个脚本的基本结构 在绝大多数Python脚本的顶端,你第一眼看到的是导入语句.这些代码意味着加载外部模块,以便脚本使用.一个模块是一个基本的代码库,你可以在脚本中访问和使用,并且大型的专业模块生态系统是Python的另一个优势.如果没有外部模块支持,在Python中处理GIS数据会很困难,其中道理类似GIMP和Photoshop等工具便于处理数字图像.本书的目的是教你如何使用这些工具处理GIS数据,在这个过程中,你也将利用一些Python自带的模块.对于处理文件系统这种任务而言,这些模

《Python地理数据处理》——2.6 函数

2.6 函数 如果你发现会重复使用相同的代码,可以创建自己的函数并进行调用,而不是重复编写相同的代码.这使得事情变得更容易,也不容易出错,因为不可能有那么多的地方出现拼写错误.创建一个函数,需要给它一个名称,并告诉用户需要提供什么参数来使用它.让我们创建一个简单的函数来计算一个阶乘. **def factorial(n): answer = 1 for i in range(1, n + 1): answer = answer * i return answer** 这个函数的名字是factor

《Python地理数据处理》——2.3 变量

2.3 变量 除非你的脚本非常简单,否则运行时将需要某种方式来存储信息,这就是变量发挥作用的地方.想一想当你使用软件打开一个文件时发生了什么,不管它是什么样的文件,该软件都会显示一个打开对话框,你需要选择一个文件,然后单击"OK"按钮,随后该文件被打开.当单击"OK"按钮,选定的文件名称将被存储为一个变量,以便该软件知道什么文件被打开.即使你一生中从未编写过任何程序,在数学意义上你也可能会熟悉这个概念.回想一下代数课,其中根据x的值计算y的值,x变量可以是任何值,相