필자 개인적으로 R을 많이 사용하므로 양쪽의 코드를 비교하는 방식으로 메모
1. 기초 연산자 (base)
거듭 제곱
6**2
#> 36
R 등에서의 거듭제곱 오퍼레이터인 ' ^ ' 는 파이썬에서는 비트 연산자임.
6^2
#> 4
타입
type(2)
#> <class 'int'>
type(1.2)
#> <class 'float'>
type('1.2')
#> <class 'str'>
R에서는 클래스
class(2)
#> "numeric"
class(1.2)
#> "numeric"
class('1.2')
#> "character"
파이썬에서 콤마는 시퀀스를 생성(콤마로 구분된 정수)
1,000,000
#> (1, 0, 0)
R에서는 에러
1,000,000
#> Error: unexpected ',' in "1,"
파이썬이든 R이든 변수 이름 첫글자는 숫자 안됨
100friends='inssa'
#> Error: unexpected symbol in "100friends"
파이썬에서는 문자열 연산이 가능
a='I am'
b=' groot'
a+b
#> 'I am groot'
3*b
#> ' groot groot groot'
몫(quotient)과 나머지(remainder)
파이썬, 순서대로 나누기, 몫, 나머지
10/3
#> 3.3333333333333335
10//3
#> 3
10%3
#> 1
R, 순서대로 나누기, 몫, 나머지
10/3
#> 3.333333
10%/%3
#> 3
10%%3
#> 1
나온 김에 R에서 %%의 다른 역할들
df %>% # pipe operator
mutate('something something')
matA %*% matB # Matrix inner product
vectorX %in% vectorY # ? X에 Y가 포함
#> False False True False
파이썬, math module
없다 싶으면 냅다 math 모듈 깔고 해보면 됨
import math
math.log(math.e)
#> 1.0
math.sin(1/4*math.pi)
#> 0.7071067811865476
math.exp(3)
#> 20.085536923187668
이렇게 module.function 으로 표현하는 걸 'dot notation'이라고 함.
2. 함수
기본적으로 함수에 사용되는 변수는 local 범위
Boolean expression; 불 표현식
TF를 return
파이썬
type(True); type(False)
#> <class 'bool'>
#> <class 'bool'>
a=1; b=3
a==b
#> False
a!=b # a와 b가 같지 않다.
#> True
a>=b
#> False
a<b
#> True
관계 연산자(relational operator)에 대해선 R에서도 동일
' = ' 는 변수지정임, R에서는 ' <- ' 와 동일함
a=1; b=3
a=b
a
#> 3
파이썬 조건문
def which_is_greater(x, y):
if x<y:
print('x is less than y')
elif x>y:
print('x is greater than y')
else:
print('x and y are equal')
x=2**10; y=3**7
which_is_larger(x,y)
#> x is less than y
R 조건문
which_is_greater=function(x,y) {
if(x<y){
'x is less than y'
}else if(x>y) {
'x is greater than y'
}else{
'x and y are equal'
}
}
x=2^10; y=3^8
which_is_greater(x,y)
#> "x is less than y"
양 언어에서 함수 정의 방식에 차이가 있으므로 참고.
조건문 속에 조건문을 넣을 수도 있지만( '중첩 조건문' 이라고 한다),
구조 파악이 쉽지 않아 디버깅이 어려우므로 그냥 캡슐화를 잘 하는 걸로.
함수의 결과값(return)이 필요하다면 print들을 return으로 바꾸자.
파이썬 재귀
팩토리얼을 만들어 보자.
def factorial(n):
if n==0:
return 1
else:
res=n*factorial(n-1)
return res
factorial(10)
#> 3628800
어디선가 한 군데에서는 값을 지정해 주어야 한다.
R 재귀
factorial=function(n){
if(n==0){
1
}else{
n*factorial(n-1)
}
}
factorial(10)
#> 3628800
사실, 간단한 계산 영역에서는 같은 논리를 따르는 함수를 정의할 때 R이나 파이썬이나 크게 다를 바가 없다.
연습
피보나치 수열이나 만들어보자:
f(0)=0, f(1)=1
f(n)=f(n-1) + f(n-2)
3. 알고리즘 기초
반복(iteration), 루프(looping)
파이썬 while
iteration 생성
while은 함수 바디가 시행되는 조건
def convert19n(n):
while n%19>0:
n=n-1
return n
convert19n(1594516243456)
#> 1594516243450
함수 정의할 때 앞칸 공백 길이가 같은 문장들은 같은 자격
R while
동일함
convert19n=function(n){
while(n%%19>0){
n=n-1
}
n
}
convert19n(1594516243456)
#> 1.594516e+12
파이썬 for-loop
주어진 조건에 대해 반복 작업
이런 처리 패턴을 순회(traversal)라고 부른다고는 하는데 그냥 for loop로 부르는 게 더 편한듯
def naming(word):
suffix='자'
for letter in word:
print(letter + suffix)
naming('조이현')
#> 조자
#> 이자
#> 현자
파이썬은 벡터 변환이 알아서 되어 for문 작성이 간편함
R for-loop
R에서의 for-loop도 꽤나 쓸 일이 많다.
library(stringr) #string을 파이썬처럼 다루기 위해 package 실행
naming=function(word){
name=str_split(word, '')
unlist(name) #str_split은 list를 return. 이 부분만 떼어서 name을 불러오면 보임
res=for(letter in name){
print(paste0(letter, '자'))
}
}
naming('조이현')
#> [1] "조자" "이자" "현자"
하지만 R은 chr보다는 숫자 데이터의 계산에서 강한 모습을 보여주는 편
R에서 For-loop는 주로 이딴 글자놀이보다는 인덱스 설정으로 사용되는 바가 많다.
구글에 For-loop in r 키워드만 넣어도 자료가 수두룩하다
파이썬 break
반복 작업이 멈추는 조건을 걸어줌
n=0
while True:
n=n+1
print(n)
if n==10:
break
#> 1
#> 2
#> 3
#> 4
#> 5
#> 6
#> 7
#> 8
#> 9
#> 10
if-break 없으면 while True 조건은 n을 무한히 키움
R break
n=0
while(n>=0){
n=n+1
print(n)
if(n==10){
break
}
}
#> [1] 1
#> [1] 2
#> [1] 3
#> [1] 4
#> [1] 5
#> [1] 6
#> [1] 7
#> [1] 8
#> [1] 9
#> [1] 10
R에선 while(True)가 파이썬처럼 먹히지 않음
연습
함수를 짜보자 :
○ 2, 3, 5의 곱으로 나타낼 수 있는 수는 그들의 지수를 return. 예를 들어, 4를 입력하면 (2, 0, 0)을 return.
○ 2, 3, 5의 곱 만으로 나타낼 수 없는 수는 '나 안해'를 출력.
'비단뱀과 알 > 튜토리얼' 카테고리의 다른 글
[Python] 기본적인 Sequence (2) : Dictionary(딕셔너리)와 Tuple(튜플) (0) | 2022.12.25 |
---|---|
[Python] 기본적인 Sequence (1) : String(문자열)과 List(리스트) (0) | 2022.12.24 |