반응형



+ 리스트  /  List

[]를 사용한다.   순서가 있는 자료. 아무타입이나 복수타입들도 지원.
odd=[1,3,5,7,9]
리스트 내에 또 리스트를 쓸 수 도 있다.

string은 immutable이지만 list는 mutable이다.
! 리스트도 +를 사용하면 합쳐진다. *를 사용하면 반복됨.

lst=[1,2,5,'a','b']
lst=['a', 4.12, 'abb', ['a','b','c']]


a=[1,2]
a+[3,4]     => [1,2,3,4]
a*3     => [1,2,1,2,1,2]
인덱스는 0부터 시작
a[:] = []          # 리스트 클리어


다른 타입들도 원소로 갖을 수 있다.
array 처럼 사용한다.
append로 가장 마지막에 추가.
메모리 사용량은 많다.

list1=[...,...,..,...]
인덱스는 0부터시작
len(list1) => array count ; 원소 개수
list1.remove('...') ; 아이템을 찾아 삭제
list1.append('xxx') ; 추가
list1.sort()
del list1[1]

-리스트 조회
a[0:2] ; 인덱스 0~1까지 가져옴  ; 주의! 마지막 인덱스2는 포함되지 않는다! 
a[1:] ; 인덱스 1~
a[:3] ; 인덱스 0~2   
a[:-2] ;  a 전체에서 마지막 2개 제외.
인덱스 -1은 마지막 인덱스 번호를 의미함.


-리스트 내부 원소 개수
x = [[0, 0],[0,1], [1,0], [1,1]]
len(x)
4
len(x[0])
2

-리스트 차원을 알려면??? (팁)
x=[[1,2],[3,4]]
isinstance(x, list)
true
isinstance(x[0], list)
true
isinstance(x[0][0], list)
false
def test_dim(testlist, dim=0):
   if isinstance(testlist, list):
      if testlist == []:
          return dim
      dim = dim + 1
      dim = test_dim(testlist[0], dim)
      return dim
   else:
      if dim == 0:
          return -1
      else:
          return dim

-리스트 요소 삭제 방법
a=[1,'a','b','c',4]
a[1:3]=[]     => [1, 4]
또는 
del a[1:3]



-리스트 관리. 기타

a.append(4)     ; 뒤에 추가
a.insert(a,b) ; a 인덱스 위치에 b를 삽입.

a.remove(value) ; value를 찾아서 삭제한다. (처음에 발견된 하나만 삭제됨)
a.pop()  ; 가장 뒤에 노드를 하나 빼서 리턴한다.  pop(index)로 하면 해당 인덱스의 값을 뺀다.

a.count(value) ; value가 몇 개 들어있는지 개수
a.index(value) ; value가 몇 번째 인덱스가 존재하는지 검색.  (처음 발생한 지점)
    존재하지 않으면, ValueError exception

a.sort()     ; 리스트의 값들을 오름차순 정리함. 내림차순 정렬은 a.sort(reverse=True)
a.reverse() ; 리스트의 순서를 역순으로 조회.    ; a값 자체가 바뀐다! 주의!!!


+여러 개를 한 번에 추가시, extend.
nums=[1,2,3]
nums.extend([4,5,6])
nums
[1,2,3,4,5,6]

+리스트 위치 확인 index
lst.index('blue')     ; 처음 발견된 blue의 위치.
lst.index('blue',2)     ; 2번째로 발견된 blue의 위치.
lst.index('blue', 2, 4)      ; 인덱스2~4 범위내에서 검색.



+ 리스트 원소별 작업
a_list=[1,9,8,4]
a_list2 = [elem *2 for elem in a_list ]


+ 리스트 재구성, 필터링. ; 조건에 따라 선택.

cond = mat1[:,2]>5
cond = [True, False, True, False]
list_filter = [ i for i, c in zip(list1, cond) if c ]





------sample
a=[1,2,3,4]
while a:
     a.pop()
=> 4 3 2 1 출력
-변수 대입
a='aaa'
(a,b) = ('aaa','bb')
a=3
b=5
a,b = b,a     ; 두 변수의 값이 swap
b is a ==> true


-리스트 복사 주의사항!!
a=[1,2,3]
b=a
a[1]=4
b[1]=? 마찬가지로 변경되어 있음. (reference?)
b는 영향을 안 받고 싶으면 복사
b=a[:]     이렇게 복사해서 받아야 함.          주의!!!
또는
b = copy(a)
b is a => false



'Python' 카테고리의 다른 글

Python 강좌7 클래스  (0) 2018.03.27
Python 강좌6 tuple, set, dictionary  (0) 2018.03.21
Python 강좌4 정규식 regular expression  (0) 2018.03.19
Python 강좌3 자료형. 수/문자열  (1) 2018.03.16
Python 강좌2 if/for/while/function  (0) 2018.03.15
반응형



+ Regular Expression

import re

