• Tistory
    • 태그
    • 위치로그
    • 방명록
    • 관리자
    • 글쓰기
Carousel 01
Carousel 02
Previous Next

'Programming'에 해당되는 글 147건

  • 2019.07.09 CStdioFile 을 이용한 파일 입출력에서 내용이 깨질경우
  • 2019.03.18 pycharm 사용 및 환경설정 팁
  • 2019.03.11 Unicode 환경에서 한글이 깨질경우 해결방법
  • 2019.03.05 conda를 이용한 가상환경 설정
  • 2018.11.21 기억해야 할 C#의 기능들 (1)
  • 2018.07.26 cout을 이용할때 출력 정밀도를 제어해 보자
  • 2018.04.18 메모리 동적할당 예시
  • 2018.03.05 os.path 모듈 사용법
  • 2018.01.19 파이썬2 와 파이썬3을 동시에 동작시키자 : __future__
  • 2018.01.15 Git 에서 사용하는 명령어 정리
  • 2017.11.21 cin 의 버퍼를 지워보자 3
  • 2017.10.16 '제약 조건과 일치하는 올바른 내보내기를 찾을 수 없습니다' 해결방법
  • 2017.06.08 프로그램 배포시 아이콘과 MFC dll 관련 설정
  • 2017.02.16 taskkill 명령어를 이용하여 프로세스를 강제종료하자
  • 2016.12.13 파이썬에 GUI를 입혀보자. PyQT
  • 2016.11.09 자주사용되는 파이썬 라이브러리
  • 2016.07.15 python 에서 pass 와 continue의 차이점.
  • 2016.06.30 파이썬에서 main() 함수는 어디에 있는가?
  • 2016.06.15 파이썬에서 코드 들여쓰기 정리를 자동으로 하자. 4
  • 2016.06.13 파이썬에서 조건문을 이용하자.

CStdioFile 을 이용한 파일 입출력에서 내용이 깨질경우

Programming/C, C++, MFC 2019. 7. 9. 17:12




CStdioFile을 이용하여 파일 입출력을 하는 경우 중 한글이 깨지는 경우가 발생.

일반적으로는 아래의 방법을 이용하여 해결 되는 경우가 많다.

 Unicode 환경에서 한글이 깨질경우 해결방법

 

Unicode 환경에서 한글이 깨질경우 해결방법

unicode 환경에서 LPCWSTR 로 문자열을 받았으나 한글이 꺠질 때 해결방법. 1. locale 헤더 파일 include 하기 #include "locale.h" 2. 코드에서 setlocale 선언해주기 setlocale(LC_ALL, ""); 위 두줄이면 문제..

jangjy.tistory.com

하지만 프로그램을 통하지 않고 외부에서 파일을 생성하고 읽으려니 글자가 깨지는 현상을 발견.

나의 경우는 notepad++ 에서 작성한 내용을 CStdioFile을 이용해서 읽으니 정상적으로 읽어지지 않는 케이스.

 

한참의 삽질 끝에 알아낸 것은 CStdioFile의 경우 내용을 저장 할 때 Unicode 나 UTF-8 로 저장하지 않고 ANSI로 저장한다는 점. 내용이 한글이더라도 ANSI로 저장하고 읽어오는 과정에서 이에대한 처리가 이루어진다고 한다.

그래서 notepad++ 에서 작성한 내용은 기본이 UTF-8로 저장되어 있어서 CStdioFile을 이용하여 readstring 한 경우
내용이 제대로 읽어지지 않은 것이었다.

 

이러한 문제를 해결하기 위해서는 외부에서 작성 된 내용을 ANSI로 인코딩 해 주거나 애초에 파일 내용을 CStdioFile을 이용하여 작성하면 된다.

 

'Programming > C, C++, MFC' 카테고리의 다른 글

하위폴더 포함, 폴더 전체를 복사하자  (0) 2020.11.10
std::string에서 format을 사용하자  (2) 2020.03.19
Unicode 환경에서 한글이 깨질경우 해결방법  (0) 2019.03.11
cout을 이용할때 출력 정밀도를 제어해 보자  (0) 2018.07.26
메모리 동적할당 예시  (0) 2018.04.18
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

pycharm 사용 및 환경설정 팁

Programming/기타 etc. 2019. 3. 18. 10:21




1. method 단위 구분 선 삽입

환경설정 - Edigor - General - Appearance - Show Method separators 에 체크
활성화 할 경우 각 메소드 단위로 아래에 구분선이 표시된다.


2. 현재 라인 빠르게 복사 - 붙여넣기 

ctrl + D 를 누르면 현재 커서가 위치한 라인의 코드가 아래줄에 한줄 추가로 복사-붙여넣기 된다.


3. 자동완성 기능에 대소문자 구분하지 않기

기본 값으로는 자동완성시 대소문자를 구분하여 목록을 보여준다.
환경설정 - Editors - General - Code Completion - Case sensitive completion 의 값을 수정
none / All / First letter 세가지 옵션이 있다.


4. 파라미터 목록 힌트 띄우기

함수를 사용할때 처음 타이핑 할때는 파라미터 목록이 뜨지만 포커스가 바뀌는 등의 경우에는 목록 힌트가 사라짐
이 경우 다시 목록 힌트를 보고 싶다면
Ctrl + Shift + Space


5. 페이지 좌우 스크롤 하기

코드나 디버깅 정보를 확인 하다 보면 화면 너머로 길게 나온는 경우 쉽게 스크롤 하는 방법
세로 스크롤은 마우스휠로 / 가로 스크롤은 shift + 마우스휠


6. 현재 문서만 남기고 열린 문서 닫기

파일 우클릭 후 Close Others를 선택해도 되지만 Alt + 탭의 x 클릭 으로도 한번에 다른 창을 다 닫을 수 있다.


7. 디버깅 모드에서 콘솔 창 이용하기

코드 우클릭 - Execute Line in Console 을 이용하거나
하단 콘솔 윈도우 하단에 있는 Show python prompt 를 이용


8. 메인 프로그램 파라미터 삽입하기

sys.argv 같이 파라미터를 입력받아야 하는 경우가 있다.
run - Edit Configurations - Configuration - Parameters 에 값 넣어주기



지속적으로 추가 예정.


저작자표시 비영리 (새창열림)

'Programming > 기타 etc.' 카테고리의 다른 글

[Git] github -> gitlab / repository를 이사하자  (0) 2021.12.06
[ROS] Rosbag2Video  (0) 2021.11.30
float 값의 비교 (== 연산자는 위험하다!)  (0) 2021.04.13
google drive web client 사용량 제한  (0) 2021.02.25
폴더 내의 파일목록을 다뤄보자. 폴더 내 파일 리스트 만들기  (0) 2015.12.17
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

Unicode 환경에서 한글이 깨질경우 해결방법

Programming/C, C++, MFC 2019. 3. 11. 10:32




unicode 환경에서 LPCWSTR 로 문자열을 받았으나 한글이 꺠질 때 해결방법.


1. locale 헤더 파일 include 하기

    #include "locale.h"

2. 코드에서 setlocale 선언해주기

    setlocale(LC_ALL, "");


위 두줄이면 문제 해결.

저작자표시 비영리 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

std::string에서 format을 사용하자  (2) 2020.03.19
CStdioFile 을 이용한 파일 입출력에서 내용이 깨질경우  (0) 2019.07.09
cout을 이용할때 출력 정밀도를 제어해 보자  (0) 2018.07.26
메모리 동적할당 예시  (0) 2018.04.18
cin 의 버퍼를 지워보자  (3) 2017.11.21
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

conda를 이용한 가상환경 설정

Programming/Python 2019. 3. 5. 14:05




아래 명령어들은 모두 Anaconda Prompt 바로가기(아래 activate.bat파일을 호출해줌) 또는

cmd 상에서 (Anaconda/Miniconda 설치경로\Script\activate.bat) 가 실행된 상태에서 사용 가능하다.

 

 

가상환경 만들기

$ conda create -n [env-name] python=3.7

 

가상환경 활성화

$ conda activate [env-name]

 

가상환경 비활성화 

$ conda deactivate [env-name]

 

가상환경 삭제

$ conda remove -n [env-name] --all

저작자표시 비영리 (새창열림)

'Programming > Python' 카테고리의 다른 글

list 에서 최대값과 최대값의 index를 찾아보자  (0) 2019.08.14
numpy의 array를 저장하고 읽어보자  (0) 2019.08.08
os.path 모듈 사용법  (0) 2018.03.05
파이썬2 와 파이썬3을 동시에 동작시키자 : __future__  (0) 2018.01.19
파이썬에 GUI를 입혀보자. PyQT  (0) 2016.12.13
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

기억해야 할 C#의 기능들 (1)

Programming/C# 2018. 11. 21. 11:09




* C# 의 char 는 유니코드를 지원하는 2byte 크기의 변수이다.


* C#의 변수는 object의 상속을 받아 생성됨. object에는 모든 값을 담을 수 있다.

    object는 참조형식이라 힙에 저장. 변수는 값형식이라 스택에 저장.
    object에 값을 넣으면 박싱 되어 힙에 저장되고 변수에 형변환하여 넣으면 언박싱되어 스택에 값이 저장됨.


* C++의 auto는 C#의 var이다.

    자료형을 알아서 파악하는 변수 var. 선언과 동시에 초기화가 필요하다.


* int/float 등의 수 자료형과 string 자료형간의 형변환 메소드 "Parse() / ToString()"

// string -> int/float
string 	sValue = "12345";
int 	nValue = int.Parse(sValue);
float 	fValue = float.Parse(sValue):

// int/float -> string
int		nValue = 12345;
float	fValue = 123.45f;
string 	sValue;

sValue = nValue.ToString();
sValue = fValue.ToString();


