破墙而出:让 Python 代码连接外部世界
写到这里的时候,我对 Python 又有了一次很明显的改观。
前面几篇内容,基本都还发生在“我自己写的这段代码”里面。
变量、判断、循环、函数、异常处理,它们当然很重要。
可整体感觉上,代码还是像待在一个小房间里。
你在里面搭结构,修逻辑,处理输入,慢慢把东西写顺。
但写到这一段,我第一次强烈地感觉到,这个房间的门被打开了。
原来 Python 不只是让我自己写功能,它还能去调用已经写好的模块,借用现成的工具,处理随机数、时间、文本规则,甚至和另一台程序互相发消息。
也就是从这里开始,我第一次看见,代码开始真的和外部世界接上了。
1. import 最先让我意识到,代码原来不必什么都从头写
最开始接触模块时,我最直接的感觉是:终于不用所有东西都自己重写一遍了。
from my_module import add, total
print(add(3, 4))
print(total(1, 2, 3))
这一小段代码看起来不复杂,但它带来的感觉很不一样。
以前的思路更像是:需要什么,就在当前文件里继续写。
而 import 让我第一次意识到,代码也可以“拿来用”。
别人已经整理好的函数,我只要正确导入,就能直接调用。
这一步对我来说特别重要。
因为它让我第一次不再把写代码理解成永远从零开始,而是开始理解“复用别人已经写好的能力”。
2. 模块和包让我第一次看懂,代码也需要被分类安放
再往后写到 package 的时候,我会更明显地感觉到,代码不只是能复用,还需要被组织起来。
from my_package import my_math, my_card
result = my_math.total(1, 2, 3)
print(result)
my_card.menu()
到这里我会很自然地想到前面那一篇讲容器时的感觉。
信息多了,要学会分类。
而代码多了,其实也一样。
哪些函数属于数学处理,哪些属于名片系统,哪些属于工具模块,不应该全都挤在一个文件里。
所以我后来会把这一段理解成:
模块是把一段代码收进一个文件里。
包是把一组相关模块再收进同一个目录结构里。
也就是从这里开始,我第一次觉得,程序不只是要会跑,它还得住得有秩序。
3. random 让我第一次感觉到,程序也能制造一点不确定性
学到标准库的时候,我的感受会更明显。
因为这时候 Python 开始给我现成的工具了。
像 random,就一下子把“随机”这件事带进了代码里。
import random
print(random.random())
print(random.randint(1, 200))
print(random.choice([1, 2, 3, 4, 5]))
写到这里时,我会有一种很新鲜的感觉。
前面很多代码都像是在按规则往前推。
但 random 一出现,程序开始有一点不可预测的气息了。
当然,这种不确定仍然是在规则里的。
可它会让你明显意识到,Python 不只是能做死板计算,它还能参与抽奖、点名、小游戏、随机生成这些更活一点的事情。
4. 正则表达式让我第一次感觉到,文字也可以被规则化处理
如果说 random 带来的是变化感,那正则表达式带来的就是另一种震动。
因为它会让你第一次认真意识到:文字不是只能拿来读,它也能拿来匹配。
import re
print(re.match(r'^1\d{10}$', '12345678900'))
print(re.match(r'^\d+$', '1234234234'))
print(re.match(r'^code\d-\d-.+$', 'code5-2-re'))
一开始看到这些符号,我是会头大的。
\d、+、^、$,每一个都像谜语。
可慢慢看懂之后,你会发现它其实是在做一件很厉害的事:
把“看起来很松散的文本”变成“可以按规则判断的内容”。
身份证号、手机号、文件名、空白字符、数字串,这些以前看起来只能靠肉眼检查的东西,突然都可以交给程序去识别。
这一刻我会很明显地感觉到,代码开始碰到真正复杂的现实文本了。
5. time 和 turtle 让我第一次觉得,程序已经不只是算,它还会记录和展示
再往后写到时间模块和 turtle,我会感觉 Python 又多了一层真实感。
import time
now = time.localtime()
print(time.strftime('%Y-%m-%d %H:%M:%S', now))
时间模块最打动我的地方,是程序终于开始认真对待“此时此刻”。
它不再只是处理抽象的值,而是开始知道现在几点、今天是哪一天。
而 turtle 这一类图形工具,则让我第一次感受到,代码还能把结果展示出来。
像用当前时间去做一个简单时钟效果,哪怕很朴素,也会让人突然觉得:
原来程序不仅能算、能判断、能组织,它还可以被看见。
这种感觉很重要。
因为它会把“写代码”从纸面逻辑,往更具体的体验再推近一步。
6. socket 最让我震动的,是两个程序居然真的可以互相说话
这一段里最让我印象深的,还是 socket。
因为它几乎是一下子把我的理解从“单个程序”推到了“程序和程序之间”。
# server
import socket
sk = socket.socket()
sk.bind(('0.0.0.0', 8995))
sk.listen(5)
conn, addr = sk.accept()
data = conn.recv(1024)
print(data.decode('utf8'))
conn.send('收到'.encode('utf8'))
# client
import socket
sk = socket.socket()
sk.connect(('127.0.0.1', 8995))
sk.send('你好'.encode('utf8'))
print(sk.recv(1024).decode('utf8'))
第一次看到这两段代码时,我是真的会愣一下。
因为前面那些练习,基本都还是在一个程序内部转。
可这里不一样。
服务端在等,客户端在连,消息发出去,再收回来。
这一刻我第一次很强烈地意识到,代码不只是写给自己看的流程,它还能跟别的程序建立联系。
这就是为什么我会觉得,这一段特别像“房间的门终于被打开”。
7. 这一段真正补上的,是“借用外部能力”的知识骨架
写到这里,我后来会把这一段的核心知识点总结成这几条:
- • 模块:把一组相关代码放进一个文件,供别处导入使用
- •
import / from ... import ...:导入已经写好的能力
我觉得这一段特别重要。
因为它补上的,不只是几个新模块的名字,而是一种更大的视角:
你写代码,不一定每次都在重新造一个封闭的小世界。
很多时候,你是在学怎么借用已经存在的工具,怎么和外部能力连接,怎么让自己的程序开始和更大的世界发生关系。
最后
如果让我用现在这套眼光回头看这一段,我会说:
模块这一章真正改变我的,不只是我会写 import 了。
而是我第一次开始理解,代码不是只能困在一个文件里,也不是只能处理自己内部的那点逻辑。
它可以借用工具,可以整理外部能力,可以碰到时间、文本、随机、图形,甚至和另一段程序互相通信。
也正是从这里开始,我会更明显地感觉到,Python 不再只是“我在电脑里写的一段代码”。
它开始有门,有窗,开始真的朝外面连出去。
🌷🌷🌷
如果你也学到这里,最让你有“视野突然打开了”感觉的是哪一刻?
是第一次用 import,第一次看懂正则,第一次拿到当前时间,还是第一次发现两个程序居然真的能互相发消息?