Python

03.Control Statement

seunghyeoniya 2023. 8. 5. 16:01

-------------------------

03.Control Statement

-------------------------

** 제어문

1. 제어문

=> 프로그램은 왼쪽에서 오른쪽으로 위에서 아래로 수행되는데 이 흐름을 변경하고자 하는 명령어

=> 파이썬은 if, for, while, break, continue, return을 제공

if는 분기문(branch)

while이 반복

for는 순서열을 순회

break는 반복문을 종료

continue는 다음 반복으로 넘어가는 역할

return은 현재 함수의 수행을 종료하고 호출하는 함수로 되돌아가는 역할 - 데이터를 가지고 갈 수 있음

 

break와 continue의 차이 : https://hymndev.tistory.com/20

 

-> break를 만나면, 자신이 포함된 가장 가까운 반복문을 벗어난다.

 

-> continue를 만나면, break와 다르게 반복문을 벗어나지 않고 다음 반복을 계속해서 수행한다.

 

=> 표현식(expression)

연산식 : 등호(=)가 있는 경우가 하나의 연산식(나머지 연산자는 중첩해서 사용해도 하나의 표현식으로 간주)

ex.

a = b = 10 -> 두 개의 표현식

3 + 4 + 5 -> 하나의 표현식

리턴이 있는 함수 호출 : 리턴이 없는 함수 호출은 표현식으로 간주하지 않는데 그 이유는 판단을 할 수 없기 때문입니다.

 

=> 파이썬은 제어문이 하나의 블럭을 생성

제어문 안에서 만든 데이터는 외부에서 사용이 불가능

 

2. if : 조건 분기

1) 기본 형식

if bool 데이터:

bool 데이터가 True인 경우 수행할 문장

elif bool 데이터:

앞의 데이터가 False이고 현재 데이터가 True인 경우 수행할 문장

...

else:

앞의 모든 데이터가 False인 경우 수행할 문장

=> elif와 else는 if 없이 사용 불가

=> elif는 0번 이상 사용 가능(생략이 가능하고 여러번 사용도 가능하다.)

=> else는 생략하거나 1번만 나와야 함

=> elif를 작성할 때 주의할 점은 수행되지 않은 조건을 만드는 것에 주의

=> else는 처리보다는 예외적인 상황을 처리하는 용도로 사용하는 것을 권장

 

# 하나의 점수를 입력받아서 60점 이상이면 합격

# 무조건 프로그램 종료라는 문구를 출력

# 실제 프로그램이라면 잘못된 입력을 할 수 있으므로 예외처리를 해주는 것이 좋습니다.

score = int(input("점수를 입력하세요:"))

# print(type(score))

if score >= 60:

print("합격")

print("프로그램 종료")

 

#하나의 점수를 입력받아서 60점 이상이면 합격 아니면 불합격

score = int(input("점수를 입력하세요:"))

if score >= 60:

print("합격")

else:

print("불합격")

 

2) Fasly

=> 파이썬에서는 0이나 데이터가 없는 데이터의 모임도 False로 간주, None도 False로 간주

=> Falsy가 아니면 전부 True로 간주

 

-> if 보다는 switch가 빠르지만, python에는 switch가 존재하지 않아서 다른 것을 이용한다.

 

score = int(input("점수를 입력하세요:"))

if score >= 90 and score <= 100:

print("A")

elif score >= 80 and score < 90:

print("B")

elif score >= 70 and score < 80:

print("C")

elif score >= 60 and score < 70:

print("D")

elif score >= 0 and score < 60:

print("F")

else:

print("잘못된 점수")

 

3) switch 흉내내기

=> python에는 switch가 없는데 dict를 이용하면 거의 유사하게 구현이 가능하다.

"""

0 이면 일요일

1 이면 월요일

2 이면 화요일

3 이면 수요일

4 이면 목요일

5 이면 금요일

6 이면 토요일

"""

switcher = {

0:"일요일",

1:"월요일",

2:"화요일",

3:"수요일",

4:"목요일",

5:"금요일",

6:"토요일"

}

 