re.sub('ROAD$', 'RD.', s)          ; 스트링 s에서 ROAD로 끝나는 것을 'RD.'으로 바꿔라.

\b 는 word boundary를 의미.
실제 사용할 때는 \도 escape처리해 줘야 되서 \\b로 써야 한다.

-> 복잡하기 때문에 raw type을 사용. 앞에 r을 붙임.
re.sub(r'\bROAD\b', 'RD.', s)          ; 단어로 ROAD 자체를 쓰는 경우만 치환.


-전화번호 분할
800-555-1234

phonePattern = re.compile( r'^(\d{3})-(\d{3})-(\d{4})$' )
phonePattern.search( '800-555-1234').groups()
     ( '800', '555', '1234')

phonePattern = re.compile(r'^(\d{3})\D*(\d{3})\D*(\d{4})\D*(\d*)$')
                                        시작 , 그룹1:숫자3개 , 비숫자0개이상,   그룹2:숫자3개, 비숫자0개이상, 
                                   그룹3:숫자0개이상, 끝
num=80055512121234
phonePattern.search(num).groups()
800 555 1212 1234
800-555-1212

phonePattern = re.compile(r'''
# don't match beginning of string, number can start anywhere
(\d{3})          # area code 3digits.   시작문자제거. 숫자는 나중에 올수 있음.
\D*     # optional
(\d{3})
\D*     # optional
(\d{4})
\D*     # optional
(\d*)        # optional number
$          # end
'''
phonePattern.search('work 1-(800) 555.1212 #1234').groups()
     800 555 1212 1234
phonePattern.search('800-555-1212).groups()
     800 555 1212 ''



^ ; start
$ ; end
\b ; word boundary     ; \bWORK\b
\d ; digit
\D ; not digit
x? ; optional x (0개 또는 1개)
x* ; 0개 이상
x+ ; 1개 이상
x{n,m} ; n개이상 m개 이하. n~m개 
(a|b|cd) ; 셋 중 하나 a or b or cd
[abcd] ; 안에 있는 캐럭터중에 하나. a or b or c or d
[^abcd] ; 안에 있는 캐릭터가 다 아닌 것. []안에 ^는 not이다!
(x) ; group
\1, \2, \3 .. ; group 번호


ex) s, x, z로 끝나면 es를 붙인다.
if re.search('[sxz]$', noun):
     return re.sub('$', 'es', noun)
ex) 단어에 a,b,c 중 하나가 들어있냐?
re.search('[abc]', 'Mark')      => yes. object return. not null
ex) a,b,c가 있으면 o로 바꾼다.
re.sub('[abc]', 'o', 'caps')     => oops
ex) aeiou가 아닌 글자 다음에 y로 끝나면, y를 ies로 바꾼다.
if  re.search('[^aeiou]y$', noun) :
     return re.sub('y$', 'ies', noun)
or
if  re.search('[^aeiou]y$', noun) :
     return re.sub('([^aeiou])y$', r'\1ies', noun)




+ 함수도 객체. 여러 조건에 따라 각각 하는 일이 다른 경우. 한 번에 처리!
import re
def match_sxz(noun):
     return re.search('[sxz]$', noun)
def apply_sxz(noun):
     return re.sub('$', 'es', noun)
def match_h(noun):
     return re.search('[^aeioudgkprt]h$', noun)
def apply_h(noun):
     return re.sub('$', 'es', noun)
def match_y(noun):
     return re.search('[^aeiou]y$', noun)
def apply_y(noun):
     return re.sub('y$', 'ies', noun)
def match_default(noun):
     return True
def apply_default(noun):
     return noun+'s'

rules=( (match_sxz, apply_sxz), (match_h, apply_h), (match_y, apply_y), (match_default, apply_default))


def plural(noun):
     for match_x, apply_x in rules:
          if match_x(noun):
               return apply_x(noun)


다른 방법? ; 위 함수들을 자동으로 만든다.

def build_match_and_apply_functions(pattern, search, replace):
     def matches_rule(word):
          return re.search(pattern, word)
     def apply_rule(word):
          return re.sub(search, replace, word)
     return (matches_rule, apply_rule)

patterns=\
(
     ('[sxz$]', '$', 'es'),
     ('[^aeioudgkprt]h$', '$', 'es'),
     ('(qu|[^aeiou])y$', 'y$', 'ies'),
     ('$', '$', 's')
)

rules = [ build_match_and_apply_functions( pattern, search, replace )
     for (pattern, search, replace) in patterns ]


'Python' 카테고리의 다른 글

Python 강좌6 tuple, set, dictionary  (0) 2018.03.21
Python 강좌5 List  (0) 2018.03.20
Python 강좌3 자료형. 수/문자열  (1) 2018.03.16
Python 강좌2 if/for/while/function  (0) 2018.03.15
Python 강좌1. 산술연산, range  (0) 2018.03.14
반응형
+자료구조


-
None
; C++, java에서의 NULL, null 이다.


