understand WSGI

生成器与迭代器区别: 容器是一种把多个元素组织在一起的数据结构, 容器中的元素可以逐个地迭代获取,可以用in,not in 关键字判断元素是否包含在容器中。 通常这类数据结构把所有的元素存储在内存中(也有一些特例,并不是所有的元素都放在内存,比如迭代器和生成器对象)在python中, 常见的容器对象有:

list,deque,...
set,fronzensets,...
dict,defaultdict,OrderedDict,Counter,...
tuple,namedtuple,...
str 容器比较容易理解,因为你可以把它看做是一个盒子,一栋房子、一个柜子,里面可以塞任何东西。从技术角度来说,当它可以用来询问某个 元素是否包含在其中时,那么这个对象就可以认为是一个容器,比如list,set,tuples都是容器对象: 尽管绝大多数容器都提供了某种方式来获取其中的每一个元素,但这并不是容器本身提供的能力,而是可迭代对象赋予了容器这种能力, 当然并不是所有的容器都是可迭代的,比如:Bloom Filter,虽然Bloom  Filter可以用来检测某个元素是否包含在容器中,但是并不能从 容器中获取其中的一个值,因为Bloom filter压根就没把元素扫描在容器中,而是通过一个散列函数映射成一个值保存在数组中。

可迭代对象:

刚才说过,很多容器都是可迭代对象,此外还有跟多的对象同样可是可迭代对象,比如打开状态的files、socket等等,
但凡是可以返回一个迭代器的对象都可称之为可迭代对象,听起来可能有点困惑,没关系,先看一个例子:

迭代器:

它是一个带状态的对象,他能在你调用next()方法地时候返回容器中的下一个值,任何实现了__iter__和__next__()
迭代器就是实现了工厂模式的对象
class Fib:
    def __init__(self):
        self.prev = 0 
        self.curr = 1
    def __iter__(self):
        return self
    def __next__(self):
        value = self.curr
        self.curr += self.prev
        self.prev = value
        return value
f = Fib()

生成器:

生成器是一种特殊的迭代器,这种迭代器更加优雅,不需要向上面的类一样写__iter__()和__next__()方法了,只需要一个yield
关键字,生成器一定是迭代器(反之不成立),因此任何生成器也是一一种懒加载的模式生成值。    
def fib():
    prev,curr = 0 ,1
    while True:
        yield curr
        prev,curr = curr,curr+prev

装饰器:python的AOP利器

def not_null(*varnames):
    def outer(func):
        def inner(*args,**kwargs):
            args_name = func.__code__.co_varnames
            args_cnt = func.__code__.co_argcount
            flag = True
            for name in varnames:
                index = args_name.index(name)
                flag = flag and (args[index] is not None)
            if not flag:
                raise TypeError("somethis is None")
            result = func(*args,**kwargs)
            return result
        return inner
    return outer

yield关键字做了什么 当你的函数需要返回一个很大的元素集合,并且每个元素只需要用到一次的时候,使用yield会非常方便

web.py源码解析 WSGI

web server side:

服务器必须做两件事情:

一个environ字典和一个start_response函数:

iterable=app(environ,start_response)
for data in iterable:
    #send data to client

WSGI PEP333 WSGI中分块传输大文件,使用yield:(rhodesmill.org/brandon/2013/chunked-wsgi)

后续:

http://benosteen.wordpress.com

My swiss army toolkit for distributed/multiproesssing systems

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏自动化测试实战

接口测试基础——第7篇 简单的Python知识普及(二)之装饰器

43814
来自专栏闰土大叔

闰土说JS进阶之变量

前言 前端世界如此喧嚣,能进阶的何其稀少。大家好,你们的闰土哥在沉寂了数月之后又回来了!(此处应有掌声~~~) 前段时间在群里关于“闰土去哪儿了”的话题,让我既...

35910
来自专栏猿人谷

怎样写解释器

解释器是比较深入的内容。虽然我试图从最基本的原理讲起,尽量让这篇文章不依赖于其它的知识,但是这篇教程并不是针对函数式编程的入门,所以我假设你已经学会了最基本的 ...

2137
来自专栏java架构师

Stream篇(2)【TextReader】

说明:一个对于Text的读取器。无论哪种文件类型,其实都是通过一个个char组成的。 这是个抽象类,无法直接实例化 重要方法: 1、void Close() 2...

3489
来自专栏小古哥的博客园

读书笔记-JavaScript面向对象编程(一)

前前后后大概花了两周的时间,终于把这本书大致看完了,对之前javascript高级程序设计中模糊不清的概念,有了一些新的看法和角度,整体上来说,本书还是一本比较...

3347
来自专栏Android机动车

数据结构学习笔记——栈

我们允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。

913
来自专栏racaljk

[数据结构]C语言栈的实现

有始有终,所以我准备把各种数据结构都讲一次,栈也分顺序存储和链式储存,这里我们选择链式存储来讲,顺序存储没有难度(链式其实也是)

3884
来自专栏静默虚空的博客

[设计模式]原型模式

简介 原型模式 (Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式是一种对象创建型模式 (可参考 设计模式 创建型...

1978
来自专栏Java3y

栈和队列就是这么简单

一、前言 上一篇已经讲过了链表【Java实现单向链表】了,它跟数组都是线性结构的基础,本文主要讲解线性结构的应用:栈和队列 如果写错的地方希望大家能够多多体谅并...

37310
来自专栏Fundebug

JavaScript正则表达式进阶指南

例如,正则表达式/F.*g/会匹配“以F开头,以g结尾的字符串”,因此可以匹配"Hello, Fundebug!"中的Fundebug,exec方法会返回一个数...

1906

扫码关注云+社区

领取腾讯云代金券