decorator-2017-6-6

<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org1fbb994">1. 什么是閉包</a></li>
<li><a href="#org6e28685">2. 裝飾器</a></li>
<li><a href="#orga345de2">3. 無(wú)參裝飾器</a></li>
<li><a href="#org184871c">4. 有參裝飾器</a></li>
<li><a href="#org8215eae">5. 位置參數(shù)和關(guān)鍵字參數(shù)都可以的裝飾器</a></li>
<li><a href="#org7ddc069">6. return 之后的對(duì)象和傳入對(duì)象的關(guān)系以及形式</a></li>
<li><a href="#org87145ad">7. 類裝飾器</a></li>
</ul>
</div>
</div>

<a id="org1fbb994"></a>

什么是閉包

解釋 1:在函數(shù)內(nèi)部定義一個(gè)函數(shù)座菠,這個(gè)函數(shù)使用到外部函數(shù)

閉包(closure)是一種引用了外部變量的函數(shù)對(duì)象待诅,無(wú)論該變量所處的作用域是否還存在于內(nèi)存中鳄厌。

舉例來(lái)說(shuō)贡避,函數(shù) generatepowerfunc 返回了另一個(gè)函數(shù):

def generate_power_func(n):
    print "id(n): %X" % id(n)
    def nth_power(x):
        return x**n
    print "id(nth_power): %X" % id(nth_power)
    return nth_power

函數(shù) nthpower 就是一個(gè)閉包,它可以訪問(wèn)定義在 generatepowerfunc 函數(shù)中的變量 n狐树,i
顯而易見如果缺少變量 n掘而,函數(shù) nthpower 將是一個(gè)不能執(zhí)行的沒(méi)有閉合的函數(shù)谆趾,
這個(gè)不完整的函數(shù) nthpower 需要變量 n 來(lái)讓它變成一個(gè)完整的函數(shù)對(duì)象,
這種函數(shù)就是閉包嫁盲,換句話說(shuō)是變量 n 封閉了函數(shù) nthpower篓叶。

<a id="org6e28685"></a>

裝飾器

https://wiki.python.org/moin/PythonDecorators

<a id="orga345de2"></a>

無(wú)參裝飾器

# -*- coding: utf-8 -*-
 def func_cache(func):
   cache = {}
   def inner_deco(*args):
     if args in cache:
       print('func {} is already cached with arguments {}'.format(
         func.__name__, args))
       return cache[args]
     else:
       print('func {} is not cached with arguments {}'.format(
         func.__name__, args)) 
       res = func(*args)
       cache[args] = res
       return res
   return inner_deco

 @func_cache
 def add_two_number(a, b):
   return a + b

 if __name__ == "__main__":
   print('1. add_two_number(1, 2)')
   add_two_number(1, 2)
   print('2. add_two_number(2, 3)')
   add_two_number(2, 3)
   print('3. add_two_number(1, 2)')
   add_two_number(1, 2)

<a id="org184871c"></a>

有參裝飾器

目前我們實(shí)現(xiàn)的函數(shù)緩存裝飾器,會(huì)緩存所有遇到的函數(shù)返回值羞秤。
我們希望能夠?qū)彺鏀?shù)量上限做一個(gè)限制缸托,從而在內(nèi)存消耗和運(yùn)行效率上取得折中。
但是同時(shí)瘾蛋,對(duì)于不同的函數(shù)俐镐,我們希望做到緩存上限不同,例如對(duì)于運(yùn)行一次比較耗時(shí)的函數(shù)哺哼,我們希望緩存上限大一些佩抹;
反之,則小一些取董。這時(shí)棍苹,需要用到帶參數(shù)的 Decorator。

# -*- coding: utf-8 -*-
from functools import wraps
import random

