[패스트캠퍼스python] 상속, 다중상속

[패스트캠퍼스python] 상속, 다중상속

파이썬 인강 : 상속, 다중상속

파이썬 클래스 상세 이해 : 상속, 다중상속

상속은 부모한테서 물려받는 것을 뜻한다
자식이 부모의 속성과 매서드를 사용할 수 있는 것이다

상속과 다중상속

Read More

ITWILL : JS를 문서에 나타내는 3가지방법, undefined VS null, 백의자리 Math.floor(), 복합대입연산자로table생성, A++과 ++A차이점, ==과===차이점, 논리표

ITWILL학원 : 3강 JS기초 BY 정규태강사

1. 문서에 js를 나타내는 3가지 방법

  1. document.write();

  2. console.log();

  3. alert();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let a = 100;

// 1번 방법
document.write(a);

// 2번 방법
console.log(a);

// 3번 방법
alert(a)

// 출력값은
셋 다 동일하게 100이 출력된다.
표시되는 곳이 다를 뿐.

2. undefined VS null

  • undefined : 변수에 아무런 값도 등록되어 있지 않은 경우
    • var value;
  • null : 아무것도 없음을 표현하는 값 따라서 주로 변수를 초기화할때 사용함.
    • var value = null;
    • 객체를 생성하고 사용할 수 있게 하기 위해 null로 초기화한다

3. 변수명 작성

  1. 변수명은 영문자로 작성 (첫번째 글자에 $, _ 사용가능)
  2. 예약어는 변수명으로 사용할 수없다 ex) False, typeof
  3. 변수명은 가능하면 의미를 가지고 생성
  4. 대소문자 구분 필수

4. 산술 연산자

예제문제를 푸는데 나는 두가지 방법이 떠올라서 두가지방법으로 풀어보았다

예제문제
Math.floor를 사용하여 세자리 숫자를 연산하면 100의 단위로만 나타내세요
input 456
output 400

1
2
3
4
let num3 = 778;

console.log('첫번째방법은 ' + (num3 - num3%100));
console.log('두번째방법은 ' + (Math.floor(num3*0.01))*100);

5. 대입 연산자

변수에 데이터(값)을 저장하는 연산자
ex) A = B ; 연산의 방향이 오른쪽에서 왼쪽이다

복합대입연산자는 산술연산자에 복합연산자를 함께 사용하는 것으로 그 예에는 +=, -=, *=, /=, %=가 있다
ex) A += B; <=> A = A + B;
ex) A -= B; <=> A = A - B;
ex) A *= B; <=> A = A * B;

복합대입연산자를 활용해 테이플을 편하게 만들 수 있다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let name = "곽두팔";
let age = 77;
let addr = '제주';

let tableTag;
tableTag = '<table border="1">';
tableTag += '<tr>';
tableTag += '<td>'+name+'</td>';
tableTag += '<td>'+age+'</td>';
tableTag += '<td>'+addr+'</td>';
tableTag += '</tr>';
tableTag += '</table>';

document.write(tableTag)

물론 HTML로 만드는 것이 훨씬 편하지만…ㅋㅋㅋ

6. 증감 연산자(단항연산자)

변수의 앞, 뒤에서 사용하며 값을 1증가 또는 1감소

  1. ++A 또는 –A (전위연산) : 변수의 값을 사용할때 1증가 또는 1감소 실행
  2. A++ 또는 A– (후위연산) : 변수의 값을 먼저 사용하고 나서 1증가 또는 1감소 실행
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
let A = 100;

//1차 비교
++A;
console.log(A); // 101
A++;
console.log(A); // 102


//2차 비교
console.log('++A : ' + (++A) + ' ' + A); // 101
console.log(A); //101
console.log('A++ : ' + (A++) + ' ' + A); // 101
console.log(A); //102

//3차 비교
let temp = ++A;
console.log(temp) // 103
console.log(A) //103
temp = A++
console.log(temp) // 103
console.log(A) // 104

