python新手代码问题?

2025-05-14 18:47:16
推荐回答(5个)
回答(1):

判断元素与集合归属关系可以直接用in,python内建的循环会帮你处理比较:

国家="中国"

a = ["美国","加拿大","澳大利亚"]

b = ["中国","日本","印度"]


if 国家 in a:

    print("a")

elif 国家 in b:

    print("b")

else:

    print("ERROR")

用python做图形界面,然后还要发布为应用程序的话,有很多框架,比如Qt for Python,也就是常说的PyQt。比较推荐这个,因为算是目前比较流行的,而且不难入门,具体可以在百度上搜Qt或者PyQt,到官网去下载框架。

PyQt下载:https://riverbankcomputing.com

一些教程:

http://code.py40.com/1948.html(这个是翻译的)

http://zetcode.com/gui/pyqt5/(这个是源教程)

当然还有很多,网上搜PyQt教程就可以。

回答(2):

最小的改动是,将每个区做成一个列表,然后if 的条件就可以简化。

group_1 = ['香港', '澳门']

...

if 国家 in group_1:

...


然后,还有可以进一步优化的空间。

因为除了首重和运费基数不同外,计算公式是不变的,不需要用一组if...elif。

在python中有高阶函数可以对列表进行高阶运算,包括对列表所有元素进行同样运算的map(),以及对列表进行过滤的filter()。

因此,将一组国家做成一个字典,包含国家列表,基础运费,运费基数信息,将所有分组放到一个列表,然后只需要使用filter()对列表过滤来找到相应的分组,将基础运费和运费基数代入固定公式计算即可。

汇率 = 7

地区分组 = [

....{'国家':['香港', '澳门'], '基础运费':78, '运费基数':18},

....

....]

for  地区 in filter(lambda _:国家 in _['国家'], 地区分组):

....运费 = 地区['基础运费'] 

....if 重量>0.5:

........运费 += 地区['运费基数'] * (重量-0.5) * 2

