본문 바로가기
카테고리 없음

(엔지니어를 위한) 파이썬 시작하기[3] 제어문 if, for, while

by 돌종 2022. 8. 24.

(엔지니어를 위한) 파이썬 시작하기[3]

 

0.시작하며

왜 파이썬인가? 1편에서도 쓴 것 같은데 파이썬은 공개이다보니 많은 라이브러리들이 있다. C, C++등으로 만들어진 기존 라이브러리들도 python으로 만들어져서 나온다. 그래서 파이썬으로 할 수 있는 것들이 많다.

 

엔지니어들이 주로 하는 업무는 계산, 도면이다. 알고 보면 다른 분야의 일들도 마찬가지일 것이다. 숫자를 다루지 않는 문학 같은 것이 아니라면 상당 수의 업무들은 계산을 하는 업무다. 하지만 다른 분야에 비해서 엔지니어링의 계산은 조금더 복잡할 수 있다. 그리고 엔지니어링에서 빼놓은 수 없는 것이 도면이다. 요즘에는 데이터 시각화 같은 말이 많이 들리는데 시각화는 중요하다. 엔지니어가 머리속에서 상상한 것을 다른 사람에게 전달하는 매체가 바로 도면이다.

 

사실 엔지니어링의 최종결과는 도면으로 나타나는 경우가 많다. 그것을 만드는 사람에게 전달하기 위한 수단이다. 물론 요즘에는 소프트웨어가 많이 발전해서 3차원 모델을 사용하는 경우가 많다. 3차원 모델을 넣으면 그대로 프린트해주는 3D프린터도 있다.

 

계산과 도면업무를 주로 하는 엔지니어들은 코딩을 통해서 계산과 도면을 모두 처리할 수 있다. 파이썬으로 계산을 하고 도면을 그릴 수 있다. 파이썬 언어 자체로 도면을 그릴 수도 있지만 캐드프로그램 안에서 돌아갈 수 있는 스크립트로서 작성될 수도 있다. AutoCAD, ZWCAD등의 CAD프로그램이 파이썬을 지원한다.

 

파이썬으로 엑셀도 핸들링 할 수도 있다. 파이썬 코드로 계산하고 엑셀을 핸들링해서 성과물을 만들어내고 도면 또한 작성할 수 있다.

 

물론 도면과 엑셀을 한꺼번에 통제할 수 있는 언어는 .Net계열의 C++,C#, VB 등이 있다. 하지만 필자는 다양한 기능의 라이브러리들이 제공되는 파이썬을 선택했다. 

 

점프투 파이썬의 3장은 제어문이다. https://wikidocs.net/19

if문과 while문 for문이 있는데, if문은 엑셀에서도 많이 다뤄봐서 감이 있을 것이다. while문과 for문은 반복을 하는 기능으로 엑셀에는 없는 기능이다.

 

1. if문

예를 들어 발생응력이 허용응력이내이면 “OK”라는 문자를 출력하고 허용응력보다 크면 “NG”라는 문자를 출력하는 문장을 써보자. 최대응력을 stressmax변수안에 넣고 허용응력을 stressalw에 넣었다면, if문을 아래와 같이 작성하면 된다.

D:\dev\python>python
Python 3.10.5 (tags/v3.10.5:f377153, Jun  6 2022, 16:14:13) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> stressmax = 100
>>> stressalw = 70
>>> if stressmax < stressalw :
...   print("OK")
... else:
...   print("NG")
...
NG
>>>

 

pytho을 실행하고 위의 코드대로 입력을 해보자. 변수 두개에 각각 100과 70을 입력했다.

if문은 한줄로 되어있는 것이 아니고 4줄로 구성되어있다. 지금까지 모든 명령은 한줄짜리였는데 if문은 여러줄로 되어있다. 당연히 조건이 참일 때 할 일과 거짓일 때 할일을 각각 지정해줘야 하기 때문이다. 아마 이문장을 엑셀로 작성하면 이렇게 될 것이다. if(stressmax < stressalw,”OK”,”NG”) 엑셀에서 if문은 if(조건,참,거짓) 이렇게 되어있다. 비슷하다. 차이가 있다면 엑셀의 if문에서는 값을 돌려주는 것 밖에 안되지만 파이썬에서는 여러가지 명령들을 수행시킬 수 있다.

 

파이썬에서는

if 조건 :

  참일 때 수행할 문장들

  참일 때 수행할 문장들

else:

  거짓일 때 수행할 문장들

  거짓일 때 수행할 문장들

 

이렇게 구성된다. 여기서 참일 수행할 문장들과 거짓일 때 수행할 문장들의 맨 앞이 들여쓰기가 되어있어야 한다는 것이 매우 중요하다.

 