* switch 문의 조건식에는 정수형과 더불어 문자열 형식도 사용 가능


* 배열 내 요소를 반복으로 사용하는 foreach

int[] arr = new int[]{0, 1, 2, 3, 4};

foreach(int a in arr)
{
	Console.WriteLine(a);
}


* 메소드 파라미터에 Call by reference 방식 사용하기

    메소드 파라미터 앞에 ref키워드를 이용하여 call by reference로  인자를 넘길 수 있다.


* 메소드 파라미터에 결과를 받기위한 출력 전용 매개변수

    메소드에 ref 키워드를 이용해도 파라미터에 값을 받을 수 있지만 출력을 위한 경우에는 out키워드를 사용

    out에는 ref에는 없는 안전장치가 몇가지 더 있어서 보다 안전함


* 가변길이 매개변수를 만드는 키워드 params

    메소드에 가변길이로 파라미터를 받는 경우 params 키워드 사용. 단 이경우 입력되는 자료형은 같아야 함

int Sum(params int[] args)
{
	int sum = 0;
	foreach(int a in args)
	{
		sum += a;
	}
	
	return sum;
}


* 메소드 파라미터를 넣을때 python 처럼 파라미터 명을 명명하여 입력 가능



======================== 추가할 내용 =======================

인터페이스, 프로퍼티(get, set), 무명형식, 컬렉션(ArrayList, Queue, Stack, Hashtable), 일반화, delegate, 람다식, LINQ, 리플렉션, 애트리뷰트, 다이나믹, 파일IO, Thread, WinForm

저작자표시 비영리 (새창열림)
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

cout을 이용할때 출력 정밀도를 제어해 보자

Programming/C, C++, MFC 2018. 7. 26. 10:21




c 에서 출력할 경우 printf 함수를 통해 부동소수점 출력 정밀도를 정의 가능하다.


이와 동일한 기능을 cout을 이용 할 경우 필요한 함수에 대해 정리.



우선 관련 함수를 사용하기 위해서 iomanip 헤더를 include.


std::setprecision() : c++ 에서 출력 자리수 제한을 위해 사용

단 이 함수의 경우 소수점 아래 출력 정밀도 제어가 아닌 전체 출력 자리수를 제한한다.

이 함수를 사용하기전에 기본정밀도를 저장 해 두고 사용 후에는 원복 해 주자.



std::fixed : 소수점 이하 자리수를 제한하기 위해 setprecision과 함께 사용된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iomanip>
 
float f = 103.141592653;
 
std::streamsize prec = std::cout.precision();
// 기본 정밀도 저장
 
std::cout << std::setprecision(4) << f << "\n";
// 출력값은 103.1
 
std::cout << std::fixed << std::setprecision(4) << f << "\n";
// 출력값은 103.1416
// setprecision 처리할때 출력 자리 이하에서 반올림 처리
 
std::cout << std::setprecision(prec) << f << "\n\n";
// 출력값은 103.141593
Colored by Color Scripter
cs


저작자표시 비영리 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

CStdioFile 을 이용한 파일 입출력에서 내용이 깨질경우  (0) 2019.07.09
Unicode 환경에서 한글이 깨질경우 해결방법  (0) 2019.03.11
메모리 동적할당 예시  (0) 2018.04.18
cin 의 버퍼를 지워보자  (3) 2017.11.21
'제약 조건과 일치하는 올바른 내보내기를 찾을 수 없습니다' 해결방법  (0) 2017.10.16
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

메모리 동적할당 예시

Programming/C, C++, MFC 2018. 4. 18. 12:55




자주 쓰진 않지만 가끔 사용하는 동적할당 방법에 관한 예시


할당 한 메모리 해제는 필수.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// int A[100][200][300] 을 동적 할당.
 
int x;
int y;
int ***A;
 
A = new int ** [100];
for(x = 0; x < 100; x++)
{
        A[x] = new int * [200];
        for(y = 0; y < 200; y++)
        {
                A[x][y] = new int [300];
        }
}
 
// 메모리 해제
 
for(x = 0; x < 100; x++)
{
        for(y = 0; y < 200; y++)
        {
                delete [] A[x][y];
        }
}
 
for(x = 0; x < 100; x++)
{
        delete [] A[x];
}
delete [] A;
cs

저작자표시 비영리 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

Unicode 환경에서 한글이 깨질경우 해결방법  (0) 2019.03.11
cout을 이용할때 출력 정밀도를 제어해 보자  (0) 2018.07.26
cin 의 버퍼를 지워보자  (3) 2017.11.21
'제약 조건과 일치하는 올바른 내보내기를 찾을 수 없습니다' 해결방법  (0) 2017.10.16
프로그램 배포시 아이콘과 MFC dll 관련 설정  (0) 2017.06.08
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

os.path 모듈 사용법

Programming/Python 2018. 3. 5. 18:07




◎ os.path는 파일 경로를 생성 및 수정하고, 파일 정보를 쉽게 다룰 수 있게 해주는 모듈.

 

os.path.abspath(path)

 

현재 경로를 Prefix로 하여 입력받은 경로를 절대경로로 바꿔서 반환합니다.

>>> abspath('tmp')

'C:\\Python30\\tmp'

 

os.path.basename(path)

 

입력받은 경로의 기본 이름(base name)을 반환합니다.

abspath() 함수와 반대되는 기능을 수행한다고 볼 수 있습니다.

>>> basename('C:\\Python30\\tmp')

'tmp'

>>> basename('C:\\Python30\\tmp\\test.txt')

'test.txt'

 

os.path.commonprefix(path_list)

 

입력받은 path_list로부터 공통적인 Prefix를 추출해서 반환합니다. 그러나 이 결과는 문자열 연산에

의한 것이기 때문에 다음의 두 번째 예제와 같이 잘못된 경로가 나올 수도 있습니다.

>>> commonprefix(['C:\\Python30\\Lib', 'C:\\Python30', 'C:\\Python30\\Tools'])

'C:\\Python30'

>>> commonprefix(['C:\\Python26\\Lib', 'C:\\Python25\\Tools'])

'C:\\Python2'

 

os.path.dirname(path)

 

입력받은 파일/디렉터리의 경로를 반환합니다.

>>> dirname('C:\\Python30\\tmp\\test.txt')

'C:\\Python30\\tmp'

>>> dirname('C:\\Python30\\tmp')

'C:\\Python30'

 

os.path.exists(path)

 

입력받은 경로가 존재하면 True를 반환하고, 존재하지 않는 경우는 False를 반환합니다.

리눅스와 같은 OS에서는 파일이나 디렉터리가 존재하지만 읽기 권한이 없는 경우에도,

False를 반환할 수 있습니다.

>>> exists('C:\\Python30')

True

>>> exists('C:\\Python30\\Devanix')

False

 

os.path.expanduser(path)

 

입력받은 경로안의 "~"를 현재 사용자 디렉터리의 절대경로로 대체합니다.

"~"에 붙여서 <사용자명>을 붙이면 원하는 사용자 경로로 대체됩니다.

(유닉스/리눅스의 홈디렉터리를 나타내는 '~'과 동일합니다)

>>> expanduser('~\\devanix')

'C:\\Documents and Settings\\Administrator\\devanix'

 

os.path.expandvars(path)

 

path안에 환경변수가 있따면 확장합니다. (환경변수는 os.environ에 정의된 것을 참조)

>>> expandvars('$HOME\\temp')

'C:\\Documents and Settings\\Administrator\\temp'

>>> expandvars('$SYSTEMROOT\\var')

'C:\\WINDOWS\\var'

 

os.path.getatime(path)

 

입력받은 경로에 대한 최근 접근 시간을 반환 (반환되는 값은 epoch(1970년 1월 1일) 이후

초단위로 반환됩니다. 파일이 없거나 권한이 없는 경우 os.error 예외 발생)

>>> getatime('C:\\Python30\\python.exe')

1320966393.375

# 읽을 수 있는 형식으로 보려면 다음과 같이 하면 됩니다.

>>> import time

>>> time.gmtime(getatime('C:\\Python30\\python.exe'))

time.struct_time(tm_year=2011, tm_mon=11, tm_mday=10, tm_hour=23, tm_min=6, tm_sec=33, tm_wday=3, tm_yday=314, tm_isdst=0)

 

os.path.getmtime(path)

 

입력받은 경로에 대한 최근 변경 시간을 반환 (파일이 없거나 권한이 없는 경우 os.error 예외 발생)

>>> getmtime('C:\\Python30\\python.exe')

1320966397.453125

 

os.path.getctime(path)

 

입력받은 경로에 대한 생성시간을 반환 (유닉스와 같은 운영체제에서는 생성시간이 아닌

최근 변경 시간을 반환할 수도 있습니다. 파일이 없거나 권한이 없는 경우 os.error 예외 발생)

>>> getctime('C:\\Python30\\python.exe')

1320966393.0625    

 

os.path.getsize(path)

 

입력받은 경로에 대한 바이트 단위의 파일크기를 반환.

(파일이 없거나 권한이 없는 경우 os.error 예외 발생)

>>> getsize('C:\\Python30\\python.exe')

26624L

 

os.path.isabs(path)

 

경로가 절대경로이면 True를 반환하고, 그 외의 경우에는 False를 반환.

(실제 해당 경로를 검사하지는 않으며 입력받은 문자열을 가지고 판단합니다.)

>>> isabs('C:\\Python30\\python.exe')

True

 

os.path.isfile(path)

 

경로가 파일인지 아닌지 검사합니다. 파일인 경우에는 True를 반환하고, 그 외의 경우 False를 반환.

(혹은 해당 경로가 존재하지 않은 경우에는 False를 반환합니다)

>>> isfile('C:\\Python30\\python.exe')

True

>>> isfile('C:\\Python26\\python.exe')

False

 

os.path.isdir(path)

 

