Python

Python - 제어문

해변 2022. 3. 27. 21:28

**Python에서는 특히 들여쓰기가 중요하다는 사실을 알고 시작하자!

 

먼저 조건문에 대해서 알아보자.

money = True
if money:
    print("택시 타")
else:
    print("걸어가")

출력 결과

택시 타

money가 True 값을 가지면 "택시 타"를 출력하고 그 외의 경우 (False)는 "걸어 가"를 출력을 하는 조건문이다.

첫번째 줄에서 money=True를 선언해주었기에 당연히 if조건은 참이 되고 "택시 타"가 출력이 되는 원리이다.

 

저렇게 변수가 올 수도 있지만 비교연산자를 통해 boolean 출력 값을 가지는 식을 이용하는 방법도 있다

C - 연산자 (tistory.com)

 

C - 연산자

1. 산술연산자 int a = 20; int b = 3; printf("a+b = %d\n", a+b); printf("a-b = %d\n", a-b); printf("a*b = %d\n", a*b); printf("a/b = %d\n", a/b); printf("a/b 의 나머지 값 = %d\n", a%b); 출력 결과 a+b..

dusen0528.tistory.com

비교 연산자에 대해서는 위에 정리한 글이 있으니 참고하자

a = 1
b = 2
if a<b:
    print("택시 타")
else:
    print("걸어 가")

출력 결과

택시 타

a<b가 참이므로 if문이 실행 되고 "택시 타"가 출력되는 것을 볼 수 있다.

 

근데 만약 if 조건이 아닌 if False가 온다면 어떻게 될까?

if False:
    print("택시 타")
else:
    print("걸어 가")

출력 결과

걸어 가

False면 바로 다음 조건으로 넘어가서 else가 출력이 되는 것을 볼 수 있다.

논리 연산자를 이용해서

money = 2000
card = 1
if False or card:
    print("택시 타")
else:
    print("걸어 가")

출력 결과

택시 타

or은 둘중 하나만 참이여도 참으로 계산하는 논리연산자이기에 "택시 타"가 출력이 된다

if True | False //OR연산자이기에 하나만 참이여도 참이므로 True 출력
if True & False //AND연산자이기에 둘 다 참일 경우에만 참이므로 False출력
if not False    //NOT 연산지이기에 반댓값을 출력하므로 True

 

다른 예제를 통해 좀 더 이해해보자

money = 2000
card = 1
if 1 in [1,2,3]:
    print("택시 타")
else:
    print("걸어 가")

만약 []리스트안에 1이 있을 경우 참이므로 "택시 타"가 출력 되고 아닐 경우 "걸어 가"가 출력 된다

출력 결과

택시 타

not연산자를 이용해보자

money = 2000
card = 1
if 1 not in [1,2,3]:
    print("택시 타")
else:
    print("걸어 가")

출력 결과

걸어 가

1이 []리스트 안에 있기에 참이지만 not으로 인해 false가 반환되며 else문이 실행됨

 

<pass>

money = 2000
card = 1
if 1 in [1,2,3]:
    pass
else:
    print("걸어 가")

pass는 이 구문을 통과하라는 뜻.

 

하지만 조건이 두개로는 표현할 수 없지 않을까? 그래서 다른 언어에서는 else if가 있다

파이썬에서는 elif로 살짝 다르지만 개념은 똑같다.

만약 주머니 안에 money가 있다면 그냥 지나가고 주머니 안에 paper이 있다면 택시를 타고 그 외에 경우에는 걸어 가는 조건문이다.

pocket = ['paper', 'cellphone']
card = True
if 'money' in pocket:
    pass
elif 'paper' in pocket:
    print("택시 타")
else:
    print("걸어 가")

출력 결과

택시 타

paper이 주머니 안에 있기 때문에 "택시 타"가 출력된 결과를 확인할 수 있다.

 

원래 다른언어에서 조건문은 주석과 같이 썼었는데,,, 파이썬에서는 이러한 방식으로도 사용이 가능하다고 한다,

score = 70
# if score >= 60:
#     message = "success"
# else:
#     message = "failure"
message = "success" if score >= 60 else "failure"
print(message)
#조건부 표현식
#1.성공일때 조건을 먼저 써준다
#2.조건식을 써준다

출력 결과

success

이와 같은 구문을 조건부 표현식이라 칭하고 

조건부 표현식을 사용할 땐 꼭 else가 있어야 한다!

 

반복문(while)

while문의 기본 구조

while <조건문>:
    <수행할 구문>
    <수행할 구문>
    ....

*while문에서도 탭은 매우 중요하니 주의하자!

 

간단한 예제로 보자면

treeHit = 0
while treeHit < 10:
    treeHit = treeHit + 1
    print("나무를 %d번 찍었습니다" %treeHit)
    if treeHit == 10:
        print("나무가 쓰러진다")