def outer_deco(size=10):
  def func_cache(func):
    cache = {}
    @wraps(func)
    def inner_deco(*args, **kwargs):
      key = (args, frozenset(kwargs.items()))
      if key not in cache:
        print('func {} is not cached with arguments {} {}'.format(
          func.__name__, args, kwargs)) 
        res = func(*args, **kwargs)
        if len(cache) >= size:
          lucky_key = random.choice(list(cache.keys()))
          print('func {} cache pop {}'.format(
            func.__name__, lucky_key))
          cache.pop(lucky_key, None)
        cache[key] = res
      return cache[key]
    return inner_deco
  return func_cache

@outer_deco(size=3)
def add_two_number(a, b):
  return a + b

@outer_deco()
def product_two_number(a, b):
  return a * b

if __name__ == "__main__":
  print('add_two_number func name is {}'.format(add_two_number.__name__))
  print('1. add_two_number(1, 2)')
  add_two_number(1, 2)
  print('2. add_two_number(2, 3)')
  add_two_number(2, 3)
  print('3. add_two_number(1, b=2)')
  add_two_number(1, b=2)
  print('4. add_two_number(1, 2)')
  add_two_number(1, 2)
  print('5. product_two_number(1, 2)')
  product_two_number(1, 2)
  print('6. add_two_number(1, 3)')
  add_two_number(1, 3)

<a id="org8215eae"></a>

位置參數(shù)和關(guān)鍵字參數(shù)都可以的裝飾器

http://blog.guoyb.com/2016/04/19/python-decorator/?hmsr=toutiao.io

<a id="org7ddc069"></a>

return 之后的對(duì)象和傳入對(duì)象的關(guān)系以及形式

https://www.ibm.com/developerworks/cn/linux/l-cpdecor.html
高級(jí)抽象簡(jiǎn)介

根據(jù)我的經(jīng)驗(yàn)茵汰,元類應(yīng)用最多的場(chǎng)合就是在類實(shí)例化之后對(duì)類中的方法進(jìn)行修改枢里。decorator 目前并不允許您修改類實(shí)例化本身,但是它們可以修改依附于類的方法蹂午。這并不能讓您在實(shí)例化過(guò)程中動(dòng)態(tài)添加或刪除方法或類屬性栏豺,但是它讓這些方法可以在運(yùn)行時(shí)根據(jù)環(huán)境的條件來(lái)變更其行為。現(xiàn)在從技術(shù)上來(lái)說(shuō)豆胸,decorator 是在運(yùn)行 class 語(yǔ)句時(shí)應(yīng)用的奥洼,對(duì)于頂級(jí)類來(lái)說(shuō),它更接近于 “編譯時(shí)” 而非 “運(yùn)行時(shí)”配乱。但是安排 decorator 的運(yùn)行時(shí)決策與創(chuàng)建類工廠一樣簡(jiǎn)單溉卓。例如:
清單 8. 健壯但卻深度嵌套的 decorator

def arg_sayer(what):
    def what_sayer(meth):
        def new(self, *args, **kws):
            print what
            return meth(self, *args, **kws)
        return new
    return what_sayer

def FooMaker(word):
    class Foo(object):
        @arg_sayer(word)
        def say(self): pass
    return Foo()

foo1 = FooMaker('this')
foo2 = FooMaker('that')
print type(foo1),; foo1.say()  # prints: <class '__main__.Foo'> this
print type(foo2),; foo2.say()  # prints: <class '__main__.Foo'> that

@argsayer() 繞了很多彎路,但只獲得非常有限的結(jié)果搬泥,不過(guò)對(duì)于它所闡明的幾方面來(lái)說(shuō)桑寨,這是值得的:

