Ok... definicja już padła, ale systematycznie i po kolei...
Liczby zaprzyjaźnione – para różnych liczb naturalnych, takich że suma dzielników właściwych (mniejszych od tej liczby) każdej z tych liczb równa się drugiej.
Jeśli mają być różne i zakładając że zapisane są w zmiennych value1 i value2, to oznacza że:
return value1 != value2
Albo nieco prościej:
if value1 == value2:
return False
Dalej dzielniki właściwe... Czyli liczby przez które dana wartość dzieli się bez reszty.
Żeby uświadomić zasadę, weź np. liczbę 14. Zastanów się, czy powyżej połowy (czyli 7) są jakiekolwiek dzielniki właściwe?
Stąd dzielników należy szukać w zakresie od 1 (jeden), do value / 2. Jeśli jednak w języku Python zastosujesz range(...), ma ono tę właściwość że potrzebuje liczb całkowitych i zwraca zakres "bez ostatniej liczby". Tak więc zakres będzie wynikiem dzielenia całkowito-liczbowego przez dwa i dodanie 1:
range(1, value // 2 + 1)
Teraz sumy...
Wykonasz je funkcją sum(...) na ciągu danych. Wystarczy więc porównanie czy sumy są równe drugiej liczbie.
Jeśli założysz że funkcje zwracające listę dzielników nazwiesz proper_divisors(...) (czyli dzielniki właściwe), funkcja zwracająca wartość True/False będzie nazywała się is_amicable_numbers(...), to funkcja będzie wyglądała tak:
def is_amicable_numbers(value1, value2):
if value1 == value2:
return False
return (sum(proper_divisors(value1)) == value2) and (sum(proper_divisors(value2)) == value1)
Dalsze usprawnienia (łączenie warunków, list comprehensions itp., podejście funkcyjne...), to już raczej po zaimplementowaniu tego podstawowego algorytmu.
BTW. Oczywiście da się to zapisać także i w 1 linii ale kod ma być czytelny...