思绪

第 106 道 | 2026 年 5 月 15 日

2026-05-15日课

还是昼夜颠倒,有些愿望落空,有些期望难以兑现,惟愿能有所改进,但不必拘于他者的目光。

学习 Agent 的需要,还是需要补一补 python 的知识。今天下午继续学习,完成了条件语句,到循环语句部分。也正是在练习的过程中,发现自己还有许多没弄清楚的地方——学习的本质是否真的是大量练习,重复才通往「学会」?还是这只是对于部分人而言罢了,有天赋的人可以更快一些。

我不清楚,但我确实需要花多一些时间,做多一些习题,通过大量训练达到学习效果。


Summary
这一部分是在 if 条件练习中遇到的问题总结出的注意点,分为两方面——其一,条件语句内的层级关系;其二,变量与其值的表示方式。

我对 if 条件语句还是不够熟悉了解。

if 条件1:
    # 代码块A
elif 条件2:
    # 代码块B
elif 条件3:
    # 代码块C
else:
    # 代码块D

运行的原理如下:

  • 检查 条件1,如果真 → 执行A → 停止,不检查其他
  • 如果 条件1 为假 → 检查 条件2,如果真 → 执行B → 停止
  • 如果 条件2 也为假 → 检查 条件3,如果真 → 执行C → 停止
  • 如果以上都为假 → 执行D

当运行到某个 elif 时,说明前面的 ifelif 条件都为假,此后不需要再重复检查前面的这些条件。最好的例子如下:

x = 15

if x < 10:           # ① 假(15不小于10)
    print("A")
elif x < 20:         # ② 执行到这里时,已知 x >= 10,因为条件一为假
    print("B")       # 输出:B
elif x < 30:         # ③ 不执行
    print("C")

总结一下:

位置 已知信息
if 条件 无假设
elif 条件2 知道 条件1 == False
elif 条件3 知道 条件1 == False 且 条件2 == False
else 知道所有前面的条件都是 False

这里可以拉出 ifelif 来对比一下。

if a > 0

if b > 0
if a > 0

elif b > 0

在第一种情况中,两个 if 都会运行,不管第一个是否真假,第二个都会独立运行,无法根据到达第二个 if 来判断第一个 if 语句的状态。当两个 if 的语句都为真时,会导致第二个条件覆盖第一个的结果。

但第二种情况是,if 为真后执行即停止,而如果运行到了 elif,则说明 if 为假。

问题溯源 #

遇到这个问题是源于在下面这道习题中的练习:

Please write a program which asks the user for three letters. The program should then print out whichever of the three letters would be in the middle if the letters were in alphabetical order.

You may assume the letters will be either all uppercase, or all lowercase.

我原来的写法:

fir = input("1st letter:")
sec = input("2nd letter:")
thi = input("3rd letter:")

if fir < sec and sec < thi:
    print(f"The letter in the middle is {sec}")
elif thi < sec and sec < fir:
    print(f"The letter in the middle is {sec}")
elif thi < fir and fir < sec:
    print(f"The letter in the middle is {fir}")
elif sec < fir and fir <  thi:
    print(f"The letter in the middle is {fir}")
elif fir < thi and thi < sec:
    print(f"The letter in the middle is {thi}")  
elif sec < thi and thi < fir:
    print(f"The letter in the middle is {thi}")

改进的写法:

le1 = input("1st letter:")
le2 = input("2nd letter:")
le3 = input("3rd letter:")

if le1 > le2 and le1 > le3: # 此条件中 le1 最大
    if le3 > le2: # 此条件中 le3 最大
        middle = le3 # 因此 le2 在中间
    else: # 在 le1 最大的情况下,le2 比 le3 大
        middle = le2
elif le2 > le3: # 到这里,已确定 le1 不是最大,反而是 le2 最大,只需要讨论 le1 和 le3 
    if le3 > le1:
        middle = le3
    else:
        middle = le1
else: # 到这里,确定 le1 和 le2 都不是最大的,那就只能是 le3
    if le2 > le1:
        middle = le2
    else:
        middle = le1

print(f"The letter in the middle is {middle}")

注意,在改进的写法中,我犯过很严重的低级错误,即将middle = le 写成 le = middle,这是对 python 中变量本身的了解还不够。

middle = le 是指 middle 获得 le 的值,换句话,是左边获得右边的值,左边是一个存储着值的变量。

另外,上面的写法中也只有一个 print,更简洁一些。以后尽量将 print 写在最后,通过变量来存储结果。

你认为你真的理解 elif 了吗?当你以为自己真的理解时,再做一次题却马上露馅了。

我的答案:

value = int(input("Value of gift:"))
if 5000 <= value and value < 25000:
    tax = (100 + (value - 5000) * 0.08)
    print(f"Amount of tax: {tax} euros")
