Juni_Dev_log

20.11.15 (MyPick-31) TIL 본문

Project/MyPick-31(Dev)

20.11.15 (MyPick-31) TIL

Juni_K 2020. 11. 15. 12:54

(문제①) python 에서 if / elif / else 구문에서 사용한 변수를 계속해서 사용하려고하는데, 변수 선언이 안되었다는 오류가 발생.

if / elif / else 구문에서 반환하려고 하는 값을 return 에 담아서 마무리를 지어줘야 다음 과정에서도 계속 변수로 사용할 수 있다.

 

wikidocs.net/21074

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

또한, if문을 통해서 받아온 아이스크림 flavor 가 없을 경우에는 if 조건문을 통한 결과로 pass를 실행해서 코드의 실행 시간을 단축시켰다.

 

boysboy3.tistory.com/143

 

python break, pass, continue 차이점

파이썬으로 코딩을 하다보면 break문, pass문, continue 문이 자주 보인다. 헷갈리는 부분을 정리하고자 각 각 사용법과 예시를 통해 정리해본다. break : 특정 반복문(while, for 문)에서 루프를 빠져나올

boysboy3.tistory.com

pass와 비슷한 기능으로 break, continue 라는 것이 있는데, 

해당 글을 참고해보면, 나의 경우에는

def signature_filtering_cbase1(flavor):
    print(signature_final_flavor)
    print(flavor)
    # cbase1 값이 없을 때
    if flavor == "":
        print('base1 없어!')
        pass
    # cbase1 값이 있을 때
    elif flavor != "":
        cbase1 = list(db.signature.find({'base':{'$regex': flavor}},{'_id':0}))
        for i in range(len(cbase1)):
            cbase1_name = cbase1[i]['name']
            signature_final_flavor.append(cbase1_name)
        print(signature_final_flavor)
        return signature_final_flavor

 

만약 flavor 값이 없을 때는 굳이 db에서 찾는 과정을 하지 않아도 되기 때문에, pass 를 통해서 다음 함수를 실행하도록 함수 실행 시간을 단축시켰다.

 

이처럼 상황에 맞게 pass 와 break 그리고 continue를 사용하면 코드의 실행 속도를 단축화시킬 수 있을 듯하다.

(문제②) 전역변수와 지역변수의 Scope 범위가 헷갈리기 시작한다. 전역변수를 통해, 빈 배열을 가진 전역변수를 생성했는데, 작업을 반복하면 할수록 전역변수가 빈 배열로 초기화되지 않았다.

tariat.tistory.com/736

 

파이썬 global 전역변수 사용방법과 사용예 알아보기!

프로그래밍 언어에서 변수를 분류하는 방법은 여러가지가 있다. 그 중에 하나로 전역변수와 지역변수의 개념이 있다. 일반적으로 전역변수는 프로그램에 혼란을 주기 때문에 사용을 권장하지

tariat.tistory.com

해당 글을 참고해보니, 함수 내에서 전역변수를 선언할 때

# bring_signature_db
@app.route('/bring_signature_ice_cream', methods=['POST'])
def bring_signature_ice_cream():
    # 함수 내에서 전역변수로 선언
    global signature_final_flavor
    print('////signature/////')
    receive_ice_cream = json.loads(request.form['ice_cream'])
    ice_cream = list(receive_ice_cream.values())
    # 모든 아이스크림을 가져올 때
    if ice_cream == []:
        print('모든 아이스크림 가져오기')
        bring_signature_db = list(db.signature.find({},{'_id':0}))
        return(jsonify({'result':'success_1','data':bring_signature_db}))
    #필터링으로 아이스크림을 가져올 때
    else:
        print('필터링 아이스크림 가져오기')
        # 선언한 전역변수에 빈 배열 넣기
        signature_final_flavor = []
        print(signature_final_flavor)
        temp_flavor = ice_cream[0]
        print(temp_flavor)
        for i in range(len(temp_flavor)):
            print(i)
            if i == 0 :
                print(signature_final_flavor)
                signature_filtering_cbase1(temp_flavor[i])
            if i == 1 :
                signature_filtering_cbase2(temp_flavor[i])
            if i == 2 :
                signature_filtering_ctopping1(temp_flavor[i])
            if i == 3 :
                signature_filtering_ctopping2(temp_flavor[i])
            if i == 4 :
                signature_filtering_csyrup1(temp_flavor[i])
            if i == 5 :
                signature_filtering_csyrup2(temp_flavor[i])
        print('-----------')
        print(signature_final_flavor)
        print(len(signature_final_flavor))

