Day05 装饰器(补充) 模块 序列化 字符串格式化(补充) 生成器 迭代器 递归

装饰器

装饰器之多层装饰器

def outer1(func):
    def inner(args):
        print("中国")
        result = func(args)
        return result
    return inner


def outer2(func):
    def inner(args):
        print("北京")
        result = func(args)
        return result
    return inner


@outer1
@outer2
def print_info(args):
    print(args)
    return "OK"

print_info('alex')

模块##

python中模块在其他开发语言中叫类库

模块:代码重用,调入模块,使用模块的属性,提高开发效率。把其他模块中属性附加到你的模块中的操作就是导入(import)。

模块的命名空间:模块的文件名就是模块的名字加上文件扩展名.py
模块的命名,模块命名的唯一性,避免不同模块出现名称交叉现象。

模块搜索路径与路径搜索:
模块的导入需要一个路径搜索的过程。在文件系统的预定义区域中查找导入的模块文件,预定义区域是python搜索路径的集合。路径搜索是查找一组目录,搜索路径是查找被导入模块的文件的操作。

导入模块后调用失败有可能就是路径搜索失败。
import sys

sys.path #查看有效的路径,可以看到结果是一个列表类型可以使用列表的方法添加路径
sys.pathc.append()
需要注意的是模块的路径搜索有先后顺序,解释器会使用按搜索路径顺序找到的第一个模块。

sys.modules 可以查看当前所导入的模块和他们来自的地方。和sys.path不同,它是一个字典,模块名是键,对应的物理地址作为值。

导入模块:

import *module*

from module import name1[,name2,...]

from module import (name1,...)

from module import name as aliasname

序列化##

两个模块json和pickle
json可以通用基本所有的开发语言进行的数据交互,但是只能序列化列表,字典等基本数据类型
pickle可以序列化更为复杂的数据,但是只能在python开发语言通用

json模块的四个最常用的方法 loads(), dumps(), load(), dump()

import json
li = [11, 22, 33, ]
re = json.dumps(li)
print(re,type(re))
de = json.loads(re)
print(re,type(de))

以上dumps(), loads()方法主要将数据序列化到内存中,而下面的dump(), load()方法将会在前面两个方法上多做一步操作,将序列化到内存中的内容写入到文件。

import json
li = [11, 22, 33, ]
json.dump(li, open('info.db', 'w'))
de = json.load(open('info.db', 'r'))
print(de)

pickle模块的常用四个方法和json一样,有点需要注意的是对文件操作的时候open方法文件对象的时候注意使用二进制模式

import pickle

di = {'name': 'alex', 'age': 18, 'sex': 'male'}
re = pickle.dumps(di)
print(re, type(re))
de = pickle.loads(re)
print(de, type(de))

pickle.dump(di, open('info.db', 'wb'))
de = pickle.load(open('info.db', 'rb'))
print(de, type(de))

生成器和迭代器###

一个生成器函数的定义很像一个普通的函数,除了当它要生成一个值的时候,使用yield关键字而不是return。如果一个def的主体包含yield,这个函数会自动变成一个生成器(即使它包含一return)。

def myrange(arg):
    start = 0
    while True:
        if start > arg:
            return
        yield start
        start += 1

ret = myrange(100)

for i in ret:
    print(i)
def func(arg):
    arg += 1
    if arg >= 4:
        return "end"
    return func(arg)

result = func(1)

print(result)

generator是用来产生一系列值的
yield则像是generator函数的返回结果
yield唯一所做的另一件事就是保存一个generator函数的状态

迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。

对于原生支持随机访问的数据结构(如tuple、list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值)。但对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式。

另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件,或是斐波那契数列等等。

迭代器更大的功劳是提供了一个统一的访问集合的接口,只要定义了__iter__()方法对象,就可以使用迭代器访问。

递归##

如果函数包含了对其自身的调用,该函数就是递归的

def func(arg):
    arg += 1
    if arg >= 4:
        return "end"
    return func(arg)

result = func(1)

print(result)
posted @ 2016-06-09 18:17  摸个鱼儿  阅读(139)  评论(0编辑  收藏  举报