import string import operator as op # генератор последовательностей vars = {'va':10, 'vb':10, 'limVal':500, 'limCnt':40} # init value, step value, limit value, limit count, induction_type # special mean value for: # limit value: 'None' - не ограничивать значение элементов(т.е. ограничение будет по limit count) # limit count: 'None' - не ограничивать число элементов(т.е. ограничение будет по limit value) #Примеры: # сделать 30 элементов по принципу: 1 3 5 7...(prev + 2) step_eq_1 = '1;2;None;30;+' # сделать 20 элементов по принципу: 1 2 4 8...(prev * 2) step_eq_2 = 'va;2;None;20;*' # сделать список с верхним порогом значения элементов 500 по принципу: 10 20 30 40...(prev + 10) # при этом воспользоваться ранее определенными в расчете переменными step_eq_3 = 'va;vb;limVal;limCnt;+' # сделать список вида 1 1 1 1 1 1 1 из 40 элементов: step_eq_4 = '1;0;None;40;+' # сделать список вида +1 -1 +1 -1 +1 из 25 элементов: step_eq_5 = '1;-1;None;25;*' # сделать список вида -1 10 -100 1000 -10000 из элементов не больших по модулю чем 10000: step_eq_6 = '-1;-10;10000;None;*' # сделать список вида -1 -10 -100 -1000 -10000 из элементов не больших по модулю чем 10000: step_eq_7 = '-1;10;10000;None;*' # -1 -11 -21 -31 -41 и ограничиться тремя первыми элементами: step_eq_8 = '-1;-10;10000;3;+' # обратный отсчет (тип индуктора '-'): 40, 38, 36, 34, 32, 30, 28, 26, 24, 22 step_eq_9 = '40;2;None;10;-' def create_seq(step_eq): # magic wand fn parseStr = lambda x: x.isalpha() and x or x.isdigit() and \ int(x) or x.isalnum() and x or \ len(set(string.punctuation).intersection(x)) == 1 and \ x.count('.') == 1 and float(x) or x seqParams = step_eq.split(';') # подставляем значения переменных Parsed=[] for p in seqParams[:4]: val = parseStr(p) #print('value:{} type:{}'.format(val, type(val))) if type(val) not in [int, float]: # mean of str type if p in vars: if type(vars[p]) != int: # check for internal vars return ('wrong seq parameter: {} !!! \nmust be int or float'.format(p), None) else: # assign value Parsed.append(vars[p]) else: if p != 'None': for c in p: if c not in '-.0123456789': return ('seq parameter with name: {} NOT defined'.format(p), None) if '.' in p: Parsed.append(float(p)) else: Parsed.append(int(p)) else: Parsed.append(None) else: Parsed.append(val) Parsed.append(seqParams[-1]) #ind type seqParams = Parsed # инициализация seqInitValue = seqParams[0] seqStep = seqParams[1] seqLimVal = seqParams[2] seqLimCnt = seqParams[3] seqIndType = seqParams[4] # генерация последовательности seq =[]; cur = seqInitValue inductors = {'+':op.add, '-': op.sub, '/':op.truediv, '*':op.mul} while (abs(cur)<=abs(seqLimVal) if seqLimVal != None else True) and \ (len(seq)<seqLimCnt if seqLimCnt != None else True) and len(seq)<1e3: _cur = inductors[seqIndType](cur, seqStep) seq.append(cur) cur=_cur return seqParams, seq def test(): test_eqs = [step_eq_1, step_eq_2, step_eq_3, step_eq_4, step_eq_5, step_eq_6, step_eq_7, step_eq_8, step_eq_9] for t in test_eqs: res = create_seq(t) print(u'IN: {} => {} \nOUT: {} \n \n'.format(t, str(res[0]), str(res[1]))) test()
Run
Reset
Share
Import
Link
Embed
Language▼
English
中文
Python Fiddle
Python Cloud IDE
Follow @python_fiddle
Browser Version Not Supported
Due to Python Fiddle's reliance on advanced JavaScript techniques, older browsers might have problems running it correctly. Please download the latest version of your favourite browser.
Chrome 10+
Firefox 4+
Safari 5+
IE 10+
Let me try anyway!
url:
Go
Python Snippet
Stackoverflow Question