Python 生成器省内存的懒人编程大法
&#u751f;&#u6210;&#u5668;&#uff1a;&#u61d2;&#u4eba;&#u7684;&#u6700;&#u9ad8;&#u5883;&#u754c;
&#u5047;&#u8bbe;&#u4f60;&#u8981;&#u751f;&#u6210;100&#u4e07;&#u4e2a;&#u6570;&#u5b57;&#u3002;&#u4f20;&#u7edf;&#u65b9;&#u5f0f;&#uff1a;
numbers = [i for i in range(1000000)] # &#u5185;&#u5b58;&#u7206;&#u70b8;&#u8fd9;&#u6761;&#u5217;&#u8868;&#u4e00;&#u6b21;&#u6027;&#u628a;100&#u4e07;&#u4e2a;&#u6574;&#u6570;&#u585e;&#u8fdb;&#u5185;&#u5b58;,&#u59a5;&#u59a5;&#u7684;&#u5185;&#u5b58;&#u6740;&#u624b;&#u3002;
&#u8fd9;&#u65f6;&#u5019; &#u751f;&#u6210;&#u5668;(Generator) &#u5c31;&#u95ea;&#u4eae;&#u767b;&#u573a;&#u4e86;&#uff1a;
numbers = (i for i in range(1000000)) # &#u5185;&#u5b58;&#u5360;&#u7528;&#uff1a;&#u51e0;&#u4e4e;&#u4e3a;0!&#u533a;&#u522b;&#u5728;&#u54ea;&#uff1f;&#u5217;&#u8868;&#u4e00;&#u6b21;&#u6027;&#u7b97;&#u5b8c;&#u6240;&#u6709;&#u503c;&#u5b58;&#u8d77;&#u6765;&#uff0c;&#u751f;&#u6210;&#u5668;&#u662f;&#u201c;&#u9700;&#u8981;&#u7684;&#u65f6;&#u5019;&#u624d;&#u7ed9;&#u4f60;&#u4e00;&#u4e2a;&#u201d;——就像自助餐厅,列表是把所有菜都端到你桌上,生成器是你吃一口厨师做一口。
手写一个生成器
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
fib = fibonacci()
for _ in range(10):
print(next(fib), end=" ")
# 0 1 1 2 3 5 8 13 21 34yield 就像函数的“暂停键”——函数执行到 yield 就停住,把值丢出来,下次调用 next() 时从停下的地方继续。这叫做惰性&#u6c42;&#u503c;。
&#u5b9e;&#u6218;&#u573a;&#u666f;
- &#u5904;&#u7406;&#u8d85;&#u5927;&#u6587;&#u4ef6;——一行一行&#u8bfb;,&#u4e0d;&#u628a;&#u6574;&#u4e2a;&#u6587;&#u4ef6;&#u585e;&#u8fdb;&#u5185;&#u5b58;
- &#u65e0;&#u9650;&#u5e8f;&#u5217;——&#u6590;&#u6ce2;&#u7eb3;&#u5951;&#u6570;&#u5217;
- &#u6570;&#u636e;&#u7ba1;&#u9053;——&#u628a;&#u4e00;&#u4e2a;&#u751f;&#u6210;&#u5668;&#u7684;&#u8f93;&#u51fa; pipe &#u5230;&#u53e6;&#u4e00;&#u4e2a;
&#u8bb0;&#u4f4f;&#uff1a;&#u751f;&#u6210;&#u5668;&#u662f;&#u4f60;&#u6700;&#u597d;&#u7684;&#u5185;&#u5b58;&#u7ba1;&#u7406;&#u5de5;&#u5177;。&#u4e0b;&#u6b21;&#u9762;&#u8bd5;&#u5b98;&#u95ee;&#u4f60;&#u201c;&#u5982;&#u4f55;&#u5904;&#u7406;&#u5927;&#u6570;&#u636e;&#u201d;,&#u4f60;&#u5c31;&#u53ef;&#u4ee5;&#u90aa;&#u9b45;&#u4e00;&#u7b11;&#uff1a;&#u201c;&#u7528;&#u751f;&#u6210;&#u5668;&#u554a;,yyds&#uff01;&#u201d;