일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 파이썬
- 안드로이드 웹뷰
- 그라파나
- CORDA
- Play2 로 웹 개발
- hyperledger fabric
- 스칼라 동시성
- Hyperledger fabric gossip protocol
- Play2
- 주키퍼
- 이더리움
- 하이브리드앱
- Actor
- 파이썬 동시성
- 파이썬 강좌
- Akka
- play 강좌
- 파이썬 머신러닝
- 스칼라
- 스칼라 강좌
- 스위프트
- 엔터프라이즈 블록체인
- 플레이프레임워크
- 파이썬 데이터분석
- akka 강좌
- Golang
- 하이퍼레저 패브릭
- Adapter 패턴
- 블록체인
- play2 강좌
- Today
- Total
HAMA 블로그
Scala 과 Python 를 동시에 배워보자. 본문
Scala 와 Python 의 비교를 통해서 이 언어들의 기초적인 언어 스타일링에 대해서 빠르게 훑어보도록 하겠습니다.
Scala vs Python
Scala
스칼라(Scala)는 객체 지향 프로그래밍 언어와 함수형 프로그래밍의 요소가 결합된 다중패러다임 프로그래밍 언어이다. C++ 가 C의 요소를 가져오긴 했지만 객체지향을 지향하듯이 스칼라도 함수형으로 개발하는것을 지향한다. 스칼라의 이름은 <skah-lah>라고 발음하며 'Scalable Language'에서 따왔다. 적은 양의 코드로도 방대한 규모의 시스템을 작성할 수 있다는 특징이 있다.[2] 자바의 자바 가상 머신 에서 실행 할 수 있으며 자바의 API도 그대로, 혹은 스칼라의 형식에 맞춰 약간 수정한 형태로 사용 할 수 있다. 대중화를 위한 굉장히 큰 장점이다.스칼라의 주요 특징은 함수도 객체라는것과 숫자도 객체 즉 모든 것이 객체인것이 자바와는 가장 크게 다른 점이다.
Python :
파이썬도 절차지향,객체 지향, 함수형 프로그래밍의 요소가 결합된 다중패러다임 프로그래밍 언어이다
파이썬[1](Python)은 1991년[2] 프로그래머인 귀도 반 로섬(Guido van Rossum)[3] 이 발표한 고급 프로그래밍 언어로, 플랫폼 독립적이며 인터프리터식, 객체지향적, 동적 타이핑(dynamically typed) 대화형 언어이다. 파이썬이라는 이름은 귀도가 좋아하는 코미디 〈Monty Python's Flying Circus〉에서 따온 것이다.
파이썬은 비영리의 파이썬 소프트웨어 재단이 관리하는 개방형, 공동체 기반 개발 모델을 가지고 있다. C언어로 구현된 C파이썬 구현이 사실상의 표준이다. 표준 파이썬은 아무래도 느린감이 있지만 분산,병렬로 어느정도 카바 가능하다. 엄청나게 속도 크리티컬한 프로그램에선 쓸 수 없지만 pypy 등 속도를 향상시킨 파이썬 버전을 이용하여 속도라는 토끼도 잡을 수 있다. 개인적으로 그렇게 쓸 바엔 C++ 이나 RUST 쓰겠다.
이 표는 좀 오래된것 같군요. 몇가지가 빠진듯..Flask 같은..
1. 기본 구조 및 HelloWorld
Scala)
object HelloWorld {
def main(args: Array[String]) {
println("Hello, world!")
}
}
HelloWorld.scala 로 저장
Python)
class HelloWorld:
def f(self):
print "Hello, world!"
hw = HelloWorld()
hw.f()
print "HelloWorld" 라고 그냥 해도 됨. 클래스 안 만들고 말이죠.
Helloworld.py 로 저장.
Scala 의 main 함수는 static이 아니다. Scala에는 정적 멤버(함수,필드 모두) 라는 개념이 존재하지 않는다.
object선언은 싱글턴 객체를 생성하는데, 정적개념이 필요하면 싱글턴객체 안에 넣으면 된다.
Python 은 구조상 특이점은 { }가 없다는것과 들여쓰기를 통한 단락의 구분과 : (콜론) 의 사용이다. 하위 레벨의 코드는 들여쓰기가 한 단계 깊어지고 상위레벨은 콜론으로 끝나야한다. 자바나 c++ 에서의 This 를 명시적으로 self 로 사용하는게 이채롭다.
2. 주석 스타일
Scala)
// 한 줄 주석
/*
여러 줄 주석
*/
Python)
# 한 줄 주석
‘’’
여러 줄 주석
‘’’
Scala 는 자바와 같고
Python 은 여러 줄 일 경우 따옴표 3개 혹은 쌍따옴표 3개를 배치하면 된다.
3. 기본 자료형
Scala)
Byte 8 bit . Range from -128 to 127
Short 16 bit . Range -32768 to 32767
Int 32 bit . Range -2147483648 to 2147483647
Long 64 bit
Float 32 bit IEEE 754 single-precision float
Double 64 bit IEEE 754 double-precision float
Char 16 bit unsigned Unicode character.
String A sequence of Chars
Boolean Either the literal true or the literal false
Unit Corresponds to no value
Null null or empty reference
Nothing The subtype of every other type;
Any The supertype of any type;
AnyRef The supertype of any reference type
Python)
Numbers (int, float etc.)
String
Dictionary
Tuple
List
a=’76.3’
b=float(a) # 숫자로 형변환
c = str(b) # 문자로 형변환
strLesson = ‘This is Python strings lesson’
StrLessonTriple = """This
is
string
Lesson"""
4. 기본 자료구조
Scala)
val 변경불가
var 변경가능
val scor = Map(“Alice” → 10, “Bob” → 3)
val scores = scala.collection.mutable.Map()
scoes(“Bob”) = 10
scores += (“Bob”->1, “Fred”->7)
Python)
Dictionary
Tuple
List
dict = {‘Mike’: 1233456,’John’: 567890}
list_mixed = [1, ‘this’, 2, ‘is’, 3, ‘list’, 4, ‘chapter’]
list_list = [1, ‘this’, [ 5, ‘hell’], 9’]
tuple_strings = (‘this’, ‘is’, ‘tuple’, ‘lesson’)
tuple_mixed = (1, ‘this’, 2, ‘is’, 3, ‘tuple’, 4, ‘chapter’)
print “=” * 50
5. 연산자
Scala)
인식자
변수,함수, 클래스등의 이름을 총체적으로 인식자라고부른다. 추가적으로 일련의 연산자문자도 사용가능
val √ = scala.math.sqrt _
√ (2)
val ‘val’ = 42
삽입 연산자 (a identifier b)
a to 10
a.to(10)
1->10
1.->(10)
단항 연산자 (a identifier)
1 toString
1.toString()
할당연산자 (a operator=b)
a+=b
a= a+b
apply/ update / unapply
함수호출문법을 함수아닌값에도사용가능
f(arg1,arg2, …)
f.apply(arg1,arg2,...)
f(arg1,arg2, …) = value
f.update(arg1,arg2,... value)
unapply는 어떤 객체에서 값을 추출한다고 보면된다.
Case Fraction(a,b) => 하면 Fraction 객체안의 값이 옵션으로 리턴됨. Option[(Int,Int)]
Python)
1) 산술 연산자 : +, -, *, **, /, //, %
2) 관계 연산자 : <, >, <=, >=, ==, !=, <>
3) 논리 연산자 : not, and, or
- 0, 0.0, 0L, 0.0+0.0j, (), {}, [], None, ""은 모두 거짓으로 간주
- 나머지는 모두 참
- 'and'와 'or'이 포함된 논리식은 식의 결과 값을 판정하는데 최종적으로 기여한 객체의 값을 식의 값으로 리턴
4) 비트 단위 연산자 : <<, >>, &, |, ^, ~
3. 수치 연산 함수
1) 내장 수치 연산 함수
- abs(x) : x의 절대값
- int(x) : x를 int(정수)형으로 변환
- long(x) : x를 long형으로 변환
- float(x) : x를 float형(실수형)으로 변환
- complex(re, im) : 실수부 re와 허수부 im를 가지는 복소수
- c.conjugate() : 복소수 c의 켤레 복소수
- divmod(x, y) : (x//y, x%y) 쌍
- pow(x, y) : x의 y승
2) math 모듈 : math(실수 연산), cmath(복소수 연산)
5. 조건문
Scala)
var result = ""
if(marks >= 50)
result = "passed"
else
result = "failed"
------------------------------
result match {
case "A" | "B" => println("Congratulations!")
case "C" => println("There is room ..")
case _ => println("We are ...")
}
Python)
var = 100
if var == 200:
print "1 - Got a true expression value"
print var
elif var == 150:
print "2 - Got a true expression value"
print var
elif var == 100:
print "3 - Got a true expression value"
print var
else:
print "4 - Got a false expression value"
print var
Python 에는 switch 문이 없다.
6. 반복문
Scala)
object Test {
def main(args: Array[String]) {
var a = 0;
// for loop execution with a range
for( a <- 1 to 10){
println( "Value of a: " + a );
}
}
}
----------------------------------
var a = 0;
val numList = List(1,2,3,4,5,6);
for( a <- numList ){
println( "Value of a: " + a );
}
Python)
for i in a:
print I
# 0~3까지 범위
for i in range(4):
print I
# 지정한 하한/상한의 범위에서만. (1씩 증가)
for i in range(1000, 1010):
print I
# 지정한 하한/상한의 범위에서만. (2씩 증가)
# range()의 3번째 파라이터가, 건너뛸 숫자
for i in range(1, 14, 2):
print I
# 지정한 숫자에서만
for i in 123, 341, 0, 666:
print I
myList = ['cat', 'dog', 'rabbit']
for a in myList:
print(a)
7. 배열
Scala)
var z = new Array[String](3)
z(0) = "Zara"
z(1) = "Nuha"
z(2) = "Ayan"
var z = Array("Zara", "Nuha", "Ayan")
var myList = Array(1.9, 2.9, 3.4, 3.5)
var myMatrix = ofDim[Int](3,3)
import Array._
object Test {
def main(args: Array[String]) {
var myMatrix = ofDim[Int](3,3)
// build a matrix
for (i <- 0 to 2) {
for ( j <- 0 to 2) {
myMatrix(i)(j) = j;
}
}
var myList1 = Array(1.9, 2.9, 3.4, 3.5)
var myList2 = Array(8.9, 7.9, 0.4, 1.5)
var myList3 = concat( myList1, myList2)
var myList1 = range(10, 20, 2)
var myList2 = range(10,20)
Python)
MyList=[1,2,3,4,5,6]
MyList[2]=100
MyList[2:5] # from myList[2] to myList[4].
MyList[5:] # List[5] to the end of the list
MyList[:5] # not including myList[5]
mi=MyList.index(m)
myList=[i for i in range(10)]
myList=[]
for i in range(10):
myList.append(1) or myList[i]=1
b=[[0]*3 for i in range(3)]
B[0][0]=1
myArray=[[0 for j in range(3)] for i in range(3)]
8. 문자열
Scala)
var greeting = "Hello world!";
or
var greeting:String = "Hello world!";
var palindrome = "Dot saw I was Tod";
var len = palindrome.length();
"My name is ".concat("Zara");
object Test {
def main(args: Array[String]) {
var str1 = "Dot saw I was ";
var str2 = "Tod";
println("Dot " + str1 + str2);
}
}
object Test {
def main(args: Array[String]) {
var floatVar = 12.456
var intVar = 2000
var stringVar = "Hello, Scala!"
var fs = printf("The value of the float variable is " +
"%f, while the value of the integer " +
"variable is %d, and the string " +
"is %s", floatVar, intVar, stringVar)
println(fs)
}
}
Python)
food = "Python's favorite food is perl"
say = '"Python is very easy." he says.'
food = 'Python\'s favorite food is perl'
>>> head = "Python"
>>> tail = " is fun!"
>>> print(head + tail)
Python is fun!
>>> a = "python"
>>> print(a * 2)
Pythonpython
>>> a = "Life is too short, You need Python"
>>> a[3]
'e'
>>> a[0:4]
'Life'
>>> a[5:7]
'is'
>>> a[19:]
'You need Python'
>>> print("I eat %d apples." % 3)
I eat 3 apples.
>>> number = 10
>>> day = "three"
>>> print("I eat %d apples. so I was sick for %s days." % (number, day))
I eat 10 apples. so I was sick for three days.
9. 예외
Scala)
import java.io.FileReader
import java.io.FileNotFoundException
import java.io.IOException
object Test {
def main(args: Array[String]) {
try {
val f = new FileReader("input.txt")
} catch {
case ex: FileNotFoundException => {
println("Missing file exception")
}
case ex: IOException => {
println("IO Exception")
}
} finally {
println("Exiting finally...")
}
}
}
Python)
try:
... result = x / y
... except ZeroDivisionError:
... print "division by zero!"
... else: ( 예외가 실행되지 않으면 실행)
... print "result is", result
... finally: (예외가발생하던 말던 실행)
... print "executing finally clause"
try:
... raise NameError, 'HiThere'
... except NameError:
... print 'An exception flew by!'
... raise
10. 클래스
Scala)
import java.io._
class Point(val xc: Int, val yc: Int) {
var x: Int = xc
var y: Int = yc
def move(dx: Int, dy: Int) {
...
}
}
class Time {
private[this] var h = 12
private[this] var m = 0
def hour: Int = h
def hour_=(x: Int){ h = x }
def minute: Int = m
def minute_=(x: Int){ m = x }
}
Python)
class Service:
... secret = "영구는 배꼽이 두 개다"
... def __init__(self, name):
... self.name = name
... def sum(self, a, b):
... result = a + b
... print("%s님 %s + %s = %s입니다." % (self.name, a, b, result))
>>> pey = Service("홍길동”)
>>> pey.sum(1, 1)
11. 함수
Scala)
object Test {
def main(args: Array[String]) {
println( "Returned Value : " + addInt(5,7) );
}
def addInt( a:Int, b:Int ) : Int = {
var sum:Int = 0
sum = a + b
sum
}
}
Python)
>>> def fib(n): # write Fibonacci series up to n
... "Print a Fibonacci series up to n"
... a, b = 0, 1
... while b < n:
... print b,
... a, b = b, a+b
...
>>> # Now call the function we just defined:
... fib(2000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
>>> def fib2(n): # return Fibonacci series up to n
... "Return a list containing the Fibonacci series up to n"
... result = []
... a, b = 0, 1
... while b < n:
... result.append(b) # see below
... a, b = b, a+b
... return result
...
>>> f100 = fib2(100) # call it
>>> f100 # write the result
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
12. Import 방법
Scala)
Import clauses
An import clause has the form import p.I where the import expression I determines a set of names of members of p which are made available without qualification. For example:
The clause makes available without qualification..
import p._ all members of p (this is analogous to import p.* in Java).
import p.x the member x of p.
import p.{x => a} the member x of p renamed as a.
import p.{x, y} the members x and y of p.
import p1.p2.z the member z of p2, itself member of p1.
Python)
import 모듈이름
>>> import mod1
>>> print(mod1.sum(3,4))
7
mod1.py에 다음의 함수를 추가 시켜 보자.
def safe_sum(a, b):
if type(a) != type(b):
print("더할수 있는 것이 아닙니다.")
return
else:
result = sum(a, b)
return result
>>> import mod1
>>> print(mod1.safe_sum(3, 4))
7
>>> from mod1 import sum // 모듈내의 기능을 바로 사용할수있게한다.
>>> sum(3, 4)
7
from mod1 import *
13. 콘솔 입출력
Scala)
object ScannerTest {
def main(args: Array[String]) {
var ok = true
while (ok) {
val ln = readLine()
ok = ln != null
if (ok) println(ln)
}
}
}
object ScannerTest {
def main(args: Array[String]) {
for (ln <- io.Source.stdin.getLines) println(ln)
}
}
object Test {
def main(args: Array[String]) {
print("Please enter your input : " )
val line = Console.readLine
println("Thanks, you just typed: " + line)
}
}
Python)
>>> a = input()
Life is too short, you need python
>>> a
Life is too short, you need python
>>>
>>> number = input("숫자를 입력하세요: ")
숫자를 입력하세요:
>>> a = 123
>>> print(a)
123
>>> a = "Python"
>>> print(a)
Python
>>> a = [1, 2, 3]
>>> print(a)
[1, 2, 3]
14. 파일 입출력
Scala)
import java.io._
object Test {
def main(args: Array[String]) {
val writer = new PrintWriter(new File("test.txt" ))
writer.write("Hello Scala")
writer.close()
}
}
import scala.io._
object ReadFile extends Application {
val s = Source.fromFile("some_file.txt")
s.getLines.foreach( (line) => {
println(line.trim.toUpperCase)
})
}
Python)
f = open("C:/Python/새파일.txt", 'w')
f = open("새파일.txt", 'w')
for i in range(1, 11):
data = "%d 번째 줄입니다.\n" % i
f.write(data)
f.close()
f = open("새파일.txt", 'r')
line = f.readline()
print(line)
f.close()
f = open("새파일.txt", 'r')
while 1:
line = f.readline()
if not line: break
print(line)
f.close()
f = open("새파일.txt", 'r')
lines = f.readlines()
for line in lines:
print(line)
f.close()
15. 컨테이너 (컬렉션)
Scala)
// Define List of integers.
val x = List(1,2,3,4)
// Define a set.
var x = Set(1,3,5,7)
// Define a map.
val x = Map("one" -> 1, "two" -> 2, "three" -> 3)
// Create a tuple of two elements.
val x = (10, "Scala")
// Define an option
val x:Option[Int] = Some(5)
object Test {
def main(args: Array[String]) {
val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo")
println("show(capitals.get( \"Japan\")) : " +
show(capitals.get( "Japan")) )
println("show(capitals.get( \"India\")) : " +
show(capitals.get( "India")) )
}
def show(x: Option[String]) = x match {
case Some(s) => s
case None => "?"
}
}
var s = Some("abc") // Scala can infer the type
var t: Option[String] = None // Type must be explicit
def chooseFile(): Option[File] = { ... }
The most general way to use an Option is with a match:
chooseFile() match {
case Some(f) => // Do something with file f
case None => // Do something when there is no file
}
You can check if an Option value is defined by comparing it with None, or by using the isDefined or isEmpty method:
if (t isDefined) println(t)
if (t isEmpty) println("Nothing here!")
You can extract the value of an Option, but only if you provide some default value for the None case:
val w = t.getOrElse("Nothing here!")
Python)
dict = {‘Mike’: 1233456,’John’: 567890}
list_mixed = [1, ‘this’, 2, ‘is’, 3, ‘list’, 4, ‘chapter’]
list_list = [1, ‘this’, [ 5, ‘hell’], 9’]
tuple_strings = (‘this’, ‘is’, ‘tuple’, ‘lesson’)
tuple_mixed = (1, ‘this’, 2, ‘is’, 3, ‘tuple’, 4, ‘chapter’)
16. 상속
Scala)
class ScientificCalculator(brand: String) extends Calculator(brand) {
def log(m: Double, base: Double) = math.log(m) / math.log(base)
}
Python)
class Person:
def __init__(self, name, age, gender):
self.Name = name
self.Age = age
self.Gender = gender
def aboutMe(self):
print("저의 이름은 " + self.Name + "이구요, 제 나이는 " + self.Age + "살 입니다.")
class Employee(Person):
def __init__(self, name, age, gender, salary, hiredate):
Person.__init__(self, name, age, gender)
self.Salary = salary
self.Hiredate = hiredate
def doWork(self):
print("열심히 일을 합니다.")
def aboutMe(self):
Person.aboutMe(self)
print("제 급여는 " + self.Salary + "원 이구요, 제 입사일은 " + self.Hiredate + " 입니다.")
17. 쓰레드
Scala)
scala> val hello = new Thread(new Runnable {
def run() {
println("hello world")
}
})
hello: java.lang.Thread = Thread[Thread-3,5,main]
scala> hello.start
hello world
------------------------------
import java.net.{Socket, ServerSocket}
import java.util.concurrent.{Executors, ExecutorService}
import java.util.Date
class NetworkService(port: Int, poolSize: Int) extends Runnable {
val serverSocket = new ServerSocket(port)
def run() {
while (true) {
// This will block until a connection comes in.
val socket = serverSocket.accept()
(new Handler(socket)).run()
}
}
}
class Handler(socket: Socket) extends Runnable {
def message = (Thread.currentThread.getName() + "\n").getBytes
def run() {
socket.getOutputStream.write(message)
socket.getOutputStream.close()
}
}
(new NetworkService(2020, 2)).run
---------------------------------------
import java.net.{Socket, ServerSocket}
import java.util.concurrent.{Executors, ExecutorService}
import java.util.Date
class NetworkService(port: Int, poolSize: Int) extends Runnable {
val serverSocket = new ServerSocket(port)
val pool: ExecutorService = Executors.newFixedThreadPool(poolSize)
def run() {
try {
while (true) {
// This will block until a connection comes in.
val socket = serverSocket.accept()
pool.execute(new Handler(socket))
}
} finally {
pool.shutdown()
}
}
}
class Handler(socket: Socket) extends Runnable {
def message = (Thread.currentThread.getName() + "\n").getBytes
def run() {
socket.getOutputStream.write(message)
socket.getOutputStream.close()
}
}
(new NetworkService(2020, 2)).run
Python)
from thread import start_new_thread
def heron(a):
"""Calculates the square root of a"""
eps = 0.0000001
old = 1
new = 1
while True:
old,new = new, (new + a/new) / 2.0
print old, new
if abs(new - old) < eps:
break
return new
start_new_thread(heron,(99,))
start_new_thread(heron,(999,))
start_new_thread(heron,(1733,))
c = raw_input("Type something to quit.")
--------------------
import time
from threading import Thread
def sleeper(i):
print "thread %d sleeps for 5 seconds" % i
time.sleep(5)
print "thread %d woke up" % i
for i in range(10):
t = Thread(target=sleeper, args=(i,))
t.start()
--------------------
class PrimeNumber(threading.Thread):
prime_numbers = {}
lock = threading.Lock()
def __init__(self, number):
threading.Thread.__init__(self)
self.Number = number
PrimeNumber.lock.acquire()
PrimeNumber.prime_numbers[number] = "None"
PrimeNumber.lock.release()
def run(self):
counter = 2
res = True
while counter*counter < self.Number and res:
if self.Number % counter == 0:
res = False
counter += 1
PrimeNumber.lock.acquire()
PrimeNumber.prime_numbers[self.Number] = res
PrimeNumber.lock.release()
threads = []
while True:
input = long(raw_input("number: "))
if input < 1:
break
thread = PrimeNumber(input)
threads += [thread]
thread.start()
for x in threads:
x.join()
18. 클로저 (외부의 변수에 자유로이 접근하라~)
Scala)
object Test {
def main(args: Array[String]) {
println( "muliplier(1) value = " + multiplier(1) )
println( "muliplier(2) value = " + multiplier(2) )
}
var factor = 3
val multiplier = (i:Int) => i * factor
}
C:/>scalac Test.scala
C:/>scala Test
muliplier(1) value = 3
muliplier(2) value = 6
19. 패턴 매칭 ( 스마트한 Switch 문 )
Scala)
object Test {
def main(args: Array[String]) {
println(matchTest(3))
}
def matchTest(x: Int): String = x match {
case 1 => "one"
case 2 => "two"
case _ => "many"
}
}
C:/>scalac Test.scala
C:/>scala Test
many
20. 트레잇 ( 다중상속 가능 객체 , 공통적으로 사용되는 것들이 현실에 존재함..)
Scala)
trait Equal {
def isEqual(x: Any): Boolean
def isNotEqual(x: Any): Boolean = !isEqual(x)
}
class Point(xc: Int, yc: Int) extends Equal {
var x: Int = xc
var y: Int = yc
def isEqual(obj: Any) =
obj.isInstanceOf[Point] &&
obj.asInstanceOf[Point].x == x
}
object Test {
def main(args: Array[String]) {
val p1 = new Point(2, 3)
val p2 = new Point(2, 4)
val p3 = new Point(3, 3)
println(p1.isNotEqual(p2))
println(p1.isNotEqual(p3))
println(p1.isNotEqual(2))
}
}
21. 정규표현식
Scala)
import scala.util.matching.Regex
object Test {
def main(args: Array[String]) {
val pattern = new Regex("(S|s)cala")
val str = "Scala is scalable and cool"
println((pattern findAllIn str).mkString(","))
}
}
Python)
import re
programming = ["Python", "Perl", "PHP", "C++"]
pat = "^B|^P|i$|H$"
for lang in programming:
if re.search(pat,lang,re.IGNORECASE):
print lang , "FOUND"
else:
print lang, "NOT FOUND"
The output of above script will be:
Python FOUND
Perl FOUND
PHP FOUND
C++ NOT FOUND
22. 함수형 고계함수들
Scala)
val nums = List(1, 2, 3, 4, 5)
//map
val nums_map = nums.map(x => x * 10)
println(nums_map)//List(10, 20, 30, 40, 50)
//reduce
val nums_reduce = nums.reduce( _ + _ )
println(nums_reduce)//15
//filter
val nums_filter = nums.filter( x => x < 3)
println(nums_filter)//List(1, 2)
//fold
val nums_fold = nums.fold(1){ (sum , x) => sum + x}
println(nums_fold)//16
//group
val nums_trans = nums.groupBy(x => x < 3)
println(nums_trans) //Map(false -> List(3, 4, 5), true -> List(1, 2))
Python)
nums = [1, 2, 3, 4, 5]
#map
nums_map = map(lambda x : x * 10, nums)
print(nums_map)
#reduce
nums_reduce = reduce(lambda x , y : x + y , nums)
print(nums_reduce)
#filter
nums_filter = filter(lambda x : x < 3 , nums)
print(nums_filter)
#fold
nums_fold = reduce(lambda x , y : x + y, nums, 1)
print(nums_fold)
#group
from itertools import groupby
for key, igroup in groupby(nums, lambda x: x < 3):
print key, list(igroup)
# True [1, 2]
# False [3, 4, 5]
'Python' 카테고리의 다른 글
파이썬으로 클라우드 (병렬,분산) 하고 싶어요 (0) | 2016.09.14 |
---|---|
파이썬의 함정 - 2 (@classmethod 와 @staticmethod 의 차이) (1) | 2016.09.13 |
파이썬의 함정 - 1 (클래스변수 와 객체 변수) (0) | 2016.09.11 |
파이썬 최고 성능을 위한 프로젝트 (0) | 2016.08.31 |
Python, Numpy, SciPy, Matplotlib 설치 (0) | 2016.02.05 |