출력 결과

나무를 1번 찍었습니다
나무를 2번 찍었습니다
나무를 3번 찍었습니다
나무를 4번 찍었습니다
나무를 5번 찍었습니다
나무를 6번 찍었습니다
나무를 7번 찍었습니다
나무를 8번 찍었습니다
나무를 9번 찍었습니다
나무를 10번 찍었습니다
나무가 쓰러진다

마지막 줄에 print에 탭을 넣어주지 않으면 저 print문은 if문이 아닌 while문에 속하게 된다.

이렇게 들여쓰기가 중요하니 꼭 !!!! 파이썬에서는 들여쓰기를 신경 써줘야한다

 

또한 파이썬에서는 증감 연산자 ++ -- 등은 쓸 수 없다.

그래서 treeHit++ 대신 treeHit += 1 이런 형식으로 써줘야 한다.

while문이나 for문 같은 반복문은 디버깅을 통해 확인하면 이해하기 쉽다.

 

<while문의 continue, break>

coffee = 10
money = 300
while money:
    print("돈을 받았으니 커피를 줍니다.")
    coffee = coffee -1
    print("남은 커피의 양은 %d개 입니다." %coffee)
    if not coffee:
        print("커피가 다 떨어졌습니다. 판매를 중지합니다.")
        break

 

출력 결과

돈을 받았으니 커피를 줍니다.
남은 커피의 양은 9개 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 8개 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 7개 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 6개 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 5개 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 4개 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 3개 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 2개 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 1개 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 0개 입니다.
커피가 다 떨어졌습니다. 판매를 중지합니다.

7번째 줄을 보면 if not coffee 구문이 있다.

coffee가 0이면 false이기에 if문은 실행되지 않는다. 그래서 not을 써주어 true로 값을 바꿔주고 커피가 다 떨어졌음을 알린 후 break문으로 반복문을 탈출한다.

 

이번엔 continue문에 대해서 알아보자

a = 0
while a < 10:
    a = a+1
    if a%2 == 0:
        continue
    print(a)

출력 결과

1
3
5
7
9

continue문은 해당 반복을 무시하고 다음 반복으로 넘어간다.

그렇기에 a%2==0에 해당하는 짝수에 경우 출력되지 않은 것을 확인할 수 있다.

 

while문과 비슷한 for문에 대해서도 알아보자

다른 언어와 기본 구조가 조금 다른거 같다.

for 변수 in 리스트/튜플/문자열:
	수행할 문장1
    수행할 문장2
    ...

 

간단한 예제를 통해 알아보자.

test_list = ['one', 'two', 'three']
for i in test_list:
    print(i)

출력 결과

one
two
three

test_list안에 원소들을 i안에 넣고 print를 통해 그 i를 순서대로 출력하는 것을 확인할 수 있다.

 

어떤 구조로 되어있든 하나씩 빼오는 것이라고 생각하면 편하다.

 

파이썬에서는 range함수를 다른 언어의 for문처럼 범위를 설정해서 반복시킬 수 있다.

sum = 0
for i in range(1, 11):
    sum = sum + i
print(sum)

출력 결과

55

1이상~11미만으로 반복한다는 뜻이다.

1~10의 총 합은 55이므로 올바른 출력 결과라고 할 수 있다.

 

for문 예제의 기본중에서 기본인 구구단 예제를 살펴보자

for i in range(2, 10):
    for j in range(1,10):
        print(i*j, end=" ")
    print('')

출력 결과

2 4 6 8 10 12 14 16 18 
3 6 9 12 15 18 21 24 27 
4 8 12 16 20 24 28 32 36 
5 10 15 20 25 30 35 40 45 
6 12 18 24 30 36 42 48 54 
7 14 21 28 35 42 49 56 63 
8 16 24 32 40 48 56 64 72 
9 18 27 36 45 54 63 72 81

음 공부하다 보니까 오히려 이런 for이 더 편리한거 같다.

 

**리스트 내포

result = [num*3 for num in a if num % 2 == 0]

result = []
for num in a:
    if num%2 == 0:
        result.append(num*3)

1번째줄 코드를 풀어서 쓰면 밑에 코드처럼 된다.

아직 나에겐 밑에 코드가 더 익숙한것 같다..

위에 코드를 잘 보면 result 리스트에 num*3의 값들을 담고 싶은데 그 num은 a 안에 있는 값들이고 

그 값들 중에서도 짝수만 담는다는 뜻이다.

 

*이중 포문도 마찬가지다

result = [x*y for x in range(2, 10) for y in range(1, 10)]

result = []
for x in range(2,10):
    for y in range(1,10):
        result.append((x*y))

리스트 내포 방식도 그냥 줄 바꿈 없이 쭉 이어쓴다고 생각하면 쉽게 이해할 수 있다.