Python Notes: Iterator, Generator and Co-routine

Iteration

Python support iteration, for example, iterating over a list:

for elem in [1, 2, 3]:
    print elem

Iterating over a dict:

for key in {'Google': 'G',
              'Yahoo': 'Y',
              'Microsoft': 'M'}:
    print key

Iterating over a file:

with open('path/to/file.csv', 'r') as file:
    for line in file:
        print line

We use iterable objects in many ways, for example, reductions: sum(s), min(s), constructors: list(s), in operators: item in s.

The reason why we can iterate over iterable is because of iterable protocols: any objects that supports iter() and next() is an itterable. For example, we can define one itterable object in the following way:

class count:

def __init__(self, start):
    self.count = start

def __iter__(self):
    return self

Def next(self):
    if self.count < 0:
        raise StopIteration
    r = self.count
    self.count -=1
    return r

We can use the above example in this way:

c = count(5)
for i in c:
    print I
# 5, 4, 3, 2, 1

Generator

So what is a generator? By definition: a generator is a function that produces a sequence of results instead of a single value.

So generator is a function, it is different from other functions that it generates a sequence of results instead of a single value. Generator function is very different from normal function, calling the generator function will create one generator, but would not execute it, until next() is called. The following is an example of generator:

def count(n):
    while n > 0:
        yield n
        n -= 1

c = count(5)

Note that when we first initiate count, it won't execute. Until the first time we call, c.next() the generator would start to execute. But it will suspend on the yield command, until next time it executes.

So to speak, a generator is a convenient way of writing an iterator, and you don't have to worry about iterator protocols.

Except for yield based generator function, python also supports generator expression:

a = [1, 2, 3, 4]
b = [x*2 for x in a]
c = (x*2 for x in a)

b is still a regular list, while c is a generator.

Co-routine

Python coroutine is very similar to generator. Think about the following pattern:

def receive_count():
    try:
        while True:
            n = (yield) # Yield expression
            print "T-minues ", n
    except GeneratorExit:
        print "Exit from generator."

The above form of generator is called coroutine. Coroutine is different from generator in that it receives data instead of generates data. Think of it as a consumer or receiver.

To use python co-routine, you need to call next() first so that the function executes to the yield field part, then you can use send to send the value to the function. For example:

    c = receive_count()
    c.next() # trigger to yield function
    c.send(1) # sending 1 to the co-routine.
    # prints "T-minus 1"

Python provided a decorator called @consumer to execute the next() function part. With the consumer decorator, the co-routine can be used directly.

Then the question is: why don't we just declare co-routine as a regular function where you can send the value to it directly instead of relying on the yield expression? Using coroutine in the given examples doesn't fully justify it's value. More often, people use co-routine to implement a application level multiple threading. I will introduce more about this later.

Python Notes: Context management

Python supports context management. Which often used when handling resources, for example, file, network connection. With statement helps make sure the resources are cleaned up or released. There are two major functions for context management: __enter__ and __exit__.

__enter__ is triggered when the with statement is first triggered, while __exit__ statement is triggered when the statement finishes execution.

One very common usage of with statement is when we open up files:

    with open('/path/to/file', 'r') as file:
        for line in file():
            print(line)

The with statement on this example will automatically close the file descriptor no matter how this with block exits.

Python with statement also supports nesting, for example:

    with open('/open/to/file', 'r') as infile:
        with open('write/to/file', 'w') as outfile:
            for line in infile:
                if line.startswith('Test'):
                    outfile.write(line)

If you want your code to support with statement based context management, just override the two functions on your code, for example:

class Resource:
    def __init__(self, res):
        self.res = res

    def __enter__(self):
        #define your code here

    def __exit__(self, exc_type, exc_value, traceback):
        #define your code here

There is another way to support context management, which is to use the contextlib.contextmanager, we will introduce this later.

 

Python Notes: Closure

 

The following is an example of python closure.

def outer_function(outter_arg):
    closure_var = outter_arg
    def inner_function(inner_arg):
        print("{} {}".format(closure_var, inner_arg))

    return inner_function

# Usage of a python closure
closure_func = outer_function("X")
closure_func("Y1") # print "Y1 X"
closure_funct("Y2") # output "Y2 X"

Variables and nested function

Python has two types of variables: local variable and global variable. Variables defined within a function has a local scope, while variables defined outside a function has global scope.

When a function is defined within another function, the function is called nested function. The nested function, however, can access the outer function’s variables. In the example above, outer function defined a variable called closure_var, and this variable would be initiated by the input variable. The inner function is able to access this variable and use this variable in its own function definition.

