Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >英雄联盟召唤师分析

英雄联盟召唤师分析
EN

Code Review用户
提问于 2020-08-11 14:45:36
回答 1查看 1.1K关注 0票数 8

这个程序将要求用户插入召唤师和基础,从最后的20场比赛,它将提供avg的统计,看看是否好,在过去的20场比赛中获胜(一个简单的评分系统)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests
from getId import idcollect
from games import GAME
from wins import win_calc

#Key for riot API
Key = '**********************'

#ASKING USER FOR SUMMONER NAME
summonerName = input('Enter summoner name:')

#Objects
ids=idcollect()
game=GAME()
wins=win_calc()

#Collecting the acc id of summoner name
accId=ids.ID_collected(summonerName,Key)

#Collecting game id lists
game_list=[]
game_list=game.find_game_ids(accId,Key)

#Collecting wins list
win_list=[]
win_list=game.game_data(game_list,Key,summonerName)

#Calcuate whether the summoner is good or not
wins.is_dis_mane_good(win_list)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests


class GAME:


    def find_game_ids(self,accId,key):
        
        i=0
        GAMEID = []
        Idgame=20       
        url_match_list=('https://na1.api.riotgames.com/lol/match/v4/matchlists/by-account/'+(accId)+'?queue=420&endIndex=20&api_key='+(key))
        response2=requests.get(url_match_list)
        #Adding 20 games into the list
        while Idgame>0:
            GAMEID.append('https://na1.api.riotgames.com/lol/match/v4/matches/'+str(response2.json()['matches'][i]['gameId'])+'?api_key='+(key))
            i=i+1
            Idgame=Idgame-1

        return GAMEID


    def game_data(self,game_list,key,sumName):

        wins=[]
        deaths=[]
        deaths= []
        kills=[]
        assists=[]
        visions=[]
        csTotal=[]
        
        
        #Finding the data of said summoner in each game id
        for urls in game_list:

            
            response=requests.get(urls)
            Loop=0
            index=0
            while Loop<=10:
                
                if response.json()['participantIdentities'][index]['player']['summonerName']!=sumName:
                    Loop= Loop+1
                    index=index+1
                elif response.json()['participantIdentities'][index]['player']['summonerName']==sumName:
                    
                    deaths.append(response.json()['participants'][index]['stats']['deaths'])
                    kills.append(response.json()['participants'][index]['stats']['kills'])
                    assists.append(response.json()['participants'][index]['stats']['assists'])
                    visions.append(response.json()['participants'][index]['stats']['visionScore'])
                    csTotal.append(response.json()['participants'][index]['stats']['totalMinionsKilled'])
                    wins.append(response.json()['participants'][index]['stats']['win'])
                
                    break
        #Finding avg of each stat
        deaths=sum(deaths)/20            
        kills=sum(kills)/20
        assists=sum(assists)/20
        visions=sum(visions)/20
        csTotal=sum(csTotal)/20

        print('The avg kills is '+str(kills)+'\nThe avg deaths is '+str(deaths)+'\nThe avg assists is '+str(assists)+'\nThe avg visions is '+str(visions)+'\nThe avg cs total is '+str(csTotal))

        return wins
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests

class idcollect:
    
    def ID_collected(self,sumName,key):
        #COLLECTING DATA TO BE INSERTING FOR MATCHLIST DATABASE
        url=('https://na1.api.riotgames.com/lol/summoner/v4/summoners/by-name/'+(sumName)+'?api_key='+(key))
        response=requests.get(url)
        accId=(response.json()['accountId'])
        return accId
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import random

class win_calc:


    def is_dis_mane_good(self,winlist):
        
        winlist=sum(winlist)/20

        if (winlist<.33):
            trash=['DIS MANE STINKS','run while you can','I repeat, YOU ARE NOT WINNING THIS','I predict a fat L','Have fun trying to carry this person','He is a walking trash can','He needs to find a new game','BAD LUCK!!!']
            print (random.choice(trash))

        elif (winlist>.33 and winlist<=.5):
            notgood=['Losing a bit','Not very good','He needs lots of help','Your back might hurt a little','Does not win much'] 
            print (random.choice(notgood))

        elif (winlist>.5 and winlist<=.65):
            ight=['He is ight','He can win a lil','You guys have a decent chance to win','Serviceable','Should be a dub']
            print (random.choice(ight))

        elif (winlist>.65):
            good=['DUB!','You getting carried','His back gonna hurt a bit','winner winner chicken dinner','Dude wins TOO MUCH','You aint even gotta try','GODLIKE']
            print (random.choice(good))