Foo.say() 方法對(duì)于不同的實(shí)例有不同的行為。在這個(gè)例子中忿檩,不同之處只是一個(gè)數(shù)據(jù)值尉尾,可以輕松地通過(guò)其他方式改變這個(gè)值;不過(guò)原則上來(lái)說(shuō)燥透,decorator 可以根據(jù)運(yùn)行時(shí)的決策來(lái)徹底重寫這個(gè)方法沙咏。
本例中未修飾的 Foo.say() 方法是一個(gè)簡(jiǎn)單的占位符辨图,其整個(gè)行為都是由 decorator 決定的。然而肢藐,在其他情況下故河,decorator 可能會(huì)將未修飾的方法與一些新功能相結(jié)合。
正如我們已經(jīng)看到的一樣吆豹,F(xiàn)oo.say() 的修改是通過(guò) FooMaker() 類工廠在運(yùn)行時(shí)嚴(yán)格確定的鱼的。可能更加典型的情況是在頂級(jí)定義類中使用 decorator痘煤,這些類只依賴于編譯時(shí)可用的條件(這通常就足夠了)凑阶。
decorator 都是參數(shù)化的≈钥欤或者更確切地說(shuō)宙橱,argsayer() 本身根本就不是一個(gè)真正的 decorator;argsayer()所返回的 函數(shù) —— whatsayer() 就是一個(gè)使用了閉包來(lái)封裝其數(shù)據(jù)的 decorator 函數(shù)蘸拔。參數(shù)化的 decorator 較為常見师郑,但是它們將所需的函數(shù)嵌套為三層。

邁進(jìn)元類領(lǐng)域

正如上一節(jié)中介紹的一樣都伪,decorator 并不能完全取代元類掛鉤呕乎,因?yàn)樗鼈冎恍薷牧朔椒ǎ刺砑踊騽h除方法陨晶。
實(shí)際上猬仁,這樣說(shuō)并不完全正確。作為一個(gè) Python 函數(shù)先誉,decorator 完全可以實(shí)現(xiàn)其他 Python 代碼所實(shí)現(xiàn)的任何功能湿刽。
通過(guò)修飾一個(gè)類的 ._new_() 方法(甚至是其占位符版本),您實(shí)際上可以更改附加到該類的方法褐耳。
盡管尚未在現(xiàn)實(shí)中看到這種模式诈闺,不過(guò)我認(rèn)為它有著某種必然性,甚至可以作為 <span class="underline">metaclass</span> 指派的一項(xiàng)改進(jìn):
清單 9. 添加和刪除方法的 decorator

def flaz(self): return 'flaz'     # Silly utility method
def flam(self): return 'flam'     # Another silly method

def change_methods(new):
    "Warning: Only decorate the __new__() method with this decorator"
    if new.__name__ != '__new__':
        return new  # Return an unchanged method
    def __new__(cls, *args, **kws):
        cls.flaz = flaz
        cls.flam = flam
        if hasattr(cls, 'say'): del cls.say
        return super(cls.__class__, cls).__new__(cls, *args, **kws)
    return __new__

class Foo(object):
    @change_methods
    def __new__(): pass
    def say(self): print "Hi me:", self

foo = Foo()
print foo.flaz()  # prints: flaz
foo.say()         # AttributeError: 'Foo' object has no attribute 'say'

在 changemethods() decorator 示例中铃芦,我們添加并刪除了幾個(gè)固定的方法雅镊,不過(guò)這是毫無(wú)意義的。
在更現(xiàn)實(shí)的情況中刃滓,應(yīng)使用上一節(jié)中提到的幾個(gè)模式仁烹。例如,參數(shù)化的 decorator 可以接受一個(gè)能表示要添加或刪除的方法的數(shù)據(jù)結(jié)構(gòu)咧虎;或者由數(shù)據(jù)庫(kù)查詢之類的某些環(huán)境特性做出這一決策卓缰。
這種對(duì)附加方法的操作也可以像之前一樣打包到一個(gè)函數(shù)工廠中,這將使最終決策延遲到運(yùn)行時(shí)。
這些新興技術(shù)也許比 <span class="underline">metaclass</span> 指派更加萬(wàn)能征唬。
例如捌显,您可以調(diào)用一個(gè)增強(qiáng)了的 changemethods(),如下所示:
清單 10. 增強(qiáng)的 changemethods()