There are two steps of using a closure function: initiate the closure function and assign to a local variable, then call the variable with parameter to invoke the inner function.

When to use closure?

  • Reduce the use of global variables

Closure could hide variables inside the function, in this way we reduce the use of global variables.

  • Simplify single function classes.
    For example, the above example could be converted into a single function class:
class OuterClass:
    def __init__(outer_arg):
        self.arg = outer_arg

    def inner_function(self, inner_arg):
        print("{} {}".format(self.arg, inner_arg))

In general, closure runs faster than instance function calls.

《人类文化的起源》书评

为什么不同国家不同地区的文化相差如此之大?为什么当代的文化与古代甚至近代的文化这么不同?文化的演进是完全随机的吗?还是说存在着某种共同的推动力量?

马文-哈里斯试图在《人类文化的起源》一书中回答这个问题。他认为,人口压力带来的生产强化是解释这个问题的关键。在有效的避孕手段发明以前,人口的自然增长是难以得到有效控制的,为了应对人口增加带来的资源相对稀释,人类必须强化生产从而获得更多的产出:或者使用高有效的生产技术,或者提高资源的利用效率。但是生产的强化总是伴随着新一轮的人口增长,从而迫使人们进入下一轮的生产强化之中。作者在本书中用这把钥匙解释了诸多文化的现象。

作者在开篇先试图澄清了人们对原始社会的普遍误解。在一般的想象当中,原始社会的人们生活水平极差,安全和营养得不到保证,人们花费大量时间获得食物以填饱肚子。但是作者列举了研究的证据表明,在狩猎采集社会的人类实际上可以获得充足的营养。他们可以轻松捕获大型动物,并通过各种手段抑制人口增长,从而保证整个族群的生活会平不会降低。

那么为何人类会进入农业社会呢?作者认为主要是因为大型野兽因为人类的捕杀以及冰川时期的结束而渐渐消失,狩猎采集的生产效率逐渐降低,人们不得不转向更加有效地生产方式,那就是种植农业。但是,不同大陆在农业上的禀赋完全不同,比如有些大陆有更多可供驯化的动物和植物,从而是这些地区的生产相对容易。但另一些地区,比如中美洲,就没有可供驯化的野兽。这也为后来比如吃人习俗的出现埋下了种子。

作者接着用这一理论解释了战争的起源。在作者开来,战争的主要作用在于对人口的控制。战争将人口聚散,拉开了居民之间的距离,降低了整个地区的人口密度。而男性更高的战争价值使人们更愿意培养男婴,杀害女婴。进一步的,作者讨论了男权社会的形成原因。基本来说,作者认为是战争导致了大男子主义,进而导致了父亲社会,随父共居,新娘嫁妆这些丰富,作为对男性尚武的性奖励的一夫多妻制度,以及妇女较低的社会地位。作者还讨论了为什么很多女权主义者将母系社会作为女权合理化的证据,认为这是对历史社会形态的误读。作者还讨论使用弗洛伊德理论解释战争起源的错误之处。弗洛伊德的理论讲战争视作人类内在本能冲突的表现,这种解释缺乏解释力的地方在于其无法阐释战争的诸多形态,以及不同国家从最好战到最不好战的迅速变化。

另一个重要的文化现象是国家的起源。作者认为国家最初的形成是依赖于负责在分工的大人物。在最开始的时候,这些大人物仅仅是负责举办盛大的宴席,负责食物的再次分配。农业生产的强化导致了对协作的需求,从而加强了这些人的权力。这种权利的逐渐集中最后带来了原始国家的出现。作者在随后的章节中重点讨论了不同地区在国家产生之后完全不同的形态。

作者重点讨论了阿兹特克人食人传统的出现。作者认为,阿兹特克人的食人习俗是作为一种蛋白质再分配的方式存在的。在中美洲地区,因为缺乏动物资源,通过食人来获得更多的蛋白质是一种更加有效地途径。作者随后又讨论了基督徒祭神方式的转变。最开始的羔羊祭祀实际上也是一种蛋白质的再分配,后来资源的消耗以及人口的增长使得这种祭祀方式无法继续进行了。与阿兹特克人相比,这些地方之所以没有出现食人的习俗乃是因为这里存在着成本更低的获取蛋白质的方式。简单来说,是成本效益的对比决定了食人传统的出现与消失。另一个非常显著的现象是不同文化中食用动物的禁忌。比如伊斯兰教中猪是被禁止使用的,作者认为这是因为猪在地中海地区的饲养成本太高而导致的。这一地区缺乏饲养猪的植物以及猪降低体温需要的湿润土壤。而在印度,牛是一种被禁止使用的动物。这主要是因为牛是印度最重要的耕作动物,印度需要牛来维持农业生产。而这一文化之所以没有在中国出现,乃是因为中国具有更多的牧畜可以替代这些作用。