+타입 확인
type(10)
type(2.111)
type("aaa")

if type(param) is str:
     print('string type')
else:
     print( type(param) )



-정수 integer
키워드는 int
다른 진수.
0b ; binary
0o ; octal
0x ; hexa
0b10101
0o47222
0x61e78

bin(10)
oct(10)
hex(10)
스트링으로 출력된다.


-Float

-복소수 complex
i대신  j를 사용하여 표현
x=7-3j
x.imag
=-3.0
x.real
=7.0



-exam

print 'test\n'
num=1
while num<=100:
     print (num)
     num=num+1

if a>b:           # comment
     print('a')
else:
     print('b')

family=['adsf','werq','weqrewq']
for x in family:
     print('%s %s' % (x, len(x)))

+함수 정의
def func1(x):
     ...
     return y

---문자열
x='123456'

x[0]
'1'

x[2:4] ; 2~3까지를 의미
'34'
x[2:] ; 2~부터 끝까지

x[-1] ; 마지막것을 의미. 
x[1:-1] ; 인덱스 1부터 끝하나 전까지.  (-1은 마지막 인덱스값을 의미한다.)
x[-2] ; 끝에서 2번째를 의미




+Array
array는 동일한 타입들을 원소로 구성한다.
array.array( typecode, [initializer] )

import array
array.typecodes

'b' ; signed char, int, 1
'B' ; unsigned char
'u' unicode char
'h' signed short
'H'
'i' ; signed int
'I'
'l'     ; signed long
'L'     
'q'     ; signed long long
'Q'
'f'     ; float
'd'     ; double






+ 자료형 DataType

boolean    ; True/False
number ; int, float
string
byte
list    ; [ a,b,c ] ordered, any object.
tuple    ; ( a,b,c )  immutable list
set ; { a,b,c } unordered. same data type
dictionary ; { name:value , .. } 

자료형 확인.
a=1
a=1.2
type(a)


-수
8진수는 0o 또는 0O로 시작
16진수는 0x로 시작
복소수도 지원한다. 단, i대신 j를 쓴다.
지수는 **를 사용
int
float

- 파이썬은 ++, --를 지원하지 않음. a+=1 이런거는 지원.
// 나누기2개는  소수점이하 버림.


-bool 타입
a=True
a=False
-논리연산 ; and or not 사용 가능
not a
t and f
t or f
t != f 

-파이썬은 &&, ||를 사용하지 않는다. 


>>> 3/2
1.5
>>> int(3/2)               # 타입 캐스팅
1
>>> 3//2
1



------------------------------------------------------------------------


-+-String ; 문자열 

-대소 비교 operator 사용 가능.  

