读《废都》

这是第二次读这本小说了,算是重温。

第一次读是在高中。那时去姨家玩,进了一个房间后,发现墙角有一个书框,密密麻麻地摆着好几排的书,想是堂哥平时慢慢积攒起来的。那时我并不喜欢阅读,就随便翻着看。翻到这本书时,看着书里的情节,面红耳赤,不能自已。

那时我十七八岁,正是情窦初开的年纪。

借这本书时,刚好堂哥不在,胆战心惊,怕被姨识破。我把书借回了家,仔细研读并温习着书中描写的场景。特别是读到“□□□”时(此处并非敏感词,原书中确为“□□□”),心中充满无限的想象。那份荷尔蒙急剧上升带来的怦然心动,一颗鲜红滚烫的心仿佛要脱离这个僵硬的躯壳。

所以想象力很重要。

就像冯唐讲他们在网络资源匮乏时,一个视频一传十十传百的刻录,最后模糊不清,也依然平静不下观看时的激动。最后乃至看到阳光下树影斑驳,下面都会不自觉地硬起来。

十年前,山东,盛夏的某个夜晚,我躲在被窝里,战战兢兢地抱着一本泛黄的纸书,虔诚得像一个圣徒,有作为生命最原始地憧憬与渴望。我读得兴奋,从外面远远地望过来,千家万户独一盏灯火通明,肯定更美。

一晃十年过去了,“十年生死两茫茫”。十年有可能是我生命的八分之一,五分之一,甚至是三分之一。

一席春梦了无痕。十年后,午后饭饱,阳光正好。人懒洋洋地坐在办公室的座椅上,旁若无人地拿着kindle,总觉得少了点什么。手里的这个版本,已经没有了当初的“□□□”,也不再有当时斟字酌句的心境。

不知再过他个十年二十年后,看到远处的灯火通明,是否还能一眼看出,那个曾经亲爱的自己。为之感动,为之神伤。

上课走神

我记得之前的每一次考试,心里都会非常紧张,惟恐整个考试被自己搞砸。甚至多次被这样的梦境吓醒,梦中自己竟睁不开眼看试题。

我慢慢地在这样的紧张中,缩小自己心理的活动范围。

如今又做了这样一个梦,说不上是算昨天还是今天,这篇文章是一篇跨夜文章。

梦里还是高中时候的同桌。

老师说:“你们先随便看看书吧。”像是地理书。

说完以后,我就开始自顾自地玩了。

过了一会,老师说,现在开始考查刚才让你们背诵的内容。

what???

what

逗我,啥时候让我们背诵了,不是说就随便看看吗?

更夸张的是,竟然是所有人挨个过去,他提问题我们回答。搞得更像是面试。

我的天,这是什么情况,我再一次慌了。

我前边的几个人挨个过去,都答的不错。

到我过去背诵,他先问我:“你觉得你背诵得怎么样?”

我说:“背得不是很好,尤其是后面。”

他一下子就怒了,怒了,说:“那还学什么了,我要把你开除”。

开除?我清晰地觉得这是在跟我说工作的事。

看到他在纸上写下开除两个字,我一下子就释然了。一个感觉是,你没权利开除我;第二个感觉是,开除我也不怕,又不是什么大不了的事。

醒来后,我觉得自己很开心。多年的恐惧已经解除了。

也或许,我真的有了一定能力,可以理直气壮的说,我不怕失去。

我觉得我真正要害怕的是生命的失去。失去生命,意味着将不再有努力的机会。

而考试,或者老师布置的任务,并没有可以让我们害怕的因素。

可接受的生活环境

租住在现在的这个地方已经有3个年头了,却几乎没怎么主动打扫一下。

并非因为不是自己的房子感觉没必要,也不是因为平时工作忙没时间。就一个字,“懒”。

今天破天荒的打扫了一下厨房的卫生,大到物品的摆放,小到边边脚脚。用毛刷刷墙角也是很快乐的,不得不说,人类的这项发明非常之伟大。

说起打扫的原因,却是出奇的简单:我住的这个房子,厨房靠窗。春天来了,想打开窗子透透气,但一打开,外面的人就能看到里面的情景。想到这个,我立马就有点心虚。窗子还是要开的,怎么办呢?打扫一下卫生呗。

可不可以开窗,取决于一个条件,我管它叫做“可接受的生活环境”。即,我能不能接受把我的生活环境暴露给别人看。

说到可接受,有两种很极端的情况:

  1. 虽然我房子脏,但是给别人看一下也无妨,毕竟我是活给自己的嘛。
  2. 这么脏的房子,怎么能给别人看到,除非打扫一下。

我觉这两种情况都合情合理,所谓“知行合一”,只要自己跟“自己”想法一致,就不会在心里产生矛盾。

我选择了2,而且给了自己一个很好的理由:嗯,虽然你小子看起来挺懒的,但是并没有懒的无可救药,你还是想努力改变自己的。

“可接受的生活环境”其实是与懒惰抗争的一个好方法,有时候我们就是需要这种本无大意义的想法来刺激一下。当然,意义多大看个人。

“可接受的xxx”可以用在很多方面,比如,我们平日在家希望自己是一个什么形象呢?我们有可能希望接受的是,别人看到的我们的私生活是积极的,我们热爱生活,我们利用自己的时间学习烹饪、读书、运动、听音乐。

