* 저도 프로그래밍을 처음 공부 하는 것이기 때문에 틀린 설명이 있을 수도 있습니다. 그런 부분을 발견했을 때 따끔한 피드백을 주시면 감사하겠습니다!


if 조건문만 활용하여 경우의 수 만들기

1~100사이의 숫자를 랜덤으로 2개를 뽑아 변수 a, b를 만들고, a, b 중 누가 더 큰지 맞추는 간단한 프로그램을 만들어 보겠습니다.


import random

numbers = range(1,100+1)

a = random.choice(numbers)
b = random.choice(numbers)

guess = input("Which one is bigger? type a, b, or match : ")

변수 a, b를 설정하였고, 프로그램을 실행했을 때 a, b 중 하나를 선택할 수 있도록 input 함수까지 작성하였습니다.

그 다음으로, 답을 선택 했을 때 나올만한 경우의 수를 생각해보도록 하겠습니다.
아래의 표 처럼 총 9가지 경우의 수가 나올 것입니다.


 a>b and guess = "a" 

 (right)

a<b and guess = "a" 

 (wrong) 

a=b and guess = "a" 

 (wrong) 

 a>b and guess = "b" 

(wrong)

a<b and guess = "b" 

(right) 

 a=b and guess = "b" 

(wrong) 

 a>b and guess = "match" (wrong)

 a<b and guess = "match" (wrong)

 a=b and guess = "match" (right)



그럼 if 조건문을 활용하여 9가지의 경우의 수와 그에 따른 결과를 입력해보겠습니다.


#if 조건문만 활용

import random

numbers = range(1,100+1)

a = random.choice(numbers)
b = random.choice(numbers)

guess = input("Which one is bigger? type a, b, or match : ")

if a>b and guess == "a" :
    print(f"right. result : a = {a}, b = {b}")
elif a>b and guess == "b" :
    print(f"wrong. result : a = {a}, b = {b}")
elif a>b and guess == "match" :
    print(f"wrong. result : a = {a}, b = {b}")  
elif a<b and guess == "a" :
    print(f"wrong. result : a = {a}, b = {b}")
elif a<b and guess == "b" :
    print(f"right. result : a = {a}, b = {b}")
elif a<b and guess == "match" :
    print(f"wrong. result : a = {a}, b = {b}")
elif a==b and guess == "a" :
    print(f"wrong. result : a = {a}, b = {b}")
elif a==b and guess == "b" :
    print(f"wrong. result : a = {a}, b = {b}")
elif a==b and guess == "match" :
    print(f"right. result : a = {a}, b = {b}")


표의 내용을 참고하여 위와 같이 입력하면 될 것입니다.

하지만 왠지 경우의 수가 너무 많아 복잡해보입니다.. 경우의 수가 이것보다 더 많다면, 일일히 if 조건문으로 모든 경우의 수를 입력하기 힘들 것입니다. 그리고 경우의 수를 일일히 입력하다보면 실수로 코드를 잘못 입력할 가능성도 그만큼 올라갈 것입니다. 게다가 오류가 발생한다면, 어디서 오류가 났는지 찾는 것도 번거로울 것입니다.

이럴 때는 return과 boolean을 활용하여 경우의 수를 줄이는 것이 더 효과적일 것입니다.



return과 boolean을 활용한 조건문 간소화

#return과 boolean 활용

import random

numbers = range(1,100+1)

a = random.choice(numbers)
b = random.choice(numbers)

guess = input("Which one is bigger? type a or b, or match : ")
def check(guessab) :
    if a == b :
        return guess == "match" 
    elif a > b :
        return guess == "a"
    elif a < b :
        return guess == "b"

result = check(guess, a, b)

if result == True :
    print(f"right. result : a = {a}, b = {b}")
else : 
    print(f"wrong. result : a = {a}, b = {b}")


먼저 check라는 함수를 만들었습니다. 우리가 답으로 선택할 수 있는 경우의 수는 a, b, match 이렇게 3가지가 있을 것입니다. 이것을 if 조건문과 return 기능을 통해, a = b이면 guess는 match, a > b이면 guess는 a, a < b이면 guess는 b가 되도록 설정하였습니다.

그 다음으로는 result = check(guess, a, b)라고 변수를 선언하였습니다.

마지막으로 boolean을 활용하여 유저가 직접 입력한 답과 check 함수에서 만든 조건과 일치하면 정답, 일치하지 않으면 오답이라고 출력되도록 만들었습니다.






프로그램을 실행해보면 위의 스크린샷 처럼 잘 작동되고 있음을 확인할 수 있습니다.


이렇게 return과 boolean을 활용하면 경우의 수가 줄어들기 때문에 써야하는 if 구문의 숫자도 줄일 수 있다는 장점이 있습니다. 

블로그 이미지

방구석 세계인

