场景编程集锦 - 世界那么大,我想去看看

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了场景编程集锦 - 世界那么大,我想去看看相关的知识,希望对你有一定的参考价值。

场景描述

  “世界那么大,我想去看看”。这句话出自于一位中学老师的辞职申请,整个辞职信只有短短10个字,它被喻为史上最具情怀的辞职信。如此任性的辞职信,领导最后真批准了。随着辞职信内容爆光,“世界那么大,我想去看看”迅速爆红网络,形成现象级传播,引发无数网友共鸣和传颂。或许人生就是为了领略更多的精彩,在中国古时候就有读万卷书,不如行万里路的名言,明代旅行家徐霞客更是穷尽一生,游历华夏大好河山。   现在,随着物质生活水平的不断提高,人们追求美好生活的向往正在变为现实。“世界那么大,我想去看看”,走出国门,环游世界成为许多国人心中的梦想和美好愿景。那些闻名于世的旅游圣地:科罗拉多大峡谷、浪漫爱情海、澳洲大堡礁、薰衣草故乡普罗旺斯、万种风情的巴厘岛、印度泰姬陵、埃及胡夫金字塔、法国埃菲尔铁塔、俄罗斯的贝加尔湖和莫斯科红场等等,每年都吸引着数以千万游客前来观光旅游。如果你将来有计划出境旅游,那么兑换外币一定是旅游攻略中必不可少的重要内容。下面我们选取出国旅行中的外币兑换场景,使用Python语言编写一个兑换外币的程序。千万不要认为这是一件简单的编程工作,事实上这也是一件具有挑战性的编程任务。

编程思路

