2015. 6. 12. 15:05

getopt 모듈의 getopt함수를 이용하면, 

sys.argv로 전달받은 명령행의 인수리스트에서 옵션을 분리해 낼 수 있다!


아래와 같이 쓸 수 있다.

import sys

import getopt


options, args = getopt.getopt(sys.argv[1:], 'a:b:c:')


for op, p in options:

    if op == '-a':

        print 'option a', p

    elif op == '-b':

        print 'option b', p

    elif op == '-c':

        print 'option c', p

    else:

        print 'Unknown option', op

print args

$ python _getopt.py -a apple -b banana -c cat people agg

[('-a', 'apple'), ('-b', 'banana'), ('-c', 'cat')]

option a apple

option b banana

option c cat

['people', 'agg']


getopt함수

첫번째 : 인수리스트(sys.argv[1:])

두번째 : 옵션문자들('a:b:c:')

이때 옵션문자에 :가 사용된다면 옵션에 추가의 인수를 받아들인다는 의미!

abc:de:

라면, a,b,d는 단독옵션이고, c,e는 인수를 갖는 옵션이다!


출처: 열혈강의 파이썬프로그래밍(이강성저)



Posted by Triany
2015. 6. 12. 14:29

언어마다 제어문을 기술하는 방식이 조금 달라, 사용할때마다 항상 조금씩 헷갈린다!

if ( a > 5 ) { }  ?

if a > 5 : ? 기타등등!

헷갈릴까봐 정리하는 파이썬 구문들!


python 파이썬 if - elif - else문

if 조건식1:

    <문들1>

elif 조건식2:

    <문들2>

else:

    <문들>

n = -2

if n > 0:

    print 'Positive'

elif n < 0:

    print 'Negative'

else:

    print 'Zero'



python 파이썬 for문

for <타겟>  in<객체>:

    <문1>

else:

    <문2>

lists = ['rabbit', 'iPad', 'people']

for item in lists:

    print item



python 파이썬 while문!

while <조건식>:

    <문1>

else:

    <문2>

count = 1

while count < 11:

    print count,

    count = count + 1


출처: 열혈강의 파이썬(이강성 저)

Posted by Triany
2015. 6. 6. 12:34


python에서 1 days ago를 표현하려면 어떻게 해야할까?
또 1 days ago를 구한 후, 원하는 포맷으로 출력하려면 어떻게 해야할까?


python 인터프리터 모드에서의 예
>>> import datetime
>>> days_ago = datetime.datetime.now() - datetime.timedelta(days=1)
>>> print days_ago.strftime("%Y-%m-%d, %H:%M:%S")
2015-06-05, 12:17:47

이때 datetime.now()는 datetime.today()로 써도 본 예제에서는 무방하다.


datetime.today()   현재 지방 기준의 datetime 객체 생성

datetime.now([tz]) 현재 지방기준의 datetime 객체를 생성한다.(시간대 정보가 특별히 입력되지 않으면 플랫폼의 시간을 사용)



>strftime(format) : 지정된 포맷에 맞춰 date 객체의 정보를 문자열로 반환


 지시자 

 내용

 %y 

 연도를 축약('15') 

 %Y

 연도를 축약하지 않고 표시('2015')

 %m

 숫자로 표현한 월(01~12) 

 %b

 축약된 월이름('Apr') 

 %B

 축약되지 않은 월이름('April') 

 %d

 일(01~31) 

 %j

 1월 1일부터 누적된 날짜(001~366) 

 %a

 축약된 요일 이름('Mon')

 %A

 축약되지 않은 요일 이름('Monday') 

 %w

 요일을 숫자로 표시

 (0:일, 1:월, 2:화, 3:수, 4:목, 5:금, 6:토) 

 %H

 24시를 기준 시(00~23)

 %I

 12시를 기준 시(01~12)

 %M

 분(00~59)

 %S

 초(00~60)

 %p

 오전(AM)/오후(PM) 표시('PM') 

Posted by Triany
2015. 6. 5. 15:20

모든 파이썬 모듈은 독립적으로 수행될 수도 있고,

다른 모듈에 의해 호출될 수도 있다!


