python에서 함수관련하여 질문드립니다.

조회수 483회
def income_sheet_Y(code):
    # 데이터 가져오기

    fs_rpt_url = "http://comp.fnguide.com/SVO2/ASP/SVD_Finance.asp?pGB=1&gicode=A{}&cID=&MenuYn=Y&ReportGB=&NewMenuID=103&stkGb=701".format(code)
    fs_rpt_res = requests.get(fs_rpt_url)
    soup = BeautifulSoup(fs_rpt_res.text, "lxml")

    # 데이터프레임 생성

    data_column = ['0', '1', '2', '3', '4', '5']
    income_sheet_Y_df = pd.DataFrame(data=None, columns=data_column, index=['0'])


    # data 찾기
    data_rows = soup.find("div", attrs = {"id":"divSonikY"}).find("tbody").find_all("tr")

    for row in data_rows:
        columns = row.find_all("td")
        data_row = [column.get_text().strip() for column in columns]
        income_sheet_Y_df = income_sheet_Y_df.append(pd.Series(data_row, index=income_sheet_Y_df.columns), ignore_index=True)

    # data를 숫자로 처리하기

    income_sheet_Y_df['0'] = income_sheet_Y_df['0'].str.replace(',', '')
    income_sheet_Y_df['1'] = income_sheet_Y_df['1'].str.replace(',', '')
    income_sheet_Y_df['2'] = income_sheet_Y_df['2'].str.replace(',', '')
    income_sheet_Y_df['3'] = income_sheet_Y_df['3'].str.replace(',', '')
    income_sheet_Y_df['4'] = income_sheet_Y_df['4'].str.replace(',', '')
    income_sheet_Y_df['5'] = income_sheet_Y_df['5'].str.replace(',', '')
    income_sheet_Y_df = income_sheet_Y_df.replace('', np.NaN)
    income_sheet_Y_df = income_sheet_Y_df.apply(pd.to_numeric, errors = 'coerce')
    income_sheet_Y_df = income_sheet_Y_df.fillna(0)

    # 데이터 예쁘게 만들기
    columns = soup.find("div", attrs = {"id":"divSonikY"}).find("thead").find_all("th")
    data_column = [column.get_text().strip() for column in columns][1:7]

    financial_index = ['연습', '매출액', '매출원가', '매출총이익', '판매비와관리비', '   인건비', '   유무형자산상각비', '   연구개발비', '   광고선전비','   판매비','   관리비','   기타원가성비용','   기타','영업이익','영업이익(발표기준)','금융수익','   이자수익','   배당금수익','   외환이익','   대손충당금환입액','   매출채권처분이익','   당기손익-공정가치측정 금융자산관련이익','   금융자산처분이익','   금융자산평가이익','   금융자산손상차손환입','   파생상품이익','   기타금융수익','금융원가','   이자비용','   외환손실','   대손상각비','   당기손익-공정가치측정 금융자산관련손실','   매출채권처분손실','   금융자산처분손실','   금융자산평가손실','   금융자산손상차손','   파생상품손실','   기타금융원가','기타수익','   이자수익','   배당금수익','   외환이익','   재고자산감모손실환입','   재고자산폐기(처분)이익','   당기손익-공정가치측정 금융자산평가이익','   자산처분(폐기)이익','   자산평가이익','   자산손상차손환입','   파생상품이익','   임대료수익','   로열티수익','   수수료수익','   대손충당금환입','   충당부채환입액','   기타','기타비용','   이자비용','   외환손실','   재고자산감모손실','   재고자산폐기(처분)손실','   당기손익-공정가치측정 금융자산평가손실','   자산처분(폐기)손실','   자산평가손실','   자산손상차손','   파생상품손실','   기타대손상각비','   충당부채전입액','   기타','종속기업,공동지배기업및관계기업관련손익','   지분법손익','   종속기업,공동지배기업및관계기업투자주식처분손익','   종속기업,공동지배기업및관계기업투자주식손상관련손익','   기타', '세전계속사업이익', '법인세비용', '계속영업이익', '중단영업이익', '당기순이익', '   지배주주순이익', '   비지배주주순이익']
    income_sheet_Y_df.index = financial_index
    income_sheet_Y_df.columns = data_column
    income_sheet_Y = income_sheet_Y_df.drop("연습")
    return income_sheet_Y
def income_sheet_Y(code):
        ........................
    return ......................

def valuation(code):
    income_sheet_Y = income_sheet_Y(code)

안녕하세요 파이썬 초보입니다.

이번에 제가 드릴 질문은 함수정의와 관련된 부분입니다.

위 두번째 코딩처럼 무언가 A라는 함수를 정의 내리고, 그것을 B라는 함수안에서 A라는 함수를 실행하려고 하는데요,

UnboundLocalError: local variable 'income_sheet_Y' referenced before assignment

이런 에러가 뜨네요.

전역변수, 지역변수와 관련된 문제라는 부분은 검색을 통해 알았는데, 몇가지 궁금한게 있어서 질문드립니다.

  1. global을 통해 전역변수를 가져오는 것처럼 함수를 가져오는 것이 가능한지(전역함수?)
  2. 원래 A라는 함수를 B라는 함수에 적용가능한 건데, 제가 변수를 겹치게 설정해서 오류가 발생한건지
  3. 위 두 가지가 이외에 혹시 문제되는 부분이 있는 건지 궁금합니다.

맘 같아서는 코드를 전부올리고 싶은데, 코드짜놓은게 너무 길어서 보시기 불편하실까봐 요약해서 궁금증을 올렸습니다.

항상 해시 코드를 통해 파이썬 공부에 많은 도움을 받고 있습니다.

답변 주시는 모든 분들께 감사드립니다.

2 답변

  • 아래 valuation(code) 부분에서 에러가 날 것 같은데요.

    def income_sheet_Y(code):
            ........................
        return ......................
    
    def valuation(code):
        income_sheet_Y = income_sheet_Y(code)
    

    변수의 값이 정해지고 다른 함수에서도 사용하는 고정된 값인데, 특정 함수에서 해당 변수의 값을 변경하려할 때 나타나는 에러로 알고 있습니다.

    이럴 때 global 함수로 변수 선언을 하면 문제 해결이 될 수 있지만.. 같은 이름의 변수가 너무 많이 생겨버립니다.

    특정 변수의 값을 여러 번 가져와야 하는 경우 다음과 같이 값을 받는 변수명을 변경해서 사용하면 문제없이 작동하는 것으로 알고 있습니다.

    def valuation(code):
        a = income_sheet_Y(code)
        b = income_sheet_Y(code)
        c = income_sheet_Y(code)
        d = income_sheet_Y(code)
    
  • 긴 설명 필요 없이 그냥 2번이요.

    asp 같은 곳에서 그러던데, 함수 리턴을 하기 위한 변수를 함수명과 동일하게 할 필요 전혀 없습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)