Python语言——分支结构和循环结构
引言:在地理信息系统(GIS)中,Python的分支结构(条件语句)经常用于各种场景,以实现基于特定条件的数据处理、查询、分析和可视化,例如数据过滤,属性分析,空间可视化,空间查询等。
分支结构:
分支结构(也称为选择结构或条件结构)是程序设计中的一种基本结构,它根据给定的条件来决定执行哪个代码块。这种结构使得程序能够根据不同的输入或状态执行不同的操作,从而提高了程序的灵活性和适应性。在Python中构建分支结构需要用到if,elif,else关键字,下面是一个简单的例子,展示了如何使用if
语句结构:
x = 6
if x > 0: # 如果条件为真(True),则执行这里的代码块
print("x是正数")
elif x < 0:
print("x是负数")
else: # 如果所有条件都为假,则执行这里的代码块
print("x是零")
#这里是不属于if语句的代码,不会被条件控制
请注意:在Python中,代码块是通过缩进来区分的,而不是通过括号 ,
每个代码块都应该比if
、elif
或else
语句本身缩进一个级别。
当然如果要构造出更多的分支,可以使用if...elif...else...
结构嵌套if...else...
结构,在GIS中应用广泛,经常用于实现复杂的逻辑判断和数据处理。
分支结构在GIS中应用广泛,如:
1.条件查询:查找位于某个行政区域内、面积大于50平方公里且类型为“湖泊”的所有水体
2.空间分析:在进行洪水模拟时,可以根据不同的降雨条件和地形条件来执行不同的洪水演进算法
3.数据分类:根据城市的人口密度和气候区将城市分为不同的类别,并针对不同类别的城市采取不同的规划
循环结构:
循环结构是指在程序中需要重复执行某个指令而设置的一种程序结构。它根据循环体中的条件,判断继续执行某个指令还是退出循环。
循环结构包含三个要素:循环变量、循环体和循环终止条件
- 循环变量:
循环变量用于控制循环的次数或条件。
在每一次循环迭代中,循环变量都会发生变化,直到不满足循环条件退出循环。
- 循环条件:
循环条件决定了循环是否继续执行。
它通常是一个布尔表达式,只有当该表达式的值为True时,循环才会继续执行;否则,循环将被终止。
- 循环体:
循环体包含了需要重复执行的代码块。
在每次循环迭代中,都会执行循环体内的代码。
在Python中构造循环结构有两种做法,一种是for-in
循环,一种是while
循环,它们是两种常见的循环结构,但它们的用法和适用场景有所不同,一下进行探析:
for-in
循环
for-in循环通常用于遍历集合(如列表、元组、字符串、字典、集合等)中的元素。当需要遍历一个已知的元素集合,知道循环次数和迭代字典时,建议使用for-in循环。可以用例子理解:
#遍历一个已知的元素集合时
for x in (1,2,3):
print(x)
#知道循环次数
for y in range(0,6):
print(y)
#迭代字典
for z in {4,5,6}:
print(z)
while循环
while循环更适用于那些循环次数不确定,需要根据某些条件来决定是否继续执行循环以及需要在循环体内更改循环条件时,使用while循环更加方便,如下:
#根据某些条件来决定是否继续执行循环
num=0
while num<5:
print(num)
num +=1
#读取全部文件
with open('file.txt','r') as file:
line=file.readline() #第一次调用readline从文件中读取一行内容
while line:
print(line,end=',')
line=file.readline() #再次调用readline从文件中读取下一行内容,并更新line变量
题目一:假设你有一个包含多个城市的GIS数据集,每个城市都有一个属性
population_density
(人口密度)和一个climate_zone
(气候区)。你需要编写一个程序,该程序能够遍历这些城市,并根据人口密度和气候区进行分类。规则如下:
- 如果人口密度大于1000人/平方千米且气候区为“温带”,则打印出“XX城市是温带高密度城市”。
- 如果人口密度小于500人/平方千米且气候区为“热带”,则打印出“XX城市是热带低密度城市”。
- 对于其他情况,打印出“XX城市的人口密度和气候区不符合上述条件”。
给出cities数据列表:
cities = [{"name": "CityA", "population_density": 1500, "climate_zone": "温带"},
{"name": "CityB", "population_density": 900, "climate_zone": "热带"},
{"name": "CityC", "population_density": 700, "climate_zone": "温带"},
{"name": "CityD", "population_density": 300, "climate_zone": "热带"}]
解答:
# 假设的cities列表
cities = [{"name": "CityA", "population_density": 1500, "climate_zone": "温带"},
{"name": "CityB", "population_density": 900, "climate_zone": "热带"},
{"name": "CityC", "population_density": 700, "climate_zone": "温带"},
{"name": "CityD", "population_density": 300, "climate_zone": "热带"}]
# 列表中的每一个元素都是一个字典
#遍历cities列表,进行要素提取
for city in cities:
#提取城市名,人口密度以及气候区
city_name=city['name']
city_density=city['population_density']
city_zone=city['climate_zone']
#使用分支结构进行分类(if-elif-else)
if city_density < 500 and city_zone == "热带":
print(f'{city_name}是热带低密度城市')
elif city_density > 1000 and city_zone == "温带":
print(f'{city_name}是温带高密度城市')
else:
print(f"{city_name}的人口密度和气候区不符合上述条件")
#CityA是温带高密度城市
#CityB的人口密度和气候区不符合上述条件
#CityC的人口密度和气候区不符合上述条件
#CityD是热带低密度城市
注意;当使用for city in cities:时,city在每次迭代中都是cities列表中的一个元素(在这个题目中是一个字典)。通过city['name']、city['population_density']和=city['climate_zone']来访问这个字典中的特定键的值。
题目二:处理多个矢量图层
假设你有一个文件夹,其中包含多个矢量图层(Shapefiles),你需要遍历这些图层并计算每个图层的面积
此处的os库为 Python 标准库的一部分,无需安装可直接使用
解答:
import os
import geopandas as gpd
# 设置包含Shapefiles的文件夹路径
folder_path = 'shapefiles_folder'
# 遍历文件夹中的所有文件
for filename in os.listdir(folder_path):
if filename.endswith('.shp'): # 检查文件扩展名是否为.shp
# 构建完整的文件路径
file_path = os.path.join(folder_path, filename)
# 读取Shapefile
gdf = gpd.read_file(file_path)
# 计算Shapefile的总面积
total_area = gdf.geometry.area.sum()
# 输出文件名和总面积
print(f"文件名: {filename}, 总面积: {total_area}")
# 运行脚本后,你将看到每个Shapefile的文件名和对应的总面积。
上述内容均为学习使用,后续将持续发表该方面文章以记录学习过程,如有错误敬请指正