관심분야 : 외국어 학습, 프로그래밍, 책 리뷰 등...

,

* 저도 프로그래밍을 처음 공부 하는 것이기 때문에 틀린 설명이 있을 수도 있습니다. 그런 부분을 발견했을 때 따끔한 피드백을 주시면 감사하겠습니다!



global scope(전역 범위) vs local scope(지역 범위)

number = 5

def number_function() :
    number = 6
    print(f"number inside function : {number}")
    
number_function()
print(f"number outside function : {number}")


먼저 위와 같이 코드를 입력합니다. 

저는 number = 5 라는 variable(변수)를 선언하였고, 다시 number_function() 이라는 function(함수)를 선언하었습니다. 함수의 내용은 변수 number를 6으로 바꾼다는 내용입니다.

어떤 결과가 나올지 먼저 추측해보시고 스크롤을 내려 결과를 확인해보시길 바랍니다.









number_function() 의 결과값은 6으로 출력되었고, 마지막줄은 결과값이 5로 출렸되었습니다.

똑같은 이름의 변수인데도 값이 달라지는 이상한 현상이 발생한 것입니다.



이 현상을 이해시켜주는 개념이 바로 global scope(전역 범위) 와 local scope(지역 범위) 입니다.

global scope(전역 범위) 와 local scope(지역 범위)의 뜻을 살펴보면,


global scope : 해당 file 전체에 걸쳐서 영향력을 행사함

local scope : 부분(ex. 함수 내부)에서만 영향력을 행사함. (함수) 밖에는 아무 영향도 끼치지 않음


이라고 할 수 있겠습니다.


따라서 함수 number_function()에서 선언한 변수 number = 6는 함수 밖에서는 적용되지 않았던 것입니다. 그리고 마지막 줄은 원래 선언되어있던 변수 number = 5로 결과값이 출력되었습니다.


* global scope(전역 범위) 와 local scope(지역 범위)를 변수의 입장에서 말한다면, global variable(전역 변수) 와 local variable(지역 변수) 라고 부릅니다.



global keyword(글로벌 키워드)

number = 5

def number_function() :
    global number
    number = 6
    print(f"number inside function : {number}")
    
number_function()
print(f"number outside function : {number}")


이번엔 함수 number_function()에 global number 라는 내용을 추가해보았습니다. 

이번에도 어떤 결과가 나올지 먼저 추측해보시고 스크롤을 내려 결과를 확인해보시길 바랍니다.









아까와는 달리 이번에는 모두 6이라고 출력되었네요. global number 라는 내용을 추가로 입력했더니 결과값이 같아졌습니다. 변수 number = 6는 원래 함수 number_function() 안에서만 유효했지만, global keyword(글로벌 키워드)를 통해 파일 전체에서 유효하도록 바꾸었기 때문입니다.


global keyword(글로벌 키워드)의 형태를 살펴보면,


global + 변수이름 (ex. global number)

(의미 : 지역 변수를 전역 변수로 바꾸어줌)


이라고 할 수 있습니다.


다시 위의 작성한 코드로 돌아가보겠습니다. 

global keyword(글로벌 키워드) 덕분에 함수 number_function()의 변수 number는 파일 전역에 걸쳐 영향을 끼치는 전역 변수로 바뀌었습니다. 그래서 첫줄에 선언된 변수 number는 함수 number_function()의 영향을 받아 6으로 바뀌었고, 마지막 줄에서는 바뀐대로 6으로 출력된 것입니다.







*보너스 퀴즈

number = 5

def number_function() :
    global number
    number = 6
    print(f"number inside function : {number}")

print(f"number outside function : {number}")    
number_function()


위의 코드를 출력하면 어떤 결과값이 나올까요?

어떤 결과가 나올지 먼저 추측해보시고 스크롤을 내려 결과를 확인해보시길 바랍니다.









글로벌 키워드를 사용했음에도 서로 다른 결과값이 출력됨을 확인할 수 있습니다.

그 이유는 파이썬은 먼저 입력한 코드 순으로 결과를 출력하기 때문입니다.


def number_function() :
    global number
    number = 6
    print(f"number inside function : {number}")

이 부분은 함수의 내용이 어떤 것인지 설정하는 코드일 뿐이라서 실제로는 출력되지 않습니다.


따라서 실제 출력되는 순서는 아래와 같습니다.

1. print(f"number outside function : {number}")    
2. number_function()


변수 number가 6으로 바뀌는 것은 함수 number_function() 안에서 일어나는 일이기 때문에,

print(f"number outside function : {number}") 에서 먼저 5로 출력되고, 그 다음 작성되어있는 함수 number_function()에서 6으로 출력되는 것입니다.

블로그 이미지

방구석 세계인

관심분야 : 외국어 학습, 프로그래밍, 책 리뷰 등...

,