Всегда ли лучше писать функцию для всего, что нужно повторить дважды?

Сам я не могу дождаться, когда напишу функцию, когда мне нужно сделать что-то более двух раз. Но когда дело доходит до вещей, которые появляются только дважды, это немного сложнее.

Для кода, которому требуется более двух строк, я напишу функцию. Но когда приходится сталкиваться с такими вещами, как:

print ("Hi, Tom") print ("Hi, Mary") 

Я не решаюсь писать:

 def greeting(name): print ("Hi, " + name) greeting('Tom') greeting('Mary') 

Второй кажется слишком много, не так ли?


Но что, если у нас есть:

 for name in vip_list: print (name) for name in guest_list: print (name) 

И вот альтернатива:

 def print_name(name_list): for name in name_list: print (name) print_name(vip_list) print_name(guest_list) 

Все становится сложным, нет? Сейчас трудно решить.

Каково ваше мнение об этом?

Я думаю, что вы правы, чтобы не решаться определять функции в этих случаях, потому что на самом деле вы хотите отвлечь повторение , а не повторять.

Для вашего первого примера,

 for name in "Tom", "Mary": print("Hi, %s" % (name,)) 

Для вашего второго,

 for lst in vip_list, guest_list: for name in lst: print(name) 

или, в зависимости от контекста, что-то вроде этого может быть более выразительным:

 for name in itertools.chain(vip_list, guest_list): print(name) 

Я не знаю, что это лучшая практика, но я делал такие вещи с некоторыми универсальными функциями, которые я использовал в прошлом.

 def printf(string, *args, **kwargs): print(string % args, **kwargs) 

использование, где оно одно:

 printf("Hi %s", x1) 

и использование, где x – массив (при нажатии).

 printf("Hi %s\n" * len(names), *names, end="") 

 for names in names_list: printf("Hi %s\n" * len(names), *names, end="") 

Я не уверен, что печать – хороший пример. Скажем, например, загружая файл JSON:

 def load_json(filename): with open(filename) as f: return json.load(f) 

Я мог бы попытаться это сделать, даже если бы он использовался только один раз. И я догадываюсь, что это связано с тем, что предыдущий плакат упоминал об абстракции.