但是,私生活本来就是不活在别人的眼里呀,不然该活得多累。所以实际的情况可能是,我们热爱不正经的生活,我们看黄色小说、打飞机、睡懒觉、臭鞋臭袜子衣服满屋。

如果不用打开自己的生活给别人看,又觉得脏点乱点自己也可以逍遥快活,管它呢!

唠唠python(5) -- 打包操作

这篇文章依然是承接自上一篇文章,来讲一讲上一章遗留下来的问题。

上一章我们讲到int(raw_input('Tell me the quantity: '))是让计算机帮我们从用户那里获取一个数字,现在我们来看看它是如何做的。

洗衣机的智慧

对,我们先来谈一谈洗衣机。

我现在住的这个地方有点小,担心买了洗衣机更显局促,所以一直没买。但这不妨碍我们谈洗衣机的智慧。

如果现在还没有出现洗衣机这么个东西,设想我们渴望有一个机器,它可以帮我们(1)自动加水,(2)清洗衣物,(3)自动甩干,(4)自动烘干。

这么一大批动作,当然每个动作分别需要一个机器也是可以的,但是每一个动作人为介入,势必会降低我们的效率。怎么办呢?

哈哈,其实办法我们已经知道了,但还是要假装吃惊一下。啊?居然还有机器可以集成上面说到的全部功能,而且只需要在执行第一步前按一个按钮,接下来的四步自动依次完成,帮我们屏蔽了之前的细节。

这样的例子有很多,人类的智慧大大促进了人们生活水平的提高。

洗衣机智慧在计算机语言中的妙用

刚刚我们谈了洗衣机的智慧,我们再进一步来谈一下,对我们来说,它到底意味着什么。

我们知道,光洗衣服这件小事,就涉及了非常多个工序。什么倒洗衣粉、搓洗衣服、拧干、晾晒,等了个等。像我们这种追求(zhi)生活(nan)品质(ai)的人,怎么能忍受得了这么变态的工序。

福音来了,现在你眼前的这个工具,只需要把衣物放进去,按下开关。二小时后,将衣物取出放进衣柜就可以万事大吉了。

为什么这么神奇,因为洗衣机帮我们把洗衣服的细节给屏蔽掉了。它把必须由我们来做的事(打开开关)暴露给我们(看得见的开关按钮),我们只需要打开开关,二小时后,它就会把结果(衣服洗完)给我们。

计算机语言也存在着类似的思想。

我们再拿之前提到的表格处理的例子,我们希望把表格中每个数字,按照某种规则处理完后写到其下面的表格,然后将处理后的表格保存到一个新文件。

假设我们有一台表格洗衣机,来达到上面的效果。我们假设这台表格洗衣机是洗衣机厂家生产的。我们不管厂家怎么制作出来的,也不管它怎么个洗法,我们的想法是,只要给这台表格洗衣机一个实际的数据表格(相当于洗衣机的开关)就可以了。它会把处理完后的表格给我们。

表格洗衣机仍然有点抽象,但是实际上,我们在前面已经看过两个例子了。一个是raw_input(),一个是int()

raw_input()int()

现在,我们可以来讲讲之前遇到的int(raw_input('Tell me the quantity: '))了。

这一坨长长的东西,可以等价到下面两句:

1
2
quantity_str = raw_input('Tell me the quantity: ')
quantity = int(quantity_str)

我们对洗衣机说:“帮我洗一件衣服”。然后塞给它一件衣服,打开开关,它就轰隆隆地开动了。

当计算机读到quantity_str = raw_input('Tell me the quantity: ')时,它跟用户说:“Tell me the quantity: ”,并将用户输入的文字写到quantity_str

quantity_str又是啥?我们可以把它想象成一个箱子,我们把计算机读到的用户输入的文字放到这个箱子里。

注意,这条语句是从右往左读的:“计算机显示Tell me the quantity,并把用户输入的文字放到quantity_str这个箱子里”。

现在我们知道了,raw_input()就是要计算机帮我们获得一段文字。具体怎么获得,我们不管,你(计算机)自己去想。

int()也是一样的东西,它的功能是将某段文字(如"1234")转换成一个整数。int(quantity_str)即,将我们quantity_str箱子里的文字转换成一个整数,并放到一个名为quantity的箱子。

为了更直观地感觉一下,我们来自己做一台”洗衣机”。

更好的规则计算过程

之前的例子,我们写了一段代码来实现通过规则计算结果:print (int(raw_input("Tell me the quantity: ")) + (10000 - 1)) / 10000 * 10000

这一行代码有几个问题:

  1. 首先,这一句非常长,而且里面有n个(),就算我们自己,也要用手一个括弧一个括弧地匹配。
  2. 其次,里面可能有多个中间结果,但我们没法查看中间结果的值。
  3. 再次,这段代码的自述性不好。也就是说,它不能表达自己在做什么。

我们根据这三点,再利用前面提到的技术,来重新组织一下我们的语言:

1
2
3
4
5
quantity_str = raw_input("Tell me the quantity: ")
quantity = int(quantity_str)
real_quantity = (quantity + (10000 - 1)) / 10000 * 10000

print real_quantity

看上去代码量更多了,真的值得吗?

审视一下我们上面提到的三个问题,新的代码每行不再有大量的括弧,我们可以在第二行后插入print quantity来查看quantity的内容,而且我们很清晰地看到了我们要计算机做的每一步。作为一个简单的脚本,新的代码并没有什么吸引力。但当我们考虑到我们要把它做成一个完整的系统,至少在最后的系统面前,它是值得的。

