最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中的函數(shù)式編程:不可變的數(shù)據(jù)結(jié)構(gòu)

 更新時(shí)間:2018年10月08日 08:53:41   作者:Moshe Zadka  
今天小編就為大家分享一篇關(guān)于Python中的函數(shù)式編程:不可變的數(shù)據(jù)結(jié)構(gòu),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

讓我們首先考慮正方形和長(zhǎng)方形。如果我們認(rèn)為在接口方面,忽略了實(shí)現(xiàn)細(xì)節(jié),方塊是否是矩形的子類型?

子類型的定義取決于Liskov代換原理。為了成為一個(gè)子類型,它必須能夠完成超級(jí)類型所做的一切。

如何定義矩形的接口?

zope.interface import Interface
class IRectangleInterface:
get_length:
"""Squares can do that"""
get_width:
"""Squares can do that"""
set_dimensions length width:
"""Uh oh"""

如果這是定義,則方塊不能是矩形的子類型;它們不能響應(yīng)set_dimensions方法,如果長(zhǎng)度和寬度不同。

另一種方法是選擇制作矩形。不變.

class IRectangleInterface:
get_length:
"""Squares can do that"""
get_width:
"""Squares can do that"""
with_dimensions length width:
"""Returns a new rectangle"""

現(xiàn)在,一個(gè)正方形可以是一個(gè)矩形。它可以返回一個(gè)新的矩形(通常不是正方形)with_dimensions被稱為,但它不會(huì)停止成為一個(gè)正方形。

這似乎是一個(gè)學(xué)術(shù)問(wèn)題-直到我們考慮到,從某種意義上說(shuō),正方形和長(zhǎng)方形是它們兩邊的容器。在我們理解了這個(gè)例子之后,更實(shí)際的情況是使用更傳統(tǒng)的容器。例如,考慮隨機(jī)訪問(wèn)數(shù)組.

我們有ISquare和IRectangle,和ISquare是IRectangle.

我們希望在隨機(jī)訪問(wèn)數(shù)組中放置矩形:

class IArrayOfRectanglesInterface:
get_element i:
"""Returns Rectangle"""
set_element i rectangle:
"""'rectangle' can be any IRectangle"""

我們也想把正方形放在一個(gè)隨機(jī)存取數(shù)組中:

class IArrayOfSquareInterface:
get_element i:
"""Returns Square"""
set_element i square:
"""'square' can be any ISquare"""

即使ISquare是IRectangle,任何數(shù)組都不能實(shí)現(xiàn)這兩者。IArrayOfSquare和IArrayOfRectangle.

為什么不行?假設(shè)bucket實(shí)現(xiàn)兩者。

>>> rectangle make_rectangle 
>>> bucket.set_element rectangle # This is allowed by IArrayOfRectangle
>>> thing bucket.get_element # That has to be a square by IArrayOfSquare
>>> assert thing.height thing.width
Traceback most recent call last:
File "<stdin>" line module
AssertionError

兩者都不能實(shí)現(xiàn),這意味著兩者都不是另一種類型的子類型,盡管ISquare是IRectangle。問(wèn)題是set_element方法:如果我們有一個(gè)只讀數(shù)組,IArrayOfSquare的子類型IArrayOfRectangle.

可變性,都是可變的。IRectangle接口和可變IArrayOf接口使得對(duì)類型和子類型的思考變得更加困難-而放棄的能力意味著我們期望類型之間的直觀關(guān)系實(shí)際上仍然有效。

突變也可以非局部效果。當(dāng)兩個(gè)地方之間的共享對(duì)象被一個(gè)突變時(shí),就會(huì)發(fā)生這種情況。典型的例子是一個(gè)線程與另一個(gè)線程交互一個(gè)共享對(duì)象,但是即使在一個(gè)單線程程序中,在相距很遠(yuǎn)的地方之間共享也很容易??紤]到在Python中,大多數(shù)對(duì)象都可以從許多地方訪問(wèn):作為一個(gè)模塊全局,或者在堆棧跟蹤中,或者作為一個(gè)類屬性。

如果我們不能限制共享,我們可能會(huì)考慮限制可變。

下面是一個(gè)不可變的矩形,它利用AutoS庫(kù):

attr.frozen
class Rectangeobject:
length attr.
width attr.
classmethod
with_dimensionscls length width:
return clslength width

這里是一個(gè)正方形:

attr.frozen
class Squareobject:
side attr.
classmethod
with_dimensionscls length width:
return Rectanglelength width

使用frozen參數(shù),我們可以很容易地創(chuàng)建一個(gè)不可變的類。所有艱苦的寫(xiě)作工作__setitem__正確的做法是別人做的,對(duì)我們來(lái)說(shuō)是完全看不見(jiàn)的。

修改對(duì)象仍然是容易的,改變它們幾乎是不可能的

too_long Rectangle 
reasonable attr.evolvetoo_long length

可靠的包裝允許我們有不可變的容器

# Vector of integers
a = pyrsistent.v(1, 2, 3)
# Not a vector of integers
b = a.set(1, "hello")

當(dāng)b不是整數(shù)的向量,任何東西都不會(huì)停止。a從成為一個(gè)。

