代码改变世界

2018.3.21学习笔记(生成器、迭代器、反射)

2018-03-21 05:03  冒牌权限  阅读(75)  评论(0)    收藏  举报

生成器

#!/usr/bin/env python
# -*- coding:utf-8 -*-

def shengcheng():
    print('a')
    yield 1

    print('b')
    yield 2

    print('c')
    yield 3

r = shengcheng()#仅仅创建一个生成器
print(r)

ret = r.__next__()
print(ret)
ret = r.__next__()
print(ret)
ret = r.__next__()#可以看出似乎yield具有保存执行状态的功能,否则为什么每次执行是往下
print(ret)

迭代器

#!/usr/bin/env python
# -*- coding:utf-8 -*-

def xrange(n):
    start = 0
    while True:
        if start > n - 1:
            return
        yield start
        start += 1
##########以上为生成器##########
#########通常用for来迭代########

for i in xrange(10):
    print(i)
#迭代器只是一个概念一个原理,不是具体的某一段代码。。。额,我是这么认为的

 反射

#!/usr/bin/env python
# -*- coding:utf-8 -*-

#反射就是根据字符串的形式去对象中操作其成员
#getattr(对象,成员名)寻找
#hasattr(对象,成员名)判断是否存在
#setattr(对象,成员名,值)设置
#delattr(对象,成员名)删除
#下面以模块(对象)和函数(成员)为例,尝试一下getattr()

inp = input('请输入要导入的模块名:')#很明显用户输入的是字符串
mokuai = __import__(inp)#导入名为用户输入的字符串的那个模块
inp_func = input('请输入要执行的函数:')
getattr(mokuai,inp_func)()#getattr()获得要执行的函数,后面再加个括号来执行这个函数

 利用反射和__import__()写一个原理性的web框架

#!/usr/bin/env python
# -*- coding:utf-8 -*-

inp = input('请输入URL后半段:')
mods,funcs = inp.split('/')

import_mods = __import__('test.' + mods,fromlist = True)
if hasattr(import_mods,funcs):
    print(getattr(import_mods,funcs)())
else:
    print('404')