세미콜론의 위치때문에 1번과 2번의 값이 차이가 생겼다
++A는 A의 값을 변화시키지 않고 콘솔을 찍었고
A++은 A의 값을 1씩 더한 뒤(세미콜론찍고) 콘솔을 찍었다.
즉 변수의 값을 변하시키는 건 A++후위연산이다.

7. 비교연산자

데이터를 비교하는 연산자.
연산의 결과는 boolean 으로 나온다.
<, >, <=, >=, ==, !=, ===, !==

1
2
3
4
5
6
7
8
num1 = 10;
num2 = '10';

console.log(num1 === num2) // false
console.log(num1 == num2) // true

console.log(num1 !== num2) // true
console.log(num1 != num2) // false

왜 서로 값이 다르게 나올까?

  • == : 데이터의 값만 서용해서 비교
  • === : 데이터의 값 + 데이터의 타입을 모두 비교 (높은 정확도)

참고로 위의 개념은 js에만 해당됨

8. 논리연산자

총 3가지의 연산자가 있다

  • && AND 두개 넣어서 AND연산자
  • || 버티컬바 두개 넣어서 OR연산
  • ! 느낌표 넣어서 NOT연산

논리연산자진리표를 꼭 기억해야한다.

[패스트캠퍼스python] 클래스의 self의 이해, 클래스, 인스턴스 변수

파이썬 인강 : 클래스의 self의 이해, 클래스, 인스턴스 변수

오늘은 꼭 알아야하면서도 엄청 중요한 개념이라고 할 수 있는 클래스의 self, 클래스, 인스턴스 변수에 대해 공부해보자

1. 클래스의 self의 이해

self 매개변수의 유무에 따른 차이를 아래 예시를 통해 확인해보자

1
2
3
4
5
6
7
8
9
10
print()
class SelfTest: #class SelfTest(): 빈괄호가 있어도되고 없어도 된다
def function1(): # self매개변수없음 = 클래스매서드
print("function1 called!")

def function2(self): # self매개변수있음 = 인스턴스매서드
print(id(self))
print("function2 called!")

self_Test = SelfTest() # 인스턴스 생성

이제 function1을 호출해보자

1
2
3
4
# self_Test.function1()

# 출력값은
TypeError: unction1() takes 0 positional arguments but 1 was given

function1은 클래스매서드이기에 그냥 출력하면 타입에러가 발생한다
아래와 같이 출력해야한다

1
2
3
4
SelfTest.function1()

# 출력값은
function1 called!

잘 출력되는 것을 확인할 수 있다
self매개변수를 선언한 함수는 어떨까?

1
2
3
4
5
6
7
self_Test.function2()
SelfTest.function2()

# 출력값은
function2 called!
TypeError: function2() missing 1 required positional argument: 'self'
#

두번째 방법의 타입에러를 해결하려면 아래 이미지처럼 하면 된다

타입에러 해결

터미널을 확인해보면 id값이 일치하는 것을 확인할 수 있다.

2. 변수 , 인스턴스 변수

클래스변수는 self가 없고 인스턴스변수는 self가 있어야한다
클래스변수는 공용으로 쓸 수 있다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
print()
class Warehouse:
# 클래스 변수
stock_num = 0

def __init__(self, name):
# 인스턴스 변수
self.name = name
Warehouse.stock_num += 1

def __del__(self):
Warehouse.stock_num -= 1


user1 = Warehouse('Kim')
user2 = Warehouse('Park')

그리고 유저1과 유저2 그리고 웨어하우스의 네임스페이를 확인해보자

1
2
3
4
5
6
7
8
print(user1.__dict__)
print(user2.__dict__)
print(Warehouse.__dict__) # 클래스 네임스페이스 , 클래스 변수를 공유한다.

