基于Flask+Bootstrap+机器学习的世界杯比赛预测系统

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


目录

一、项目介绍

1.1项目简介

1.2技术工具

1.3页面概述 

二、项目步骤

2.1首页模块

2.2查看历年数据板块

2.3预测板块

2.4app.py

三、项目总结


一、项目介绍

1.1项目简介

         本项目使用Flask框架搭建基于机器学习的世界杯比赛预测系统 (简易版)

其中关于Flask知识点可参考文章Flask全套知识点从入门到精通,学完可直接做项目

关于基于机器学习的世界杯比赛预测模型可参考文章基于决策树算法构建世界杯比赛预测模型 

整个项目分为以下几个模块:

  • 1.首页板块
  • 2.展示往届数据板块
  • 3.预测球队胜率板块

项目文件框架如下:

其中manager.py为主程序,password.csv为存储用户账号密码的文件,lianjia是房租价格原始数据集,model.pkl是经过机器学习算法训练出的模型。 

1.2技术工具

IDE编辑器:vscode

后端框架:Flask

前端框架:Bootstrap

1.3页面概述 

运行app.py程序后,浏览器打开http://127.0.0.1:5000/

映入眼帘的就是首页板块,主要就是项目的名称。

 点击导航栏中的查看历年数据页面

 点击导航栏中的预测胜率页面

 在预测页面输入两只球队的名称即可进行预测,比如我这里让他预测阿根廷VS法国的胜率

输入名称后点击预测出现以下预测结果

Chance for Argentina to win France is 48.31226915281593
Chance for France to win Argentina is 30.51025652600164
Chance for Argentina and France draw is 21.17747432118242
 

第一行表示阿根廷赢法国的概率为48.31%

第二行表示法国赢阿根廷的概率为30.51%

第三行表示阿根廷和法国平局的概率为21.18%

二、项目步骤

2.1首页模块

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>首页</title>
    <link rel="stylesheet" href="../static/bootstrap.min.css">
    <link rel="stylesheet" href="../static/main.css">

</head>
<body>
    <div class="container">
        <nav class="navbar navbar-expand-lg navbar-light bg-light">
            <a class="navbar-brand" >首页</a>
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
              <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
              <div class="navbar-nav">
                <a class="nav-link" href="{{url_for('display_data')}}">查看历年数据</a>
                <a class="nav-link" href="{{url_for('my_predict')}}">预测胜率</a>
              </div>
            </div>

          </nav>
          <h1 style="margin-top: 200px;margin-left: 230px;">基于机器学习算法的世界杯比赛预测系统</h1>
    </div>
</body>
</html>

2.2查看历年数据板块

display_data.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>查看历年数据</title>
    <link rel="stylesheet" href="../static/bootstrap.min.css">
    <link rel="stylesheet" href="../static/main.css">
</head>
<body>
    <div class="container">
        <nav class="navbar navbar-expand-lg navbar-light bg-light">
            <a class="navbar-brand" href="{{url_for('index')}}">首页</a>
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
              <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
              <div class="navbar-nav">
                <a class="nav-link active" href="{{url_for('display_data')}}">查看历年数据</a>
                <a class="nav-link" href="{{url_for('my_predict')}}">预测胜率</a>
                
              </div>
            </div>
          </nav>
          <div>
            <section class="counts section-bg">
              <div class="container">
                <table class="table text-nowrap">
                  <tr class="text-center">
                    <td>Year</td>
                    <td>HostCountry</td>
                    <td>Winner</td>
                    <td>Second</td>
                    <td>Third</td>
                    <td>Fourth</td>
                    <td>GoalsScored</td>
                    <td>QualifiedTeams</td>
                    <td>MatchesPlayed</td>
                  </tr>
                  {% for data in datas %}
                  <tr class="text-center">
                    <td>{{ data.Year }}</td>
                    <td>{{ data.HostCountry }}</td>
                    <td>{{ data.Winner }}</td>
                    <td>{{ data.Second }}</td>
                    <td>{{ data.Third }}</td>
                    <td>{{ data.Fourth }}</td>
                    <td>{{ data.GoalsScored }}</td>
                    <td>{{ data.QualifiedTeams }}</td>
                    <td>{{ data.MatchesPlayed }}</td>
                  </tr>
                  {% endfor %}
                </table>
              </div>
            </section><!-- End Counts Section -->
          </div>
    </div>
</body>
</html>

2.3预测板块

