TOC
참고 강의
SWEA 파이썬 프로그래밍 기초(1) 파이썬의 기본 구조와 기초 문법 #44
수치 연산 함수
abs()
인자로 숫자를 전달하면 그 숫자의 절대값을 반환하는 함수
val = 10
print("abs({0}) => {1}".format(val, abs(val)))
val = -10
print("abs({0}) => {1}".format(val, abs(val)))
val = -3.14
print("abs({0}) => {1}".format(val, abs(val)))
[결과]
abs(10) => 10
abs(-10) => 10
abs(-3.14) => 3.14
divmod()
첫 번째 인자를 두 번째 인자로 나눴을 때의 몫과 나머지를 튜플 객체로 반환하는 함수
val1, val2 = 9, 5
result_tuple = divmod(val1, val2) # 몫과 나머지를 tuple 객체로 변환해 변수 result_tuple에 저장
print("divmod({0}, {1}) => 몫: {2}, 나머지: {3}".format(val1, val2, *result_tuple))
[결과]
divmod(9, 5) => 몫: 1, 나머지: 4
pow()
첫 번째로 전달된 인자 값에 대해 두 번째로 전달된 인자 값으로 제곱한 결과를 반환하는 함수
data_list = [1, 2, 3, 4, 5]
print("pow({0}, 2) => {1}".format(data_list[2], pow(data_list[2], 2)))
print("list(map(lambda x: pow(x, 2), {0})) => {1}".format(data_list, list(map(lambda x: pow(x, 2), data_list))))
[결과]
pow(3, 2) => 9
list(map(lambda x: pow(x, 2), [1, 2, 3, 4, 5])) => [1, 4, 9, 16, 25]
시퀀스형/반복 가능한 자료형을 다루는 함수
all()
반복 가능한 자료형인 List, Tuple, Set, Dictionary, 문자열 등을 인자로 전달하여 항목 모두가 True로 평가되면 True를 반환하고, False로 평가되는 항목이 하나라도 있으면 False를 반환하는 함수
val = [True, True, True]
print("all({0}) => {1}".format(val, all(val)))
val = [10, 20, 30]
print("all({0}) => {1}".format(val, all(val)))
val = [10, 20, 0]
print("all({0}) => {1}".format(val, all(val)))
[결과]
all([True, True, True]) => True
all([10, 20, 30]) => True
all([10, 20, 0]) => False
val = [10, 20, ""] # 공백문자열 : False
print("all({0}) => {1}".format(val, all(val)))
val = [10, 20, False] # False 자체
print("all({0}) => {1}".format(val, all(val)))
val = [10, 20, None] # None 항목 : False
print("all({0}) => {1}".format(val, all(val)))
[결과]
all([10, 20, ""]) => False
all([10, 20, False]) => False
all([10, 20, None]) => False
any()
반복 가능한 자료형인 List, Tuple, Set, Dictionary, 문자열 등을 인자로 전달하여 항목 모두가 False로 평가되면 False를 반환하고, True로 평가되는 항목이 하나라도 있으면 True를 반환하는 함수
val = [True, True, True]
print("any({0}) => {1}".format(val, any(val)))
val = [10, 20, 30]
print("any({0}) => {1}".format(val, any(val)))
val = [10, 20, 0]
print("any({0}) => {1}".format(val, any(val)))
[결과]
any([True, True, True]) => True
any([10, 20, 30]) => True
any([10, 20, 0]) => True
val = [10, 20, ""]
print("any({0}) => {1}".format(val, any(val)))
val = [10, 20, False]
print("any({0}) => {1}".format(val, any(val)))
val = [10, 20, None]
print("any({0}) => {1}".format(val, any(val)))
[결과]
any([10, 20, ""]) => True
any([10, 20, False]) => True
any([10, 20, None]) => True
enumerate()
List, Tuple, 문자열과 같은 시퀀스형을 입력받아 인덱스를 포함하는 튜플 객체를 항목으로 구성하는 enumerate 객체를 반환하는 함수
data_list = [10, 20, 30, 40, 50]
for idx, val in enumerate(data_list):
print("data_list[{0}]: {1}".format(idx, val))
print("-" * 25)
for obj in enumerate(data_list):
print("{0}: {1}, {2}".format(type(obj), obj[0], obj[1]))
print("-" * 25)
for obj in enumerate(data_list):
print("{0}: {1}, {2}".format(type(obj), *obj)) # 튜플이므로 언팩 연산자 사용
[결과]
data_list[0]: 10
data_list[1]: 20
data_list[2]: 30
data_list[3]: 40
data_list[4]: 50
-------------------------
<class 'tuple'>: 0, 10
<class 'tuple'>: 1, 20
<class 'tuple'>: 2, 30
<class 'tuple'>: 3, 40
<class 'tuple'>: 4, 50
-------------------------
<class 'tuple'>: 0, 10
<class 'tuple'>: 1, 20
<class 'tuple'>: 2, 30
<class 'tuple'>: 3, 40
<class 'tuple'>: 4, 50
filter()
조건에 해당하는 항목을 걸러내는 함수
def iseven(num):
return num % 2 == 0 # 짝수일 때 True 반환
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ret_val = filter(iseven, numbers)
# ret_val = filter(lambda n: n % 2 == 0, numbers)
print("{0}".format(type(ret_val)))
print("{0}".format(list(ret_val)))
[결과]
<class 'filter'>
[2, 4, 6, 8, 10]
반복 가능한 자료형 반환 함수
반복 가능한 자료형을 인자로 전달 받아
- list() : 리스트로 변환해 반환하는 함수
- tuple() : 튜플로 변환해 반환하는 함수
- set() : 셋으로 변환해 반환하는 함수
- dict() : 딕셔너리로 변환해 반환하는 함수
data_str = "Hello"
data_list = list(data_str)
print("list('{0}') => {1} {2}".format(data_str, type(data_list), data_list))
# list('Hello') => <class 'list'> ['H', 'e', 'l', 'l', 'o']
data_tuple = tuple(data_str)
print("tuple('{0}') => {1} {2}".format(data_str, type(data_tuple), data_tuple))
# tuple('Hello') => <class 'tuple'> ('H', 'e', 'l', 'l', 'o')
data_set = set(data_str)
print("set('{0}') => {1} {2}".format(data_str, type(data_set), data_set))
# set('Hello') => <class 'set'> {'H', 'o', 'e', 'l'} 순서는 의미가 없다.
data_dict = dict(enumerate(data_set))
print("dict('{0}') => {1} {2}".format(data_set, type(data_dict), data_dict))
# dict('{'H', 'o', 'e', 'l'}') => <class 'dict'> {0: 'H', 1: 'o', 2: 'e', 3: 'l'}
map()
두 번째 인자로 반복 가능한 자료형을 전달 받아 자료형의 각 항목에 대해 첫 번째 인자로 전달 받은 함수를 적용한 결과를 맵 객체로 반환하는 함수
data_list = list("abcdef")
result = list(map(lambda x: x.upper(), data_list))
# data_list 객체의 항목에 대해 대문자로 변환한 항목을 가진 map 객체 반환
print("list(map(lambda x: x.upper(), {0})) => {1} {2}".format(data_list, type(result), result))
# result 객체는 data_list의 모든 값이 대문자로 변환된 항목을 가진 list 객체
[결과]
list(map(lambda x: x.upper(), ['a', 'b', 'c', 'd', 'e', 'f'])) => <class 'list'> ['A', 'B', 'C', 'D', 'E', 'F']
max(), min()
반복 가능한 자료형을 인자로 전달받아
- max() : 항목 중 가장 큰 값 반환
- min() : 항목 중 가장 작은 값 반환
data_list = [10, 20, 30, 40, 50]
print("{0} => min: {1}, max: {2}".format(data_list, min(data_list), max(data_list)))
[결과]
[10, 20, 30, 40, 50] => min: 10, max: 50
sorted()
반복 가능한 자료형을 인자로 전달받아 항목들로부터 정렬된 리스트를 생성해 반환하는 함수
data_list = [3, 8, 12, 2, 5, 11]
asc_result = sorted(data_list) # 오름차순으로 정렬된 리스트 객체 생성
print("{0} {1}".format(type(data_list), data_list))
print("{0} {1}".format(type(asc_result), asc_result))
print("-" * 35)
desc_result = list(reversed(asc_result)) # 내림차순의 리스트 객체 생성
# reversed(lst) : lst의 구성을 거꾸로 구성
print("{0} {1}".format(type(data_list), data_list)) # 원본
print("{0} {1}".format(type(asc_result), asc_result)) # 오름차순
print("{0} {1}".format(type(desc_result), desc_result)) # 내림차순
[결과]
<class 'list'> [3, 8, 12, 2, 5, 11]
<class 'list'> [2, 3, 5, 8, 11, 12]
-----------------------------------
<class 'list'> [3, 8, 12, 2, 5, 11]
<class 'list'> [2, 3, 5, 8, 11, 12]
<class 'list'> [12, 11, 8, 5, 3, 2]
zip()
둘 이상의 반복 가능한 자료형을 인자로 전달받아, 동일 위치의 항목을 묶어 튜플을 항목으로 구성하는 zip 객체를 생성하는 함수
중요🔔 인자로 전달된 객체는 동일 자료형, 항목의 개수가 같아야 함
data_list1 = [1, 2, 3]
data_list2 = [4, 5, 6]
data_list3 = ["a", "b", "c"]
print("list(zip({0}, {1})) => {2}".format(data_list1,
data_list2, list(zip(data_list1, data_list2))))
# list(zip([1, 2, 3], [4, 5, 6])) => [(1, 4), (2, 5), (3, 6)]
print("list(zip({0}, {1}, {2})) => {3}".format(data_list1,
data_list2, data_list3, list(zip(data_list1, data_list2, data_list3))))
# list(zip([1, 2, 3], [4, 5, 6], ['a', 'b', 'c'])) => [(1, 4, 'a'), (2, 5, 'b'), (3, 6, 'c')]
print("dict(zip({0}, {1})) => {2}".format(data_list1,
data_list3, dict(zip(data_list1, data_list3))))
# dict(zip([1, 2, 3], ['a', 'b', 'c'])) => {1: 'a', 2: 'b', 3: 'c'}
변환 함수
-
chr() : 정수 형태의 유니코드 값 -> 문자
-
ord() : 문자 -> 유니코드 값(10진 정수)
-
hex() : 10진 정수 -> 16진수
-
int() : 숫자 형식의 문자열, 부동소수점 -> 정수
- 진수를 바꿀 수 있음! ex. int(인자, 진수)
-
float() : 숫자 형식의 문자열, 정수 -> 부동소수점 숫자
-
str() : 객체 -> 문자열 변환 값을 반환
chr() 함수 예시
val = 65
print("chr({0}) => '{1}'".format(val, chr(val)))
# chr(65) => 'A'
val = 97
print("chr({0}) => '{1}'".format(val, chr(val)))
# chr(97) => 'a'
val = 0xac00 # 16진수
print("chr({0:x}) => '{1}'".format(val, chr(val)))
# chr(ac00) => '가'
ord(), hex() 함수 예시
val = "A"
print("ord({0}) => '{1}'".format(val, ord(val)))
# ord('A') => 65
val = "a"
print("ord({0}) => '{1}'".format(val, ord(val)))
# ord('a') => 97
val = "가"
print("ord({0}) => '{1}'".format(val, ord(val)))
print("ord({0}) => '{1}'".format(val, hex(ord(val))))
# ord("가") => 44032
# ord("가") => 0xac00
int() 함수 예시
x = "10"
y = "3C"
z = 4.5
print("2진수 표현인 문자열 '{0}' 은(는) 10진수 {1}로 변환됩니다.".format(x, int(x, 2)))
print("16진수 표현인 문자열 '{0}' 은(는) 10진수 {1}로 변환됩니다.".format(y, int(y, 16)))
print("int({1})은 {0} {1}을 {2} {3}로 변환됩니다.".format(type(z), z, type(int(z)), int(z)))
[결과]
2진수 표현인 문자열 '10' 은(는) 10진수 2로 변환됩니다.
16진수 표현인 문자열 '3C' 은(는) 10진수 60로 변환됩니다.
int(4.5)은 <class 'float'> 4.5을 <class 'int'> 4로 변환됩니다.
객체 조사를 위한 함수
dir()
인자로 전달된 개개체가 가지고 있는 변수, 메서드와 같은 속성 정보를 리스트 객체로 반환. 인자를 전달하지 않고 호출하면 현재 지역 스코프에 대한 정보를 리스트 객체로 반환
print("dir() => {0}".format(dir()))
# 지역 스코프에 대한 정보를 리스트 객체로 반환
data_str = "Hello, Python!"
print("dir(data_str) => {0}".format(dir(data_str)))
# 문자열이 가지고 있는 많은 메소드 정보를 리스트 객체에 담아 반환
data_list = [10, 20, 30, 40, 50]
print("dir(data_list) => {0}".format(dir(data_list)))
# 정수형 리스트 객체가 가지고 있는 메소드 정보를 리스트 객체에 담아 반환
data_dict = {"key1": 10, "key2": 20, "key3": 30}
print("dir(data_dict) => {0}".format(dir(data_dict)))
# 객체가 가지고 있는 메소드 정보들을 리스트 객체에 담아 반환
[결과]
dir() => ['__annotations__', '__builtins__', ... , '__name__', '__package__', '__spec__']
dir(data_str) => ['__add__', '__class__', '__contains__', '__delattr__', ... , 'upper', 'zfill']
dir(data_list) => ['__add__', '__class__', '__class_getitem__', ... , 'pop', 'remove', 'reverse', 'sort']
dir(data_dict) => ['__class__', '__class_getitem__', ... ,'update', 'values']
globals(), locals()
-
globals()
- 현재의 전역 심볼 테이블을 보여주는 딕셔너리를 반환하는 함수
- 전역변수화 함수, 클래스의 정보 포함
-
locals()
- 현재의 지역 심볼 테이블을 보여주는 딕셔너리를 반환하는 함수
- 매개변수를 포함한 지역변수와 중첩함수의 정보 포함
class MyClass:
pass
def test_fn(param):
def inner_fn():
pass
val1 = 5
val2 = 8
for item in locals().items():
# Locals 함수가 반환한 딕셔너리 객체에 대해 Items 함수로 리스트 객체를 얻음
print("\t{0} : {1}".format(item[0], item[1]))
# 첫 번째 항목인 키를, 두 번째 항목인 값을 접근해 지역 정보 출력
value1 = 10
value2 = 20
obj1 = MyClass()
g = dict(globals())
# globals() 함수가 반환한 dict 객체의 현재 상태를 복사해 g에 저장
print("globals()")
# g의 items 함수로 변환된 리스트 객체를 얻음
for item in g.items():
print("\t{0} : {1}".format(item[0], item[1]))
# 튜플 객체인 각 항목에 대해 첫 번째 항목인 key, 두 번째 항목인 value에 접근해 전역 정보 출력
print("\n\nlocals()")
test_fn(10)
# test_fn 함수를 호출하며 인자값 10을 전달해서 함수 내의 코드를 차례대로 실행
[결과]
globals()
__name__ : __main__
__doc__ : None
__package__ : None
__loader__ : <_frozen_importlib_external.SourceFileLoader object at 0x000002111ECA4A00>
__spec__ : None
__annotations__ : {}
__builtins__ : <module 'builtins' (built-in)>
__file__ : c:\Intellij\Python\SWEA\2022-01-01-SWEA-Python1#45-53.py
__cached__ : None
MyClass : <class '__main__.MyClass'>
test_fn : <function test_fn at 0x000002111ED0AB00>
value1 : 10
value2 : 20
obj1 : <__main__.MyClass object at 0x000002111ECF3CA0>
locals()
param : 10
inner_fn : <function test_fn.<locals>.inner_fn at 0x000002111ED0AB90>
val1 : 5
val2 : 8
id()
인자로 전달된 객체의 고유 주소(참조값)를 반환하는 함수
x = 10
print("{0} x의 주소 값: {1}".format(type(x), hex(id(x))))
y = 10
print("{0} y의 주소 값: {1}".format(type(y), hex(id(y))))
z = "10"
print("{0} z의 주소 값: {1}".format(type(z), hex(id(z))))
[결과]
<class 'int'> x의 주소 값: 0x194a6380210
<class 'int'> y의 주소 값: 0x194a6380210 # 동일 자료형, 동일 값 -> 동일 주소
<class 'str'> z의 주소 값: 0x23111914670 # 자료형이 다르면 다른 주소를 가짐
isinstance(), issubclass()
isinstance()
첫 번째 인자로 전달된 객체가 두 번째 인자로 전달된 클래스의 인스턴스인지에 대한 여부를 True/False로 반환하는 함수
issubclass()
첫 번째 인자로 전달된 클래스가 두 번째 인자로 전달된 클래스의 서브클래스인지에 대한 여부를 True/False로 반환하는 함수
활용 예시
class Parent:
pass
class Child(Parent):
pass
p = Parent()
c = Child()
print("p 객체는 Parent 클래스의 인스턴스입니까? {0}".format(isinstance(p, Parent))) # True 반환
print("c 객체는 Parent 클래스의 인스턴스입니까? {0}".format(isinstance(c, Parent))) # True 반환
print("p 객체는 Child 클래스의 인스턴스입니까? {0}".format(isinstance(p, Child))) # False 반환
print("Child 클래스는 Parent 클래스의 서브클래스입니까? {0}".format(issubclass(Child, Parent))) # True 반환
[결과]
p 객체는 Parent 클래스의 인스턴스입니까? True
c 객체는 Parent 클래스의 인스턴스입니까? True
p 객체는 Child 클래스의 인스턴스입니까? False
Child 클래스는 Parent 클래스의 서브클래스입니까? True
실행 관련 함수 : eval()
실행 가능한 표현식의 문자열을 인자롤 전달받아 해당 문자열의 표현식을 실행한 결과값을 반환하는 함수
expr = "2 + 5 * 3"
print("{0} => {1}".format(expr, eval(expr)))
expr = "'hello, python!'.upper()"
print("{0} => {1}".format(expr, eval(expr)))
[결과]
2 + 5 * 3 => 17
'hello, python!'.upper() => HELLO, PYTHON!
실습 문제
문제
map() 함수와 filter() 함수 활용하여 프로그램 만들기
[결과]
data_list: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
항목 x에 적용할 표현식을 입력하세요: x + 3
항목 x를 필터링할 조건의 표현식을 입력하세요: x % 5 == 0
map 함수의 적용 결과: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]
filter 함수의 적용 결과: [5, 10, 15, 20]
나의 Sol
# -*- coding: utf-8 -*-
# mapAndFilter.py
data_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
print("data_list: {0}".format(data_list))
express_m = input("항목 x에 적용할 표현식을 입력하세요: ")
express_f = input("항목 x를 필터링할 조건의 표현식을 입력하세요: ")
data_list_m = list(map(lambda x: eval(express_m), data_list))
print("map 함수의 적용 결과: {0}".format(data_list_m))
data_list_mf = list(filter(lambda x: eval(express_f), data_list_m))
print("filter 함수의 적용 결과: {0}".format(data_list_mf))
주의📣 map()과 filter() 함수 모두 list() 함수로 묶어서 출력해야 함에 주의한다!
모범 답안
# -*- coding: utf-8 -*-
# mapAndFilter.py
data_list = list(range(1, 21))
print("data_llist: {0}".format(data_list))
map_str = input("항목 x에 대해 적용할 표현식을 입력하세요: ")
filter_str = input("항목 x를 필터링할 조건의 표현식을 입력하세요: ")
map_list = list(map(lambda x: eval(map_str), data_list))
filter_list = list(filter(lambda x: eval(filter_str), map_list))
print("data_list에 대한 map 함수의 적용 결과: {0}".format(map_list))
print("map_list에 대해 filter 함수의 적용 결과: {0}".format(filter_list))