6일차에 람다 함수부터 이어서 진행
1. 람다 함수(Lambda Function)
런타임에 생성해서 사용할 수 있는 익명 함수
- 필요성
- 상황에 따라 직접 정의해서 바로 사용하는 것이 필요할 때가 있음
- 1회성으로 한 번 쓰고 버리는 용도로 많이 사용함
- 변수에다 할당해서 하는 것이므로 메모리에 할당해 처리하는 다른 함수와 호출, 실행 시점이 조금 다르고 나머지는 거희 비슷하다.
- 사용 방식
- 함수 정의문이 없으므로 lambda라는 키워드를 사용함
- 하나의 라인에 정의할 수 있음
- 콜론(:)을 경계로 앞에는 매개변수를 정의하고 뒤에는 표현식을 정의함
- 표현식 대신 문장으로 표현하면 예외가 발생하므로(람다는 한줄로 처리하게 만들어진 것이기 때문) 반환값을 처리하는 return문이 필요없고 표현식을 실행한 결과가 자동으로 반환됨
- 함수를 정의문으로 정의한 것과 내부적으로 거의 동일하게 처리됨
1.1 람다함수 정의하기
기본 함수
람다함수
둘이 같은 식이다.
- 람다 함수도 function class 객체 여부 확인
<class 'function'>
__module__
__closure__
__call__
__name__
__builtins__
__qualname__
__defaults__
__annotations__
__code__
__kwdefaults__
__get__
__dict__
__globals__
<function <lambda> at 0x7a0b3d8172e0>
<lambda>
<lambda>
<function <lambda> at 0x7a0b0f9dc040>
{}
(100,)
{'y': 100}
- 람다 함수 표현식 부분에 함수 호출 처리
- 별도에 함수를 만들고 이를 람다식에서 호출해서 사용(람다 자체가 가지는 익명함수의 의미는 적어짐)
- 함수를 중간중간에 호출하기 어려울때 람다식을 사용해서 변수를 만들어 이를 호출해서 사용하면 유의미할 때가 있음
60
1.2 즉시 실행 함수(Immediately - invoked function express)
- lambda 정의하고 즉시 실행 처리
<function __main__.<lambda>(x)>
1
- lambda 함수 재사용하기
- lambda 함수는 한 번 쓰고 버리는 1회성으로 많이 사용함
- 재사용하고자 할 경우
- 이름없는 함수라서 네임스페이스에 할당되지 않으므로 다른 변수에 할당해서 재사용 할 수 있음
- lambda 함수도 함수 클래스의 인스턴스이므로 객체의 인스턴스로 사용이 가능하며 객체 네임스페이스로 관리할 수도 있음(함수가 할당된 변수의 네임스페이스의 영향을 받는다는말)
<function <lambda> at 0x7a0b0f983520>
<lambda>
12
27
어디의 제어를 받는지에 대해 학습코드
<function <lambda> at 0x7a0b0f983400>
{'count': 0}
0
{'count': 1}
1.3 지능형 리스트(List Comprehension)에서 람다 함수 사용하기
- 지능형 리스트 내의 익명함수 처리
- 리스트를 작성할 때 람다함수가 원소로 만들어지도록 구성함
[0, 1, 2]
각각을 별개의 변수처럼 사용할 수 있다(각 결과들을 람다함수로 정의되게 만듬, 각 하나하나를 for문으로 가져올 수 있음)
람다함수 자체를 그대로 넣음
[<function <listcomp>.<lambda> at 0x7a0b3c8fbac0>, <function <listcomp>.<lambda> at 0x7a0b3c8fb9a0>, <function <listcomp>.<lambda> at 0x7a0b0f983eb0>]
<function <listcomp>.<lambda> at 0x7a0b3c8fbac0> 2
<function <listcomp>.<lambda> at 0x7a0b3c8fb9a0> 2
<function <listcomp>.<lambda> at 0x7a0b0f983eb0> 2
람다함수를 실행해서 결과물을 리스트에 넣는것
[0, 1, 2]
람다함수 자체가 나오는데, 전달돼어온 x를 하나씩 받아들여서 값 자체가 반영됨
<function <listcomp>.<lambda> at 0x7a0b0f982d40> 0
<function <listcomp>.<lambda> at 0x7a0b0f983640> 1
<function <listcomp>.<lambda> at 0x7a0b0f981ea0> 2
<function <listcomp>.<lambda> at 0x7a0b0f9832e0> 0
<function <listcomp>.<lambda> at 0x7a0b0f981cf0> 1
<function <listcomp>.<lambda> at 0x7a0b0f982ef0> 2
2. 내부 함수(Nested Function)
- 내부 함수(Nested Function)
- 함수 안에 정의해서 실행할 수 있는 함수 (일반적인 함수는 외부 함수(Outer Function))
- 함수를 함수 내부에 정의해서 사용하므로 함수 간의 네임스페이스를 처리하는 스코프도 내부적으로 생성됨
2.1 내부 함수 정의하기
- 함수 내에 함수 정의 및 내부 실행처리
- 외부 함수 내의 기능을 나누고 내부 함수로 정의해서 외부 함수의 보조 기능을 처리하는 방식
12
4
20
2.0
- 내부 함수 호출을 반환에서 사용하기
15
5
15
4.0
1.2 내부 함수가 외부로 전달된 환경 이해하기
- 외부함수의 반환값으로 내부 함수에 대한 정보 확인
<function outer.<locals>.inner at 0x7a0b0f983370>
inner
11
- 타 모듈의 함수를 내부 함수에 지정 (다른 곳에서 들고와서 쓸 수 있다)
outer_ 함수가 op_code에 해당하는 연산자 함수를 직접 반환 한다.
<built-in function truediv>
2.0
outer_ 함수가 두 숫자를 연산하는 내부 함수 inner_를 정의하고 반환 하며. 이 inner_ 함수는 실행 시에 매번 딕셔너리에서 연산자 함수를 선택하여 연산을 수행하는 것이다.
매번 연산자 함수를 선택하는 추가 단계가 있어서 다소 더 복잡하지만 연산자 함수를 직접 반환하는 코드와 기능적으로는 동일한 것이다.
<function outer_.<locals>.inner_ at 0x7a0b0f9dc3a0>
2.0
- 내부 함수로 외부 함수의 매개변수 자료형 검증
3 # 위 값을 인티저로 바꿔서, 반올림하지 않고 버림(대부분 남는 부분을 버림 처리한다)
3.3
스트링 상태로 바꾸니까 이어서 스트링으로 바뀌어서 나타남
1.12.2
1.3 내부 함수 안에서 nonlocal 변수 사용하기
- 함수별 Namespace 생성 확인하기
outer_local
{'inner_local': <function outer_local.<locals>.inner_local at 0x7a0b0f9dde10>,
'x': 10,
'y': 20}
inner_local
{'a': 30, 'b': 40}
- 외부 함수 Namespace 사용하기
inner_local2
11
- 내부함수 내에 내부함수를 내포하기
61
위 코드에서 nonlocal y를 주석처리하면 UnboundLocalError: local variable 'y' referenced before assignment 오류가 발생
위 오류가 발생하는 원인은 inn_2 함수 내부에서 y 변수를 수정하려고 할 때, 파이썬은 이를 함수의 지역 변수로 간주하기 때문입니다. 따라서 y 변수는 아직 할당되지 않은 상태로 간주되어 UnboundLocalError가 발생합니다.
이 문제를 해결하려면 nonlocal 키워드를 사용하여 y 변수가 inn_2 함수의 외부 범위(즉, inn_1 함수)의 변수임을 명시해야 합니다.
- nonlocal 키워드는 중첩 함수에서 상위 범위의 변수를 수정할 때 사용됩니다.
61
위와같이 return 쪽에서 묶으면 정상 동작을 하는데 이는
y 변수의 값을 inn_2 함수 내에서 직접 수정하지 않고, 대신 (y + 1)로 계산하여 반환하기 때문에 UnboundLocalError가 발생하지 않습니다. 수정된 코드의 의도는 y의 값을 직접 변경하지 않고, 단지 계산에 사용할 때 1을 더하는 것이기 때문에 그런 것이다.
전체 코드 흐름을 보면
- out_(10)을 호출하면 x가 10인 inn_1 함수를 반환합니다.
- inn_1(20)을 호출하면 y가 20인 inn_2 함수를 반환합니다.
- inn_2(30)을 호출하면 x는 10, y는 20, z는 30입니다. 따라서, x + (y + 1) + z는 10 + (20 + 1) + 30이 되어 61을 반환합니다.
이므로 출력이 61이 되는 것이다.
2. 파이썬 제공 내장 함수
2.1 계산 및 문자 변환 내장 함수
- Sequence 자료형 합 구하기 : sum
10
15
[(1, 2), (3, 4), (7, 9)]
- 소수점 조정 및 몫과 나머지 구하기
round : 반올림
divmod : 나누기해서 나머지를 보는것
<class 'builtin_function_or_method'>
<class 'builtin_function_or_method'>
빌트인인것을 보면 파이썬 루트에서 작동되는 코드이다.
100
100.123
100.12346
divmod(a, b) 함수:
- 이 함수는 두 숫자 a와 b를 인자로 받아서 (몫, 나머지)의 튜플을 반환
// 연산자 (정수 나눗셈):
- 이 연산자는 두 숫자 a와 b를 나누고 그 몫을 반환
% 연산자 (나머지 연산자):
- 이 연산자는 두 숫자 a와 b를 나누고 그 나머지를 반환
(4, 8)
4
8
- 절대값, 제곱과 논리식 구하기
- abs는 절대값 나타내는 함수
<class 'builtin_function_or_method'>
100
math제공 함수들
- pow는 제곱을 계산하는 함수
- pow(base, exp, mod) 형태로 사용 이는 (base ** exp) % mod를 계산한 것이다
- math.pow(10, 3)은 10을 3제곱하는 것이므로, 1000.0을 반환합니다. math.pow는 항상 부동 소수점 수를 반환한다
- pow(10, 1/2)은 10의 1/2제곱을 계산하는데, 이는 10의 제곱근을 의미
- math.sqrt는 math 모듈에 있는 함수로, 주어진 숫자의 제곱근을 계산
<class 'builtin_function_or_method'>
100
1
1000.0
3.1622776601683795
3.1622776601683795
- 숫자를 문자로 문자를 숫자로 변환하기
- map() 함수의 역할은 각 문자열에 대해 문자 코드를 변환하거나 문자 코드를 문자로 다시 변환하는 것
[50508, 50500, 48372, 44256, 49910, 51008, 54028, 51060, 50028] # 아스키코드값
알아보고싶은파이썬
[73, 119, 97, 110, 116, 116, 111, 107, 110, 111, 119, 80, 121, 116, 104, 111, 110, 32] # 아스키코드값
IwanttoknowPython
- 논리식의 결과로 처리하기
any, all 는 빌트인에 있는 함수
any() : 반복 가능한(iterable) 객체를 받아 그 객체의 어떤 요소라도 참(True)이면 True를 반환하고, 모든 요소가 거짓(False)일 때만 False를 반환
all() : 반복 가능한(iterable) 객체를 받아서, 객체의 모든 요소가 참(True)이면 True를 반환하고, 그렇지 않으면 False를 반환
<class 'builtin_function_or_method'> <class 'builtin_function_or_method'>
False
False
True
False
True
False
True
True
False
True
2.2 정렬 내장 함수 이해하기
- 정렬 함수 sorted
<built-in function sorted>
['a', 'abc', 'bc']
['bc', 'abc', 'a']
['a', 'bc', 'abc']
['a', 'abc', 'bc']
['bc', 'abc', 'a']
['a', 'bc', 'abc']
- 문자열을 바로 실행하기
- exec() 함수는 문자열로 제공된 코드를 실행, 따라서 s = "a_e = a_e + 100" 이 실행될 때 exec(s)를 호출하면 a_e 변수가 새로운 값으로 업데이트된다.
- exec() 함수는 전역 범위(global scope)에서 코드를 실행하므로, a_e 변수는 전역 범위에서 사용된다
변수에 할당하기
200
<function add_exec at 0x7a0b0f983e20>
20
40
파일 저장해서 불러와서 실행
Writing exec_add.py
50
- 컴파일에서 eval, exec 실행을 지정한 후에 나중에 실행하기
- 컴파일을 통해서 준비과정으로 만들어놓고, 이를 호출해서 시용
- eval(ex)를 통해 컴파일된 코드를 실행, 이는 전역 범위에 Person 클래스를 정의
- p = Person("춘식이")는 위에서 정의된 Person 클래스를 사용하여 객체를 생성
- print(p.getname())은 생성된 객체 p의 getname() 메서드를 호출하여 이름을 출력
춘식이
- compile() 함수를 사용하여 표현식으로 컴파일
- fakefile은 컴파일된 코드의 파일명을 지정하는 것
- eval(ev)를 통해 컴파일된 표현식을 실행하고, "춘장이"를 인자로 전달하여 Person 클래스의 객체를 생성
- 생성된 객체 b의 getname() 메서드를 호출하여 이름을 출력
춘장이
- 약수 구하기
수를 입력하세요9
약수 {1, 3, 9}
수를 입력하세요18
약수 {1, 2, 3, 6, 9, 18}
공약수 {1, 3, 9}
최대 공약수 9
재귀함수 : 자기 자신을 호출하는 것
구성을 잘하면 코드도 짧고, 빠르게 작동 가능
수를 입력하세요 75
수를 입력하세요 33
75 33
75 33
33 9
9 6
6 3
3 0
최대 공약수 3
3. 함수 정보 조회
6.1 Function 및 code class 이해하기
- 함수(람다함수 포함)는 로딩될 때 function 클래스에 속성이 만들어지고 이 내부에 code 클래스의 인스턴스까지 연결하여 속성을 확인할 수 있음
- 함수의 자료형 확인
<class 'function'>
True
함수 내의 code 클래스 정보 확인하기
<class 'code'>
{'co_argcount',
'co_cellvars',
'co_code',
'co_consts',
'co_filename',
'co_firstlineno',
'co_flags',
'co_freevars',
'co_kwonlyargcount',
'co_lines',
'co_linetable',
'co_lnotab',
'co_name',
'co_names',
'co_nlocals',
'co_posonlyargcount',
'co_stacksize',
'co_varnames',
'replace'}
2
addd
()
('x', 'y')
- 함수 소스 및 바이트 코드 보기
- inspect.getsource() 함수는 주어진 함수나 클래스의 소스 코드를 문자열 형태로 반환
def addd(x:int,y:int) -> int :
return x+y
- dis 모듈은 파이썬의 바이트 코드(bytecode)를 분석하고 디스어셈블한(disassembled) 결과를 제공하는 모듈
- dis.dis() 함수는 함수나 메서드의 바이트 코드를 분석하여 그 내용을 출력함
4 0 LOAD_FAST 0 (x)
2 LOAD_FAST 1 (y)
4 BINARY_ADD
6 RETURN_VALUE
None
6.2 함수 시그니처
- 함수 시그니처
- 함수의 입력과 출력을 정의하는 부분
- 함수의 이름, 매개변수의 개수, 매개변수의 자료형, 반환값 등을 포함
- 시그니처와 매개변수 정보 확인하기
<class 'inspect.Signature'>
(x: int, y: int) -> int
OrderedDict([('x', <Parameter "x: int">), ('y', <Parameter "y: int">)])
x: int
y: int
<class 'int'>
- 함수에 대한 기본 정보도 함수로 조회하기
<class 'str'>
addd 함수에 대한 __doct__
<module '__main__'>
Arguments(args=['x', 'y'], varargs=None, varkw=None)
<ipython-input-119-7e25935ec5a4>
'PYTHON-BACK' 카테고리의 다른 글
#파이썬 기초 8일차_1 (1) | 2024.07.08 |
---|---|
#파이썬 기초 7일차_2 (1) | 2024.07.05 |
#파이썬 기초 6일차_1 (0) | 2024.07.04 |
#파이썬 기초 5일차_1 (1) | 2024.07.03 |
#파이썬 기초 4일차_2 (1) | 2024.07.02 |