作者还讨论了水利国家和资本主义的现象。简单来说,在大河的滋润下贫瘠或者半贫瘠的平原河谷发展出来的社会容易形成水利社会。水利地区需要通过大规模协作修建水利工程,从而增加生产,这种对于大规模协作的需要是导致集权制度在这些地方反复出现的原因。而被迫强化生产以应付人口增长则是最根本的驱动力。与之对比,欧洲之所以没有被封建主义仿佛钳制乃是因为生产强化破势人们转变生产方式,而这种生态产方式更加青睐资本主义的制度而非封建主义制度。

作者在最后一章谈到了当代工业社会。作者认为,之所以我们暂时没有陷入生产强化资源耗尽的陷阱之中,乃是因为技术变革。最根本的是避孕方法的变革和职业的变革。避孕套的发明使人们找到了低成本的组织人口增长的方法。而家庭从生产功能中解放出来降低了人们继续生育的动力。因为生育子女的成本极大提高,子女未来能否获得好的经济回报的不确定性增加,而人们不再依赖于子女为家庭生产增加人手。新的廉价的能源,以及低于生殖潜力的人口增长速度暂时缓解了资源分散的压力,从而是当代人类获得了前所未有的生活水平的提高。但是作者也提醒我们不要过于乐观,最终这种方式能否持续仍然取决于人类能否找到替代能源,从而是人类从资源枯竭的宿命中拯救出来。

总的来说,本书的作者使用了非常理性的,甚至带有部分决定论的理论来解释了最重要的人类文化的几个方面。这种解释提供了相当多的新颖的理解世界的角度。比如在最后一章,作者提到,养老保险和医疗保险实际上正在代替原来养育子女中足以重要的一环:孩子对父母的反哺。但同时,作者在解释部分理论的时候仍然是不够清晰的。比如对战争的起源问题,通过战争达到控制人口的目的对于战争的解释是不完全令人信服的。

《写给无神论者》书评

《写给无神论者》是英国哲学家阿兰-德波顿的作品。这本书想要讨论的是:宗教能否为现代人心灵问题的解决提供启示。

我们首先注意到的是宗教在人们生活中的退潮。随着自然科学的兴起、发展和普及,诸如宇宙大爆炸起源假说、生物进化等观点越来越多地被普通人接受并习以为常。这些观念与宗教当中超自然的部分:关于宇宙形成的解释、违反物理准则的神迹等等相互冲突。而正是在这样的冲突之下,越来越多人选择放弃宗教信仰。

宗教中超自然的部分固然很难让人们接受,但它们是否应该成为人们了解宗教、吸取智慧的阻碍?答案显然是否定的。作者提到,尽管科学得到了极大发展,但宗教想要解决的两大核心问题仍然存在:我们该以怎样的准则与他人和谐相处,以及如何面对人生的种种痛苦。作者在本书中想要论证的正是:如果抛开对超自然部分的成见,宗教仍然可以为这些问题的解决提供灵感。

在作者看来,至少在以下方面,宗教仍然十分具有启发性:如何培育对群体的归属感,如何让人们更加和善。如何抵消目前广告对商业价值的过分,如何选择并利用世俗的圣贤,如何反思大学的战略并改进文化教育方法,如何重新设计旅馆和休闲场所,如何更好地承认我们内心孩子般的需求,如何放弃某些会起反作用的乐观主义,如何通过壮丽和超然的体验来获得博大的视角,如何改组现有的博物馆,如何利用建筑来寄托价值观,以及如何凝聚各人分散的工作,在体制的领导下把大家护理心灵的努力整合起来。

这本书中第一个有趣的讨论是关于现代社会人与人的疏离,也即书中所说的群体归属感的失落。

简单说来,现代社会的发展带来若干问题:人与人之间基于人情的直接依赖越来越多的被基于货币的间接依赖替代,人们不再需要强烈地依赖群体;物质财富前所未有地被强调;社会流动速度的加快加速了熟人社会的解体。于是人与人之间的隔膜和疏离感称为现代人的主要问题。