....print(运费 // 汇率)


这样,整个计算部分就只有5行(for之前的都是数据)


再进一步的优化,就是对公式进行优化。这个if并不是必需的。

对计算公式的理解,应该是可以换成另一种等价的表述:

不同地区运费的计算是起运费用+重量费用,重量不足0.5公斤的按0.5公斤计算。

然后,把公斤换成斤,就不需要考虑小数了;

以及,使用math.ceil()进行向上取整,配合max(),就不需要if了,那么,可以用一个map来进行列表计算:


from math import ceil

汇率 = 7

地区分组 = [

....{'国家':['香港', '澳门'], '基础运费':60, '运费基数':18},

....

....]

for  地区 in filter(lambda _:国家 in _['国家'], 地区分组):

....运费 = 地区['基础运费'] + max(ceil(重量), 1) * 地区['运费基数']

....print(运费 // 汇率)

就这样,只需要三行,就完事了。

如果想要极限,可以用map()来处理filter的结果,那就只需要一行代码,但是难看点:

...

print(list(map(lambda 地区: (地区['基础运费'] + max(ceil(重量), 1) * 地区['运费基数'])//汇率,filter(lambda 地区:国家 in 地区['国家'], 地区分组)))[0])

回答(3):

# -*- coding: utf-8 -*-
"""
Created on Mon Aug 31 10:38:03 2020

@author: Roy
"""

from tkinter import*

#分区
Group_list = [
{'Country':['香港', '澳门'], 'freight':78, 'base':18},#一区
{'Country':['韩国', '台湾'], 'freight':108, 'base':24},#二区
{'Country':['马来西亚', '菲律宾','新加坡','泰国','越南','印度尼西亚'], 'freight':114, 'base':27},
{'Country':['日本'], 'freight':126, 'base':33},
{'Country':['澳大利亚', '新西兰'], 'freight':126, 'base':33},
{'Country':['加拿大', '美国'], 'freight':168,'base':38},
{'Country':['荷兰', '英国','比利时','德国'], 'freight':168, 'base':38},
{'Country':['奥地利', '卢森堡','挪威','丹麦','芬兰','法国','爱尔兰','意大利','葡萄牙','西班牙','瑞典','瑞士'], 'freight':168, 'base':38},
{'Country':['保加利亚','拉托维尔','立陶宛','爱沙尼亚','匈牙利','波兰','罗马尼亚','斯洛伐克','斯洛文尼亚','土耳其','希腊'], 'freight':273, 'base':72},
{'Country':['波斯尼亚和黑山','塞尔维亚','俄罗斯','格陵兰岛','列支敦士登'], 'freight':273, 'base':72},
{'Country':['阿联酋','巴林','以色列','沙特阿拉伯'], 'freight':201, 'base':60},
{'Country':['南非', '也门','埃及','伊拉克','伊朗','约旦','科威特','黎巴嫩','阿曼','巴勒斯坦','卡塔尔','叙利亚'], 'freight':273, 'base':72},
{'Country':['孟加拉', '印度','斯里兰卡','尼泊尔','巴基斯坦'], 'freight':180, 'base':48},
{'Country':['阿根廷', '巴西','智利','哥伦比亚'], 'freight':201, 'base':60}
]

def gen():
country = entry.get()
weight = entry2.get()
for location in filter(lambda group:country in group['Country'],Group_list):
if int(weight) > 0.5:
sum_price = float(location['freight']) + float(location['base']) *(float(weight)-0.5)
exchange_price = sum_price//7
else:
sum_price = float(location['freight']) + float(location['base']) *float(weight)
exchange_price = sum_price//7
label_str.set('RMB:' + str(sum_price) + ' $:'+ str(exchange_price))

#界面
tk =Tk()

entry_var =StringVar()
entry_var2 =StringVar()
label_str =StringVar()

tk.title('外貌运费计算器')
winWidth = 360
winHeight = 200
# 获取屏幕分辨率
screenWidth = tk.winfo_screenwidth()
screenHeight = tk.winfo_screenheight()

x = int((screenWidth - winWidth) / 2)
y = int((screenHeight - winHeight) / 2)

# 设置窗口初始位置在屏幕居中
tk.geometry("%sx%s+%s+%s" % (winWidth, winHeight, x, y))

frame1 = Frame(tk)
frame1.pack(anchor = W,padx =3,pady=3)
label =Label(frame1,text ='国家:')
label.pack(side=LEFT,padx =3,pady=3)
entry = Entry(frame1,textvariable = entry_var,width = 20)
entry.pack(side=LEFT,padx =3,pady=3)

frame3 = Frame(tk)
frame3.pack(anchor = W,padx =3,pady=3)
label =Label(frame3,text ='重量:')
label.pack(side=LEFT,padx =3,pady=3)
entry2 = Entry(frame3,textvariable = entry_var2,width = 20)
entry2.pack(side=LEFT,padx =3,pady=3)

frame2 = Frame(tk)
frame2.pack(anchor = W,padx =3,pady=3)
button =Button(frame2,text ='生成',command=gen)
button.pack(side=LEFT,padx =3,pady=3)
label =Label(frame2,textvariable = label_str,bg='lightyellow',width =20)
label.pack(side=LEFT,padx =3,pady=3)

frame4 = Frame(tk)
frame4.pack(anchor = 'center',padx =3,pady=3)
label =Label(frame4,text='1.请输入完整中文国家名\n2.请输入包裹重量,输入为0.5kg的整数倍,不足0.5kg按0.5kg算')
label.pack(side=LEFT,padx =3,pady=3)

tk.mainloop()

带窗口小程序,缩进自己改改吧,界面凑合看。

回答(4):

作为一个比你稍老一点的新手,给你几点建议:

1、变量名不要使用中文;
2、注意控制程序的复杂度,可以将程序的多个步骤分别封装到相应的函数;
比如,你的这个程序可以写成两个函数,一个通过国家名获取相应运费数据;另一个用来处理实际运费计算。当然如果你要写一个实际可用的程序的话,需要考虑的问题会更多一些;比如你需要考虑用户输入的问题,这时你就可以考虑将输入单独重写成一个函数,独立处理从而可以减少程序的复杂度。
3、就你的这个程序,我建议将国家按照分区存放于列表类似于`[["香港", "澳门"], ["韩国", "台湾"], ...]`,得到列表的下标就得到了国家相应的分区,然后将分区对应的运费做成一个列表,通过上面得到的分区信息去获得对应的运费信息,最后根据具体的重量计算就ok啦。

4、最后你想把程序做成界面程序供他人使用,其他回答也提到了用tkinter和pyinstaller这两个第三方库;希望你能得偿所愿。。

回答(5):

第一个问题,就是个逻辑判断,存在与否就可以了,就是写业务。
第二个问题,你是想写一个exe。你也许不太理解啥是exe。不过我可以给你说有个包py2exe 可以把程序打包成window下的运行主入口。还有你想的是写个软件。其实大多时候我们都是要写后台程序提供web界面的。你可以了解下flask、django、web包