이때 지금 모듈이 가장먼저 수행되는 최상위 모듈인지, 

아니면 다른 모듈에 의해 임포트 되는 모듈인지 구별하기 위해!

__name__ 이라는 내장이름을 가지고 있다.!


인터프리터 모드에 의해 수행해 보면 

른 모듈에 의해 임포트 되는 모듈의 경우 일반적으로 자신의 모듈 이름을 가진다!

>>> import urllib2

>>> urllib2.__name__

'urllib2'

>>> import os

>>> os.__name__

'os'


그럼, 아래 파일을 실행해 보겠다.


name.py

#!/bin/python

print __name__




$ python name.py

__main__

name.py가 프로그램 모드로 수행되면 __name__은 '__main__'이란 이름을 가진다.



가장 먼저 파이썬 인터프리터에 의해 사용되는 모듈이 __main__ 이란 이름을 가진다는 것을 이용하면

아래와 같은 방식으로 특정 코드를 선택적으로 실행하게 할 수 있다.

다른 모듈에 의해 임포트 될 때는 수행되지 않는다.

#!/bin/python


def print():

    print 'Hi'


if __name__ == '__main__'

    printf()



출처 : 프리렉 이강성의 열혈강의 파이썬 ver.2

Posted by Triany
2015. 3. 9. 21:21

복사생성자가 호출되는 시점은 언제일까?

복사생성자

: 자기 자신과 같은 형태의(자료형의) 객체를 인자로 받을 수 있는 생성자를 복사생성자라고 한다.

AAA(const AAA& a)

{

}



1. 기존에 생성된 객체로 새로운 객체를 초기화하는 경우

int main()

{

   Person p1;

   Person p2=p1;  //기존에 생성된 객체로 새로운 객체 초기화

}



2. 함수 호출 시 객체를 값에 의해 전달하는 경우

void func(Person p)


3. 함수 내에서 객체를 값에 의해 리턴하는 경우

Person fun2()

{
   Person p;
   return p;
}


>> 부록

디폴트 복사 새성자 존재

디폴트 복사 생성자 - 자동으로 삽입되는 복사 생성자

: 멤버 변수대 멤버 변수의 복사를 수행


출처: 열혈강의 c++프로그래밍_윤성우

Posted by Triany
2015. 3. 9. 21:15

const 함수

1.상수화된 함수는 상수화 되지 않은 함수의 호출을 허용x

2.멤버 변수의 포인터 리턴 허용 x


const 객체

1. 어떤 경로를 통해서든 멤버 변수 조작 불가능

2. 상수화된 멤버 함수만 호출 가능



static 멤버(=클래스변수)의 특징

1. main함수가 호출되기도 전에 메모리 공간에 올라가서 초기화 된다.

 따라서 public으로 선언이 된다면, 객체 생성 이전에도 접근이 가능하다.

2. 객체의 멤버로 존재하는 것이 아니다. 다만, 선언되어 있는 클래스내에서 직접 접근할 수 있는 권한이 부여된 것이다.

-> 데이터 영역에 위치


c++에서는 static 멤버 초기화 문법이 존재한다.

class AAA

{

public:

    static int n;

};

int AAA::n=1;


int main(void)

{

    std::cout<<AAA::n << std::endl;

    AAA::n++;

    return 0;  

}



출처: 열혈강의 c++프로그래밍_윤성우 저

Posted by Triany
2015. 3. 9. 18:42

멤버 이니셜라이저문법 : const 멤버를 초기화 하는 것이 가능!

class Student

{

    const int id;

    int age;

public:

    Student(int _id, int _age) : id(_id)

    {

        age=_age;

    }

};

생성자 : id(_id) 

멤버변수 id를 매개변수 _id로 초기화하라!




이 방법이 아니라

Student(int _id, int _age)

{

    id = _id;

   age = _age; 

}

로 초기화 하면 당연히 에러가 뜬다!! 

객체의 생성순서는

1. 메모리 할당

2. 초기화 인데,

객체가 생성당시 쓰레기 값으로 이미 초기화 된 것을,

생성자로 다시 초기화 하려고 하면서 문제가 발생한다!!

따라서 const멤버 변수를 초기화 하기 위해서는

