[英]Why iterator is considered functional-style in the Python documentation?
[英]functional-style datatypes in Python
對於那些花了一些時間用sml,ocaml,haskell等等的人,當你回到使用C,Python,Java等時,你會開始注意到你從未知道的東西丟失了。 我正在用Python做一些事情,我意識到我真正想要的是一個像(例如)一樣的函數式數據類型
datatype phoneme = Vowel of string | Consonant of voice * place * manner
datatype voice = Voiced | Voiceless
datatype place = Labial | Dental | Retroflex | Palatal | Velar | Glottal
datatype manner = Stop | Affricate | Fricative | Nasal | Lateral
type syllable = phoneme list
有沒有人有一種特殊的方式,他們喜歡在Python中模擬這個?
對於像voice
, place
和manner
這樣的簡單枚舉,您可以使用如下類:
class Enum(object):
def __init__(self, *values):
self._values = set(values)
for value in values:
setattr(self, value, value)
def __iter__(self):
return iter(self._values)
place = Enum('Labial', 'Dental', 'Retroflex', 'Palatal', 'Velar', 'Glottal')
a = place.Retroflex
if a == place.Labial:
print "How did this happen?"
for p in place:
print "possible value:", p
正如......所示,您的語音,地點和方式類型只是枚舉類型。 有許多方法可以實現這些,例如
class voice(object):
Voiced, Voiceless = range(2)
然后你可以參考voice.Voiced和voice.Voiceless,等等。
問題是像音素這樣的類型。 在C中,實現類似的東西的通常方法是抓住你的鼻子並使用聯合。 像python這樣的東西,你使用多態。 首先,弄清楚您要對音素類型執行哪些操作。 然后,將這些操作實現為Vowel類和Consonant類的成員函數。 在C ++中,您可以將這些成員函數設置為虛擬,並為Vowel和Consonant創建一個抽象基類; 在python中你可以通過鴨子打字而不用這樣做就可以逃脫,盡管你仍然可以找到一個有用的基類。
所以,
class Vowel(object):
def SomeInitialMethod(self):
# ...
class Consonant(object):
def SomeInitialMethod(self):
# ...
p.SomeInitialMethod() # p can be either vowel or consonant
def SomeLaterFunction(p)
# p is assumed to be either a Vowel or a Consonant
if isinstance(p, Vowel):
# ...
elif isinstance(p, Consonant):
# ...
您可以創建包含所需屬性的類。
class Phoneme:
# ...
class Consonant(Phoneme):
def __init__(self, voice, place, manner):
self.voice = voice
self.place = place
self.manner = manner
# ...
h = Consonant('Voiceless', 'Glottal', 'Fricative')
# ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.