2020-04
23

记忆中的万松园市场

By xrspook @ 11:49:41 归类于: 烂日记

在我记忆之中,我从来没有把一本编程类的书完整看完过,以前我都是挑着来看。自己需要用哪些功能,就去找哪些章节去看,而这次学习python,我是下了狠心的。几乎可以这么说,一天到晚我的脑子里就只有那些东西,即便是睡着了也一样。做梦的时候,我依然是想着python。还记得在学习递归的时候,某天晚上我做梦梦见了一个瀑布,但实际上瀑布并不是真的瀑布,那不过是一个正在流着很多水的建筑物外墙。那个瀑布从一个分成两个,再分成多个。不同的水量有不同的效果。我第一个感觉是那应该是一个自然形成的瀑布吧。但当水全部停住的以后我才发现,原来一切都是人造的。瀑布是在一个玻璃屋的外墙上形成的。之所以有这个脑洞,大概是因为我的记忆深处借鉴了东站广场的那个瀑布。还记得初中的时候我们几个同学还专门过去那里看人造瀑布。后来我不记得那里变成怎样了。反正那应该是东方宝泰外面的吧。再到后来,去东站附近通常都只是为了去宜家家私,然后下到东方宝泰里面的吉之岛,其它的东西一点印象都没有了。至于从前的那个瀑布还有没有,我实在想不起来。自从宜家家私再也不在东站的那个卖场以后,感觉我好久都没有去过那个地方了。光是东方宝泰一家,对我和我妈都没有什么吸引力。

城市的变迁,总免不了会发生东西不断消亡,但当从前熟悉的东西消失,会让人觉得无比怀念、依依不舍,但即便这样,它们还是会消失,除了在从前的照片和影像资料里再次重温,无论如何我们都回不到那个时候了。

有时我会很怀念从前到万松园市场。万松园市场在我的脑子里印象非常深刻,那些卖鱼的、卖菜的,还有卖杂货的,我都记忆犹新。我甚至还记得了当年不同品种货物的布局。虽然有些小店在我印象之中已经很模糊了,但是我还非常记得,卖鱼的在哪里,卖烧腊的在哪里。那个卖烧腊对出的通道上,某年过节,有人在那里卖老鼠肉。虽然我根本不记得卖的老鼠肉是什么样的,我甚至没有见过一眼,但是从叫卖声让我知道,有人在路中央卖老鼠肉。万松园市场对我来说是一个神奇的地方,虽然跟沙园市场比起来,那个地方不大。那条叫做万松路的路永远都是熙熙攘攘,我甚至记不起汽车是怎么在那条路上行驶的,因为上面总是挤满人。不是每个市场都会让一整条马路不复存在。那里对我来说就是最早的步行街。从前的万松园市场,或者不是这样的,或许我只记住了它热闹的一面。很久以前,这个市场进行了改造,全部都档口都入室经营。我一直觉得,新的万松园市场我很陌生。不只是我,我的家人也很少再去那里买菜了。之所以这样,其中一个很重要的原因是他们把蔬菜和水果档口放到了二楼,对老人来说,这非常不方便,因为没有电梯。我甚至一点都记不起2楼到底是怎么布局的。过去十几二十年我加起来,估计上去5次都不到。

在南丰商场下车,穿过人挤人的万松园市场,再过一条马路,山货铺的上面就是外婆的家了。

2020-04
17

我想知道

By xrspook @ 10:19:42 归类于: 烂日记