萬(wàn)一a一百萬(wàn)個(gè)元素長(zhǎng)了嗎?是b要復(fù)制999 999份嗎?Pyrsistent附帶“大O”性能保證:所有操作都采用O(log n)時(shí)間到了。它還附帶了一個(gè)可選的C擴(kuò)展,以提高性能超越大O。

為了修改嵌套對(duì)象,它附帶了“轉(zhuǎn)換器”的概念:

blog pyrsistent.
title"My blog"
linkspyrsistent."github" "twitter"
postspyrsistent.
pyrsistent.title"no updates"
content"I'm busy"
pyrsistent.title"still no updates"
content"still busy"
new_blog blog.transform"posts" "content"
"pretty busy"

new_blog將成為不可變的等價(jià)物。

'links': 'github' 'twitter'
'posts': 'content': "I'm busy"
'title': 'no updates'
'content': 'pretty busy'
'title': 'still no updates'
'title': 'My blog'

但blog還是一樣的。這意味著任何引用舊對(duì)象的人都沒(méi)有受到影響:轉(zhuǎn)換只有本土化效果。

當(dāng)分享猖獗時(shí),這是有用的。例如,考慮默認(rèn)參數(shù):

silly_suma b extrav :
extra extra.extenda b
return extra

在這篇文章中,我們了解了為什么不變性對(duì)于思考我們的代碼是有用的,以及如何在沒(méi)有昂貴的性能代價(jià)的情況下實(shí)現(xiàn)它。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • python 序列類型list示例詳解

    python 序列類型list示例詳解

    列表(List)是一種有序的集合,可以包含任意類型的對(duì)象:數(shù)字、字符串甚至其他列表等,列表是可變的,這意味著我們可以添加、刪除或更改列表中的元素,這篇文章主要介紹了python 序列類型list示例詳解,需要的朋友可以參考下
    2024-04-04
  • 圖解python全局變量與局部變量相關(guān)知識(shí)

    圖解python全局變量與局部變量相關(guān)知識(shí)

    這篇文章主要介紹了圖解python全局變量與局部變量相關(guān)知識(shí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • python使用nntp讀取新聞組內(nèi)容的方法

    python使用nntp讀取新聞組內(nèi)容的方法

    這篇文章主要介紹了python使用nntp讀取新聞組內(nèi)容的方法,實(shí)例分析了Python操作nntp讀取新聞組內(nèi)容的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 在django-xadmin中APScheduler的啟動(dòng)初始化實(shí)例

    在django-xadmin中APScheduler的啟動(dòng)初始化實(shí)例

    今天小編就為大家分享一篇在django-xadmin中APScheduler的啟動(dòng)初始化實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • Python?pip命令清除Python包緩存文件問(wèn)題

    Python?pip命令清除Python包緩存文件問(wèn)題

    這篇文章主要介紹了Python?pip命令清除Python包緩存文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Qt5 實(shí)現(xiàn)主窗口狀態(tài)欄顯示時(shí)間

    Qt5 實(shí)現(xiàn)主窗口狀態(tài)欄顯示時(shí)間

    這篇文章主要介紹了Qt5 實(shí)現(xiàn)主窗口狀態(tài)欄顯示時(shí)間,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • Python實(shí)現(xiàn)搜索算法的實(shí)例代碼

    Python實(shí)現(xiàn)搜索算法的實(shí)例代碼

    這篇文章主要介紹了Python實(shí)現(xiàn)搜索算法,文中通過(guò)實(shí)例代碼給大家分享高級(jí)搜索算法的想法,分為線性搜索和插值搜索,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 淺談Python類的單繼承相關(guān)知識(shí)

    淺談Python類的單繼承相關(guān)知識(shí)

    本文給大家介紹面向?qū)ο笕刂焕^承Inheritance的相關(guān)知識(shí),通過(guò)示例代碼給大家介紹了繼承、貓類、狗類不用寫(xiě)代碼,直接繼承了父類的屬性和方法,具體實(shí)現(xiàn)代碼跟隨小編一起看看吧
    2021-05-05
  • Python中關(guān)于print和return的區(qū)別

    Python中關(guān)于print和return的區(qū)別

    這篇文章主要介紹了Python中關(guān)于print和return的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python中正則表達(dá)式findall的用法實(shí)例

    python中正則表達(dá)式findall的用法實(shí)例

    在寫(xiě)著自動(dòng)化測(cè)試的腳本時(shí)重新復(fù)習(xí)了一下正則表達(dá)式findall()方法,下面這篇文章主要給大家介紹了關(guān)于python中正則表達(dá)式findall用法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09

最新評(píng)論

象山县| 富裕县| 金山区| 普陀区| 鄂托克前旗| 忻城县| 万盛区| 开封市| 溧水县| 洱源县| 即墨市| 夹江县| 兰西县| 乐平市| 新邵县| 甘南县| 子长县| 丹寨县| 柳林县| 综艺| 定日县| 永宁县| 波密县| 同仁县| 德兴市| 宝鸡市| 拜城县| 综艺| 景洪市| 和龙市| 长春市| 军事| 师宗县| 张家川| 黑山县| 昔阳县| 长丰县| 来宾市| 扶绥县| 通榆县| 静海县|