predict.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>预测胜率</title>
    <link rel="stylesheet" href="../static/bootstrap.min.css">
    <link rel="stylesheet" href="../static/main.css">
</head>
<body>
    <div class="container">
        <nav class="navbar navbar-expand-lg navbar-light bg-light">
            <a class="navbar-brand" href="{{url_for('index')}}">首页</a>
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
              <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
              <div class="navbar-nav">
                <a class="nav-link" href="{{url_for('display_data')}}">查看历年数据</a>
                <a class="nav-link active" href="{{url_for('my_predict')}}">预测胜率</a>
              </div>
            </div>
          </nav>

          <div class="container-fluid">
            <div class="row">
              <div class="col col-lg-2">
               
              </div>
              <div class="col-md-auto">
                  <form action="/predict/" method="post">
                    <div class="form-group row">
                        <label for="inputPassword" class="col-sm-6 col-form-label">请输入球队1:</label>
                        <div class="col-sm-8">
                          <input type="text" placeholder="Uruguay/Italy/Brazil/..." name="team1" class="form-control">
                        </div>
                      </div>
                    <div class="form-group row">
                        <label for="inputPassword" class="col-sm-6 col-form-label">请输入球队2:</label>
                        <div class="col-sm-8">
                          <input type="text" placeholder="Uruguay/Italy/Brazil/..." name="team2" class="form-control">
                        </div>
                      </div>
                  
                    <button style="margin-left: 10px;" type="submit" class="btn btn-primary">预测</button>
                  </form>
                  {% if error %}
                  <font color="red">{{ error }}</font>
                  {% endif %}
                  {% if prob1 %}
                  <font color="red">
                    预测的结果为:
                  </font>
                  <br>
                  <font color="red">
                    Chance for {{ team1 }} to win {{ team2 }} is {{ prob1 }}
                  </font>
                  <br>
                  <font color="red">
                    Chance for {{ team2 }} to win {{ team1 }} is {{ prob2 }}
                  </font>
                  <br>
                  <font color="red">
                    Chance for {{ team1 }} and {{ team2 }} draw is {{ prob3 }}
                  </font>
                  {% endif %}
              </div>
              <div class="col col-lg-2">
                
              </div>
            </div>
          </div>
    </div>
</body>
</html>

2.4app.py

from flask import Flask,render_template,views,request
import pandas as pd
import numpy as np 
from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from sklearn.svm import SVC
import warnings
warnings.filterwarnings('ignore')
app = Flask(__name__)

@app.route('/')
def index():  
    return render_template('index.html')

@app.route('/display_data')
def display_data(): 
    WorldCupsSummary = pd.read_csv('WorldCupsSummary.csv')
    datas = []
    for item in WorldCupsSummary.values:
        data = {}
        data['Year'] = item[0]
        data['HostCountry'] = item[1]
        data['Winner'] = item[2]
        data['Second'] = item[3]
        data['Third'] = item[4]
        data['Fourth'] = item[5]
        data['GoalsScored'] = item[6]
        data['QualifiedTeams'] = item[7]
        data['MatchesPlayed'] = item[8]
        datas.append(data) 
    return render_template('display_data.html',datas=datas)