파이썬의 들여쓰기는 매우 중요하다. 참일 때 수행할 문장들은 if 조건 : 아래 속하는 것이고, 거짓일 때 수행할 문장들은 else: 아래에 속하는 것이다. 파이썬에서는 이렇게 어느 밑에 속하는 것인가를 들여쓰기로 구분한다. 다른 언어에서는 ( )나 { }를 쓰기도 한다.

 

2. 조건

엑셀의 if문을 써봤다면 조건이 무엇인지 잘 알 것이다. 같은가, 다른가, 큰가, 작은가 등이다. 실제로 최종적으로는 참과 거짓중에 한다다.

x < y : x가 y보다 작은가? x가 y보다 작으면 True, 크거나 같으면 False다.

>>> 1<2
True
>>> 2<1
False
>>>

 

비교연산자.

x < y  : 작은가?

x > y : 큰가?

x == y  : 같은가?

x != y : 다른가?

x <= y  : 작거나 같은가?

x >= y : 크거나 같은가?

 

비교연산자의 결과인 참과 거짓들에 대해 and와 or, not을 쓸 수 있다.

예를 들어 점수가 90점부터 94점까지인 경우에 등급을 “A”를 출력하려 한다면 아래와 같이 and연산자를 써서 표현할 수 있다. 만약 p가 89점이라면 p >= 90의 결과가 False가 될 것이다. 한개라도 false이면 false이기 때문에 p <= 94를 계산해볼 필요도 없을 것이다. 물론 p <= 94는 True다.

 

if p >= 90 and p <=94:
  print("A")

 

X or y : 둘 중 하나가 참이면 참

x and y : 둘다 참이어야 참.

not x : x가 참이면 거짓, x가 거짓이면 참.

 

조건문의 결과를 변수에 저장할 수도 있다. 조건문의 결과는 참(True) 또는 거짓(False)라는 것을 기억하자.

>>> ok = stressmax < stressalw
>>> ok
False

 

 

 

3. for문

for문은 반복을 해준다. 예를 들어서 1부터 10까지 더하고 싶다. 이럴 때 계산기를 쓴다면 계산기에 1+2+3+4+5+6+7+8+9+10 이렇게 입력하고 =버튼을 누르면 답이 나올 것이다. 코딩에서는 ‘더하기’ ‘반복’하는 식으로 계산한다. 코딩에서 반복문을 어떻게 쓸 것인가가 매우 중요하다. 반복문이야 말로 프로그램의 막강한 기능이다.

 

for문의 기본 형태는 이렇다.

for 변수 in 리스트(또는 튜플, 문자열):
    수행할 문장1
    수행할 문장2
    ...

if문 설명할 때 이야기 했듯이. 들여쓰기한 문장들이 for문에 속하는 것이다. 이 들여쓰기한 문장들이 여러번 반복될 문장들이다. 문장은 여러 문장이 올 수 있다.

 

for 변수 in 리스트:  ← 이부분이 중요하다. 반복의 횟수와 어떤 것을 변경하면서 반복할 것인지 결정하는 문장이다. 리스트는 여러개라는 것을 알고 있을 것이다. 그 여러개를 하나 하나 꺼내서 변수에 대입하면서 반복한다. 그래서 반복의 회수는 리스트의 개수에 의해서 결정되고 리스트 안의 각 원소를 변수에 대입해서 반복한다.

 

위에서 이야기한 1부터 10까지 더하는 for문을 만들어보자.

>>> nums = [1,2,3,4,5,6,7,8,9,10]
>>> sum = 0
>>> for i in nums:
...   sum = sum + i
...
>>> sum
55

 

num라는 변수에 1부터 10까지 들어있는 list를 만들고

sum은 각 단계까지 더한 결과다.

for i in nums: 라는 문장은 nums안의 요소를 순서대로 꺼내서 i에 넣고 반복하라는 뜻이다. 처음에는 i에 1이 들어가고 다음 반복에는 2가 i에 들어간다.

그리고 sum = sum + i  ← 이 문장은 현재 총합에 i를 더한 후 sum 변수에 넣으라는 것이다.

 

이렇게 코딩하면 계산기에 1+2+3+4+5+6+7+8+9+10라고 입력하는 것과 별반 다르지 않다. nums=[1,2,3,4,5,6,7,8,9,10] 이게 문제다. 결국 모든 숫자를 다 타이핑 한 것 아닌가? 다행히 파이썬에는 이렇게 규칙적으로 연속된 숫자리스트를 만들어주는 함수가 있따. 바로 range함수다. range함수를 써보자. 아래와 같이 쓰면 range함수는 1부터 10까지를 돌려준다. 10이 아니라 11이라는 것에 주의해야 한다. 11까지 쓰면 11은 제외되고 10까지 적용된다.