경로가 디렉터리인지 아닌지 검사합니다. 디렉터리인 경우에는 True를 반환하고, 그 외의 경우에는

False를 반환합니다. 혹은 경로가 존재하지 않은 경우에는 False 반환합니다.

>>> isdir('C:\\Python30\\python.exe')

False

>>> isfile('C:\\Python30\\Lib')

True

 

os.path.join(path1[,path2[,...]])

 

해당 OS 형식에 맞도록 입력 받은 경로를 연결합니다. (입력 중간에 절대경로가 나오면 이전에

취합된 경로는 제거하고 다시 연결합니다)

>>> join('C:\\Python30', 'Script', 'test.py')

'C:\\Python30\\Script\\test.py'

>>> join('C:\\Python30', 'D:\\Test', 'test.py')

'D:\\Test\\test.py'

 

os.path.normcase(path)

 

해당 OS에 맞도록 입력 받은 경로의 문자열을 정규화 합니다. (윈도우와 같은 경우,

아래 예제와 같이 소문자로 바꾸고 '/'를 '\\'로 변경합니다)

>>> normcase('C:\\Python30\\python.exe')

'c:\\python30\\python.exe'

>>> normcase('C:/Python30/python.exe')

'c:\\python30\\python.exe'

 

os.path.normpath(path)

 

입력 받은 경로를 정규화합니다. (현재 디렉터리(".")나 상위 디렉터리("..")와 같은 구분자를 최대한 삭제)

>>> normpath('C:\\Python30/./python.exe')

'C:\\Python30\\python.exe'

>>> normpath('C:\\Python30/./../python.exe')

'C:\\python.exe'

 

os.path.split(path)

 

입력 받은 경로를 디렉터리 부분과 파일 부분으로 나눕니다.

단순한 문자열 연산이므로 실제 파일의 존재 여부는 확인하지 않습니다.

>>> split('C:\\Python30\\python.exe')

('C:\\Python30', 'python.exe')

 

os.path.splitdrive(path)

 

입력 받은 경로를 드라이브 부분과 나머지 부분으로 나눕니다.

단순한 문자열 연산이므로 실제 파일의 존재 여부는 확인하지 않습니다.

>>> splitdrive('C:\\Python30\\python.exe')

('C:', '\\Python30\\python.exe')

 

os.path.splitext(path)

 

입력 받은 경로를 확장자 부분과 그 외의 부분으로 나눕니다.

단순한 문자열 연산이므로 실제 파일의 존재 여부는 확인하지 않습니다.

>>> splitext('C:\\Python30\\python.exe')

('C:\\Python30\\python', '.exe')

 



출처: http://devanix.tistory.com/298 [┗System∑Sec†ion┛]

출처: http://devanix.tistory.com/298 [┗System∑Sec†ion┛]

저작자표시 비영리 (새창열림)

'Programming > Python' 카테고리의 다른 글

numpy의 array를 저장하고 읽어보자  (0) 2019.08.08
conda를 이용한 가상환경 설정  (0) 2019.03.05
파이썬2 와 파이썬3을 동시에 동작시키자 : __future__  (0) 2018.01.19
파이썬에 GUI를 입혀보자. PyQT  (0) 2016.12.13
자주사용되는 파이썬 라이브러리  (0) 2016.11.09
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

파이썬2 와 파이썬3을 동시에 동작시키자 : __future__

Programming/Python 2018. 1. 19. 09:50




파이썬2 버전에서 3버전으로 판올림 되면서 여러 부분에서 변화가 있었다.

문법들이 달라졌고 동일한 연산에 대한 결과값도 달라지고.. 등등...


그러나 한 어플리케이션을 만들면서 파이썬2 버전과 3버전에서 동시에 동작하도록 

상호호환성을 가지게 만들어 주는 방법이 있어서 기록.



__future__ 모듈


이 모듈은 파이썬2.x 에서 몇몇 기능들을 파이썬3.x 와 같이 사용 가능하게 만들어 주는 모듈이다.

흔히 사용되는 몇몇 기능은 아래와 같다.


print_function

  >>> print "hello", "world"

  hello world    # python 2.x

  SyntaxError: invalid syntax    # python 3.x


  >>> print ("hello", "world")

  ("hello", "world")    # python 2.x, 튜플이 출력 됨

  hello world    # python 3.x


  >>> from __future__ import print_function

  print ("hello", "world")

  hello world    # python 2.x & 3.x, 원하는 출력 가능.


Division

  >>> from __future__ import division    # python 3 스타일의 나누기 지원.


Absolute Import

  >>> from __future__ import absolute_import    # 표준 모듈과 동일한 이름의 로컬 모듈을 사용 가능하게 해줌.

저작자표시 비영리 (새창열림)

'Programming > Python' 카테고리의 다른 글

conda를 이용한 가상환경 설정  (0) 2019.03.05
os.path 모듈 사용법  (0) 2018.03.05
파이썬에 GUI를 입혀보자. PyQT  (0) 2016.12.13
자주사용되는 파이썬 라이브러리  (0) 2016.11.09
python 에서 pass 와 continue의 차이점.  (0) 2016.07.15
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

Git 에서 사용하는 명령어 정리

Programming/Git, Docker 2018. 1. 15. 18:16




Git을 사용하기 시작했는데 잘 모르는 명령어들..

잘 정리되어 있는 글이 있어 다음번에 사용하기 위해 기록


환경 설정
git config --global --list 
현재 설정정보 조회할 수 있습니다. --global옵션은 전역설정에 대한 옵션이며 현재 프로젝트에만 적용할때는 주지 않습니다.
git config --global user.name "사용자명" 
사용자명을 등록합니다 (필수)
git config --global user.email "이메일주소" 
이메일 주소를 등록합니다. (필수)
git config --global color.ui “auto”
터미널에 표시되는 메시지에 칼라를 표시해줌


git에 대해서 사전에 알아야 될 부분은 아래와 같습니다.

  • git의 저장소는 3가지 단계로 나누어 집니다. 커밋한 소스가 보관되는 저장소와 현재 프로젝트 파일들이 있는 작업트리, 저장소와 작업트리사이의 버퍼영역으로 커밋될 대상이 저장되는 스테이징 영역입니다.
  • git은 빈 디렉토리는 추적하지 않습니다.
  • 형상관리를 하지 않을 파일은 .gitignore 파일에 추가합니다.
  • HEAD는 현재 브랜치의 가장 최신커밋을 의미한다.
  • 기본원격 저장소를 origin이라고 부릅니다.





기본적인 명령어
git --version
현재 git의 버전을 확인합니다.

git init
현재 디렉토리에 git 저장소를 생성합니다.

git add 파일명
git add는 2가지를 하는데 untracked files의 파일들을 git가 추적하도록 하거나 파일은 수정했지만 아직 스테이징 영역에 올라가지 않은(Changed but not updated) 파일들을 스테이징 영역에 올립니다. -i 옵션을 주면 대화형모드가 시작되며 파일의 일부분만 선택해서 스테이징하는 것이 가능합니다. -p 옵션을 사용하면 -i 대화형모드없이 바로 패치모드를 사용할 수 있습니다.

git commit -m "커밋메시지"
스테이징 영역에 올라가 있는 파일들을 커밋합니다. -m 은 커밋메시지를 주는 옵션으로 여러 줄의 커밋메시지를 쓸 경우 -m 을 여러개 사용할 수 있습니다. -a 옵션을 사용하면 스테이징에 올리는 작업과 커밋을 동시에 할 수 있습니다.(추적되지 않는 파일은 추가하지 않습니다.) -m을 사용하지 않을때 -v옵션을 사용하면 편집기에 커밋하려는 변경사항의 다른점을 보여줍니다. 특정파일만 커밋하려면 마지막에 파일명을 추가해주면 됩니다.

git commit -C HEAD -a --amend
지정한 커밋의 로그메시지를 다시 사용하여 기존커밋을 수정합니다. -c를 사용하면 기존메시지를 수정할 수 있는 편집기를 실행해 줍니다.

git status
커밋되지 않은 변경사항을 조회합니다.

git diff
스테이징영역과 현재 작업트리의 차이점을 보여줍니다. --cached 옵션을 추가하면 스테이징영역과 저장소의 차이점을 볼 수 있다. git diff HEAD를 입력하면 저장소, 스테이징영역, 작업트리의 차이점을 모두 볼 수 있다. 파라미터로 log와 동일하게 범위를 지정할 수 있으며 --stat를 추가하면 변경사항에 대한 통계를 볼 수 있습니다.

git mv 파일명 새파일명
기존에 존재하는 파일을 새파일로 이동합니다. 변경이력은 그대로 유지합니다.

git checkout -- 파일명
아직 스테이징이나 커밋을 하지 않은 파일의 변경내용을 취소하고 이전 커밋상태로 돌립니다. svn에서 revert와 동일합니다.




Branch와 Tag
git branch
현재 존재하는 브랜치를 조회합니다. -r 옵션을 사용하면 원격저장소의 브랜치를 확인할 수 있습니다. 

git branch 브랜치명B 브랜치명A
브랜치명A에서 새로운 브랜치 브랜치명B를 만듭니다. (git에서 기본 브랜치는 master라는 이름을 사용합니다.)

git branch 브랜치명
브랜치명의 새로운 브랜치를 만듭니다.(체크아웃은 하지 않습니다.)

git branch -d 브랜치명
브랜치를 삭제합니다.

git branch -m 존재하는브랜치명 새로운브랜치명
존재하는 브랜치를 새로운브랜치로 변경합니다. 이미 존재하는 브랜치명이 있을 경우에는 에러가 나는데 -M 옵션을 사용하면 이미 있는 브랜치의 경우에도 덮어씁니다.