# 출력물
{'name': 'Kim'}
{'name': 'Park'}
{'__module__': '__main__', 'stock_num': 2, '__init__': <function Warehouse.__init__ at 0x000001ED3D0C79D0>, '__del__': <function Warehouse.__del__ at 0x000001ED3D0C7A60>, '__dict__': <attribute '__dict__' of 'Warehouse' objects>, '__weakref__': <attribute '__weakref__' of 'Warehouse' objects>, '__doc__': None}

이를 통해 유저1과2에는 이름밖에 없고 웨어하우스에 stock_num이 있다는 것을 알수있다
만약 유저안에서 stock_num을 찾는다면 어떻게 될까?

1
2
3
4
5
6
print(user1.stock_num) 
print(user2.stock_num)

# 출력물
2
2

만약 유저를 한명 더 추가한다면 아래와 같이 출력된다

유저추가

네임스페이스안에 이름밖에 없었기때문에 stock_num을 못찾을것같지만 인스턴스는 자신의 네임스페이스에 없으면 클래스의 네임스페이스에서 찾아서 불러온다
이러한 점을 이용하여 연봉인상율같은 계산등에 활용할 수 있다.

ITWILL : JS기초이론, Compile VS Interprete, 변수, js라이브러리,객체타입

ITWILL학원 : 2강 JS기초이론 BY 정규태강사

1. 자바스크립트

JAVA와 이름은 비슷하지만 어떠한 연관성도 없는 언어이다.
JS 특징

  • 객체기반의 스크립트 프로그래밍 언어.
  • C언어 기반의 문법 사용
  • 넷스케이프에서 개발
  • HTML 문서 내부에 포함되어 있는 기능
  • 웹 브라우저를 통해서 실헹
  • 인터프리터를 사용해서 실행 : 컴파일러가 필요없고 위에서 아래로 순차적 실행
  • 서버의 작업처리부담을 덜어준다(클라이언트에서 처리가 되기 때문에)
  • JS소스코드는 오픈소스로 누구나 코드를 볼 수 있다.(보안측면상 100% 오픈은 아님)
  • 다양한 JS라이브러리를 제공한다

2. 스크립트 프로그래밍 언어란?

스크립트 언어 - 어플리케이션에 명령을 전달하기 위한 것.

  • ex) sql, awk, 자바스크립트 등

3. 인터프리터언어와 컴파일러 언어란?

Compile VS Interpreter
둘 다 고급언어로 작성된 원시 프로그램(Source Program)을 목적 프로그램(Object Program)으로 번역하는 번역 프로그램이며, 프로그램 번역 방식에 따라 구분된다.

  1. 컴파일
  • 목적프로그램을 생성
  • 번역과정과 번역시간이 복잡하고 오래 걸리지만 한번 번역 후에는 다시 번역하지 않아도되므로 실행속도 빠름
  • 대표적 JAVA, C언어
  • 예시: 소스코드(.java) -> 자바 컴파일 -> 바이트코드(.class) -> JVM 의 JIT 컴파일러 -> 머신코드 -> 실행
  1. 인터프리터
  • 목적프로그램을 생성하지않고 위에서 아래로 순차적으로 실행(웹 브라우저에 포함되어있음)
  • 번역속도는 빠르지만 프로그램 실행시 매번 번역해야해서 실행속도가 느리다
  • 대표적 php, PYTHON
  • 예시 : 소스코드(스크립트) -> 인터프리터 -> 실행

참고링크1

참고링크2

4. JS라이브러리란?

라이브러리란 특수한 기능을 모아놓은 것을 말한다
ex) jQuery, Ajax, JSON

5. 왜 JS를 쓸까?

자바는 서버에서 사용되는 언어이다. 서버에서 처리를 한 후 돌려줘야 한다.
반면 JS는 서버가 아닌 클라이언트에서 처리된다. 그래서 서버의 부담이 줄어든다

그렇다면 전부 JS로 하면 안될까??

