Knowledge Map

파이썬 강의 필기 2일차 본문

PYTHON

파이썬 강의 필기 2일차

2016. 4. 10. 16:09

function1.py


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
"""
1. 내장함수 -> 파이썬이 자체 내장 된 함수
"""
# sum은 어떤 자료형이라도 계산이 가능하다.
print(sum([3,4,5])) #iterator  -> (출력 대상자)
print(sum((3,4,5)))
print(sum({3,4,5}))
print(bin(8), int(1.7), float(2), str(5)+'오')
 
# 외부에서 불어와서 사용한다.
import math #간단한 계산 --> 모듈명.함수 로 호출한다.
# ceil은 무조건 올림, floor은 내림 함수이다.
 
print(math.ceil(1.2), math.floor(1.5))
print()
b_list = [1,2,5,3,42,33]
# all() -> and 와 동일하다. 모든 구성요소가 참일때 참이다. 거짓이 하나라도 있으면 거짓이다.
# any() -> or와 유사하다. 하나라도 구성요소가 참이면 참이다. 참이 하나라도 있으면 참이다.
re = all(a < 10 for a in b_list)
re2 = any(a < 10 for a in b_list)
print('re = ',re)
print('re2 = ',re2)
cs


function2.py


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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
"""
함수 -> 어떤 기능을 가진 프로그램의 작업 단위
함수의 매개변수
return 결과값(=반환값 =리턴값)
형식) def 함수명(매개변수, , , , , , ):
        문장(변수 선언, 제어문)
        return 처리된 값
"""
# 파이썬은 함수를 선언하기 전에 호출 불가, 단 자바스크립트에서는 가능하다.
 
a=1
# 매개변수가 없는 함수 --> 단순하고 반복적인 일(매개변수 X, 반환 값 X)
 
 
def func1():
    print('함수는 명령어들의 집합체')
    print('매개변수가 없는 경우 단순, 반복')
 
# 함수 호출 : 객체명.함수명(~) //또는//  함수명(~)
func1()
print()
 
# 매개변수가 있는 함수 --> 입력받아서 출력, 계산 (매개변수 O, 반환값 X)
 
 
def func2(name):
    print('안녕',name)
    print('인수1, 인수2(argument)')
 
func2('홍길동')
print()
# func2()
# func2('test','testest')
# TypeError: func2() missing 1 required positional argument: 'name' <== 매개변수 name이 없어서 그런거다.
# 함수를 호출할때에는 매개변수를 전달해줘야 한다.
 
print()
print('매개변수가 존재ㅡ 반환값도 존재함(계산 목적)')
 
 
def func3(arg1, arg2):      # worker function
    res = arg1 + arg2
    if res%2 == 0:
        return res          # 리턴값(O)
    else:
        return              # 뇌를 자극하는 파이썬3 p149참조
 
 
# return abc... : 함수가 즉시 종료, abc 값 리턴 및 전달함
# return        : 함수가 즉시 종료됨. 리턴 값 없음. 반환 요구시에는 None 이라고 반환되어 버린다.
# return <=생략  : 리턴 문 자체를 생략하면 함수의 모든 코드가 실행되면 종료된다.
 
aa = func3(1,3)                  # caller function
print('반환값 aa ==>', aa)
print('==='*10)
print(func3(10,20))
print(func3(6,8))
print(func3(5,8))  # 이런경우 값을 전달받지 못하므로 None 을 받게 된다.
 