git tag 태그명 브랜치명
브랜치명의 현재시점에 태그명으로 된 태그를 붙힙니다. git tag만 입력하면 현재 존재하는 태그 목록을 볼 수 있습니다.

git checkout 브랜치명/태그명
해당 브랜치나 태그로 작업트리를 변경합니다. 

git checkout -b 브랜치명B 브랜치명A
브랜치명A에서 브랜치명B라는 새로운 브랜치를 만들면서 체크아웃을 합니다.

git rebase 브랜치명
브랜치명의 변경사항을 현재 브랜치에 적용합니다.

git merge 브랜치명
브랜치명의 브랜치를 현재 브랜치로 합칩니다. --squash 옵션을 주면 브랜치명의 모든 커밋을 하나의 커밋으로 만듭니다.

git cherry-pick 커밋명
커밋명의 특정 커밋만을 선택해서 현재 브랜치에 커밋으로 만듭니다. -n 옵션을 주면 작업트리에 합치지만 커밋은 하지 않기 때문에 여러개의 커밋을 합쳐서 커밋할 수 있습니다.




로그 관리
git log
커밋로그들을 볼 수 있으면 -1나 -2같은 옵션을 주어 출력할 커밋로그의 갯수를 지정할 수 있습니다. --pretty=oneline 옵션을 주면 한줄로 간단히 보여주고 --pretty=format:"%h %s"처럼 형식을 정해줄 수 있습니다. -p 옵션을 사용하면 변경된 내용을 같이 보여줍니다. --since="5 hours" 이나 --before="5 hours"같은 옵션도 사용가능합니다. --graph 옵션을 주면 브랜치 트리를 볼 수 있습니다.

git log 커밋명
해당 커밋명의 로그를 볼 수 있습니다. 커밋명A..커밋명B (마침표2개)와 같이 입력하면 커밋명A이후부터 커밋명B까지의 로그를 볼 수 있습니다. ^은 -1과 동일해서 HEAD^라고 하면 최신바로 이전 커밋이고 HEAD^^^와 같이 쓸 수 있으며 HEAD~3을 하면 HEAD의 3개 이전의 커밋을 뜻합니다.

git blame 파일명
갈 줄 앞에 커밋명과 커밋한 사람등의 정보를 볼 수 있습니다.

git blame -L 10,15 파일명
-L 옵션을 사용하면 10줄부터 15줄로 범위를 지정해서 볼수 있고 15대신 +5와 같이 사용할 수 있습니다. 숫자의 범위 대신 정규식도 사용이 가능합니다.

git blame -M 파일명
-M 옵션을 사용하면 반복되는 패턴을 찾아서 복사하거나 이동된 내용을 찾아줍니다.  -C -C 옵션을 사용하면 파일간의 복사한 경우를 찾아줍니다. -C -C는 git log에서도 사용가능하며 내용의 복사를 찾을때는 git log에서 -p옵션을 사용합니다.

git revert 커밋명
기존의 커밋에서 변경한 내용을 취소해서 새로운 커밋을 만듭니다. -n옵션을 사용하면 바로 커밋하지 않기 때문에 revert를 여러번한 다음에 커밋할 수 있습니다.(항상 최신의 커밋부터 revert해야 합니다.)

git reset 커밋명
이전 커밋을 수정하기 위해서 사용합니다. --soft 옵션을 사용하면 이전 커밋을 스테이징하고 커밋은 하지 않으며 --hard옵션은 저장소와 작업트리에서 커밋을 제거합니다. git reset HEAD^와 같이 입력하면 최근 1개의 커밋을 취소할 수 있습니다.

git rebase -i 커밋범위
-i옵션으로 대화형모드로 커밋 순서를 변경하거나 합치는 등의 작업을 할 수 있습니다.




원격저장소
git clone 저장소주소 폴더명
원격저장소를 복제하여 저장소를 생성합니다. 폴더명을 생략가능합니다.

git fetch
원격저장소의 변경사항 가져와서 원격브랜치를 갱신합니다.
 
git pull
git fetch에서 하는 원격저장소의 변경사항을 가져와서 지역브랙치에 합치는 작업을 한꺼번에 합니다. 파라미터로 풀링할 원격저장소와 반영할 지역브랜치를 줄 수 있습니다.

git push
파라미터를 주지 않으면 origin 저장소에 푸싱하며 현재 지역브랜치와 같은 이름의 브랜치에 푸싱합니다. --dry-run 옵션을 사용하면 푸싱된 변경사항을 확인할 수 있습니다. 로컬에서 tag를 달았을 경우에 기본적으로 푸싱하지 않기 때문에 git push origin 태그명이나 모든 태그를 올리기 위해서 git push origin --tags를 사용해야 합니다.

git remote add 이름 저장소주소
새로운 원격 저장소를 추가합니다.

git remote
추가한 원격저장소의 목록을 확인할 수 있습니다.

git remote show 이름
해당 원격저장소의 정보를 볼 수 있습니다.

git remote rm 이름
원격저장소를 제거합니다.




서브모듈
git submodule
연관된 하위모듈을 확인할 수 있습니다.

git submodule add 저장소주소 서브모듈경로
새로운 하위모듈을 해당경로에 추가합니다. 추가만하고 초기화 하지는 않으며 커밋해쉬앞에 마이나스(-) 표시가 나타납니다.

git submodule init 서브모듈경로
서브모듈을 초기화 합니다.

git submodule update 서브모듈경로
서브모듈의 변경사항을 적용합니다.(저장소의 최신커밋을 추적하지 않습니다.)




기타 명령어
git archive --format=tar --prefix=폴더명/ 브랜치혹은태그 | gzip > 파일명.tar.gz
git archive --format=zip --prefix=폴더명/ 브랜치혹은태그 > 파일명.zip
해당 브랜치나 태그를 압축파일로 만듭니다. --prefix를 주면 압축하일이 해당폴더 안에 생성되도록 할 수 있습니다.

git mergetool
설정에 merge.tool의 값에 있는 머지툴을 찾아서 실행합니다.

git gc
저장소의 로그를 최적화 합니다. 로그가 변경되지는 않고 저장하는 방식만 최적화 합니다. --aggressive 옵션을 주면 더 자세하게 최적화합니다.

git rev-parse --show-toplevel
git 저장소내에서 입력하면 루트디렉토리를 알려줍니다.



출처 : https://blog.outsider.ne.kr/572

저작자표시 비영리 (새창열림)

'Programming > Git, Docker' 카테고리의 다른 글

Docker image를 저장/배포하자  (0) 2019.09.16
도커를 사용하여 환경을 구축하자.  (0) 2019.09.02
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

cin 의 버퍼를 지워보자

Programming/C, C++, MFC 2017. 11. 21. 11:17




cin으로 입력을 받던 도중 잘못된 입력이 들어올 경우 문제가 되는 경우가 있다.

이때 한번만 입력을 잘못 받고 끝나면 다행이지만 cin의 버퍼에 잘못 입력된 값이 남아있어서

이후 입력까지 계속 문제가 되곤 한다.


이럴 경우에는 cin의 버퍼를 지워주는 작업이 필요하다.


예를들어 nNumber 라는 int 형 변수에 숫자를 입력 받고자 하는데 문자가 입력되어 자료형이 맞지 않을경우

에러가 발생한다


  1. int nNumber = -1;
  2. while (true)
  3. {
  4.     cin >> nNumber;
  5.     if (cin.fail())
  6.     {
  7.         cout << "error" << endl;
  8.     }
  9. }


이와 같은 경우 nNumber에 정수형 값이 아닌 다른 값이 들어 올 경우 에러가 발생하고 cin의 에러비트가 활성화 되어

경고 메세지를 출력한다. 

하지만 cin의 버퍼에는 여전히 다른 값이 남아있기 때문에 while 문에 의하여 경고메세지를 반복해서 출력한다.


이럴 경우 에러비트를 초기화 해주는 clear() 함수와 버퍼값을 비워주는 ignore() 함수를 사용하면 된다.

clear()는 파라미터 없이 에러비트를 초기화 해 주는 역할을 하며

ignore는 첫번째 파라미터가 입력받을 문자열 길이, 두번째 파라미터가 종료문자이다.

첫번째 파라미터로 입력받은 길이만큼 혹은 두번째 파라미터로 입력받은 종료문자가 들어오면 읽기를 중단하는 역할을 한다.

문자열의 길이는 적당히 충분한 값을 주면 되고, 종료문자로는 일반적으로 개행문자 (\n)을 사용하면 된다.

즉 엔터를 통해 입력이 종료되면 그 시점까지만 입력을 받겠다는 의미가 된다.


두 함수를 추가하여 아래와 같이 사용을 하면 에러 비트초기화와 버퍼 초기화를 통해 

반복적인 에러 메세지 출력을 막을 수 있다.


  1. int nNumber = -1;
  2. while (true)
  3. {
  4.     cin >> nNumber;
  5.     if (cin.fail())
  6.     {
  7.         cout << "error" << endl;
  8.         cin.clear();
  9.         cin.ignore(INT_MAX, '\n');
  10.     }
  11. }



저작자표시 비영리 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

cout을 이용할때 출력 정밀도를 제어해 보자  (0) 2018.07.26
메모리 동적할당 예시  (0) 2018.04.18
'제약 조건과 일치하는 올바른 내보내기를 찾을 수 없습니다' 해결방법  (0) 2017.10.16
프로그램 배포시 아이콘과 MFC dll 관련 설정  (0) 2017.06.08
class를 포함한 dll 만들기 ( 클래스 동적 라이브러리 )  (1) 2016.05.17
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

'제약 조건과 일치하는 올바른 내보내기를 찾을 수 없습니다' 해결방법

Programming/C, C++, MFC 2017. 10. 16. 16:04




잘 쓰던 Visual Studio 프로젝트가 어느날 갑자기 제약조건과 일치하는 올바른 내보내기를 찾을수 없다며