验证出某些数学定理是一件非常酷的事,但我为什么要那么干呢?所以当Think Python的习题要我做那种事的时候,我会莫名其妙地产生一些弱弱的抗拒心理。有时,留存在我脑海的数学知识根本不足以让我理解那些符号到底要我做什么。我不知道为什么写这本书的人觉得读者都明白那些数学符号是要干些什么的,他们面向的到底是什么知识层面的读者呢?那些符号在中国的教育系统里,大概高中中等水平以上的学生会懂。作为一个大学生,理论上我应该全懂那些东西到底是什么意思。倒不是要你真的算出来,但你起码得知道他们要你做些什么。时间是把杀猪刀,中国的应试教育使得大家在离开学校多年以后,如果期间又长期不用,通常都不会记得那些东西,大概只会隐约记得曾经学过。还记得小学的时候,我的某个同学很抗拒学数学,他觉得生活中最简单的加减乘除就能解决几乎所有问题,当然这个所有问题只是他眼中、他当时所遇到的那些。

为什么要学数学?我不知道。有些时候我觉得数学真的很有趣。大概是因为我觉得其中的某些规律会让我惊叹不已。那些规律不是人类创造出来的,是大自然母亲孕育出来的,我们只是逐步知道了那些东西的存在,逐步开始利用那些规律做某些事。之所以某些时候我会有点害怕数学,是因为我是个吊儿郎当的人,即便我懂得某些规律,但是在不断重复的过程中,做着做着我就出错了。小学时计算之所以出错,倒不是因为我乘法表背得不好,而是因为我的字写得太丑,为了图快,字写着写着连我自己都不认得到底是什么。计算机不会因为正常重复而犯错误,如果真的崩了,必定是制定的规则有问题。还记得小学时候影响我最深的那个数学老师,非常看重数学的思维,而不是数学重复计算本身。我的运气非常好,小学、初中、高中,我都分别遇到了一个影响我一生的数学老师。在我印象之中,其他老师从来没有这么深刻地影响过我,虽然他们其中的某些对我来说很重要,我也非常喜欢。也有一些老师是我很不喜欢的,但不喜欢归不喜欢,我不会因为那个就故意搞砸自己那一门课的成绩,反而,我要拿出更优秀的成绩向他们示威。当然,有些时候,我不够强大,所以想示威也无能为力。我的学习不是为了跟老师较劲。

学生时代,为什么要学习?为什么要把题目解答正确?其实当时我完全没有考虑过这些问题,我也没有时间考虑除了用一种方法,还能不能用其它方法得出同样的答案。这里的发散应该包括除了那个参考答案以外,某道题是否还会存在其它情况,还会出现其它答案吗?很多时候,我们的时间就只够解答那道题,根本没有闲情考虑那道题如果改变了某些参数,会不会出现一些比较颠覆的结果。做作业时的我们,又或者考试时的我们,干掉这道题以后就直奔下一道。如果每次都胡思乱想,作业无论如何都做不完,考试就更别想可以在规定时间之内完成答题。

后来我才发现,如果人要真的有所得,要认真地学习研究,除了理解某个知识以外,还必须有一定的自主思考的空间与时间。我们不应该一直被别人牵着鼻子去发散,而应该学会主动地脑洞大开。很多时候,别人会用某个分数衡量我们,或许是通过考试,或许是通过讨论,但那个真的就代表我们吗?能定义我们的只有我们自己。

我们之所以要探寻,我们之所以要纠结,是因为我们想知道、想做得更好。

2020-04
10

强大到让我瑟瑟发抖的递归

By xrspook @ 8:41:56 归类于: 烂日记

大学学习C语言的时候,基本上我不会写单独的函数,所有要解决的事都在主函数里搞定了。当时我学过判断和循环,但是,我却从来没学过递归。在解决一些简单事情的时候,循环跟递归,没什么差别。从理解程度来说,我觉得循环更简洁一些,但是,当某个东西像套娃那样一层叠一层,每层里面依然用同样的规则继续套叠,不知道要叠多少层的时候。递归就会展现它无穷的魔力。循环难以实现这个,又或者循环并非实现不了,但是递归在完全不需要体现循环的框架下,简洁的语言就已经在做着循环的事情。