EN

回答 1

Code Review用户

发布于 2020-08-11 16:38:05

find_game_ids比需要的要复杂得多。您实际上有两个“计数器”,Idgamei。一种是用来放置在字符串中,另一种是限制循环发生的次数,但如果你想一想,它们的值是相同的;正好相反。您不需要Idgame,因为您只需检查是否i < 20。您也不需要手动管理irange是用于用例的,具体如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def find_game_ids(self, accId, key):
    game_id = []
    url_match_list = f"https://na1.api.riotgames.com/lol/match/v4/matchlists/by-account/{accId}?queue=420&endIndex=20&api_key={key}"
    response2 = requests.get(url_match_list)
    for i in range(20):
        game_id.append(f"https://na1.api.riotgames.com/lol/match/v4/matches/{response2.json()['matches'][i]['gameId']}?api_key={key}"

    return game_id

i这里将是从019的所有数字。我还建议在其他地方创建一个变量来保存20并调用N_GAMES或其他什么东西。您似乎在多个点使用该20。如果你在一个地方改变它,而忘了在其他地方改变它,你可能会有一个讨厌的错误。

我还改变了其他事情:

  • 变量名应该是小写,根据PEP8用下划线分隔。这个文件的所有名称都不一致地使用Upper_case。除非您要命名一个类名,否则使用lower_case。
  • 我没有使用+将字符串相加在一起,而是将其更改为使用f- string (请注意引号之前的f )。它允许您使用{variable_name}语法将变量直接放入字符串中。

不过,这一点还可以进一步改进。如果您在这里迭代创建一个列表,列表理解有时会更清晰:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def find_game_ids(self, accId, key):
    url_match_list = f"https://na1.api.riotgames.com/lol/match/v4/matchlists/by-account/{accId}?queue=420&endIndex=20&api_key={key}"
    response2 = requests.get(url_match_list)
    
    return [f"https://na1.api.riotgames.com/lol/match/v4/matches/{response2.json()['matches'][i]['gameId']}?api_key={key}"
            for i in range(20)]

在每种情况下,主要的可读性问题都来自于字符串的长度。您可能希望将它拆分成多行,或者使用另一个函数在函数之外生成它。

game_data中,您要反复调用response.json()。纵观这种方法的来源,它似乎不会进行任何缓存。这意味着每次对.json的调用都将对数据进行解析,这是浪费CPU时间。将其保存到一个变量中一次,并根据需要使用它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def game_data(self, game_list, key, sumName):
    . . .
    for urls in game_list:

        response = requests.get(urls)
        resp_json = response.json()  # Save it to use it again later
        Loop = 0
        index = 0
        while Loop <= 10:

            if resp_json['participantIdentities'][index]['player']['summonerName'] != sumName:
                Loop = Loop + 1
                index = index + 1
            elif resp_json['participantIdentities'][index]['player']['summonerName'] == sumName:

                deaths.append(resp_json['participants'][index]['stats']['deaths'])
                kills.append(resp_json['participants'][index]['stats']['kills'])
                assists.append(resp_json['participants'][index]['stats']['assists'])
                visions.append(resp_json['participants'][index]['stats']['visionScore'])
                csTotal.append(resp_json['participants'][index]['stats']['totalMinionsKilled'])
                wins.append(resp_json['participants'][index]['stats']['win'])

        . . .

这不仅缩短了时间,还使以后更容易将某些预处理添加到数据中,而且还具有更快的潜力,因为您不会一次又一次地进行相同的处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Finding avg of each stat
deaths=sum(deaths)/20            
kills=sum(kills)/20
assists=sum(assists)/20
visions=sum(visions)/20
csTotal=sum(csTotal)/20

就像我说的,您在多个地方使用20。如果你以后想改变这个号码呢?找出每一个相关的20并将其更新到新的值是不好玩的。

将该数字存储一次,并使用该变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Top of file by imports
N_GAMES = 20

. . .

# The for-loop in the updated find_game_ids
for i in range(N_GAMES):

. . .

# At the bottom of game_data
deaths=sum(deaths)/N_GAMES            
kills=sum(kills)/N_GAMES
assists=sum(assists)/N_GAMES
visions=sum(visions)/N_GAMES
csTotal=sum(csTotal)/N_GAMES

对于win_calcid_collect类,有一些值得注意的事情。

首先,它们不应该是课堂。不应该使用类的一个很好的指示是,您从未在任何方法中使用self。通过在本例中使用类,只需构造一个空对象就可以调用该对象上的方法,在这里您可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wins=win_calc()

只为了稍后调用一个方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wins.is_dis_mane_good(win_list)

只需使这些类成为简单的函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import random

def is_dis_mane_good(winlist):

    winlist = sum(winlist) / 20

    if (winlist < .33):
        trash = ['DIS MANE STINKS', 'run while you can', 'I repeat, YOU ARE NOT WINNING THIS', 'I predict a fat L',
                 'Have fun trying to carry this person', 'He is a walking trash can', 'He needs to find a new game',
                 'BAD LUCK!!!']
        print(random.choice(trash))
    . . .

然后将它们作为普通函数使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
is_dis_mane_good(win_list)

其次,如果将它们作为类来使用,则名称应该是CapitalCase:WinCalcIDCollect (或者可能是IdCollect)。

另外,我会重命名is_dis_mane_good。在程序的输出中使用俚语是一回事,但是将方法命名为模糊的名称并不会给自己或其他代码读者带来任何好处。

在这个函数中,我还要做一些更多的修改:

  • 我建议你在小数前加上一个00.33.33更具可读性。
  • 您也可以使用操作符链接来简化这些检查。winlist > 0.33 and winlist <= 0.5可以成为0.33 < winlist <= 0.5。但是,正如注释中所指出的,实际上可以消除每个检查的一半,因为例如,如果winlist < 0.33是假的,那么您知道winlist必须大于0.33,所以winlist > 0.33检查是多余的。
  • 又是那个20 ;)你拥有的地方越多,你就越有可能忘记至少更新其中的一个。我会用N_GAMES代替。
  • 您可以在每次检查后将列表分配给一个变量,从而摆脱重复的print(random.choice(. . .))调用,然后在底部有一个print

