python模擬無窮項數(shù)列

等差數(shù)列和等比數(shù)列類。功能如下:

  • 模擬無窮項數(shù)
  • 獲取任一項的值
  • 跨步取項
class GeneralSequence:

    
    def __init__(self, valueAt):
        
        self.valueAt = valueAt
    
    
    def __getitem__(self, index):

        if isinstance(index, slice):
            
            from itertools import islice
            
            return islice(iter(self), index.start,
                          index.stop, index.step)
        
        else:    
            return self.valueAt(index)
    
    
    def __iter__(self):
        from itertools import count
        return map(self.valueAt, count())
    
    
class ArithmeticSequence(GeneralSequence):
    
    def __init__(self, a, d):
        valueAt = lambda n: a + n * d
        GeneralSequence.__init__(self, valueAt)

        
class GeometricSequence(GeneralSequence):
    
    def __init__(self, a, q):
        valueAt = lambda n: a * q**n
        GeneralSequence.__init__(self, valueAt)

GeneralSequence

__init__

持有通項公式。

__genitem__

分兩種情況,

  • 輸入的index是切片時,用itertools.islice跨步取項。
  • 輸入index是數(shù)字時,用通項公式算出該處的值。

__iter__

實現(xiàn)迭代協(xié)議,可以支持這樣的用法:

for item in GeometricSequence(1, 2):
    if item > 10000:
        break
    print(item, end=' ')
>> 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 

因為itertools.count不會拋出StopIteration異常,需要手動跳出循環(huán)。

ArithmeticSequence和GeometricSequence

接收各自的參數(shù),構(gòu)造充當(dāng)通項公式的valueAt函數(shù)。

用例

an = ArithmeticSequence(10, 2)

it = iter(an)
for i in range(10):
    print(next(it), end=' ')
>> 10 12 14 16 18 20 22 24 26 28 
bn = ArithmeticSequence(-5, 3)
for i in range(10):
    print(bn[i], end=' ')
>> -5 -2 1 4 7 10 13 16 19 22 
cn = GeometricSequence(1, 2)
list(cn[100:140:5])
>> 
[1267650600228229401496703205376,
 40564819207303340847894502572032,
 1298074214633706907132624082305024,
 41538374868278621028243970633760768,
 1329227995784915872903807060280344576,
 42535295865117307932921825928971026432,
 1361129467683753853853498429727072845824,
 43556142965880123323311949751266331066368]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容