本文目录导读:

我来帮你实现一个统计关门防守(close-out defense)成功次数的Python案例。
实现方案
class CloseOutDefense:
"""关门防守统计类"""
def __init__(self):
self.defense_records = [] # 防守记录
self.success_count = 0 # 成功次数
self.total_count = 0 # 总次数
def record_defense(self, player_name, is_success, details=""):
"""记录一次关门防守
Args:
player_name: 防守球员姓名
is_success: 是否成功
details: 防守细节说明
"""
record = {
'player': player_name,
'success': is_success,
'details': details,
'timestamp': len(self.defense_records) + 1 # 序号
}
self.defense_records.append(record)
self.total_count += 1
if is_success:
self.success_count += 1
def get_stats(self):
"""获取统计数据"""
success_rate = (self.success_count / self.total_count * 100) if self.total_count > 0 else 0
return {
'total_defenses': self.total_count,
'success_count': self.success_count,
'fail_count': self.total_count - self.success_count,
'success_rate': f"{success_rate:.1f}%"
}
def get_player_stats(self, player_name):
"""获取特定球员的防守统计"""
player_records = [r for r in self.defense_records if r['player'] == player_name]
total = len(player_records)
success = sum(1 for r in player_records if r['success'])
if total > 0:
return {
'player': player_name,
'total': total,
'success': success,
'fail': total - success,
'rate': f"{(success/total*100):.1f}%"
}
return None
def show_all_records(self):
"""显示所有防守记录"""
print("=" * 50)
print(" 关门防守记录统计")
print("=" * 50)
for i, record in enumerate(self.defense_records, 1):
status = "✓ 成功" if record['success'] else "✗ 失败"
print(f"#{i:2d} | 球员: {record['player']:6s} | {status} | {record['details']}")
print("=" * 50)
stats = self.get_stats()
print(f"总防守次数: {stats['total_defenses']}")
print(f"成功次数: {stats['success_count']}")
print(f"失败次数: {stats['fail_count']}")
print(f"成功率: {stats['success_rate']}")
print("=" * 50)
# 测试案例 - 模拟篮球比赛数据
def simulate_basketball_game():
"""模拟一场篮球比赛中的关门防守数据"""
defense_tracker = CloseOutDefense()
# 模拟多个防守回合
scenarios = [
# (球员, 是否成功, 描述)
("张伟", True, "成功迫使对手传球失误"),
("李强", True, "逼迫对手仓促出手不中"),
("王明", False, "被对手突破得分"),
("赵华", True, "成功干扰三分投篮"),
("张伟", True, "造成对手进攻犯规"),
("李强", False, "被对手造犯规"),
("王明", True, "成功封盖投篮"),
("赵华", True, "迫使对手24秒违例"),
("张伟", False, "被对手假动作晃过"),
("李强", True, "成功抢断传球"),
("王明", True, "逼迫对手传失误球"),
("赵华", False, "对手命中高难度投篮"),
("张伟", True, "成功预判突破路线"),
("李强", True, "迫使对手停球"),
("王明", False, "被对手传球助攻"),
]
for player, success, detail in scenarios:
defense_tracker.record_defense(player, success, detail)
return defense_tracker
# 高级版 - 支持更多功能
class AdvancedCloseOutDefense(CloseOutDefense):
"""增强版关门防守统计"""
def __init__(self):
super().__init__()
self.player_stats = {} # 球员详细统计
self.time_periods = [] # 时间阶段统计
def record_defense_with_time(self, player, is_success, quarter, minute, details=""):
"""带时间记录的防守"""
record = {
'player': player,
'success': is_success,
'quarter': quarter,
'minute': minute,
'details': details,
'timestamp': len(self.defense_records) + 1
}
self.defense_records.append(record)
self.total_count += 1
# 更新球员统计
if player not in self.player_stats:
self.player_stats[player] = {'total': 0, 'success': 0}
self.player_stats[player]['total'] += 1
if is_success:
self.success_count += 1
self.player_stats[player]['success'] += 1
def analyze_by_quarter(self):
"""按节次分析防守效果"""
quarter_stats = {}
for record in self.defense_records:
q = record['quarter']
if q not in quarter_stats:
quarter_stats[q] = {'total': 0, 'success': 0}
quarter_stats[q]['total'] += 1
if record['success']:
quarter_stats[q]['success'] += 1
print("\n=== 各节次关门防守分析 ===")
for q, stats in quarter_stats.items():
rate = (stats['success'] / stats['total'] * 100) if stats['total'] > 0 else 0
print(f"第{q}节: 总共{stats['total']}次, 成功{stats['success']}次, 成功率{rate:.1f}%")
def get_hot_streak(self, player=None):
"""获取连续成功防守记录"""
records = self.defense_records if not player else \
[r for r in self.defense_records if r['player'] == player]
max_streak = 0
current_streak = 0
for record in records:
if record['success']:
current_streak += 1
max_streak = max(max_streak, current_streak)
else:
current_streak = 0
return max_streak
# 主程序
if __name__ == "__main__":
print("=== 基本版关门防守统计 ===")
game_stats = simulate_basketball_game()
game_stats.show_all_records()
# 查看特定球员统计
print("\n=== 张伟个人统计 ===")
zhang_stats = game_stats.get_player_stats("张伟")
if zhang_stats:
for key, value in zhang_stats.items():
print(f"{key}: {value}")
# 使用高级版
print("\n\n=== 高级版关门防守统计 ===")
advanced = AdvancedCloseOutDefense()
# 模拟更多带时间的数据
game_data = [
# (球员, 成功, 节次, 分钟, 描述)
("张伟", True, 1, 3, "成功干扰投篮"),
("李强", False, 1, 5, "被突破"),
("王明", True, 1, 8, "造成对手失误"),
("张伟", True, 2, 2, "迫使传球失误"),
("李强", True, 2, 6, "成功封盖"),
("王明", False, 2, 9, "对手三分命中"),
("张伟", True, 3, 1, "抢断成功"),
("李强", True, 3, 4, "逼迫走步违例"),
]
for data in game_data:
advanced.record_defense_with_time(*data)
# 显示结果
advanced.show_all_records()
advanced.analyze_by_quarter()
print(f"\n张伟最长连续成功防守: {advanced.get_hot_streak('张伟')}次")
运行结果示例
=== 基本版关门防守统计 ===
==================================================
关门防守记录统计
==================================================
# 1 | 球员: 张伟 | ✓ 成功 | 成功迫使对手传球失误
# 2 | 球员: 李强 | ✓ 成功 | 逼迫对手仓促出手不中
# 3 | 球员: 王明 | ✗ 失败 | 被对手突破得分
... (省略中间数据)
#15 | 球员: 王明 | ✗ 失败 | 被对手传球助攻
==================================================
总防守次数: 15
成功次数: 10
失败次数: 5
成功率: 66.7%
==================================================
=== 张伟个人统计 ===
player: 张伟
total: 4
success: 3
fail: 1
rate: 75.0%
主要功能特点
- 基础统计:记录总次数、成功/失败次数、成功率
- 个人统计:查看特定球员的防守数据
- 详细记录:保存每次防守的具体情况
- 高级分析:按节次、时间段分析防守效果
- 连胜统计:计算连续成功防守的次数
这个案例可以应用在篮球比赛分析、训练评估等场景中。