考虑当我们的规则非常复杂时,我们就会有一个更好的选择,即上面所谈的洗衣机的智慧:

1
2
3
4
5
6
7
8
def compute_real_quantity(quantity):
return (quantity + (10000 - 1)) / 10000 * 10000

quantity_str = raw_input("Tell me the quantity: ")
quantity = int(quantity_str)
real_quantity = compute_real_quantity(quantity)

print real_quantity

哇噻,更长了,哈哈。

我们在这里,定义了一个类似raw_input()的功能,叫做compute_real_quantity()。定义方式就像看到的一样简单。我们再来定义一个加法功能说明,如下:

1
2
3
4
5
def 功能名称(需要输入哪些变量):
return 结果

def add(m, n):
return m + n

这里有一个好处,如果compute_real_quantity()是别人写的,我们就不需要知道规则的细节了。假如这个规则是你来写,我只需要把我的待采购的数量给你,你帮我计算一下实际需要的数量就好了。具体细节,我不关心。

屏蔽细节让生活更轻松

我们之前说游戏手柄的输入也非常简单,原因就在于这方面的专家已经帮我们屏蔽了细节。获取手柄的输入,跟获取raw_input()的输入大同小异。

类似的,从一个表格文件中获取输入跟raw_input()差别不大。我们会使用这一篇文章中讲到的技术及之后的少量新技术,来从表格文件中读取表格数据,处理完后,使用类似print的功能,将处理结果输出到新文件(而不是神秘的黑色窗口)。

明天你是否会想起?

不止明天,我哪一天都不想起。睡觉。

唠唠python(4) -- 简化工作

胜兵先胜而后求战,败兵先战而后求胜。 – 孙子兵法

遇到问题

我的女朋友最近生病了,周三下了班就回了家,顺带着还把在公司的一部分工作带了回来。

等我回到家,她已经卧在床上睡一觉了。

过了一会她睡醒了,坐起来跟我说:“工作没做完,你帮我做一下吧。很简单,就是把这张表格里的数字,以10000为单位,上或下取整,填到它下面的格子里。”说罢,就又睡了过去。

怎么计算

我粗略地看了一眼,这是一个excel表格文件,就是下面的这张表格。

待处理表格

简单查看了一下excel的基础知识。这一个一个的格子,叫作“单元格”,哈哈,形象吧。暂时我们只需要这个概念。

这里面有黑色内容的单元格和红色内容的单元格。红色内容的单元格是计算上面的黑色单元格的内容(物料的待收数据)得到的结果。

我们的目标是,输入这个文件,然后让计算机自己经过一系列的计算过程,将表格中的还未计算过的数据按给定的规则计算,将计算结果写到下面一个单元格,并帮我们把处理后表格保存下来。

这个目标实在激动人心!我跟我女朋友确认过,以这次的数据量,如果人工来做,可能需要花费3-4个小时的时间。而对计算机来说,在一分钟内就可以完成,而且可以确保结果的准确性。需要的知识也浅显易懂,如果对相关知识熟练,完全可以在半小时内将我们想要做的事情清楚地告诉计算机。

当然,学习是循序渐进的。在这篇文章中,我们先把目标降低一些:告诉计算机一个待收数量,和一条规则(以10000为单位上取整),让它帮我们计算实际的代收数量。这是我们完成整个目标的第一步,这个技巧也完全可以用在其它类似的工作上。

获取输入

首先,我们需要告诉计算机待收数量。这当然很简单,我们在前面已经说过了。假设待收数量是1234:

1
2
3
>>> 1234
1234
>>>

但是,这样会显得很仓促:1234代表什么呢?我们现在当然知道,它就是我们要求值的数据。但当我们写入到一个文件时,如何把1234传进去呢?

显然,我们可以直接写到文件,比如:

1
print 1234

而此时,如果再重新输入一个数字时,我们就需要打开文件,然后把1234改为新的数字,保存文件,然后运行。修改代码文件很繁琐,而且是很危险的,这还只是一行简单的代码,想想,如果一个代码文件有上百行,我们如何再找到这个数值的位置?会不会小手一抖,把其它行的数据也修改了而自己并没有意识到?繁琐的操作也必然会降低我们的效率。

这时,我们就自然有这么一个需求。

计算机:您好,我最亲爱的某某某,您的待收数量是多少,我来为您计算实际待收数量。

亲爱的某某某:嗯,1234。

计算机:您实际需要待收的数量是10000。

嗯,这就是人们所说的交互,其实就是让人跟计算机的沟通像人与人的沟通一样顺畅。

这时,我们需要知道这么一个东西:

1
2
3
4
>>> int(raw_input("请输入您的待收数量:"))
请输入您的待收数量:1234
1234
>>>

注意,里面的第一个1234是我们自己输入的,后面还跟了一个回车。

int(raw_input("请输入您的待收数量:")),这么大一坨?没关系,先死记下,在之后的文章我们会进一步了解。我们只需要知道,它让计算机询问我们待收数量。

如何计算取整后的值

我们现在用的python是个死脑筋。为什么这么说呢?如果你使用的python是之前文章中链接的python或是系统默认安装的,试试下面这个:

1
2
3
>>> 5 / 2
2
>>>

