温习Python语言编程

写于 2018-03-10 | 分类于 编程

重看廖雪峰的Python教程,把之前没有理解到位的点整理出来,加深理解

没有理解到位的点

  • 函数参数的多种形式
  • 尾递归优化防止造成栈溢出
  • 汉诺塔的移动
  • 生成器:(x * x for x in range(10))
  • 使用generator生成杨辉三角
  • 理解Iterable和Iterator
  • 偏函数应用和函数柯里化
  • min, max = max, min理解
  • 筛选素数和回数实例
  • nonlocal的应用
  • yield和yield from
  • 使用dir()获得一个str对象的所有属性和方法
  • slots:限制实例的属性,不限制class动态绑定属性方法
  • 自定制类:
  • asyncio

函数参数的多种形式

1、位置参数:func1(a, b, c),根据位置做匹配,严格要求实参的数量与行参的数量位置相等
2、默认参数:func2(a, b=2, c=3),根据键值对的形式做实参与行参的匹配,通过这种方式可以忽略参数的位置关系,直接根据关键字来进行赋值,不传则用默认值
3、可变参数:func3(*args),可以传入任意个参数,若干个参数都被放到tuple元组中赋值给形参args,函数中直接操作args这个tuple元组就可以了
4、关键字参数:func4(**kw):以键值对字典的形式向函数传参,含有第二种位置的灵活性的同时具有第三种方式的数量上的无限制
注:四种方式混用时要遵守args=须在args之后,*args须在args=value之后,**kw须在*args之后

尾递归优化防止造成栈溢出

尾递归是指在函数返回的时候,调用自身本身,并且return语句不能包含表达式,这样编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次都只占用一个栈帧,不会出现栈溢出的情况
def fact(n):
    return fact_iter(n, 1)

def fact_iter(num, product):
    if num == 1:
        return product
    return fact_iter(num - 1, num * product)

生成器

生成器不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIteration异常结束
函数中出现yield关键字,那么该函数就不再是普通函数,而是生成器函数
def odd():
    n = 1
    while True:
        yield n
        n += 2

使用generator生成杨辉三角

每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
def triangles();
    nlist = [1]
    while True:
        yield nlist
        nlist.append(0)
        nlist = [nlist[i] + nlist[i - 1] for i in range(len(nlist))]

理解Iterable和Iterator

凡是可以for循环的,都是Iterable;
凡是可以next()的,都是Iterator;
集合数据类型如list,dict,str,都是Iterable不是Iterator,但可以通过iter()函数获得一个Iterator对象
isinstance({}, Iterable) --> True
isinstance((), Iterable) --> True
isinstance({}, Iterator) --> False
isinstance((), Iterator) --> False

偏函数应用和函数柯里化

偏函数应用指的是固化函数的一个或一些参数,从而产生一个新的函数
def log(level, message):
    print level + ":" + message
def logWarning(message):
    log("Warning", "this is one warning message")
以上是偏函数应用
def log(level):
    def logMessage(message):
        print level + ":" + message
    return logMessage
log("Warning")("this is one warning message")

未完待续

参考资料