在这些变化之后,我就剩下这个了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def competency_message(winlist):
    winlist = sum(winlist) / N_GAMES

    message_set = []
    if winlist < 0.33:  # Should be winlist <= 0.33 maybe?
        message_set = ['DIS MANE STINKS', 'run while you can', 'I repeat, YOU ARE NOT WINNING THIS', 'I predict a fat L',
                 'Have fun trying to carry this person', 'He is a walking trash can', 'He needs to find a new game',
                 'BAD LUCK!!!']

    elif winlist <= 0.5:
        message_set = ['Losing a bit', 'Not very good', 'He needs lots of help', 'Your back might hurt a little',
                   'Does not win much']

    elif winlist <= 0.65:
        message_set = ['He is ight', 'He can win a lil', 'You guys have a decent chance to win', 'Serviceable',
                'Should be a dub']

    else:
        message_set = ['DUB!', 'You getting carried', 'His back gonna hurt a bit', 'winner winner chicken dinner',
                'Dude wins TOO MUCH', 'You aint even gotta try', 'GODLIKE']

    print(random.choice(message_set))
票数 13
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/247788

复制
相关文章
X86如何实现函数调用?
的空间保存数据,用户地址空间3G从0x0000000到0xC0000000,内核空间1G从0xC0000000到0xFFFFFFFF。
mingjie
2022/11/30
2.8K0
X86如何实现函数调用?
X86函数调用模型分析
的空间保存数据,地址从0x00000000到0xFFFFFFFF(一个十六进制为对应4个二进制位,所以是2的32次方)。
mingjie
2022/08/03
1.2K0
X86函数调用模型分析
java 如何实现短函数调用?
在Java中,可以使用lambda表达式来实现短函数调用。Lambda表达式是一个匿名函数,它可以传递给方法或存储在变量中,以便在需要时使用。
IT千锋教育
2023/05/24
6510
java 如何实现短函数调用?
如何禁止函数的传值调用
按照参数形式的不同,C++应该有三种函数调用方式:传值调用、引用调用和指针调用。对于基本数据类型的变量作为实参进行参数传递时,采用传值调用与引用调用和指针调用的效率相差不大。但是,对于类类型来说,传值调用和引用调用之间的区别很大,类对象的尺寸越大,这种差别越大。
恋喵大鲤鱼
2018/08/03
2.8K0
java怎样调用oracle存储函数_oracle如何调用存储过程
之前给大家介绍了java代码调用存储过程,下面要给大家介绍的就是java当中调用oracle存储过程,一起来看看吧。
全栈程序员站长
2022/11/19
2.7K0
java怎样调用oracle存储函数_oracle如何调用存储过程
Linux内核如何替换内核函数并调用原始函数
已经多久没有编程了?很久了吧…其实我本来就不怎么会写代码,时不时的也就是为了验证一个系统特性,写点玩具而已,工程化的代码,对于我而言,实在是吃力。
Linux阅码场
2019/10/08
3.4K0
Linux内核如何替换内核函数并调用原始函数
Nginx如何限制每秒请求次数,限制每秒连接次数,下载速度限制?
Nginx是一款常用的高性能Web服务器和反向代理服务器,其优秀的性能和可扩展性使得它广泛应用于各种网络应用和场景中。在实际使用过程中,为了保障系统的稳定性和安全性,需要对Nginx进行一定的配置和优化。其中,限制每秒请求次数、限制每秒连接次数和下载速度限制等技术是非常重要的配置项之一。
网络技术联盟站
2023/06/08
5.8K0
Nginx如何限制每秒请求次数,限制每秒连接次数,下载速度限制?
MySQL 每秒 570000 的写入,如何实现?
一个朋友接到一个需求,从大数据平台收到一个数据写入在20亿+,需要快速地加载到MySQL中,供第二天业务展示使用。
芋道源码
2019/03/08
1.5K0
MySQL 每秒 570000 的写入,如何实现?
一个朋友接到一个需求,从大数据平台收到一个数据写入在20亿+,需要快速地加载到MySQL中,供第二天业务展示使用。
数据和云01
2019/07/10
1.6K0
GO语言如何调用C写的函数
1.C 文件 #include <stdio.h>   #include <stdlib.h>   extern int sun(int a, int b) {   return a + b;   }   2 GO调用实例 package main   // #include "c_fun.h"   import "C"   import "fmt"   func main() {   fmt.Println("go call c: 3+4=", C.sun(3, 4))   }  
李海彬
2018/03/27
3K0
通过反汇编理解函数调用机制(x86和ARM)
在分析上面的汇编程序之前,需要了解rbp、rsp为栈基址寄存器、栈顶寄存器,分别指向栈底和栈顶;edx、eax、esi、edi均为x86CPU上的通用寄存器,可以存放数据(虽然它们还有别的作用,但是本文章不涉及)
用户7043923
2020/03/12
2K0
如何优化 SQLite 每秒的插入操作
SQLite 的优化比较棘手,就批量插入而言,其速度可以从每秒 85 条优化到每秒 96,000 条。下面我们来具体看下实验过程和结果,
ClearSeve
2022/02/10
3.4K0
MySQL 每秒 570000 的写入,如何实现?
一个朋友接到一个需求,从大数据平台收到一个数据写入在20亿+,需要快速地加载到MySQL中,供第二天业务展示使用。
数据和云
2019/07/15
2.4K0
MySQL 每秒 570000 的写入,如何实现?
浅谈如何定义和调用Python的函数
本文主要介绍了如何定义和调用Python函数。首先介绍了函数的概念和作用,然后详细讲解了如何定义函数和调用函数,最后列举了一个例子来加深理解。
企鹅号小编
2018/01/03
2K0
浅谈如何定义和调用Python的函数
Unity WebGL 程序如何调用Java Script函数
在WebGL的程序中我们可能需要与网页上的其他元素进行通信,或者需要调用一些其他的Web API,本文介绍如何在Unity脚本中调用Java Script函数。
CoderZ
2022/08/29
1.4K0
Unity WebGL 程序如何调用Java Script函数
MySQL 每秒 570000 的写入,如何实现?
一个朋友接到一个需求,从大数据平台收到一个数据写入在20亿+,需要快速地加载到MySQL中,供第二天业务展示使用。
Java团长
2019/03/04
1.3K0
函数调用时栈是如何变化的?
大家都知道函数调用是通过栈来实现的,而且知道在栈中存放着该函数的局部变量。但是对于栈的实现细节可能不一定清楚。本文将介绍一下在Linux平台下函数栈是如何实现的。
嵌入式与Linux那些事
2021/12/17
3.6K0
函数调用时栈是如何变化的?
【说站】javascript new如何调用构造函数
以上就是javascript new调用构造函数,希望对大家有所帮助。更多Javascript学习指路:Javascript
很酷的站长
2022/11/23
1.2K0
【说站】javascript new如何调用构造函数
点击加载更多

相似问题

中的nltk pos_tag错误

12

NLTK:柠檬和pos_tag

13

NLTK 3 POS_TAG抛出UnicodeDecodeError

511

NLTK pos_tag模块返回LookupError

12

如何优化NLTK pos_tag操作?

112
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文