위의 코드에서처럼 함수 내에서 global 을 사용해서 전역변수 선언을 해주면 그 함수 내에 있는 모든 함수들에서 사용할 수 있게 된다.

global 을 이용해서 signature_final_flavor 를 선언하고 필터링할 때 걸리는 else 구문에서 signature_final_flavor 에 [ ] 빈 배열을 정의해주면서 해당 기능을 구현했다.

 

(문제③) db에서 필터링한 정보들을 가져왔는데, 이미 나열되어있는 카드를 초기화시켜준 뒤(깨끗하게 없앤 뒤), append 를 통해서 카드를 붙여야하는데 기존에 있던 카드가 계속 연달아 붙은 형태로 뒤죽박죽이 되었다.

najaehwa.tistory.com/entry/jQuery-removeempty

 

[jQuery] 요소 지우기 - remove(),empty()

remove(); 요소 자체를 지운다. $("#target").remove(); empty(); 요소 자체가 아니라 요소의 내용을 지운다.(append() 사용전에 쓰면 되겠다) $(document).ready(function() { $("#target").empty(); $('#targe..

najaehwa.tistory.com

append() 를 하기 전에, 기존에 있었던 정보들을 보여줬던 html 카드를 지워야하기 때문에, 요소의 내용을 지우는 empty() 를 사용해서 하위 요소들을 모두 지우고 append()를 했다.

 

//db에서 signature 아이스크림 데이터를 가져와서 카드로 배열하는 함수
        function bring_signature_db(ice_cream) {
            bring_ice_cream = ice_cream

            jQuery.ajaxSettings.traditional = true; // ajax로 배열 보낼때..

            $.ajax({
                type: "POST",
                url: "/bring_signature_ice_cream",
                data: {ice_cream: [JSON.stringify({bring_ice_cream: bring_ice_cream})]},
                success: function (response) {
                    // 필터링한 아이스크림을 리스팅할 때
                    if (response['result'] == 'success_2') {
                        datas = response['data']
                        console.log('필터링 아이스크림을 조회합니다.')
                        // 카드를 붙이기 전에 초기화 (empty) 시켜주고, append
                        $('.ice-cream_contents').empty();

                        for (let i = 0; i < datas.length; i++) {
                            signature_listing_card(i, datas[i][0]['id'], datas[i][0]['name'], datas[i][0]['name_eng'], datas[i][0]['base'], datas[i][0]['topping'], datas[i][0]['syrup'])
                        }
                    }
                    // 모든 아이스크림 리스팅할 때
                    else if (response['result'] == 'success_1') {
                        datas = response['data']
                        console.log('모든 아이스크림을 조회합니다.')

                        // 카드를 붙이기 전에 초기화 (empty) 시켜주고, append
                        $('.ice-cream_contents').empty();

                        for (let i = 0; i < datas.length; i++) {
                            signature_listing_card(i, datas[i]['id'], datas[i]['name'], datas[i]['name_eng'], datas[i]['base'], datas[i]['topping'], datas[i]['syrup'])
                        }
                    }
                }
            })
        }

내 코드에서 먼저 실행되는 함수는 bring_signature_db() 이기 때문에, 해당 코드에서 for문을 통해서 card 형식으로 붙이는 함수가 실행되기전에, empty() 를 해줘야한다.

 

(문제④)  다음에 할 부분!

 

zetawiki.com/wiki/Python_%EB%A6%AC%EC%8A%A4%ED%8A%B8_%EC%9A%94%EC%86%8C_%ED%8F%AC%ED%95%A8%EC%97%AC%EB%B6%80_%ED%99%95%EC%9D%B8_in

 

Python 리스트 요소 포함여부 확인 in - 제타위키

다음 문자열 포함...

zetawiki.com

 

'Project > MyPick-31(Dev)' 카테고리의 다른 글

20.11.28 (MyPick-31) TIL  (0) 2020.11.28
20.11.22 (MyPick-31) TIL  (0) 2020.11.23
20.11.21 (MyPick-31) TIL  (0) 2020.11.22
20.11.14 (MyPick-31) TIL  (0) 2020.11.15
'배스킨라빈스 31' 아이스크림 추천 웹 서비스  (0) 2020.09.22
Comments