# dict에서 get은 일치하는 키가 있으면 그 값을 가져오고, 없으면 두번째 매개변수의 값을 리턴한다.

print(switcher.get(3, "알 수 없는 요일"))

 

4) if를 이용한 값 대입 - list 사용할 때 중요

=> x 값에 따라 y 에 True나 False를 설정하고자 하는 경우

x = 10

y

if x >= 10:

y = True

else:

y = False

 

=> if를 사용한 축약

x = 10

y = False if x < 10 else True # y는 기본적으로 False를 가지고 x가 10보다 작다면 True를 대입

 

3. while

=> 반복을 위한 제어문

while bool데이터:

bool데이터가 True인 경우 수행할 문장

 

# 0부터 9까지 10번 출력

idx = 0

# idx가 10에서 종료

while idx < 10:

print(idx)

idx = idx + 1 # idx += 1

print("idx:", idx)

 

=> python에서는 while과 else를 매핑하는 것이 가능

while bool데이터:

bool데이터가 True인 경우 수행할 문장

else:

while이 break를 만나지 않고 정상 종료된 경우 수행할 문장

 

# 0부터 9까지 10번 출력

idx = 0

while idx < 10:

print(idx)

idx = idx + 1 #i dx += 1

if idx > 5:

break

# 반복문이 모두 수행하고 종료된 경우에 호출

# break를 만나거나 예외가 발생하면 수행하지 않음

else:

print("반복문 종료")

 

=> 무한 반복

while True:

반복할 내용

 

4. for

for 임시변수 in 순서열:

순서열의 데이터를 하나씩 임시변수에 대입하고 수행할 문장

=> 순서열은 __iter__가 구현된 인스턴스 :

순서열 : bytes, str, list, tuple, set, dict

dict는 key값이 하나씩 대입되고 나머지는 데이터가 하나씩 대입됩니다.

 

string = "Hello"

ar = [10, 20]

row = (100, 200)

s = {1000, 2000}

dic = {"key1":"value1", "key2":"value2"}

for ch in dic:

print(ch)

 

=> 숫자열을 만들 수 있는 함수 : range

range(숫자) : 0부터 숫자 전까지 1씩 증가한 숫자열

range(시작숫자, 종료다음숫자)

range(시작숫자, 종료다음숫자, 간격)

 

https://www.donga.com/news/search?p=1

https://www.donga.com/news/search?p=16

https://www.donga.com/news/search?p=31

 

for i in range(1, 32, 15):

print("https://www.donga.com/news/search?p=", i, sep="")

 

for i in range(3):

q = "https://www.donga.com/news/search?p=" + str((i*15)+1)

print(q)

 

sep , end , format , Escape의 특징 : https://infinitt.tistory.com/11

 

sep, separation(구분자) : 영단어 그대로, 분리하여 출력한다. 다만 분리할 문자를 지정할 수 있다.

-> sep은 출력할 데이터가 여러개일 때, 데이터를 구분할 수 있도록 한다.

 

end : end 옵션을 사용하면, 그 뒤의 출력값과 이어서 출력한다. 다시말해, 줄바꿈을 하지 않게 된다.

-> end는 sep과 비슷한 기능을 하지만, 사용하면 줄바꿈을 하지 않게 된다는 차이점이 존재한다.

 

format :

-> print("{0}, {1}".format(1,2)) > 1, 2

-> print("%s, %d개"%("아이스크림", 10)) > 아이스크림, 10개

%s : 문자열, %d : 정수, %f : 실수

 

=> for도 else와 같이 사용 가능 : while ~ else와 동일하게 동작

 

5. 기타

=> 제어문은 중첩해서 사용 가능

=> break : 반복문 종료

=> continue : 다음 반복으로 이동

 

//

 

깨알) 달력 문제에서 i % 7 == 0 으로 for을 두 번 쓰지 않고, 한 번만 사용해서 풀 수도 있다.

 

Practice1.

*****

*****

*****

*****

*****

 

=> 별(*) 5개를 5번 출력

for i in range(5):

for j in range(5):

print("*", end="")