class PredictView(views.MethodView):    
    def __jump(self,prob1=None,prob2=None,prob3=None,error=None,team1=None,team2=None):      
        return render_template('predict.html',prob1=prob1,prob2=prob2,prob3=prob3,error=error,team1=team1,team2=team2)    
    def get(self, result=None,error=None):        
        return self.__jump()    
    def post(self):
        # 导入数据
        matches = pd.read_csv('WorldCupMatches.csv')
        players = pd.read_csv('WorldCupPlayers.csv')
        cups = pd.read_csv('WorldCupsSummary.csv')
        # 删除缺失值
        matches = matches.dropna()
        players = players.dropna()
        cups = cups.dropna()
        # 用德国取代德国DR和德国FR,用俄罗斯取代苏联
        def replace_name(df):
            if(df['Home Team Name'] in ['German DR', 'Germany FR']):
                df['Home Team Name'] = 'Germany'
            elif(df['Home Team Name'] == 'Soviet Union'):
                df['Home Team Name'] = 'Russia'
            if(df['Away Team Name'] in ['German DR', 'Germany FR']):
                df['Away Team Name'] = 'Germany'
            elif(df['Away Team Name'] == 'Soviet Union'):
                df['Away Team Name'] = 'Russia'
            return df
            
        matches = matches.apply(replace_name, axis='columns')
        # 创建一个存储足球队的字典
        team_name = {}
        index = 0
        for idx, row in matches.iterrows():
            name = row['Home Team Name']
            if(name not in team_name.keys()):
                team_name[name] = index
                index += 1
            name = row['Away Team Name']
            if(name not in team_name.keys()):
                team_name[name] = index
                index += 1
        # 删除不必要的列
        dropped_matches = matches.drop(['Datetime', 'Stadium', 'Referee', 'Assistant 1', 'Assistant 2', 'RoundID',
                    'Home Team Initials', 'Away Team Initials', 'Half-time Home Goals', 'Half-time Away Goals',
                    'Attendance', 'City', 'MatchID', 'Stage'], 1)
        # 计算每支球队成为世界杯赛冠军的次数
        championships = cups['Winner'].map(lambda p: 'Germany' if p=='Germany FR' else p).value_counts()
        # 加上“主队冠军”和“客场冠军”:获取世界杯冠军的次数
        dropped_matches['Home Team Championship'] = 0
        dropped_matches['Away Team Championship'] = 0
        def count_championship(df):
            if(championships.get(df['Home Team Name']) != None):
                df['Home Team Championship'] = championships.get(df['Home Team Name'])
            if(championships.get(df['Away Team Name']) != None):
                df['Away Team Championship'] = championships.get(df['Away Team Name'])
            return df

        dropped_matches = dropped_matches.apply(count_championship, axis='columns')
        # 定义一个函数用于找出谁赢了:主场胜:1,客场胜:2,平局:0
        dropped_matches['Winner'] = '-'
        def find_winner(df):
            if(int(df['Home Team Goals']) == int(df['Away Team Goals'])):
                df['Winner'] = 0
            elif(int(df['Home Team Goals']) > int(df['Away Team Goals'])):
                df['Winner'] = 1
            else:
                df['Winner'] = 2
            return df
        dropped_matches = dropped_matches.apply(find_winner, axis='columns')
        # 将team_name字典中的团队名称替换为id
        def replace_team_name_by_id(df):
            df['Home Team Name'] = team_name[df['Home Team Name']]
            df['Away Team Name'] = team_name[df['Away Team Name']]
            return df
        teamid_matches = dropped_matches.apply(replace_team_name_by_id, axis='columns')
        # 删除不必要的列
        teamid_matches = teamid_matches.drop(['Year', 'Home Team Goals', 'Away Team Goals'], 1)
        X = teamid_matches[['Home Team Name', 'Away Team Name', 'Home Team Championship','Away Team Championship']]
        X = np.array(X).astype('float64')
        # 附加数据:只需将“主队名称”替换为“客场球队名称”,将“主队冠军”替换为“客场球队冠军”,然后替换结果
        _X = X.copy()
        _X[:,0] = X[:,1]
        _X[:,1] = X[:,0]
        _X[:,2] = X[:,3]
        _X[:,3] = X[:,2]
        y = dropped_matches['Winner']
        y = np.array(y).astype('int')
        y = np.reshape(y,(1,850))
        y = y[0]
        _y = y.copy()
        for i in range(len(_y)):
            if(_y[i]==1):
                _y[i] = 2
            elif(_y[i] ==2):
                _y[i] = 1     
        X = np.concatenate((X,_X), axis= 0)
        y = np.concatenate((y,_y))
        # 打乱数据,然后拆分数据集为训练集和测试集
        X,y = shuffle(X,y)
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)
        # 用SVM支持向量机模型进行训练
        svm_model = SVC(kernel='rbf', class_weight='balanced', probability=True)
        svm_model.fit(X_train, y_train)
        # 定义一个预测函数,需要传递两个球队名称,输出两个获胜的概率
        def prediction(team1, team2):
            id1 = team_name[team1]
            id2 = team_name[team2]
            championship1 = championships.get(team1) if championships.get(team1) != None else 0
            championship2 = championships.get(team2) if championships.get(team2) != None else 0
            x = np.array([id1, id2, championship1, championship2]).astype('float64')
            x = np.reshape(x, (1,-1))
            _y = svm_model.predict_proba(x)[0]
            return _y[1]*100,_y[2]*100,_y[0]*100
        try:
            team1 = request.form['team1']      
            team2 = request.form['team2']     
            # 预测比赛
            prob1, prob2, prob3 = prediction(team1, team2)       
            return self.__jump(prob1=prob1,prob2=prob2,prob3=prob3,team1=team1,team2=team2) 
        except Exception as e:
            print(EnvironmentError)
            return self.__jump(error='输入数据格式不对,请重新输入!')        
    