하지만 JS에 한계가 있기 때문에 서버의 언어와 클라이언트의 언어를 같이 사용하게 된 것이다.

6. JS 사용시 주의점

  1. 항상 대/소문자 구문해서 사용한다.
    아래 코드는 같은 의미를 가지고 있는 것 같지만 출력값은 다르게 출력된다

    1
    2
    new Date();
    New DATE();
  2. 실행문을 끝낼때 항상 ;을 사용한다.
    세미콜론이 없이 실행가능할 수 있지만 실행중에 문제가 발생할 수도 있기에 붙이는 것을 권장한다

  3. 사용자(개발자)의 편의성을 위해 한 줄에 하나의 문장을 작성한다.

  4. 큰 따옴표와 작은 따음펴 사용에 주의한다

  • 자바의 경우, ""는 String만 가능, ''는 char만 가능
  • js의 경우, 구분없이 다 사용가능하고 항상 짝으로 사용하면 된다.
    1
    2
    // ex)
    document.write('안녕하세요 |'js|'입니다')
  1. 마우스를 사용할 수 없는 환경에 대한 고려를 해야한다.(키보드 접근성 준수)

7. 변수

  1. 변수란 무엇일까?
    하나의 공간에 하나의 데이터만 저장하는 공간(메모리)이다

만약 하나의 공간에 다른 데이터를 추가적으로 넣게되다면?
새로운 데이터가 들어올 시 기존 데이터에 덮어쓰여지게 된다.

저번시간에 꼭 기억해야하는 한 문장이 있다고 했다
바로 모든 프로그램은 주기억장치에서만 실행된다!

  1. 변수의 종류는 크게 아래와 같다
  • 문자형데이터(String) : 문자 또는 숫자를 (“”)(‘’)표현한 데이터.
    • 만약 document.write(‘100’+200+300)이라면 출력값은 어떻게 될까?
    • 100500이라고 답했다면 땡! 정답은 100200300이다.
  • 숫자형(Number) : 변수에 숫자만 저장되는 데이터.
  • 논리형(Boolean)
  • Null : 비워진 데이터 값
  1. 변수를 사용하기 위해서는 아래와 같이 세 가지의 동작이 필요하다
    1. 변수를 선언
    2. 변수를 초기화
    3. 변수를 사용

다만 경우에 따라서는 1번 선언과 2번 초기화를 같이 진행할 수도 있다.
- 변수 선언만 한 경우 : var 변수명;
- 선언과 초기화 같이 하는 경우 : var 변수명 = 값;

8. 변수 선언 후 초기화를 안한다면?

아래를 출력하면 언디파인드가 뜨는데 consol창에는 아무메세지도 나타나지않는다
즉 에러가 아니다

1
2
3
4
5
6
let tmp
document.write(tmp);


//출력값은
undefined

왜 이런 현상이 일어날까?

메모리가 할당된 tem안에 값이 없기때문에?

땡!

tem안에 값이 있는지 없는지 모르기때문에!

이게 무슨 양자역학같은 소리냐면…

메모리는 유한하다. 8기가나 16기가 등등.
컴퓨터는 여러 작업을 하면서 한정된 메모리안에서 데이터를 썼다가 지웠다가를 반복한다.
재사용된 메모리위치에 아직 쓰레기값이 들어있을 수도 있다.
내가 대입하지 않았더라도 어떤 쓰레기값이 들어가 있을수있기때문에 undefined가 나온 것이다.
따라서 변수선언 후에는 항상 초기화를 해줘야된다.

9. 객체타입

var타입은 객체타입이라고 한다. 모든 타입을 저장할 수 있다.
비교하자면, java의 변수선언은 정수인 경우 int num = 1이라고 하지만 js는 데이터타입을 정의하지않고 변수를 선언할 수 있다.

[패스트캠퍼스python] Hint과 클래스 기초

파이썬 인강 : Hint과 클래스 기초

