Node 程序的架构:模块是单例,依赖是棵树
先准备三个小文件,跑之前在心里预测输出: // db.js —— 一个计数器 let count = 0; module.exports = { next: () => ++count }; // a.js —— 调用了两次 next const db = require("./db"); db.next(); db.next(); // b.js —— 也 require ...
先准备三个小文件,跑之前在心里预测输出: // db.js —— 一个计数器 let count = 0; module.exports = { next: () => ++count }; // a.js —— 调用了两次 next const db = require("./db"); db.next(); db.next(); // b.js —— 也 require ...
先做一个小测验。下面这段代码不到十行,涉及五个知识点。先别运行,逐行猜猜输出是什么: fs = [lambda: i for i in range(3)] print([f() for f in fs]) def counter(): n = 0 def inc(): nonlocal n n += 1 return n ...
打开财经新闻,几乎每天都有这句话:”10 年期美债收益率上涨 5 个基点(基点是利率的计量单位,1 个基点 = 0.01%)”。后面往往还跟着:美股跌了,分析师说因为它;黄金动了,说因为它;人民币贬值了,还是它。 一条分数线而已,凭什么全世界的资产都得看它的脸色? 因为它是”无风险地借美元出去,能拿多少利息”。全世界投资者–从央行到主权基金到你买的每只基金–心里都拿这把尺子去量其他资产值...
先看一段几乎每个 Python 程序员都写过的代码。假设你有一个生成器,想把它产出的值”转手”再吐出去: def sub(): yield 1 yield 2 def wrapper(): for x in sub(): yield x print(list(wrapper())) # [1, 2] 能用。于是很多人得出一个结论:yiel...
先做一个实验。新建一个 greet.py: # greet.py print("模块被加载了") def hello(): print("hello") 然后在同一个目录打开解释器: >>> import greet 模块被加载了 >>> import greet # 再来一次 >>> ...
先看一段四行代码: add = lambda x, y: x + y print(add(2, 3)) # 5 print(add.__name__) # 你猜是什么? 你把它赋给了 add,从此 add(2, 3) 用得好好的。按”变量叫什么,函数就叫什么”的直觉,__name__ 该是 add。实际跑一下: <lambda> 它给自己起的名字叫 ...
先看两行代码: from itertools import count for n in count(1): print(n) 没有 range、没有终止条件、没有 break。你猜会发生什么?跑一下就知道——它从 1 开始,2、3、4、5……一直往下打,永远不会停,直到你手动按 Ctrl+C 或者电脑断电。 一个标准库函数,居然敢返回一个”无穷大的序列”。要是它返回的是列表...
先看一段十行不到的代码: def log(fn): def wrapper(*args, **kwargs): print(f"调用 {fn.__name__}") return fn(*args, **kwargs) return wrapper @log def add(a, b): """两数相加""" return ...
先看一段你大概写过、也困惑过的代码: import asyncio, time async def fetch(name, delay): print(f"{name} 开始") await asyncio.sleep(delay) print(f"{name} 结束") return name async def main(): t0 = ti...
先看一段十行不到的代码: funcs = [] for i in range(3): funcs.append(lambda: i) print([f() for f in funcs]) 你猜输出是什么?按”常识”,三次循环时 i 分别是 0、1、2,每个 lambda 抓住”当时”的 i,那应该是 [0, 1, 2]。 实际跑一下: [2, 2, 2] 全是 2。...