app.add_url_rule('/predict/',view_func=PredictView.as_view('my_predict'))


if __name__ == '__main__':
    app.run(debug=True)

三、项目总结

        本次我们使用了Flask框架结合了基于机器学习的世界杯比赛预测模型,构建了一个简易版基于机器学习的世界杯比赛预测系统,整个项目还有很多地方可以优化,比如页面美化、模块添加等等,这些就留给学习的小伙伴根据自身需求进行创新升级!喜欢本项目的话就三连支持一下啦!

心得与体会:

通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。原先,学的时候感叹学的资料太难懂,此刻想来,有些其实并不难,关键在于理解。

在这次实战中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自我动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等

在此次实战中,我还学会了下面几点工作学习心态:

1)继续学习,不断提升理论涵养。在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。

2)努力实践,自觉进行主角转化。只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。

3)提高工作用心性和主动性。实习,是开端也是结束。展此刻自我面前的是一片任自我驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。

这次Python实战不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/29987.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

南京贸易企业增值税居高不下,该如何解决?

南京贸易企业增值税居高不下&#xff0c;该如何解决&#xff1f; 《税筹顾问》专注于园区招商&#xff0c;您的贴身节税小能手&#xff0c;合理合规节税&#xff01; 南京作为省会城市&#xff0c;近年来由于芯片、生物医药等产业的发展而跻身前十&#xff0c;随着它在教育、军…

C语言基础 位域

C语言基础&#xff1a;位域 主题&#xff1a;位域&#xff08;bit-field&#xff09; 关键字&#xff1a;位域 冒号 结构体 存储空间 参考链接&#xff1a;C语言中文网&#xff1a;位域 、C菜鸟工具&#xff08;在线编译器&#xff09;、位域知乎问答 注&#xff1a;以下内容中…

redis五种数据类型具体时候的底层编码

redis随着值的类型不同&#xff0c;其在底层编码类型会不相同。目前现有的编码格式有 #define OBJ_ENCODING_RAW 0 /* Raw representation */ #define OBJ_ENCODING_INT 1 /* Encoded as integer */ #define OBJ_ENCODING_HT 2 /* Encoded as hash table */ #def…

2023年打印机电商市场数据分析

近年来&#xff0c;伴随自动化办公及在线教育等场景的常态化&#xff0c;文件或学习资料等的打印需求不断增长&#xff0c;这也使得打印机需求暴增&#xff0c;打印机市场的市场规模也越来越大。 根据鲸参谋电商平台的相关数据显示&#xff0c;今年1月份至4月份&#xff0c;打印…

Unity UGUI1——基础组件概述

一、UGUI 介绍 ​ UGUI 是 Unity 引擎内自带的 UI 系统&#xff0c;官方称之为&#xff1a;Unity UI ​ 是目前 Unity 商业游戏开发中使用最广泛的 UI 系统开发解决方案 ​ 它是基于 Unity 游戏对象的 UI 系统&#xff0c;只能用来做游戏 UI 功能 ​ 不能用于开发 Unity 编…

简单的TCP网络程序·单进程(后端服务器)

目录 文件1&#xff1a;tcpServer.cc 文件2&#xff1a;tcpServer.hpp 1.提出日志概念 -- 在后续完善 日志格式 -- 暂定简单的打印功能 2.创建套接字 SOCK_STREAM -- socket参数 3.bind自己的套接字 4.设置socket 为监听状态 * 新接口1&#xff1a;listen 函数1&…

linux服务器上,docker安装nginx

如果出现 Using default tag: latest Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/create?fromImagenginx&taglatest": dial unix /va…

Python 中常用的数据类型及相关操作详解

文章目录 列表&#xff08;Lists&#xff09;创建列表访问列表元素添加元素到列表删除列表元素切片&#xff08;Slicing&#xff09;其他常用操作 元组&#xff08;Tuples&#xff09;创建元组访问元组元素元组长度其他常用操作 字符串&#xff08;Strings&#xff09;创建字符…

Three.js--》实现图片转3D效果展示

目录 项目搭建 初始化three.js基础代码 加载图片纹理 设置着色器 今天简单实现一个three.js的小Demo&#xff0c;加强自己对three知识的掌握与学习&#xff0c;只有在项目中才能灵活将所学知识运用起来&#xff0c;话不多说直接开始。 项目搭建 本案例还是借助框架书写th…

【Qt】Ubuntu安装GCC9.3.0版本的Qt5.15.5

