본문 바로가기

Data/Python

Python 강좌(2)

강좌(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__)



유저 모듈 설명


import sys
from day2 import mymodule
print(sys.path)

#Code Level에서 컴파일
# import py_compile
# py_compile.compile("usemdule.py")
print('hello')
  
# # # from mymodule import hap, gop
# # # from mymodule import * # 모든 function 사용.
 
rst = mymodule.hap(10, 20)
print(rst)
# # rst = mymodule.gop(10, 20)
# # print(rst)
# import sys
# print(sys.path)
# sys.path.append("e:\\my")
# print(sys.path)



#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 라이브러리 종류

  1. 내장 라이브러리
  2. import 필요한 제공 라이브러리
  3. lib 제공라이브러리
  4. Third party library



강의2 과제



주소록을 입력받아 결과를 출력하시요
(함수로 구성하고 별도 모듈파일을 만드시요)

메인 메뉴)
     1.입력
     2.출력
     3.검색
     4.종료
     번호를 입력하세요:

입력)

1. 입력

이름:
나이:
주소:
계속 입력하시겠습니까(y/n)? 

입력이 종료되면 메인메뉴로


2.출력
--------------------------------
    이름        나이        주소
-------------------------------
     ㅁㅁㅁ      20        서울시
     ㅁㅁㅁ   

3.검색
검색할 이름을 입력하세요:
--------------------------------
    이름        나이        주소
-------------------------------
     ㅁㅁㅁ      20        서울시





반응형

'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