본문 바로가기

Study/Tips

파이썬과 C++ 차이점 정리

파이썬을 공부하면서 C++과 다른점들을 메모해두고 있다.

마지막 업데이트 : 2020.05.03 (댓글로 알려주신 내용 추가)

 

0. 기본 문법


C++은 int a, int b이렇게 해야하지만 파이썬은 그냥 a, b이렇게 쓴다.

또, 한번에 여러 개의 변수를 선언하는 방법도 다르다.

C++은 int a = 3, b = 2; 파이썬은 a,b = 2,3 이렇게 한다. 변수랑 값을 끼리끼리 모아놓는다.

 

추가) C++에서 파이썬처럼 선언하는 법 : auto[a,b,c] = make_tuple(1,3,5); 사용할땐 그냥 a b c 따로따로 쓰면된다. C++17부터 가능하다고 한다!

 

또한 파이썬은 ;과 {블록} 을 쓰지 않는다.

함수 범위는 들여쓰기(tab 혹은 space 4칸)으로 구분한다. 참 요상한 언어야....

 

논리연산자 :

c++은 && , || , !  이렇게 썼다. 파이썬은 말로 쓴다. and, or, not

C++에서 x < 10 && x > 0 이렇게 쓰던걸, 파이썬에선 0 < x < 10 이렇게만 써도된다! and 필요없음

댓글추가) c++에서도 and or not이 된다! 신기하다.

 

bool 연산자: 

C++에선 true / false

Python에선 True / False

 

전위,후위 연산자:

C++에선 a++, ++a 다 사용가능했다

파이썬은 안 된다!!!!! a+=1 이렇게만 된다.

 

str:

c++에서 맨날 하던거 : string str = ""

근데 파이썬에선ㄴㄴ 왜냐면 str이 클래스 이름이기 때문이다. string이아니고 str이라니. 심지어 소문자다.

 

Null:

C++이나 자바에서 보던 null, python은 none

 

cin, cout :

cin, cout 대신 input(), print()

신기한건 input("값을 입력하세요")이렇게 쓸 수도 있다.

cout << "값을입력"; cin >> val; 이걸 val = input("값입력") 하나로 단축가능!

print신기한것 : print("auto","띄어쓰기")처럼 ,로 연결하면 알아서 문자열 사이 띄워서 프린트한다.

또, 끝문자를 지정해줘야 다음줄로 안 넘어간다. print("끝문자지정", end=' ')

여러 값을 한번에 입력받을때는 변수1, 변수2 = input('문자열').split('기준문자열')

받아서 한번에 정수로 변환시키려면 변수1, 변수2 = map(int, input().split())

 

all, any:

파이썬 all()은 리스트같은 자료형에서 모두 true일때만 true 리턴

any()는 하나라도 true면 true리턴

 

divmod(a,b):
튜플형태로 (a//b, a%b)를 리턴

eval(expression):
expression을 실행. ex) eval(divmod(2,3)) # (1,1)리턴
보통 문자열로 명령을 입력받아서 쓴다고 한다

filter(condition 함수, data list):
condition함수값이 true인 data(딕셔너리, 리스트, 셋 이런거)만 리턴.
람다를 이용해서 간단하게 작성하는 예제: list(filter(lambda x: x > 0, [1, -3, 2, 0, -5, 6])) 

map(condition함수, data):
data를 condition함수를 처리한 결과값을 리턴한다
람다를 이용해서 간단하게 작성하는 예제 ; list(map(lambda a: a*2, [1, 2, 3, 4]))


sort(), sorted():
sort()는 정렬을 한다. sorted()는 정렬하고 그 결과를 리턴한다.