열리지 않는 경우가 발생


뭔가 꼬인건가 싶어서 비주얼스튜디오를 새로 설치하려다 검색부터..


딱 해결 방법이 나오길래 다음번에 이런 상황이 발생 할 때를 대비하여 여기에도 기록.



 제약 조건과 일치하는 올바른 내보내기를 찾을 수 없습니다.

               ContractName 
Microsoft.VisualStudio.Text.ITextDocumentFactoryService 
               RequiredTypeIdentity

Microsoft.VisualStudio.Text.ITextDocumentFactoryService



이러한 에러가 발생 할 경우

C:\Users\컴퓨터이름\AppData\Local\Microsoft\VisualStudio\[본인VS버전]

경로로 이동 후 ComponentModelCache 폴더를 삭제 후 재실행 하면 정상 동작한다.



도움받은 블로그 : http://doriyun.tistory.com/7

저작자표시 비영리 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

메모리 동적할당 예시  (0) 2018.04.18
cin 의 버퍼를 지워보자  (3) 2017.11.21
프로그램 배포시 아이콘과 MFC dll 관련 설정  (0) 2017.06.08
class를 포함한 dll 만들기 ( 클래스 동적 라이브러리 )  (1) 2016.05.17
visual studio 프로젝트 및 솔루션 이름을 변경하기.  (0) 2016.05.17
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

프로그램 배포시 아이콘과 MFC dll 관련 설정

Programming/C, C++, MFC 2017. 6. 8. 15:55




MFC 기반의 프로그램을 배포하다 보면 심심치않게 dll 이 없어서 문제가 되는 경우가 있다.


일반적으로는 MS 재배포패키지를 설치하면 이런 문제는 해결 되지만 이는 사용자가 다시 한번 작업을 해야하는

번거로움이 있고 일부 환경에서는 설치가 불가능한 경우도 있다.


이럴 경우를 대비하여 MFC 관련 dll을 정적으로 사용하는 방법 정리.


프로젝트속성 - 구성속성 -일반 - MFC사용 의 값을 Static Library로 변경


MFC 관련 dll이 정적으로 포함되면서 실행파일의 크기는 조금 더 커지지만

dll 관련하여 실행상 문제는 해결 되니 이 방법을 사용하도록 하자.



또 아이콘을 설정 할 경우 이전에는 ico 파일을 프로젝트에서 리소스로 불러다 연결했었는데

이 경우 다른 환경으로 프로젝트 채로 복사하는 경우 ico 파일이 없어서 문제가 발생하곤 한다.

프로젝트 폴더 - res - XX.ico 파일을 사용하고자 하는 파일로 변경하면 프로젝트 복사할 때 ico 파일 빼먹어서

문제가 되는 경우를 예방할 수 있다.


저작자표시 비영리 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

cin 의 버퍼를 지워보자  (3) 2017.11.21
'제약 조건과 일치하는 올바른 내보내기를 찾을 수 없습니다' 해결방법  (0) 2017.10.16
class를 포함한 dll 만들기 ( 클래스 동적 라이브러리 )  (1) 2016.05.17
visual studio 프로젝트 및 솔루션 이름을 변경하기.  (0) 2016.05.17
HTTP 프로토콜을 이용하여 웹상의 파일을 다운로드 하자.  (0) 2016.03.09
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

taskkill 명령어를 이용하여 프로세스를 강제종료하자

Programming/Windows 2017. 2. 16. 12:37




자주 발생하진 않지만 프로그램 동작중에 얘기치 못하게 프로세스가 죽는 경우가 있다.


죽으면서 깔끔하게 죽어주면 다행이지만 여러 dll들을 물고 있는 상태로 죽어버리면 삭제/수정도 불가능해서 

난감한 경우가 가끔 있다.


작업관리자에 보이면 상관이 없는데 작업관리자에서는 보이지도 않고 백그라운드에서 뭔가를 물고있으니

참 답답한 노릇이지..


이럴때 로그오프나 재부팅을 통해 프로세스를 초기화 하는 방법을 썼었는데 너무 불편해서 찾다가 알게 된 방법


명령프롬프트에서 taskkill 명령어를 통해 프로세스를 강제종료 할 수 있다.


taskkill /f /im filename.exe

taskkill /f /pid 00000


여기서 /f 는 강제종료, /im은 이미지이름을 사용한다는것, /pid는 프로세스 pid 값을 사용하여 종료하겠다는 의미이다.


추가적으로 실행중인 프로세스 리스트를 보고싶을때는


tasklist 명령어를 이용한다.


중복된 프로세스일 경우 해당 프로세스가 사용중인 서비스 명을 확인해서 어떤 녀석인지 찾을 수 있는데

이때는 /svc 옵션을 추가로 주면 된다.


tasklist /svc



저작자표시 비영리 (새창열림)

'Programming > Windows' 카테고리의 다른 글

Picture Control에 영상 출력하기.  (0) 2015.05.27
CWnd <- -> HWND  (0) 2015.05.27
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

파이썬에 GUI를 입혀보자. PyQT

Programming/Python 2016. 12. 13. 15:18





한동안 MFC를 이용해서 프로그램 만들다 파이썬 쓰려니까 가장 첫번째로 걸리는게 GUI가 없다는 점이었다.


이런 문제를 해결 할 수 있는 좋은 방법! PyQT 를 이용하면 MFC 처럼 쉽게 GUI를 구성할 수 있다.


다음번을 위해 기록해 둬야지 안그러면 또 못찾고 헤멜것이 분명하다.



1. 먼저 PyQT를 설치

https://www.riverbankcomputing.com/software/pyqt/download

위 사이트에서 다운로드 가능하다. 

PyQT5 버전부터는 파이썬 3버전만을 지원하기 때문에

파이썬 2.7 버전을 이용하는 경우는 PyQT4 버전을 이용하면 된다.

윈도우에서는 운영체제에 맞게 설치파일 다운받아 설치하면 되고

리눅스에서는 apt-get 을 이용하여 설치 가능하다고 한다 (이건 안해봄..)


2. GUI 구성

간단한 형태는 python 상에서 코드로 직접 구현 해도 되지만 형태가 복잡해지고

프로젝트가 커지면 코드로 직접 구현하기는 점점 더 어려워지겠지..

Designer 라는프로그램을 이용하여 직접 gui를 구축 해 보자.




MFC와 마찬가지로 필요한 옵션들 끌어다 자리잡고 이름 설정하고 옵션설정하고.. 뭐 그정도..

GUI 틀을 다 만들면 파일을 *.ui 로 저장한다.


3. ui 파일을 py파일로 변환하기

다 만든 ui 파일을 파이썬에서 사용하도록 py파일로 변환이 필요하다.

변환은 pyuic4 를 통해 수행한다. 이 파일은 designer 가 설치된 경로에 있다

(/python_path/lib/site-packages/PyQt4/)


아래 명령어를 통해 ui 파일을 py 파일로 변환한다.

>> pyuic4 "*.ui파일" -o "py파일명" 


변환을 수행하면 위 사진과 같은 GUI는 아래와 같은 파이썬 코드로 변환된다.

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'firstUI.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s

try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)

class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(400, 300)
self.gridLayout = QtGui.QGridLayout(Dialog)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.pushButton_Up = QtGui.QPushButton(Dialog)
self.pushButton_Up.setObjectName(_fromUtf8("pushButton_Up"))
self.gridLayout.addWidget(self.pushButton_Up, 1, 0, 1, 1)
self.pushButton_Down = QtGui.QPushButton(Dialog)
self.pushButton_Down.setObjectName(_fromUtf8("pushButton_Down"))
self.gridLayout.addWidget(self.pushButton_Down, 1, 1, 1, 1)
self.lcdNumber = QtGui.QLCDNumber(Dialog)
self.lcdNumber.setObjectName(_fromUtf8("lcdNumber"))
self.gridLayout.addWidget(self.lcdNumber, 0, 0, 1, 2)

self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)

def retranslateUi(self, Dialog):
Dialog.setWindowTitle(_translate("Dialog", "Dialog", None))
self.pushButton_Up.setText(_translate("Dialog", "Up", None))
self.pushButton_Down.setText(_translate("Dialog", "Down", None))

4. 파이썬에서 py 파일 이용하여 GUI 연결하기

3번에서 생성된 py파일을 import하고 버튼은 함수랑 연결해주고 뭐 남은 작업들 코딩하면 된다.

나는 연습삼아 업다운 카운터를 구현. 

업다운 버튼을 통해 LCDCounter 숫자가 증감하도록 구현하였다.


그 코드는 아래와 같다.

# -*- encoding: UTF-8 -*-
from PyQt4.QtGui import *
import firstUI

class XDialog(QDialog, firstUI.Ui_Dialog):
def __init__(self):
QDialog.__init__(self)
# setupUi() 메서드는 화면에 다이얼로그 보여줌
self.setupUi(self)

# 버튼과 함수 매핑
self.pushButton_Up.clicked.connect(self.upCount)
self.pushButton_Down.clicked.connect(self.downCount)

def upCount(self):
self.lcdNumber.display(self.lcdNumber.value()+1)
print 'Up'

def downCount(self):
self.lcdNumber.display(self.lcdNumber.value() - 1)
print 'Down'


# App
app = QApplication([])
dialog = XDialog()
dialog.show()
app.exec_()


다른 기능들도 연습 해 봐야지.. 

저작자표시 비영리 (새창열림)

'Programming > Python' 카테고리의 다른 글

os.path 모듈 사용법  (0) 2018.03.05
파이썬2 와 파이썬3을 동시에 동작시키자 : __future__  (0) 2018.01.19
자주사용되는 파이썬 라이브러리  (0) 2016.11.09
python 에서 pass 와 continue의 차이점.  (0) 2016.07.15
파이썬에서 main() 함수는 어디에 있는가?  (0) 2016.06.30
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

