测试一下用Email发博客
- 2012年12月27日
hello, world
hello, blog via email
人闲桂花落
夜静春山空
月出惊山鸟
时鸣春涧中
在《初涉算法》一章,我说过程序没什么神秘的,无非是做三件事:
关于基本的计算,前头几章已经讲过了。现在开始说说流程控制(Flow Control)。
流程控制是程序的核心价值。如果一段程序从头到尾平铺直叙,一条大路走到黑,就不好意思说自己是程序了,顶多是在打算盘。试想,如果没有流程控制,“从1累加到100”的任务就只能这样完成,老没劲了:
total = 0 total += 1 total += 2 total += 3 : : total += 99 total += 100
一个有趣的程序,一定有种种的岔路和转圈。读者可能会问:你不是说计算机不会思考,所有的行为都是已知的么?岔路的变数从何而来?俺回答:道路是已知的,走路的人是未知的。种种变数,来自于人类或其它机器的输入。例如你正在看这个页面,计算机不知道你下一步是往上翻屏、往下翻,还是关掉窗口。你的下一步动作是机器无法预知的,但计算机做好了应对你的任何操作的准备——只要你不掐电源。
下面我就开始介绍“岔路”了:如果这样,如果那样。
举个例子,Python有个功能叫max,如果你在Python Shell里写max(1, 3)按回车,max一定会回答“3”。我们看看,如果自己来写这个功能,程序是什么样的。尝试一下这个例子——在Python Shell下按Ctrl-N打开一个窗口,输入这段代码:
猛击阅读全文
赋值语句,就是把一个值搁到一个变量里的过程。
完成这个过程很简单,一个“=”足矣。打开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里去。
猛击阅读全文
话说,北方孩子到江南去念书。出发前挺忐忑的,听说江浙那旮旯口味甜,怕自己不习惯。
到了地方打电话回家来:妈!我挺好的!这边口味一点都不甜!粽子、汤圆儿、豆腐脑儿,都是咸的!
绿野(lvye.cn或lvye.info,http://lvye.cn)又出事了。2012年12月22日,其“天行队”组织了“登顶灵山主峰一日往返”的活动(绿野户外网灵山事故的活动发起帖在此),当日下午,副领队马云飞和一位队员未能归队,二人在次日中午12:26被救援队发现,12:54确认他们早已因低温遇难,发现遗体的地方是山上的树林,当地气温零下-20度,风力7级左右,山上积雪50厘米。两人的遗体相距十几米,一人上身裸露,背部有伤痕,新闻报道认为这说明他曾从高处跌落,但我认为这是失温致死的典型特征:反常脱衣和髂腰肌出血。
下山来的队员称,22日下午2点左右,天气实在很恶劣,队伍放弃登顶。副队长和另一位队员自觉体力还好,冒险登五指峰,把装给养和装备的背包留在山下。有未经证实的消息称:他们的背包被“好心的”同行者误认为是“遗失物品”,而被背下山去,因此他们在山上过夜时毫无给养。
对遇难者表示哀悼,愿他们往生净土,得到大悲怙主的慈悲接引。
以下是对这件事情的观察。
“背包被同行者背下山”的传说,如果被证实,就证明了我和朋友一贯的想法,走山的事儿,绝不能超过10个人同去。老话说:不怕对手,就怕队友。绿野(.cn)算是个老字号的棺材铺了,每每出事都是因为人太多,乌合之众一通胡来。我刚刚工作的时候,公司的安全教育里就说:看到断开的电闸,千万不要帮人合上。你这边一合上,高压线上就可能掉下来一个施工的人。
绿野上的活动发起帖很火,我看的时候已经有120页,以为是求救并讨论事故的,仔细一看,光是哄抬人气就花了113页——后头的页面就全是骂战了。
从发起帖(有报名及确认信息)上看,这次活动的参加者有50人,每人预收“活动经费”60元,保险自理。注意:这是lvye.cn和lvye.org的根本区别。这两个网虽然都叫“绿野”,但lvye.cn是付费报名,收取“活动经费”的。lvye.org的活动组织帖里则只有预算估计,没有付费报名,活动时才按照实际发生费用AA。随意点开两个网站里的活动即可证实这一差别。这个区别很重要,因为付费报名其实是变相的旅游团,所收费用算是导游费,这也是lvye.cn的业务模型:以AA制为名行商业旅游之实,一旦出事,则由“AA制”的名义化解,所谓“活动我收费,出事你AA”。
据绿野户外网的行动踪迹上来看,发起活动的领队“煊儿”是2012年4月才开始混户外、9月开始带队(!)的年轻女生,遇难的副领队马云飞也相当新(其冒险行为很符合)。
活动发起帖说:
此次活动没有多大强度,老驴热身!新驴拉练!由于包车,需要跟帖报名,谢谢大家支持!
因北京天气多变,另外山上有点凉快,可以多穿件衣服。
这段文字怎么看都是夏末秋初的轻松语气,估计是从老活动的发起文上顺手拷来。活动的发起日是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。他看我们笑得欢畅,也点头笑。
公司严格禁止任何方面的歧视,这个回答可以说是十分犯忌的。这个不是拒他的主要原因——恐怕很多人心里都有不平等的念头,只是未敢在公司公开说而已。我们也可以通过培训,来阻止他入职后表达性别歧视的观点。说这个花絮,只是提醒刚从校园出来的小朋友,千万留个心眼,不要公然触碰平等原则。如果碰上十分严厉的面试官,原定一个半小时的面试恐怕只需十分钟就结束了。
虽然是最不信末日谣言的,我还是从天文角度客观公平地提醒一下,早在北京时间昨晚8点,21日已经在世界的某些地方开始了,而直到明晚8点,21日才会从世界的所有地方消失。末日说还是有机会翻盘的。