Ah, Felippe... Na verdade, tua dúvida é bastante pertinente. (deve ser uma das perguntas mais interessantes com a qual tive a oportunidade de interagir...)
Vamos lá: O professor não utilizou argumentos (ou parâmetros) explícitos nas demais funções até então pois essas não "exigiam" isso.
Imaginemos, por exemplo, que queiramos fazer uma função simplória para calcular 2 + 1.
def soma():
soma = 0
elemento_1 = 2
elemento_2 = 1
soma = elemento_1 + elemento_2
return soma
print (soma())
Nessa função (soma) que eu criei para calcular 2 + 1 eu não precisei adicionar argumentos à função, percebeu?
Note que tudo o que precisei para confeccionar a lógica da função estava disposto lá dentro, tudo botinho e prontinho. Eu não precisei importar nada, não precisei de "descobrir" nenhuma variável no meio do caminho e também não precisei chamar nenhuma outra função para essa aí funcionar. Ela simplesmente calcula os 2 +1.
.....
Agora, problemas "reais" não são tão simplórios assim... Vamos adicionar um pouquinho mais de complexidade ao exemplo da função soma. Digamos que em vez de somar apenas 2 +1 eu quero criar uma "engrenagem", supondo que minha função possa futuramente fazer parte de um código mais complexo e possa ser chamada para, talvez, resolver questões em 1 ou mais instancias de trabalho. Agora, eu quero que aquela minha função def soma() não apenas some 2 +1, mas some qualquer número que eu quiser. Vamos criar uma função genérica para soma de 2 argumentos quaisquer. Vamos lá:
def soma(elemento_1,elemento_2):
soma = 0
soma = elemento_1 + elemento_2
return soma
print (soma(2,1))
Felipe, note que ambas as funções tem a "mesma" utilidade: calcular a soma de 2 elementos. Mas você conseguiu notar a diferença entre a execução de ambas?
A primeira é fechada. Eu forneço os elementos dentro da def (o 1 e o 2) e os mando somar. Ambos são dados, são fechados. Sempre que eu chamar soma () elá vai me retornar = 3, caso eu não atribua outro valor às minhas variáveis elmento1,elemento2.
Agora, na segunda execução, def soma é uma engrenagem de um potencial todo, de uma lógica mais sistemática. Notou que eu em vez de dar para a função variáveis fechadas, eu forneci argumentos que podem ser mutáveis de acordo com, bem, o que eu desejar. Os argumentos, nesse caso em particular, são também 1 e 2. Mas, seu eu quisessem, poderia chamar a segunda função com outros argumentos, como 3 e 4, por exemplo. E, quando realizasse essa chamada ele automaticamente realizaria a logica do somatório = 7.
def soma(elemento_1,elemento_2):
soma = 0
soma = elemento_1 + elemento_2
return soma
print (soma(3,4))
E, a coisa mias legal disso é que você não precisa reescrever o CORPO da função para realizar mudança nas variavies. Isso reduz MUITO retrabalho uma vez que corre um risco menor de você reescrever uma função erradamente e colocar em risco uma das engrenagens do teu programa. (Já vi isso acontecendo com nossos desenvolvedores, pode ser catastrófico...)
...
..
.
Bem, eu espero que tenha ficado melhor para você visualizar a diferença da necessidade do uso de parâmetros nas funções.. Escolhi esse exemplo da soma pois imaginei que ficasse mais didático ;)