자주사용되는 파이썬 라이브러리

Programming/Python 2016. 11. 9. 10:06




파이썬 외부 라이브러리를 찾아보다 점프투파이선 정리가 잘 되어있는 위키를 발견.
나중에 주소 찾기 힘드니까 여기에 저장.
원문 주소는 여기


sys

sys 모듈은 파이썬 인터프리터가 제공하는 변수들과 함수들을 직접 제어할 수 있게 해주는 모듈이다.

명령 행에서 인수 전달하기 - sys.argv

C:/User/home>python test.py abc pey guido

도스 창에서 위의 예처럼 test.py 뒤에 또 다른 값들을 함께 넣어 주면 sys.argv라는 리스트에그 값들이 추가된다.

예제를 따라 하며 확인해 보자. 우선 다음과 같은 파이썬 프로그램을 작성하자. argv_test.py 파일은 C:/Python/Mymoduels 디렉터리에 저장했다고 가정한다(만약 C:/Python/Mymoduels 디렉터리가 없다면 먼저 생성하고 진행하자).

# argv_test.py
import sys
print(sys.argv)

도스 창에서 다음과 같이 실행해 보자.

C:/Python/Mymodules>python argv_test.py you need python
['argv_test.py', 'you', 'need', 'python']

python이라는 명령어 뒤의 모든 것들이 공백을 기준으로 나뉘어서 sys.argv 리스트의 요소가 됨을 알 수 있다.

(※ 도스 창에서는 /, \든 상관없지만, 소스코드 안에서는 반드시 / 또는 \\ 기호를 사용해야 한다.)

강제로 스크립트 종료하기 - sys.exit

>>> sys.exit()

sys.exit는 Ctrl+Z나 Ctrl+D를 눌러서 대화형 인터프리터를 종료하는 것과 같은 기능을 한다. 프로그램 파일 내에서 사용하면 프로그램을 중단시킨다.

자신이 만든 모듈 불러와 사용하기 - sys.path

sys.path는 파이썬 모듈들이 저장되어 있는 위치를 나타낸다. 즉, 이 위치에 있는 파이썬 모듈들은 경로에 상관없이 어디에서나 불러올 수가 있다.

다음은 그 실행 결과이다.

>>> import sys
>>> sys.path
['', 'C:\\Windows\\SYSTEM32\\python35.zip', 'c:\\Python35\\DLLs', 
'c:\\Python35\\lib', 'c:\\Python35', 'c:\\Python35\\lib\\site-packages']
>>>

위의 예에서 ''는 현재 디렉터리를 말한다.

# path_append.py
import sys
sys.path.append("C:/Python/Mymodules")

위와 같이 파이썬 프로그램 파일에서 sys.path.append를 이용해 경로명을 추가할 수 있다. 이렇게 하고 난 후에는 C:/Python/Mymodules라는 디렉터리에 있는 파이썬 모듈을 불러와서 사용할 수가 있다.

pickle

pickle은 객체의 형태를 그대로 유지하면서 파일에 저장하고 불러올 수 있게 하는 모듈이다. 다음 예는 pickle 모듈의 dump 함수를 이용하여 딕셔너리 객체인 data를 그대로 파일에 저장하는 방법을 보여 준다.

>>> import pickle
>>> f = open("test.txt", 'wb')
>>> data = {1: 'python', 2: 'you need'}
>>> pickle.dump(data, f)
>>> f.close()

다음은 pickle.dump에 의해 저장된 파일을 pickle.load를 이용해서 원래 있던 딕셔너리 객체(data) 상태 그대로 불러오는 예이다.

>>> import pickle
>>> f = open("test.txt", 'rb')
>>> data = pickle.load(f)
>>> print(data)
{2:'you need', 1:'python'}

위의 예에서는 딕셔너리 객체를 이용하였지만 어떤 자료형이든 상관없이 저장하고 불러올 수 있다.

OS 모듈

OS 모듈은 환경 변수나 디렉터리, 파일 등의 OS 자원을 제어할 수 있게 해주는 모듈이다.

내 시스템의 환경 변수값을 알고 싶을 때 - os.environ

시스템은 제각기 다른 환경 변수값을 가지고 있는데, os.environ은 현재 시스템의 환경 변수 값들을 보여 준다. 다음을 따라 해보자.

>>> import os
>>> os.environ
environ({'PROGRAMFILES': 'C:\\Program Files', 'APPDATA': … 생략 …})
>>>

위의 결과값은 필자의 시스템 정보이다. os.environ은 환경 변수에 대한 정보를 딕셔너리 객체로 리턴한다. 자세히 보면 여러 가지 유용한 정보를 찾을 수 있다.

리턴받은 객체가 딕셔너리이기 때문에 다음과 같이 호출할 수 있다. 다음은 필자 시스템의 PATH 환경 변수에 대한 내용이다.

>>> os.environ['PATH']
'C:\\ProgramData\\Oracle\\Java\\javapath;...생략...'

디렉터리 위치 변경하기 - os.chdir

os.chdir을 이용하면 아래와 같이 현재 디렉터리의 위치를 변경할 수 있다.

>>> os.chdir("C:\WINDOWS")

디렉터리 위치 리턴받기 - os.getcwd

os.getcwd는 현재 자신의 디렉터리 위치를 리턴한다.

>>> os.getcwd()
'C:\WINDOWS'

시스템 명령어 호출하기 - os.system

시스템 자체의 프로그램이나 기타 명령어들을 파이썬에서 호출할 수도 있다. os.system("명령어")처럼 사용한다. 다음은 현재 디렉터리에서 시스템 명령어인 dir을 실행하는 예이다.

>>> os.system("dir")

실행한 시스템 명령어의 결과값 리턴받기 - os.popen

os.popen은 시스템 명령어를 실행시킨 결과값을 읽기 모드 형태의 파일 객체로 리턴한다.

>>> f = os.popen("dir")

읽어 들인 파일 객체의 내용을 보기 위해서는 다음과 같이 하면 된다.

>>> print(f.read())

기타 유용한 os 관련 함수

함수설명
os.mkdir(디렉터리)디렉터리를 생성한다.
os.rmdir(디렉터리)디렉터리를 삭제한다.단, 디렉터리가 비어있어야 삭제가 가능하다.
os.unlink(파일)파일을 지운다.
os.rename(src, dst)src라는 이름의 파일을 dst라는 이름으로 바꾼다.

shutil

shutil은 파일을 복사해 주는 파이썬 모듈이다.

파일 복사하기 - shutil.copy(src, dst)

src라는 이름의 파일을 dst로 복사한다. 만약 dst가 디렉터리 이름이라면 src라는 파일 이름으로 dst라는 디렉터리에 복사하고 동일한 파일 이름이 있을 경우에는 덮어쓴다.

다음의 예를 보자.

>>> import shutil
>>> shutil.copy("src.txt", "dst.txt")

위 예를 실행해 보면 src.txt 파일과 동일한 내용의 파일이 dst.txt로 복사되는 것을 확인할 수 있다.

glob

가끔 파일을 읽고 쓰는 기능이 있는 프로그램을 만들다 보면 특정 디렉터리에 있는 파일 이름 모두를 알아야 할 때가 있다. 이럴 때 사용하는 모듈이 바로 glob이다.

디렉터리에 있는 파일들을 리스트로 만들기 - glob(pathname)

glob 모듈은 디렉터리 내의 파일들을 읽어서 리턴한다. *, ? 등의 메타 문자를 써서 원하는 파일만 읽어 들일 수도 있다.

다음은 C:/Python이라는 디렉터리에 있는 파일 중 이름이 문자 q로 시작하는 파일들을 모두 찾아서 읽어 들이는 예이다.

>>> import glob
>>> glob.glob("C:/Python/q*")
['C:\Python\quiz.py', 'C:\Python\quiz.py.bak']
>>>

tempfile

파일을 임시로 만들어서 사용할 때 유용한 모듈이 바로 tempfile이다. tempfile.mktemp()는 중복되지 않는 임시 파일의 이름을 무작위로 만들어서 리턴한다.

>>> import tempfile
>>> filename = tempfile.mktemp()
>>> filename
'C:\WINDOWS\TEMP\~-275151-0'

tempfile.TemporaryFile()은 임시 저장 공간으로 사용될 파일 객체를 리턴한다. 이 파일은 기본적으로 바이너리 쓰기 모드(wb)를 갖는다. f.close()가 호출되면 이 파일 객체는 자동으로 사라진다.

>>> import tempfile
>>> f = tempfile.TemporaryFile()
>>> f.close()

time

시간과 관련된 time 모듈에는 유용한 함수가 굉장히 많다. 그중에서 가장 유용한 몇 가지만 알아보자.

time.time

time.time()은 UTC(Universal Time Coordinated 협정 세계 표준시)를 이용하여 현재 시간을 실수 형태로 리턴하는 함수이다. 1970년 1월 1일 0시 0분 0초를 기준으로 지난 시간을 초 단위로 리턴한다.

>>> import time
>>> time.time()
988458015.73417199

time.localtime

time.localtime은 time.time()에 의해서 반환된 실수값을 이용해서 연도, 달, 월, 시, 분, 초,.. 의 형태로 바꾸어 주는 함수이다.

>>> time.localtime(time.time())
time.struct_time(tm_year=2013, tm_mon=5, tm_mday=21, tm_hour=16,
    tm_min=48, tm_sec=42, tm_wday=1, tm_yday=141, tm_isdst=0)

time.asctime

위의 time.localtime에 의해서 반환된 튜플 형태의 값을 인수로 받아서 날짜와 시간을 알아보기 쉬운 형태로 리턴하는 함수이다.

