# 파이썬 제어문



제어문이란 프로그래밍 언어에서 실행순서를 변경시키거나 또는 조건에 따라 실행해야 할 명령문을 제어하는데에 사용되는 구문입니다. 일반적으로 프로그램은 위에서 아래로 순차적으로 실행되지만, 어떤 조건에 대해서만 실행해야 하는 경우나 특정 부분을 반복하여 실행해야 하는 경우 등이 있습니다.

python에서는 if, for, while문을 사용하여 흐름을 제어할 수 있습니다.



1. while 문


특정작업을 반복하여 실행해야 할 경우 반복문을 사용하면 간단히 해결할 수 있습니다. while문은 반복문의 일종으로 조건문이 참일 경우 반복을 계속합니다. 


1
2
3
while 조건:
    수행할 작업
    ...
cs


while이라는 키워드를 먼저 적고 그 뒤에 조건을 적어주면 됩니다. 앞선  if문 강의에서 배웠던 비교, 논리연산자가 쓰일 수 있습니다.


2. while 문 사용예제


glass라는 변수의 값을 0으로 초기화 하고 while문의 조건으로 glass가 10보다 작을 경우를 설정합니다. 이렇게 하면 while문의 조건이 참이니 동작을 시작하겠죠? 하지만 glass 의 값을 while문 안에서 늘려주지 않는다면 while은 무한히 실행될 것입니다. 고로 glass의 값을 +=을 통해 1씩 늘려주기로 하겠습니다. 또 while 문안에 print문을 넣어 한잔 마셨습니다. 를 출력해 보도록 하겠습니다. 그리고 glass의 값이 10이 되었을 때 취했으니 집에 돌아가요. 라는 문구를 출력해보도록 하겠습니다.



1
2
3
4
5
6
7
8
glass = 0
#10번 반복
while glass < 10:
    glass+=1
    print("한잔 마셨습니다.")
    if glass == 10:
        print("취했으니 집에 돌아가요.")
    
cs




3. while문 이스케이프(escape)


while문은 조건문이 참인 동안 계속해서 하위 구문을 반복적으로 실행합니다. 하지만 중간에 while문을 빠져나가고 싶을 경우에는 break문을 넣어 즉시 while문을 빠져나갈 수 있습니다.


1
2
3
4
5
6
7
8
9
number = 77
counter = 2
while counter < number:
    if number%counter == 0:
        print("소수가 아닙니다.")
        break
    counter += 1
    if counter == number
        print("소수 입니다.")
cs


'Dev > python' 카테고리의 다른 글

[python] 제어문(if, for, while) - 3  (0) 2019.03.23
[python] 시퀀스 자료형과 이터러블  (1) 2019.03.23
[python] 제어문(if, for, while) - 1  (0) 2019.02.15
[python] 튜플과 Immutable  (0) 2019.02.14
[python] 딕셔너리(dictionary)  (0) 2019.02.13

# 파이썬 제어문



제어문이란 프로그래밍 언어에서 실행순서를 변경시키거나 또는 조건에 따라 실행해야 할 명령문을 제어하는데에 사용되는 구문입니다. 일반적으로 프로그램은 위에서 아래로 순차적으로 실행되지만, 어떤 조건에 대해서만 실행해야 하는 경우나 특정 부분을 반복하여 실행해야 하는 경우 등이 있습니다.

python에서는 if, for, while문을 사용하여 흐름을 제어할 수 있습니다.



1. if문


if문은 일반적으로 프로그램의 흐름을 조건에 따라 다르게 해야하는 경우 사용합니다. 예를 들어 홀, 짝을 구분해야하는 프로그램에서는 if 조건에서 2로 나눈 나머지 연산의 결과가 0이냐 1이냐에 따라 다른 흐름을 갖도록 작성해야 겠죠?


if문을 선언하는 방법은 아래와 같습니다. if뒤에 조건을 넣어주고 그 값이 참이면 동작하고 참이 아니면 동작하지 않습니다.

여러가지 조건을 넣고 싶은 경우에는 elif 명령어를 씁니다. elif는 기존 if가 참이아니라 동작하지 않았을 경우 다른 대안을 제시하는데에 사용합니다. 물론 if가 참이 아니라고해서 elif가 무조건 동작하는 것은 아닙니다. 반드시 '조건이 참일 때'라는 전제조건을 수반합니다.