在作者看来,宗教深深理解这种隔膜,并通过多种方式努力消除这种隔膜。首先是提供一个特定的场所和情景以创造紧密感,比如进行礼拜和弥撒的教堂,比如定期进行的会餐。然后,宗教会提供一个平等沟通的环境:在这种环境之内,人与人的外在差别被缩小和淡化了。比如举行弥撒的时候,基督教使人们相信,上帝面前人人平等,不管你的财富或者地位如何,你和他人在上帝眼中都是一样的。这种平等的气氛又因为聚会的场所、仪式等得到大大加强。因为有了这种观念的设定,人们便可以暂时抛弃偏见,抛弃以自我为中心的想法,开始与他人进行沟通,从而感到人与人之间的联系,并最终开始关心人类层面的问题。

如何将这样的技巧运用到现实生活中呢?作者认为,我们可以借用弥撒和会餐的形式,创造一种新的餐厅模式,为陌生人之间的沟通创造桥梁。

本书讨论的第二个有趣的问题是自由主义和家长主义的辩论。

所谓自由主义是说,我们应当在不受责骂的状态下如己所愿地自由生活,既不必恐惧他人的道德评判,也不用屈从于某些权威一时兴起的意念。家长主义则认为我们的生活需要加之指导甚至干涉。

自由主义者主要有两个出发点:第一点是他们认为法律监管的行为和个人的道德约束行为之间应该划出明确的界限,任何个人的道德层面的行为都不应该被监管,以防止权力的滥用。第二点是自由主义者承认伦理道德问题的复杂性,他们并不相信世界上存在唯一的道德标准,所以宁愿对道德问题保持中立。

自由主义是十分具有吸引力的,但作者提醒我们需要认识到由此付出的代价:我们真的有足够的智慧来充分利用自己所获得的自由吗?自由同时意味着诱惑,我们享受自由却并不一定能够抵制诱惑,当人们陷入自由和诱惑的矛盾的时候,有意义的劝诫和教导是不是有益地呢?

基督教认为,在道德上我们归根结底都是幼稚的、不完全的、有待完善的、容易受到诱惑的甚至是作恶多端的。基督教认为,有益的帮助和指导对于人们是必须的。

对比是认识事物最好的方式之一。宗教曾如何影响过人类生活?了解这一问题最好的方式就是研究宗教缺位对人类生活的影响。这本书通过对比的方式赋予了我们全新的视角,即将宗教的超自然部分 –也许是最为人们所排斥的部分– 剥离开来,从而使我们可以重新审视和看待宗教,而在这种新的视角之下,我们得以从其源远流长的只会当中汲取灵感。

当然,本书也有许多不足的地方。比如抛弃宗教的约束力量,而只取其中劝人向善的部分在实践中是否真的可行?再比如,本书所想要讨论的是普适性的宗教,但作者的讨论基础明显主要局限于基督教,这种局限性在一定程度上削弱了本书想要阐释主题。

婚姻是不是两个人的事?

婚姻是不是两个人的事?关于这个问题,我们经常听到下面这种论调:

  • 恋爱是两个人的事,但婚姻是两个家庭的事。

更年轻一点的时候我喜欢这类说法。那时我并不了解婚姻和家庭的联系在哪,但这种说法听起来够成熟,甚至透露出一点经历世事之后的沧桑感,很适合用来装点自己。

然而所有观念都需要仔细推敲。

结婚是两个家庭的事情 这种说法其实是在强调:婚姻不仅影响结婚的双方,也会影响双方的家庭。

越是在传统社会,这个观点越可能是对的,因为:

  • 结婚是两个家庭进行社会资源整合,社会关系融合的主要手段。
  • 传统家庭仍然是三代四代同堂,和什么样的人结婚会影响到所有共同居住的人的生活。
  • 传统社会家庭承担的社会功能非常之多,婚姻会影响到这些社会功能的方方面面。

在这种情况下,说结婚是两个家庭的事也就并不为过了。这也是为什么包办婚姻在传统社会如此普遍的原因:对家庭影响如此重大的事情当然要交给足够成熟的长辈决定。

在现代社会,婚姻和家庭更多的变成了两个人的事情。

现代家庭更多是核心家庭的结构:父母和未成年的孩子。家庭结构的变化这在很大程度上是城市化造成的:城市化带来人口的大迁徙,人们脱离原生家庭的环境,聚集到有更多经济机会的地方,并在这里组织新的家庭。在这样的家庭结构之下,婚姻与原生家庭的关系也越来越少了:社会关系的融合几乎不再存在,经济上的影响仍然存在但在逐渐降低。

