Есть ли в любом случае эти 2 почти одинаковые функции, которые можно объединить в 1 общую функцию?

#python #function

#питон #функция

Вопрос:

У меня есть эти 2 функции, которые действительно похожи, за исключением другого формата журнала, который он будет получать и возвращать. Один взгляд и возвращает 4 значения, когда другой возвращает 3. Есть ли какой-нибудь способ, которым я могу сделать 1 общую функцию для этих 2? Спасибо

 gt; - Borrow book: B#lt;daygt;#lt;Student Namegt;#lt;Book namegt;#lt;days borrowed forgt; gt; - Return book: R#lt;daygt;#lt;Student Namegt;#lt;Book namegt;       def read_borrow_log(log):    borrow_day = []  borrow_student = []  borrow_book = []  borrow_duration = []    for line in log:  hash_func = line.find("#")  hash_day = line.find("#", hash_func 1)  hash_student = line.find("#", hash_day 1)  hash_book = line.find("#", hash_student 1)  hash_duration = line.find("#", hash_book 1)    borrow_day.append(int(line[(hash_func 1):(hash_day)]))  borrow_student.append(line[(hash_day 1):(hash_student)])  borrow_book.append(line[(hash_student 1):(hash_duration)])  borrow_duration.append(line[(hash_duration 1):])    return borrow_day, borrow_student, borrow_book, borrow_duration   def read_return_log(log):    return_day = []  return_student = []  return_book = []    for line in log:  hash_func = line.find("#")  hash_day = line.find("#", hash_func 1)  hash_student = line.find("#", hash_day 1)    return_day.append(int(line[(hash_func 1):(hash_day)]))  return_student.append(line[(hash_day 1):(hash_student)])  return_book.append(line[(hash_student 1):])    return return_day, return_student, return_book  def main():  borrow_day, borrow_student, borrow_book, borrow_duration = read_borrow_log(borrow_log)  return_day, return_student, return_book = read_return_log(return_log)  

Ответ №1:

Попробуйте использовать встроенное разделение строк python:

 def extract_log_parts(log):  recs = []  for line in log:  recs.append(line.split('#'))  # we want the record *columns* -- transpose the table  return tuple(map(list, zip(*recs)))  

Ответ №2:

одна вещь, которую вы могли бы сделать, — это выполнить «дополнительную» работу только при передаче определенного необязательного параметра, как показано на рисунке:

 def read_borrow_log(log,borrow_log=True):  borrow_day = []  borrow_student = []  borrow_book = []  if borrow_log is True:  borrow_duration = []   for line in log:  hash_func = line.find("#")  hash_day = line.find("#", hash_func   1)  hash_student = line.find("#", hash_day   1)  if borrow_log is True:  hash_book = line.find("#", hash_student   1)  hash_duration = line.find("#", hash_book   1)   borrow_day.append(int(line[(hash_func   1):(hash_day)]))  borrow_student.append(line[(hash_day   1):(hash_student)])  borrow_book.append(line[(hash_student   1):(hash_duration)])  if borrow_log is True:  borrow_duration.append(line[(hash_duration   1):])   if borrow_log is True:  return borrow_day, borrow_student, borrow_book, borrow_duration  else:  return borrow_day, borrow_student, borrow_book  def main():  borrow_day, borrow_student, borrow_book, borrow_duration = read_borrow_log(borrow_log)  return_day, return_student, return_book = read_borrow_log(return_log,borrow_log=False)  

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