# 반환값이 있는 경우에는 caller가 반환값return을 받도록 변수명을 쓴다.
# 형식) 변수명 = 호출함수명(~)
print()
def area_tri(a,b):
    c = a*b/2
    print('출력성공'# 함수호출 뒤 다른 문장이 수행
    showData(c)
 
def showData(test):
    print('삼각형의 면적은',test)
 
area_tri(10,3)
# 매개변수가 없는 함수: 단순, 반복
# 매개변수가 있는 함수 : 매개변수를 통해서 작업한다.
# 계산 결과 :  return 목적으로 쓰임
 
print('\n함수를 변수에 담아서 출력하기(주소값을 전달)')
 
def abc():
    print('aaaaaaaa')
    return 7
 
abc()
print(abc())
print('=='*20)
print('temp = abc()')
temp = abc()
print(temp)
print('=='*20)
 
print('temp = abc')
temp = abc
print(temp)
# 함수값을 임시값에 넣게 되면 함수의 주소값을 가지고 있다. 이것은 같은 주소값을 공유한다는 것이며 같은 기능의 함수가 된다는 것이다.
print('temp = abc 이렇게 하면 temp()을 했을때 abc()와 같은 주소값의 함수를 사용하게 되는 것이다. \ntemp()=',temp())
print(temp())
 
print()
def swap(a,b):
    return b,a  #return 계산값(2개로 , 로 전달
 
print(swap(10,20)) #튜플 형식으로 리턴된다.
print()
 
def listSwap(a,b):
    return list(swap(a,b))
 
print(listSwap(10,20))
print(list(swap(100,200)))  #리스트로 변환됨.
cs


function3.py

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
"""
함수 선언시 함수의 매개변수 설정
"""
 
 
# 두번째 매개변수를 받지 못했을때 end값는 기본값 5 설정됨. 즉 초기화함. default 매개변수
def gugu(start, end=5):
    for dan in range(start, end+1):
        print(str(dan)+'단 출력', end='||')
        if dan == end:
            print()
 
gugu(2,10)
# 파이썬에서는 매개변수를 언급하면서 값을 입력하는 것도 가능하다.
 
gugu(2)
gugu(start=1, end=10)
gugu(end=5, start=1)
 
 
print('==============================주의!!==============================')
 
gugu(2,end=3)               #<==이거는 되지만
# gogu(start=2,3)             #<==이거는 되지 않는다. SyntaxError: non-keyword arg after keyword arg
                            # 첫번째 매개변수는 생략이 가능하지만, 두번째 매개변수는 생략되지 않는다.
                            # range(a,b)에서 a와 b의 값이 동일하게 되면 작동하지 않는다.
cs

function4_var.py

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
"""
가변 매개변수 -> 매개변수의 갯수를 자유롭게 설정할수 있다. -> *매개변수, **매개변수
"""
# * <= 1개짜리 매개변수 갯수에 상관없이 입력받아서 처리한다.
def func1(*ar):
    print(ar)
 
func1('제어문')                            #튜플형태로 출력된다.
func1('제어문','함수사용법')
func1('제어문','함수사용법','매개변수 적용')
print()
 
#  1(일반매개변수), 2(가변매개변수) 같이 사용가능하다. 하지만 첫번째 매개변수는 일반 매개변수로 설정해야한다.
def func2(a,*ar):
    print(a)
    print(ar)
 
 
func2(1)
func2(1,'test')
func2(1,10,100)
print()
 
# def func3(*ar,a):
#     print(a)
#     print(ar)
# func3('test1,'a')
# 일반 매개변수와 가변 매개변수의 위치를 바꿀수는 없다. 바꾸면 뒤의 일반 매개변수가 무용지물이 된다.
 
def func4(a,b,*c,**d):      # ** --> dic형의 자료형을 받는다.
    print(a,b)
    print(c)            # ()튜플형 --> 입력X -> 빈요소값을 출력하게 된다. 가변매개변수라서 갯수를 늘려도 d는 값을 받지 못한다.
    print(d)            # {} dic형태로 함. 물론 순서대로 저장되거나 출력되지는 않는다.
 
func4(1,2)
print()
func4(1,2,3,4,m=5,n=6)
 
"""
d가 값을 받게 하려면 function을 정해줘야 한다.
"""
cs

function5_scope.py

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
55
56
57
58
59
60
61
"""
함수 밖 또는 함수 안에 변수를 선언할수 있다. --> 사용범위(scope)
152 ~ 153페이지를 참조한다.
158 페이지 참조한다.
"""
player = '전국대표'
# 전역변수 -> 함수 내부에서 언제든지 참조가 가능 ( 출력이 가능)
 
def func1():
    name = '톰' # 함수 내부의 변수 선언 --> 지역변수
    # player = '지역대표'
    print(name,player)
print('==1==')
func1()
# 함수밖에서 임의로 함수내부의 변수값을 출력할수 없다.
# 이름만 같을뿐이지 전혀 다른 변수이다.
print(player)
print('===='*10)
 
= 10; b = 20; c = 30;
 
print(id(a))
# 자기 지역 변수(local) -> 중첩함수 밖 지역변수 -> 전역 변수
# nonlocal 변수명 -> 함수밖의 변수를 수정이 가능하다.
# 중첩함수(내부) -> 전역변수의 값을 수정 -> global 전역변수명
# 변수명 = 함수명() ==> 함수명()의 값을 저장한다.
# 변수명 = 함수명   ==> 함수 그 자체를 변수명이라는 객체에 일종의 복사를 해서 넣어버린다.
 
 
 
def Foo():
    a = 40
    print(id(a))
 
    b = 50
    # global c
    def Bar():
        print('=========12========')
        nonlocal b              # nonlocal은 함수 내에서의 지역 변수에 대해서 중첩 함수 상관없이 전부 통함
        global c
        print('가장 안에 있는 함수 : Bar a:{},b:{},c:{}'.format(a,b,c))
        b = 100
        # b = 100 -> 에러가 난다. 함수 내부에서 함수 밖의 변수값을 수정할수 없다는 에러이다. 값을 읽어서 가져오기만 할수 있을 뿐이다.
        # UnboundLocalError: local variable'b'referenced before assignment
 
        c = 10000               # 내부 중첩 함수에서 전역 변수 값을 변경하기 위해서는 global 이라는 예약어를 써야 한다.
                                # 함수 내부에서 먼저 변수를 찾고 없으면 바깥으로 나가서 찾는다.
 
    Bar()  # 중첩함수인데 내부에서 안쪽 함수를 호출한다.
    c = 5000
    print('안에 있는 함수 : Foo a:{} b:{} c:{}'.format(a,b,c))
 
Foo()
print('밖에 있는 함수 : a -> {}, b -> {}, c -> {}'.format(a,b,c))
# 자세한 내용은 pdf의 지역변수, 전역변수 참조하기.
# 클래스 에서의 함수와 사용자 정의 함수를 구분하는 방법 : def 함수명(self, 매개변수) or def 함수명(매개변수) /// 전자는 클래스 함수, 후자는 단독 사용자 함수
# global은 불러낸 함수내에서만 적용이 되고 그외 함수 중첩 함수에도 적용이 되지 않는다.하지만 가장 중첩 함수에서 global 예약어를 써주면 그 위의 함수에서도 적용된다.
# ??????왜 변수 값 -> 지역변수 변화가 프린트 앞에서는 적용되고 뒤에 있을때에는 적용되지 않는가? 좀 어려운 개념이라함. 그냥 그렇게 알고 넘어감.
 
 
cs


function6_closure.py

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
"""
closure 클로저 -> 함수안의 변수를 함수밖에서 원래는 사용이 되지 않는다.
                  함수안의 변수를 함수밖에서 접근해서 사용하기 위한 기법이 클로저이다.
                  클로저는 private변수와 DTO에서의 입력 함수를 하나로 합친듯한 느낌인거 같다.
"""
def out():
    count =0
    def inn():
        nonlocal count
        count+=1            # 외부 변수를 내부 중첩함수에서 값 변동할수 없다. 따라서 nonlocal을 쓴다.
        return count
    print(inn())
out()
# print(count)  #<--에러남, 함수내의 임의의 변수를 출력할수 없기 때문이다.
print('----클로저 사용하는 경우----')
 
 
#클로저 만드는 방법 : 내부함수를 반환시키는 문장을 쓰면된다.
# 함수의 주소값을 받는 것이다.
def Closure():
    count =0
    def inn():
        nonlocal count
        count+=1
        return count
    return inn
 
 
add  = Closure()
print(add)              # <function Closure.<locals>.inn at 0x000000000222BAE8>
print("add2",add())
print("add2",add())
print("add2",add())
print("add2",add())
# ?????? 클로저는 객체저장? 맞음
 
add2 = Closure()
print(add2)             #<function Closure.<locals>.inn at 0x000000000221BB70> 로컬이 차이점일수도 있다.
print("add2",add2())    # 자바스크립트의 클로저와 같다.
print('------------------------------------------')
 
# 클로저 활용법 :
print(' ========= 수량 * 단가 * 세금율적용 ========')
def outer2(taxrate):
    def inner2(su, dan):
        amount = su * dan * taxrate
        return amount
    return inner2
print('------------------------------------------')
= outer2(0.1)
ex1 = r(510)
print(ex1)
 
cs

function7_recall.py

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
55
"""
함수 -> 자기 스스로 자기함수를 호출
"""
# 3! -> 3*2*1 -> 호출갯수를 감소시키면서 자기스스로 함수를 호출
def CountDown(n):
    if n==0:
        print('완료')
    else:
        print(n,end=',')
        CountDown(n-1)      #자기함수명(입력받은 갯수 -1)
 
def test():         #함수를 만들긴하지만 내용이 없는 함수를 만드는 것이다.
    pass            #일종의 함수 구현을 보류한다는 것이다.
print('===============================================')
 
array1 = 1
 
 
def lineArray(n):
    global array1
    if n == 0:
        print('=',array1)
    else:
        array1 = array1 * n
        print(n,end=' x ')
        lineArray(n-1)
 
 
def test123123(n):
    if n == 1:
        print(1)
        return 1
    else:
        a = test123123(n-1)
        print(a)
        return n*a
 
 
print(test123123(10))
CountDown(10)
lineArray(10)
 
 
print('\n축약함수 lambda')          #함수 이름 없이 함수의 기능을 구현한다. 즉 익명함수이다.
def hap(x,y):
    return x+y
 
print(hap(1,2))
 
# 형식 ) (lambda 매개변수1, 매개변수2, , , ,  : 함수의 내용을 기술)(매개변수명~~)
print('==============(lambda x,y : x+y)(100,20)')
print((lambda x,y : x+y)(100,20))
print('===============lambda a,su=10:a+su')
test2 = lambda a,su=10:a+su
print(test2(10))
cs


mod1.py

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
"""
모듈 -> 파이썬 코드가 작성이 된 파일(소스파일)
"""
 
tot = 100
def listHap(*ar):
    print(ar)
 
def exe(exee):
    exee()
 
 
# 아래의 함수는 가변 변수를 적용했다. 그리고 그 가변 변수들을 for 구문을 이용해서 하나씩 실행 및 프린트 한다.
def exe1(*exee):
    for i in exee:
        print(i())
 
def kbs():
    print('공용방송')
 
def mbc():
    print('문화방송')
 
# 함수목적 -> 일단 자주 사용이 되는 함수를 작성한다.
print('mbc() ->',mbc())                             #반환값이 없어서 None으로 뜬다.
 
listHap(mbc, kbs)
exe(kbs)
print('========================')
exe1(kbs,mbc)
# exe1에서 2개의 함수를 가변 변수로 받는다. 하지만 위의 2 함수는 리턴 값이 없으므로 실행해도 None으로 뜨게 되는 것이다.
cs

mod2.py

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
"""
외부에서 만든 함수를 불러다 사용하는 방법
"""
print('경로지정방법1:import 패키지명.모듈명')
import basic_module.mod1
# 모듈안에 있는 함수들을 파악하는 내장함수 dir
print(dir(basic_module.mod1))           #dir(~)
print(basic_module.__name__)            #__name__  ==> 패키지명
print(basic_module.__file__)            #기본경로를 출력한다.  pdf 파일안에 설명 존재한다.
 
list1 = [1,2]
list2 = [3,4,5]
 
# 패키지명, 모듈명, 호출할 함수명(~)
basic_module.mod1.listHap(list1,list2)
 
print('\n 경로 지정 방법2: from 패키지명 import 모듈명')
from basic_module import mod1
# 모듈명.호출할 함수명(~)
mod1.kbs()
# 모듈명.선언된 변수명
print(mod1.tot)
 
 
print('\n 경로 지정 방법3: from 패키지명.모듈명 import 함수명')
from basic_module.mod1 import mbc
mbc()
print('\n 다른 패키지에 있는 모듈 읽기')        #other.mymod2
# 형식 from 패키지명.모듈명 import 함수명 , , , , , (*)   하지만 별을 쓰는건 지나치게 많이 불러와서 비추..
from other.mymod2 import Hap, Cha
print('합 : ', Hap(6,4))
print('차 : ',Cha(10,4))
cs


※ 클로저가 가능한 이유:

파이썬은 함수를 일급 객체(First Class Object)로 다루기 때문이다. 일급 객체는 프로그래밍 언어 설계에서 매개변수를 넘길수 있고 함수가 반환할 수도 있으며 변수에 할당이 가능한 객체를 가리키는 용어이다. 파이썬에서는 함수를 매개변수로도 사용할 수 있고 함수의 결과로 '반환'하는 것도 가능하다.





'PYTHON' 카테고리의 다른 글

크롤링_python2  (0) 2016.04.11
텍스트 파일 읽어오기 및 슬라이싱  (0) 2016.04.10
파이썬 한글 정규표현식  (0) 2016.04.05
파이썬 강의 필기 1일차  (0) 2016.04.03
python2 & python3 설치  (0) 2016.03.19
Comments