본문 바로가기

비단뱀과 알/튜토리얼

[Python / R] 기본 연산자와 함수

필자 개인적으로 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의 곱 만으로 나타낼 수 없는 수는 '나 안해'를 출력.