함수형 프로그래밍을 사용하여 파이썬에서 일반적인 방법을 만들 수 있습니까?


9

이 코드를 작성하는 방법을 개선하고 싶습니다. 지금은 거의 복사하여 붙여 넣는 6 가지 방법이 있으며 한 줄만 변경됩니다. 계산을 변경하기 위해 데이터 입력의 속성에 따라 일반적인 방법을 어떻게 만들 수 있습니까? 이를 달성하기 위해 함수형 프로그래밍을 사용하려고했지만 제대로 수행하는 방법을 잘 모르겠습니다.

이 메소드는 dict 오브젝트를 가져옵니다. 그런 다음이 객체는 JSON으로 변환됩니다. mid변수는 외부 API에서 통화 midrate와 JSON을 저장, 그것은해야합니다 전에 그렇지 않으면 API가 모든 반복에 호출됩니다 루프 프로세스를 많이 다운이 감속을위한! 그런 다음 for루프에서 입력의 데이터를 반복합니다. 메소드의 유일한 차이점은 목록에 삽입하기 전에 계산하는 것입니다..append(mid_current - bankMSell)

def margin_to_exchange_rate_sell(data):
    j = data.to_JSON()
    list_p = []
    mid = midrate.get_midrate(j["fromCurrency"][0])
    for idx, val in enumerate(j['toCurrency']):
        try:
            mid_current = 1/get_key(mid, j['toCurrency'][idx])
            bankMSell = float(j['sellMargin'][idx])
            list_p.append(mid_current - bankMSell)
        except Exception as e:
            list_p.append(0)
            print(str(e))

    return list_p

다른 방법 중 하나 :

def margin_to_exchange_rate_buy(data):
    j = data.to_JSON()
    list_p = []
    mid = midrate.get_midrate(j["fromCurrency"][0])
    for idx, val in enumerate(j['toCurrency']):
        try:
            mid_current = 1/get_key(mid, j['toCurrency'][idx])
            bankMSell = float(j['sellMargin'][idx])
            list_p.append(mid_current + bankMSell)
        except Exception as e:
            list_p.append(0)
            print(str(e))

    return list_p

(변경 라인은 list_p.append()코드를 시각적으로 비교하는 데 능숙하지 않은 사람들을위한 라인입니다 . :))
AKX

답변:


14

실제로 람다로 코드를 줄이는 방법이 있습니다 .

def margin_to_exchange_rate_sell(data):
    return margin_to_exchange_rate(data, lambda m, b: m - b)


def margin_to_exchange_rate_buy(data):
    return margin_to_exchange_rate(data, lambda m, b: m + b)


def margin_to_exchange_rate(data, operation):
    j = data.to_JSON()
    list_p = []
    mid = midrate.get_midrate(j["fromCurrency"][0])
    for idx, val in enumerate(j['toCurrency']):
        try:
            mid_current = 1/get_key(mid, j['toCurrency'][idx])
            bankMSell = float(j['sellMargin'][idx])
            list_p.append(operation(mid_current, bankMSell))
        except Exception as e:
            list_p.append(0)
            print(str(e))

    return list_p

2
마이너 nitpick,하지만 난 정말 이름을 바꿀 것 mb더 자세한 설명 뭔가 :)이 금융 코드입니다 고려
AKX

2
아마. OP가되었습니다.
mario_sunny
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.