', " 모두 사용 가능. ', "를 사용하려면 연달아 두개를 쓰면 됨. 또는 \를 앞에 붙인다.
\n도 지원.
또는 멀티라인을 위해 """ 이런 스트링을 쓰기도 한다.
multline="""
abcd
defg
ijkl
"""
위와 같이 하면 multiline 변수가 처음에 개행문자가 들어간다.     이를 방지하려면 개행문자가 안들어가게 \를 추가한다. (일반 "도 공통)
multline="""\
abcd
defg
ijkl
"""
print 마지막에 개행을 자동으로 안하려면???           end='' 이라고 추가한다.
print ('Hello', end='')
         구분자 지정 sep="#" 이렇게 하면 변수들을 ,로 구분된 것에 공백 구분대신 지정 구분자가 들어감
          file=f  ; file 변수를 지정해 넣어주면, 파일에 기록함.



+문자열 연산.
+ 로 붙인다. 반복은 *를 사용할수도 있다.
print ("="*50)  ; =을 50개 출력
문자열 내의 문자 추출은 [] 로 사용 가능. (인덱스는 0부터 시작)
-도 가능하다. (역 인덱스. 거꾸로 셈. 인덱스 -1은 마지막문자의 인덱스 )

\는 esacpe 문자임.
\n 은 줄 바꿈.
\t ; tab
\0 ; null
\\ ; \문자
\' ; '문자
\" ; "문자

', " 둘 다 사용 가능. 
스트링이 길어서 이어서 기록시에는 마지막에 \를 추가한다.
str="This is a py\
thon test."


r'c:\name'      => r은 raw string의 의미. escape 키가 작동하지 않음. 그대로 출력. 경로명 입력시 유용.


멀티 라인 입력이 가능 """ 이나 '''  으로. 가능하다.  처음 시작할 때 뒤에 """\  이렇게 하고 줄 바꾸면 다음 라인부터 스트링으로 인식.
print("""\
usage: hillo
     -h
""")

# 출력          print!
print (a)
print a
print (a,b)
     a가 출력되고 '한 칸 띄고' b가 출력됨.
print( a+b )
     a,b가 붙어서 출력된다. (스트링)
a="Life is too short"

-슬라이싱 (slicing) ; 일부를 추출.

a[0:4]   => 0부터 4보다 작은 인덱스 까지의 의미. 앞 번호를 생략하면 처음 부터, 뒷 번호를 생략하면 끝 까지의 의미, -1은 마지막 인덱스값.
          ==> 'Life'
a[-1]     => t          # -1은 마지막 문자의 인덱스.
a[-2]     => r          # -2는 마지막 2번째 위치.
a[-2:] => rt
a[-5:-1] => shor          주의!! ; 마지막글자가 빠지는 이유. -1은 마지막인덱스값. 따라서 그 전까지이므로.
len(a) => 17
len( a[-5:] ) => 5
a_string[3:11]     => 인덱스 3~10까지 추출. (인덱스는 0부터 시작)
a_string[3:-3]     => 인덱스 3부터 마지막 3문자 제거.
a_string[:18]     => 처음부터 인덱스 17까지.     ; 추출된 문자열 길이가 18이 됨.
a_string[18:]     => 인덱스 18부터 끝까지

-스탭 ; 건너뛰는 크기.
temp="123456789"
temp[::3]
='147'
temp[::-1]     # reversing!
='987654321'
temp[::-2]
='97531'




-포맷 스트링
%d, %s 다 사용 가능. 
number=10
day = "three"
print("i eat %d apple. %s days", % (number, day))
i=123
f=3.14
s='Hello'
print( 'i:%9d, f:%5.2f, s:%7s' %(i,f,s))          ; %로 타입지정하면, %순서대로 변수 set 입력
print( 'f:{1}, i:{0}, s:{2}'.format(i,f,s))          ; {인덱스}로 지정하면, .format()으로 변수 입력
print('f: {ff}, i: {ii}, s: {ss}'.format(ii=i, ff=f, ss=s))          ; {키명}으로 지정하면, .format()으로 키명=변수 로 입력
     %5.2는 총스트링 길이 5. 그중 소수점 이하 자리는 2개를 의미.

str='hello %s %d' %( 'jake', 10)

'{0:6s}'.format('cat')
    'cat   '     ; 전체길이 6에서 왼쪽부터 채움. 초과시에는 있는 그대로 출력.
'{0:5d}.format(334)
'   334'     ; 5칸 자리 확보후 채움.
'{0:<6d}'.format(1234)
    '1234  '
'{0:>6d}'.format(1234)
    '  1234'
'{0:07d}'.format(1234)
    '0001234'
'{0:#o} {0:#x}'.format(123)
    '0o173 0x7b'

'{0:6s}'.format('cat')
    'cat   '     ; 전체길이 6에서 왼쪽부터 채움. 초과시에는 있는 그대로 출력.
'{:>6s}'.format('cat')  ; right alignment
   '   cat' ; 전체길이 6 오른쪽부터 채움.


'{0:5d}.format(334)
'   334'     ; 5칸 자리 확보후 채움.
'{0:<6d}'.format(1234)
    '1234  '
'{0:>6d}'.format(1234)
    '  1234'
'{0:07d}'.format(1234)
    '0001234'
'{0:#o} {0:#x}'.format(123)
    '0o173 0x7b'
'{:5.3f}'.format(3.1)
3.100    # 전체 5글자 소수점이하 3자
'{:6.3f}'.format(3.1)
' 3.100'  # 앞에 공백하나 추가해서 전체 6자. 소수점이하 3자. 정수부 2자.
'{:07.3f}'.format(3.1)
003.100  # 공백대신 앞에 0으로 채움. 전체7자. 소수부 3자. 정수부 3자.

print('Hello Python!'.center(20))     ; 전체크기20 컬럼. 중앙 정렬.     
print('Hello Python!'.rjust(20))          ; 전체크기 20,  오른쪽 정렬.   
print('Hello Python!'.ljust(20))     
print('Hello Python!'.zfill(20))
print('hello python!'.capitalize())     ; 첫글자만 대문자로 
print('hello python!'.upper())          ; 전체 대문자
print(range(1,10))          ; 출력안됨.
print( list(range(1,10) )          ; 출력됨.

- 문자열 함수
a="hi there"
a.upper(), lower()
a.count('e')
a.count('hi')
a.find('t') ; 없으면 -1 리턴
a.find('there')
a.index('t') ; 없으면 에러 발생.
a=","
a.join('abcd') ; 문자열 join
==> 'a,b,c,d'

rstrip()    ; 문자열 뒤쪽에서 공백, 리턴, 탭 등의 문자들을 삭제한다.
rstrip([chars])     ; chars 문자들을 모두 white space char로 취급.
               'mississippi'.rstrip('ipz')     => mississ
lstrip()
strip()
a.replace('life', ' leg')
a.split()
['life', 'is', 'too', 'short']


a="a:b:c:d"
a.split(':')     ; 구분문자로 나누어 리스트로 반환
    ; split('delimeter', count) ; 몇 번 분할할지를 지정할 수 있다.
splitlines()     ; 줄단위로 토크닝.


lower()     ; 소문자로
upper()


수를 문자열로 변환
str(123)

import string
정의된 값.
string.digits     = '0123456789'
string.hexdigits = '0123456789abcdefABCDEF'
string.ascii_lowercase     = > a~z
string.ascii_uppercase      => A~Z

find, rfind, index, rindex, count, lower, split, capitalize, atol, atoi, atof, join, lstrip, rstrip, strip,
upper, zfill, replace, ljust, rjust, center

str.partition(sep)     ; 세개로 분리. 전, sep, 후
str.rpartition(sep)
str.replace(old, new [,count])




+ URL GET 쿼리스트링을 dictionary로 토크닝.

query='user=aaa&database=master&password=12idid'
a_list = query.split('&')          ; &를 기준으로 자름. list로 리턴
a_list_of_lists = [v.split('=', 1) for v in a_list if '=' in v]                ; [['user','aaa'],['database','master'],['password','12idid']] 
a_dict = dict(a_list_of_lists)               ; 리스트를 dictionay로 변환.   ; { 'user':'aaa', 'database','master', 'password','12idid'}



+ string vs byte
둘 다 immutable ; 변경 불가.

by=b'abcd\x65'     ; by = b'abcde'
type(by) ; class 'bytes'
by+=b'\xff'
len(by)

byte를 변경가능하도록 하려면? bytearray로 변환한다.
byarr=bytearray(b'abcde')
byarr[0]=102


byte와 string은 합쳐지지 않는다. 형 변환 필요.
by.decode('ascii')
by = a_string.encode('utf-8')


+ bool

True/False
비교 연산자의 결과로 사용.
3>5
False
4<6
True
'a'=='b'
False
3.14!=3.14
False

+논리연산자

and &, or |, not

- 내장함수 bool()은 0과 비어있는 객체의 경우 False를 리턴한다.
bool(0)
False
bool(1)
True
bool(4.5)
True
bool([])
False
bool('a')
True




'Python' 카테고리의 다른 글

Python 강좌5 List  (0) 2018.03.20
Python 강좌4 정규식 regular expression  (0) 2018.03.19
Python 강좌2 if/for/while/function  (0) 2018.03.15
Python 강좌1. 산술연산, range  (0) 2018.03.14
Linear regression  (0) 2018.03.13
반응형




+  if  조건문. if, else, if, elif, else

a=3
if a>1:          
# 조건문이나 반복문에 영역을 : 으로 표시
     print ("a is greater than 1")    
# indentation을 반드시 맞춰야 한다.

pass ;
C에서 break와 같음.

if x<0:
     x=0
elif x==0:
     aaa
elif x==1:
      aaa
     bbb
else
     ccc
...

-논리연산
and, or
((day2-day1)==(day1*0.3)) or ((day2-day1)>(day1*0.29))
False
cur_price >=4000 and cur_price<10000
True






   



#반복문 for, while
for a in [1,2,3]:
     print a

i=0
while i<3:
     i=i+1
    if i%2==1: continue
     print (i)
    

continue, break ; c/java 처럼 동일하게 지원한다.

pass ; 아무것도 안 함.
(sleep(0) 같은 거로 볼 수 있다..)


TIP!
; 리스트 내부의 원소 각각마다 작업하는 경우 보통은 리스트 변수 그대로 써서 작업하는데, 
루프를 돌면서 리스트 자체가 변화될수 있는 경우... 루프에 영향을 줄 수 있다. 이를 방지하려면 리스트를 복사해서 루프를 돌아야 한다.
for w in words:
     리스트 자체임. 리스트를 변화시키면 위험.

for w in words[:]:
     복사본 words를 가지고 작업해서 안전
     words.insert(0, w)

for i in range(0,11):            # range 범위. 0~10까지. 
    print(i)

for obj in 리스트 또는 튜플. 딕셔너리!

튜플은 내용 자체의 변경이 불가. 더 빠름.
interest_stocks=(‘naver’,’daum’,’samsung’)    # tuple
interest_stocks=[‘naver’,’daum’,’samsung’]     # list
interest_stocks={‘naver’:10, ‘daum’:5, ‘samsung’:30}

for company, stock_num in interest_stocks:
    print( ‘%s: buy %s’, %(company, stock_num) )
for company in interest_stocks.keys():


-range()함수를 for문에 이용할 수 있다. 숫자의 범위를 가지는 range객체
for i in range(10):
    print(i)
0~9까지 출력.



     



#함수 Function

def sum(a,b):
     return a+b

sum2 = sum
print( sum(3,4) )
print( sum2(5,6))


+ 복수개의 리턴 가능. 튜플이나 리스트를 리턴.
def calc_upper_lower(price):
    offset=price*0.3
    upper+= offet
    lower-= offset
    return (upper, lower)

(upper,lower) = calc_upper_lower(100)


+ 내장 함수
abs()
chr(i) ; ascii code character return.  chr(65) -> A
enumerate() ; 시퀀스 자료형(리스트,튜플, 문자열)등을 입력받아 enumerate 객체로 변환. 인덱스값이 생성됨.
for i, stock in enumerate( [‘Naver’, ‘Daum’, ‘Samsung’]):
id(obj) ; 객체의 고유값 반환.
len(s) ; 원소 개수
list(s) ; 리스트로 변환. list(‘hello’) -> [‘h’,’e’,’l’,’l’,’o’]
    list((1,2,3)) -> [1,2,3]
max(1,2,3), max([1,2,3]), min()
sorted() ; 정렬하여 리스트로 반환
int(s) ; 스트링을 수로 변환.
str(s) ; 수를 스트링으로 변환.


+namespace는 세 가지 영역이 존재. local, global, built-in.
이름 검사 규칙은 지역, 전역, 내장 순서로 한다. LGB 규칙.

n=10
def func(n):
    n=n*10     # 여기서의 n은 로컬 n이다. 100이 기록된다. 그러나, global n과는 무관하다.

func(n)     # n값이 global한 값 10이 들어간다.
print(n)     # global n값인 10이 출력...

-> 함수내에서 글로벌 변수 access를 하려면???
def func():
    global n          # 글로벌변수 n을 사용하겠다. (값 변경시 global 선언 필요)
    n=n*10


+가변인자
함수 정의시 파라미터앞에 *를 붙인다.
def func(*var1):
     print("var1=", var1)
     print("var2=", *var1)
     print(*var1)
    for i in var1:
          print(i)

func(1)
     var1=(1,)
     var2= 1
     1
func(1,2)
     var1=(1,2)
     var2=1 2
     1 2 
func(1,2,3,4)
     var1=(1,2,3,4)
     var2= 1 2 3 4 
     1 2 3 4

+ multiple key value argument
def myfunc(**kwargs):
     for k, v in kwargs.iteritems():     ## 버전에 따라 iteritems()대신 items()사용(python3)
          print(k,v)
myfunc(abc=123, efh=456)




+인자 기본값
def mul(a,b=10):
    return a*b
- 주의 사항 ; 기본값 사용 인자가 나오면 뒤에 더 추가되는 인자들도 모두 기본값을 지정해 줘야 한다.

mul(3)
mul(4,5)






+++++++ 함수의 디폴트 값 변수 주의!!!

i=5
def f(arg=i):
     print (arg)

i=6
f()
==> 5가 출력됨. 함수의 파라미터의 디폴트 값은 한 번만 초기화된다.

def f(a, L=[]):
     L.append(a)
     return L
f(1)          => [1]    
f(2)          =>  [1, 2]
f(3)          => [1,2,3]
==> 추가된다.??? L 객체가 mutable인 경우에는 위와 같이 유지된다. immutable 객체는 안됨.

=> 무조건 초기화 하려면????
def f(a, L=None):
     if  L is None :
          L=[]
     L.append(a)
     return L


'Python' 카테고리의 다른 글

Python 강좌4 정규식 regular expression  (0) 2018.03.19
Python 강좌3 자료형. 수/문자열  (1) 2018.03.16
Python 강좌1. 산술연산, range  (0) 2018.03.14
Linear regression  (0) 2018.03.13
[python] 보간법 interpolate 사용하기  (0) 2017.05.25
반응형


파이썬 강좌

귀도 반 로섬이 만든  인터프리터 언어. 신화에 나오는 큰 뱀이라는 뜻

고급언어다. 인간적인 언어
문법이 쉽다. 가독성이 좋다.
강력하다. 간결, 무료. 개발 속도가 빠르다.
복수개의 리턴 및 복수개를 한 번에 대입 등이 가능.
""" 지원.
 

줄을 잘 맞춰야 한다. !!!!  그렇지 않으면 실행이 되지 않는다.
{} 이런 괄호를 사용하지 않는다.!!!!     대신 탭을 맞춰야 한다.!!!! indentation!
대신 블록은  for, if 등에서 : 을 마지막에 사용한다.

C의 모듈을 사용할 수 도 있다.
DB, 웹, GUI 프로그래밍도 가능하다.
단점은, 느리다. 

NULL대신 None사용

파이썬은 call by assignment이다???     (자바랑 비슷하다)
     call by value도 reference도 아니다.
     immutable object(int, float, str, tuples등)은 value로 넘어감.
     mutable object(그외)는 reference가 넘어가지만 변경될수도 아닐수도 있다.
     vector를 파라미터로 넘겨서 append를 하면 추가되어 caller에서도 변경된다.
     그러나 할당을 하면 caller에서는 변경되지 않는다. 주소가 변경되니... 당연.

def spam(eggs): 
    eggs.append(1)     # 원본 객체의 메소드로 직접 데이터 변경.
    eggs[0]=77          # 원본 객체의 직접 수정.
    eggs = [2, 3]     # 새로운 객체의 주소가 할당되었다. 원본객체는 이제 이 함수내에서 사용 불가.
    eggs[0]=99
    print(eggs)  ## 무엇이 출력될까?    
99, 3 ; 최종적인 값임.; 0 -> 0, 1-> 77, 1 까지되고 주소변경 ; 2, 3 -> 99, 3

ham = [0] 
spam(ham) 
print(ham)     ## 무엇이 출력될까?  
  77, 1 ; 객체 주소변경전까지만 유효하다; 0, 1 -> 77, 1 까지되고 이후 주소변경됨.


def foo(bar=[]):
     bar.append("baz")
     return bar

foo()     ; baz
foo()     ; baz baz               ; 파이썬의 파라미터 기본값은 최초 한번!만 실행되고, 이후 재사용!한다.
foo([1])     ; 1 baz          ; 주소변경됨.
foo([2])     ; 2 baz          ; 주소변경됨.
foo()          ; bza baz baz     ; 예전 기본값 주소 재사용.     주의!!!! 


try:
     l=["a","b"]
     int (l[2])
except ValueError, IndexError:
     pass
위와 같이 하면 index error 오류를 잡지 못함. ()로 묶어 주어야 한다!!!
except (ValueError, IndexError) as e:


+할당문에 의한 변수 범위 변화          gloal 변수 사용 주의!!!
x=10
def foo():
     x+=1
     print (x)
에러!??? -> x는 local               ; 함수내에 할당문이 있으면 그 변수는 로컬로 한정된다.
; 해결 방안. foo() 함수 내에 global x 를 선언해야 한다.


---------------------------------------------------------------------------------------------



+산술 연산

연산자 ; + - * /  //  %  **

3**2 (squared) => 3^2 주의!!!!!!!!! 파이썬에서는
제곱은 **2 이다.( ^ 아님. )
3/2 => 1.5
int(3/2) => 1          ; 타입 캐스팅.  아래와 같이 더 간단히 가능.
3
//2 => 1     ; 나머지 버림. 정수로 리턴.
% ; 나머지

abs(-6)
= 6
int(73.123)
=73


interactive 모드에서
이전 출력값을 변수  _ 로 사용가능 . 계산기 처럼 쓸 때 유용함.


분수 ; fraction
import fractions
x=fractions.Fraction(1,3)
   
    
    ; 1/3
x*2
Fraction(2,3)
    
    
    ; 2/3

삼각함수
import math
math.pi
math.sin( math.pi/2)
math.tan( math.pi/4)


+ 파이선 버전
python -V
python --version
현재 디렉터리 경로
import os
print (os.getcwd())
확장자로 .py로 작성한다.
python sample.py      ; 이렇게 실행한다.
-샘플)
그냥 계산도 된다.
>>> 1+2
>>> 50-4

# 대입, 복수의 대입도 한 번에 가능. parallel
a=10
a="Python"
a,b,c=0.4,0.2,0.7
피보나치 수열
a,b=0,1
while b<10:
     print(b)
     a, b = b, a+b
# 라이브러리 사용
import sys
sys.exit()


+ range 객체

숫자 범위 리스트를 만들어 준다.   
range(10) ; 0~9
range(1,11) ; 1부터 10     (주의! 11까지가 아니다.)
marks=[90,100,30,40]
for value in marks:
     sum=sum+value
for num in range(len(marks)):
     print(marks[num])
range(1,10) 결과 출력하기
list( range(1,10)) ; 이렇게 list로 변환해주면 콘솔에서 내부 데이터 출력이 가능하다


-print에서 자동개행하지 않게 출력하려면
print ( "abc", end=" ")
print ( "def")



'Python' 카테고리의 다른 글

Python 강좌4 정규식 regular expression  (0) 2018.03.19
Python 강좌3 자료형. 수/문자열  (1) 2018.03.16
Python 강좌2 if/for/while/function  (0) 2018.03.15
Linear regression  (0) 2018.03.13
[python] 보간법 interpolate 사용하기  (0) 2017.05.25
반응형


두 쌍 x,y 데이터 리스트로  데이터에 가장 근접한 하나의 직선 그리기.


위키에 나오는 선형 회귀

통계학에서, 선형 회귀(線型回歸, 영어: linear regression)는 종속 변수 y와 한 개 이상의 독립 변수 (또는 설명 변수) X와의 선형 상관 관계를 모델링하는 회귀분석 기법이다. 한 개의 설명 변수에 기반한 경우에는 단순 선형 회귀, 둘 이상의 설명 변수에 기반한 경우에는 다중 선형 회귀라고 한다.[참고 1]

선형 회귀는 선형 예측 함수를 사용해 회귀식을 모델링하며, 알려지지 않은 파라미터는 데이터로부터 추정한다. 이렇게 만들어진 회귀식을 선형 모델이라고 한다.

자세한건 링크


아래 예에서는 data1의 x, y를 list1의 5열, 7열로 보고,

data2의 x, y를 list의 6열, 7열로 보았음.


import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

list1 = [['2012', '1', '3', '1', '832.0', '261.0', '100.00'],
['2012', '1', '5', '1', '507.0', '193.0', '92.50'],
['2012', '2', '3', '1', '412.0', '200.0', '95.00'],
['2012', '2', '5', '1', '560.0', '335.0', '90.00'],
['2012', '3', '3', '1', '584.0', '205.0', '100.00'],
['2012', '3', '5', '1', '595.0', '162.0', '92.50'],
['2012', '4', '3', '1', '504.0', '227.0', '100.00'],
['2012', '4', '5', '1', '591.0', '264.0', '92.50'],
['2012', '5', '3', '1', '489.0', '234.0', '100.00'],
['2012', '5', '5', '1', '561.0', '292.0', '95.00'],
['2012', '6', '3', '1', '622.0', '221.0', '100.00'],
['2012', '6', '5', '1', '478.0', '204.0', '92.50'],
['2012', '7', '3', '1', '974.0', '290.0', '100.00'],
['2012', '7', '5', '1', '553.0', '269.0', '95.00'],
['2012', '8', '3', '1', '473.0', '158.0', '100.00'],
['2012', '8', '5', '1', '526.0', '174.0', '92.50'],
['2012', '9', '3', '1', '701.0', '189.0', '95.00'],
['2012', '9', '5', '1', '502.0', '179.0', '97.50'],
['2012', '10', '3', '1', '470.0', '184.0', '100.00'],
['2012', '10', '5', '1', '579.0', '218.0', '92.50']]

def drawabline(xy):

slope, intercept = np.polyfit(xy[:,0], xy[:,1], 1)
print(slope, intercept)
# or this
# slope, intercept, r_value, p_value, stderr = stats.linregress(data2)
# print(slope, intercept)

abline_values = [slope * i + intercept for i in xy[:,0]]

plt.figure()
plt.scatter(xy[:,0], xy[:,1])
plt.plot(xy[:,0], abline_values, 'b')
plt.show()

data = np.asarray(list1, dtype=np.float)
data1 = np.array( data[:,(4,6)])
print( 'data1=', data1 )
drawabline(data1)

data2 = np.array( data[:,(5,6)])
print( 'data2=', data2 )

drawabline(data2)

직선의 방정식으로 기울기, y절편값이 나왔으니, 임의의 x값에 대해서 y값 추정이 가능.

y = slope * x + intercept


출력 결과









반응형


보간법. interpolate 


몇 개의 샘플 포인트들로 추정하여 인접한 점들 사이를 다항식 함수로 완만한 곡선으로 이어준 것을 스플라인 곡선이라고 한다.

보간법은 이러한 미싱 포인트(추정)들을 계산/추정하는 방법이다.

간단하게는 linear 방식(1차)이 있고, 2차, 3차, 4차 곡선등으로 확장하면서 보다 다양하게 추정할 수 있다.



위 그림은 파란색 점의 샘플 좌표들만을 가지고, 스플라인 곡선을 만들어 그린 추정 그래프이다.

python에서 scipy 라이브러리의 interpolate를 사용하여 구현하였다.

아래 코드에서 splrep에 별다른 옵션이 없으면 3차 스플라인 곡선으로 추정하게 된다. (k=1(선형보간), k=2, k=3(default), k=4 이런식으로 옵션을 준다. )

[python code]


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu May 25 2017
@author: crazyj
"""

# interpolation test

import numpy as np
import scipy.interpolate as ip
from scipy.interpolate import splrep, splev
import matplotlib.pyplot as plt

# 0~10까지 15개로 나누어 점을 찍음.
x0 = np.linspace(0, 10, 15)
print('x0=', x0)
# cosine 값을 계산
y0 = np.cos(x0)

# x, y (샘플)값을 주고 추정하는 스플라인 곡선을 만든다.
spl = splrep(x0, y0)
# 0~10까지 50구간에 대한 모든 점들을 위 스플라인 곡선으로 추정한 y값을 구한다.
x1 = np.linspace(0, 10, 50)
y1 = splev(x1, spl)

# 그린다.
plt.figure(figsize=(16, 5))
plt.subplot(121)
plt.plot(x0, y0, 'o')
plt.plot(x1, y1, 'r')
plt.grid()

# 이번에는 sine 곡선으로 추정해 본다.
plt.subplot(122)
y2=np.sin(x0)
spl2=splrep(x0, y2)
y3=splev(x1, spl2)
plt.plot(x0, y2, 'o')
plt.plot(x1, y3, 'b')
plt.grid()
plt.show()



'Python' 카테고리의 다른 글

Python 강좌4 정규식 regular expression  (0) 2018.03.19
Python 강좌3 자료형. 수/문자열  (1) 2018.03.16
Python 강좌2 if/for/while/function  (0) 2018.03.15
Python 강좌1. 산술연산, range  (0) 2018.03.14
Linear regression  (0) 2018.03.13

+ Recent posts