class Foo(object):
    @change_methods(add=(foo, bar, baz), remove=(fliz, flam))
    def __new__(): pass

回頁(yè)首
修改調(diào)用模型

您將看到总寒,有關(guān) decorator 的最典型的例子可能是使一個(gè)函數(shù)或方法來(lái)實(shí)現(xiàn) “其他功能”扶歪,同時(shí)完成其基本工作。
例如偿乖,在諸如 Python Cookbook Web 站點(diǎn)(請(qǐng)參見 參考資料 中的鏈接)之類的地方击罪,您可以看到 decorator 添加了諸如跟蹤哲嘲、日志記錄贪薪、存儲(chǔ)/緩存、線程鎖定以及輸出重定向之類的功能眠副。
與這些修改相關(guān)(但實(shí)質(zhì)略有區(qū)別)的是修飾 “之前” 和 “之后”画切。對(duì)于修飾之前/之后來(lái)說(shuō),一種有趣的可能性就是檢查傳遞給函數(shù)的參數(shù)和函數(shù)返回值的類型囱怕。
如果這些類型并非如我們預(yù)期的一樣霍弹,那么這種 typecheck() decorator 就可能會(huì)觸發(fā)一個(gè)異常,或者采取一些糾正操作娃弓。

與這種 decorator 前/后類似的情況典格,我想到了 R 編程語(yǔ)言和 NumPy 特有的函數(shù)的 “elementwise” 應(yīng)用。
在這些語(yǔ)言中台丛,數(shù)學(xué)函數(shù)通常應(yīng)用于元素序列中的每個(gè)元素耍缴,但也會(huì)應(yīng)用于單個(gè)數(shù)字。

當(dāng)然挽霉,map() 函數(shù)防嗡、列表內(nèi)涵(list-comprehension)和最近的生成器內(nèi)涵(generator-comprehension 都可以讓您實(shí)現(xiàn) elementwise 應(yīng)用。
但是這需要較小的工作區(qū)來(lái)獲得類似于 R 語(yǔ)言的行為:map() 所返回的序列類型通常是一個(gè)列表侠坎;如果您傳遞的是單個(gè)元素而不是一個(gè)序列蚁趁,那么調(diào)用將失敗。例如:
清單 11. map() 調(diào)用失敗

>>> from math import sqrt
>>> map(sqrt, (4, 16, 25))
[2.0, 4.0, 5.0]
>>> map(sqrt, 144)
TypeError: argument 2 to map() must support iteration

創(chuàng)建一個(gè)可以 “增強(qiáng)” 普通數(shù)值函數(shù)的 decorator 并不困難:
清單 12. 將函數(shù)轉(zhuǎn)換成 elementwise 函數(shù)

def elementwise(fn):
    def newfn(arg):
        if hasattr(arg,'__getitem__'):  # is a Sequence
            return type(arg)(map(fn, arg))
        else:
            return fn(arg)
    return newfn

@elementwise
def compute(x):
    return x**3 - 1

print compute(5)        # prints: 124
print compute([1,2,3])  # prints: [0, 7, 26]
print compute((1,2,3))  # prints: (0, 7, 26)

當(dāng)然实胸,簡(jiǎn)單地編寫一個(gè)具有不同返回類型的 compute() 函數(shù)并不困難他嫡;畢竟 decorator 只需占據(jù)幾行。但是作為對(duì)面向方面編程的一種認(rèn)可庐完,
這個(gè)例子讓我們可以分離 那些在不同層次上運(yùn)作的關(guān)注事項(xiàng)钢属。
我們可以編寫各種數(shù)值計(jì)算函數(shù),希望它們都可轉(zhuǎn)換成 elementwise 調(diào)用模型假褪,而不用考慮參數(shù)類型測(cè)試和返回值類型強(qiáng)制轉(zhuǎn)換的細(xì)節(jié)署咽。

對(duì)于那些對(duì)單個(gè)事物或事物序列(此時(shí)要保留序列類型)進(jìn)行操作的函數(shù)來(lái)說(shuō),elementwise() decorator 均可同樣出色地發(fā)揮作用。
作為一個(gè)練習(xí)宁否,您可嘗試去解決如何允許相同的修飾后調(diào)用來(lái)接受和返回迭代器
(提示:如果您只是想迭代一次完整的 elementwise 計(jì)算窒升,那么當(dāng)且僅當(dāng)傳入的是一個(gè)迭代對(duì)象時(shí),才能這樣簡(jiǎn)化一些慕匠。)

您將碰到的大多數(shù)優(yōu)秀的 decorator 都在很大程度上采用了這種組合正交關(guān)注的范例饱须。
傳統(tǒng)的面向?qū)ο缶幊蹋绕涫窃谥T如 Python 之類允許多重繼承的語(yǔ)言中台谊,都會(huì)試圖使用一個(gè)繼承層次結(jié)構(gòu)來(lái)模塊化關(guān)注事項(xiàng)蓉媳。
然而,這僅會(huì)從一個(gè)祖先那里獲取一些方法锅铅,而從其他祖先那里獲取其他方法酪呻,因此需要采用一種概念,使關(guān)注事項(xiàng)比在面向方面的思想中更加分散盐须。
要充分利用生成器玩荠,就要考慮一些與混搭方法不同的問(wèn)題:可以處于方法本身的 “核心” 之外的關(guān)注事項(xiàng)為依據(jù),使各 方法以不同方式工作贼邓。