昨天,我第一次在Python里见到这个恐怖的递归。外国人的书,我觉得都有一个特点。正文的时候举的例子都很简单,但是一到习题,就会把你彻底搞死。习题里面会偷偷带入一些超纲的东西。大概写书的人理所当然默认你应该知晓。这种事情我已经在学习Java的时候领略过。当时那本书之所以没法看下去,就是因为我没办法想象出作者的脑洞到底是什么。他们的习题几乎可以说大多是一些填空题,但要实现一个功能,其实未必一定就得用某种方法。你给我一个条件,给我一些目标值,我能做出来也就OK了,为啥必须走你的路呢,这非常难。之前我不觉得自己跟外国人的脑洞到底差多远,但是当我对比过自己和他们写的程序以后,我发现真的差挺远的。虽然我们都能实现某个功能,就效率而言,感觉上没差多少,因为我只是在做一些非常初级的东西。应试教育的时候,有标准答案,当然好判定成绩,但实际上,编程这种东西真心应该天马行空。给我一个效率的限制,比如说完成某件事,必须在多长时间之内解决,代码长度不能多于多少,至于我用什么办法,这是我的事。

说回递归函数这件事,在处理几个简单数字的时候,可能你感觉不到它的强大,但是,当我见识过用那个东西画出来的层级图形以后,我简直就只有站在旁边瑟瑟发抖的份儿。真的不知道是哪个神经质想出来这么强大的东西。但实际上,深究下去,那也不是很强大,那不过是不断地重复一些已经设计好的事情而已。如果要人去做那些重复,一开始还好,但是随着事情的深入,会慢慢乱套,但是计算机不会,他们会一根筋地执行我们的指令。最终出来的结果是令人惊叹的优雅,还是乱七八糟一坨屎:就得看设定规律的人的功力了。

递归现在对我来说是一个非常恐怖的东西。因为我不了解它,所以我害怕它,就像当年认识循环一样。但是,用好递归以后,我的武器库里就会增加一个杀伤性非常大的家伙。说到递归,让我联想起新冠病毒。这个东西的递归到底什么时候才是个头?我觉得这肯定不是一个死循环,自然界非常擅长递归,处处都是数学和逻辑你知道吗?!但是,到底要递归多少次,全人类才最终能看到隧道尽头的曙光呢?到底这个新冠病毒函数的递归里埋伏了多少个随机数呢?学习递归让我明白到,层级少好对付,层级一旦扩增,那就是次数级的增长,而且,说不准到达一定层级的以后就会触发某些大招炸弹,想想都心寒。

编程是一个让我重新理解自然规律的过程。

2020-04
8

为什么会被小海龟折磨

By xrspook @ 8:44:09 归类于: 烂日记

先画一个正方形,然后画一个正多边形,接着画一个圆形,最后画一个圆弧。从思路上说,再简单不过了,但实际上实施起来的时候,我还是花费了一点心思,但这些东西跟之后的用圆弧画出三个花朵比起来,我算是轻而易举就完成了的任务。后来的花朵之所以耗费了好几个小时才终于搞定,倒不是因为问题本身有多难,而是因为其实我没想通那些数学上的问题。我要画一朵花,花是由花瓣组成的。我画的那朵花是规则结构。那么画完一个花瓣到下一个花瓣的时候,角度我应该如何确定呢?这个问题很简单,但实际上我却在这里兜了无数个圈。我在那里瞎猜,所以很浪费时间。有无数次,我想直接去看答案了,但是我还是控制住了自己。当我终于画出一朵花,并在里面测试无论花瓣是胖是瘦,是多是少,我都能画出来以后,接下来我考虑的是如何一次性在一个面板上画出三朵花。画出一朵跟一次性画出三朵,其实已经非常接近了,但要怎么实现,还是费了一点心,因为某些函数的应用书上根本没说。我去网上稍微搜了一下,发现直接搬过来,而且是在没有看到例子的时候就搬过来行不通。最终我用了COPY大法,一次性画出了三朵花,虽然花的大小跟要求的有点差别。当我看过答案以后,我觉得这种差别是完全可以理解的。胖瘦跟大小是由他们设定的参数决定的,那些参数我们不可能知道。我只能模拟出个大概比例,要我完全模拟出一模一样是不可能的。

