Boa tarde Carlos, tudo bem? Espero que sim!
O sort é um método, que pertence à classe list. Portanto você consegue usá-lo somente usando o ponto ( . ) a partir de uma lista já criada.
Portanto você faz coisas do tipo:
lista_exemplo = [10, 6, 1, 3]
lista_exemplo.sort()
Isso altera a lista original, e é um método que funciona exclusivamente para listas.
Já o sorted é uma função built-in do Python, não é exclusiva da lista, recebendo um argumento do tipo iterável, como lista, tuplas e dicionários.
Ele não altera a lista original, sendo necessário atribuir a uma variável:
tupla_exemplo = (10, 6, 1, 3)
tupla_exemplo2 = sorted(tupla_exemplo)
lista_exemplo = [10, 6, 1, 3]
lista_exemplo = sorted(lista_exemplo)
Repare que podemos atribuir a mesma variável anteriormente existente, substituindo o valor original, ou atribuir a uma nova variável.
Portanto vemos aqui uma diferença, as funções retornam um valor para ser atribuído a uma variável. Enquanto os métodos não retornam valor.
- Funções apresentam o return
- Métodos não tem return
Ex: Se tentar atribuir a uma variável usando o sort, a variável terá retorno None.
Já o *args significa que a função pode receber uma quantidade de parâmetros indeterminado que poderão ser usados na função.
Exemplo:
def titulos_paises(pais, *args):
print('País: ', pais))
for titulo in args:
print('Ano: ', titulo)
Podemos passar qualquer quantidade de argumentos na função e ele irá percorrer os argumentos.
E o **kwargs funciona da mesma maneira, mas com parâmetros nomeados.
Eles não necessariamente precisam se chamar args e kwargs, é só uma convenção utilizar esses nomes, podem ser chamados *lista ou **dict por exemplo.
Espero que tenha tirado sua dúvida.
Estou à disposição. Bons estudos!