Qual é a diferença no python entre uma função assim: func () e assim: variable.func ()?

A2A. Func () é uma função, atua sobre os parâmetros que são passados ​​(entre parênteses). No Python, uma função pode retornar algo expressamente (return) ou None (valor nulo, se return não for indicado explicitamente).

No entanto, quando você tem algo como variable.func (), você está se referindo a um método definido para o tipo de objeto que é "variável" (sua classe). Lembre-se de que, no Python, tudo são objetos (mesmo cadeias e números).

Um método atuou no objeto "variável" de acordo com o que foi programado para a classe desse objeto.

func é uma função geral, variable.func () é uma função de instância conforme definida em uma classe.

  1. def funcGlobal (): classe print ("Print from Global") Foo: def __init __ (self, name): self.name = name def funcInstance (self): print ("Print from Foo instance" + str (self.name) ) @classmethod def funcClass (cls): print ("Imprimir de" + cls .__ name__)

Seria assim chamado:

  1. funcGlobal () Foo.funcClass () variável = Foo (1) variável.funcInstance ()

Resultado:

  1. Imprimir da GlobalPrint da FooPrint da instância Foo 1

Compreender os dois tipos de funções no Python (e outras linguagens) é a chave para se tornar um aluno mais intermediário / avançado da linguagem. Para os fins desta resposta, presumo que o leitor saiba o que é uma função. Se você não tiver certeza, vamos pensar em uma função como um trecho de código nomeado que pode ser chamado (ou reutilizado) quantas vezes for necessário.

O primeiro tipo é

Funções incorporadas

, alguns dos quais você aprendeu no dia 1 da sua jornada em Python, por exemplo,

impressão()

  1. >>> print ('Olá, mundo!') Olá, mundo!

e

len ()

  1. >>> len ('Olá') 5

Essas funções são chamadas pelo nome, com os parâmetros (se houver) entre parênteses, assim como as funções em matemática.

Logo depois, você é exposto ao segundo tipo de funções, tecnicamente denominadas

métodos

, quando você deseja adicionar um item a uma lista:

  1. >>> frutas = ['maçã', 'fig', 'pera'] >>> frutas.append ('banana') >>> frutas ['maçã', 'fig', 'pera', 'banana']

Ao ensinar Python como primeira linguagem de programação, normalmente digo apenas que existem duas maneiras de

invocar

(apenas um termo sofisticado que significa

ligar

) funções e deixe assim. Esclareço que existe, é claro, uma diferença entre as duas, mas essa diferença está além do escopo de uma introdução ao curso de programação.

Então, o que significa a notação pontilhada (ou método)?

Bem, eu gosto de pensar em funções internas como funções "gratuitas", ou seja, elas simplesmente vivem na memória do computador, desassociadas de qualquer outra coisa.

Enquanto um método, que requer que a notação pontilhada o invoque, é uma função, mas essa função é pensada como pertencendo a outra coisa, em vez de ser livre. No caso de

acrescentar()

acima, pensamos no método como pertencendo ao

Lista

tipo.

Como analogia, considere uma loja de esquina chamada Sizer. A razão de ser desta loja é determinar a capacidade de algo. Você traz para eles uma mochila, e eles dizem algo como "sua mochila tem capacidade para 20 litros". Mas você também pode lhes trazer uma bolsa e eles determinarão sua capacidade. Você pode até trazer um automóvel para eles e eles determinarão a capacidade do porta-malas.

Agora considere um shopping chamado Rucksack, que contém várias lojas, cada uma das quais executa alguma tarefa em uma mochila. Uma loja chamada Cleaner limpará sua mochila, outra, chamada Fixer, reparará uma mochila quebrada, outra, chamada Personalizer, bordará seu nome na mochila e outra, chamada Pocket, adicionará um bolso com zíper à sua mochila.

Observe a diferença entre Sizer e Mochila. O Sizer permite que você traga qualquer objeto com capacidade e eles dirão qual é essa capacidade. Considerando que Mochila é um monte de lojas que

trabalhar em mochilas. Cada loja da Rucksack executa uma operação diferente em uma mochila, mas você não pode trazer um carro para o Personalizer e pedir que bordem seu nome no banco do motorista do carro.

Sem dúvida, você notou que o Sizer é análogo ao

len ()

, que é uma função que pode aceitar qualquer contêiner e informa quantos itens há nesse contêiner:

  1. >>> len ('olá') 5 >>> len (frutos) 4

E Mochila é análoga ao Python

Lista

tipo e os métodos que residem "dentro dele":

  1. >>> frutas = ['maçã', 'fig', 'pêra'] >>> frutas.append ('goiaba') >>> frutas.remova ('maçã') >>> frutas.sort () >> > frutas ['fig', 'goiaba', 'pêra']

Portanto, a notação pontilhada é usada quando você deseja invocar um método, ou seja, uma função que pertence a um objeto, e a notação padrão é usada quando você deseja invocar uma função interna.

Vou lhe contar um pequeno segredo - a notação pontilhada é uma abreviação de uma notação mais longa que se parece mais com a notação embutida. assim

fruits.append ('limão')

é realmente equivalente a

list.append (frutas, 'limão')

.

Podemos ver isso tentando:

  1. >>> list.append (frutas, 'limão') >>> frutas ['fig', 'goiaba', 'pêra', 'limão']