>>> time.asctime(time.localtime(time.time()))
'Sat Apr 28 20:50:20 2001'

time.ctime

time.asctime(time.localtime(time.time()))은 time.ctime()을 이용해 간편하게 표시할 수 있다. asctime과 다른점은 ctime은 항상 현재 시간만을 리턴한다는 점이다.

>>> time.ctime()
'Sat Apr 28 20:56:31 2001'

time.strftime

time.strftime('출력할 형식 포맷 코드', time.localtime(time.time()))

strftime 함수는 시간에 관계된 것을 세밀하게 표현할 수 있는 여러 가지 포맷 코드를 제공한다.

시간에 관계된 것을 표현하는 포맷 코드

포맷코드설명예
%a요일 줄임말Mon
%A요일Monday
%b달 줄임말Jan
%B달January
%c날짜와 시간을 출력함06/01/01 17:22:21
%d날(day)[00,31]
%H시간(hour)-24시간 출력 형태[00,23]
%I시간(hour)-12시간 출력 형태[01,12]
%j1년 중 누적 날짜[001,366]
%m달[01,12]
%M분[01,59]
%pAM or PMAM
%S초[00,61]
%U1년 중 누적 주-일요일을 시작으로[00,53]
%w숫자로 된 요일[0(일요일),6]
%W1년 중 누적 주-월요일을 시작으로[00,53]
%x현재 설정된 로케일에 기반한 날짜 출력06/01/01
%X현재 설정된 로케일에 기반한 시간 출력17:22:21
%Y년도 출력2001
%Z시간대 출력대한민국 표준시
%%문자%
%y세기부분을 제외한 년도 출력01

다음은 time.strftime을 사용하는 예이다.

>>> import time
>>> time.strftime('%x', time.localtime(time.time()))
'05/01/01'
>>> time.strftime('%c', time.localtime(time.time()))
'05/01/01 17:22:21'

time.sleep

time.sleep 함수는 주로 루프 안에서 많이 사용된다. 이 함수를 사용하면 일정한 시간 간격을 두고 루프를 실행할 수 있다. 다음의 예를 보자.

#sleep1.py
import time
for i in range(10):
    print(i)
    time.sleep(1)

위 예는 1초 간격으로 0부터 9까지의 숫자를 출력한다. 위 예에서 볼 수 있듯이 time.sleep 함수의 인수는 실수 형태를 쓸 수 있다. 즉, 1이면 1초, 0.5면 0.5초가 되는 것이다.

calendar

calendar는 파이썬에서 달력을 볼 수 있게 해주는 모듈이다.

calendar.calendar(연도)로 사용하면 그 해의 전체 달력을 볼 수 있다. 결과값은 달력이 너무길어 생략하겠다.

>>> import calendar
>>> print(calendar.calendar(2015))

calendar.prcal(연도)를 사용해도 위와 똑같은 결과값을 얻을 수 있다.

>>> calendar.prcal(2015)

다음의 예는 2015년 12월의 달력만 보여 준다.

>>> calendar.prmonth(2015, 12)
December 2015
Mo Tu We Th Fr Sa Su
      2  3  4  5  6
7  8  9  10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

calendar.weekday

calendar 모듈의 또 다른 유용한 함수를 보자. weekday(연도, 월, 일) 함수는 그 날짜에 해당하는 요일 정보를 리턴한다. 월요일은 0, 화요일은 1, 수요일은 2, 목요일은 3, 금요일은 4, 토요일은 5, 일요일은 6이라는 값을 리턴한다.

>>> calendar.weekday(2015, 12, 31)
3

위의 예에서 2015년 12월 31일은 목요일임을 보여 준다.

calendar.monthrange

monthrange(연도, 월) 함수는 입력받은 달의 1일이 무슨 요일인지와 그 달이 며칠까지 있는지를 튜플 형태로 리턴한다.

>>> calendar.monthrange(2015,12)
(1, 31)

위의 예는 2015년 12월의 1일은 화요일이고, 이 달은 31일까지 있다는 것을 보여 준다.

날짜와 관련된 프로그래밍을 할 때 위의 2가지 함수는 매우 유용하게 사용된다.

random

random은 난수(규칙이 없는 임의의 수)를 발생시키는 모듈이다. random과 randint에 대해서 알아보자.

다음은 0.0에서 1.0 사이의 실수 중에서 난수값을 리턴하는 예를 보여 준다.

>>> import random
>>> random.random()
0.53840103305098674

다음 예는 1에서 10 사이의 정수 중에서 난수값을 리턴한다.

>>> random.randint(1, 10)
6

다음 예는 1에서 55 사이의 정수 중에서 난수값을 리턴한다.

>>> random.randint(1, 55)
43

random 모듈을 이용해서 재미있는 함수를 하나 만들어 보자.

# random_pop.py
import random
def random_pop(data):
    number = random.randint(0, len(data)-1)
    return data.pop(number)

if __name__ == "__main__":
    data = [1, 2, 3, 4, 5]
    while data: print(random_pop(data))
결과값:
2 
3 
1 
5 
4

위의 random_pop 함수는 리스트의 요소 중에서 무작위로 하나를 선택하여 꺼낸 다음 그 값을 리턴한다. 물론 꺼내진 요소는 pop 메서드에 의해 사라진다.

random_pop 함수는 random 모듈의 choice 함수를 사용하여 다음과 같이 좀 더 직관적으로 만들 수도 있다.

def random_pop(data):
    number = random.choice(data)
    data.remove(number)
    return number

random.choice 함수는 입력으로 받은 리스트에서 무작위로 하나를 선택하여 리턴한다.

리스트의 항목을 무작위로 섞고 싶을 때는 random.shuffle 함수를 이용하면 된다.

>>> import random
>>> data = [1, 2, 3, 4, 5]
>>> random.shuffle(data)
>>> data
[5, 1, 3, 4, 2]
>>>

[1, 2, 3, 4, 5]라는 리스트가 shuffle 함수에 의해 섞여서 [5, 1, 3, 4, 2]로 변한 것을 확인할 수 있다.

webbrowser

webbrowser는 자신의 시스템에서 사용하는 기본 웹 브라우저가 자동으로 실행되게 하는 모듈이다. 아래의 예제는 웹 브라우저를 자동으로 실행시키고 해당 URL인 http://google.com으로 가게 해준다.

>>> import webbrowser
>>> webbrowser.open("http://google.com")

webbrowser의 open 함수는 웹 브라우저가 이미 실행된 상태이면 입력 주소로 이동한다. 만약 웹 브라우저가 실행되지 않은 상태이면 새로 웹 브라우저를 실행한 후 해당 주소로 이동한다.

open_new 함수는 이미 웹 브라우저가 실행된 상태이더라도 새로운 창으로 해당 주소가 열리도록 한다.

>>> webbrowser.open_new("http://google.com")

[스레드를 다루는 threading 모듈]

컴퓨터에서 동작하고 있는 프로그램을 프로세스(Process)라고 한다. 보통 1개의 프로세스는 1가지 일만 하지만, 스레드를 이용하면 한 프로세스 내에서 2가지 또는 그 이상의 일을 동시에 수행하게 할 수 있다. 간단한 예제로 설명을 대신하겠다.

import threading
import time

def say(msg):
    while True:
        time.sleep(1)
        print(msg)

for msg in ['you', 'need', 'python']:
    t = threading.Thread(target=say, args=(msg,))
    t.daemon = True
    t.start()

for i in range(100):
    time.sleep(0.1)
    print(i)

첫 번째 for문에서 ['you', 'need', 'python']이라는 리스트의 요소 개수만큼 스레드가 생성되고, 생성된 스레드는 say 메서드를 수행하게 되어 1초에 한 번씩 입력으로 받은 msg 변수값을 리턴한다. 두 번째 for문은 매 0.1초마다 0부터 99까지 숫자를 출력하는데, 바로 이 부분이 메인 프로그램이 되며 이 메인 프로그램이 종료되는 순간 생성된 스레드들도 함께 종료가 된다. t.daemon = True와 같이 daemon 플래그를 설정하면 주 프로그램이 종료되는 순간 데몬 스레드도 함께 종료된다.

위 예제의 실행 결과값은 다음과 비슷할 것이다.

0
you
need
python
1
2
3
4
5
6
7
8
9
10
you
need
python
11
12
...

위 결과값에서 볼 수 있듯이 스레드는 메인 프로그램과는 별도로 실행되는 것을 확인할 수 있다.

이러한 스레드 프로그래밍을 가능하게 해주는 것이 바로 threading.Thread 클래스이다. 이 클래스의 첫번째 인수는 함수 이름을, 두 번째 인수는 첫 번째 인수인 함수의 입력 변수를 받는다. 다음과 같이 스레드를 클래스로 정의해도 동일한 결과를 얻을 수 있다.

import threading
import time

class MyThread(threading.Thread):
    def __init__(self, msg):
        threading.Thread.__init__(self)
        self.msg = msg
        self.daemon = True

    def run(self):
        while True:
            time.sleep(1)
            print(self.msg)

for msg in ['you', 'need', 'python']:
    t = MyThread(msg)
    t.start()

for i in range(100):
    time.sleep(0.1)
    print(i)

스레드를 클래스로 정의할 경우에는 __init__ 메서드에서 threading.Thread.__init__(self)와 같이 부모 클래스의 생성자를 반드시 호출해야 한다. MyThread로 생성된 객체의 start 메서드를 실행할 때는 MyThread 클래스의 run 메서드가 자동으로 수행된다.



저작자표시 비영리 (새창열림)

'Programming > Python' 카테고리의 다른 글

