O for que você disse que tem dois valores está apenas desestruturando o retorno de pokemon.items(), que é basicamente um objeto retornando chave e valor em uma tupla, que pode ser iterada no loop for, por exemplo:
pokemon = {
"Taurus": {
"Attack": 45,
"Defense": 45,
"HP": 60,
"Speed": 40,
}
}
Pra cada pokemon ele vai pegar chave e valor e retornar um array com varias tuplas.
pokemon = {
"Taurus": [
("Attack", 45),
("Defense", 45),
("HP", 60),
("Speed", 40)
]
}
Seria esse o retorno, quando voce declara um for com duas variáveis, você tá basicamente dizendo que atributo = "Attack", valor = 45.
Mas é meio inútil você simplesmente jogar um print, porque você não tá salvando esses dados em nenhum lugar, eu faria um pouco diferente.
class Pokemon:
def __init__(self, name, attibutes):
self.name = name
self.attributes = attributes
pokedex = [
(1, Pokemon(
"Bulbasaur", {
"Attack": 49,
"Defense": 49,
"HP": 45,
"Speed": 45
})),
(2, Pokemon(
"Ivysaur", {
"Attack": 49,
"Defense": 49,
"HP": 45,
"Speed": 45
})),
]
Daria pra ser mais eficiente e puxar a pokedex toda de dentro de um JSON e criar uma classe pokedex com métodos para filtrar e encontrar os pokémons a qualquer momento. Mas seguindo esse exemplo acredito que você possa escalar melhor seu código.