我们在学校学到的可是5 ÷ 2 = 2.5,现在却得到个2。谁的问题?

语言的问题。语言是有局限的,而当我们输入5 / 2时,python解释给计算机说:“请帮我们计算一下5 ÷ 2的值,取整就可以了,小数点我们就不要了。

语言是在发展的,文章中用的python版本是python2,此时,默认情况下,整数除法的结果是整数,而且是下取整。

现在回到我们的问题:给一个数字,以10000为单位,上取整或下取整。我们假设是上取整,想想应该怎么做呢?

我们把单位缩小,先来看一下以3为单位上取整,我们来取一批数值观察一下。

我们来分别观察一下 待收数量实收数量 的值和它们之间的相互关系格式:

  • 待收数量:1,实收数量:3,待收数量 ÷ 3后下取整:0
  • 待收数量:2,实收数量:3,待收数量 ÷ 3后下取整:0
  • 待收数量:3,实收数量:3,待收数量 ÷ 3后下取整:1
  • 待收数量:4,实收数量:6,待收数量 ÷ 3后下取整:1
  • 待收数量:5,实收数量:6,待收数量 ÷ 3后下取整:1
  • 待收数量:6,实收数量:6,待收数量 ÷ 3后下取整:2
  • 待收数量:7,实收数量:9,待收数量 ÷ 3后下取整:2
  • 待收数量:8,实收数量:9,待收数量 ÷ 3后下取整:2
  • 待收数量:9,实收数量:9,待收数量 ÷ 3后下取整:3

我们发现,待收数量 ÷ 3后下取整 的值会随着 实收数量 增长,但并不完全一致,而是相差 2。如果在 ÷ 3 前先将 待收数量 +2,则结果刚好变成了3倍的关系。如下:

  • 待收数量:1,实收数量:3,(待收数量 + 2) ÷ 3后下取整:1
  • 待收数量:2,实收数量:3,(待收数量 + 2) ÷ 3后下取整:1
  • 待收数量:3,实收数量:3,(待收数量 + 2) ÷ 3后下取整:1
  • 待收数量:4,实收数量:6,(待收数量 + 2) ÷ 3后下取整:2
  • 待收数量:5,实收数量:6,(待收数量 + 2) ÷ 3后下取整:2
  • 待收数量:6,实收数量:6,(待收数量 + 2) ÷ 3后下取整:2
  • 待收数量:7,实收数量:9,(待收数量 + 2) ÷ 3后下取整:3
  • 待收数量:8,实收数量:9,(待收数量 + 2) ÷ 3后下取整:3
  • 待收数量:9,实收数量:9,(待收数量 + 2) ÷ 3后下取整:3

也就是说,实收数量 刚好是 (待收数量 + 2) ÷ 3后下取整的3倍,其中的 2 实际上就是由 3 - 1 得来的。我们用数学公式整理一下现在的这个想法:

1
2
3
实收数量
= (待收数量 + 2) / 3 * 3
= (待收数量 + (3 - 1)) / 3 * 3

注意,其中的 / 符号即我们python语言里的除法,它是下取整的。

类比到10000时的情形,我们的公式会变成下面这个样子:

1
实收数量 = (待收数量 + (10000 - 1)) / 3 * 3

实际上,如果我们可以让计算机整数相除时上取整(而不是下取整),公式就会变得异常简单:n 上取整除以 10000 * 10000,在我们学习了后面的更多知识后就可以做到。现在这个公式(n + (10000 - 1)) / 10000 * 10000虽繁琐,但已是我们通过自己仅有的一点计算机知识所能学到的了。

马儿跑起来

下面,我们将之前的分析总结到一个文本文件里:

1
print 10000 * (n + (10000 - 1)) / 10000

将n替换为提示用户输入待收数量:

1
print (int(raw_input("Tell me the quantity: ")) + (10000 - 1)) / 10000 * 10000

将以上内容保存到a.py,然后输入python a.py并回车,试试看:

1
2
3
$ python a.py
Tell me the quantity: 1234
10000

嗯,不错,可以。

一点遗憾

这是我们迈出的很重要的一点,如果你跟下来并且看懂了,这说明我们已经掌握了把自己的思想描述给计算机的技巧。

但这还不完美,离我们的目标自动处理数据并保存结果还是有一定距离的。多远的距离呢,嗯,可能是4-5篇文章吧。不算远,对吧,假定一篇文章40分钟,加起来也就是3-4个小时的样子。想想我们前面提到的,这些数据手工处理都要3-4个小时,太他妈赚了。

当然,3-4个小时是不够的,我们还需要一些时间消化和遗忘。不过,不管怎么算,这都是人生中很成功的一笔交易。

这篇文章中,还有很多有趣的东西被我一带而过了,留到下一篇我们再一起聊聊吧。

已经晚上23了,洗洗睡了。明天又是崭新的一天,啊哈哈。

我的世界(1) - 第一个夜晚

记得那是我来到这个世界的第一天。

我站在呼啸的风中有点瑟瑟,低头时才发现,自己的身体就这样裸露地暴露在空气中。

新奇伴随着陌生,举目四望,空无一人。目所能及之处,低矮的橡树,崎岖不平的草地,隐约能看到几个水塘。我抬起头,看到很远的地方有一个亮白色的圆点。

后来过了很久,我从书上看到,我其他的同类们叫它“日”。“日”,听起来动感十足,看上去也像是在跳动一般。

