在python中使用大量嵌套语句时改进代码
最近,我在上了一些关于Matlab的课程(主要集中于使用数学计算和绘图)之后开始使用Python 3,我仍然是一个非常初学者。 然而,我认为创建一个计算器来计算口袋妖怪的数量会很有趣,你可以使用口袋妖怪中可用的糖果,然后使用Tkinter作为GUI。该程序运行良好,效果良好。然而,我正在努力改进我的编码,这段代码包括许多嵌套的if和while语句,以及其他广泛的变量和参数使用。我想知道如何将这段代码改进为更“pythonic”的代码,或者这是否是创建这样一个程序的正确方法。 先谢谢你在python中使用大量嵌套语句时改进代码,python,python-3.x,tkinter,nested,Python,Python 3.x,Tkinter,Nested,最近,我在上了一些关于Matlab的课程(主要集中于使用数学计算和绘图)之后开始使用Python 3,我仍然是一个非常初学者。 然而,我认为创建一个计算器来计算口袋妖怪的数量会很有趣,你可以使用口袋妖怪中可用的糖果,然后使用Tkinter作为GUI。该程序运行良好,效果良好。然而,我正在努力改进我的编码,这段代码包括许多嵌套的if和while语句,以及其他广泛的变量和参数使用。我想知道如何将这段代码改进为更“pythonic”的代码,或者这是否是创建这样一个程序的正确方法。 先谢谢你 f
from tkinter import *
from tkinter import messagebox
def EvolveCalc():
title = "Pokemon evolve calculator"
Poke = var.get()
Candies_total = Candies.get()
PAmount = Poke_amount.get()
if Poke == 'Pokemon':
messagebox.showinfo(title,
"Please select a Pokemon from the dropdown menu")
elif not PAmount.isdigit():
messagebox.showinfo(title, "Please only enter numbers")
elif not Candies_total.isdigit():
messagebox.showinfo(title, "Please only enter numbers")
else:
Candies_total = int(Candies.get())
PAmount = int(Poke_amount.get())
Evolve = int((Candies_total - 1) / (Pokedex[Poke] - 1))
Candies_needed = (PAmount * (Pokedex[Poke] - 1)) + 1
if PAmount < Evolve:
n = 0
while Candies_needed <= Candies_total:
n = n + 1
PAmount = PAmount + 1
Candies_needed = ((PAmount) * (Pokedex[Poke] - 1)) + 1
Candies_total = Candies_total + 3
Evolve2 = int((Candies_total - 1) / (Pokedex[Poke] - 1))
String1 = '''You have enough candies too evolve {0} {1},
but you only have {2} {1} in storage and thus can only
evolve {2} {1} If you catch {3} more {1} you can now
evolve {4} {1}.'''
messagebox.showinfo(title, String1.format(Evolve, Poke,
Poke_amount.get(),
n, Evolve2))
else:
m = 0
while Candies_total <= Candies_needed:
m = m + 1
PAmount = PAmount - 1
Candies_needed = ((PAmount) * (Pokedex[Poke] - 1)) + 1
Candies_total = Candies_total + 1
Evolve2 = int((Candies_total - 1) / (Pokedex[Poke] - 1))
String2 = 'Transfer {0} {1} so you can evolve a total of {2} {1}.'
messagebox.showinfo(title, String2.format(m, Poke, Evolve2))
root = Tk()
Pokedex = {'pidgey': 12,
'caterpie': 12,
'weedle': 12
}
root.title("Pokemon evolve calculator")
var = StringVar(root)
var.set('Pokemon')
choices = Pokedex.keys()
Pokemon = OptionMenu(root, var, *choices)
Pokemon.grid(column=0, row=1)
L1 = Label(root, text='Candies')
L1.grid(column=1, row=0)
Candies = Entry(root)
Candies.grid(column=1, row=1)
L2 = Label(root, text='Pokemon amount in storage')
L2.grid(column=2, row=0)
Poke_amount = Entry(root)
Poke_amount.grid(column=2, row=1)
Calculate = Button(root, text='Calculate', command=EvolveCalc)
Calculate.grid(column=1, row=2)
root.mainloop()
从tkinter导入*
从tkinter导入消息框
def EvolveCalc():
title=“口袋妖怪进化计算器”
Poke=var.get()
Candies_total=Candies.get()
PAmount=Poke_amount.get()
如果Poke==“口袋妖怪”:
messagebox.showinfo(标题,
“请从下拉菜单中选择一个口袋妖怪”)
如果不是PAmount.isdigit():
messagebox.showinfo(标题“请仅输入数字”)
elif not Candies_total.isdigit():
messagebox.showinfo(标题“请仅输入数字”)
其他:
Candies_total=int(Candies.get())
PAmount=int(Poke_amount.get())
Evolve=int((糖果总量-1)/(Pokedex[Poke]-1))
所需糖果=(PAmount*(Pokedex[Poke]-1))+1
如果PAmount使用小写和下划线分隔的函数,以便EvolveCalc
将是evolve\u calc
使用小写和可读变量,使Poke
和Candies\u total
变为Poke
和total\u Candies
这段代码可以简化
elif not PAmount.isdigit():
messagebox.showinfo(title, "Please only enter numbers")
elif not Candies_total.isdigit():
messagebox.showinfo(title, "Please only enter numbers")
到
您的Pokedex
可以格式化,因此更具可读性
Pokedex = {'pidgey': 12,
'caterpie': 12,
'weedle': 12
}
到
我无法运行您的代码,因为它的格式不正确。第一个else
块完成后,空格将关闭
其他建议:
- 阅读PEP8
- 查看代码示例
- 编写可在函数中封装的小型可重用代码
- 添加注释来解释你的一些数学知识
这个问题可能更适合在“感谢您的评论和建议”会议上提出。我调整了代码,所以如果您感兴趣,您应该能够运行它。将else块替换为intstance将意味着将该函数置于主函数之外,并从主函数内部调用它?之前的实验给我带来了麻烦,因为python中的变量不是全局变量,而且由于我不断更新while循环中的变量,所以每次都必须重新定义每个变量,对吗?如果这听起来让人困惑,对不起。
Pokedex = {'pidgey': 12,
'caterpie': 12,
'weedle': 12
}
Pokedex = {
'pidgey': 12,
'caterpie': 12,
'weedle': 12
}