Python vs Javascript
Array Methods Comparison
안녕하세요. 뷰노 SW 개발팀에서 플랫폼 개발을 하고 있는 유영기 입니다.
SW 개발팀에서는 팀에서 사용하는 개발 언어와 기술 스택에 익숙하지 않은 새로운 팀원이 합류 했을 때, 위키에 정리된 개발팀 필수 이수 코스를 통해 체계적으로 학습할 수 있도록 하고 있습니다. 코스는 Python, Flask, Docker, Reactjs 등 총 9개로 구성되어 있으며 각 과정 별로 작성한 코드를 github에 commit하는 것으로 완료하게 됩니다.
저도 이 과정을 진행하면서 Python과 Javascript의 Daya Type을 자연스럽게 비교하게 되었고, 여기에서는 그 중 Array에 대한 내용을 정리해 보려고 합니다.
Array는 Python과 Javascript에서 매우 자주 사용되는 Data Type 입니다. 두 언어에 유사한 Method들이 존재하는데, 서로 다른 in-place operation(mutable)과 반환 형식(return)에 대해 분명히 하고 싶었습니다.
먼저 Python Data Type은 아래 2가지 그림과 같이 관점에 따라 다르게 분류할 수 있습니다.
Python Data Types
Javascript와의 Array Data Type 비교를 위해 주요 관점을 종합하여 Python Data Types을 다음과 같이 그려 보았습니다.
이제 두 언어의 Array Method를 비교해 보겠습니다.
Array Methods Comparison
위 그림의 굵게 혹은 가늘게 연결된 점선에 대해 설명하겠습니다.
코드는 다음 사이트의 예제를 활용했습니다.
push(x, ) | append(x)
배열의 끝에 요소를 추가 합니다.
push(x, )
- 배열의 새로운 길이를 반환합니다.
const animals = ['pigs', 'goats', 'sheep'];const count = animals.push('cows');
console.log(count);
// 4animals.push('chickens', 'cats', 'dogs');
console.log(animals);
// Array ["pigs", "goats", "sheep", "cows", "chickens", "cats", "dogs"]
append(x)
- 반환이 없습니다.
animals = ['cat', 'dog', 'rabbit']
wild_animals = ['tiger', 'fox']
animals.append(wild_animals)
print('Updated animals list: ', animals)
# Updated animals list: ['cat', 'dog', 'rabbit', ['tiger', 'fox']]
reverse(), sort()
배열의 순서를 반전하거나, 정렬 합니다.
Javascript
- Method의 결과를 반환하지만, 원래의 배열도 변형되어 있습니다.
const array1 = ['one', 'two', 'three'];
const reversed = array1.reverse();console.log('reversed:', reversed);
console.log('array1:', array1);
// "reversed:" Array ["three", "two", "one"]
// "array1:" Array ["three", "two", "one"]console.log(array1 === reversed)
// trueconst months = ['March', 'Jan', 'February', 'Dec'];
months.sort();
console.log(months);
// Array ["Dec", "February", "Jan", "March"]const array1 = [1, 30, 4, 21, 100000];
sorted = array1.sort();
console.log(array1);
// Array [1, 100000, 21, 30, 4]console.log(array1 === sorted)
// true
Python
- 반환이 없고, Javascript와 같이 원형을 변화시킵니다.
- key=, reverse= 의 optional arguments 를 가지고 있고, list.sort(), sorted() 둘 다 적용 가능합니다.
# reverse exercise 1os = ['Windows', 'macOS', 'Linux']
os.reverse()print('Updated List:', os)
# Updated List: ['Linux', 'macOS', 'Windows']# reverse exercise 2os_list = ['Windows', 'macOS', 'Linux']
reversed_list = os_list[::-1]print('Original List:', os_list)
print('Updated List:', reversed_list)
# Original List: ['Windows', 'macOS', 'Linux']
# Updated List: ['Linux', 'macOS', 'Windows']# sort exercise 1months = ['March', 'Jan', 'February', 'Dec']
months.sort()
print('Sorted list:', months)
# Sorted list: ['Dec', 'February', 'Jan', 'March']# sort exercise 2
months_list = ['March', 'Jan', 'February', 'Dec']
sorted_list = sorted(months_list)print('Original List:', months_list)
print('Sorted List:', sorted_list)
# Original List: ['March', 'Jan', 'February', 'Dec']
# Updated List: ['Dec', 'February', 'Jan', 'March']
shift(), pop() | pop(i)
배열에서 요소를 제거하고, 제거된 요소를 반환합니다.
Javascript
- shift() : 배열에서 첫 번째 요소를 제거합니다.
- pop() : 배열에서 마지막 요소를 제거합니다.
const array1 = [1, 2, 3];
const firstElement = array1.shift();console.log(array1);
console.log(firstElement);
// Array [2, 3]
// 1const plants = ['broccoli', 'cauliflower', 'cabbage', 'kale', 'tomato'];
const lastElement = plants.pop();console.log(plants);
console.log(lastElement);
// Array ["broccoli", "cauliflower", "cabbage", "kale"]
// "tomato"
Python
- pop(i) : index optional argument 의 default value 는 -1 입니다. 그래서 argument를 생략했을 때, Javascript 의 pop() 과 같이 마지막 요소를 제거합니다.
languages = ['Python', 'Java', 'C++', 'Ruby', 'C']print('Return Value:', languages.pop())
print('Updated List:', languages)
# Return Value: C
# Updated List: ['Python', 'Java', 'C++', 'Ruby']print('Return Value:', languages.pop(1))
print('Updated List:', languages)
# Return Value: Java
# Updated List: ['Python', 'C++', 'Ruby']print('Return Value:', languages.pop(-3))
print('Updated List:', languages)
# Return Value: Python
# Updated List: ['C++', 'Ruby']
unshift(x, ) | insert(i, x)
새로운 요소를 배열에 추가한다.
unshift(x, )
- 새로운 요소를 배열의 맨 앞쪽에 추가하고, 새로운 길이를 반환합니다.
const array1 = [1, 2, 3];const count = array1.unshift(4, 5);
console.log(count);
// 5console.log(array1);
// Array [4, 5, 1, 2, 3]
insert(i, x)
- 추가할 요소의 위치를 정하고, 반환이 없습니다.
mixed_list = [{1, 2}, [5, 6, 7]]number_tuple = (3, 4)
mixed_list.insert(1, number_tuple)print('Updated List: ', mixed_list)
# Updated List: [{1, 2}, (3, 4), [5, 6, 7]]
concat() | extend()
인자로 주어진 배열을 합친다.
concat()
- 기존배열을 변경하지 않습니다.
- 추가된 새로운 배열을 반환합니다.
const array1 = ['a', 'b', 'c'];
const array2 = ['d', 'e', 'f'];
const array3 = array1.concat(array2);console.log(array3);
console.log(array1 == array3);
console.log(array1);
// Array ["a", "b", "c", "d", "e", "f"]
// false
// Array ["a", "b", "c"]
extend()
- 반환이 없고, 기존배열을 변경합니다.
language = ['French', 'English', 'German']
language_tuple = ('Spanish', 'Portuguese')
language_set = {'Chinese', 'Japanese'}language.extend(language_tuple)
print('New Language List: ', language)
# New Language List: ['French', 'English', 'German', 'Spanish', 'Portuguese']language.extend(language_set)
print('Newest Language List: ', language)
# Newest Language List: ['French', 'English', 'German', 'Spanish', 'Portuguese', 'Japanese', 'Chinese']
indexOf(x) | index(x)
배열에서 지정된 요소를 찾을 수 있는 첫 번째 인덱스를 반환합니다.
indexOf(x)
- 존재하지 않으면 -1을 반환합니다.
- 몇 번째 부터 찾으라는 시작 인덱스를 줄 수 있습니다.
const beasts = ['ant', 'bison', 'camel', 'duck', 'bison'];console.log(beasts.indexOf('bison'));
// 1console.log(beasts.indexOf('bison', 2));
// 4console.log(beasts.indexOf('giraffe'));
// -1
index(x)
- 존재하지 않으면 ValueError를 반환합니다.
vowels = ['a', 'e', 'i', 'o', 'i', 'u']
print('The index of e:', vowels.index('e'))
# The index of e: 1print('The index of i:', vowels.index('i'))
# The index of i: 2print('The index of p:', vowels.index('p'))
# ValueError: 'p' is not in list
array.join() | string.join()
배열의 모든 요소들을 분리 문자열로 연결해 하나의 문자열로 만듭니다.
Javascript
- array.join() : Array Method 입니다.
const elements = ['Fire', 'Air', 'Water'];console.log(elements.join());
// "Fire,Air,Water"console.log(elements.join(''));
// "FireAirWater"console.log(elements.join('-*-'));
// "Fire-*-Air-*-Water"
Python
- string.join(iterable) : List Method가 아니고, String Method 입니다.
numList = ('1', '2', '3', '4')
separator = ', '
print(separator.join(numList))
# 1, 2, 3, 4s1 = 'abc'
s2 = '123'
print(s2.join(s1))
# a123b123c
Javascript가 Method 측면에서 데이타의 불변(immutable)에 대해 좀 더 민감한 것 같았고,
Python은 Method에 반환이 없는 경우가 있고, String Data Type을 이 글에서 다루지는 않았지만 관련 Methods가 좀 더 풍부하였습니다.