반드시 위의

멤버 이니셜라이저! 라는 문법을 이용할것!!

Posted by Triany
2015. 3. 9. 14:43

생성자 내에서 동적할당을 한다면

반드시 제공해 주어야 할것!! 1)소멸자   2)복사생성자


class Person

{

    char *name;
    int age;
public:
    Person(char* _name, int _age)
   {
        name = new char[strlen(_name)+1];
        strcpy(name, _name);
        age = _age;
   }



1) 소멸자 제공

-> 메모리 누수(유출) 막음

~Person()

{

    delete []name;

}


2) 복자생성자 정의

->잘못된 메모리 참조 막음  ( 얕은 복사(주소값 복사)가 아닌 깊은 복사(공간할당하여 값 복사)를 하기 위함 )

Person(const Person& p)

{

     name = new char[strlen(p.name)+1];

     strcpy(name, p.name);

     age = p.age;

}


Posted by Triany
2015. 2. 25. 18:57

파이썬은 신비하고도 아름다운 언어이다.

얼마전에 파이썬의 엄청난 예제를 보았는데 그 예제를 보고 난 더욱더 파이썬의 아름다움에 감탄을 금지 않을 수 없었다.


☆ for문에도 else가 있다.

# 소수값을 출력하는 예제

 #!/bin/py

for n in range(2, 10):  # 첫번째 for문

    for x in range(2, n):  #두번째 for문

        if n % x == 0:

            print n, 'equals', x, '*', n/x

            break

    else: #이 else문은 두번째 for문에 대한 else로 if에 대한 else 가 아니다.

        print n, 'is a prime number'

결과

$ python prime.py

2 is a prime number

3 is a prime number

4 equals 2 * 2

5 is a prime number

6 equals 2 * 3

7 is a prime number

8 equals 2 * 4

9 equals 3 * 3



for문이 break를 만나지 않는다면 for문을 다 거치고 무조건 else
break를 만난다면 for문을 완전히 빠져나와서 else를 안거친다!




Posted by Triany
2015. 2. 17. 11:39


■ ( const char * ) 상수형 문자에 대한 포인터. 포인터가 가리키는 변수의 을 바꿀 수 없음

#include <iostream>

int main()

{

    char ch1 = 'a';

    char ch2 = 'b';

    const char * pch;

    pch = &ch1;

    std::cout << *pch << std::endl;

    //*pch = 'c';  //에러  error: assignment of read-only location ‘* pch’

    pch = &ch2;

    std::cout << *pch << std::endl;


    return 0;

}

$ constchar

a

b



■ ( char const  * ) 문자에 대한 상수형 포인터. 포인터 값을 바꿀 수 없음

#include <iostream>

int main()
{
    char ch1 = 'a';
    char ch2 = 'b';
    char * const pch = &ch1;
    std::cout << *pch << std::endl;
    *pch = 'c';
    std::cout << *pch << std::endl;
    //pch = &ch2;   //에러 error: assignment of read-only variable ‘pch’
    std::cout << *pch << std::endl;

    return 0;
}

$charconst

a

c



■ ( const char const  * ) 상수형 문자에 대한 상수형 포인터. 

  포인터가 가리키는 변수의 과 포인터 값 을 바꿀 수 없음


#include <iostream>

int main()
{
    char ch1 = 'a';
    char ch2 = 'b';
    const char * const pch = &ch1;
    std::cout << *pch << std::endl;
   //*pch = 'c'; //error: assignment of read-only location ‘*(const char*)pch’ !! 문자값 못바꿈 
    std::cout << *pch << std::endl;
    //pch = &ch2; // error: assignment of read-only variable ‘pch’ 포인터 값 못바꿈!
    std::cout << *pch << std::endl;

    return 0;
}


$charconst

a






여기서 새로 발견한것! 당연한거지만!

char * const pch = 'c';

 error: invalid conversion from ‘char’ to ‘char*’ [-fpermissive]

 문자열이 아닌 'c' 문자 하나만 써주면! 에러가 뜬다.



문자열로 선언해주면, warning이뜬다. 

char * const pch = "c";


 warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

 char * const pch = "c";



Posted by Triany