반응형




+ 커맨드 라인으로 파이썬 파라미터 주기
$python test.py arg1 arg2 arg3

import sys
len(sys.argv) => 4
str(sys.argv) => ['test.py', 'arg1', 'arg2', 'arg3']

C 방식과 동일.


+ 커맨드 라인 파싱 모듈

test.py -h               ; short option. 추가 파라미터 필요없음.
test.py -i <inputfile> -o <outputfile>          ; short option
test.py --ifile=<inputfile> --ofile=<outputfile>          ; long option

short option은 -한문자로 구성. 데이터는 뒤에 파라미터를 사용.
long option은 --스트링으로 구성 데이터는 =으로 받음.

import sys, getopt

main(sys.argv[1:]) ; 현재 파일명 이후의 파라미터목록을 전달.

def main(argv)
try:
     opts, args = getopt.getopt(argv, "hi:o:", ["ifile=", "ofile="])
except getopt.GetoptError:
     print('사용법')
     sys.exit(2)

for opt, arg in opts:
     if opt=='-h':
          #to do
          sys.exit(2)
     elif opt in ("-i", "--ifile"):
          infile=arg
     elif opt in ("-o", "--ofile"):
          outfile=arg

-------------------------------------------------------------------------------------
opts, args = getopt(파라미터 array,   "short option", [long options] )

short option은  사용할 문자들을 준다.  옵션뒤에 추가파라미터가 필요하면 문자뒤에 :을 추가.
hi:o:    ==> i와 o 옵션은 뒤에 파라미터 필요. h는 불필요.

long option은 =으로 끝나게 주면 된다.
"ifile=", "ofile="

opt, arg쌍으로 opts에서 가져온다.
옵션이름은 실제 스트링값을 사용. -h, -i, -o, --file, --ofile





반응형



+ 쉘 커맨드 실행하기.

