def execute(): instruction = '''Command Arguments: save --- save --- saveAs --- saveAs = lrc --- save("lrc", "True") --- save(saveAs = "lrc", ALL = "True") next --- next --- next(2) delete --- del --- del("告白气球") reset --- reset --- reset("告白气球") help --- help ''' response = getText(commandText) if response == 'help' or response == '': print(instruction) return global sc, st fd = find(response) try: if response.startswith('save'): if not sc: return if response == 'save': sc.save() elif response.startswith('saveAs'): sc.save(fd.after('saveAs = ')) else: eval(response) elif response.startswith('next'): number = fd.after('next').strip() if number: number = eval(number) else: number = -1 if st: st.next(number) elif sc: sc.next(number) elif response.startswith('del'): if not st: path = fd.between('(', ')') if not path: path = pathText.get() st = lyrics.Setter(path) if response == 'del': st.delete() else: eval(response) elif response.startswith('reset'): arg = fd.between('(', ')') response = input('请输入想要重设的歌词~\n>>>') if not response: return st.reset(response, arg) except: print(instruction)
def calculate(self): '''Calculate various data.''' self.num = len(self.data) if self.num == 1 or self.data == (self.data[0], ) * self.num: raise Exception('Are you serious???') self.sorted = sorted(self.data) self.count = ez.find(self.sorted).count() self.nodup = ez.rmdup(self.data) self.max = self.sorted[-1] self.min = self.sorted[0] self.mean = integer(sum(self.data) / self.num) self.median() self.mode = ez.find(self.count).key( max(self.count[k] for k in self.count)) if set(self.mode) == set(self.data): self.mode = None self.var = sum((data - self.mean)**2 for data in self.data) / self.num self.sd = self.var**0.5 self.ad = sum(abs(data - self.mean) for data in self.data) / self.num self.outlier() self.groups = {}
def search(self, title, artist, Print, amount): '''Find and output lyrics.''' self.init(title, artist, Print, amount) try: self._search(title, artist, amount) if self.lyrics_list == []: print(f'QAQ主人sama搜不到{title}的歌词诶...') self.again = True for left, right in [('(', ')'), ('(', ')'), ('《', '》'), ('(', ')'), ('(', ')')]: if ez.contains(title, left, right): new_title = (title[:title.find(left)] + title[find(title).last(right) + 1:]).strip() print(f'直接搜一下《{new_title}》看看~') self._search(new_title, artist, amount) if self.lyrics_list: print('哇哇哇找到啦!!!~~~') break else: print(f'QAQ抱歉,直接搜《{new_title}》也找不到诶...') else: if artist: print(f'不管作者了,直接搜一下《{title}》看看~') self._search(title, '', amount) if self.lyrics_list: print('嘤嘤嘤找到啦!!!~~~') else: print(f'QAQ抱歉,只搜《{title}》也找不到诶...') return '' else: print('网址在这里,主人sama您自己试试吧~') for url in self.urls: print(url) return '' self.lyrics = self.lyrics_list[0] if Print: print(f'总共找到了{len(self.lyrics_list)}条结果, 为您呈现第1条~\n\n{self.lyrics}\n') except PermissionError: print('请先关闭音乐播放器哦~') self.error = PermissionError except KeyboardInterrupt: if self.error == KeyboardInterrupt: raise Exception('好吧好吧,看起来是真的想离开人家呢o(╥﹏╥)o') else: print('嘤嘤嘤被键盘打断了,再来一次强行终止哦') self.error = KeyboardInterrupt except Exception as e: print(traceback.format_exc()) print('诶呀呀出故障了,网址在这里,主人sama您自己试试吧~') for url in self.urls: print(url) self.error = type(e) finally: return '' if self.error else self.lyrics
def accurateCalculation(formula='', scin=False): '''Function calls not supported. Set scin to True to use scientific notation. Abbreviation: ac''' def get_result(): ni = '' ## new i try: nf = formula.replace('^', '**').lower() ## new formula except AttributeError: raise Exception('Input formula should be a string.') num = '' try: for i, ch in enumerate(nf): if ch.isnumeric() or \ (ch == '-' and (i == 0 or nf[i-1] == 'e')) or \ (ch == ' + ' and (i == 0 or nf[i-1] == 'e')) or \ (ch == 'e' and (nf[i + 1].isnumeric() or nf[i + 1] in [' + ', '-'])) or \ (ch == '.' and nf[i + 1].isnumeric()): num += ch elif ch == ' ': pass else: if num: ni += f'Decimal("{num}")' num = '' ni += ch if num: ni += f'Decimal("{num}")' except: raise Exception('Invalid expression: ' + num) result = eval(repr(eval(ni))[9:-2]) return result if formula: result = get_result() if scin: result = scin(result, 0) return result while True: formula = input( 'Input the formula below. Empty input will exit.\n>>> ') if formula == '': return flag = 'scin = ' if formula.startswith(flag): scin = eval(ez.find(formula).after(flag)) continue result = get_result() if scin: result = scin(result, 0) print(result)
def Set(): global st st = lyrics.Setter(path=os.path.join(getPath(), getText(titleText)), artist=getArtist()) response = getText(commandText) if response in ['ow', 'overwrite']: st.add(source='', overwrite=True) else: for flag in ['ow = ', 'overwrite = ', 'ow=', 'overwrite=']: if response.startswith(flag): st.add(source='', overwrite=eval(find(response).after(flag))) break else: st.add(source='', overwrite=False)
def plot(self, interval=0, font=("Helvetica", 16, 'normal'), color="yellow", percent=False): '''Use cTurtle to plot a histogram. Default Font: Helvetica, 16, normal. Default binColor: yellow. Default Display: not in percentage''' import cTurtle self.group(interval) lower = eval(ez.find(list(self.groups.keys())[0]).between('[', ', ')) interval = interval or eval( ez.find(list(self.groups.keys())[0]).between(', ', ')')) - lower upper = eval(ez.find(list(self.groups.keys())[-1]).between(', ', ')')) deltaBins = upper - lower xMin = lower - 0.1 * deltaBins xMax = upper + 0.1 * deltaBins yMin = -0.1 yMax = 1.1 ct = cTurtle.Turtle() ct.speed(0) ct.setWorldCoordinates(xMin, yMin, xMax, yMax) ct.hideturtle() ct.up() ct.pencolor("black") ct.fillcolor(color) maxValue = max(self.groups.values()) while True: ct.goto(lower, -0.05) ct.write(lower, font=font) ct.goto(lower, 0) ct.down() value = self.groups.get(f'[{lower}, {lower + interval})', 0) if value: height = value / maxValue ct.begin_fill() ct.goto(lower, height) ct.goto(lower + interval, height) ct.goto(lower + interval, 0) ct.goto(lower, 0) ct.end_fill() ct.up() if percent: value = str(round(integer(value / self.num * 100), 2)) + '%' else: value = str(value) ct.goto(lower + 0.5 * interval, height) ct.write( value, align='center', font=(font[0], int(font[1] * 0.75) if len(value) > 2 * interval else font[1], font[2])) if lower + interval == upper: ct.goto(upper, -0.05) ct.write(upper, font=font) break else: ct.goto(lower + interval, 0) ct.up() lower += interval
def group(self, interval=0): '''Group numbers with non-negative interval. If interval is 0, numbers will be grouped automatically. Otherwise it will be set to the given interval.''' self.groups = {} absmax = max(abs(i) for i in self.data) absmin = min(abs(i) for i in self.data) dmax = int(math.log(absmax, 10)) + 1 dmin = 1 if absmin: dmin = int(math.log(absmin, 10)) + 1 dmdiff = dmax - dmin if interval == 0: diff = absmax - absmin ddiff = int(math.log(diff, 10)) + 1 if dmdiff == 0: ## 不够好 interval = 10**ddiff if ddiff < dmax: self.groups = self.count return self.groups if ddiff == dmax: interval //= 10 elif dmdiff == 1: interval = 10**dmin elif dmdiff == 2: interval = 10**dmin if ddiff == dmax: interval *= 10 elif dmdiff >= 3: ## 也许可以优化 interval = 10 if dmdiff < 3: mini = self.min // interval * interval maxi = (self.max // interval + 1) * interval while mini != maxi: for k in self.count: upper = mini + interval if mini <= k < upper: key = f'[{mini}, {upper})' self.groups[key] = self.groups.get(key, 0) + self.count[k] mini += interval else: nmin = nmax = 0 try: ## n 表示 negative nmin = integer(-10**int( math.log(-min(k for k in self.count if k < 0), 10) + 1)) nmax = integer(-10**int( math.log(-max(k for k in self.count if k < 0), 10) + 1)) except ValueError: pass ## p 表示 positive pmin = 10**(dmin - 1) pmax = 10**dmax while nmin < nmax or pmin < pmax: for k in self.count: nupper = nmin // interval pupper = pmin * interval key = '' if nmin <= k < nupper: key = f'[{nmin}, {nupper})' elif -1 <= k < 1: key = '[-1, 1)' if not nmax: key = '[0, 1)' elif not pmax: key = '[-1, 0)' elif pmin <= k < pupper: key = f'[{pmin}, {pupper})' if key: self.groups[key] = self.groups.get(key, 0) + self.count[k] nmin //= interval pmin *= interval self.groups = { k: self.groups[k] for k in sorted( self.groups, key=lambda x: eval(ez.find(x).between('[', ', '))) } return self.groups