파이썬과 루비에 대한 많은 토론이 있으며, 모두 X가 왜 언어 Y를 빨아들이거나 언어 Y에 X가 없다고 주장하기 때문에 모두 도움이되지 않습니다. 실제로 그렇게합니다. 나는 왜 내가 왜 파이썬을 선호하는지 알고 있지만, 그것은 또한 주관적이며, 내가 선택한 것과 같은 맛을 가지고 있지 않을 수도 있기 때문에 아무도 선택하는 데 도움이되지 않습니다.
따라서 객관적으로 차이점을 나열하는 것이 흥미로울 것입니다. 그래서 "Python의 람다는 짜증나 지 않습니다". 대신 파이썬이 할 수없는 루비의 람다가 할 수있는 것을 설명하십시오. 주관성이 없습니다. 예제 코드가 좋습니다!
하나의 답변에 몇 가지 차이점이 없습니다. 그리고 당신이 알고있는 것을 올바른 것으로 투표하고, 당신이 알고있는 것을 부정하는 (또는 주관적인) 투표하십시오. 또한 구문의 차이는 흥미롭지 않습니다. 우리는 파이썬이 루비가 괄호와 끝으로하는 것을 들여 쓰는 것으로 알고 있으며, @는 파이썬에서 self라고 불립니다.
업데이트 : 이것은 이제 커뮤니티 위키이므로 큰 차이점을 여기에 추가 할 수 있습니다.
루비는 클래스 본문에 클래스 참조가 있습니다
Ruby에는 이미 클래스 본문에있는 클래스 (자체)에 대한 참조가 있습니다. 파이썬에서는 클래스 구성이 완료 될 때까지 클래스에 대한 참조가 없습니다.
예를 들면 :
class Kaka
puts self
end
이 경우 self는 클래스이며이 코드는 "Kaka"를 인쇄합니다. 클래스 이름을 인쇄하거나 다른 방법으로 Python의 클래스 정의 본문에서 클래스에 액세스하는 방법은 없습니다 (메소드 정의 외부).
모든 클래스는 Ruby에서 변경 가능
이를 통해 핵심 클래스에 대한 확장을 개발할 수 있습니다. 레일 확장의 예는 다음과 같습니다.
class String
def starts_with?(other)
head = self[0, other.length]
head == other
end
end
파이썬 ( ''.startswith
메소드 가 없다고 상상해보십시오 ) :
def starts_with(s, prefix):
return s[:len(prefix)] == prefix
문자열뿐만 아니라 모든 시퀀스에서 사용할 수 있습니다. 사용하려면 명시 적으로 가져와야합니다 ( 예 :) from some_module import starts_with
.
루비에는 펄 같은 스크립팅 기능이 있습니다
루비는 퍼스트 클래스 정규 표현식, $-변수, awk / perl 라인 별 입력 루프 및 텍스트 파일을 혼동 시키거나 다른 프로그램의 접착 코드로 작동하는 작은 쉘 스크립트 작성에 더 적합한 기타 기능을 제공합니다.
루비는 일류 연속을 가지고 있습니다
callcc 문에 감사합니다. 파이썬에서는 다양한 기술로 연속을 만들 수 있지만 언어에 대한 지원은 없습니다.
루비에는 블록이 있습니다
"do"문을 사용하면 Ruby에서 여러 줄 익명 함수를 작성할 수 있습니다.이 함수는 do 앞에있는 메소드에 인수로 전달되어 거기서 호출됩니다. 파이썬에서는 대신 메소드를 전달하거나 생성기를 사용 하여이 작업을 수행합니다.
루비:
amethod { |here|
many=lines+of+code
goes(here)
}
Python (루비 블록은 Python의 다른 구문에 해당) :
with amethod() as here: # `amethod() is a context manager
many=lines+of+code
goes(here)
또는
for here in amethod(): # `amethod()` is an iterable
many=lines+of+code
goes(here)
또는
def function(here):
many=lines+of+code
goes(here)
amethod(function) # `function` is a callback
흥미롭게도, 루비에서 블록 호출에 대한 편의 문장을 "수율"이라고하며, 파이썬에서 생성기를 생성합니다.
루비:
def themethod
yield 5
end
themethod do |foo|
puts foo
end
파이썬 :
def themethod():
yield 5
for foo in themethod():
print foo
원칙은 다르지만 결과는 놀랍도록 비슷합니다.
루비는 기능적인 스타일 (파이프 같은) 프로그래밍을보다 쉽게 지원합니다
myList.map(&:description).reject(&:empty?).join("\n")
파이썬 :
descriptions = (f.description() for f in mylist)
"\n".join(filter(len, descriptions))
파이썬에는 내장 생성기가 있습니다 (위에서 언급 한 것처럼 루비 블록처럼 사용됨)
파이썬은 언어로 생성기를 지원합니다. Ruby 1.8에서는 연속체를 사용하여 블록에서 생성기를 생성하는 생성기 모듈을 사용할 수 있습니다. 또는 block / proc / lambda를 사용할 수 있습니다! 또한, 루비 1.9 섬유이며, 발전기로서 사용될 수 있으며, 열거 클래스는 내장 발전기 (4)
docs.python.org 에는 다음 생성기 예제가 있습니다.
def reverse(data):
for index in range(len(data)-1, -1, -1):
yield data[index]
이것을 위의 블록 예제와 대조하십시오.
파이썬은 유연한 네임 스페이스 처리 기능을 가지고 있습니다
Ruby에서로 파일을 가져 오면 require
해당 파일에 정의 된 모든 항목이 전역 네임 스페이스에있게됩니다. 네임 스페이스 오염이 발생합니다. 이에 대한 해결책은 Rubys 모듈입니다. 그러나 모듈로 네임 스페이스를 만드는 경우 포함 된 클래스에 액세스하려면 해당 네임 스페이스를 사용해야합니다.
Python에서 파일은 모듈이므로 포함 된 이름을로 가져 와서 from themodule import *
원하는 경우 네임 스페이스를 오염시킬 수 있습니다. 그러나을 사용하여 선택한 이름 만 가져 오거나을 사용하여 from themodule import aname, another
간단히 import themodule
이름을 액세스 할 수도 있습니다 themodule.aname
. 네임 스페이스에서 더 많은 레벨을 원한다면 모듈과 __init__.py
파일 이있는 디렉토리 인 패키지를 가질 수 있습니다 .
파이썬에는 docstring이 있습니다
독 스트링은 모듈, 함수 및 메소드에 첨부 된 문자열이며 런타임에 검사 할 수 있습니다. 이것은 help 명령 및 자동 문서와 같은 것을 작성하는 데 도움이됩니다.
def frobnicate(bar):
"""frobnicate takes a bar and frobnicates it
>>> bar = Bar()
>>> bar.is_frobnicated()
False
>>> frobnicate(bar)
>>> bar.is_frobnicated()
True
"""
루비의 동등한 기능은 javadocs와 유사하며 메소드 대신 메소드 위에 있습니다. 1.9의 Method # source_location 예제 사용을 사용 하여 파일에서 런타임시 검색 할 수 있습니다.
파이썬에는 여러 상속이 있습니다
루비는 그렇지 않습니다 ( "의도적"입니다-루비의 웹 사이트를 참조하십시오 . 루비에서 어떻게되는지 살펴보십시오 ). 모듈 개념을 추상 클래스의 유형으로 재사용합니다.
파이썬에는 목록 / dict 이해력이 있습니다
파이썬 :
res = [x*x for x in range(1, 10)]
루비:
res = (0..9).map { |x| x * x }
파이썬 :
>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7c1ccd4>
>>> list(_)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
루비:
p = proc { |x| x * x }
(0..9).map(&p)
파이썬 2.7+ :
>>> {x:str(y*y) for x,y in {1:2, 3:4}.items()}
{1: '4', 3: '16'}
루비:
>> Hash[{1=>2, 3=>4}.map{|x,y| [x,(y*y).to_s]}]
=> {1=>"4", 3=>"16"}
파이썬에는 데코레이터가 있습니다
데코레이터와 비슷한 것들도 루비로 만들 수 있으며 파이썬만큼 필요하지 않다고 주장 할 수도 있습니다.
구문 차이
Ruby는 모든 범위를 닫으려면 "end"또는 "}"가 필요하지만 Python은 공백 만 사용합니다. 공백 만 들여 쓰기를 허용하려는 루비의 최근 시도가 있습니다 http://github.com/michaeledgar/seamless