我四处游荡,想快些了解这个陌生的世界。

我来到水边,看到了朦朦胧胧的倒映的自己:一头杂乱的棕色长发,多毛的灰色脸面。

一切都是新的。一上午走下来,肚子开始咕噜噜地叫,步子也慢慢地沉重下来,眼前的景物越来越不真实。

就在这时,我发现不远处有一只白色的动物在走动,内心有点欣喜,又有点恐惧。

我必须向前,饥饿战胜了一切。

当我慢慢靠近它时,它并没有跑。这给了我很大的信心,我感觉眼角有点湿润。

为了防止它攻击本就虚弱的我,我决定忍着饥饿,在它身边观察上一小会。它长得跟我有点不一样,长着一身绒绒的白色的毛,有着像我一样的灰色的脸,也有像我一样的四肢,但是四肢都是立在地上的。偶尔会“咩咩”地叫几声。

它缓缓的走动,“咩咩”的叫声,让我觉得它不太可能会攻击我。此刻我必须觉得它不会攻击我。

我抄起身边的一根木棒,快步走向前去,将木棒重重地拍在了白色动物的脑袋上。它“咩”地一声大叫,疯狂地朝远处跑去。我也疯狂地追奔过去,又重重地加了一棒。这次它没有再发出“咩咩”的叫声,“噗通”一声倒在了地上。

一棒子,拖走

我开始不顾一切地胡吃乱啃一番,以夺回被饥饿渐渐控制的身体。而此刻我所有的行动,都是出于最原始的本能。

吃过肉以后,身体渐渐地恢复了一些。

许久之后,我知道这是一种叫做“绵羊”的动物。正如其名,这真是一种温柔的动物。

这时,四周开始渐渐地暗了下来。“日”也已变成了暗红色。一阵末名的恐惧开始朝我袭来。

我猜想,黑夜将会彻底摧毁我的视力,这眼前的一切都将会变成未知,我将会陷入永无止境的黑暗。

恐惧一下子包围了我,而且我对这种处境无能为力。无力感在慢慢侵入我的身体,此刻,我必须要找到暂时躲避这种未知恐惧的地方。

我四下环顾一周,发现了一个山洞。我来到这个山洞前,向里望去,没有发现其它生物。我必须在视力完全丧失前将洞口堵住,以确保没有未知的生物闯进来。

我匆忙地捡起些石头,趁着还有一点点光亮,快速地将洞口堵住,只留下一个小口,让我可以知道外面的情况,以免记不得山洞的出口,最后可能把自己也遗忘在山洞里。

我蜷缩在狭小的山洞里,突然听到有什么东西碰到草地的“簌簌”声,过了一会,看到一个绿色的怪物,吓得我喘气都缓慢了下来。幸运的是,它没有看到山洞中的我。当看着它越走越远时,我被自己感动了。

如果夜晚来临时,有哪怕一丝光,像太阳那样,可以照亮我的四周,该有多好?!

山洞里一片漆黑,只能听到我自己的心跳。抬起头时,从留下的小口处向上望去,我惊喜地发现了头顶上方,遥远的地方闪着一些明亮的小东西。后来我惊喜地知道,那叫做“星空”。

如果我离它们足够近,是不是就可以感受到光亮。

我决定,如果能活下来,一定要想办法去到那个明亮的小东西那里。它们给了我生的希望。

明亮的小东西成群结队地缓慢移动,在暗蓝色的背景下,承载了我无限的想像。一切也在不知不觉间发生了微妙地变化,时间缓慢移动,暗蓝的背景在慢慢地变得明亮,最后仿佛像我刚来时的样子。

我鼓起勇气,打算到外面看看情况。我缓慢地挪开堆在洞口的几块石头,朝外面望去。四下都是我刚来到这里的情景。远处一片绯红,“日”出现了,并且缓缓升起。

世界再一次在我的眼中模糊了。

唠唠python(3) -- 保存计算过程

昨天的文章,我们学会了跟计算机进行简单的语言交流和用计算机来做简单的算术。我们发现,计算机用来做简单的算术还是很方便的。但不知你是否注意到了,每次当我们退出翻译器时,我们之前的数据就消失了。

消失比错误更可怕,它代表着我们已不能确定对错,而且就算错了,错误的根源也无从找起。

多可怕!

奇怪的翻译器

在上一篇文章里,我们通过实验,得知,在python翻译器里输入"hello",翻译器给我们回复了一个'hello'。有的朋友可能已经注意到了,输出的hello两边有一对'

1
2
3
>>> "hello"
'hello'
>>>

不对呀,我们输入的是",结果里带的却是'?!

先别慌,我们说在python里,一句许两边要带",实际上,'"在python里面功能是一样的。没错,"hello"'hello'并没有什么本质的区别。

那现在问题来了:

  1. 为什么python的输出里要带一对'呢?
  2. 我就是不想看到这个',怎么办?

跟计算机打招呼做算术题是一码事

没错,在python翻译器看来,在对待这两者时,处理方式是一样的。

想想我们在做1+1时,翻译器做了什么?它把我们输入的文字翻译给计算机,并将结果显示给我们。

那当我们输入"hello"时,翻译器又做了什么?它把我们输入的文字翻译给计算机,并将结果显示给我们。

看到了吗,这两个答案其实是一致的。不同之处在于值本身,一个值是一句话,而另一个值是一个数字。