if나 elif의 조건에 부합하지 않았을 경우 실행시킬 루틴을 작성하고 싶을 때에는 else 명령어를 사용하시면됩니다. if나 elif가 참이 아닐경우 무조건 else가 실행됩니다.


ps.elif가 없어도 else사용가능


 

1
2
3
4
5
6
7
8
9
#elif를 추가하면 다중 조건 사용가능
#else는 위 조건에 부합하지 않는 모든 조건(여집합)
 
if 조건1:
    ...
elif 조건2:
    ...
else :
    ...
cs


하위 구문을 작성할 때 파이썬만의 독특한점이 있는데요 바로 indent라는 것입니다. indent는 들여쓰기라는 뜻입니다. 즉 하위 구문을 들여쓰기의 정도로 구분하겠다는 소리죠. 파이썬에서 공식적으로 indent로 인정받는 것은 space 4번과 tab입니다. tab이 에디터 상에서 space 4번과 동치일 경우에만 tab이 indent로 인정받는데 대부분의 에디터가 그러합니다. 하지만 간혹 space 8번으로 인식하는 경우가 있으므로 주의하셔서 사용하시면 됩니다.



2. 비교 연산자


비교 연산자라는 것은 값을 비교하여 참, 거짓을 판단해야 할 경우 사용합니다. if 문에서는 조건이 참인지 거짓인지의 여부가 대단히 중요하기 때문에 비교연산자를 상당히 많이 사용하게됩니다.

그럼 연산자의 종류에 관하여 알아볼까요?


 연산자

 설명

a < b

 a가 b보다 작으면 true 

a > b

a가 b보다 크면 true

a == b

a와 b가 같으면 true

a != b

a와 b가 같지 않으면 true

a >= b

a가 b보다 크거나 같으면 true

a <= b

a가 b보다 작거나 같으면 true


꽤 많은 연산자의 종류가 있습니다. 상황에 따라서 바꿔가며 사용하시면 됩니다.

추가적으로 if문은 0이 아닌 숫자나 비어있지 않은 자료형에 관하여 true로 인식합니다. 즉 1도 true고 'a'도 true입니다. 하지만 빈 리스트나 빈 튜플같이 비어있는 자료형은 false로 인식합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if 'a':
    print("1_True")
 
if 1:
    print("2_True")
 
if []:
    print("3_True")
 
if '':
    print("4_Ture")
 
# 결과 값
# 1_True
# 2_True
cs



3. 논리연산자


논리연산자는 조건식이나 값을 논리적으로 판단하여 참과 거짓을 판단하는데 사용됩니다. 일반적으로 if문에서는 조건을 다중으로 설정하고 싶을 경우에 사용합니다.


다른 언어에서 && 나 ||와 같은 연산자가 파이썬에서는 명령어 형태로 제공되고 있으니 명령어를 꼭 기억하셔야 합니다.


그리고의 조건을 만드는 연산자는 and입니다. 다른 언어에서의 &&과 똑같습니다. or 명령어는 다른언어에서의 ||와 같고 ~이거나라는 조건식을 만드는데에 사용됩니다.


마지막으로 조건을 부정하는 연산자는 !연산자입니다. 파이썬에서는 not이라는 명령어로 제공됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
= 2
= 3
 
if a%2==0 and b%2==0:
    print("1_True")
 
if a > 3 or b < 5:
    print("2_True")
 
if not a==b:
    print("3_True")
 
# 결과 값
# 2_True
# 3_True
cs


4번 라인을 보시면 a는 짝수이기 때문에 첫번째 조건에서 true를 반환합니다. 하지만 두번째 조건이 맞지않아 if 절이 실행되지 않았습니다. and 연산자가 두개의 조건이 전부 참일 때만 ture를 반환하기 때문이죠.

반대로 7번 라인에서는 첫번째 조건이 false고 두번째 조건이 true인데 true로 인식이 되었습니다. or 연산자 때문인데요 둘중 하나만 참이면 true를 반환합니다.

마지막으로 not 연산자는 조건을 반전시킨다고 했죠 ? a==b는 누가 봐도 false입니다. 하지만 앞에 not을 붙여서 true로 인식이 됩니다.



'Dev > python' 카테고리의 다른 글

