『python』python基础教程(3) — 高阶方法使用


前言

对 python 常用的一些高阶使用进行说明整理

  1. 『python』python基础教程(1) — 基本数据结构
  2. 『python』python基础教程(2) — 基础知识整理

一、装饰器 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…

猜你喜欢

转载自blog.csdn.net/libo1004/article/details/111029660