试想,如果把"hello"换成"1",而翻译器显示了一个1,我们就不知道这是一句话还是一个数字了。所以,结果,跟我们的猜想一致。

1
2
3
>>> "1"
'1'
>>>

现在问题1的答案已经很清晰了,为什么python的输出里要带一对'呢?这代表求值的结果是一句话,而非一个数字或者其它什么。

主动地表达我们的意图

对,是时候表达我们的想法了。

之前,我们是把python翻译器当作一个计算器,对一句话的计算也好,对一个算术表达式的计算也罢。

对一句话求值,所得的结果是一句话。为了表明它是一句话,结果的两边加了一对'

现在,我们要对计算机提出更高的要求。我们不需要计算机帮我们对一句话求值,我们想直接把一句话显示到屏幕上。这也就是问题2的答案,显示意味着我们不再需要知道这是一句话或一个数字,而是想知道这个值表达的是什么。"1"1你都给我显示1就好了,我知道是什么意思。

1
2
3
>>> print "hello"
hello
>>>

我们告诉翻译器,帮我们显示一句话"hello",计算机显示给我们一个没有"hello

需要注意的是,这里的print "hello"仍然会求值并将值显示出来。但因为这里的值是空的,所以我们只看到了hello

hello是求值过程中产生的输出,而求值没有结果

保存我们的计算过程

前面说,我们有时需要查错,所以需要保存计算过程

保存计算过程还有一个更重要的意义,因为我们的目标,是让计算机帮我们更高效的工作,如果不能重复的使用我们之前使用过的计算过程,意味着工作不仅没有高效起来,反而更加低效了。

所以保存我们的计算过程,就显得十分之必要。

从前面我们输入过的代码来看(对,我们已经是在写代码了),代码的表现形式非常简单,都是文字,或者说文本。也就是说,只要我们把以上的代码记录到文本文件里面就完成了保存计算过程的目标。

保存计算过程就是这么简单。

不过这里还有几点需要补充说明一下:

  1. 对文件名的要求:文件名要以.py结尾,以表明文件里存放着用python语言写成的”小诗”或”文章”。如果你不知道什么名字好听,a.py或者b.py都是不错的选择。
  2. 执行时要注意,执行的结果,更遵循主动地表达我们的意图,而不是直接求值并显示值。这里可能不太好理解,在python翻译器里求值时,翻译器会直接显示求值结果,但是,当直接执行保存在文件里的代码时,求值结果不会再直接显示,而是需要我们使用前面提到的print来告诉计算机显示。

重复使用计算过程

我们先来实践一下保存我们的计算过程

还记得上一篇文章中提到的那个神密的黑色窗口吗。打开黑色窗口后,输入notepad a.py(windows)或nano a.py(其它系统)并回车,这会创建一个新的名为a.py的文件。打开文件后输入以下内容并保存。这样,我们的计算过程就被保存到了a.py这个文件。

1
print "hello"

接下来,我们就可以使用这个计算过程了。

在黑色窗口内输入python a.py并回车,即可看到类似我们之前的输出了。

1
2
C:\> python a.py
hello

这个命令跟之前请出翻译时使用的命令,唯一区别在于这里多了一个文件名。

只是显示一个"hello",未免显得单调乏味。但是实际上,这代表着我们已经可以完成一个简单系统hello的从开发到运行的整个过程了。

当然,这还远远不够。我们需要这个系统能接收用户的输入(有可能是按钮点击、文字输入或者游戏手柄按键输入等),并可以通过复杂的计算过程,最后得到我们想要的结果(有可能是一个处理过的excel文件,或者一张图片,一封邮件等)。

当然,丰富多样的输入,复杂计算,不同载体的输出,也都是十分简单的。想想我们输出hello的过程吧,与此大同小异,只是对一些新鲜事物更熟悉的过程。

下一篇,我们就来利用已经学过的知识,与计算机这个古板的老朋友一起合作,来抽象一部分我们繁琐的工作。

唠唠python(2) -- 初识ABC

一周又过去了,时间过的真快。冰心奶奶说昙花只在夜里开,而且花期极短,开放时能听到“簌簌”的声音。时间有没有声音呢?

重新认识计算机语言

python的作者叫“吉多”(听起来像名贵犬种)。

我们之前说“吉多创造了python语言,并教会了计算机使用这门语言”,其实这样说法不太准确。

事实上,计算机只认得一种叫做不可描述的语言,而且我们人类是无法搞懂的。所谓的教会计算机使用一门语言,其实是我们请了一个翻译,将我们能认识的语言翻译成计算机能懂的不可描述语言。

请个翻译

“请翻译”,就是我们在计算机中装一个翻译软件,跟有道词典这种翻译工具类似。区别是,有道词典翻译给我们自己,python翻译器翻译给计算机。

请个python翻译很简单,如果你是windows(瘟到死)系统,戳此链接,就可以从官方下载到一个安装包,双击就可以安装了。

如果不是windows系统,恭喜你,你的系统已经默认安装python了。

跟计算机打个招呼

记得自己在幼儿园时,看到其他小朋友玩得不亦乐乎,非常想跟他们一起玩耍,却因生性羞怯,扭捏着不好意思向前。很多时候,我拒怕新东西,拒绝探索这个世界。但真当我们迈出了第一步,世界在我们心中的印象就更加清晰了。

打招呼,虽然是交往的一小步,却是我们人生的一大步。

