程序员入伙书——赋值语句

赋值语句,就是把一个值搁到一个变量里的过程。

完成这个过程很简单,一个“=”足矣。打开Python,随意输入类似这样的语句:

>>> radius = 10
>>> pi = 3.1415926535897932
>>> circumference = radius * pi * 2
>>> circumference
62.83185307179586
>>> 

看看,几条赋值语句就把半径等于10的圆的周长求出来了,是不是很容易?这些语句当然可以简单地写成10 * 3.1415926535897932 * 2,这里演示的是思考的过程。

初学编程的人,容易在两件事上不习惯,我这里单列出来:

一、“=”不是“相等”的意思,而是“把等号右边的值算出来,放到等号左边的变量里去”。
二、赋值完成后,等号左边变量原有的值就被覆盖了,消失了,找不回来了。

这些要点,以前举例时说过或者暗示过,这次隆重重申一下。为了体会第一点,试试这段代码(以前的例子里挺常见的):

>>> total = 0
>>> total = total + 3
>>> total
3
>>> total = total + 4
>>> total
7
>>> 

像total = total + 4这种代码,现在在我眼里,是再正常不过的东东,但刚学编程的时代,是每次一瞧心里都咯噔一下的,因为把“等式”两边各减去total,即得到0 = 4。这怎么可能?!现在看顺眼了,因为我现在明白这句话就是三个步骤:把total的值读出来放到一个运算器里,在这个运算器里加4,把运算器的结果放回到total里去。
猛击阅读全文

随想的趣事

话说,北方孩子到江南去念书。出发前挺忐忑的,听说江浙那旮旯口味甜,怕自己不习惯。

到了地方打电话回家来:妈!我挺好的!这边口味一点都不甜!粽子、汤圆儿、豆腐脑儿,都是咸的!

绿野户外网2012年12月22日灵山事故

嗡玛呢贝美吽

