计算机程序最大的优势就是可以迭代和重现,作者“苦笑”在上了几次课结合自己课下学习,完成了这个汇率兑换的功能。虽然有些粗糙,但整个程序非常流畅与规范,定义函数,实现常规程序语句,主函数调用等等,是初学Python的同学用于训练的好例子。
A.想做的事情: 在网站上爬取到美元人民币的实时汇率,然后再设计一个汇率换算器的程序,其功能是实现人民币(CNY)与美元(USD)之间的汇率转换,要先判断输入的是美元还是人民币,然后进行相应的转换计算。并且为了用户的方便,要使程序可以一直运行,直到用户选择退出。

B.程序设计流程图:

C.算法的实现及解读:
1#首先,要先在网上爬取美元人民币实时汇率,需要使用三个模块,其命令如下:
2import re
3import json
4import urllib.request
5#这三个模块可以爬取网站上我们所需要的的数据,保存到本地,并转化成程序可#识别的字符。
6url="http://webforex.hermes.hexun.com/forex/quotelist?code=FOREXUSDCNY&column=Code,Price"
7#选择网站api接口,网站是和讯外汇的行情数据网址为:http://quote.forex.hexun.com/USDCNY.shtml
8req = urllib.request.Request(url)
9f = urllib.request.urlopen(req)
10#向指定的url发送请求,并返回服务器响应的类文件对象
11html = f.read().decode("utf-8")
12#读取文件内容,并将utf-8编码表示的字符串转换为Unicode字符串
13s = re.findall("{.*}",str(html))[0]
14#使用正则表达式,在字符串中匹配出我需要的汇率字符串{"Data":[[["USDCNY",71099]]]}
15sjson = json.loads(s)
16#反序列化;把json字符串转化成python
17USDCNY = sjson["Data"][0][0][1]/10000
18print('当前美元人民币实时汇率为: {}人民币/美元'.format(USDCNY))
19#将爬取出的汇率赋值给USDCNY并输出结果
20#然后,流程图,首先我们需要判断用户是否需要继续使用,可以使用以下几行代码:
21currency_str_value = input('请输入带单位(USD或者CNY)的货币金额(退出程序请输入Q):')
22while currency_str_value != 'Q':
23print('程序已退出')
24#当用户选择继续使用时,我们直接在第二行代码循环语句while中继续判断是人民币还是美元,代码如下:
25 unit = currency_str_value[-3:] #获取货币单位
26 if unit == 'CNY': #当货币单位是人民币时
27 exchange_rate = 1 / USD_ #汇率为1/6.77
28 elif unit == 'USD': #当货币单位是美元时
29 exchange_rate = USD_VS_RMB #汇率为6.77
30 else: #当为其他的货币单位时
31 exchange_rate = -1 #汇率为-1
32 if exchange_rate != -1: #当汇率不是-1时
33 in_money = eval(currency_str_value[:-3]) #获取输入货币的值convert_currency2 = lambda x:x * exchange_rate #用lambda函数
34 out_money = convert_currency2(in_money)
35 #调用lambda函数,进行汇率换算
36 print('转换后的金额:', out_money)
37#输出换算后的金额
38 else: #当汇率为-1
39 print('不支持该种货币!')
40 currency_str_value = input('请输入带单位(USD或者CNY)的货币金额(退出程序请输入Q):')
41#这样我们就实现了人民币与美元间的汇率转换,由于要使用函数,使程序模块化,可以将上述所以代码放进主函数main中,最后调用这个函数即可。
42#代码是:
43def main():
44if __name__ == '__main__':
45 main()
D.相关知识点:
1.input,print是输入输出
2.while循环语句:
结构:
while 判断条件:
执行语句……
判断所给的条件,对于符合其所给的条件,就循环执行其执行语句,不符合就不执行其执行语句
3.if 条件语句:
结构:
if 判断条件:
执行语句……
else:
执行语句……
4.eval() 函数用来执行一个字符串表达式,并返回表达式的值。
5.lambda函数 用于简单的,能在一行内表示的函数
函数名=lambda参数列表:表达式,直接输出表达式的结构
6.注释,单行直接用#,多行”””
7.使用函数的优势:
○1便于阅读和复用,○2对一组表达特定功能表达式的封装,○3使程序模块化,这样不仅有助于代码的检测,同时使得你编写的代码不至于那么繁多复杂,便于观看。
8.re模块,json模块和urllib.request模块的使用,相关内容和使用方法可以直接在网站上查询
9.{n} .format(),形式为n(n为整数)的占位符将被format()第n个参数所代替。例如:
print('当前美元人民币实时汇率为: {}人民币/美元'.format(USDCNY)),输出结果为:
当前美元人民币实时汇率为: 7.1099人民币/美元
E. 完整代码:
1import re
2import json
3import urllib.request
4
5#获取美元人民币的实时汇率
6def USD_VS_RMB():
7 """
8 在网站爬取美元与人民币的实时汇率
9 """
10 url = "http://webforex.hermes.hexun.com/forex/quotelist?code=FOREXUSDCNY&column=Code,Price"
11 req = urllib.request.Request(url)
12 f = urllib.request.urlopen(req)
13 html = f.read().decode("utf-8")
14
15 s = re.findall("{.*}", str(html))[0]
16 sjson = json.loads(s)
17 USDCNY = sjson["Data"][0][0][1] / 10000
18 print('当前美元人民币实时汇率为: {}人民币/美元'.format(USDCNY))
19return USDCNY
20
21
22def main():
23 """
24 主函数
25 """
26 #调用实时汇率
27 USDCNY = USD_VS_RMB()
28
29 #带单位的货币的输入
30 currency_str_value = input('请输入带单位(USD或者CNY)的货币金额(退出程序请输入Q):')
31
32 while currency_str_value != 'Q':
33
34 #获取货币单位
35 unit = currency_str_value[-3:]
36
37 #判断人民币还是美元
38 if unit == 'CNY':
39 exchange_rate = 1 / USDCNY
40
41 elif unit == 'USD':
42 exchange_rate = USDCNY
43
44 else:
45 exchange_rate = -1
46
47 if exchange_rate != -1:
48 in_money = eval(currency_str_value[:-3])
49
50 #使用lambda定义函数
51 convert_currency2 = lambda x: x * exchange_rate
52
53 #调用lambda函数
54 out_money = convert_currency2(in_money)
55
56 print('转换后的金额:', out_money)
57 else:
58 print('不支持该种货币!')
59 print('************************')
60 currency_str_value = input('请输入带单位(USD或者CNY)的货币金额(退出程序请输入Q):')
61 print('程序已退出')
62
63#调用函数
64if __name__ == '__main__':
65 main()
F. 结果显示:


