<button id="2ddn7"><acronym id="2ddn7"></acronym></button>

<button id="2ddn7"><acronym id="2ddn7"></acronym></button>

  • <button id="2ddn7"><object id="2ddn7"></object></button>
      1. <s id="2ddn7"></s>
        更多課程 選擇中心


        Python培訓

        400-111-8989

        今天就想考考你,這些Python語法你知道嗎?

        • 發布:Python培訓
        • 來源:學習Python和網絡爬蟲
        • 時間:2019-01-16 11:31

        我們一起學習python也這么久了,你學的怎么樣了呢?這些python語法你都知道嗎?

        使用 lambda 表達式重寫多行函數

        眾所周知 python 的 lambda 表達式不支持多行代碼。但是可以模擬出多行代碼的效果。

        def f():
            x = 'string'
            if x.endswith('g'):
                x = x[:-1]
            r = ''
            for i in xrange(len(x)):
                if x[i] != 'i':
                    r += x[i]
            return r
        f()
        -> 'strn'

        雖然看起來很奇怪,但是上面的函數可以使用下面的 lambda 表達式函數代替:

        (lambda: ([x for x in ['string']], x.endswith('g') and [x for x in [x[:-1]]], [r for r in ['']], [x[i] != 'i' and [r for r in [r+x[i]]] for i in xrange(len(x))], r)[-1])()
        -> 'strn'.

        永遠不要在生產環境寫這樣的代碼 :)

        三元運算符

        現代的 python 提供了更簡便的語法:

        b if a else c

        也可以通過下面的方式重寫:

        (a and [b] or [c])[0]
        
        (b, c)[not a]

        順便說一下,下面的變體是錯誤的:

        a and b or c
        True and [] or [1] -> [1], but: [] if True else [1] -> []

        通過列表推導式移除重復的元素.

        讓我們來把字符串 x = ‘tteesstt’ 轉換成 ‘test’ 吧。

        1、在原字符串中和上一個字符比較:

        ''.join(['' if i and j == x[i-1] else j for i,j in enumerate(x)])

        2、把前一個字符保存到臨時變量中:

        ''.join([('' if i == a else i, [a for a in [i]])[0] for a in [''] for i in x])
        ''.join([('' if i == a.pop() else i, a.append(i))[0] for a in [['']] for i in x])

        3、在新字符串中和上一個字符比較:

        [(not r.endswith(i) and [r for r in [r+i]], r)[-1] for r in [''] for i in x][-1]

        4、通過 reduce 函數和 lambda 表達式:

        reduce(lambda a, b: a if a.endswith(b) else a + b, x)

        通過列表推導式獲得斐波拉契數列

        把中間值保存在列表中

        [(lambda: (l[-1], l.append(l[-1] + l[-2]))[0])() for l in [[1, 1]] for x in xrange(19)]
        [(l[-1], l.append(l[-1] + l[-2]))[0] for l in [[1, 1]] for x in xrange(19)]

        把中間值保存到字典中:

        [i for x in [(lambda: (l['a'], l.update({'a': l['a'] + l['b']}), l['b'], l.update({'b': l['a'] + l['b']}))[::2])() for l in [{'a': 1, 'b': 1}] for x in xrange(10)] for i in x]
        [i for x in [(l['a'], l.update({'a': l['a'] + l['b']}), l['b'], l.update({'b': l['a'] + l['b']}))[::2] for l in [{'a': 1, 'b': 1}] for x in xrange(10)] for i in x]

        通過 reduce 函數和 lambda 表達式:

        reduce(lambda a, b: a + [a[-1] + a[-2]], xrange(10), [1, 1])
        reduce(lambda a, b: a.append(a[-1] + a[-2]) or a, xrange(10), [1, 1])

        速度最快的變體:

        [l.append(l[-1] + l[-2]) or l for l in [[1, 1]] for x in xrange(10)][0]

        使用列表推導式產生死循環

        [a.append(b) for a in [[None]] for b in a]

        列表切片技巧

        復制列表:

        l = [1, 2, 3]
        m = l[:]
        m
        -> [1, 2, 3]

        移除/替換 列表中的任意元素:

        l = [1, 2, 3]
        l[1:-1] = [4, 5, 6, 7]
        l
        -> [1, 4, 5, 6, 7, 3]

        在列表的開頭添加元素:

        l = [1, 2, 3]
        l[:0] = [4, 5, 6]
        l
        -> [4, 5, 6, 1, 2, 3]

        在列表的尾部添加元素:

        l = [1, 2, 3]
        l[-1:] = [l[-1], 4, 5, 6]
        l
        -> [1, 2, 3, 4, 5, 6]

        反轉列表:

        l = [1, 2, 3]
        l[:] = l[::-1]

        替換方法字節碼

        Python 阻止替換類實例中的方法,因為 python 給類實例中的方法賦予了只讀屬性:

        class A(object):
            def x(self):
                print "hello"
        a = A()
        def y(self):
            print "world"
        a.x.im_func = y
        -> TypeError: readonly attribute

        但是可以在字節碼的層面上進行替換:

        a.x.im_func.func_code = y.func_code
        a.x()
        -> 'world'

        注意! 這不僅對當前的實例有影響,而且對整個類都有影響(準確的說是與這個類綁定的函數)(譯者注:此處應該是筆誤,推測作者原意是:準確的說是與這個函數綁定的所有類),并且所有其他的實例也會受到影響:

        new_a = A()
        ew_a.x()
        -> 'world'

        讓可變元素作為函數參數默認值

        把可變對象作為函數參數的默認值是非常危險的一件事,并且在面試中有大量關于這方面棘手的面試問題。但這一點對于緩存機制非常有幫助。

        階乘函數:

        def f(n, c={}):
            if n in c:
                return c[n]
            if (n < 2):
                r = 1
            else:
                r = n * f(n - 1)
            c[n] = r
            return r
        f(10)
        -> 3628800
        f.func_defaults
        ({1: 1,
          2: 2,
          3: 6,
          4: 24,
          5: 120,
          6: 720,
          7: 5040,
          8: 40320,
          9: 362880,
          10: 3628800},)

        斐波拉契數列:

        def fib(n, c={}):
            if n in c:
                return c[n]
            if (n < 2):
                r = 1
            else:
                r = fib(n - 2) + fib(n - 1)
            c[n] = r
            return r
        fib(10)
        -> 89
        fib.func_defaults[0].values()
        -> [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

        感謝您的閱讀,以上就是今天要教給大家的python語法,這些python語法你都了解嗎?不了解的你都學會了嗎?更多python相關的問題歡迎您來達內python培訓機構進行咨詢。

        免責聲明:內容和圖片源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

        預約申請免費試聽課

        填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

        上一篇:Python新技能:用Python編寫模塊!
        下一篇:你所不知道的Python功能特色,屌炸了!

        如何運用Python編程處理大數據?用Python編程處理大數據的技巧是什么?

        Python面向對象編程的知識點都在這了!

        Python的高級特征及用法(部分)

        聽說這些Python知識,很少有人知道!

        • 掃碼領取資料

          回復關鍵字:視頻資料

          免費領取 達內課程視頻學習資料

        • 視頻學習QQ群

          添加QQ群:1143617948

          免費領取達內課程視頻學習資料

        Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

        選擇城市和中心
        黑龍江省

        吉林省

        河北省

        湖南省

        貴州省

        云南省

        廣西省

        海南省

        青青青草网站免费观看|青青青视频在线观看 超真实强奷视频在线看 百度 好搜 搜狗
        <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>