Oii Higor, tudo bem com você?
De fato, o dicionário dados não é utilizado diretamente na função, mas ele é passado como parâmetro no momento que chamamos a função:
km_media(dados, 2019)
Quando criamos uma função que recebe alguns parâmetros, como def km_media(dataset, ano_atual), esses parâmetros existem apenas dentro dessa função e, a princípio, eles não possuem nenhum valor. Para que eles tenham algum valor, nós devemos chamar a função e, ao chamá-la, passar o valor que desejamos que sejam atribuídos a esses parâmetros. Observe:
No exemplo acima estamos fazendo justamente isso. Quando chamamos km_media(dados, 2019) estamos passando o dicionário dados (que está fora da função) para a variável dataset (que existe dentro da função) e estamos atribuindo o valor 2019 para a variável ano_atual (que também só existe dentro da função).
Dessa forma, durante a chamada da função km_media(dados, 2019) a variável dataset possuirá o mesmo conteúdo da variável dados e a variável ano_atual possuirá o valor 2019.
Espero que isso ajude. Qualquer dúvida estou por aqui, tá bom? :)
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!