파이썬2 와 파이썬3을 동시에 동작시키자 : __future__  (0) 2018.01.19
파이썬에 GUI를 입혀보자. PyQT  (0) 2016.12.13
python 에서 pass 와 continue의 차이점.  (0) 2016.07.15
파이썬에서 main() 함수는 어디에 있는가?  (0) 2016.06.30
파이썬에서 코드 들여쓰기 정리를 자동으로 하자.  (4) 2016.06.15
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

python 에서 pass 와 continue의 차이점.

Programming/Python 2016. 7. 15. 17:11




파이썬에서 pass 와 continue의 개념을 잘 짚고 가야지.


continue는 loop에서 현재 행 이하의 구문은 실행 하지 않고 loop의 시작지점으로 돌아갈 경우 사용.


pass는 단순히 특별한 소스코드가 없고 지나갈 떄 사용한다.


예를들어 함수를 선언은 해 놨으나 아직 내용 정의 부분은 미구현인 경우 아무것도 써주지 않으면 에러가 나겠지만 pass 를 이용하여 작성은 하였으되 아무일도 하지않고 그냥 지나가는 역할을 할 수 있게 한다.


def test_pass(self):
pass


loop 에서 continue와 햇갈릴 수 있는데 pass의 경우 해당라인을 지나 이하 라인의 코드들을 실행하기 때문에 


continue와는 큰 차이를 갖는다고 할 수 있다.


예를들어 1~10 까지의 숫자 중 홀수만 출력 할 경우


# continue
i = 0
while i < 10:
i += 1
if i % 2 == 0:
continue
print i

# pass
i = 0
while i < 10:
i += 1
if i % 2 == 0:
pass
print i

언듯 보면 위 아래 둘다 홀수만 잘 출력 할 듯 하지만 아래의 구문은 모든 숫자를 출력한다.


위에서 보았듯이 pass는 continue와 달리 해당 라인만 건너 지나가기 때문에 아래에 위치한 print 문이 매번 실행되기 때문이다.

저작자표시 비영리 (새창열림)

'Programming > Python' 카테고리의 다른 글

파이썬에 GUI를 입혀보자. PyQT  (0) 2016.12.13
자주사용되는 파이썬 라이브러리  (0) 2016.11.09
파이썬에서 main() 함수는 어디에 있는가?  (0) 2016.06.30
파이썬에서 코드 들여쓰기 정리를 자동으로 하자.  (4) 2016.06.15
파이썬에서 조건문을 이용하자.  (0) 2016.06.13
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

파이썬에서 main() 함수는 어디에 있는가?

Programming/Python 2016. 6. 30. 17:58




파이썬을 처음 접하면서 프로그램의 시작점이 어디인가에 대한 궁금증이 생겼다.


뭐 결론적으로 정리하자면 

우선 파이선은 인터프리터 언어의 특성상 전체 코드의 시작부터 끝까지 모든 라인을 수행한다.

그렇기에 따로 메인 함수가 없는것. 


그렇다면 가끔 코드에서 보이는 if __name__ == '__main__'  이녀석의 정체는 무엇인가  


파이선 코드의 경우 인터프리터가 해당 코드를 불러서 직접 실행 할 수도 있고, 다른 파이썬 파일에서 

import로 불러다 사용할 경우도 있을 것이다.


인터프리터가 직접 실행하는 경우는 내부적으로 존재하는 __name__ 이라는 변수의 내용을 __main__으로 할당한다.


따라서 저 if문의 의미는 해당 코드가 인터프리터가 직접 실행 한 경우에 한해서만 수행하라는 의미가 된다.


마찬가지로, 저 범위에 들어 있는 내용은 다른 코드에서 import 하여 사용하는 경우에는 동작하지 않게 된다.



저작자표시 비영리 (새창열림)

'Programming > Python' 카테고리의 다른 글

자주사용되는 파이썬 라이브러리  (0) 2016.11.09
python 에서 pass 와 continue의 차이점.  (0) 2016.07.15
파이썬에서 코드 들여쓰기 정리를 자동으로 하자.  (4) 2016.06.15
파이썬에서 조건문을 이용하자.  (0) 2016.06.13
파이썬에서 사전을 사용해 보자 ( key, value )  (0) 2016.06.09
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

파이썬에서 코드 들여쓰기 정리를 자동으로 하자.

Programming/Python 2016. 6. 15. 09:52




비주얼 스튜디오를 사용할때 흔히 사용 하던 기능중에 Alt + F8 기능이 있다.


코드 중 들여쓰기 를 자동으로 정렬해 주는 기능이다.


파이참을 사용하면서 이런 기능이 없나 생각만 하고 있었는데 비슷한 기능을 하는 녀석이 있다.


파이참에서는 Ctrl + Alt + i 로 코드 자동정렬이 가능하다.


다만 주의할 점이 C 에서는 영역구분이 중괄호를 사용하여 명확한데 파이썬에서는 화이트스페이스로 구분하면서


자동 정렬 기능이 완벽하지 않은 듯 하다.


예를 들어 

def func(k):
k = k*10
return k

이런 함수 구문이 있다고 하자.


얘가 들여쓰기가 아래처럼 정렬되지 않았을 경우에...

def func(k):
k = k*10
return k

Ctrl + Alt + i 로 자동 정렬을 수행하면 

def func(k):
k = k*10
return k

return 문까지 자동 정렬 되기를 기대하였으나 return 은 자동 정렬되지 않더라..


예제에서 보이는 def 나 return 그리고 print 등과 같은 사전에 정의되어 있는 녀석들은 

맨 앞으로 정렬 하는 것이 기본설정 인 듯하다.


아무 생각없이 전체선택 하고 자동 정렬 할 경우 낭패를 볼 지도 모르겠다.. 조심해야지.



저작자표시 비영리 (새창열림)

'Programming > Python' 카테고리의 다른 글

python 에서 pass 와 continue의 차이점.  (0) 2016.07.15
파이썬에서 main() 함수는 어디에 있는가?  (0) 2016.06.30
파이썬에서 조건문을 이용하자.  (0) 2016.06.13
파이썬에서 사전을 사용해 보자 ( key, value )  (0) 2016.06.09
파이썬에서 리스트를 사용 하자.  (0) 2016.06.08
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

파이썬에서 조건문을 이용하자.

Programming/Python 2016. 6. 13. 09:42




파이썬에서 조건문은 C의 것과 매우 유사하다.


C 에서는 if / else if / else 로 구분 되던 조건문이

파이썬에서는 if / elif / else 로 사용된다는점.


그리고 조건문이 C에서는 괄호안에 표현하던 것을 괄호 없이 조건 서술 후  콜론으로 내용을 쓴다는점.


그리고 처음에 가장 적응 안됐던 C의 { } 중괄호로 영역 구분하던 것을 python에서는 들여쓰기로 조절한다는것..


기억 하도록 하자.


# if / elif / else
# C의 if / else if / else 와 동일한 조건문

'''
if 조건1:
수행 할 내용
elif 조건2:
수행 할 내용
else 조건3:
수행 할 내용
'''
nNumber = 3;

if nNumber > 5:
print "값이 5보다 큽니다."
elif nNumber > 3:
print "값은 4 또는 5 입니다"
else:
print "값은 1 또는 2 또는 3 입니다."

>> 값은 1 또는 2 또는 3 입니다.


저작자표시 비영리 (새창열림)

'Programming > Python' 카테고리의 다른 글

파이썬에서 main() 함수는 어디에 있는가?  (0) 2016.06.30
파이썬에서 코드 들여쓰기 정리를 자동으로 하자.  (4) 2016.06.15
파이썬에서 사전을 사용해 보자 ( key, value )  (0) 2016.06.09
파이썬에서 리스트를 사용 하자.  (0) 2016.06.08
파이썬 문자열 개행문자 제거하기  (3) 2016.06.03
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • »

카테고리

  • 살다보니.. (449)
    • 주절거림 (3)
    • 취미생활 (36)
      • 지식과 지혜 (3)
      • 풍경이 되어 (4)
      • Memories (17)
      • 엥겔지수를 높여라 (2)
    • mathematics (6)
      • Matrix Computation (2)
      • RandomProcesses (3)
    • English.. (8)
    • Programming (147)
      • C, C++, MFC (51)
      • C# (1)
      • OpenCV (17)
      • Python (58)
      • Git, Docker (3)
      • Matlab (4)
      • Windows (3)
      • Kinect V2 (2)
      • 기타 etc. (8)
    • 전공관련 (80)
      • Algorithm (6)
      • Deep Learning (54)
      • 실습 프로그램 (4)
      • 주워들은 용어정리 (8)
      • 기타 etc. (8)
    • Computer (118)
      • Utility (21)
      • Windows (31)
      • Mac (4)
      • Ubuntu, Linux (58)
      • NAS (2)
      • Embedded, Mobile (2)
    • IT, Device (41)
      • 제품 사용기, 개봉기 (14)
      • 스마트 체험단 신청 (27)
    • Wish List (3)
    • TISTORY TIP (5)
    • 미분류. 수정중 (1)

태그목록

  • matlab
  • 크롬
  • random variable
  • SVM
  • 에누리닷컴
  • 칼로리 대폭발
  • CStdioFile
  • 후쿠오카
  • matlab function
  • 갤럭시노트3
  • 딥러닝
  • 매트랩
  • utility
  • 오봉자싸롱
  • function
  • 스마트체험단
  • Deep Learning
  • ColorMeRad
  • portugal
  • DeepLearning
  • 일본
  • 포르투갈
  • LIBSVM
  • Computer Tip
  • ReadString
  • DSLR
  • review
  • Convolutional Neural Networks
  • 매트랩 함수
  • 큐슈

달력

«   2025/08   »
일 월 화 수 목 금 토
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
08-23 07:32

LATEST FROM OUR BLOG

RSS 구독하기

BLOG VISITORS

  • Total :
  • Today :
  • Yesterday :

Copyright © 2015 Socialdev. All Rights Reserved.

티스토리툴바