我是一名初学者,因为未竟的学业,平常也暂时没有时间深入学习。我愿意成为一名“创作者”,更多的是想与大家分享我学习中的快乐,体悟程序之美。
在越来越多文章背后,其实是一颗火热的心。
我最大的收获是,换一个角度、换一个场景向更多人分享我的知识、我的快乐。在写作过程中,我也因所涉理论而不断实践和打磨,收获了许多技术知识,变得日益熟练。
我十分感谢那些陪我和我的文章走过的知识与朋友,衷心祝愿你们都因为热爱知识聚在一起,哪怕只有每天几分钟时间在自己喜欢的领域里遨游,也能做自己的梦想家和实践家,在心海中泛舟,在荒园中耕锄......
创作悄然称为我生活和学习的一部分。于我来说,创作是一种精神状态,也是一种知识运用与巩固。但就目前来说,我的生活里,这些创作只分享了一小部分精力与时间。我希望在忙完这一阶段的事情以后,能花更多的时间学习Python和技术领域。
说来惭愧,也没什么值得称赞的脚本,拿这个吧:
第一个是一个不成熟的想法,是一个数据处理器。当然,只能简单处理一维数组,形成算术平均数、方差等基础统计量。
import sys
import time
class main_:
class system_:
def login(users, psws, times:int):
if times <= 5:
times = 5
time_lst = [10,10,30,60,120]
elif times >= 10:
times = 10
time_lst = [10,10,10,10,10,30,30,30,60,120]
code = 0
for i in range(times * 2):
user = input('请输入用户名。\n>>[').strip()
if user in users:
pos = users.index(user)
print('用户名正确。')
code = 0
break
else:
print('用户名不存在,请重试。')
if i >= times - 1 and code < len(time_lst):
print('用户名多次输入错误,请%s秒后重试。' % time_lst[code])
time.sleep(time_lst[code])
code += 1
elif i >= times - 1 and code == len(time_lst):
print('用户名多次输入错误,请退出重试。')
time.sleep(0.7)
sys.exit()
for i in range(times * 2):
psw = input('请输入密码。\n>>[').strip()
if psw == psws[pos]:
print(f'密码正确。\n登陆成功。\n亲爱的用户 {user} ,欢迎您!\n\n')
break
else:
print('密码错误,请重试。')
if i >= times - 1 and code < len(time_lst):
print('密码多次输入错误,请%s秒后重试。' % time_lst[code])
time.sleep(time_lst[code])
code += 1
if i >= times - 1 and code == len(time_lst):
print('密码多次输入错误,请退出重试。')
time.sleep(0.7)
sys.exit()
def pack(users_ = None, psws_ = None):
users = ['Rock Wang','Rex Wang','Karen Yao','Yuxi Chen','Yuhuan He']
psws = ['-0854bhc378fxa5fdg9','g8e3xd8ff2i8j7d003','7805gig5xf3c3d9be8',
'25bh1jxha0786g0f7d','a0e-6ix0jg4h639j48e']
if users_ and psws_:
return users, psws
if users_:
return users
if psws_:
return psws
class calculators:
def ErrorRaiser(elements:list, weights = [0], ModeNoneCode = False):
if len(elements) == len(set(elements)):
ModeNoneCode = True
try:
elements = [eval(i) for i in elements]
except:
raise Exception('ValueError\n请勿输入不可转换的数据。\nRequire matching data, not an str.')
if weights != [0]:
if len(elements) == len(weights):
if len(elements) < 3:
raise Exception('QuantityError\n每一个列表都应该至少包含三个项。\nEach list should contain at least three elements.')
try:
weights = [eval(i) for i in weights]
except:
raise Exception('ValueError\n请勿输入不可转换的权重数值。\nRequire matching weight numbers, not str.')
else:
raise Exception('''CorrespondingError\n请检查输入。\n每一个项目都应该有唯一位置上的对应权重。
Please check your inputs.\nEach element needs to matching its corresponding weight.''')
return elements, weights, ModeNoneCode
else:
if len(elements) < 3:
raise Exception('QuantityError\n列表应该至少包含三个项。\nThe list should contain at least three elements.')
return elements, ModeNoneCode
def arithmetic_average(elements:list):
aver = round(sum(elements) / len(elements), 3)
return aver
def weighted_average(elements:list, weights:list):
aver = round(sum([element * weight for element, weight in zip(elements, weights)]) / sum(weights), 2)
return aver
def analysis_weighted_average(elements:list, weights:list):
weighed_element = [(element, weight, round((element * weight)/sum(weights), 5)) for element, weight in zip(elements, weights)]
aver = sum([value[2] for value in weighed_element])
return weighed_element, aver
def variance(elements:list, weights = None, aver_ = None):
if aver_ == None:
if weights == None:
aver = arithmetic_average(elements)
else:
aver = weighted_average(elements, weights)
variance = 1 / len(elements) * sum([(i-aver) ** 2 for i in elements])
return round(variance, 3)
else:
if weights == None:
aver = aver_
else:
aver = aver_
variance = 1 / len(elements) * sum([(i-aver) ** 2 for i in elements])
return round(variance, 3)
def median(elements:list):
num = len(elements)
elements = sorted(elements)
if num >= 3 and num % 2 == 0:
median = round((elements[int(num / 2) - 1] + elements[int(num / 2)]) / 2, 2)
return median
else:
median = elements[int((num - 1) / 2)]
return median
def mode(elements:list, ModeNoneCode = False):
if ModeNoneCode == True:
return '本组数据分布过于分散,众数不明显。\nNo obvious mode availible.', sorted(elements), set(elements)
modes = [[0],[0]]
time_list = [elements.count(i) for i in elements]
for i in range(len(time_list) - 1):
now = time_list[i]; next_ = time_list[i+1]
if now >= next_:
if now > modes[0][0]:
modes[0].pop(0)
modes[1].pop(0)
modes[0].append(now)
modes[1].append(elements[i])
if len(time_list) - 1 == i + 1 and now == next_:
modes[0].append(next_)
modes[1].append(elements[i+1])
elif now == modes[0][0]:
modes[0].append(now)
modes[1].append(elements[i])
if len(time_list) - 1 == i + 1 and now == next_:
modes[0].append(next_)
modes[1].append(elements[i+1])
modes = list(set(modes[1]))
modes.sort()
if len(modes) == 1:
modes = modes[0]
return modes, sorted(elements), set(elements)
class plotters:
None
class inter:
def main_inter():
choice = input(f'''基础数据分析计算器
Version 1.0
Summer Fruit All Rights Reserved.
Time Stamp:
Authorization granted by author Summer Fruit.
{'*'*40}
您好,欢迎使用计算器。
祝您计算愉快。
功能:
(1)分析单组数据,计算其平均数、中位数、众数、方差。
(2)加权分析单组数据,计算其平均数、中位数、众数、方差。
请选择
>>[''')
if '1' in choice:
elements = input('''\n请输入数据列表,并用一个空格隔开每两个数据。\n输入空值以终止进程。
Please type the data list here.\nAnd separate every two numbers with a \'space\'
Type empty data to exit at anytime.\n>>[''').strip().split(' ')
while elements != ['']:
elements, ModeNoneCode = main_.calculators.ErrorRaiser(elements)
aver = main_.calculators.arithmetic_average(elements)
var = main_.calculators.variance(elements, weights = None, aver_ = aver)
med = main_.calculators.median(elements)
if ModeNoneCode == False:
mod, ordered_ele, set_ele = main_.calculators.mode(elements, ModeNoneCode)
mod = [mod,mod]
else:
mod, ordered_ele, set_ele = main_.calculators.mode(elements, ModeNoneCode)
mod = mod.split('\n')
print(f'''平均数: {aver}\n中位数: {med}\n众数: {mod[0]}\n方差: {var}
原始数据列表: {elements}\n有序数据列表: {ordered_ele}\n有序数据集合: {set_ele}\n\n
Average: {aver}\nMedian: {med}\nMode: {mod[1]}\nVariance: {var}
Original data list: {elements}\nOrdered data list: {ordered_ele}\nOrdered data set: {set_ele}
''')
elements = input('\n请输入数据列表。\nType data list here.\n>>[').strip().split(' ')
if elements == ['']:
break
elif '2' in choice:
elements = input('''\n请输入数据列表,并用一个空格隔开每两个数据。\n输入空值以终止进程。
Please type the data list here.\nAnd separate every two numbers with a \'space\'
Type empty data to exit at anytime.\n>>[''').strip().split(' ')
weights = input('''\n请输入权重列表,并用一个空格隔开每两个数据。\n输入空值以终止进程。
Please type the weight list here.\nAnd separate every two numbers with a \'space\'
Type empty data to exit at anytime.\n>>[''').strip().split(' ')
while elements != ['']:
elements, weights, ModeNoneCode = main_.calculators.ErrorRaiser(elements, weights)
aver = main_.calculators.arithmetic_average(elements)
var = main_.calculators.variance(elements, weights, aver)
med = main_.calculators.median(elements)
if ModeNoneCode == False:
mod, ordered_ele, set_ele = main_.calculators.mode(elements, ModeNoneCode)
mod = [mod,mod]
else:
mod, ordered_ele, set_ele = main_.calculators.mode(elements, ModeNoneCode)
mod = mod.split('\n')
print(f'''平均数: {aver}\n中位数: {med}\n众数: {mod[0]}\n方差: {var}
原始数据列表: {elements}\n有序数据列表: {ordered_ele}\n有序数据集合: {set_ele}\n\n
Average: {aver}\nMedian: {med}\nMode: {mod[1]}\nVariance: {var}
Original data list: {elements}\nOrdered data list: {ordered_ele}\nOrdered data set: {set_ele}
''')
elements = input('\n请输入数据列表。\nType data list here.\n>>[').strip().split(' ')
if elements == ['']:
break
users, psws = main_.system_.pack(True, True)
main_.system_.login(users, psws, 5)
inter.main_inter()
第二个是可爱的绘图:绘制正多边形。
import turtle as t
import random as ran
import math as m
import sys
import time as tm
class classic:
def _init_(angle, radius, pencolor = 'black', bgcolor = 'white', pensize = 2, speed = 0):
an = angle; r = radius
t.hideturtle()
t.pencolor(pencolor)
t.bgcolor(bgcolor)
t.pensize(pensize)
t.speed(speed)
t.pu()
t.goto(0, r)
t.seth(180)
t.left(an / 2)
t.pd()
def get_side_lenth(radius, number_of_side):
nos = number_of_side; r = radius
ls = m.sin(m.radians(180 / nos)) * 2 * r
return ls
def get_exterior_angle(nos):
an = 360 / nos
return an
def regular_triangle(ls, an):
for i in range(3):
t.forward(ls)
t.left(an)
print('正三角形(等边三角形)绘画完毕。\nDone.')
def square(ls, an):
for i in range(4):
t.forward(ls)
t.left(an)
print('正四边形(正方形)绘画完毕。\nDone.')
def regular_pentagon(ls, an):
for i in range(5):
t.forward(ls)
t.left(an)
print('正五边形绘画完毕。\nDone.')
def regular_hexagon(ls, an):
for i in range(6):
t.forward(ls)
t.left(an)
print('正六边形绘画完毕。\nDone.')
def regular_heptagon(ls, an):
for i in range(7):
t.forward(ls)
t.left(an)
print('正七边形绘画完毕。\nDone.')
def regular_octagon(ls, an):
for i in range(8):
t.forward(ls)
t.left(an)
print('正八边形绘画完毕。\nDone.')
def regular_nonagon(ls, an):
for i in range(9):
t.forward(ls)
t.left(an)
print('正九边形绘画完毕。\nDone.')
def regular_decagon(ls, an):
for i in range(10):
t.forward(ls)
t.left(an)
print('正十边形绘画完毕。\nDone.')
def regular_100_polygon(ls, an):
for i in range(100):
t.forward(ls)
t.left(an)
print('正一百边形绘画完毕。\nDone.')
class custom:
changer = {3 : '三' , 4 : '四' , 5 : '五' , 6 : '六' , 7 : '七' ,
8 : '八' , 9 : '九' , 10 : '十' , 100 : '一百'}
def _error_raiser_(nos, radius, pensize, speed, pencolor, bgcolor):
if type(nos) != int:
print('下一次请输入一个整数。\nPlease input an integer next time.')
sys.exit()
if nos < 3:
print('下一次请输入一个大于2的整数。\nPlease input an integer bigger than two next time.')
sys.exit()
if type(radius) != int:
if type(radius) != float:
print('下一次请输入一个数值作为半径。\nPlease input a number as the radius next time.')
sys.exit()
if type(pensize) != int:
if type(radius) != float:
print('下一次请输入一个数值作为画笔粗细。\nPlease input a number as the pen size next time.')
sys.exit()
if type(speed) != int:
print('下一次请输入一个整数值作为画笔速度。\nPlease input an integer as the pen speed next time.')
sys.exit()
if type(pencolor) != str:
print('下一次请输入一个有效字符串作为画笔颜色。\nPlease input a useful number as the pen color next time.')
sys.exit()
if type(bgcolor) != str:
print('下一次请输入一个有效字符串作为画布颜色。\nPlease input a useful number as the background color next time.')
sys.exit()
#若半径为0或负数,则使用默认值180。
if radius <= 0:
radius = 180
if pensize <= 0:
pensize = 5
if speed < 0:
speed = 0
if pencolor == 'default':
pencolor = 'black'
if bgcolor == 'default':
bgcolor = 'white'
return radius, pensize, speed, pencolor, bgcolor
def _init_(angle, radius, pencolor = 'black', bgcolor = 'white', pensize = 25, speed = 0):
an = angle; r = radius
t.hideturtle()
t.pencolor(pencolor)
t.bgcolor(bgcolor)
t.pensize(pensize)
t.speed(speed)
t.pu()
t.goto(0, r)
t.seth(180)
t.left(an / 2)
t.pd()
def get_side_lenth(radius, number_of_side):
nos = number_of_side; r = radius
ls = m.sin(m.radians(180 / nos)) * 2 * r
return ls
def get_exterior_angle(nos):
an = 360 / nos
return an
def custom_regular_polygon(number_of_side, lenth_of_side, angle, changer = changer):
nos = number_of_side; ls = lenth_of_side; an = angle
for i in range(nos):
t.forward(ls)
t.left(an)
print(f'正{nos}边形绘画完毕。\nDone.')
class draw:
class main_:
def sample_mode(nos):
if nos not in [3,4,5,6,7,8,9,10,100]:
print('请检查您的输入。此边数不在样板之内。\nPlease check your inputs.It\'s not in samples.')
sys.exit()
ls = classic.get_side_lenth(180, nos)
an = classic.get_exterior_angle(nos)
classic._init_(angle = an, radius = 180)
if nos == 3:
classic.regular_triangle(ls, an)
elif nos == 4:
classic.square(ls, an)
elif nos == 5:
classic.regular_pentagon(ls, an)
elif nos == 6:
classic.regular_hexagon(ls, an)
elif nos == 7:
classic.regular_heptagon(ls, an)
elif nos == 8:
classic.regular_octagon(ls, an)
elif nos == 9:
classic.regular_nonagon(ls, an)
elif nos == 10:
classic.regular_decagon(ls, an)
else:
classic.regular_100_polygon(ls, an)
def custom_mode(nos, radius, pensize, speed, pencolor, bgcolor):
radius, pensize, speed, pencolor, bgcolor = custom._error_raiser_(nos, radius, pensize, speed, pencolor, bgcolor)
ls = custom.get_side_lenth(radius, nos)
an = custom.get_exterior_angle(nos)
custom._init_(radius = radius, angle = an, pencolor = pencolor, bgcolor = bgcolor, pensize = pensize, speed = speed)
custom.custom_regular_polygon(nos, ls, an)
def example(nos, radius, pensize, speed, pencolor, bgcolor):
custom._error_raiser_(nos, radius, pensize, speed, pencolor, bgcolor)
ls = custom.get_side_lenth(radius, nos)
an = custom.get_exterior_angle(nos)
custom._init_(radius = radius, angle = an, pencolor = pencolor, bgcolor = bgcolor, pensize = pensize, speed = speed)
custom.custom_regular_polygon(nos, ls, an)
def inter():
choice = input('请选择绘画模式:\n(1)样板模式\n(2)自定义模式\n\nPlease select drawing mode:\n(1)default mode\n(2)DIY mode\n\n>>[')
if '1' in choice:
nos = input('''在此模式(样板模式)下,您可以选择预先设置好的正多边形绘图作为参考案例,下面是菜单:
In this mode (default mode), you can select the pre-set regular polygon drawing as a reference case. The following is the menu:
(1)正三角形(等边三角形)//regular triangle\n(2)正四边形(正方形)//square\n(3)正五边形//regular pentagon
(4)正六边形//regular hexagon\n(5)正七边形//regular heptagon\n(6)正八边形//regular octagon
(7)正九边形//regular nonagon\n(8)正十边形//regular decagon\n(9)正一百边形//regular polygon of 100 sides
请填写边数。\nPlease input the number of sides.\n>>[''').strip()
try:
nos = int(nos)
except:
print('请正确输入边数。\nPlease input the number correctly.')
sys.exit()
draw.main_.sample_mode(nos)
else:
nos = eval(input('请输入正多边形边数\nnumber of sides\n>>['))
choice = input(f'边数nos:{nos}\n半径r:200\n画笔pen:5,black\n画布paper:white\n速度v:0\n请问是否需要更改参数?(Y/N)>>[').strip().upper()
if 'Y' in choice:
nos = eval(input('请输入正多边形边数\nnumber of sides\n>>['))
radius = eval(input('请输入半径长度\nradius\n>>['))
pensize = eval(input('请输入画笔粗细\npen size\n>>['))
speed = int(input('请输入画笔速度\npen speed\n>>['))
pencolor = input('请输入画笔颜色\npen colour\n>>[').strip().lower()
bgcolor = input('请输入画布颜色\nbackground colour\n>>[').strip().lower()
else:
radius = 200; pensize = 5; speed = 0; pencolor = 'black'; bgcolor = 'white'
draw.main_.custom_mode(nos, radius, pensize, speed, pencolor, bgcolor)
class recorder:
def tm_changer(month):
mon_dict = {1 : 'Jan.', 2 : 'Feb.', 3 : 'Mar.', 4 : 'Apr.',
5 : 'May', 6 : 'Jun.', 7 : 'Jul.', 8 : 'Aug',
9 : 'Sept.', 10 : 'Oct.', 11 : 'Nov.', 12 : 'Dec.'}
return mon_dict[month]
def timer():
year, mon, day, hour, min_, s, wday, yday, isdst = tm.localtime()
return f'{hour}:{min_}:{s}, {day} {tm_changer(mon)}'
class write_in:
def log(info):
with open('system log for regular_polygon.py.txt','a+') as f:
f.write(f'{info}\n\t{recorder.timer()}')
f.close()
def diary(info):
with open('using diary for regular_polygon.py.txt','a+') as f:
f.write(f'{info}\n\t{recorder.timer()}')
f.close()
class read:
def log(info):
with open('system log for regular_polygon.py.txt','a+') as f:
log_read = f.read()
return log_read
def diary(info):
with open('using diary for regular_polygon.py.txt','a+') as f:
diary_read = f.read()
return diary_read
if __name__ == '__main__':
choice = input('欢迎使用正多边形绘图器,使用主功能请输入1,查看绘图范例请输入2。\n>>[')
if '1' in choice:
draw.inter()
else:
print('\n\n下面是调用示例:')
#color = {0:'', 1:'', 2:'', 3:'', 4:''}
for i in range(8):
draw.example(10 - i, 200 - i * 20, 4, 10, 'white', 'gold')
t.exitonclick()
#正多边形画图器 V3.5
#创建日期 3 Oct, 2022
最后是一个好玩的程序,自问自答的自助问答器,基础版本,只有问询功能。
import time
import os
class tmp:
type_ = 'tmp_obj_set'
class examples:
example_while_input = None
class Tools:
def while_input(prompt:str = '',
while_ = True,
strip = True,
default_output:list = ['SystemRecord**未接收到内容**'],
ordinal_system = True,
ordinal_system_code = 1,
self = tmp):
'ordinal system dict => {1: normal number range, 2: 汉字, 3: letters}'#逗你玩儿
results = []
if strip == True:
strip_func = '.strip()'
else:
strip_func = ''
if while_ == True:
prompt = f'{prompt}\n(1)'
func = f'self.word = input(prompt){strip_func}'
exec(func)
count = 1
while self.word.strip() != '':
count += 1
results.append(self.word)
prompt = f'({count})'
func = f'self.word = input(prompt){strip_func}'
exec(func)
else:
func = f'self.word = input(prompt){strip_func}'
exec(func)
results.append(self.word)
if len(results) > 1:
if ordinal_system == True:
results = ['(%s)%s'%(num,i) for i,num in zip(results,range(1,len(results)+1))]
if results == [] or ''.join(results).strip() == '':
return default_output
return results
def prepare():
results = []
key = '1'
while key != '':
name = input('请输入项目名称:')
key = input('请输入对应提示语:')
results.append(name)
results.append(key)
results.pop(-1)
results.pop(-1)
filename = input('请输入储存文件名称:')
return results, filename
def ask(args):
if len(args) % 2 != 0:
raise Exception('ValueError\nThe arguments should be in pairs of two.')
tm = [time.asctime()]
arg_names = [args[num - 1] for num in range(1, len(args), 2)]
arg_prompts = [args[num] for num in range(1, len(args), 2)]
arg_pairs = {'记录时间':tm}
for arg_name, arg_prompt in zip(arg_names, arg_prompts):
prompt = '%s?' % arg_prompt
arg_pairs[arg_name] = Tools.while_input(prompt)
return arg_pairs
def save_report(arg_pairs, file_name = 'Test'):
tm = arg_pairs['记录时间'][0]
tm2 = tm.replace(' ','-',tm.count(' ')).replace(':','_',tm.count(':'))
filename = f"{file_name}.txt"
with open(filename,'w') as f:
content = zip(list(arg_pairs.keys()),list(arg_pairs.values()))
for name, lst in content:
f.write(f'{name}:\n\n')
for val in lst:
f.write(f'{val}\n')
f.write('\n\n\n')
f.close()
return filename
def save_pack(arg_pairs):
filename = 'packhere.txt'
with open(filename,'a+') as f:
f.write(str(arg_pairs)+'\n')
f.close()
return filename
def read_pack():
filename = 'packhere.txt'
with open(filename,'r') as f:
content = f.readlines()
f.close()
if '\n' in content:
content = content.remove('\n')
content = [''.join(list(i)[:-1]) for i in content]
dct = {num:item for num, item in zip(range(1, len(content) + 1), [eval(i) for i in content])}
return dct
def inter():
args, filename = prepare()
arg_pairs = ask(args)
report_name = save_report(arg_pairs, filename)
pack_name = save_pack(arg_pairs)
print(f'''\n\n\n数据报告已经生成,见工作路径下<<{report_name}>>文件。
数据包已经生成,见工作路径下<<{pack_name}>>文件。''')
if __name__ == '__main__':
inter()
#Version: V.Test.1.0
#Create Date: 4 Feb, 2023
计划于7、8月份密集学习和创作。