Knowledge Map
파이썬 강의 필기 2일차 본문
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) a = 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('------------------------------------------') r = outer2(0.1) ex1 = r(5, 10) 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