Python核心速记03

2022-04-29  本文已影响0人  Nefelibatas

异常处理

程序中的错误至少包括两种,一种是语法错误,另一种则是异常。

如果我们不确定某段代码能否成功执行,往往这个地方就需要使用异常处理。

Exception 是其他所有非系统异常的基类,能够匹配任意非系统异常。

如果多个 except 声明的异常类型都与实际相匹配,那么只有最前面的 except block 会被执行,其他则被忽略。

异常处理中,还有一个很常见的用法是 finally,经常和 try、except 放在一起来用。

无论发生什么情况,finally block 中的语句都会被执行,哪怕前面的 try 和 excep block 中使用了 return 语句。

自定义函数

Python 中函数的参数可以接受任意的数据类型,使用起来需要注意,必要时请在函数开头加入数据类型的检查;和其他语言不同,Python 中函数的参数可以设定默认值;

嵌套函数的使用,能保证数据的隐私性,提高程序运行效率;

合理地使用闭包,则可以简化程序的复杂度,提高可读性。

匿名函数

匿名函数通常的使用场景是:程序中需要使用一个函数完成一个简单的功能,并且该函数只调用一次。

lambda argument1, argument2,... argumentN : expression


square = lambda x: x**2
square(3)
9

lambda 是一个表达式(expression),并不是一个语句(statement)

表达式就是用一系列“公式”去表达一个东西,比如x + 2、 x**2等等;

而语句则一定是完成了某些功能,比如赋值语句x = 1完成了赋值,print 语句print(x)完成了打印,条件语句 if x < 0:完成了选择功能等等。

因此,lambda 可以用在一些常规函数 def 不能用的地方。

# lambda 可以用在列表内部,而常规函数却不能。
[(lambda x: x*x)(x) for x in range(10)]

# 输出
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# lambda 可以被用作某些函数的参数,而常规函数 def 也不能
l = [(1, 20), (3, 0), (9, 10), (2, -1)]
l.sort(key=lambda x: x[1]) # 按列表中元组的第二个元素排序
print(l)
# 输出
[(2, -1), (3, 0), (9, 10), (1, 20)]

lambda 的主体是只有一行的简单表达式,并不能扩展成一个多行的代码块。

函数式编程,是指代码中每一块都是不可变的(immutable),都由纯函数(pure function)的形式组成。

这里的纯函数,是指函数本身相互独立、互不影响,对于相同的输入,总会有相同的输出,没有任何副作用。

def multiply_2(l):
    for index in range(0, len(l)):
        l[index] *= 2
    return l

# 改写

def multiply_2_pure(l):
    new_list = []
    for item in l:
        new_list.append(item * 2)
    return new_list

函数式编程的优点,主要在于其纯函数和不可变的特性使程序更加健壮,易于调试(debug)和测试;

缺点主要在于限制多,难写。

Python 主要提供了这么几个函数:map()、filter() 和 reduce(),通常结合匿名函数 lambda 一起使用。

map(function, iterable) 函数,对 iterable 中的每个元素,都运用 function 这个函数,最后返回一个新的可遍历的集合。

map() 函数直接由 C 语言写的,运行时不需要通过 Python 解释器间接调用,并且内部做了诸多优化,运行速度快。

filter(function, iterable) 函数,和 map 函数类似,function 同样表示一个函数对象。

filter() 函数表示对 iterable 中的每个元素,都使用 function 判断,并返回 True 或者 False,最后将返回 True 的元素组成一个新的可遍历的集合。

reduce(function, iterable) 函数,它通常用来对一个集合做一些累积操作。

function 同样是一个函数对象,规定它有两个参数,表示对 iterable 中的每个元素以及上一次调用后的结果,运用 function 进行计算,所以最后返回的是一个单独的数值。

通常来说想对集合中的元素进行一些操作时,如果操作非常简单,比如相加、累积这种,那么优先考虑 map()、filter()、reduce() 这类或者 list comprehension 的形式。

至于这两种方式的选择:

上一篇下一篇

猜你喜欢

热点阅读