2.1 获取外汇牌价

  本程序的难点在于如何实时地获取到外汇牌价信息,其实有许多银行的门户网站均提供实时外汇牌价信息。本案例中我们可以编写一个爬虫程序,从中国银行外汇牌价网站(http://m.waihuipaijia.cn)获取实时的汇率牌价,这是解决问题的关键所在。

  以上图片是中国银行外汇牌价网主页的部分截图。有几个关于外汇的概念,我们有必要简单了解一下,这是正确编写程序的基础。根据我国现行的外汇管理条例,中国公民购买卖外汇只能去具有外汇业务资质的银行办理。中国银行外汇牌价表中卖出价是指银行将外币卖给个人的报价,反之买入价是指银行出价购买个人持有外币的报价。外币分为现钞和现汇两种。如果你需要出国留学,从国内转账汇款到境外,那么你就必须购买现汇;如果你是要出境旅游,则可购买现钞随身携带,需要注意的是携带现钞数量是有限制的,而且存在安全隐患。通常现钞比现汇的卖出价更高,这是因为现钞有管理成本,例如押运、金库存放等成本。好了,有了以上概念之后,针对出国旅游的应用场景,爬虫程序需要爬取现钞卖出价一栏的数据。

2.2 货币表示

  一般来说我们要使用整数表示货币,以避免运算误差。在本案例中,为了简化编程工作,我们暂时使用浮点数表示汇率参与运算。要彻底解决好这个问题,我们将此留待程序优化一节中考虑。

2.3 外汇兑换币种

  本版程序暂时支持人民币与美元,英镑,欧元,日元,澳元兑换。

程序代码

  程序由两个模块构成。一是exchange_rate.py,它实际上是一个爬虫程序,用于从中国银行外汇牌价网站获取汇率信息;另一个是exchange.py是外汇兑换的主程序。其程序代码如下: 爬虫程序:exchange_rate.py 程序代码如下:

"""
  exchange_rate.py : 从中国银行外汇牌价网站获取汇率
"""
import sys
import requests
import bs4

url = http://m.waihuipaijia.cn
headers = 
        User-Agent: Mozilla/5.0 (Linux; android 6.0; Nexus 5 Build/MRA58N) 
                      AppleWebKit/537.36 (Khtml, like Gecko) Chrome/90.0.4430.212 Mobile Safari/537.36

currency = 
    美元: m_meiyuan.htm,
    英镑: m_yingbang.htm,
    欧元: m_ouyuan.htm,
    日元: m_riyuan.htm,
    澳元: m_aodaliyayuan.htm


def exchange_rate(name):
    """
    实时获取汇率表的中行折算价
    name: 货币名称
    """
    # 下载网页
    res = requests.get(url, headers=headers)
    try:
        res.raise_for_status()
    except Exception as exc:
        print(错误:0.format(exc))
        sys.exit(1)
    
    res.encoding = utf8   # ①
    soup = bs4.BeautifulSoup(res.text, html.parser)   # ②
    sel_str = a[href="+url+/+currency[name]+"]   # ③
    elements = soup.select(sel_str)[0].parent.next_siblings   # ④
    elements = [e for e in elements if e != \\n]  # ⑤
    price = float(elements[3].getText())   # ⑥ 
    return price

主要语句说明如下: 语句①处理中文网页,这个设置可以处理网页中的中文字符。 语句②使用html.parser解析器对下载的网页内容进行解析。 语句③构造选择器字符串。 语句④筛选指定a标签的父节点其后的所有兄弟节点。 语句⑤过滤换行字符。 语句⑥获取现钞卖出价。 外汇兑换程序:exchange.py 代码如下所示:

"""
  exchange.py : 世界那么大我想去看看 -人民币外汇兑换
"""
from common.exchange_rate import *
from datetime import datetime

def menu():   # ①
    while True:
        for name in currency.keys():   # ②
            print(name, end=,)
        print(\\b:)
        name = input(选择币种:)
        if name in currency.keys():   # ③
            break
    return name

def main():
    name = menu()
    while True:   # ④
        try:
            money = float(input(兑换金额:))
            break
        except ValueError:
            print(输入数据有误!)

    price = exchange_rate(name) / 100.00
    today = datetime.now()
    print(今天日期:, today.strftime(%Y-%m-%d %H:%M:%S))   # ⑤
    print(现钞卖出:, round(price * 100, 2))
    rmb_money = money * price
    print(兑换 0 (1) = 2:.2f 元 (人民币).format(money, name, rmb_money))   # ⑥

if __name__ == __main__:
    main()

重要语句如下所示: 语句①定义具有容错机制的币种显示菜单函数。 语句②循环显示币种菜单项。 语句③判断输入币种的有效性。 语句④带容错功能的数据输入,这里输入兑换外币的金额。 语句⑤格式化打印今天的日期和时间,因为汇率实时在变更。 语句⑥格式化打印兑换结果。

执行效果

  本程序是由两个部分组成。一个是存放在Python包common中的程序模块exchange_rate.py,它是用于实时从中国银行外汇牌价网上获取汇率信息;另一个则是主程序exchange.py进行外币兑换计算和打印结果。

4.1 程序目录

D:\\cases\\世界那么大,我想去看看>dir
2022/12/15  13:29    <DIR>          common
2022/12/15  13:29               958 exchange.py

D:\\cases\\世界那么大,我想去看看>

其中common是Python的包文件

D:\\cases\\世界那么大,我想去看看>cd common
D:\\cases\\世界那么大,我想去看看\\common>dir
2022/12/15  13:29             1,361 exchange_rate.py
2022/04/01  07:34               106 __init__.py

D:\\cases\\世界那么大,我想去看看\\common>

4.2 环境安装

因本程序需要安装第三方库requests, beautifulsoup4支持,所以我们需要单独安装这两个库。

pip3 install requests -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
pip3 install Beautifulsoup4 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

4.3 运行效果

下面演示了两种情况,分别兑换5000美元和5000英镑的程序执行过程。 兑换5000美元:

D:\\cases\\世界那么大,我想去看看>python exchange.py
美元,英镑,欧元,日元,澳元:
选择币种:美元
兑换金额:5000
今天日期: 2022-12-15 13:26:10
现钞卖出: 697.84
兑换 5000.0 (美元) = 34892.00 元 (人民币)

兑换5000英镑:

D:\\cases\\世界那么大,我想去看看>python exchange.py
美元,英镑,欧元,日元,澳元:
选择币种:英镑
兑换金额:5000
今天日期: 2022-12-15 13:26:31
现钞卖出: 869.23
兑换 5000.0 (英镑) = 43461.50 元 (人民币)

(cases) D:\\cases\\世界那么大,我想去看看>

  另外在此特别需要说明的情况,如果你执行程序出错,不能获取外汇牌价网信息的话,最有可能的原因是这个网站对通过无线网络的访问请求有所限制,你需要通过有线网络接入互联网,才能正确访问中国银行外汇牌价网站。这也是我在调试本案例程序时发现的这个问题。

程序优化

  从一般意义上讲,这一版本程序能够满足外币兑换的需求,但是程序还是有一些优化的空间。例如你可以使用整数来表示货币,以避免货币兑换中的误差,如果这样的话,这个程序就更加完美了。另外,我们可以增加更多的外汇兑换的币种,可以进一步增强程序的实用性。有兴趣的读者可以自行完成这个具有挑战性的任务,祝你好运!  

以上是关于场景编程集锦 - 世界那么大,我想去看看的主要内容,如果未能解决你的问题,请参考以下文章

世界这么大,Python 也想去看看

世界这么大,我想去看看!!!

抖音旅游号创作思路,变现方式都有哪些?

深度学习应用实战案例-员工流失预测模型(Python源代码)

为什么银行的现钞买入价低于现汇买入价?

场景编程集锦-乒坛争锋:孙颖莎vs伊藤美城