zip() : 
입력받은 자료끼리 묶어준다. 단 이때 자료의 길이는 같아야 한다.
list(zip([1, 2, 3], [4, 5, 6], [7, 8, 9]));
결과 :  [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

is, is not :

==, !=는 값 비교

is, not은 객체 비교.

자바에서 String끼리 비교할때 ==말고 .equals()쓰던것과 비슷하다고 생각하면 될 듯

 

1. 인터프리터 vs 컴파일러


파이썬은 인터프리터, C++은 컴파일 언어다(컴파일러가 필요하다).

파이썬은 한 줄씩 그때그때 실행하고, C++은 컴파일하는 과정에서 전체 코드를 한번 훑는다(컴파일).

컴파일할때 문법상의 오류가 있어 컴파일이 안 되면 IDE가 빨간줄을 그어준다.

 

 

2. 자료형과 사칙연산


파이썬은 int, float, string 이런 자료형타입을 적지 않는다. 그냥 a = 10하면 끝

그래서그런가, 정수끼리 사칙연산을 계산한 결과값이 바로 실수값으로 나온다.

 

C++ : 

int a = 10, b = 4; // a/b == 2

 

Python :

  a = 10, b = 4  # a/b == 2.5

 

파이썬에서 C나 C++처럼 정수형의 나누기 몫을 구하고 싶다면 //연산자를 이용해야 한다.

파이썬엔 제곱연산자도 있더라. **을 쓰면 제곱연산이다. 

a // b == 2 	#정수형 몫
a ** b == 10000 #10의 4제곱

 

 

 

 

3. 문자열


C++에서 문자열을 표기하려면 ""를 썼다. 문자 안에서 "를 표현하려면 \"(백슬래시 + ")를 이용하면 됐다.

파이썬도 마찬가지다. \"를 쓰면 문자열 안에서 "를 표현할 수 있다.

다만, 파이썬에선 문자열을 표현하는 방법 자체가 좀 다르다.