elif 25000 <= value and value <55000:
    tax = (1700 + (value - 25000) * 0.1)
    print(f"Amount of tax: {tax} euros")
elif 55000 <= value and value < 200000:
    tax = (4700 + (value - 55000) * 0.12)
    print(f"Amount of tax: {tax} euros")
elif 200000 <= value and value < 1000000:
    tax = (22100 + (value - 200000) * 0.15)
    print(f"Amount of tax: {tax} euros")
elif value >= 1000000:
    tax = (142100 + (value - 1000000) * 0.17)
    print(f"Amount of tax: {tax} euros")
else:
    print("No tax!")

正确答案:

value = int(input("Value of gift:"))

if value < 5000:
    tax = 0 
elif value < 25000:
    tax = (100 + (value - 5000) * 0.08)
elif value <55000:
    tax = (1700 + (value - 25000) * 0.1)
elif value < 200000:
    tax = (4700 + (value - 55000) * 0.12)
elif value < 1000000:
    tax = (22100 + (value - 200000) * 0.15)
else:
    tax = (142100 + (value - 1000000) * 0.17)

if tax == 0:
    print("No tax!")
else:
    print(f"Amount of tax: {tax} euros")

仍然是一个中心主旨:将 print 放到最后。

第 105 道 | 2026 年 5 月 14 日

2026-05-14日课

The condition x >= a and x <= b is a very common way of checking whether the number x falls within the range of a to b. An expression with this structure works the same way in most programming languages.

Python also allows a simplified notation for combining conditions: a <= x <= b achieves the same result as the longer version using and. This shorter notation might be more familiar from mathematics, but it is not very widely used in Python programming, possibly because very few other programming languages have a similar shorthand.

这段引用要说明的是 x >= a and x <= b 的显示表达式是大多数编程语言中使用的,a <= x <= b 这种链式表达式更简洁,但是是 Python 特有,其他多数编程语言没有,因而反而是显示表达式被用得更多。

不过对初学者而言,直觉上更容易觉得简洁的链式表达用得更多。直接问 Claude Haiku 4.5,它却说 0 <= age < 5 在 Python 中用得更多。可是将上面引用的内容贴给 Haiku,Haiku 很快就变脸了——

(1)and 的形式在大多数编程语言都存在,更通用
(2)链式比较虽然是 Python 特有的,但反而因为其他语言没有,所以使用者习惯用显式的 and

正确建议应该是:

0 <= age and age < 5 更符合实际的 Python 编程习惯,即使链式比较 0 <= age < 5 在技术上也能用。

我之前说 “更Pythonic” 是不准确的——感谢你用实际文献纠正了我!这也提醒初学者不要盲目追求 “黑科技”,有时候最直白、最通用的写法反而是最好的。

这份日课没有别的目的,只想借此再次论证 AI 时代仍然需要用心学习编程知识,单纯的 Vibe Coding 远远不够,AI 也并非随意就可取代人,反而更需要熟悉知识的人对其进行指导和校正,否则只会积累更多技术债务

第 104 道 | 2026 年 5 月 12 日

2026-05-12日课

  • 完成《卢旺达危机》选读并分享

做题时被自己蠢到了,题目如下:

Please write a program which asks for the user’s name. If the name is anything but “Jerry”, the program then asks for the number of portions and prints out the total cost. The price of a single portion is 5.90.

我的初始答案如下:

name = input("Please tell me your name:")
if name != Jerry:
    soup = int(input("How many portions of soup?"))
    print(f"The total cost is {soup*5.9}")
if name == Jerry:
    print("Next please!")

对 Python 变量的认识不够深,没有给 Jerry 加上引号转化为字符,它会被当作变量。

正确答案:

name = input("Please tell me your name:")
if name != "Jerry":
    soup = int(input("How many portions of soup?"))
    print(f"The total cost is {soup*5.9}")
    print("Next please!") # 这部分是题目参考的要求,需要补充这一段说明
if name == "Jerry":
    print("Next please!")

f-string 的认识感觉也模模糊糊,下面的第一种写法没必要用 f-string

print(f"{num * -1}")

简洁写法:

print(num * -1)

记得 f-string 主要用于在字符串中插入变量或表达式的时候。

第 103 道 | 2026 年 5 月 11 日

2026-05-11日课

  • AI 代劳《中国边疆学》期中作业

导师说放假后的两周(应该是指五一后?)要带我们一年级的同学去广西调研,不知真假。

我讨厌 Z,不想见到她,更不想参与有她的活动。

讽刺吗?越是回想过往相处的经历——我的一厢情愿,她的模糊暧昧——我便越是讨厌她,甚至产生了一种生理性的厌恶,特别是在她还来打探我申请台湾访学的事情——我们已经是不必交流的关系了,何必再来问我,一切按流程走,各凭本事,即便导师和她说我上个学期便在关注,让她来和我交流一下。问了我想报哪个学校,对那些学校有什么了解以后,Z 悄摸摸地将一切弄好。我知道她当然没有义务再来和我分享她知道的消息,但我从导师那知道 Z 将一切都打点好了,而回家做清明的我还因为民族学与社会学学院行政效率的低下和信息的不流通而一头雾水,不知所措时,心中一股无名火便升腾起来。

