SWEA 파이썬 프로그래밍 기초(1) 파이썬의 기본 구조와 기초 문법 #44
인자로 숫자를 전달하면 그 숫자의 절대값을 반환하는 함수
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
첫 번째 인자를 두 번째 인자로 나눴을 때의 몫과 나머지를 튜플 객체로 반환하는 함수
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
첫 번째로 전달된 인자 값에 대해 두 번째로 전달된 인자 값으로 제곱한 결과를 반환하는 함수
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]
반복 가능한 자료형인 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
반복 가능한 자료형인 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
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
조건에 해당하는 항목을 걸러내는 함수
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'}
두 번째 인자로 반복 가능한 자료형을 전달 받아 자료형의 각 항목에 대해 첫 번째 인자로 전달 받은 함수를 적용한 결과를 맵 객체로 반환하는 함수
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() : 항목 중 가장 작은 값 반환
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
반복 가능한 자료형을 인자로 전달받아 항목들로부터 정렬된 리스트를 생성해 반환하는 함수
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 객체를 생성하는 함수
중요🔔 인자로 전달된 객체는 동일 자료형, 항목의 개수가 같아야 함
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() : 객체 -> 문자열 변환 값을 반환
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) => '가'
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
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로 변환됩니다.
인자로 전달된 개개체가 가지고 있는 변수, 메서드와 같은 속성 정보를 리스트 객체로 반환. 인자를 전달하지 않고 호출하면 현재 지역 스코프에 대한 정보를 리스트 객체로 반환
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()
- 현재의 지역 심볼 테이블을 보여주는 딕셔너리를 반환하는 함수
- 매개변수를 포함한 지역변수와 중첩함수의 정보 포함
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
인자로 전달된 객체의 고유 주소(참조값)를 반환하는 함수
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 # 자료형이 다르면 다른 주소를 가짐
첫 번째 인자로 전달된 객체가 두 번째 인자로 전달된 클래스의 인스턴스인지에 대한 여부를 True/False로 반환하는 함수
첫 번째 인자로 전달된 클래스가 두 번째 인자로 전달된 클래스의 서브클래스인지에 대한 여부를 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
실행 가능한 표현식의 문자열을 인자롤 전달받아 해당 문자열의 표현식을 실행한 결과값을 반환하는 함수
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]
# -*- 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))