1. os.system 구문을 이용해 명령 실행 하기
import os
import sys
os.system ('ls -al | grep "user")

// pipe command is available
위와 같이 단순히 명령 실행을 위해 사용시에는 문제가 없으나,
결과값을 특정 변수에 저장하는 목적으로 사용하기에는 적합하지 않다.
(명령 실행 결과의 성공 유무를 리턴하기 때문에…)
따라서 위의 단점을 보완할 수 있는 방법이 바로 subprocess 이다.

2. subprocess 이용하여 명령 실행하기
먼저 os.system과 같이 단순히 “실행”만 시킬 때는 “call” 메서드를 이용하면된다.

import subprocess
subprocess.call ('ls -al', shell=True)
그러나 특정 명령 수행 결과를 바탕으로 if 조건문을 걸때에는 call이 아닌 check_ouput을 이용해야 한다.

예를들어 특정 파일 실행결과가 “AAA” 혹은 “BBB”라고 가정해보자.
“AAA” 일 경우 “123”을 출력하고 “BBB”일 때 “456”을 출력하려면 다음과 같이 코드를 작성하면 된다

import subprocess
result = subprocess.check_output ('./program' , shell=True)
if result == 'AAA' :
  print "123"
elif result == 'BBB' :
  print "456"
위와 같이 check_output 메서드를 사용하면 해당 실행 결과를 스트링값으로 리턴해주기 때문에

실제 실행결과값을 바탕으로 조건 구문을 사용할 수 있게 된다.

 


'Python' 카테고리의 다른 글

Python 데이터 저장/로딩 Pickle  (0) 2018.04.25
Python 커맨드라인 파싱  (0) 2018.04.17
Python JSON 사용하기  (0) 2018.04.10
Python 외부 모듈사용.time,string,random, try except  (0) 2018.04.09
Python 강좌7 클래스  (0) 2018.03.27
반응형





+JSON
기본으로 설치되어 있다.
import json

-JSON 인코딩
customer={ 'id':111, 'name':'james',
    'history':[ {'date':'2015-01-01', 'item':'iphome'}, {'date':'2016-01-01', 'item':'android'}]
}
jsonString = json.dumps(customer)    # JSON 스트링으로 변환

출력
print(jsonString)

보기 좋게 출력하려면 인코딩시 indent 추가
jsonString = json.dumps(customer, indent=4)

-JSON 디코딩
JSON 스트링을 Python 객체로
dict = json.loads(jsonString)
dict['name']
dict['history'][0]['date']
for h in dict['history']:
    print(h['date'], h['item'])

 


'Python' 카테고리의 다른 글

Python 커맨드라인 파싱  (0) 2018.04.17
Python 쉘 커맨드 실행  (0) 2018.04.12
Python 외부 모듈사용.time,string,random, try except  (0) 2018.04.09
Python 강좌7 클래스  (0) 2018.03.27
Python 강좌6 tuple, set, dictionary  (0) 2018.03.21
반응형




모듈 Module


+ 외부 모듈 가져오기 (import)
import시 찾는 경로를 알기 위해서는 아래와 같이 path를 찾아본다.
import sys
sys.path
PATH 추가
sys.path.insert(0, ‘/home/…’)   첫 번째 path에 추가한다.

import 모듈      ; 모듈 전체 가져오기. 사용시 모듈.변수 등으로 사용.
or
from 모듈 import 변수나 함수  ; 모듈의 특정 부분만 가져오기.
import한 모듈을 더 이상 사용 안할 경우
del 모듈
다시 불러오기
reload 모듈

import math
dir(math)          # math에 정의되어 있는 함수, 변수등을 확인.
math.sin(90)
math.row(2,10)
math.pi

+ 모듈의 정의
arithmetic.py라고 파일이름을 만들어 여러가지 함수들을 만든다.

import arithmetic
dir(arithmetic)
arithmetic.plus(1,2)
arithmetic.mul(300,400)

현재 경로에 존재하지 않으면?
폴더 지정도 가능. 현재폴더 기준. mylib 폴더내에 arithmetic.py가 있다면...
from mylib.arithmetic import *


from arithmetic import plus     # 해당 파일의 특정 함수만 로딩.
plus(100,200)

from arithmetic import *     # 해당 파일에 있는 모든 함수 사용 가능.





+string 모듈

import string
string.captialize('python')
'Python'
string.replace('simple', 'i', 'a')
'sample'
string.split('break into words')
['break', 'into', 'words']

+webbrowser 모듈
import webbrowser
url='http://google.com'
webbrowser.open(url)

+random
import random
random.random()
0이상 1미만 소수
random.randrange(1,7)
1~6까지 정수.









+ with as
; try~finally 같은 역할.
특정 블록을 벗어날때 항상 처리되어야 할 것이 자동화 처리.
with open('filename', 'w') as f:
     f.write(something);
close()가 없어도 자동 처리.



+ 시간 time, date 날짜
import time
time.time()     ; 19700101이후누적 시간 (초). 소수점이하 포함.
time.ctime()    ;    Sun Oct 11 12:00:50 2015
time.gmtime()
time.localtime()

time.sleep(sec) ; millisec를 하려면, sec/1000.0으로 해줘야 함.


dir(time)    ; 모듈의 내장 함수 목록 조회.



+try, except
try… except  예외 처리.
자바와 c++에서는 try, catch를 사용하고, 예외 발생시 throw를 사용.
파이썬은 try, except를 사용하고, raise를 사용.

try:
     to do...
except:
     ignore....



if size<0:
    raise ValueError(‘number must be non-negative!’)



+try ~ except

try:
    구문
except <예외 종류>:
    예외 처리

try:
    a=10/0
except ZeroDivisionError:        # 잡을 예외
    print('divede by zero.')

try:
    a=int( input('input number:'))
except ValueError:
    print('invalid number!')
except ZeroDivisionError:            # 더 있으면 아래 계속 추가 가능.
    print('divide by zero!')

except (ValueError, ZeroDivisionError):        # 복수개를 한 번에 처리 가능.


+ else
try:
    ...
 except ...:
        ...
else:
    예외가 발생하지 않을 경우.

+ finally

finally:
    무조건 실행되는 영역

+raise
예외 발생

try:
    ...
    if a<=0 or b<=0:
        raise ArithmeticError('message...')
    except ArithmeticError as e:
        print( e.args[0] )
에러 메시지를 받아 출력...





+실행프로그램으로 현재 코드가 실행되는지 확인. (외부 임포트의 경우는 아래 코드가 실행되지 않음.)
if __name__==‘__main__’:
    print(…)





'Python' 카테고리의 다른 글

Python 쉘 커맨드 실행  (0) 2018.04.12
Python JSON 사용하기  (0) 2018.04.10
Python 강좌7 클래스  (0) 2018.03.27
Python 강좌6 tuple, set, dictionary  (0) 2018.03.21
Python 강좌5 List  (0) 2018.03.20
반응형


+클래스 

class 클래스명:
     def __init__(self, 파라미터,...):
          ...
     def 메서드1(self, 파라미터,...):
          ...
__init__ ; 생성자

__del__ ; 소멸자


class Man:
     def __init__(self, name):
          self.params={}
          self.name=name
          print("aa")
    
     def hi(self):
          print("hi "+self.name+"!")
     
     def setAge(self, a):
          self.params['age']=a

    def __del__(self):
          pass

m=Man("jj")          # 생성자 호출!  
m.hi()
del m          # m객체 소멸. 소멸자 호출!
-------------------------------------------------------------------------

class SumClass:
     def __init__(self, name):     // constructor
          self.name=name 
     def sum(self, a, b ):     // 첫번째 인자는 self로 해야 한다.
          result=a+b
a = SumClass("jane')
a.sum(1,2)

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

class Fib:
     '''iterator that yields numbers in the fibonacci sequence'''

     def __int__(self, max):
          self.max = max          #     instance에서의 global 변수. self.*
     def __iter__(self):
          self.a=0
          self.b=1
          return self
     def __next__(self):
          fib = self.a
          if fib > self.max:
               raise StopIteration
          self.a, self.b = self.b, self.a+self.b
          return fib

빈 클래스 정의시, 문법적 오류를 피하기 위해 내용에 pass 라고 쓴다. 나중에 작업할 때 사용.

class PapayaWhip:
     pass


+클래스의 객체 생성 ; 클래스명(constructor)으로 함수 호출처럼 한다.

f = Fib(100)
for i in f :
    print( i, end=“ “)
에러없이 마지막까지 출력된다.




+ 클래스 상속  ; 클래스 선언시 뒤에 (parent) 를 추가한다.

class B(A):
    pass

A클래스로부터 상속받는다.

ex)
class Person:
    def __init__(self, name, age, gender):
          self.Name = name
          self.Age= age
          self.Gender = gender
    def aboutme(self):
          pass
class Employee(Person):
     def __init__(self, name, age, gender, salary):
          super().__init__(self, name, age, gender)     # Person._init__(..)을 사용해도 되나, 다중상속시 중복실행되는 것을 막기위해 super를 사용한다.
         self.Salary=salary
    def work(self):
          pass

   
+ 다중 상속도 지원한다.
class Child(ParentOne, ParentTwo):
..




+ 연산자 오버로딩

아래와 같이 미리 정의된 함수를 중복 정의하여 사용한다.

__add__(self, other)
__mul__(self, other)
__sub__(self, other)
...

피연산자의 순서가 뒤바뀐 경우도 지원하려면?
함수이름에 r을 붙인 것을 정의한다.
__add__=__radd__
__sub__=__rsub__
__mul__=__rmul__

n=numbox(100)
n+100
100+n



+ 클래스 메소드 class method   ; 첫 번째 인자가 cls 로 클래스를 의미.
@classmethod
def change_raise_amount(cls, rate):
     cls.raise_rate=rate
     

+static method     ; cls 객체가 없다.
@staticmethod
def is_work_day(day):
     return True



'Python' 카테고리의 다른 글

Python JSON 사용하기  (0) 2018.04.10
Python 외부 모듈사용.time,string,random, try except  (0) 2018.04.09
Python 강좌6 tuple, set, dictionary  (0) 2018.03.21
Python 강좌5 List  (0) 2018.03.20
Python 강좌4 정규식 regular expression  (0) 2018.03.19
반응형


+ 튜플 (tuple)    ; immutable! 리스트와 같으나 변경불가.

() 를 사용한다. 리스트와 비슷하나, 튜플은 값을 변경할 수 없다.
t1=()
t2=(1,)             # 주의!!! 원소가 한 개인 경우 반드시 뒤에 ,를 써줘야 한다. 쓰지 않으면 () 연산자로 인식.
a,b = 10,20          # 이것도 튜플을 통한 복수 데이터 할당의 응용이다. 
b,a = a,b          # 이렇게 값을 동시에 변경할 수도 있다. swap이 쉽다.
t3=(1,2,3)
t4=1,2,3,4
위와 같이 사용

매크로 값 할당 처럼 사용 가능.
(MON, TUE, WED) = range(3)
MON=0
TUE=1
WED=2

-튜플 연산
+는 데이터 추가. *는 반복.
tuples=('a','b','c')
tuples+('d',e','f')     # a b c d e f 가 된다. 
tuples*3          # a b c a b c a b c가 된다.







+Set ; 집합.{}
노드들의 순서 없음. 중복은 추가되지 않음.
a_set = { 1 }

-list를 set으로 변환.
a_set=set(a_list)

a_set=set()        ; empty set
a_set.add(4)    ; item add
len(a_set)         ; item count
a_set.update( {4,5,6} )    ; items add (중복은 추가되지 않음.)
a_set.update( [10,20,30])    ; items add (중복은 추가되지 않음.)
a_set.discard( 10 )    ; 10을 삭제함. (없어도 에러 안남)
a_set.remove(10)    ; 10을 삭제함. (없으면 에러. KeyError)
a_set.clear()

30 in a_set    ; check (T/F) exist
a_set.union(b_set)    ; union set
a_set.intersection(b_set)    ; intersection
a_set.difference(b_set)    ; diff. A-B
a_set.symmetric_difference(b_set) ; diff.  (A+B)-(A intersect B)
a_set.issubset(b_set) ; T/F   check A<B
b_set.isupperset(a_set) ; T/F  check B>A











+ Dictionary
{key:value,...}를 사용.        json과 비슷.
unordered. key-value pairs.

dic={123:456, 3.14:11.2, (1,3):(3,1),  'abc':'def',  'list':{1,2,3}, 'dict':{1:2, 3:4}}

dic={'name':'pey', 'phone':'111111','birth':'1111'}
dic['name']
주의! 
a={1:'a',2:'b'}
a[1]='a' 이다.  Dictionary에서 a[1]에서 1은 인덱스가 아니고 Key다.!!

-사전에 추가 방법
a['name2']='test' ; 없으면 추가된다!!!.  있으면 업데이트된다. 
-삭제는 del을 사용!
del a['name2']
a.keys() ; key 명으로된 list
a.clear() ; 모두 삭제
a.get('name') ; 키로 값 얻기 ; a['name'] 과 동일하다.

-객체가 None 또는 empty이면 false로 취급.
-키가 없으면 KeyError 발생
a['akaka']

-사전 키 존재! 여부 검사 (in, has_key)
'name' in dic
True
'job' in dic
False

if 'keyname' in dic:
     use...
or
if dict.has_key('keyname')==1:
     use...
or
value=dic.get('keyname', 0)          # 키가 없으면 디폴트값으로 설정함.!! ( 널체크. null, None. )


+ dictionary 생성
import glob
import os
metadata_dict = { f:os.stat(f) for f in glob.glob('*test*.py') }

metadata_dict[0]
metadata_dict['atest01.py'].st_size
list(metadata_dict.keys())


+ key, value 뒤집기
{ value:key for key, value in a_dict.items() }


+ key, value 검색
for k, v in dictA.items():
     print(k,v)
for (k,v) in dictA.items(): 상동

for k in dictA:
     print(k, dictA[k])



'Python' 카테고리의 다른 글

Python 외부 모듈사용.time,string,random, try except  (0) 2018.04.09
Python 강좌7 클래스  (0) 2018.03.27
Python 강좌5 List  (0) 2018.03.20
Python 강좌4 정규식 regular expression  (0) 2018.03.19
Python 강좌3 자료형. 수/문자열  (1) 2018.03.16
반응형



+ 리스트  /  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

+ Recent posts