LINUX.ORG.RU

Нужна помощь перевода кода на скриптовый язык Python!!!

 


0

1

Добрый день!!! Имеется код нужна подмога перевода его на язык python...

public static double calculateDistance(int txPower, double rssi, boolean eddy) {
    if (rssi == 0) {
        return -1.0; // if we cannot determine distance, return -1.
    }

    double ratio = rssi*1.0/(eddy?txPower-41:txPower);
    if (ratio < 1.0) {
        return Math.pow(ratio,10);
    }
    else {
        double accuracy =  (0.89976)*Math.pow(ratio,7.7095) + 0.111;
        return accuracy;
    }
}

На данный момент результат продвигается медленно:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import math

def distance(n,         # (в свободном пространстве)
             tx_power,  # Мощность передачи (TxPower) !!! (26) (2)
             rssi,      # Индикатор мощности принятого сигнала (RSSI)
             eddy=False):
    if rssi == 0:
        return -1.0
    if eddy:
        tx_power - rssi
    ratio = rssi*1.0/tx_power 
    if ratio < 1.0:
        return math.pow(10, ratio)
    else:
        return 0.89976*math.pow(7.7095, ratio) + 0.111


print(distance(n=2, tx_power=2, rssi=-17, eddy=False))


Последнее исправление: BlackPhreaker (всего исправлений: 4)

Иди учи основы по питону. У тебя отступов нет в блоке if/else, так нельзя. И вообще, мне не понятно почему у тебя переменные в глобальном пространстве и откуда в них значения. В исходном коде таких значений нет.

RSSI = -17

Ты объявляешь переменную и сразу отнимаешь от нуля 17?

Deleted
()

В питоне важны отступы, плюс ты забыл двоеточия. И используй пробелы, а не табы. Ну и сам код… Короче:

import math

# Задаём функцию (нормально, а не с глобальными переменными)
def distance(n,         # (в свободном пространстве)
             tx_power,  # Мощность передачи (TxPower) !!! (26) (2)
             rssi,      # Индикатор мощности принятого сигнала (RSSI)
             eddy=False):
    if rssi == 0:
        return -1.0
    if eddy:
        tx_power -= 41
    ratio = rssi/tx_power  # зачем умножать на 1.0?
    if ratio < 1.0:
        return math.pow(10, ratio)
    else:
        return 0.89976*math.pow(7.7095, ratio) + 0.111


# Используем эту функцию как хотим
print(distance(n=2, tx_power=2, rssi=-17, eddy=False))

Непосредственно рассчёты проверяй уже сам, мне все эти волшебные числа вроде 41 и 0.89976 не говорят ровным счётом ничего. Их бы в «константы» задать что ли.

Psych218 ★★★★★
()

Аргументы укажи в функции, аналогично исходнику. Убери дубль-строку.

Deleted
()
Ответ на: комментарий от Psych218

Спасибо огромное!!! Буду разбираться на примере сам!!!

BlackPhreaker
() автор топика

А почему так получилось с отступами? Ты их сам что ли выставляешь? Любой нормальный современный текстовый редактор, может сам выставлять отступы.

th3m3 ★★★★★
()

Вообще тут лучше примерить TDD, т.е. у тебя есть оригинал, ты знаешь при каких входных значениях какие значения будут на выходе, пишешь юнит тесты, а потому переносишь логику. Это хорошо что ты от magic numbers начал избавляться. В оригенале код тоже не очень:

return -1.0; // if we cannot determine distance, return -1.

Это типа сигнальное состояние? Лучше было использовать в качестве возвращаемого значения Optional<Double>, или NaN. И вместо inline комментария надо было уже нормальный коммент над методом. Короче, код в оригинале не очень, смело исправляй все что кажется странным.

P.S. Насколько я знаю в python вместо math.pow можно использовать **

Aber ★★★★★
()
Ответ на: комментарий от Psych218

зачем умножать на 1.0?

Видимо костыль для 2 питона, ибо если оба числа будут int, получится целисленное деление.

Deleted
()

addyTxPower-41

Господи Иисусе, Иосиф и дева Мария, ты обос... Ты переводишь говнокод с одного языка на другой.Ты же понимаешь, что говнокод именно так размножается?

anonymous
()
Ответ на: комментарий от Psych218

math.pow(10, ratio)

да наоборот жи! math.pow(ratioб 10), с 7.7095 то же самое.

и можно без модуля жи: ratio**10

anonymous
()
Ответ на: комментарий от Shadow

Вот уж совет так совет. Ему для его хелловорлдов IDLE за глаза хватит, ну можно еще ST3 взять, сразу приобщиться к прекрасному.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Aber

return -1.0 // if we cannot determine distance, return -1.

а в питоне для таких целей вообще исключения бросать принято

eternal_sorrow ★★★★★
()
Ответ на: комментарий от Deleted

Видимо костыль для 2 питона, ибо если оба числа будут int, получится целисленное деление.

можно было и без этого

[dan@dan-desktop ~]$ python2
Python 2.7.13 (default, Jul 21 2017, 03:24:34)
[GCC 7.1.1 20170630] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> float(1)
1.0
melkor217 ★★★★★
()

Первые два ответа просто восхитительны.
По большому счёту, на них тред о том как писать на пыхтонге можно было бы и закончить.

d_a ★★★★★
()
Последнее исправление: d_a (всего исправлений: 1)
Ответ на: комментарий от bodqhrohro_promo

Спасибо Всем за бурное участие, и помащь... Формула была изменена на другую, так как не удалось добиться верного результата!!! Вследствие чего изменился и код...

BlackPhreaker
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.