在前文中我们介绍了Python在字典键中的神秘行为,本文接着来介绍其它两种神秘行为,即在Try-Except块和For循环赋值中的神秘行为.
闲话少说,我们直接开始吧…
我打赌你肯定听过说Python中的Try-Except块。在大多数编程语言中,处理异常是非常常见的。在Try和Except之后,我们还可以放置一个可选的Finally块。
我们知道无论Try块中是否发生错误,Finally块都将被执行。但是,如果我们在Try块中有一个return语句,并在Finally块中添加另一个return语句,会发生什么情况呢?
一般来说,如果Try块中的代码没有问题并且到达了return语句,那么函数应该完成执行,对吗?但是,让我们看看下面的例子。
def my_func():
try:
return 'in try'
finally:
return 'in finally'
调用语句如下:
my_func()
运行结果如下:
它显示返回“in finally”而不是“in try”。因此,已经证明,即使Try块中存在return语句,Finally块中的return语句仍将被执行。也许下面的例子将是一个更好的例子。
my_string = '123'
def my_func():
global my_string
try:
return 'in try'
finally:
my_string = 'abc'
print(my_func())
print(my_string)
运行结果如下:
在本例中,我们在Try块中有一个return语句,但在Finally块中没有return语句。相反,我们在Finally块中重新分配一个全局字符串变量。然后,可以看到Try块中的return语句已正确执行。同时,Finally块中的代码也被执行。
请注意,无论发生什么情况,Finally块中的代码都将被执行。
3 神秘的For循环赋值在Python中,For循环是最为常见的语句。无论您是数据科学家还是软件工程师,我们都在Python中到处都在使用For循环。
您知道如何循环字符串来逐个打印每个字符吗?解决方案之一是使用enumerate()函数。它将把字符串转换成一个包含索引的字符列表。如下:
my_string = 'Chris'
for i, value in enumerate(my_string):
print(i, value)
结果如下:
但是,您知道使用For循环有一种神秘的用法吗?我们来看下面的例子。
my_dict = {}
for i, my_dict[i] in enumerate(my_string):
pass
你认为会发生什么事?这段代码会抛出异常吗?直觉上,我的my_dict[i]没有初始化,因此可能会出现“key error”。但让我们看看执行结果。
没有错误,我们的字典已经被分配了字符串中的字符!这是怎么做到的?事实上在Python语法中,我们把放在for…in中的变量称为“target”。每个迭代都会给其分配来自iterables的值。因此,上面的For循环相当于执行以下操作(下面的代码是用于说明的伪代码,无法执行)。
For each iteration: i = next(enumerate(my_string)).index my_dict[i] = next(enumerate(my_string)).value
因此,字典my_dict由For循环进行赋值填充,即使我们在For循环的循环语句中什么也没做。
4 总结在本文中,我介绍了Python中另外两种意想不到的神秘行为,即在try-exception和for循环语句中相应的神秘用法,并给出了相应的解释.
您学废了吗?
关注公众号《AI算法之道》,获取更多AI算法资讯。
参考链接