修飾 decorator

在結(jié)束本文之前阶冈,我想為您介紹一種確實(shí)非常出色的 Python 模塊,名為 decorator塑径,它是由與我合著過(guò)一些圖書的 Michele Simionato 編寫的女坑。
該模塊使 decorator 的開發(fā)變得更加美妙。decorator 模塊的主要組件具有某種自反式的優(yōu)雅统舀,它是一個(gè)稱為 decorator() 的 decorator匆骗。
與未修飾的函數(shù)相比,使用 @decorator 修飾過(guò)的函數(shù)可以通過(guò)一種更簡(jiǎn)單的方式編寫绑咱。(相關(guān)資料請(qǐng)參看 參考資料)绰筛。

Michele 已經(jīng)為自己的模塊編寫了很好的文檔,因此這里不再贅述描融;不過(guò)我非常樂(lè)意介紹一下它所解決的基本問(wèn)題铝噩。decorator 模塊有兩大主要優(yōu)勢(shì)。
一方面窿克,它使您可以編寫出嵌套層次更少的 decorator骏庸,如果沒(méi)有這個(gè)模塊,您就只能使用更多層次(“平面優(yōu)于嵌套”)年叮;
但更加有趣的是這樣一個(gè)事實(shí):它使得修飾過(guò)的函數(shù)可以真正地與其在元數(shù)據(jù)中未修飾的版本相匹配具被,這是我的例子中沒(méi)有做到的。
例如只损,回想一下我們上面使用過(guò)的簡(jiǎn)單 “跟蹤” decorator addspam():
清單 13. 一個(gè)簡(jiǎn)單的 decorator 是如何造成元數(shù)據(jù)崩潰的

>>> def useful(a, b): return a**2 + b**2
>>> useful.__name__
'useful'
>>> from inspect import getargspec
>>> getargspec(useful)
(['a', 'b'], None, None, None)
>>> @addspam
... def useful(a, b): return a**2 + b**2
>>> useful.__name__
'new'
>>> getargspec(useful)
([], 'args', None, None)