>>> sum=0
>>> for i in range(1,11):
...   sum = sum + i
...
>>> sum
55

 

1부터 10까지가 아니라 1부터 n까지의 합이라면 n이라는 변수를 만들어서 적용하면 된다. range함수 n이 아닌 n+1을 적용한 것을 주의하자. n까지 더하고 싶다면 n+1을 입력해줘야 한다.

>>> sum=0
>>> n=50
>>> for i in range(1,n+1):
...   sum = sum + i
...
>>> sum
1275

 

1부터 n까지 홀수만 더하고 싶다면 range함수의 마지막에 range(1,n+1,2)이렇게 써주면 된다. 마지막에 추가한 2는 2씩 증가시키라는 뜻이다. 생략하면 1씩 증가한다.

 

4. while문

while문도 반복을 위한 문인데 for문과 좀 다르다. 어떤 조건이 참인 동안만 수행하도록 되어있다. for문은 리스트의 개수에 의해서 반복 횟수가 정해져 있는 경우에 사용하고,  while문은 어떤 조건을 만족하는 경우에만 되면 반복이 되다가 그것을 만족하면 그만 두어야 하는 경우에 사용한다.

 

예를 들어서 위에서 for으로 만든 1부터 10까지 더하는 기능을 while문을 사용하면 이렇게 된다.

 

>>> sum=0
>>> i=1
>>> while i<11:
...   sum = sum + i
...   i = i + 1
...
>>> sum
55

 

for문과 거의 비슷한데 for 문과 다른 것은 i값을 직접 증가시키는 문장이 있다는 것이다. i = i + 1. for문에서는 i값을 list에서 하나씩 가져왔기 때문에 반복문 안에서 i값을 다룰 필요도 없고 반복 전에 1로 초기화 시킬 필요도 없었다. while문에서는 반복문 전에 i값을 초기화시키고(i=1) 반복문 안에서 i값을 변화시켜줘야(i=i+1) 하는 것이 다르다. 반복회수도 for에서는 list내의 요소들의 개수에 의해서 결정되었지만 while문에서는 i < 11 조건이 참인 경우에만 반복구간을 수행한다. while문의 실행순서는 while문을 만나면 조건식이 참인지를 먼저 확인하고 참이면 반복문장들을 실행한다. 참이 아니면 바로 while문 밖으로 빠져나간다.

 

while문을 사용할 때 주의해야 할 사항은 반복문장들 안에 i를 변경시키는 문장이 있어야 한다는 것이다. 만일 위의 코드에서 i=i+1이라는 문장이 없다면 어떻게 될까? i<11이 언제나 참이 될 것이다. 무한반복하게 되는 것이다. 

 

이번에는 조금 다른 종류의 반복에 대해서 생각해보자. 예를 들어 nums라는 리스트에 어떤 특성 숫자(lookfor)가 있는지 확인하는 기능이다. for문을 이용해 처음부터 끝까지 if문으로 비교해보면 된다. 하지만 비효율적이다. 중간에 숫자를 찾으면 끝내고 싶은 것이다.

일단 코드를 보자. while문에 주목해보면 조건을 and를 이용했다. i는 비교하고자 하는 요소의 index다. 0부터 시작한다. 반복문 안에서 1씩 증가한다.(i=i+1). while문의 조건을 보면 두가지 조건을 모두 만족할 때만 반복한다. 즉 i가 리스트 길이보다 작으면서(i

반복문 안의 if문은 nums[i]로 i번째 요소를 가져와서 lookfor(찾고자 하는 숫자)와 비교했다. 비교해서 같다면 찾았다는 걸 저장하고 (seek=True) 찾은 숫자를 seeknum에 저장했다.(seeknum=nums[i]). 그리고 while문의 마지막에 i를 하나 증가시켜줬다.(i=i+1)

 

nums=[1,2,3,4,5]
lookfor=3
i=0
seek=False
while i<len(nums) and not seek:
  if nums[i]==lookfor:
    seek=True
    seeknum=nums[i]
  i=i+1     
 
print(seeknum)

 

while문에서 중요한 것은 조건을 정하는 것이다. 그리고 i값을 초기화하고 바꿔주는 것도 중요하다. 이 두가지 사항만 조심하면 while문을 사용하는데 문제는 없을 것이다. for문과 while문 중 원하는 것을 사용하면 된다. 예를 들어 중간에 찾더라도 끝까지 검색하도록 하겠다고 하면 복잡하게 조건식을 만들필요도 없이 for문으로 끝까지 검색하면 된다. 이제 컴퓨터가 빨라져서 개수가 매우 많은 경우가 아니면 큰 차이를 못 느낄 수도 있을 것이다.

 

다음 시간에는 입력과 출력에 대해서 공부하겠다.