본문 바로가기

Python/Python Basic

Day4) 3. variable length argument(가변길이 인자)

variable length argument(가변길이 인자)

- 전달되는 파라미터의 개수가 고정적이지 않은 경우 사용 eg) print함수, format함수

- *args : 파라미터를 튜플의 형태로 전달, **kwargs : 파라미터를 딕셔너리 형태로 전달(네임드 파라미터)


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
35
36
# 파라미터 이름 앞에 *이 붙어 가변인수로 정의
 
def exer(*args):
    print 'formal arg:', args, type(args)
    
    for args in args:
        print 'another arf:', args
        
exer(1'one''two')
print '-' * 50
 
exer(1'two')
print '-' * 50
 
exer(1)
print '-' * 50
 
exer()
print '-' * 50
 
<<<<< 실행결과 >>>>>
 
formal arg: (1'one''two'<type 'tuple'>
another arf: 1
another arf: one
another arf: two
--------------------------------------------------
formal arg: (1'two'<type 'tuple'>
another arf: 1
another arf: two
--------------------------------------------------
formal arg: (1,) <type 'tuple'>
another arf: 1
--------------------------------------------------
formal arg: () <type 'tuple'>
--------------------------------------------------
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 위 함수와의 차이점은?
# 두개의 파라미터 모두 일반 파라미터 이기 때문에 2개이 인자만 전달 할 수 있음
def test_tuple_args(farg, tuple_args):
    print "formal arg:", farg
    print type(tuple_args)
    for arg in tuple_args:
        print "another arg:", arg
 
test_tuple_args(1, ("two"3))
print '-' * 30
 
#test_tuple_args(1) 인자의 개수가 맞지 않아 에러 발생
test_tuple_args(1"two"3)
print '-' * 30
 
<<<<< 실행결과 >>>>>
 
formal arg: 1
<type 'tuple'>
another arg: two
another arg: 3
------------------------------
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 키워드 파라미터, 딕셔너리 타입을 가짐
# 키워드 파라미터 형태로 전달해야함
def test_var_kwargs(**kwargs):
    print type(kwargs)
    for key in kwargs:
        print "another keyword arg: %s: %s" % (key, kwargs[key])
 
test_var_kwargs(two = "two", three = 'three')
## 타입은 dict
 
<<<<< 실행결과 >>>>>
 
<type 'dict'>
another keyword arg: two: two
another keyword arg: three: three
cs


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
# 일반적인 경우, 아래와 같이 정의 하여 사용
# kwags가 뒤에 위치하는 이유는?
def test_var_args(*args, **kwargs):
    print "formal arg:", args
    print type(args)
    print 
    
    for arg in args:
        print "another arg:", arg
        
    for kw in kwargs:
        print kw, kwargs[kw]
 
test_var_args(1"two"'three', a = 'aa', b = 'bb')
 
<<<<< 실행결과 >>>>>
 
formal arg: (1'two''three')
<type 'tuple'>
 
another arg: 1
another arg: two
another arg: three
a aa
b bb
cs


### 고정길이 함수에 *, **사용

- 튜플 혹은 딕셔너리를 가변길이 인자로 변경하여 전달

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def test_var_args_call(arg1, arg2, arg3):
    print "arg1:", arg1
    print "arg2:", arg2
    print "arg3:", arg3
 
args = ("two"31)
test_var_args_call(*args)
test_var_args_call(args)
 
<<<<< 실행결과 >>>>>
 
arg1: two
arg2: 3
arg3: 1
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-98-91853c6ade13> in <module>()
      6 args = ("two"31)
      7 test_var_args_call(*args)
----> 8 test_var_args_call(args)
 
TypeError: test_var_args_call() takes exactly 3 arguments (1 given)
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
def test_var_args_call(arg1, arg2, arg3):
    print "arg1:", arg1
    print "arg2:", arg2
    print "arg3:", arg3
 
kwargs = {"arg3"3"arg2""two"}
test_var_args_call(1**kwargs)
 
<<<<< 실행결과 >>>>>
 
arg1: 1
arg2: two
arg3: 3
cs


### 가변길이 함수의 대표적인 예) 문자열 포맷 함수

- 여러가지 값과 포맷을 이용하여 문자열을 정의할 수 있는 함수

- {} placeholder를 문자열 내에 위치 시킨 후, 해당 위치에 format함수로 전달된 값으로 대체하여 문자열 생성

- 포맷 구성 참고 : https://pyformat.info/

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
str1 = 'Hi my name is {} and the weather is {}'.format('younghyo'100)
print str1
 
aa = 'hello {} world {}'.format('mike''pop')
print aa
 
= 'hello world {}'.format('aaron')
print a
 
= 'Hello {}! my name is {} {}'.format(100'aaron'200)
print b
 
# 순서 명시 가능
# 순서가 명시 되지 않으면 왼쪽부터 0부터 시작
= 'Hello {1}! my name is {0}'.format('bryan''aaron'## arron이 먼저 bryan이 그 후에 나옴
print b
 
= 'Hello {aa}! my name is {bb}'.format(aa = 'abc', bb = 'ddd')
print c
 
# 정수 콤마로 표시
= 'Wow it is a big number! {:,}'.format(2 ** 30)
print d
 
# 숫자 precision 5자리로 제한
= 'Wow it is a big number! {:.5}'.format(3.14159262840725)
print d
 
# .이후의 precision 5자리로 제한
= 'Wow it is a big number! {:.5f}'.format(3.14159262840725)
print d
 
# 최소 7자리는 필요 .이후 precision 5자리로 제한
= 'Wow it is a big number! {:7.5f}'.format(1213.14159262840725)
print d
 
# 최소 7자리는 필요 .이후 precision 1자리로 제한
= 'Wow it is a big number! {:7.1f}'.format(1213.14159262840725)
print d
 
<<<<< 실행결과 >>>>>
 
Hi my name is younghyo and the weather is 100
hello mike world pop
hello world aaron
Hello 100! my name is aaron 200
Hello aaron! my name is bryan
Hello abc! my name is ddd
Wow it is a big number! 1,073,741,824
Wow it is a big number! 3.1416
Wow it is a big number! 3.14159
Wow it is a big number! 1213.14159
Wow it is a big number!  1213.1
 
cs



반응형