"로도 문자열을 묶을 수 있고, ''로도 가능하다. 심지어 """와 '''도 가능하다. """와 '''는 문자열 내에 '\n'이 포함된 경우에 쓴다. """나 '''를 쓰면 개행문자를 쓰는 대신 그냥 엔터로 구분해주면 된다.

multiline = " hello \n world!"

multiline = """			
	hello
	world!
	"""

 

파이썬에서는 문자열 사칙연산도 된다. 직관적이다.

문자열 + 문자열 == 더한 문자열
문자열 * n == n번만큼 문자열 반복

 

그리고 문자열 인덱스에 음수가 들어간다.  str[-1]을 하는데 오류가 안 난다! 뒤에서 첫번째 글자만을 나타낼 뿐이다. 와우. 원형큐처럼 인덱스가 빙글빙글 돌아간다. 신기하다. < str = "hello world", str[-1] == 'd' > 이렇게.

 

추가) C++에서도 파이썬처럼 """, '''을 쓰고싶으면 원시 문자열 리터럴을 사용하면 된다. 참고링크

R"구분자(쓸문자열 엔터도괜찮다)구분자";

 

 

결과

 

문자열 자르기

string str = "Hello world!" 에서 world만 뽑으려면
C++: substr(6, 5);    //substr(인덱스, 길이)
Python: str[6:11]     #문자열[begin, end)인덱스

두 언어 모두 파라미터 일부를 생략할 수 있다. C++은 길이 생략 (인덱스부터 끝까지 뽑아냄), python은 begin혹은 end생략(끝에서부터 기준점까지 뽑아냄)

 

 

문자열에서 한 글자 바꾸기

str = "hello world!"에서 !를 ?로 바꾸려면

C++은 그냥 str[11] = ?로 하면 됐다. 그럼 알아서 str이 hello world?로 바뀌었다.

하지만 파이썬은 안 된다. 파이썬에서 문자열 자료형은 immutable하기 때문이다.

따라서, 새로운 문자열을 만들어줘야 한다.

 

 

문자열 포맷팅 (printf %d)

C++ : printf("The num1 is %d and num2 is %d", 3, 7);
Python: "The num1 is %d and num2 is %d" % (3, 7)

,대신에 %를 써준다. (,)로 여러개를 묶어 쓴다. 물론 파이썬도 %d %s %c등 다 쓸 수 있다.

 

파이썬에서는 이런 포맷팅도 가능하다.

"The num1 is {0}".format(3)	# The num1 is 3
"{0} is better than {1}".format("Burgerking", "Lotteria") # Burgerking is better than lotteria
"I will play {name}".format(name="maplestory") # I will play maplestory

 

파이썬 3.6버전부터는 f문자열 포맷팅도 가능하다.

age = 10
f'내 나이는 {age}살이다'	# 내 나이는 10살이다

 

파이썬에는 문자열을 다루는 편리한 함수가 많다. 공백도 지우고 중간에 추가하고(join) 뭐시기뭐시기... 라이브러리를 참고하자.

 

 

4. 리스트


C++은 배열, 파이썬은 리스트. C++은 { , } 파이썬은 [ , ]

물론 C++에서도 리스트가 있긴 하다. stl에.

C++은 리스트 내에 같은 자료형만 들어가는데 파이썬은 다른 자료형도 들어간다. 정수와 문자열을 같은 리스트에 넣을 수 있다!

파이썬은 리스트 인덱스에도 물론 음수값을 넣을 수 있다. list[-2]이런식. 또, 리스트도 문자열 자르듯이 자를 수 있다.

사칙연산도 된다! 그냥 다되는구만!

다만 숫자 + 문자를 더할수는 없다. 지맘대로 형변환 안 해준다. str()함수를 이용하여 숫자를 문자로 바꾼 후 더하자.

보다보니까 C++리스트보단 vector에 비슷한 느낌이다.

 

C++에서 list 삭제는 list.erase() / Python은 del()

C++ vector는 push_back / Python list는 append

 

레퍼런스

파이썬에서 리스트 b = a하면 레퍼런스마냥 포인터가 복사된다. a 값을 바꾸면 b값도 바뀌는 것이다.

깊은 복사를 하려면 b = a[:]로 전체 값을 복사하거나, b = copy(a) 함수를 사용해야 한다.

 

 

 

 

5. 튜플


파이썬에는 튜플이라는게 있다. const list라고 생각하면 될 것 같다.

파이썬 리스트는 [,] 튜플은(,)이다. 심지어 괄호를 생략해도 된다! tup = 1,2,3 이렇게...

1개 요소만 가지는 튜플은 반드시 뒤에 ','를 붙여야 한다! tup = (1,)

튜플은 const list라고 했다. 값의 수정과 삭제가 불가능하다.

 

 

 

6. 딕셔너리


C++의 map이 파이썬의 딕셔너리. key-value쌍으로 값을 관리한다. 그리고 파이썬 딕셔너리는 { , }로 표시한다.

dic = { key : value}

딕셔너리에 새 값을 추가할때는 그냥 dic[3] = 'new val' 이런식으로 추가하면 된다. 그냥 map이랑 똑같네뭐.

참고로 멀티맵이 아니고 그냥맵이다. 키값이 중복되면 덮어쓴다!

 

그리고 딕셔너리의 key값은 안 변하고 value는 변할 수 있다. 그래서 튜플은 키로 쓸 수 있는데, 리스트는 못 쓴다.

 

 

 

7. 셋(set)


set은 set이다. 파이썬이나 C++이나 똑같다.

unordered인것도 똑같고 c++ set은 기본적으로 정렬이 되어서 들어간다!(20-40-10넣으면 출력할때 결과보면 10-20-40). 중복 안되는것은 똑같다. (멀티셋아님 그냥셋임). 파이썬 set은 순서가 없다! C++에선 unordered_set을 써야한다.

쓰는 방법은 이렇다 : s1 = set([2,3,1])

 

셋을 인덱스로 접근하려면 리스트나 튜플로 따로 저장해놓고 써야 한다.

list(s1), tuple(s1)이렇게.

 

set은 집합이다. 파이썬에서 set을 쓸 때는 이름값을 한다. set끼리 교집합(&)/차집합(-)/합집합(|) 등을 쓸 수 있다.

 

 

 

8. 스왑함수


C++만들때는 swap(a,b)함수 만들어서 temp = a, a = b, b = temp; 

파이썬은 a,b = b,a하면 끝. 와우...

 

 

 

9. 제어문


in:

파이썬엔 in이라는 키워드가 있다. 1 in [1,2,3] => 1이 있으니까 True를 반환한다. not in도 있다!

 

pass:

C++의 빈 블록같은것. if(조건){빈블록} else{~~}하면 if에 해당할때 아무 행동도 하지 않고 지나갔다

python에선 if 조건 : pass 를 쓰면 된다.

 

조건문:

파이썬은 조건문의 조건에 괄호를 안 붙인다. 우왕 그냥 if a :하면 된다.

C++ else if == python elif

C++도 조건문 뒤 한줄짜리면 {}을 생략하고 적어도 됐듯이, python도 한줄짜리면 들여쓰기 안 하고 그냥 if a : pass이렇게 한줄에 써도 된다.

 

 

조건부 표현식, 삼항연산자

C++에서 자주 쓰던 삼항연산자. money > 3000 ? vehicle = texi : vehicle = bus;

Python에서는 조건부 표현식을 이용한다. vehicle = texi if money > 3000 else bus

 

 

for문:

for_each문처럼 생겼다. 기존엔 for(int i= 0; i<n; i++){~}이렇게 썼었고, foreach는 (int& v : vect)이렇게 썼었다.

파이썬은 후자랑 비슷하다. for v in vect: 이렇게 쓴다.

continue랑 break는 똑같다. 다행이다.

 

range()함수:

범위만큼의 숫자 리스트를 자동으로 만들어준다. 이 range()함수 또한 [begin, end) 범위다.

a = range(10) // range(0,10)

for i in range(5,10) : i+=i   # i = 5+6+7+8+9

이 함수를 이용하면 for_each같은 파이썬 for문에서도 인덱스로 접근할 수 있다.

marks = [90, 25, 67, 45, 80]
for number in range(len(marks)):
    if marks[number] < 60: 
        continue
    print("%d번 학생 축하합니다. 합격입니다." % (number+1))

 

리스트 내포(List comprehension):

범위만큼의 숫자 리스트를 자동으로 만들어준다. 이 range()함수 또한 [begin, end) 범위다.

a = [1,2,3,4]
result = [num * 3 for num in a if num % 2 == 0]

result = [x*y for x in range(2,10)
			for y in range(1,10)]

이런식으로 쓴다. [표현식 for 항목 in 반복가능객체 if 조건문]

 

 

 

10. 함수


C++ : void function() {...}
python: def function(a,b) :

파이썬에서는 매개변수를 정해주면, 순서에 상관없이 값을 넘길 수 있다.
function(b=5, a=7) 이렇게 호출 가능. 매개변수로 여러개의 값을 줄수도 있다. def function(*param) :
마치 C의 int main(argc, *argv)처럼...


'키워드 파라미터'라는것도 있다.
def function(**kwargs) : 이렇게 **를 붙여 정의한다. 함수를 실행할때 입력한 값이 딕셔너리로 만들어진다. ex)function(ma = ke) ; {ma:ke} 딕셔너리로 저장


리턴값이 이상하다!
return a+b, a*b;하면 C++에선 오류가 난다. 둘을 함께 보내고싶다면 make_tuple이나 make_pair처럼 묶어준 후에 보내야 한다. 하지만 파이썬은? (a+b, a*b)를 알아서 튜플로 묶어서 리턴해준다. 와우네.
result = func(1,2) ; result = (3,2)가 된다는말
result1, result 2 = func(1,2) ; result1= 3, result2 = 2 이렇게 따로 저장도 가능하다.

매개변수에 초기값 설정하는건 똑같다.

void func(int i, int j, bool t = true); => func(15,1)이렇게 사용하면 t는 알아서 true들어가는거. 파이썬도 된다.

* 매개변수와 인수의 차이 : 매개변수는 함수를 정의할때쓰고, 인수는 함수를 실행할때 씀. 클래스와 인스턴스같은 사이라고 생각하자

함수 안에서 함수 밖 변수 접근하기: 변수에 접근할때 앞에 global 키워드를 붙인다. 근데 이 방법은 안 쓰는게 좋음.

 

람다:

C++ : int m = 0; int n = 0; [&, n] (int a) mutable { m = ++n + a; }(4);  //대충 m은 5고 n은 0이 나온다는 뜻
python: add = lambda a, b: a+b # def랑 똑같음. 대충 def에서 엔터랑 들여쓰기랑  return 키워드 생략한거.

 

 

 

11. 클래스


파이썬도 물론 클래스가 있다. 똑같은데 self라는 신기한게 추가되었을 뿐이다.

 

C++:

//A.h
class A(){
	private:
    	int num1;
	public:
    	void func1();
        void func2(int a, b);
        A(){...}	//constructor
};

//A.cpp
void A::func1(){...}
void A::func2(int a, b){this->num1 = a;}


//B.h. A클래스 상속
class B : public A(){
...
};

 

Python:

# Class 정의
class FourCal:
    classVal = "c"    #클래스변수
	def setdata(self, first, second):
    	self.first = first
        self.second = second
    def __init__(self, first, second): # constructor
        self.first = first
        self.second = second
    def mustUseSelf(self):
        pass
        
 # 사용
 a = FourCal()
 a.setdata(4,2) #객체로 사용하는 방법
 FourCal(a,4,2) #클래스로 객체를 호출하여 사용하는 방법
 
 # 상속
 class childCal(FourCal):
     pass

 

self라는 매개변수가 붙는다. 파이썬에는 붙여주어야한다. 객체 자신을 호출한다는 의미다. This같네..

 

 

12. 모듈


~.py 파일이 모두 모듈이다.

'import 모듈이름'으로 import해서 쓸 수 있다.
C++의 #include, javascript나 java의 import랑 똑같다.

 

javascript처럼 특정 함수만 import할수도 있다.

 

# module 통째로 불러오기
import mod1
mod1.func()
from mod1 import *
mod1.func2()


#특정 함수만 import
from mod2 import func2, func3
func2()
func3()


#대화형 인터프리터에서 함수 자동 실행 방지
if __name__=="__main__": pass

import로 module을 불러왔을때는 해당모듈.py의 __name__에 해당 모듈 이름이 저장되게 된다.

그냥 mod1.py를 직접 실행했을때는 __name__에 "__main__"이 저장된다.

 

 

13. 패키지


C++에 패키지가 없던걸로 기억한다
python 패키지는 java 패키지랑 비슷한 개념이다.

module들을 관리하게 쉽게 패키지라는 단위로 묶어 관리하는 것.

 

디렉토리를 만들고, 디렉토리에 모듈이름.py파일과 __init__.py파일을 넣으면 패키지가 된다.

패키지를 import할때 __init__.py에 적힌 모듈들만 사용할 수 있다. 모듈자체를 import하면 상관없고, 패키지를 import할 때 쓰이는것!

 

# package단위로 import
from game.sound import *

# ./game/sound/__init__.py
__all__ = ['echo'] # sound패키지를 import하면 echo모듈만 import하겠다는 뜻

__all__은 __all__은 *을 이용해 import했을 때, 어떤 모듈을 불러올 것인지 정의하는데 쓴다.

 

 

 

14. 오류처리


C++은 try, throw, catch

파이썬은 try, except

 

try: ...
finally: ...
except Error1 as err1: #err1이라는 변수 이름으로 처리
except Error2: #Error2 에러 처리
except (Error3, Error4) as e: #한번에 처리

class MyError(Exception): 	#Exception클래스를 상속하여 커스텀 에러 만들기
	def __str__(self):		#오류메세지
    		return "허용되지 않는 별명입니다." 

 

오류를 일부러 발생시킬수도 있다. raise NotImplementedError 이런식으로 raise 키워드를 사용한다.

 

 

 

 

# 참고


 

점프투파이썬 (https://wikidocs.net/book/1)

파이썬 기본을 갈고닦자(https://wikidocs.net/book/1553)

파이썬 코딩도장(https://dojang.io/course/view.php?id=7)