Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 19, 2013 15:36:12

ahpex
Зарегистрирован: 2013-01-19
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка эл-в

Доброго время суток! Вопрос в следующем:
Требуется упорядочить 3 эл-та по возрастанию. Проблема в том, что после выполнения всех сравнений и перестановок (OrdPair) числа возвращаются в начальной последовательности т.е. Swap срабатывает, но в итоге ничего не меняется. Что я делаю не так? Заранее спасибо!

def Swap(a, b):
	temp = a
	a = b
	b = temp
def OrdPair(a, b):
	if a > b:
		Swap(a, b)
def OrdTriple(a, b, c):
	OrdPair(a, b)
	OrdPair(b, c)
	OrdPair(a, b)
	return (a, b, c)

Отредактировано ahpex (Янв. 19, 2013 15:40:31)

Офлайн

#2 Янв. 19, 2013 16:55:11

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Сортировка эл-в

в функции передаются копии, а не указатели

>>> a = 1
>>> def f(arg):                                                                                                                                                                                                      
...    print('before',arg)                                                                                                                                                                                           
...    arg += 1                                                                                                                                                                                                      
...    print('after',arg)
...                                                                                                                                                                                                                  
>>> f(a)                                                                                                                                                                                                             
before 1                                                                                                                                                                                                             
after 2                                                                                                                                                                                                              
>>> a                                                                                                                                                                                                                
1 
>>> def OrdAny(*args):
...     return sorted(args)
... 
>>> OrdAny(4,1,3)
[1, 3, 4]

Офлайн

#3 Янв. 19, 2013 18:26:27

ahpex
Зарегистрирован: 2013-01-19
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка эл-в

Спасибо , но что то я туплю, то есть мне нужно в OrdTriple передать *args? Как это применить к моему коду, тк нужно реализовать, использовав данные функции, без посторонних средств?

Отредактировано ahpex (Янв. 19, 2013 18:26:37)

Офлайн

#4 Янв. 19, 2013 19:01:07

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Сортировка эл-в

если именно те, то

def Swap(ls,i1,i2):
    ls[i1],ls[i2] = ls[i2],ls[i1]
    
def OrdPair(ls,i1,i2):
    if ls[i1] > ls[i2]:
	Swap(ls,i1,i2)
  
def OrdTriple(a,b,c):
    ls = [a,b,c]
    OrdPair(ls,0,1)
    OrdPair(ls,0,2)
    OrdPair(ls,1,2)
    return ls
upd
собственно *args не обязательно, просто список передается по ссылке и если изменять его будучи переданным в функцию, то измениться и исходный список.

Отредактировано sergeek (Янв. 19, 2013 20:00:27)

Офлайн

#5 Янв. 20, 2013 12:14:50

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Сортировка эл-в

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

def OrdPair(a, b):
    if a > b:
        return b,a
    else:
        return a,b
def OrdTriple(a, b, c):
	a, b = OrdPair(a, b)
	b, c = OrdPair(b, c)
	a, b = OrdPair(a, b)
	return (a, b, c)
print OrdTriple(3,2,1)



Офлайн

#6 Янв. 20, 2013 12:49:20

ahpex
Зарегистрирован: 2013-01-19
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка эл-в

Всем спасибо, вопрос закрыт.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version