前言
对 python 常用的一些高阶使用进行说明整理
一、装饰器 property
python 中属性和方法访问权限的问题,虽然不建议将属性设置为私有的,但是如果直接将属性暴露给外界也是有问题的,比如我们没有办法检查赋给属性的值是否有效。我们之前的建议是将属性命名以单下划线开头,通过这种方式来暗示属性是受保护的,不建议外界直接访问,那么如果想访问属性可以通过属性的 getter(访问器)和 setter(修改器)方法进行对应的操作。如果要做到这点,就可以考虑使用 @property 包装器来包装 getter 和 setter 方法,使得对属性的访问既安全又方便,概括的说,装饰器的作用就是为已经存在的对象添加额外的功能。代码如下所示:
class Person(object):
def __init__(self, name, age):
self._name = name
self._age = age
# 访问器 - getter方法
@property
def name(self):
return self._name
# 访问器 - getter方法
@property
def age(self):
return self._age
# 修改器 - setter方法
@age.setter
def age(self, age):
self._age = age
def play(self):
if self._age <= 16:
print('%s正在玩飞行棋.' % self._name)
else:
print('%s正在玩斗地主.' % self._name)
def main( ):
person = Person('王大锤', 12)
person.play( )
person.age = 22
person.play( )
# person.name = '白元芳' # AttributeError: can't set attribute
if __name__ == '__main__':
main( )
二、装饰器 pysnooper
用于代码测试非常好用的工具
# 安装(两种方式)
pip install pysnooper
conda install -c conda-forge pysnooper
测试哪一段代码在这段代码之前加上 @pysnooper.snoop() 即可
# Example:
import numpy as np
import pysnooper
@pysnooper.snoop()
def one(number):
mat = []
while number:
mat.append(np.random.normal(0, 1))
number -= 1
return mat
one(3)
也可以测试单个块的效果,具体使用:https://github.com/cool-RR/PySnooper
三、迭代器和生成器
- 生成器(generator):一边循环一边计算的机制
- 迭代器(iterator):可以被
next()
函数调用并不断返回下一个值的对象
四、map 函数
map(function, iterable, ...)
- map() 会根据提供的函数对指定序列做映射。可以将一个函数作用到可迭代的序列中,并返回函数输出的序列。
- 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
# 示例
mylist = list(map(upper, ['sentence', 'fragment']))
list_of_ints = list(map(int, "1234567"))
五、reduce 函数
reduce()
函数与map()
函数不同,其输入的函数需要传入两个参数。reduce()
的过程是先使用输入函数对序列中的前两个元素进行操作,得到的结果再和第三个元素进行运算,直到最后一个元素。
六、filter 函数
filter()
函数的作用主要是通过输入函数对可迭代序列进行过滤,并返回满足过滤条件的可迭代序列。
def is_odd(n):
return n % 2 == 0
filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
# return: [2, 4, 6, 10]
七、sorted 函数
sorted()
函数可以完成对可迭代序列的排序。- 与列表本身自带的
sort()
函数不同,这里的sorted()
函数返回的是一个新的列表。sorted()
函数可以传入关键字key
来指定排序的标准,参数reverse
代表是否反向。
sorted([3, 5, -87, 0, -21], key=abs, reverse=True) # 绝对值排序,并且为反序
# return: [-87, -21, 5, 3, 0]
八、lambda 匿名函数
对于一些简单的逻辑函数,可以使用
lambda
匿名函数表达式来取代函数式的定义,这样可以节省函数名称的定义,以及简化代码的可读性等。
add = lambda x, y: x + y
add(1, 2)
# return: 3
Note: 还没理完,比较忙,抽空持续更新 fighting…