[python] 시퀀스 자료형과 이터러블  (1) 2019.03.23
[python] 제어문(if, for, while) - 2  (0) 2019.03.23
[python] 튜플과 Immutable  (0) 2019.02.14
[python] 딕셔너리(dictionary)  (0) 2019.02.13
[python] 리스트 함수  (0) 2019.02.11

# 파이썬 튜플



튜플은 몇 가지 특성을 빼면 리스트와 거의 동일하다고 볼 수 있는 자료구조입니다.

인덱싱, 슬라이싱이 가능하고 튜플끼리의 연산 또한 가능하죠.


차이점이 있다면, 리스트는 '[]'을 이용하여 선언하는 반면 튜플은 '()'을 이용해서 감싸줍니다.


1
2
3
4
tup1 = () # 빈 튜플 선언
tup2 = tuple() # 빈 튜플 선언
tup3 = (1,2,3# tup3 == (1,2,3)
tup4 = 1,2,3 # tup4 == (1,2,3)
cs


1. Immutable


튜플은 한번 정의되는 순간 그 요소를 변경하거나, 삭제하는것이 불가능해집니다.

이러한 특성을 영어로는 Immutable하다고 이야기합니다. Immutable한 자료형은 데이터의 오염이 적기 때문에 데이터 분석에서 원시데이터를 저장할 때 자주 쓰입니다.


그렇다면, 한번 테스트를 안해볼 수 없겠죠?


1
2
myTup = ('python',['anaconda','spyder'])
myTup[1= ['man']
cs


이 코드를 실행시키면 인터프리터는 에러를 출력할 것 입니다.


tuple 객체는 새로운 요소의 할당을 지원하지 않는다면서 TypeError가 출력되었습니다. 그러면 진짜로 tuple에서는 값을 전혀 못바꾸는게 확정이네요??  결론부터 말하자면 그렇지 않습니다.


우리는 리스트에서 배웠던 Shallow Copy를 떠올려보셔야 합니다. Shallow Copy는 레퍼런스를 그대로 가져오는 반면 Deep Copy는 값만 복사해 오기 때문에 실질적으로 같은 객체가 아닙니다. 즉 아래와 같은 식이 성립됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
origin = ('python', ['anaconda''spyder'])
clone = ('python', ['anaconda''spyder'])
 
# 값이 같기 때문에 True
origin == clone
 
# 같은 객체가 아니기 때문에 False
origin is clone
 
# Shallow Copy
clone = origin
 
# 같은 값, 같은 객체이기 때문에 True
origin == clone
origin is clone
cs


origin과 clone을 같은 값으로 설정하면 == 에서는 true를 보이지만 is 연산에서는 false를 보입니다. 둘의 레퍼런스 id가 다르기 때문입니다. 하지만 clone에 origin을 대입하면 레퍼런스를 그대로 가져오기 때문에 ==, is 둘 다에서 true를 보이죠? 이 방법을 이용하면 튜플안의 값을 변경할 수 있습니다.

파이썬에서 Immutable이라는것은 어디까지나 레퍼런스가 변경되지 않는다는 의미로만 동작합니다. 즉, 레퍼런스가 변하지 않으면 값이 변해도 상관이 없다는 의미겠죠?


그러면 바로 테스트 해보도록 하겠습니다.


1
2
3
4
5
6
myTup = ('python',['anaconda','spyder'])
myTup[1].append("pig")
print(myTup)
 
# 결과 값
# ('python', ['anaconda', 'spyder', 'pig'])
cs


myTup의 1번째 인덱스에 있는 리스트의 내용이 바뀐것을 확인할 수 있습니다. append는 레퍼런스가 변경되지 않는 대표적인 함수이기 때문에 레퍼런스를 유지 하면서 값을 바꿀 수 있었습니다.


하지만 위에서 처럼 myTup[1]에 = 연산자를 통해 값을 대입하려는 순간 레퍼런스가 변경되기 때문에 TypeError가 발생한 것입니다. 

'Dev > python' 카테고리의 다른 글

[python] 제어문(if, for, while) - 2  (0) 2019.03.23
[python] 제어문(if, for, while) - 1  (0) 2019.02.15
[python] 딕셔너리(dictionary)  (0) 2019.02.13
[python] 리스트 함수  (0) 2019.02.11
[python] 리스트와 Shallow Copy  (0) 2019.02.10

+ Recent posts