目录 一、安装GCC9.3.0 1.下载GCC9.3.0源码 2.获取依赖项的包 3.生成Makefile文件 4.编译并安装 5.生成软链接 6. 查看GCC版本 二、安装Qt 1.下载Qt安装包 2.创建Qt项目并运行 一、安装GCC9.3.0 1.下载GCC9.3.0源码 https://ftp.gnu.org/gnu/gcc/gcc-9.3.0/gcc-9.3…

excel爬虫相关学习1:简单的excel爬虫

目录 1 什么是excel 爬虫 2 EXCEL爬虫 2.1 excel 爬虫的入口 2.2 需要配置的信息 2.2.1 如何获得 ua信息 2.3 获取的信息 2.3.1 获取信息的基本内容 2.3.2 获取过程 2.3.3 我们只用关注“表视图 ” 即可 2.4 EXCEL获得的爬虫数据 加载到excel里 2.5 数据到了excel表后…

Three.js--》实现3d汽车模型展览搭建

目录 项目搭建 初始化three.js基础代码 添加汽车模型展示 动态修改汽车模型 今天简单实现一个three.js的小Demo&#xff0c;加强自己对three知识的掌握与学习&#xff0c;只有在项目中才能灵活将所学知识运用起来&#xff0c;话不多说直接开始。 项目搭建 本案例还是借助…

flink主要组件及高可用配置

背景 flink不论运行在哪种环境&#xff0c;例如Yarn&#xff0c;Mesos&#xff0c;Kebernute以及独立集群&#xff0c;每个应用都会包含重要的几个组件&#xff0c;本文就来讲述下flink的主要组件以及如何实现flink的高可用配置 flink主要组件 如图所示&#xff0c;flink主要…

Java实训日志02

文章目录 八、项目开发实现步骤&#xff08;二&#xff09;创建项目1、创建Java项目2、创建目录&#xff0c;添加素材&#xff08;1&#xff09;创建help目录添加帮助文档&#xff08;2&#xff09;创建images目录添加图像素材&#xff08;3&#xff09;创建lib目录添加数据库驱…

Dockerfile创建镜像

一、Docker镜像的创建 创建镜像有三种方法&#xff0c;分别为【基于已有镜像创建】、【基于本地模板创建】以及【基于Dockerfile创建】。 1.1 基于现有镜像创建 &#xff08;1&#xff09;首先启动一个镜像&#xff0c;在容器里做修改docker run -it centos:7 /bin/bash …

设计模式之工厂方法模式笔记

设计模式之工厂方法模式笔记 说明Factory Method(工厂方法)目录UML抽象工厂示例类图咖啡抽象类美式咖啡类拿铁咖啡类 咖啡工厂接口美式咖啡工厂类拿铁咖啡工厂类 咖啡店类测试类 说明 记录下学习设计模式-工厂方法模式的写法。 Factory Method(工厂方法) 意图:定义一个用于创…

主从架构lua脚本-Redis(四)

上篇文章介绍了rdb、aof持久化。 持久化RDB/AOF-Redis&#xff08;三&#xff09;https://blog.csdn.net/ke1ying/article/details/131148269 redis数据备份策略 写job每小时copy一份到其他目录。目录里可以保留最近一个月数据。把目录日志保存到其他服务器&#xff0c;防止机…

专业的知识图谱应用门槛正在被不断降低

前⾔ 知识图谱&#xff08;knowledge graph&#xff09;⼀度被专家称为“AI皇冠上的明珠”&#xff0c;因为知识图谱技术是⼈⼯智能技术⽅向中的重要⼀环。它不仅可以为其他⼈⼯智能应⽤提供⽀持&#xff0c;如⾃然语⾔处理、推荐系统等&#xff0c;更可以帮助⼈⼯智能系统⾃主…

《微服务实战》 第三十一章 ShardingSphere - ShardingSphere-JDBC

前言 Apache ShardingSphere 是一款分布式的数据库生态系统&#xff0c; 可以将任意数据库转换为分布式数据库&#xff0c;并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。 Apache ShardingSphere 设计哲学为 Database Plus&#xff0c;旨在构建异构数据库上层的…

【Python 随练】统计字符类型个数

题目&#xff1a; 输入一行字符&#xff0c;分别统计出其中英文字母、空格、数字和其它字符的个数。 简介&#xff1a; 在本篇博客中&#xff0c;我们将解决一个字符统计问题&#xff1a;输入一行字符&#xff0c;统计其中英文字母、空格、数字和其他字符的个数。我们将提供…