There is a special mechanism in Python that is called a generator function. It returns an object that remembers the last state and executes the body of a function with the values from the previous call (an iterator).
It differs syntactically from normal functions only by using the yield command instead of return. You can typically use such a generator function on places where iterators are expected, i.e. for-loop, container constructors, etc. See the code:
def f(x, c, n=5):
while n > 0:
yield x # returns x0 as first value
x = x * x + c # this value is to be returned next time
n -= 1 # decrement the sequence counter
# Using the generator function in a for loop.
for value in f(1/2, 1, 14): # I want 14 members of the sequence
print(value)
# Using the generator function to build a list of the values.
print('----------------------------------')
lst = list(f(1/2, 1, 10)) # 10 members wanted here
print(lst)
# Using the standard module called fractions for the same function.
print('==================================')
from fractions import Fraction as frac
# Using the generator function in a for loop.
for value in f(frac(1, 2), 1): # default number of loop used here
print(value)
# Using the generator function to build a list of the values.
print('----------------------------------')
lst = list(f(frac(1, 2), 1, 10)) # 10 members wanted here
print(lst)
# Generating Mandelbrot set values.
print('==================================')
# Using the generator function in a for loop.
for value in f(complex(0), complex(0, 1)): # default number of loop used here
print(value)
Python does not compute the expression symbolically, as the matlab does. However, it has the standard module fractions that has the Fraction class to represent the fractions. You can use the same generator function also for that type as it defines its own multiplication and addition. As Python integer is less limited than the float, you may get bigger results with the Fractions (if it makes sense at all). But you probably want to generate a Mandelbrot set, right?
It shows on my console (wrapped lines):
0.5
1.25
2.5625
7.56640625
58.25050354003906
3394.1211626681034
11520059.466871478
132711770120256.16
1.7612413928451715e+28
3.1019712438712e+56
9.62222559780384e+112
9.258722545503146e+225
inf
inf
----------------------------------
[0.5, 1.25, 2.5625, 7.56640625, 58.25050354003906, 3394.1211626681034, 11520059.
466871478, 132711770120256.16, 1.7612413928451715e+28, 3.1019712438712e+56]
==================================
1/2
5/4
41/16
1937/256
3817505/65536
----------------------------------
[Fraction(1, 2), Fraction(5, 4), Fraction(41, 16), Fraction(1937, 256), Fraction
(3817505, 65536), Fraction(14577639392321, 4294967296), Fraction(212507588699293
047863318657, 18446744073709551616), Fraction(4515947525478824258458249067737177
3490882293292495105, 340282366920938463463374607431768211456), Fraction(20393782
05287831607501825305820853979646214602081433287459323242821411496740800167480972
336912829578600961, 115792089237316195423570985008687907853269984665640564039457
584007913129639936), Fraction(41590634642030170391815210870941032988232016881852
69467060076200306147021769623813726880369383179868466442311933392597163786089664
61843166606956164602440721448188927878363156181727061624343416854647005907620761
7, 13407807929942597099574024998205846127479365820592393377723561443721764030073
546976801874298166903427690031858186486050853753882811946569946433649006084096)]
==================================
0j
1j
(-1+1j)
-1j
(-1+1j)
f(n)in python is a function call instead of an array operation