小海龟这个东西是一个画图的玩意,但是那又不像艺术家手里的画笔那样随心所欲。那是编程出来的,编程出来的东西还是有大神可以画出个小猪佩奇,但这些做法正如某些大神能用Excel的单元格画出他们想画的任意东西一样。

玩过成年人常规的编程以后再去搞这个小海龟,我觉得最难的地方在于数据的运用。你该怎么处理那些数据?难就难在那些公式设计上面。我不知道为什么Think Python 2这一章要这么整人,但也正是因为他们把我整得很惨,所以我在函数调用上面的确有了一些思路,而那种感觉是从前老师又或者我自学的课程里从来没接触过的。这些才是最核心的东西!为了让我懂得这个,他们祭出了从来都让我很崩溃的小海龟。

现在回想起来,为什么小学的时候小海龟会那么容易让我崩溃,估计情况跟现在差不多。在解决问题的时候我没有把那个箭头当作是一条数学题,一定程度上我把它当作是一个游戏了,所以当我不可以一口说出答案的时候,我首先开始做的是瞎掰,折腾好长时间以后我才终于静下心来,用脑子去考虑,这到底是怎么回事。所以可能某些东西的实现并不难,但是因为我耗在瞎掰上面的时间太多了,简直把我搞得慌张了,所以我会对那个东西瑟瑟发抖。把大问题解剖下来变成小问题,再逐个击破,我应该能很快的发现我的问题所在。

战胜人生中曾经不敢去面对的,非常有意思。

2020-04
7

阴魂不散的小海龟

By xrspook @ 21:56:27 归类于: 扮IT

LOGO语言小海龟,你为啥阴魂不散啊啊啊啊啊啊啊啊啊啊!!!!!对从前小学3年级的我来说是个噩梦,现在依然是个噩梦!Think Python 2的第四章正是用这个turtle讲故事,想死的心都有了。没有一定英语基础,没有足够强悍的数学基础,怎么可能玩得转小海龟,而且还要空间思维能力。小时候我对这个东西瑟瑟发抖实在太正常了…… 25年后再遇到,我继续纠结得死去活来……

第四章最后的习题1要求画一个堆栈图,不知道他们到底要画些什么,要画到什么程度,mindmanager了一个,画完以后的确对函数的嵌套有点开窍。

习题2要画3朵花,画得我死去活来…… 但总算完全不看答案能画出来,看完答案,得到那些偷偷摸摸设定的参数后能画得跟要求一模一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import turtle, math
def arc(t, r, angle):
    n = 20 # int(2*math.pi*r/4)+3 公式画图太细致太慢,直接赋值加速
    step_length = int(2*math.pi*r)*angle/360/n
    step_angle = angle/n
    t.lt(step_angle/2) # 据说折腾一下角度能消除像素误差?
    polygon(t, step_length, n, step_angle)
    t.rt(step_angle/2)
def polygon(t, length, n, angle):
    for i in range(n):
        t.fd(length)
        t.lt(angle)
def flower(t, p, r, a): # t for turtle, p for petal, r for radius, a for angle
    for i in range(p):
        for i in range(2): # 重复两次画花瓣,两次转向后和初始方向一致,非常重要!!!!!
            arc(t, r, a)
            t.lt(180-a)
        t.lt(360/p)
def move(t, length): # 一个画板画3朵花必须用暗中位移
    t.pu()
    t.fd(length)
    t.pd()
bob = turtle.Turtle()
move(bob, -100)
flower(bob, 7, 60, 60) # 偷偷设定半径和角度,万恶的例子,叫人怎么猜!于是我也直接搬!
move(bob, 100)
flower(bob, 10, 40, 80)
move(bob, 100)
flower(bob, 20, 140, 20)
turtle.mainloop()
© 2004 - 2026 我的天 | Theme by xrspook | Power by WordPress