绿野(lvye.cn或lvye.info,http://lvye.cn)又出事了。2012年12月22日,其“天行队”组织了“登顶灵山主峰一日往返”的活动(绿野户外网灵山事故活动发起帖在此),当日下午,副领队马云飞和一位队员未能归队,二人在次日中午12:26被救援队发现,12:54确认他们早已因低温遇难,发现遗体的地方是山上的树林,当地气温零下-20度,风力7级左右,山上积雪50厘米。两人的遗体相距十几米,一人上身裸露,背部有伤痕,新闻报道认为这说明他曾从高处跌落,但我认为这是失温致死的典型特征:反常脱衣和髂腰肌出血。

下山来的队员称,22日下午2点左右,天气实在很恶劣,队伍放弃登顶。副队长和另一位队员自觉体力还好,冒险登五指峰,把装给养和装备的背包留在山下。有未经证实的消息称:他们的背包被“好心的”同行者误认为是“遗失物品”,而被背下山去,因此他们在山上过夜时毫无给养。

对遇难者表示哀悼,愿他们往生净土,得到大悲怙主的慈悲接引。

以下是对这件事情的观察。

“背包被同行者背下山”的传说,如果被证实,就证明了我和朋友一贯的想法,走山的事儿,绝不能超过10个人同去。老话说:不怕对手,就怕队友。绿野(.cn)算是个老字号的棺材铺了,每每出事都是因为人太多,乌合之众一通胡来。我刚刚工作的时候,公司的安全教育里就说:看到断开的电闸,千万不要帮人合上。你这边一合上,高压线上就可能掉下来一个施工的人。

盈利型公司,出事的是这家
lvye.cn

非盈利组织,跟此事无关
lvye.org

绿野上的活动发起帖很火,我看的时候已经有120页,以为是求救并讨论事故的,仔细一看,光是哄抬人气就花了113页——后头的页面就全是骂战了。

从发起帖(有报名及确认信息)上看,这次活动的参加者有50人,每人预收“活动经费”60元,保险自理。注意:这是lvye.cnlvye.org的根本区别。这两个网虽然都叫“绿野”,但lvye.cn是付费报名,收取“活动经费”的。lvye.org的活动组织帖里则只有预算估计,没有付费报名,活动时才按照实际发生费用AA。随意点开两个网站里的活动即可证实这一差别。这个区别很重要,因为付费报名其实是变相的旅游团,所收费用算是导游费,这也是lvye.cn的业务模型:以AA制为名行商业旅游之实,一旦出事,则由“AA制”的名义化解,所谓“活动我收费,出事你AA”。

据绿野户外网的行动踪迹上来看,发起活动的领队“煊儿”是2012年4月才开始混户外、9月开始带队(!)的年轻女生,遇难的副领队马云飞也相当新(其冒险行为很符合)。

活动发起帖说:

此次活动没有多大强度,老驴热身!新驴拉练!由于包车,需要跟帖报名,谢谢大家支持!
因北京天气多变,另外山上有点凉快,可以多穿件衣服。

2012年12月20日的天气预报,含降温预警

2012年12月20日的天气预报,含降温预警

这段文字怎么看都是夏末秋初的轻松语气,估计是从老活动的发起文上顺手拷来。活动的发起日是12月8日,虽然寒潮尚未来袭,但傻子都应该明白,半个月后的数九寒天,山上不只是“有点凉快”。正式活动前一周,天气预报已经极其精准地预报了周末的寒潮降温——北京夏天的天气预报很不靠谱,但冬天没有太多变数,还是可以信的——在这种极寒大风天气,两个没经验的领队带50个人去爬山,自杀,谋杀,齐了。严厉谴责对此事失察的@天行户外

咦?说绿野呢,怎么忽然天行户外了?绿野(.cn)提供商业化的户外活动召集平台,天行户外是在这个平台上揽客的隐形旅行社。
猛击阅读全文

面试拒人连载

今天这位提前十几分钟就来了,坐着大厅的沙发上等钟点。我知道他来了,因为他的简历上有个人照片,而且,从我的座位开始,眼光往左随意一瞥,穿越几个同事,闪过屏风微妙的弧形,透出落地窗玻璃,再挤进几株绿色植物之间的缝隙,正好就能看到他坐的位置。我就这么看了他一会儿,他就那么闲坐着,一会儿仰头舒服地靠在沙发上,一会儿低头看手机。如果他知道三十米外有这么一双眼睛默默地看着他,一定会脊背发凉的。

57分的时候,他消失了。我座位上的电话也应声响起,人事打来的。我接了,问:“人来了?”那边说:“没有,说再过三分钟到。”哦……如果不是我认错了人,那就一定是忽然想起尿急,所以才有三分钟这么精准的估计……

以上是花絮,虽然不造成拒人的直接理由,却留下了计划不周的印象。

拒人的直接原因如下:

首先是英语差(蹦字型),其次是当被问到标准问题“如何理解我们公司,为何认为自己可以胜任”时,回答“不知道公司做什么,只知道很有名,自己想work better(不明白这句话的含义,但我已经了解他的英语水平,就没追问)”。

致命伤:请他介绍自己做过的项目,他先从“编码数据是这样分发的”开始,我满耳朵听到了“这样的架构可以更通用地处理编码数据”之类的虚词,只好坦诚告诉他,我没听懂,请他说说被处理的编码数据是从哪来的,干什么用的。他说,数据是一些参数。我问是什么参数?答是二进制或十六进制的。问是二进制或十六进制的什么?答是这样的信息。问是什么信息?答是数据包……

我不得不说,抱歉啊,我刚才听到的是:编码数据是参数,参数是数字,数字是信息,信息是数据包。可我还是不知道数据在物理上代表什么,它从哪里获得的。

最后反反复复问了很久,总算问出点眉目了。就是个卫星或飞船的地面监控站,接收到卫星/飞船上的种种传感器的测量数据,由于这些数据从卫星上发来时是通过同一个天线,所以收到之后需要甄别一下:这份数据是卫星姿态的,那份数据是电池容量的……这些甄别和后续的解码过程,过去是在一个大程序里完成,现在他把程序修理了一下,变得更加模块化了。

趁他转过身去在白板上画框图的时候,我和人事的小妹妹对望一眼,摇摇头。她凑过来悄悄地说:可以早结束。

于是就这样了。

程序员入伙书——运算符和表达式

上次我们说到了简单数据,现在就要说说怎么烹饪这些数据。因为我们的示例语言是Python,所以这里的内容只能保证对Python完全正确,其它的语言会有相似内容,但不一定完全相同。不用担心,各种编程语言的要素其实是差不多的,学会一门语言的思路,其它的也能很快融会贯通。

适用于数字的运算符

+       -       *       **      /       //      %
< <      >>      &       |       ^       ~
<>       < =      >=      ==      !=

其中,第一行运算符是一般的数学运算,第二行是计算机特色的位运算(不用担心看不懂,后头会讲到),第三行是数值比较。

先说第一行:+和-都很直观,加减是也。*是乘法,因为计算机键盘上没有×号,所以拿星号表示。你会问为什么不用x来代替?我回答:因为x是一个英文字母,会被Python当作一个变量名。

**是乘方的意思,例如2**3等于8,2**-1等于0.5,2**0.5等于1.4142135623730951(即根号2)。你可能会如梦方醒地说,既然可以这么方便地求解一个数的平方根,为啥当初要写那么复杂的一个算法?俺一边躲闪着观众的飞石,一边说:一、那段程序的主要目的,是演示二分查找的算法。二、其实在计算机的芯片级指令里也并没有乘方功能,**运算符的简洁外表的背后,隐藏着泰勒级数展开的算法,不比我那段程序轻松。

/是除法。小时候如果在试卷上这么写,是会被扣分的。老师只允许用÷号,或者以分数形式表示。键盘上没有÷号,就只能用/了。

//是除法取整数商。注意它和/是不同的:3/2的结果是1.5,而3//2会把那个小数部分.5扣除,只留下1。同理,1//2等于0,而不是0.5。拿这个运算符算整数是安全的,而算实数要小心,例如你可以试试0.7//0.1,和《两个世界》一章里的计算结果是一样一样的:6,具体原因在那一章已经讲过了。

%是除法求余数,例如7%4等于3,3%2等于1,8%4等于0。这个运算符很实用,常用来判断一个数字能否被另一个数整除(余数为0),或者把随机数字限定在一个范围内(不需要十分懂下面这个例子):

>>> import random
>>> random.random()
0.08662194959873759
>>> int(random.random() * 1E10) % 10
9
>>> int(random.random() * 1E10) % 10
5
>>> int(random.random() * 1E10) % 10
0
>>> int(random.random() * 1E10) % 10
4
>>> int(random.random() * 1E10) % 10
6
>>> int(random.random() * 1E10) % 10
2
>>> int(random.random() * 1E10) % 10
1
>>> int(random.random() * 1E10) % 10
8
>>> 

 

暂且跳过第二行的位运算,这些概念目前有点难,大部分情况下也用不着,先介绍第三行的比较运算吧。

<>       < =      >=      ==      !=

这六个运算符十分好理解,从左往右,分别是小于、大于、小于等于、大于等于、等于、不等于的意思。怎么样?很简单吧?计算机键盘上没有≤、≥、≠这些字符,所以用< =、>=、!=来代替,就和刚才说过的乘除法似的,比较好懂。对于==,就得多解释一下:为什么不用单个的=呢?因为单个的=被用来表示“赋值”的含义了。看下面和Python Shell的交流过程,来加深理解:
猛击阅读全文

程序员入伙书——简单数据

一边写一边问读者对这个系列教材的感觉。组里的小姑娘说,读下来,照着做,目前理解上没问题。不过她也说,她的室友是学新闻的,对编程不感兴趣,读这些文章时,反映“读不太懂”。她又说,直到现在还上开胃菜,进度有点慢,希望尽快吃到正餐。

好,正餐来了。

在《程序在干什么?》一章,我说过程序最基本的功能是计算——如果没有计算,我们也不需要计算机了。计算机的运算和人类的数学不同。人类的数学可以设置未知数,然后用推导方法把这个未知数的实际值逼出来。计算机的每一步运算,参与者都是已知的,只是有些参与运算的值永远不变,有些一会儿装三个苹果,一会儿装一百个大象。永远不变的被称为“常量”,可能改变的被称为“变量”。

以下我要说到的规则,仅保证对Python语言有效,其他语言虽然会很相似,但可能有自己的特色法则。

常量

有基本的两种常量:数字和字符串。快捷地描述它们的区别:数字是数学,字符串是语文。

数字很直接,0、-3.5、2012、378.2452,这些数学上看着顺眼的,都是Python语言里合法的数字。另外有些不太顺眼的数字,例如.3和5.,Python也宽宏大量地认为它们是合法的数字,.3意思就是0.3,而5.意思就是5.0。有些巨大的数字或者极小的数字,用科学计数法表达更为便捷的,如1.5×109或者3.0×10-32,Python不会让你辛辛苦苦埋头去数0,而是可以分别表示为1.5E9和3.0E-32,这里的E可以小写。指数前也可以加正负号。
猛击阅读全文

面试拒人连载

今天拒的这位说不出十分大的毛病,就是感觉思路零乱——不是凌乱,是零乱,破碎,不能完整地完成任何一个回合的交流。

虽然不是造成拒他的主要原因,他还是犯了一个很严重的错误。请他用英语介绍自己时,他说了这样一句:As a boy, I am interested in technical development. (作为一个男生,我对技术开发感兴趣。为了方便读者老爷阅读,以下我都用中文写。)我给钓钩装上鱼饵,问他:我留意到你说作为一个男生对技术开发感兴趣,那么你觉得女生有什么不一样?他回答:女生们还是对购物更感兴趣吧,最多买点高科技的东西。人力资源部的同事和我笑着说,那就是说,男生设计iPhone,女生消费iPhone。他看我们笑得欢畅,也点头笑。

公司严格禁止任何方面的歧视,这个回答可以说是十分犯忌的。这个不是拒他的主要原因——恐怕很多人心里都有不平等的念头,只是未敢在公司公开说而已。我们也可以通过培训,来阻止他入职后表达性别歧视的观点。说这个花絮,只是提醒刚从校园出来的小朋友,千万留个心眼,不要公然触碰平等原则。如果碰上十分严厉的面试官,原定一个半小时的面试恐怕只需十分钟就结束了。

“末日”尚未过完

google-earth

虽然是最不信末日谣言的,我还是从天文角度客观公平地提醒一下,早在北京时间昨晚8点,21日已经在世界的某些地方开始了,而直到明晚8点,21日才会从世界的所有地方消失。末日说还是有机会翻盘的。

舌尖上的中国

读书时发现,中文里的摩擦音太多了,尤其是用到舌尖的摩擦音:j、q、x、z、c、s、zh、ch、sh、r、y这些。随意拿几首诗作例子:

日照香生紫烟, 看瀑布挂前川
飞流直下三千尺, 疑是银河落天。

远上山石径斜,白云生处有人家
车坐爱枫林晚,霜叶花。

朝辞白帝彩云间一日还。
两岸猿声啼不轻舟已过万重山

84个字里有53个舌尖摩擦音,难怪说中文时总感觉发音位置在上颚,不容易共鸣——我都没好意思举李清照那首“凄凄惨惨戚戚”——中国人一上岁数,声音就容易干涩嘶哑,中医解释说,这是人老肾衰的表现。说英语或意大利语的人,不管多老,多是声音圆润,鼻腔共鸣声如珠玉。英语虽然听起来嘶啊嘶的,但那些音不跟元音,不是完整的音节,发音不像中文这么费劲。

同事神评论说:这就是所谓“舌尖上的中国”吧。

我觉得这个推理还是靠谱的,再举个例子:我见过的法国人,年纪轻轻嗓子就都倒了,一开电话会议,电话那头全是绵羊音。这就是滥用小舌音的恶果。

给一座知名墓葬博物馆的官微的建议

我关注一座知名墓葬博物馆,有一段时间了。去年暮春,这座博物馆的一位资深人士和我在微博上认识,从此常常呼朋唤友,组团泡馆,收获知识也收获友谊,甚是欢乐。忽然一天看到这座博物馆的官微,以为老友开发了另一种渠道的发言平台,果断关注。看了几天,觉得这官微的风格迥异,沉闷枯燥,用词费解。私下一问,果然不是老友主持的。出于对博物馆的喜爱和感谢之情,也出于一份私人友谊,我对这座博物馆的官微有以下建议。

一、开放思路,多找话头。很多话题,对于博物馆或者考古人士们是理所当然的,而对于我这样的外行却非如此,因为不是理所当然,所以就有趣。我随意想起的话题有:广阳倾王的家庭背景如何?他爹是谁?和当时的皇帝是什么关系?怎么死的?为什么起了那么个差劲的谥号?他爹的下场这么不堪,为什么墓主本人的葬制这么风光?这个墓是怎么被偶然发现的?谁主持的探方和发掘?怎么知道墓被盗过了?怎么确认的墓主人身份?墓主人的身份还有哪些争议的声音?那些柏木条为什么叫作黄肠?题是什么意思?凑是什么意思?天子之制用在诸侯王身上,为什么不算僭越?还有谁用过这种高级葬制?这种葬制从什么时候开始的?为什么后来不时兴了?
二、多发馆藏文物的图片,引发思考和讨论。随意列举几个:那个漆榻的用途是什么?确定么?棺是怎么推进椁里的?马是生祭还是屠宰后祭的?车马坑的两架车有什么不同?为什么不同?柏木为什么不腐烂?白膏泥是怎么个用法?木炭是怎么个用法?车马坑的发掘有什么难点?玉舞人是专给死人佩戴的还是活人也能用?玉觹是怎么用的?袖棁的工艺到底有多复杂?那些鸟骨怎样反映当时的生态环境?那个木枕头在首博也有一件复制品,它龙头上的角到底是朝里还是朝外?
三、介绍馆里的特色项目。小朋友们常去学挖土探方,游戏规则是什么样的?有哪些工具可以用?投壶的规则是怎样?那个铜壶是参考哪些文物制作的?有古代的礼仪实习,古人跪在那么一个木板上就不觉得硌得慌?汉代的贵族衣冠是什么样?为什么不是穿明黄而是穿黑?哪天可以去玩?怎么联系活动?
四、多聊天扯闲白,例如说说你家院子里的那只大狗的逸事啊,说说发大水对你家的影响啊,说说最近为什么在修缮啊,说说路面和地铁交通啊,说说为什么乘摆渡车还要再刷一次公交卡啊,说说夏天蚊子多啊,说说为什么在墓葬值班守夜不觉得害怕啊,说说春节期间守着一堆木头是多么担心啊。

一时就只想起来这么些话题,还是觉得比转发朱总司令生平展和翻拍的汉代养生知识有趣一些。希望老友看到这篇文章不要介意。