print() # 줄 바꿈

 

-> for을 1개로 줄여서 풀어보면

for i in range(25): # range(1,26) 도 동일하다.

print("*", end="")

if i%5 ==4: # 안되면 0으로 해봐라.(필기되어 있었음)

print()

 

Practice2.

# 규칙 찾기

* # 0 0-0

** # 1 0-1

*** # 2 0-2

**** # 3 0-3

***** # 4 0-4

 

for i in range(5):

for j in range(i+1):

print("*", end="")

print()

 

Q1.

*

**

***

**

*

 

for i in range(5):

if i < 3:

# 늘어나는 규칙

for j in range(0,i+1):

print("*",end="");

print();

else:

# 줄어드는 규칙

for j in range(0,5-i):

print("*",end="");

print();

 

Q2.

*

* *

* *

* *

*********

 

for i in range(5):

# 첫 줄과 마지막 줄

if idx == 0 or i == 4:

print(" " * (4 - i), end="")

print("*" * (2 * i + 1), end="")

print(" " * (4 - i), end="")

# 중간에 있는 세 줄 규칙

else:

print(" " * (4 - i), end="")

print("*", end="")

print(" " * (2 * i - 1), end="")

print("*", end="")

print(" " * (4 - i), end="")

print()

 

Q3.

2부터 100까지 수에서 완전수의 개수는?

완전수는 자신을 제외한 약수의 합이 자신과 같은 수이다.

ex. 6의 약수는 1, 2, 3, 6으로 1 + 2 + 3 = 6, 6은 완전수이다.

 

cnt = 0 # 완전수의 개수를 저장할 변수

for idx in range(2,101):

# 합계를 구할 때 무조건 0으로 초기화하지 않는다.

# 1은 모든 수의 약수이므로 hap을 0이 아니라 1로 초기화한다.

sum = 1 # 약수의 합을 저장할 변수

# 2부터 자신의 수 전까지 나머지가 0이 나오는 숫자가 약수

# 자신의 수의 절반 이상의 수로는 나누어 떨어질 수 없으므로, 2로 나누어준 숫자까지 나머지를 계산한다.

for div in range(2, idx // 2 + 1):

if idx % div == 0:

sum = sum + div

# 완전수 판별

if idx == sum:

# Python에는 증감연산자(++나 --)가 존재하지 않는다.

cnt += 1

print("2부터 100까지의 수에서 완전수의 개수는 ", cnt, "개입니다.", sep="")

 

Q4.

깨알) 금융권 코딩테스트를 대비해서 꼭 풀 수 있어야 한다. 못 풀겠으면 외우기라도 하세요.

깨알) 금융권은 보수적이여서 옛날 문제를 계속해서 낸다. 그러므로 여러 번 풀어보자.

피보나치 수열

- 첫번째와 두번째 데이터는 1

- 세번째 데이터 부터는 앞의 2개의 합

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

 

n번째 피보나치 수열의 값을 구하는 로직을 작성

 

# 몇번째 피보나치 수열의 값을 구할지 입력

n = int(input("숫자를 입력하시오."))

 

if n == 1 or n == 2:

print(1)

else:

n1 = 1 # 전전 항

n2 = 1 # 직전 항

result = 0 # 실제 결과

for i in range(2, n):

result = n1 + n2

n1 = n2

n2 = result

print(result)

# n1 : 1, n2 : 1, result : 2의 순으로 피보나치 수열을 나타낸다.

# 첫번째, 두번째 피보나치 수열의 값은 이전 항이 없기 때문에 규칙에서 벗어난다.

 

-> 피보나치 수열과 유사한 형태의 문제에는 재귀함수나 감독관 배정 문제가 존재한다.

 

깨알) 금융권은 코딩 테스트 조금 쉬운 편이다.

//

 

#python

'Python' 카테고리의 다른 글

05.OOP(1)  (0) 2023.08.17
04.Function(2)  (0) 2023.08.16
04.Function(1)  (0) 2023.08.05
02.Variable_Operator  (0) 2023.08.05
01.Python  (0) 2023.08.05