跳转至

5. 流程控制和迭代器#

先定义一个变量

some_var = 5

这是个 if 语句,注意缩进在 Python 里是有意义的,缩进要使用 4 个空格而不是 tab。这段代码会打印 “some_var is smaller than 10”

if some_var > 10:
    print("some_var is totally bigger than 10.")
elif some_var < 10:
    # elif 语句是可选的
    print("some_var is smaller than 10.")
else:
    # else 也是可选的
    print("some_var is indeed 10.")

用 for 循环语句遍历列表

"""
打印:
    dog is a mammal
    cat is a mammal
    mouse is a mammal
"""
for animal in ["dog", "cat", "mouse"]:
    # 你可以使用 format() 格式化字符串并插入值
    print("{} is a mammal".format(animal))

“range(number)” 返回数字列表从 0 到 number 的数字

"""
打印:
    0
    1
    2
    3
"""
for i in range(4):
    print(i)

“range(lower, upper)” 会返回一个包含从 lower 到 upper 的数字迭代器

"""
打印:
    4
    5
    6
    7
"""
for i in range(4, 8):
    print(i)

“range(lower, upper, step)” 会返回一个 从 lower 到 upper,并且间隔值为 step 的迭代器,如果 step 未传入则会使用默认值 1。

"""
打印:
    4
    6
"""
for i in range(4, 8, 2):
    print(i)

遍历列表,并且同时返回列表里的每一个元素的索引和数值。

"""
打印:
    0 dog
    1 cat
    2 mouse
"""
animals = ["dog", "cat", "mouse"]
for i, value in enumerate(animals):
    print(i, value)

while 循环直到条件不满足

"""
打印:
    0
    1
    2
    3
"""
x = 0
while x < 4:
    print(x)
    # x = x + 1 的简写
    x += 1

用 try/except 块处理异常状况

try:
    # 用 raise 抛出异常
    raise IndexError("This is an index error")
except IndexError as e:
    # pass 是无操作,但是应该在这里处理错误
    pass
except (TypeError, NameError):
    # 可以同时处理不同类的错误
    pass
else:
    # else 语句是可选的,必须在所有的 except 之后
    # 只有当 try 运行完没有错误的时候这句才会运行
    print("All good!")
finally:
    # 在任何情况下都会执行
    print("We can clean up resources here")

可以使用 with 语句来代替 try/finally 对操作进行结束的操作

with open("myfile.txt") as f:
    for line in f:
        print(line)

写入文件

contents = {"aa": 12, "bb": 21}
with open("myfile1.txt", "w+") as file:
    # 写入字符串到文件
    file.write(str(contents))

with open("myfile2.txt", "w+") as file:
    # 写入对象到文件
    file.write(json.dumps(contents))

从文件读取字符串

with open("myfile1.txt", "r+") as file:
    # 从文件读取字符串
    contents = file.read()
# => {"aa": 12, "bb": 21}
print(contents)

从文件读取 json 对象

with open("myfile2.txt", "r+") as file:
    # 从文件读取 json 对象
    contents = json.load(file)
# => {"aa": 12, "bb": 21}
print(contents)

Windows 环境调用 open() 读取文件的默认编码为 ANSI,如果需要读取 utf-8 编码的文件需要指定 encoding 参数:

open("myfile3.txt", "r+", encoding = "utf-8")

Python 提供一个叫做可迭代 (iterable) 的基本抽象。一个可迭代对象是可以被当作序列的对象,比如说上面 range 返回的对象就是可迭代的。

filled_dict = {"one": 1, "two": 2, "three": 3}
our_iterable = filled_dict.keys()
# 输出 dict_keys(['one', 'two', 'three']),是一个实现可迭代接口的对象
print(our_iterable)

可迭代对象可以进行遍历

for i in our_iterable:
    # 打印 one, two, three
    print(i)

但是不可以随机访问

# 抛出TypeError
our_iterable[1]

可迭代对象知道怎么生成迭代器

our_iterator = iter(our_iterable)

迭代器是一个可以记住遍历的位置的对象

# 用 "next()" 获得下一个对象
# => "one"
next(our_iterator)

再一次调取 “next()” 时会记得位置

# => "two"
next(our_iterator)
# => "three"
next(our_iterator)

当迭代器所有元素都取出后,会抛出 StopIteration

# 抛出 StopIteration
next(our_iterator)

还可以通过遍历访问所有的值,实际上 for 内部就实现了迭代器

our_iterator = iter(our_iterable)
for i in our_iterator:
    # 依次打印 one, two, three
    print(i)

可以用 list 一次取出迭代器或者可迭代对象所有的元素

# => 返回 ["one", "two", "three"]
list(filled_dict.keys())
# => 返回 [] 因为迭代的位置已经被保存了
list(our_iterator)