Ошибка выделения кода в функцию

441 просмотра
0
0 Комментариев

Есть учебная задача. Это — пузырьковая сортировка в которой на выходе — список перестановок элементов. Так сказать — запись сортировки.
Решение выглядит так:

def swap_sort(array):
    ar = list(array)
    _=''
    for ind in range(len(ar)):
        if ind>0:
            i=ind
            if ar[i]<ar[i-1]:
                ar[i-1], ar[i] = ar[i], ar[i-1]
                if  not _:
                    _ = str(i-1) + str(i)
                else:
                    _ +=', ' + str(i-1) + str(i)
 
                for i in range(ind-1, 0, -1):
                    if ar[i]<ar[i-1]:
                        ar[i-1], ar[i] = ar[i], ar[i-1]
                        if  not _:
                            _ = str(i-1) + str(i)
                        else:
                            _ +=', ' + str(i-1) + str(i)
 
    return _
 
a=(6,4,2)
print(swap_sort(a))

Все было хорошо, пока я не захотел выделить «подпрограмму» обмена элементов. Стало выдавать ошибку:

Traceback (most recent call last):
  File "F:/PyCodes/WOW/swap_def/swap_bulbe_.py", line 25, in <module>
    print(swap_sort(a))
  File "F:/PyCodes/WOW/swap_def/swap_bulbe_.py", line 17, in swap_sort
    swap(ar, i)
  File "F:/PyCodes/WOW/swap_def/swap_bulbe_.py", line 8, in swap
    if  not _:
NameError: name '_' is not defined

в таком коде:

def swap_sort(array):
    ar = list(array)
    _=''
 
    def swap(ar, i):
        global _
        ar[i-1], ar[i] = ar[i], ar[i-1]
        if  not _:
            _ = str(i-1) + str(i)
        else:
            _ +=', ' + str(i-1) + str(i)
 
    for ind in range(len(ar)):
        if ind>0:
            i=ind
            if ar[i]<ar[i-1]:
                swap(ar, i)
                for i in range(ind-1, 0, -1):
                    if ar[i]<ar[i-1]:
                        swap(ar, i)
 
    return _
 
a=(6,4,2)
print(swap_sort(a))

Вопрос касается только правильного выделения «подпрограммы». То есть хочется написать функцию с полезным побочным эффектом. Предложеные решения усложняют код добавлением еще одного присваивания, которого не хочется.
Однако поведение global стало для меня неожиданностью )))
И nonlocal тоже не помогает…


Добавить комментарий

3 Answers

Python Опубликовано 14.12.2018
0

_=""
def swap_sort(array):
    ar = list(array)
 
    def swap(ar, i):
        global _
        ar[i-1], ar[i] = ar[i], ar[i-1]
        if  not _:
            _ = str(i-1) + str(i)
        else:
            _ +=', ' + str(i-1) + str(i)
 
    for ind in range(len(ar)):
        if ind>0:
            i=ind
            if ar[i]<ar[i-1]:
                swap(ar, i)
                for i in range(ind-1, 0, -1):
                    if ar[i]<ar[i-1]:
                        swap(ar, i)
 
    return _
 
a=(6,4,2)
print(swap_sort(a))

Глобальную переменную нужно определять до функции

Вывод

01, 12, 01

Добавить комментарий
0

Вот нашел такое решение:

_=""
def swap(ar, i):
    global _
    ar[i-1], ar[i] = ar[i], ar[i-1]
    if  not _:
        _ = str(i-1) + str(i)
    else:
        _ +=',' + str(i-1) + str(i)
 
def swap_sort(array):
    global _
    ar = list(array)
    _=""
    for ind in range(len(ar)):
        if ind>0:
            i=ind
            if ar[i]<ar[i-1]:
                swap(ar, i)
                for i in range(ind, 0, -1):
                    if ar[i]<ar[i-1]:
                        swap(ar, i)
    return _
 
 
a=(6,4,2)
print(swap_sort(a))
print(swap_sort((1, 2, 3, 4, 5, 6, 7, 8, 9, 1)))

Добавить комментарий
0

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

def swap(ar, i, result):
    ar[i-1], ar[i] = ar[i], ar[i-1]
    if not result:
        return str(i-1) + str(i)
    else:
        return result + ', ' + str(i-1) + str(i)

А вызываем так:

_ = swap(ar, i, _)

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up