파이썬을 공부하면서 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)
'Study > Tips' 카테고리의 다른 글
IP주소, 서브넷 마스크, 게이트웨이 (0) | 2020.03.11 |
---|---|
파이썬 코딩 팁 (0) | 2020.02.25 |
비트디펜더 사용시 Permission denied 뜨는 문제 & 컴파일 안 되는 문제 (0) | 2019.08.08 |
[티스토리 스킨 편집] 1. 스크롤바 수정하기 (0) | 2019.04.30 |
[티스토리 스킨 편집] 0. 티스토리 스킨 적용하기 (0) | 2019.04.29 |