可以预见,结婚将会越来越多地成为两个人的事,而越来越少成为两个家庭的事。

除了家庭结构,在人们对家庭的看法也在发生变化。美国的离婚率高达50%,而中国的离婚率也连年升高。是不是说,人们已经不像从前那样重视婚姻了?

要回答这个问题首先要考察婚姻和家庭的核心功能:生育和抚养子女。如果单亲父母的比例和有未成年孩子的夫妻离婚的比例升高,那么说明人们正更少依赖家庭来养育子女。就目前来看,婚姻仍然是人们养育子女的主要场所。通过其他方式养育子女,比如集中养育当然存在,但最后证实效果并不理想。因此,只要人类仍然养育子女,婚姻就会一直存在。

那么如何理解离婚率升高这件事呢?我们要看看曾经阻止人们离婚的种种因素:女性对于独自抚养孩子的压力和恐惧,人们对于再婚者,尤其是女性再婚者价值的贬低,男性主动离婚被认为是抛弃妇孺的道德压力等等。

随着女性的经济社会地位的提高,自主意识的提升,抚养子女以及个人价值的实现不再主要依靠婚姻;家庭功能向社会的转移也减少了人们对婚姻的依赖。婚姻对双方家庭的影响和依赖的降低也意味着离婚遭到两个家庭的反对将会降低。所有这些都降低了离婚的难度,也就推动了离婚率的升高。

另一个关于婚恋的常见问题是:婚龄的推迟和婚恋障碍。我们经常看到父母抱怨孩子已经到了适婚年龄却迟迟不肯结婚,或者找不到合适的婚恋对象。

在传统社会,婚姻是完全信息之下的单一选择:对双方家庭的充分了解之后选择是否结婚。在现代社会,选择婚恋对象则是局部信息之下的最佳选择问题。城市化的进程带来个人择偶空间的极大扩大,但同时也稀释了每个人可以用来了解他人的投入。因此婚恋策略从传统的充分了解,一锤定音,终生不渝,变为先通过短期关系了解磨合,同时捕捉更好的新机会。这种策略的变化导致在人们在婚恋选择上花的时间增长了,也就出现了父母眼中的剩男剩女问题。所以一般来说,城市化的进展会大幅度提高结婚和生育年龄,同时降低生育率。

《经济学通识》简介与书评

今年初,我阅读了曼昆《经济学原理》的宏观和微观分册,并对其中有趣的部分进行了讨论。读这种教材性质的书好处在于可以获得完整的概念框架,但不足之处在缺少与当下生活的联系,读完之后总有悬浮在空中的感觉。薛兆丰的这本《经济学通识》便是讲这些空中的概念与脚下的现实生活起来的一座桥梁。

贴近现实的例子

在本书中,薛兆丰从四个角度入手,阐释了时下社会现象背后的经济学原理。

  • 东西不够:物质相对于人类的欲望来说总是稀缺的。物质的稀缺性导致了竞争,竞争显示的或者内在地包含了一定的竞争规则,制定怎样的竞争规则,谁来制定规则是本部分讨论的重点。

如何治理道路拥挤?是否应该限制火车票价格?是否应该对房价敢于和调控?薛兆丰批评了政府干预的无效性,认为这些问题本都可以由市场定价更好的解决。与此同时,他也回答了人们对于完全市场的做法的疑问:市场是都会对‘由于资源有限而付不起钱的人’造成歧视?作者认为用价格衡量需求和分配资源并不是完美的,也不能消除歧视,但是金钱是比其他的标准更好的评价方式。

作者还讨论了国际贸易和反垄断的问题。他批评了贸易争端中互设壁垒的做法,讨论了垄断现象的合理性,认为现行的对垄断的评判的不可行性,批评了由于制裁垄断而造成的社会的无谓损失。

  • 生命有限:生命有限指的是人类生命的不确定性。反映在经济学的利息理论上,即利息实际上是向出让现货以获取期货的人给与的补偿,从而其未来消费的风险。

在这一部分中,作者主要探讨了股价、利息和保险机制。关于股价,作者认为股价是不可预测的,因为耐用品的现值是建立在人们对于未来的主管估计之上的,这种主观的估计很容易受到影响而发生波动,因为这些影响和波动是无法估计的所以股价也是不可预测的。作者进一步从现货和期货的角度讨论了利息的决定原理,还讨论了保险的运作机制以及中国医疗保险的特点。

  • 相互依赖:相互依赖是说我们不得不与无数人相互协作才能改善生活,但与此同时,没有人是绝对靠得住的,必须依靠各种合约安排,组织结构和防范行为才能使合作顺利进行。