1. Hint

데이터타입을 명시적으로 알려주는 역할을 한다

위의 사진에서와 같이 x : int의 의미는 x는 int형만 와야한다는 의미이고
-> list: 는 리스트형태로 출력될 것이다라는 의미이다.
패키지를 통해 해당 함수를 다른 파일로 빼놓을때 유용하게 사용할 수 있다.

1
2
3
4
5
6
7
8
9
def tot_length1(word: str, num: int) -> int:
return len(word) * num

print('hint exam1 : ', tot_length1("HeavyTalker", 10))
print(len("HeavyTalker"))

# 출력값은
hint exam1 : 110
11

2. 람다식 예제

람다식의 장점은 메모리 절약, 가독성 향상, 코드 간결해진다
함수와 람다의 차이점은

  • 함수는 객체 생성 -> 리소스(메모리) 할당
  • 람다는 즉시 실행 함수(Heap 초기화) -> 메모리 초기화
    즉 함수도 객체이기때문에 메모리에 할당되는 반면에 람다는 즉시실행함수여서 메모리를 효율적으로 사용할 수 있다.
    람다식을 남발하는 경우에는 가독성이 떨어지므로 실무에서는 주로 익명함수를 사용할때 람다식을 쓴다.
  1. 일반적 함수 -> 변수 할당

일반적인 함수에 변수할당법

위의 이미지는 우리가 일반적인 함수를 변수에 할당하는 방법이다
var_func이란 변수에 우리가 만든 def를 대입하면 터미널에서 볼수있듯이 메모리에 할당되어있고 type은 function이다.

1
2
3
4
5
6
7
8
9
print()
def mul_10(x: int) -> int:
return x * 10

mul_func = mul_10

print(mul_func(77))
# 출력값은
770
  1. 람다 함수 -> 할당
    위의 일반함수식과 비교하면
1
2
3
4
5
6
print()
lambda_mul_func = lambda x: x * 10
print(lambda_mul_func(77))

# 출력값은
770

동일한 결과값이 출력되는 것을 확인할수있다.
좀 더 나아가 활용할 수 있는 방법이 있다
함수를 매개변수로 받는 방법이다
위에서 만들었던 lambda_mul_func를 이용한 함수를 만들었다.

1
2
3
4
5
6
7
8
print()
def func_final(x, y, func):
print(x * y * func(7))

func_final(10, 10, lambda_mul_func)

# 출력값은
7000

만들어놓은 람다함수 사용하지않고 즉시 람다식을 넣어서 인자로 함수를 넘길 수 있다
None은 더이상 출력할 값이 없어서 출력되는 것임.

1
2
3
4
5
print(func_final(10,10, lambda x : x * 10))

# 출력값은
7000
None

3. 클래스선언

먼저 클래스를 사용해야 할 이유에 대해 알아보자
방대한 어플리케이션이 운영하기 위해서는 클래스방식의 코딩을 해서 구조화를 시키고 결합을 느슨하게 해서 유지보수에 용이하게 한다.

클래스선언시 첫글자는 대문자여야한다.
클래스는 속성과 매서드로 구분된다.

클래스(객체), 인스턴스 차이는 매우 중요하디

  • 네임스페이스 : 객체를 인스턴스화 할 때 저장된 공간
  • 클래스 변수 : 직접 사용 가능, 객체보다 먼저 생성
  • 인스턴스 변수 : 객체마다 별도로 존재, 인스턴스 생성 후 사용

아래는 클래스를 인스턴스 변수로 사용한 예이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class UserInfo:
def __init__(self, name): #초기화
self.name = name

def print_info(self):
print("Name: " + self.name)

def __del__(self):
print("Instance removed!")

# 인스턴스변수 생성하기
user1 = UserInfo("Kim")
user2 = UserInfo("Park")

print(id(user1))
print(id(user2))

user1.print_info()
user2.print_info()

