강좌(1)에 이은 반복문 단축 문법
my = [n*10 for n in range(1,11) if n%2==0] print(my) #약수 출력 data = int(input("Input data:")) my2 = [n for n in range(1,data+1) if data%n==0] print(my2) |
[20, 40, 60, 80, 100] Input data:10 [1, 2, 5, 10] |
#List안의 Tuple이 존재하는 구조. myData =[(1,10),(2,20),(3,30)] #요소의 갯수 만큼 인자를 받게 될경우 Tuple이 unpacking이 일어나게 된다. 따라서 객채의 인자별로 추출 가능. for n,m in myData: print(n,m) #중요!! - Dictionary 형태로 추출 my = {k:v for k,v in myData} print(my)
myZ = zip(['aa', 'bb', 'cc'], [4,5,6]) print(dict(myZ)) |
1 10 2 20 3 30 {1: 10, 2: 20, 3: 30} {'cc': 6, 'bb': 5, 'aa': 4} |
Python 내장 함수 와 Object의 멤버 변수에 대하여...
myList = [10, 20, 30, 40] #Python 내장 함수. print(len(myList)) print(sum(myList)) print(max(myList)) print(min(myList)) del(myList[0]) print(myList) |
1 10 2 20 3 30 {1: 10, 2: 20, 3: 30} {'cc': 6, 'bb': 5, 'aa': 4} |
myList = [10, 20, 30 ,40] #List 객체의 Member 함수. myList.append(50) print(myList)
myList.insert(1, 100) print(myList)
myList[0] = 12 #수정 print(myList) print(myList.pop(1)) #삭제 myList.remove(30) #30이라는 값 삭제 print(myList)
myList.clear() #전부 삭제(공백 리스트 생성) -> myList = [] or list():리스트 객체생성 함수 콜 print(myList)
myList.append(100) myList.append(200) myList.append(300) print(myList)
myList += [50,60,70] #같은표현 방법 : myList.exted([50, 60, 70]) print(myList)
myList = myList*3 print(myList)
myList.sort(reverse=True) #True : 오름차순, False : 내림차순 print(myList) print(myList.count(300)) |
[10, 20, 30, 40, 50] [10, 100, 20, 30, 40, 50] [12, 100, 20, 30, 40, 50] 100 [12, 20, 40, 50] [] [100, 200, 300] [100, 200, 300, 50, 60, 70] [100, 200, 300, 50, 60, 70, 100, 200, 300, 50, 60, 70, 100, 200, 300, 50, 60, 70] [300, 300, 300, 200, 200, 200, 100, 100, 100, 70, 70, 70, 60, 60, 60, 50, 50, 50] 3 |
youList = [{'name':'홍길동', 'age':20}, {'name':'임꺽정', 'age':30}]
print(youList[1]['name']) for data in youList: print("이름:%(name)s 나이:%(age)d" %data) |
임꺽정 이름:홍길동 나이:20 이름:임꺽정 나이:30 |
myDic = {10:'aaa', 20:'bbb', 30:'ccc'} myDic[60] = 'ddd' #key가 있으면 수정, 없으면 추가(추가와 수정이 한번에!)
#print(myDic.pop(20)) #20이라는 key값이 리턴됨과 동시에 삭제 del(myDic[10]) #내장 함수 이용 print(myDic)
print(myDic.keys()) print(myDic.values()) print(myDic.items()) #List의 Tuple로 retun
for n in myDic.values(): print(n)
for n in myDic.keys(): print(n)
for k,v in myDic.items(): print(k, v) #--------------------------------------------------- youDic = {} #dict youDic['name'] = '홍길동' youDic['age'] = 20 print(youDic) |
{60: 'ddd', 20: 'bbb', 30: 'ccc'} dict_keys([60, 20, 30]) dict_values(['ddd', 'bbb', 'ccc']) dict_items([(60, 'ddd'), (20, 'bbb'), (30, 'ccc')]) ddd bbb ccc 60 20 30 60 ddd 20 bbb 30 ccc {'name': '홍길동', 'age': 20} |
Slicing(부분 추출)
myList = [10, 20, 30, 40, 50, 60, 70, 80, 90] s = "abcdefghijklmn" print(myList[0:4:2]) #1씩 증가, 0부터 3번(4번 인덱스 전) 인덱스까지 print(myList[1:5]) #1 index 부터 5 index 전 까지 print(myList[:6]) #증가치 생략(0부터 6까지) print(myList[2:]) #증가치 생략(2부터 끝가지) print(myList[-1:-4:-1]) #-1 index 부터 증가치 -1씩 -3까지 print(myList[-1::-1]) #거구로 출력 print(s[1:5]) #문자열 부분 추출(1 index 부터 5전까지) |
[10, 30] [20, 30, 40, 50] [10, 20, 30, 40, 50, 60] [30, 40, 50, 60, 70, 80, 90] [90, 80, 70] [90, 80, 70, 60, 50, 40, 30, 20, 10] bcde |
하나의 프로세스(Program)가 메모리에 할당되는 과정
Python 에서 객체 및 메소드의 메모리 할당 및 참조 방법에 대해 알아보기전에 기본적으로 C에서 발생하는 메커니즘에 대하여 이해를 해보도록 하자. 대부분의 언어 또한 이와 비슷한 방식으로 동작되어 지므로 참고하자.
Code Segment
- Text Area(프로그램 코드들이 전부 이 영역에 올라가게 됨.)
- String Area(read only)
Data Segment
- static(global)
- heap(free space라고 불림) : new 연산자를 통해 객체가 올라가게 됨.
- stack(지역변수)
1. Loading time
- 컴파일코드(함수) : text Area 영역에 올라감
함수 메모리 할당
- binding(정적바인딩) : 해당 함수와 메모리의 물리적인 주소를 대칭 시키는 작업.
실제 함수가 할당된 물리적 주소로 함수 호출부분을 대치..
- global, static 변수 메모리에 할당 : Static 영역에 올라감
전역변수는 runtime 이전에 할당되고, 프로그램 종료되기 직전에 회수 된다.
2. Runtime
포인터 변수(Refrence value) : 주소를 저장하는 변수
*포인터 변수 : 포인터변수의 값이가지는 실제 주소에서 포인터변수 타입 크기만큼의 공간 할당.
new DataType : Data Type 크기만큼 heap 영역에 할당하고 할당된 주소를 리턴
객체의 Refrence Conunt 할당과 소멸에 대하여...
a = 10 #10은 object 이다. a라는 변수가 10이라는 Object를 Refrence하는 구조. b = 10 #b 또한 동일 Object refrence 한다. a = 100 # a가 10을 ref하다가 100을 ref하게 되고, 10 object는 ref count가 제로가 되기 때문에 메모리에서 소멸된다. c = a # 위의 코드와 동일 현상 s = 'abc' s2 = 'abC' print(id(s)) print(id(s2)) |
1457378480 1457375600 1457378480 52618384 52693064 |
import sys myList = [10, 20, 30] myList1 = myList print(sys.getrefcount(myList)) myList2 = myList print(sys.getrefcount(myList))
print(id(myList)) print(id(myList2)) myList2[0] = 100 print(myList) myList1 = myList.copy() #Deap Copy(대상과 동일한 별도의 객체 생성)가 발생되어 Address 가 다른객체가 생성됨. print(id(myList)) print(id(myList1)) |
3 4 55848776 55848776 [100, 20, 30] 55848776 55847624 |
함수의 인자
def fn():
print('hello')
print('fn')
def hap(a, b):
return a+b
def fn1():
return 10, 20 #튜플 Packing 발생. 및 튜플 객체로 리턴됨.
def shape(r, h, w):
return r**2*3.14, h*w
def my():
return [10, 20, 30]
# rst = my()
# print(rst)
# fn()
# print('korea')
#
# rst = hap(10, 20)
# print(rst)
# rstf1 = fn1()
# print(rstf1)
#
# rstShape = shape(3, 10, 10)
# print(rstShape)
# def fn2(a):
# a[0] = 100
# a.append(1000)
#
# myList = [10, 20, 30]
# fn2(myList)
#
# print(myList)
#
# def fn3(a, b):
# print(a,b)
#
#
# fn3(10, 20)
# fn3(b=100, a=200)
연습문제
#3개의 정수를 입력받아가장 작은 값을구하는 함수를 만드시오.
#Me
def fnMin(a, b, c):
step1 = a if a<b else b
minNumber = step1 if step1 < c else c
return minNumber
print(fnMin(1, 2, 3))
#강사
# def min_value(a, b, c):
# mymin = a if a<b else b
# mymin = mymin if mymin<c else c
# return mymin
#
# print(min_value(10, 20, 1))
#1개의 정수를 입력받아 약수를 구하는 함수를 만드시오.
#Me
# def fnYak(num):
# for n in range(1, num+1):
# if num%n == 0:
# print(n)
#
# fnYak(10)
#강사
# def yaksu(num):
# return [n for n in range(1, num+1) if num%n == 0]
#
# print(yaksu(10))
가변 인자
def fn(*arg): #아스테르크는 포인터가 아니다. 가변인자라고 하며 인자가 정해져 있지 않다.
print(arg)
def fn1(arg):
print(arg)
# 아스테르크를 붙이고 인자를 주게 되면 자동으로 튜플로 만들어 지며, 안 붙이면 인자를 하나로 받는다.
# 따라서 python에서 Overloading에 대한 개념이 필요 없다.
# fn(10, 20, 30 , 40)
# fn(10, 20)
def fn3(a, *arg): # fn3(*arg, a) : 가변인자는 뒤로 와야 된다. 파이썬 인터프린터가 해당 문법을 처리하지 못한다.
print(arg)
for n in arg:
print(n)
def fn4(**arg): #정의되지 않은 인자, Dictionary 형태로 만들어진다. 인자의 갯수는 정해져 있지 않다.
print(arg)
#가변인자를 처리함에 있어서 가장 중요한 것은 순서가 바꾸면 안된다.
def fn5(a, *b, **arg):
print(arg)
#Default argument
#디폴트 인자를 정해줄 수 있다. 디폴트 인자는 생략 가능하다.
#왼쪽에서 부터 순차적으로 생략이 가능하나 중간 생략은 불가능 하다.
def fn6(a=10, b=20, c=30):
print(a, b, c, )
# fn3(10, 20, 30 , 40)
# fn4(name='홍길동', age=30)
# fn4(name='임꺽정', age=40, addr='서울시')
# fn5(10, 20, 30, aa=10, bb=20)
fn6()
fn6(100)
fn6(100, 200)
fn6(100, 200 ,300)
fn6(b=1000)
# print(dir(__builtins__))
# Local이 우선이기 때문에 100 출력 된다. Local 에서 없으면 Global에서 찾는다.
# g = 10 #memory:Staic area
# def fn():
# g = 100 #m:Stack area
# print(g)
#
# fn()
# print(g)
#------------------------------------------------------------------
# str = 'abc'
# sum = 0
# def fn():
# str = 'def'
# print(str)
#
# fn()
# print(str)
#
# a = 10
# a = str(a)
#Builtin 이 순서가 맨 마지막? 애즈윅의 위치를 기억하라?
myD = {0:fn, 1:fn1}
myD[1]()
aa = myD[0]
aa()
#---------------------------------------
#람다 함수(익명 함수) - 임시 사용 용도
"""
Open Close 기법
유지 보수를 용이하게하기 위해서 사용하며, 기존 소소 코드를 수정 X
224p 7.12 참조
구조적 : 함수 포인터
객체지향 : 추상클래스(인터페이스)
오버라이딩
"""
# def hap(a, b):
# return a+b
# rst = hap(10, 20)
# print(rst)
hap = lambda a,b : a+b
rst = hap(10,20)
print(rst)
모듈화
myModule
def hap(a,b):
return a+b
def gop(a,b):
return a*b
print('mymodule.....', __name__)
유저 모듈 설명
#Format 11장 Page
a = 10
b = 3.141592
c = 'abc'
s1 = "a=%d b=%f c=%s" %(a, b, c)
s2 = "a={0:10} b={1:10.2f} c={2:>10}".format(a, b, c)
#{0:10} ->총 10칸 잡고 뒤에서 부터 채우기.
#{1:.2f} ->총 10칸 잡고 소수점 2째 자리까지 표기.
#{2:>10} ->문자열은 기본이 좌측 정렬. 총 10칸잡고 우측 정렬 하여 표기하라.
print(s1)
print(s2)
myD = {'name':'aaa', 'age':30, 'addr':'ccc'}
s3 = "name:{name} age:{age} addr:{addr}".format(**myD)
print(s3)
# def fn3( **a):
# print(a)
#
# myD = {'name':'aaa', 'age':30, 'addr':'ccc'}
# fn3()
Standard Module Test
import os
# os.mkdir("my")
# os.remove('x.py')
# os.rmdir()
print(os.path.isfile("a.py"))
print(os.path.isdir('my'))
os.system('dir')
os.system('notepad a.py')
print(os.name)
print(os.getcwd())
print(os.path.join(os.getcwd()), 'test')
print(os.listdir('c:\\'))
print(os.listdir(os.getcwd()))
Package
# from lg.com import *
print('use pack...')
# import lg.com.com11 as MY
# print('use pack...')
# import lg.com.com22
# import lg.ui.ui11
# import lg.ui.ui22
# lg.com.com11.com11fn()
# MY.com11fn()
# lg.com.com22.com22fn()
# from lg.com.com11 import com11fn
# com11fn()
Python 라이브러리 종류
- 내장 라이브러리
- import 필요한 제공 라이브러리
- lib 제공라이브러리
- Third party library
'Data > Python' 카테고리의 다른 글
파이썬 선(禪)(Zen of Python) (0) | 2016.09.22 |
---|---|
Python 강좌(5) (0) | 2016.07.22 |
Python 강좌(4) (0) | 2016.07.20 |
Python 강좌(3) (0) | 2016.07.20 |
Python 강좌(1) (0) | 2016.07.18 |