降低收购生乳的国家标准是否会导致更多消费者购买到质量低下的奶制品?作者认为,这项措施提高了奶量的攻击,降低了厂家造假的积极性,而奶品质量的分别可以交给市场解决。作者在这一部分还讨论了信息不对称问题:卖方可以控制产品的质量,而卖方无法确切知道卖方究竟提供的产品的质量,因为信息的不对称困境造成的交易流失。为了解决这种信息不对称造成的困境,各种安排便应运而生了。

作者还谈到了共享经济。作者认为出租车市场被政府管制的根源在于信息不对称情况下对乘客安全和利益的保护。但是共享经济解决通过将出租车乘客信用评分呈现给乘客、提前预估价格、监控路线等方式结局了这样信息不对称的问题。作者还讨论了收入再分配的问题。

  • 需要协调:需要协作则是说,人们的行为需要有宏观上合理的导向才能够导向社会和谐。经济学上的宏观理论便是为了解决这种需要协调的困境而产生的。

作者在这一部分主要谈到了宏观经济政策的问题,比如汇率与通货膨胀的问题。汇率是如何形成的,汇率和通胀之间的关系,是否应当压低人民币汇率以及这样做的危害。其他讨论的问题包括:中国经济改革中所有权改革的问题,民间集资和影子银行的问题,以及在关于经济的公共决策当中运用民主机制的问题。

经济学家的视角

这本书用丰富的例子帮我们理解经济学家如何看待问题。以讨论如何治理拥堵为例,作者按照下面的顺序展现了一个经济学家思考问题的过程。

澄清概念 道路是私用品而不是公用品,也就是说,一个人使用了道路别人就不能使用了。既然是私用品就一定会有稀缺性和竞争的问题,那么最好的分配方式就是按需分配,而价格是用来衡量需求的最好手段,所以价高者得是最好的分配方式。

定义问题 治理拥堵的目标并不是是每个人都可以畅通无阻地使用道路,而是将道路提供给需求最高的人,也就是愿意出最高价格获得使用权的人。

提出方案 分时段征收拥堵费用。经济学家相信所有的需求都是具有弹性的,也就是说,随着价格的升高需求会降低。分时段征收道路拥堵费用之后,认为某个时段费用过高的人会选择在别的更便宜的时段出行,而有更加紧急的需求的人可以通过支付更高的价格获得优先的使用权。

澄清误解 一般可能会认为,按照时段付费这项政策对富人更加有利而对穷人有损害。但作者认为,按照价格,也就是需求的指标来付费比使用其他手段更加公平而且有效率。

责任声明 合理地规划道路,建设更多的道路以缓解拥堵一方面是长期的策略,短期内不可能见效,另一方面是属于政府职能的层面。作为经济学家,多数时候旨在提供经济层面的解决办法,而不寻求解决所有相关的公共政策。

同样的例子还有春运火车票的问题。作者认为,即使是春节回家这样的也是有弹性的,如果车票的价格高出了预期,人们自然会选择在其他较为便宜的时段回家或者不回家。也许很多人认为这样的观点没有人情味,但是想一想,有很多人愿意为三倍工资在春节期间加班难道不正是这样的需求具有弹性的最好证明吗?

那么我们难免要问,这么有效率的解决方案为什么没有在现实当中得到有效实施呢?我想部分原因是公共政策的目标和挑战与经济决策的目标和挑战不尽相同吧。比如,如果使用纯粹市场的方式解决这些问题,那么对价格更加敏感的人群,通常是支付能力较低的人群,会认为自己的利益受到了更大的损害而反对这项政策,这些人可能会宁愿与所有人一起拥堵,而不愿意看着支付更高价格的人获得优先服务,而公共政策的决策者不得不考虑这些人的意见。

总评

总的来说,本书适合作为经济学理论学习的补充读物。其中丰富而贴近现实的例子十分有助于理解经济学概念,澄清一般的思维误区,体会经济学家的观察,思考和解决问题的视角。但与此同时我们也需要意识到,作者薛兆丰是一位持有强烈市场观点的经济学家。他倡导使用市场的力量解决问题。记住这一点的意义在于我们要提醒自己,当我们使用书中的观点看待所有这些问题的时候,我们实际上是站在一位完全支持自由市场的经济学家的双眼之后的,而通常看待事物的观点不止一种。