盡管這個(gè)修飾過(guò)的函數(shù)的確完成 了自己增強(qiáng)過(guò)的工作一姿,但若進(jìn)一步了解七咧,就會(huì)發(fā)現(xiàn)這并不是完全正確的,尤其是對(duì)于那些關(guān)心這種細(xì)節(jié)的代碼分析工具或 IDE 來(lái)說(shuō)更是如此叮叹。
使用 decorator艾栋,我們就可以改進(jìn)這些問(wèn)題:
清單 14. decorator 更聰明的用法

>>> from decorator import decorator
>>> @decorator
... def addspam(f, *args, **kws):
...     print "spam, spam, spam"
...     return f(*args, **kws)
>>> @addspam
... def useful(a, b): return a**2 + b**2
>>> useful.__name__
'useful'
>>> getargspec(useful)
(['a', 'b'], None, None, None)

這對(duì)于編寫 decorator 更加有利,同時(shí)蛉顽,其保留行為的元數(shù)據(jù)的也更出色了蝗砾。
當(dāng)然,閱讀 Michele 開發(fā)這個(gè)模塊所使用的全部資料會(huì)使您回到大腦混沌的世界携冤,我們將這留給 Simionato 博士一樣的宇宙學(xué)家好了悼粮。

<a id="org87145ad"></a>

類裝飾器

https://www.python.org/dev/peps/pep-3129/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市曾棕,隨后出現(xiàn)的幾起案子扣猫,更是在濱河造成了極大的恐慌,老刑警劉巖睁蕾,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苞笨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡子眶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門序芦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)臭杰,“玉大人,你說(shuō)我怎么就攤上這事谚中】矢耍” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵宪塔,是天一觀的道長(zhǎng)磁奖。 經(jīng)常有香客問(wèn)我,道長(zhǎng)某筐,這世上最難降的妖魔是什么比搭? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮南誊,結(jié)果婚禮上身诺,老公的妹妹穿的比我還像新娘。我一直安慰自己抄囚,他們只是感情好霉赡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著幔托,像睡著了一般穴亏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天嗓化,我揣著相機(jī)與錄音锅劝,去河邊找鬼。 笑死蟆湖,一個(gè)胖子當(dāng)著我的面吹牛故爵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播隅津,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼诬垂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了伦仍?” 一聲冷哼從身側(cè)響起结窘,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎充蓝,沒(méi)想到半個(gè)月后隧枫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谓苟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年官脓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涝焙。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卑笨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仑撞,到底是詐尸還是另有隱情赤兴,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布隧哮,位于F島的核電站桶良,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏沮翔。R本人自食惡果不足惜陨帆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鉴竭。 院中可真熱鬧歧譬,春花似錦、人聲如沸搏存。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)璧眠。三九已至缩焦,卻和暖如春读虏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袁滥。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工盖桥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人题翻。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓揩徊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嵌赠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子塑荒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 要點(diǎn): 函數(shù)式編程:注意不是“函數(shù)編程”,多了一個(gè)“式” 模塊:如何使用模塊 面向?qū)ο缶幊蹋好嫦驅(qū)ο蟮母拍罱Α傩浴?..
    victorsungo閱讀 1,466評(píng)論 0 6
  • Python進(jìn)階框架 希望大家喜歡齿税,點(diǎn)贊哦首先感謝廖雪峰老師對(duì)于該課程的講解 一、函數(shù)式編程 1.1 函數(shù)式編程簡(jiǎn)...
    Gaolex閱讀 5,489評(píng)論 6 53
  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項(xiàng)目接著寫寫一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,547評(píng)論 1 118
  • 前言 人生苦多炊豪,快來(lái) Kotlin 凌箕,快速學(xué)習(xí)Kotlin! 什么是Kotlin词渤? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,146評(píng)論 9 118
  • 一大清早牵舱,老公就吩咐我給他洗羽絨服,我說(shuō)天要下雨掖肋,不容易干仆葡,但他還是堅(jiān)決要洗,我問(wèn)口袋里有錢物嗎志笼?他說(shuō)有張情人的照...
    黯黯紅塵一路相伴閱讀 136評(píng)論 0 1