python - TypeError:“NoneType”对象即使已设置也不可迭代
问题描述
我最近复制了一些代码并试图理解它,但是有一个错误阻止了我,并且由于相当新,我不知道如何解决它。我用谷歌搜索了非类型错误,知道这意味着没有分配任何东西,但我返回输入的值,所以那里应该有一些东西。
这是我的错误:
Traceback (most recent call last):
File "C:\Users\pc\Documents\.RandomProgramming\NEA\NEA\task2.py", line 94, in <module>
main()
File "C:\Users\pc\Documents\.RandomProgramming\NEA\NEA\task2.py", line 81, in main
(player1, player1_win), (player2, player2_win) = game(user1, user2)
TypeError: 'NoneType' object is not iterable
这是我的代码:
import random
import time
def login():
while True:
username = input('What is your username? ')
password = input('What is your password? ')
if username not in ('User1', 'User2', 'User3', 'User4', 'User5'):
print('Incorrect username, try again')
continue
if password != "pwd":
print('Incorrect password, try again')
continue
print(f'Welcome, {username} you have been successfully logged in.')
return username
def roll():
die1 = random.randint(1, 6)
die2 = random.randint(1, 6)
change = 10 if (die1 + die2) % 2 == 0 else -5
points = die1 + die2 + change
if die1 == die2:
points += random.randint(1, 6)
return points
def game(user1, user2):
player1_points = 0
player2_points = 0
for i in range(1,5):
player1_points += roll()
print(f'After this round {user1} you now have: {player1_points} Points')
time.sleep(1)
player2_points += roll()
print(f'After this round {user2} you now have: {player2_points} Points')
time.sleep(1)
player1TieBreak = player1_points
player2TieBreak = player2_points
if player1_points == player2TieBreak:
player1TieBreak = random.randint(1,6)
player2TieBreak = random.randint(1,6)
if player1TieBreak > player2TieBreak:
return (player1_points, player1_win), (player2_points, not player2_win)
else:
return (player2_points, player2_win), (player1_points, not player1_win)
def add_winner(winner):
with open('Winner.txt', 'a') as f:
f.write('{winner[0]},{winner[1]}\n')
def get_leaderboard():
with open('Leaderboard.txt', 'r') as f:
return [line.replace('\n','') for line in f.readlines()]
def update_leaderboard(leaderboard, winner):
for idx, item in enumerate(leaderboard):
if item.split(', ')[1] == winner[1] and int(item.split(', ')[0]) < int(winner[0]):
leaderboard[idx] = '{}, {}'.format(winner[0], winner[1])
else:
pass
leaderboard.sort(reverse=True)
def save_leaderboard(leaderboard):
with open('Leaderboard.txt', 'w') as f:
for item in leaderboard:
f.write(f'{item}\n')
def main():
user1 = login()
user2 = login()
(player1, player1_win), (player2, player2_win) = game(user1, user2)
if player1_win:
winner = (player1, user1)
else:
winner = (player2, user2)
print('Well done, {winner[1]} you won with {winner[0]} Points')
add_winner(winner)
leaderboard = get_leaderboard()
update_leaderboard(leaderboard, winner)
save_leaderboard(leaderboard)
main()
解决方案
在任何情况下,您的game(user1, user2)
函数都不会返回元组的元组。当player1_points != player2TieBreak
没有其他 return 语句时,您的函数会返回None
那里。
推荐阅读
- html - 如何使元素与 body 颜色相同并在其后面隐藏一些东西?
- c# - 如何在实体框架中使用更新数据视图
- c - arm链接器在函数调用中使用的“单板”是什么?
- python - 一个用户的多个 Django 记录
- vb.net - RDP 请求密码
- ffmpeg - Windows 服务器上的 FFMPEG“未知编码器‘libfaac’”
- c# - 在 AWS CDK (C#) 中创建具有常量 JSON 参数的规则
- powershell - 如何在 powershell 中检测 Linux 或 macOS 或 Windows?
- ios - 显示飞溅视图在动画后显示空白屏幕
- laravel - 即使通知值也需要下拉菜单 - Voyager Laravel