매트랩 fprintf와 파이썬 f-string
매트랩의 fprintf와 파이썬의 f-string 문법은 닮은 부분이 많다. 사실 거의 같다고 봐도 무방할 정도이다. f-string 문법이 제대로 정리된 페이지가 의외로 없는 듯하여, fprintf와 비교할 겸 만들어보았다. 아래에서 프롬프트가 >>인 것은 매트랩, >>>인 것은 파이썬이다. f-string 문법은 본 문서에 소개한 것 외에도 더 있는데, fprintf와 1:1로 매칭되는 것들만 본 문서에 정리하였다.
1. 그냥 출력
>> disp(256)
256
>>> print(256)
256
2. 정수
>> fprintf('%d\n', 256) %10진수
256
>> fprintf('%o\n', 256) %8진수
400
>> fprintf('%x\n', 256) %16진수
100
>>> print(f'{256:d}') #10진수
256
>>> print(f'{256:o}') #8진수
400
>>> print(f'{256:x}') #16진수
100
>>> print(f'{256:b}') #2진수
100000000
● 왜인지 매트랩에는 2진수가 없다. dec2bin을 사용해야 한다.
● 파이썬에서는 정수가 아니면 에러가 발생한다.
● 매트랩에서는 정수가 아니면 exponential notation으로 출력한다.
3. 문자열
>> fprintf('%s\n', 'matlab')
matlab
>>> print(f'{"python":s}')
python
● 매트랩에서 %s 대신 %c를 사용하면 문자를 하나씩 출력한다. 매트랩에서 숫자가 입력되면, 해당 숫자의 유니코드가 있을 경우 유니코드를, 없을 경우(e.g. 123.45) exponential notation으로 출력한다.
● 파이썬에서 %c는 없다. 파이썬에서는 숫자가 입력되면 에러가 발생한다.
4. 실수
>> fprintf('%f\n', 3.14)
3.140000
>> fprintf('%g\n', 3.14)
3.14
>>> print(f'{3.14:f}')
3.140000
>>> print(f'{3.14:g}')
3.14
● %f의 정밀도(소수점 아래 자리수)는 기본값이 6자리이다. %g는 불필요한 0을 출력하지 않는다.
5. 필드 너비와 정밀도
>> fprintf('%5.1f\n', 3.14) %전체 5자리, 소수점 아래 1자리
3.1
>> fprintf('%10.4f\n', 3.14) %전체 10자리, 소수점 아래 4자리
3.1400
>> fprintf('%10f\n', 3.14) %전체 10자리
3.140000
>> fprintf('%.4f\n', 3.14) %소수점 아래 4자리
3.1400
>> fprintf('%10d,%5d\n', 123, 456) %정수 10자리, 정수 5자리
123, 456
>>> print(f'{3.14:5.1f}') #전체 5자리, 소수점 아래 1자리
3.1
>>> print(f'{3.14:10.4f}') #전체 10자리, 소수점 아래 4자리
3.1400
>>> print(f'{3.14:10f}') #전체 10자리
3.140000
>>> print(f'{3.14:.4f}') #소수점 아래 4자리
3.1400
>>> print(f'{123:10d},{456:5d}') #정수 10자리, 정수 5자리
123, 456
● %10.4f는 전체가 10자리, 정밀도가 4자리이다.
● %10f는 정밀도는 기본값 6자리이고 전체 자리수만 10으로 지정한다.
● %.4f는 정밀도만 4자리로 지정한다.
● %10d는 전체 10자리로 정수를 출력한다.
6. 정렬
>> fprintf('%-10.4f,%4.2f\n', 3.14, 2.818) %왼쪽 정렬
3.1400 ,2.82
>>> print(f'{3.14:<10.4f},{2.818:4.2f}') #왼쪽 정렬
3.1400 ,2.82
>>> print(f'{3.14:^10.4f},{2.818:4.2f}') #중앙 정렬
3.1400 ,2.82
● 파이썬은 특이하게 중앙 정렬이 있다.
● 매트랩에는 중앙 정렬이 없다.
7. 부호 출력
>> fprintf('%+10.4f,%+6.2f\n', 3.14, -2.818)
+3.1400, -2.82
>> fprintf('%+-10.4f,%+-6.2f\n', 3.14, -2.818)
+3.1400 ,-2.82
>>> print(f'{3.14:+10.4f},{-2.818:+6.2f}')
+3.1400, -2.82
>>> print(f'{3.14:<+10.4f},{-2.818:<+6.2f}')
+3.1400 ,-2.82
● 정렬과 부호를 같이 쓸 수 있다.
● 매트랩에서는 +-로 쓰든 -+로 쓰든 똑같다.
● 파이썬에서는 +<로 쓰면 제대로 동작하지 않는다.
8. 0 채움
>> fprintf('%010.4f\n', 3.14)
00003.1400
>> fprintf('%+010.4f\n', 3.14)
+0003.1400
>> fprintf('%+-010.4f\n', 3.14)
+3.1400
>>> print(f'{3.14:010.4f}')
00003.1400
>>> print(f'{3.14:+010.4f}')
+0003.1400
>>> print(f'{3.14:<+010.4f}')
+3.1400000
● 정렬, 부호, 0 채움을 모두 쓸 수 있다.
● 매트랩에서 %+010.4f는 부호를 표기하고 앞에 0을 붙인다.
● 매트랩에서 %+-010.4f는 왼쪽 정렬하고, 부호를 표기하고, 앞에 0을 붙인다. 왼쪽 정렬이므로 0은 사실상 붙지 않는다.
● 파이썬에서 +010.4f는 부호를 표기하고 앞에 0을 붙인다.
● 파이썬에서 <+010.4f는 부호를 표기하고 왼쪽 정렬을 하고 오른쪽에 0을 붙인다. 매트랩과 다르다.
● 0 채움은 정수에서도 사용 가능하다.
참고한 곳들
https://realpython.com/python-f-strings/
https://www.geeksforgeeks.org/string-alignment-in-python-f-string/
https://www.mathworks.com/help/matlab/ref/fprintf.html
https://kr.mathworks.com/help/matlab/matlab_prog/formatting-strings.html
- 게으른