# 클래스 네임스페이스 확인
print('user1 : ', user1.__dict__)
print('user2 : ', user2.__dict__)

print(user1.name)

# 출력값은
2683366237424
2683366443184
Name: Kim
Name: Park
user1 : {'name': 'Kim'}
user2 : {'name': 'Park'}
Kim

[패스트캠퍼스python] 파이썬 함수식

파이썬 인강 : 파이썬 함수식

함수식과 람다에 대해 자세히 알아보자.
우리가 함수를 사용하는 이유는 반복적이고 중복되는 프로그램을 방지하기위해서다

1. 함수 정의 방법

아래처럼 하면 끝!

1
2
def 함수명(parameter):
code작성하기

여기서 def는 define의 약자이다.

함수를 호출하는 방법은 함수명() 이고 만약 parameter가 있다면 함수명(parameter)로 호출하면 된다

1
2
3
4
5
6
7
def hello(world):
print("Hello, ", world)

hello("Python!")

# 출력값은
Hello, Python!

2. 함수 선언 위치

함수를 선언할때는 선언 위치가 매우 중요하다
파이썬은 항상 위에서부터 아래로 실행되기 때문이다
위의 예제에서 아래 사진처럼 선언 위치를 바꾸면 터미널에 NameError 뜨는 것을 볼 수 있다
hello라는 이름이 정의되어 있지 않다는 에러이다.

리턴이라는 예약어를 통해서 함수를 출력할수도있다
아래 예제를 보자
항상 형변환을 주의하자

1
2
3
4
5
6
7
8
9
def hello_return(world):
value = "Hello, " + str(world)
return value

str = hello_return("천사!")

print(str)
# 출력값은
Hello, 천사!

3. 다중리턴

다중리턴을 사용하면 짜임새있는 함수를 만들 수 있다.
java나 기타언어들은 return값이 하나인 게 원칙인데 파이썬은 다르다
파이썬은 다중리턴을 허용한다

1
2
3
4
5
6
7
8
9
10
11
12
def func_mul1(x):
y1 = x * 2
y2 = x * 4
y3 = x * 6
return y1, y2, y3

val1, val2, val3 = func_mul1(10)

print(val1, val2, val3)

# 출력값은
20 40 60

파이썬의 매력적인 부분은 return값의 데이터 타입 변환이다.
왜냐면 엄청 간단하고 쉽기때문에
위의 예제에서 return의 데이터형태는 int(정수)이다.
만약 데이터형태를 int가 아닌 다른 형태로 나타내고 싶다면 어떻게 하면 될까?

만약 데이터형태를 리스트로 받고싶다면 return[y1, y2, y3]를 적어주면 끝!
만약 튜플로 받고싶다면 return(y1,y2, y3)로 하면 끝!
만약 딕셔너리로 return받고싶다면?

1
2
3
4
5
6
7
8
9
10
11
12
13

def func_mul3(x):
y1 = x * 2
y2 = x * 4
y3 = x * 6
return {'ret1': y1, 'ret2': y2, 'ret3': y3}

dic = func_mul3(8)

print(type(dic), dic, dic.get('ret3'), dic.items(), dic.keys(), dic.values())

# 출력값은
<class 'dict'> {'ret1': 16, 'ret2': 32, 'ret3': 48} 48 dict_items([('ret1', 16), ('ret2', 32), ('ret3', 48)]) dict_keys(['ret1', 'ret2', 'ret3']) dict_values([16, 32, 48])

정말 저세상 간단함!
정말 매력적인 언어다!

4. *args, **kwargs 이해

  1. *args (아스타)
    arguments의 약자로 가변인자(인자의 갯수가 변할 수 있음)를 뜻한다
    다양한 매개변수를 받아서 함수의 흐름이 바뀌게한다
    매개변수를 하나를 넣든 세개를 넣든 튜플의 형태로 출력해준다
    기본적으로 *args라고 적지만 이 매개변수명은 자유롭게 변경 가능하다
    enumerate는 순회라는 의미로 index를 넣어서 나타낼 수 있다. 꼭 알아두자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def args_func(*args):  # 매개변수명 자유롭게 변경 가능