我没想过问 Z 任何消息,也没期望过和她交流获取信息,但她竟然能厚着脸皮来问我,转身那些不流通的消息为什么不告知我呢?我并不看重消息本身,看重的只是这样的所作所为给我感受到的为人——利己。

我的嘴脸是丑恶的,我没能成功入选,但得知 Z 也落选,我便觉得无所谓、放心了。

此时此刻,我只觉得彼时彼刻的自己很惹人厌,我会一遍遍地骂自己是一个傻逼,但我不会删除过去写的那些「无病呻吟」——丢人就丢人吧,毕竟怎么说那也是「我」一部分。

只是站在当下的角度来看,我当真瞎了眼,也是有够矫情。

第 102 道 | 2026 年 5 月 10 日

2026-05-10日课

今天预期需要完成的任务:

  • AI 代劳《中国边疆学》期中作业
  • 完成《卢旺达危机》选读
  • 回复朋友的信件
  • 完成《使用 Python 快速搭建一个智能体(Agent)》的撰写

今天早早起来,正常地吃了一顿早餐,花了一个上午为朋友写回复的信件。我早上向来是吃得越饱,中午便越没有食欲,干脆不吃好了。

中午回到寝室,困意到位,倒头就睡,迷迷糊糊做了一个想不明白的梦,一小时后起来返回图书馆开始写智能体搭建的回顾。没想到的是真正完成这一篇回顾花了一个下午和一个晚上,原定要 AI 代劳完成的《中国边疆学》期中作业和读书会选也只能留到明天了。我对这两项任务没有「感情」,实话说带有敷衍了事的心态,因而也能接受被拖延到 DDL。

我记得今天是母亲节,惦记着要给母亲打个电话,也惦记着给姑姑婶婶同样发个节日祝福,但实际上忍不住拖延着。我自己也想不明白有什么可拖延,但总觉得不知如何开口——开口表达感情很难吗?也许是吧,但我最后还是做到了。

我想起前几天农历生日,母亲晚上给我打了电话,说差点忘记我的农历生日——我是真的忘记了,心里没有将这当一回事。她来祝我生日快乐,但我其实觉得忘记也没关系。

晚上回来不知缘由感觉挺累,不止身体上有些小疲惫,心理也有一些。不知自己是否好高骛远,但毕竟也是刚接触新的领域,稍微往后看,看到许多不受自己掌控的事物也很正常,虽然因此不知怎么应对,突然仓皇起来。半夜躺在床上,明明累了,但不愿好好入睡,觉得研究生生活如空中楼阁,不知该怎么过,不知意义在何处。我认为产生这种感受是荒唐的,但也是真实的。

熬夜了,早上起来感到很困顿——还是早睡更好,哪怕是早睡晚起。

第 101 道 | 2026 年 5 月 6 日

摔倒后随时重新站起来的能力更加珍贵。

第 100 道 | 2026 年 3 月 24 日

今日荐歌

今天推荐原子邦妮的《这世界太坏可你却太好》,原曲需要 VIP,只能试听一部分,可以前往 Spotify 收听。

此刻心情:闲适,放空。

第 99 道 | 2026 年 3 月 22 日

在浴室洗澡时,某隔间的兄弟 A 唱起了疑似薛之谦的某首歌曲,很是走心卖力。

一曲终了,另外一隔间的兄弟 B 突然问了一句「兄弟,可以点歌吗?」

兄弟 A 愣了一下,问点什么。B 说了两首我没听过的歌名,A 说会的很少。

「那就《晴天》。」A 说。

B 准备了一下,唱了起来,A 随即跟上。这时,我对面隔间的兄弟 C 也跟着唱了起来,《晴天》的合唱就这样开始了,似乎整座浴室都跟着唱了起来。我没忍住也跟着嗷了两嗓子。

男生浴室真是欢乐多,可能也就集体生活能有这样的乐趣啊。

第 98 道 | 2026 年 3 月 19 日

AI 幻觉

太隐在《隐说 NO.16 “默认为假”的时代》中说得很有道理,AI 时代,虚假信息反而越来越难分辨,警惕将大模型给的内容当作正确、标准答案。

在 Gemini 上查询罗安清老师的华裔血统从何而来,它竟然顺着我的话,先肯定我的记忆反馈可以在书中找到答案,接着开始东拼西凑,编造信息,说罗安清老师是罗家伦的女儿,但我无论是顺着它提供的信息源去检索还是自行在网上搜索,都没找到可供验证的内容。