자료형을 정리했으니, 이제 자료형을 활용하는 방안을 정리해보자. 여러가지 방법이 있지만, 이번 포스팅에서는 제어문과 함수를 사용해 원하는 결과를 출력해보자.
Python에서는 코드의 실행 흐름을 제어하기 위해 '제어문'을 사용한다. 주로 조건 및 반복 처리를 위한 logic 작성에 필요하며, 들여쓰기를 통해 블럭을 지정한다.
if문
if문은 특정 조건이 만족될 때 코드를 실행하는 제어문이다.
- 단순 if문 : 조건이 참일 경우에만 처리하고, 조건이 거짓인 경우에는 아무런 처리도 하지 않는다.
- if ~ else문 : 조건이 참인 경우와 거짓인 경우를 각각 처리한다.
- if ~ elif ~ else문 : 여러 조건 중 참인 경우를 각각 처리하며, 모든 조건이 거짓인 경우에 대한 처리도 가능하다.
# 단순 if문
x = 10
if x > 0:
print("x는 양수입니다.")
# if ~ else문
if x > 0:
print("x는 양수입니다.")
else:
print("x는 0 또는 음수입니다.")
# if ~ elif ~ else문
if x > 0:
print("x는 양수입니다.")
elif x == 0:
print("x는 0입니다.")
else:
print("x는 음수입니다.")
For문
for문은 첫 번째 값부터 마지막 값까지 하나씩 가져가며 코드를 반복 처리하는 제어문이다. if문, range() 함수와 함께 사용할 수도 있다. 또한, 리스트와 딕셔너리의 요소를 대상으로 반복 처리도 되는데, 예제로 확인해보자.
- 기본 반복문 : range() 함수로 지정된 범위, 리스트의 첫 번째 요소부터 마지막 요소까지 등 정해진 대상안에서 코드를 반복 처리한다.
- enumerate() : 문자열이나 컨테이너 자료형을 입력받아, 순번과 요소를 포함하는 object를 반환한다.
- List Comprehension(반복문 확장) : Python에서 리스트를 생성하는 간결하고 효율적인 방법으로, 기본 for-loop 문법을 사용하여 표현하는 것보다 간단하게 표현할 수 있어 가독성이 높아진다. 또한, 실행 속도 면에서도 보통의 for문보다 빠르다는 장점이 있다. [표현식 for 아이템 in 반복가능객체 if 조건문] 형식을 사용할 수 있다.
- 딕셔너리를 반복문에 사용할 때는 key와 value를 반환하는 items() 메서드를 많이 사용한다. 리스트와 동일하게 반복문 확장을 사용할 수 있다.
- 집합도 리스트, 딕셔너리와 동일하게 for문을 이용하여 반복 작업을 수행할 수 있다.
# 단순 for문
for i in range(5):
print(i) # 출력 : 0,1,2,3,4
# 기본 반복문
my_list = [1, 2, 3, 4, 5]
for i in my_list:
print(i)
# enumerate() 함수 사용
for i, value in enumerate(my_list):
print(f"인덱스 {i}의 값은 {value}입니다.") # 출력 : 인덱스 0의 값은 1입니다.
# List Comprehension(반복문 확장)
for i in my_list:
if i % 2 == 0 :
print(i**2)
squared = [i**2 for i in my_list if i%2==0]
print(squared) # 출력 : [4, 16]
# 딕셔너리와 for문
my_dict = {'a': 1, 'b': 2, 'c': 3}
for key, value in my_dict.items():
print(f"키 {key}의 값은 {value}입니다.")
# 집합과 for문
my_set = {1, 2, 3, 4, 5}
for i in my_set:
print(i)
While문
while문은 조건문이 참인 동안 코드를 계속해서 반복 실행하는 제어문이다.
- 일반 while문 : 문자열 길이를 반환하는 len() 함수를 활용하는 등 연산자를 사용해 특정 조건으로 반복문이 실행된다.
- 무한루프 : While문은 조건문이 참이고, 특정 조건을 지정하지 않으면 무제한으로 실행된다. 만약 반복문 안에서 특정 조건이 되어 반복문을 빠져나오게 하려면 break 문을 사용해야하고, 반복문을 중단시키지 않고 특정 조건에서 다음 반복으로 넘어갈 때는 continue 문을 사용한다. 또한, input() 함수를 사용해 사용자의 입력을 받을 수도 있다.
예제와 함께 확인해보자.
# 일반 while문
i = 0
while i < 5:
print(i)
i += 1
# 무한루프 다루기
while True:
user_input = input("숫자를 입력하세요: ")
if user_input.isnumeric():
print("입력하신 숫자는", user_input, "입니다.")
break
else:
print("숫자가 아닙니다. 다시 입력해주세요.")
continue
isnumeric() 함수는 user_input에 입력받은 변수가 숫자인지를 판별한다. 만약 input() 함수에 숫자를 입력하면 break로 반복문을 빠져나오고, 숫자가 아닌 다른 값을 입력하면 print()문을 출력하고 continue문으로 숫자를 입력할 때까지 반복이 계속된다고 해석하면 된다.
함수
Python의 함수는 입력을 받아 처리한 후 그 결과를 반환하는 역할을 한다. 내장 함수와 사용자 지정 함수가 있으며, 함수를 사용하면 같은 로직을 반복적으로 코딩하는 것을 피할 수 있다. 먼저, 사용자 정의 함수에 대해 알아보자.
사용자 정의 함수
사용자 정의 함수는 def 키워드로 정의하며, 기본적으로 다음 세 가지로 구성된다.
- 입력(Input) : 매개변수로 표현하며, 생략 가능
- 처리 : 함수 내부에서 실행
- 출력(Output) : 처리 결과로, return 키워드를 사용하여 반환(생략 가능). 만약 return 문이 없다면, 함수는 None을 반환한다.
1. 함수의 매개변수
def greet(name):
"""이름을 인자로 받아 인사말을 출력하는 함수"""
print(f"Hello, {name}!")
greet("Alice") # 출력: Hello, Alice!
def hello(name='여러분'):
print(f'{name}님 안녕하세요? 반갑습니다!')
hello() # 출력 : 여러분님 안녕하세요? 반갑습니다!
위의 name을 매개변수라고 한다. 매개변수는 함수의 입력으로 사용되며, 함수를 호출할 때 값을 전달받는다. 여기서 name의 default 값을 지정할 수도 있는데, default를 가진 매개변수를 기본 인수(Default Argument)라고 한다. 아래의 함수는 매개변수 name에 값을 전달하지 않아도, '여러분' 이라는 기본값을 사용하여 결과를 출력한다. 하지만, default 값과 매개변수를 입력한 경우의 고정된 출력값이 같아서, 출력된 값의 문맥이 이상한 문제가 있다.
2. 매개변수의 순서
def hello(name = '여러분', loud=0):
if loud == 1:
print(f'우~~와~~ {name}님 안녕하세요? 반갑습니다!!!')
else:
print(f'{name} 안녕하세요? 반가워요.')
위의 문제를 해결하기 위해 매개변수의 순서에 따라 값을 전달할 수 있으며, 이를 위치 인수라고 한다. 또한, 매개변수 이름을 직접 지정하여 값을 전달하는 방식을 키워드 인수(keyword Argument)라고 한다. 함수에서는 name 매개변수에 이름을, loud 매개변수에 1 또는 0을 전달할 수 있다. if문으로 loud default를 지정한 결과, name의 default 값과 매개변수를 입력한 경우가 다르게 출력되어 문제를 해결할 수 있다.
3. 가변인수
def hello(*args):
for who in args:
print(f'{who}님 안녕하세요? 반갑습니다!')
hello('홍길동', '일지매', '강우동')
# 홍길동님 안녕하세요? 반갑습니다!
# 일지매님 안녕하세요? 반갑습니다!
# 강우동님 안녕하세요? 반갑습니다!
# for문을 안쓰면?
def hello(*args):
print(args)
hello('홍길동', '일지매', '강우동')
# ('홍길동', '일지매', '강우동')
# for문을 안쓰면, 여러 개의 값이 하나의 Tuple로 출력됨
# list
def hello(*args):
for who in args:
print(f'{who}님 안녕하세요? 반갑습니다!')
# 함수 사용
member = ['김밍밍', '김아드', '장우동']
hello(member) # list를 사용하면, for문으로 돌아가는게 아니라 list가 하나로 출력됨
hello(member[0],member[1],member[2])
hello(*member) # * 인수를 사용하면, 인덱싱 없이 편리하게 처리가능
가변 인수는 함수에 임의 개수의 값이 매개변수로 전달되는 것을 말한다. **args 형태로 표현되며, 함수 내부에서는 리스트나 튜플처럼 처리된다. 위의 함수는 임의 개수의 이름을 전달받아 각각에 대해 인사말을 출력한다. 반복문의 사용여부, 인수에 따라 결과값이 달라지기 때문에 개별 문법에 주의해야한다.
4. 가변 인수와 위치 인수의 활용
Python에서는 가변 인수와 위치 인수를 함께 사용할 수 있다. 단, 위치 인수는 가변 인수 앞에 위치해야 한다. 아래 함수에서는 '선생님' 이라는 위치 인수와 3명의 사람 이름을 가변 인수로 사용했다.
def hello(title, *args):
for who in args:
print(f'{who}{title} 안녕하세요? 반갑습니다!')
hello('선생님', '김밍밍', '김아드', '최윤')
# 출력
# 김밍밍선생님 안녕하세요? 반갑습니다!
# 김아드선생님 안녕하세요? 반갑습니다!
# 최윤선생님 안녕하세요? 반갑습니다!
그러나, 위치와 키워드에 따라 오류가 발생할 수 있는데, 오류가 발생하는 경우는 다음과 같다.
- 위치 인수가 가변 인수 앞에 있는 경우
def hello(title, *args):
for who in args:
print(f'{who}{title} 안녕하세요? 반갑습니다!')
# 함수 호출 시 keyword 오류 발생
hello(title='선생님', '홍길동', '일지매', '강우동')
- 가변 인수 뒤에 위치 인수를 두는 경우, 반드시 뒤에 있는 인수는 키워드 인수로 사용해야 함
# 함수 정의 시 오류 발생
def hello(*args, title):
for who in args:
print(f'{who}{title} 안녕하세요? 반갑습니다!')
# 오류 해결
def hello(*args, title):
for who in args:
print(f'{who}{title} 안녕하세요? 반갑습니다!')
hello('김밍밍', '김아드', '최윤', title='선생님')
내장 함수
Python은 사용자를 위한 많은 내장 함수를 제공한다. 수많은 함수 중, 중요하다고 생각하는 함수를 정리했다.
- abs(x) : x의 절대값 반환
- all(x) : x의 요소 모두가 참이면 True 반환
- any(x) : x의 요소 중 하나라도 참이면 True 반환
- chr(x) : 아스키 코드값 x에 대응하는 문자 반환
- dir(x) : 객체 x가 가지고 있는 변수가 메서드 목록을 반환
- divmod(x,y) : x를 y로 나눈 몫과 나머지를 튜플 형태로 반환
- enumerate(x) : 리스트, 튜플, 문자열을 받아 인덱스와 값 반환
- eval(x) : 실행 가능한 문자열 x를 받아 그 문자열을 실행한 결과를 반환
- id(x) : 객체 x의 고유 주소값을 반환
- input() : 사용자로부터 입력을 받는다.(입력 받은 값은 언제나 문자열)
- isinstance(x,y) : x가 y의 인스턴스인지 여부를 True, False로 구분
- len(x) : x 요소들의 개수를 반환
- map(f,x) : 함수 f에 x 요소를 하나씩 전달해 얻은 결과를 반환
- min(x) : x 요소들 중 최솟값을 반환
- ord(x) : 문자 x의 아스키 코드값을 반환
- pow(x,y) : x를 y번 제곱한 결과를 반환
- range(x,y,z) : x부터 y-1까지 z씩 증가하는 객체를 반환
- sorted(x) : x 요소를 정렬하여 반환
- str(x) : x를 문자열로 변환하여 반환
- sum(x) : x의 요소를 모두 더한 결과를 반환
- tuple(x) : x를 튜플로 변환하여 반환
- zip(x,y) : x와 y 요소를 쌍으로 묶어서 반환
'Aivle > Python' 카테고리의 다른 글
| [에이블스쿨] 가설 검정 및 이변량 분석 (0) | 2024.03.17 |
|---|---|
| [에이블스쿨] 단변량 분석 (0) | 2024.03.15 |
| [에이블스쿨] Pandas (0) | 2024.03.08 |
| [에이블스쿨] 컨테이너 자료형 (0) | 2024.03.02 |
| [에이블스쿨] 자료형 (0) | 2024.02.29 |