for i, v in enumerate(args):
print(v, i)

args_func('비')
args_func('비', '보')
args_func('비', '보', 'TV')

# 출력값은
0
0
1
0
1
TV 2

만약 출력값을 여러줄 나오는게 싫다! 한 줄로 나타내고 싶다면?
print(v, i)를 print(‘{}’.format(i), v, end=’ ‘)로 바꿔주면 된다

1
2
# 출력값은
0 비 0 비 1 보 0 비 1 보 2 tv

만약 *argsrange()를 같이 사용하면 어떻게 될까?

1
2
3
4
5
6
7
8
9
def args_range(*args):  
for i, v in enumerate(range(3)):
print(i,v)
args_range()

# 출력값은
0 0
1 1
2 2
  1. kwargs
    args와 똑같은 가변인자이나 딕셔너리로 받는다는 차이점이 있다.
    별표가 하나일때는 튜플로 받는데 별표가 두개인경우 딕셔너리로 받는다.
    위의 args와 마찬가지로 매개변수명은 자유롭게 변경 가능하다
1
2
3
4
5
6
7
def kwargs_func(**kwargs):  # 매개변수명 자유롭게 변경 가능
print(kwargs)
kwargs_func(name1='가')
kwargs_func(name1='가', name2='나')
# 출력값은
{'name1': '가'}
{'name1': '가', 'name2': '나'}

딕셔너리형태말고 한 줄에 주르륵 출력하고 싶으면
print(kwargs)를 print(‘{}’.format(v), kwargs[v], end=’ ‘)로 바꿔주면 된다

1
2
# 출력값은
name1 가 name1 가 name2 나
  1. *args*kwargs의 혼합
    효율적인 코딩을 위해 필수이며 꼭 이해를 해야하는 부분이다

아래 터미널처럼 가변인자(args와 kwargs)는 없이 int 10과 20만을 넣어도 출력이 되는 것을 알 수 있다.
가변인자는 값이 없기때문에 빈 튜플과 빈 딕셔너리가 출력된다.

1
2
3
4
5
6
7
def example(arg_1, arg_2, *args, **kwargs):
print(arg_1, arg_2, args, kwargs)

example(10, 20, 'park', 'kim', age1=77, age2=80 )

# 출력값은
10 20 ('park', 'kim') {'age1': 77, 'age2': 80}

실습을 하면서 궁금했던 점은 어떻게 튜플과 딕셔너리를 나누는 지 궁금했는데 완전 초보적인 생각이었다
딕셔너리형태인 address=뭐시기를 넣으면 자동적으로 **kwargs 로 출력된다.
만약 딕셔너리 형태를 순서를 섞어 놓으면

1
example(10, 20, address="Busan", 30, 'park', age1=77, age2=80 )

아래 이미지와 같이 SyntaxError가 발행한다.

SyntaxError

전체적으로 쉽게 설명한 참고링크1

5. 중첩함수

말그래도 함수안에 함수가 있는 것
중첩함수를 잘해둬야 클로저를 잘 해결할 수 있다
클로저를 나아가서 Python decorator도 중급자에서 필수적인 내용이니 꼭 이해하자

1
2
3
4
5
6
7
8
9
10
11
12
def nested_func(num):
def func_in_func(num):
print('언제실행될까? ', num)

print("함수 안에서")
func_in_func(num + 100)

nested_func(1)

# 출력값은
함수 안에서
언제실행될까? 101

혹시 함수안의 함수 func_in_func()를 실행시킬 수 있을까?

1
func_in_func(1)

정답은 실행불가!
아래 이미지처럼 Name Error가 발생한다

Name Error