计算机刚诞生的时候,它是个庞然大物。跟这个怪物打招呼,可不是件容易的事。

但世界在发展,现今已有各种各样的计算机语言,沟通变得前所未有的简单。

就我们使用的python语言来说,与计算机沟通只需要简单两步就可以了。

  1. 安装一个翻译器。如果你是windows系统,下载链接已在上面给出,如果你已经下载并安装,恭喜你第一步已经完成了;非windows用户可以直接跳过这一步。

  2. 唤醒这个翻译器。这一步也非常简单。对于windows系统,点击开始 -> 运行,输入cmd并键入回车,这时系统会打开一个神秘的黑色窗口;如果是其它系统的用户,找到一个叫做终端的软件打开,也是一个黑色窗口。然后,在黑色窗口里,输入python并键入回车,如果出现下面的文字,表明已经成功唤醒我们的python翻译器了。

1
2
3
4
Python 2.7.13 (default, Dec 17 2016, 23:03:43)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

这一坨东西我们不用理会,只要确保不是Bad command or file name或者是带有error字眼的语句,就表明我们已启动成功了。

失败了怎么办?可以搜索一下或者给我发邮件,我会对你负责的!

现在输入一个"hello"看会发生什么。

1
2
3
>>> "hello"
'hello'
>>>

我们输入了一个"hello",它又回给了我们一个'hello'

这样无聊的结果也真是令人感动,完全没有一波三折的快感,跟琐碎的生活一样枯燥。

无聊的背后有什么有意思的东西

太他妈没劲了。

非也。

我们刚才跟计算机打了个招呼,神奇的是,他听懂了,并回应了我们。而无聊的是,我们给他什么,他就回给我们什么。

我们看到了>>>这个符号,它的意思是,“跟我说点什么吧,我在听着呢”。多忠诚!

我们输入的hello两边有一对"号,这表明我们在说一句话,而不是要计算机帮我们做个算数题。

那现在我们可以让他帮我们做算数题吗?当然可以!

学习简单算术

刚才我们给计算机一句话,他又把这句话回复给了我们。有点无聊。

下面我们来做点更有意义的事,让计算机帮我们做个算数题。

我女朋友帮我举了个例子:我们需要一种元器件956包,每包10000个,每个0.0016元,那么总共需要多少钱呢?

好便宜啊!嗯,我觉得是个好例子,python已经开始辅助我们工作了。

在我的印象里,10以内的加减乘除运算是最开始接触的算术题,部分甚至可以借用手脚辅助完成。说到乘除法,小九九还算简单,更像是语言,靠记忆。但是100以内的乘除法,对我来说已经有相当的难度了。

我记忆还算不错,对于加减乘除,当初还有一句口决,叫做先乘除后加减,如果先加减怎么办呢,用括弧()

我们可算是非常幸运的,在甚至还不明白为什么要学这种鸟玩意的很多年前,就已经掌握了算数的基本原则。python里面的简单算术,甚至都不需要我们再学一遍了。

现在,我们只需要告诉python翻译器元器件总价格的计算公式,python就可以翻译给计算机做运算了。我们来试一下:

1
2
3
>>> 956 * 10000 * 0.0016
15296.0
>>>

哇噻,我们的计算机计算非常迅速,一下子就帮我们算出了答案。果真是人如其名,这是一只战斗鸡。

记得以前,我参加珠心算那会儿,试题里有很大一部分,是多个多位数字求和,做得多了很容易出现一种自我怀疑:好像有一位记错了?不过对计算机来说,只要我们输入的正确,可以完全相信它的计算结果。我们负责精确地表达,它负责精确地执行。

上面虽然只有乘法,但+ - x ÷聪明的我们已无师自通了(其实多年前,我们就已经掌握了)。需要注意的是,计算机语言多用*来代表x,而用/来代表÷

举个例子,(0.31 + 0.43) * ((0.26 + 0.45 - 0.31) / 0.47),看明白了这个公式计算的是什么,我就不用再叨叨了。

唠唠python(1) -- 开学典礼

为谁而写

有一天,我女朋友跟我说,你帮我处理一个电子表格吧。

最开始,我做了一个vba(一种计算机语言)脚本,觉得不行。因为使用起来太过繁琐,这可能会让她崩溃,也可能会让我在回答各种问题的过程中崩溃。

之后又写了一个python(另一门我们将要详细讨论的计算机语言)脚本,还是不行。要使用这个脚本,需要学会安装python这个软件,然后安装一大堆额外的东西。这也太他妈不方便了。我是不会把这么一个鸟东西给出去的。

后来我想到了最佳的解决方案:让她学习一点计算机语言。“一点”以足以应对这种简单繁琐的操作。但是我找到的资料都不是很理想,很少有面向非计算机专业的。

这些文章就是为这类人群准备的,我们(请允许我角色带入)没有系统地学习过计算机方面的知识,而又在日常生活工作中经常用到计算机,我们试图通过与计算机更有效地沟通,来提高自己的工作效率。但是报个班又太不值,毕竟班里大部分同学当初是奔着程序员梦进去的。

简而言之,这一系列文章是为非计算机专业而又意识到计算机的重要性,想要快速与计算机建立高效沟通以提高工作效率的人准备的。

与其它同类文章有什么不一样

在网上已有非常非常多的《python从入门到出家》类的文章或教程。

他们有的打着“简单”、“易学”的愰子,随便翻一下,里面充斥着“条件语句”、“函数”、“异常”等看上去屌炸天的词汇,全然不顾我们的感受。

他们并没有站到我们的角度来思考问题。现阶段,我们并不想知道“异常”是个什么东西,而只想尽快让计算机帮我们计算出这批元器件缺少的数量,然后去补货。

这些词汇和程序员式的思考方式,严重阻碍了我们的学习过程,损耗我们的注意力。很可能有那么一天,在我们尝到与计算机高效交互的甜头前,终于忍受不了各种纠缠在一起的专业名词,而选择了结束这个恼人的过程。然后留下一种感觉,“程序员都他妈是神经病”。

当然,这篇文章只是提供另一种学习python的体验,而上面所说的这种情况也只是一种假设。如果你愿意听一个人每天唠叨几句(有可能只是十分、二十分钟),自己同时又能有所收获,以至最后竟然能流畅地与计算机沟通,那你就可以继续往下看了。

这里没有乱七八糟的词汇,我希望自己能以一个中年大妈唠家常的姿态给大家讲述一下与隔避老王沟通的技巧。所以你也不用有什么负担。

我是中年大妈,不要有压力

为什么是python语言

计算机语言,说白了,就是我们与计算机沟通的工具。比如,我们跟邻居沟通用汉语,而跟美国人沟通用英语。我们与计算机沟通,用的是计算机和我们都可以听得懂的语言。

计算机就像一个语言天才,它精通多种语言。不幸的是,没有一种是我们人类的语言。也就是说,要想与计算机流畅地沟通,除了学习它使用的语言,我们别无他法。

计算机语言有很多种,比如A语言、B语言、C语言等。甚至我们可以创造一门我们自己的语言来教会计算机,然后用这门语言与它沟通。正如我们的祖先创造了汉语,并让它普及于世一样。

既然计算机能使用这么多语言,我们想要与它沟通,自然最好是选择一门学习起来相对容易的语言。python语言就具有这样的特质,它真正的简单易学,而且学习曲线可以非常平缓。也就是说,我们完全可以一边享受它给我们带来的切实好处,一边进一步的学习以更好地与计算机沟通。

我能得到什么

想像一下,如果你学会了一门外语,就可以流畅地与老外沟通交流,还可以更方便地在国外打到车。节省了你的时间和精力,你可以多喝几杯茶了。

这些文章里没有语法结构、俚语俗语,当然并不是说它们不重要,你可能以后会感兴趣。这里更多的是教你在异国他乡(计算机的世界),更好的打到车,更快地找到饭店,或者是雇佣一个保姆帮你打扫卫生。

你可以用你的想象力去工作,把自己从繁琐的工作中解放出来吧。 – 这是我承诺给你的,学不会不收费。

简单了解python语言

终于讲到我们的python语言了,这篇文章只是开个头,我们只要有一点印象就可以了。

就像前面提到的:“我们可以创造一门我们自己的语言来教会计算机,然后用这门语言与它沟通。”python语言就是这样诞生的,作者创造了它,并教会了计算机使用这门语言。

关于python的介绍其实就这么多,下一篇文章我们就可以用这门语言跟计算机进行简单的沟通了。是的,计算机语言就是这么容易使用。

“安静”的三mămă

我的三mămă

有一次回老家过年,听到门外狗叫。我探出头去,第一次看到三mămă。面无表情,行走缓慢。

那时刚好年尾,仿佛有做不完的活。炸年货,打扫卫生,blahblah一大堆。

她还没走到屋来,我娘说,她是你三mămă。平时不怎么说话,顶多挤出一个“嗯”字。我们要炸东西,你跟她聊一会。

进屋后,她一言不发。我当时找了一句话(忘记说的啥了),她果然回答了我,用了一个小心翼翼的“嗯”字。

我猜想可能是三mămă大脑的某一处没有发育完善。

我的内心是崩溃的,当时想跟她说一句,“你有毛病啊”。但是碍于她辈份在那,我自然不能将我的这股子劲表现给她。

我的同事

有一次,我看到一个同事。我就跟个傻逼似的直勾勾盯着他看,一言不发。可能是看得他发毛了,就对我点了个头,“嗯”。

而就在那一刻,我产生了一种似曾相识的感觉。

我突然醒悟,其实我恰好也是这样的一个“有毛病”的人。为了展现友好(而并非发自内心),就冲着同事傻呵呵的笑,却更显局促。

而这次我有了一个明显的优势,我不再像上次那样隔了辈份,而终于可以理直气壮的指着自己的鼻子说:“你有毛病啊!”

她就是放大了的我

是的,三mămă让我看到了自己的某一面,而她恰是我那一面的极致。

有时候我们混在人群里,可能都忘记了自己是怎么一回事。而恰好有些纯粹的人(也可能是先天原因),让我们重新认识到了那部分不易觉察的自己。

遇见三mămă让我感觉很幸运,却为我们的个性日渐模糊而感到悲凉。

一方面,我看到了做到极致的好处,不管极致的好或是极致的坏,当被用来做参考时,都是不用费太多脑力的。

另一方面,我们身体或者心灵的某处,可能会因各种原因而被深埋。感受它,接受它的好与坏,就变得很重要。

我决定,要认真的与自己相处。你有多好,你有多坏,你都是我的一部分,我始终爱你。所以,不要因害怕而隐藏自己。