[python] 루비는 파이썬이 가지고 있지 않은 것과 그 반대의 것을 가지고 있습니까?

파이썬과 루비에 대한 많은 토론이 있으며, 모두 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



답변

루비는 블록 개념을 가지고 있는데, 이것은 코드 섹션 주위에 본질적으로 구문 설탕이다. 그것들은 클로저를 만들고 블록을 사용하거나 사용하지 않을 수있는 다른 방법으로 전달하는 방법입니다. 블록은 나중에 yield명령문 을 통해 호출 할 수 있습니다 .

예를 들어, each메소드 의 간단한 정의는 Array다음과 같습니다.

class Array
  def each
    for i in self
      yield(i)     # If a block has been passed, control will be passed here.
    end
  end
end  

그런 다음 다음과 같이 호출 할 수 있습니다.

# Add five to each element.
[1, 2, 3, 4].each{ |e| puts e + 5 }
> [6, 7, 8, 9]

파이썬에는 익명의 함수 / 클로저 / 람다가 있지만 유용한 구문 설탕이 없기 때문에 블록이 없습니다. 그러나 임시 방식으로 가져 오는 방법은 최소한 하나 이상 있습니다. 예를 들어 here 참조 하십시오 .


답변

파이썬 예제

함수는 파이썬에서 일류 변수입니다. 함수를 선언하고 객체로 전달한 다음 덮어 쓸 수 있습니다.

def func(): print "hello"
def another_func(f): f()
another_func(func)

def func2(): print "goodbye"
func = func2

이것은 현대 스크립팅 언어의 기본 기능입니다. JavaScript와 Lua도이 작업을 수행합니다. 루비는 이런 식으로 함수를 다루지 않습니다. 함수의 이름을 지정하면 호출됩니다.

물론 루비에서는 이러한 작업을 수행 할 수있는 방법이 있지만 일류 작업은 아닙니다. 예를 들어, Proc.new로 함수를 감싸서 변수로 취급 할 수 있지만 더 이상 함수가 아닙니다. “call”메소드가있는 객체입니다.

루비의 기능은 일류 객체가 아닙니다

루비 함수는 일류 객체가 아닙니다. 함수는 객체를 감싸서 감싸 야합니다. 결과 객체는 함수처럼 취급 될 수 없습니다. 기능은 일류 방식으로 할당 될 수 없습니다. 대신 컨테이너 개체의 함수를 호출하여 함수를 수정해야합니다.

def func; p "Hello" end
def another_func(f); method(f)[] end
another_func(:func)      # => "Hello"

def func2; print "Goodbye!"
self.class.send(:define_method, :func, method(:func2))
func                     # => "Goodbye!"

method(:func).owner      # => Object
func                     # => "Goodbye!"
self.func                # => "Goodbye!"    


답변

궁극적으로 모든 답변은 어느 수준에서 주관적이며, 지금까지 게시 된 답변은 다른 언어로는 불가능한 기능 중 하나를 똑같이 좋은 (유사하지 않은 경우) 표현할 수 없음을 거의 증명합니다. 두 언어 모두 매우 간결하고 표현력이 뛰어 나기 때문입니다.

나는 파이썬의 문법을 좋아한다. 그러나 루비의 진정한 아름다움을 찾으려면 구문보다 약간 더 깊이 파고 들어야합니다. 루비의 일관성에는 선과 같은 아름다움이 있습니다. 사소한 예는 이것을 완벽하게 설명 할 수는 없지만, 여기서 의미하는 바를 설명하기 위해 하나를 생각해 보겠습니다.

이 문자열의 단어를 바꾸십시오.

sentence = "backwards is sentence This"

어떻게 할 것인지 생각할 때 다음을 수행하십시오.

  1. 문장을 단어로 나눕니다.
  2. 단어를 반대로
  3. 단어를 다시 문자열로 다시 결합

루비에서는 이렇게 할 것입니다 :

sentence.split.reverse.join ' '

당신이 그것에 대해 생각 한대로, 같은 순서로 한 메소드가 다른 메소드를 호출합니다.

파이썬에서는 다음과 같이 보일 것입니다.

" ".join(reversed(sentence.split()))

이해하기는 어렵지만 흐름이 다릅니다. 주제 (문장)가 중간에 묻혀 있습니다. 작업은 기능과 객체 방법이 혼합되어 있습니다. 이것은 사소한 예이지만, 특히 사소하지 않은 작업에 대해 Ruby를 실제로 사용하고 이해하는 경우 다양한 예를 발견합니다.


답변

파이썬은 “우리는 모두 성인입니다”라는 사고 방식을 가지고 있습니다. 따라서 루비에는 상수와 같은 것이 있지만 파이썬에는 그렇지 않습니다 (루비의 상수는 경고 만 발생하지만). 파이썬의 사고 방식은 무언가를 일정하게 만들고 싶다면 모든 대문자로 변수 이름을 넣고 변경하지 않아야한다는 것입니다.

예를 들어, Ruby :

>> PI = 3.14
=> 3.14
>> PI += 1
(irb):2: warning: already initialized constant PI
=> 4.14

파이썬 :

>>> PI = 3.14
>>> PI += 1
>>> PI
4.1400000000000006


답변

Python의 모듈에서 특정 함수 만 가져올 수 있습니다. Ruby에서는 전체 메소드 목록을 가져옵니다. 루비로 “가져 오기”를 할 수는 있지만 그게 전부가 아닙니다.

편집하다:

이 Ruby 모듈을 보자 :


module Whatever
  def method1
  end

  def method2
  end
end

코드에 포함하면 :


include Whatever

당신은 둘 것을 볼 수 있습니다 방법 항목방법 2는 네임 스페이스에 추가되었습니다. method1 만 가져올 수 없습니다 . 둘 다 가져 오거나 전혀 가져 오지 않습니다. 파이썬에서는 선택한 방법 만 가져올 수 있습니다. 이것이 이름을 가질 수 있다면 선택적 가져 오기라고 할 수 있습니까?


답변

Ruby의 웹 사이트에서 :

파이썬과 마찬가지로, 루비에서는 …

  • 대화식 프롬프트 (irb라고 함)가 있습니다.
  • 명령 행에서 문서를 읽을 수 있습니다 (pydoc 대신 ri 명령 사용).
  • 특수 줄 종결자가 없습니다 (일반적인 줄 바꿈 제외).
  • 문자열 리터럴은 파이썬의 삼중 인용 문자열과 같은 여러 줄에 걸쳐있을 수 있습니다.
  • 대괄호는 목록 용이고 중괄호는 dicts 용입니다 (Ruby에서는 “해시”라고 함).
  • 배열은 동일하게 작동합니다 (추가하면 하나의 긴 배열이되지만 이와 같이 구성 a3 = [ a1, a2 ]하면 배열 배열이됩니다).
  • 개체는 강력하고 동적으로 형식이 지정됩니다.
  • 모든 것은 객체이며 변수는 객체에 대한 참조 일뿐입니다.
  • 키워드는 약간 다르지만 예외는 거의 동일합니다.
  • 내장 된 문서 도구가 있습니다 (Ruby는 rdoc이라고 함).

루비에서는 파이썬과 달리 …

  • 문자열은 변경 가능합니다.
  • 상수 (값을 변경하지 않으려는 변수)를 만들 수 있습니다.
  • 대소 문자를 강제로 적용합니다 (예 : 클래스 이름은 대문자로 시작하고 변수는 소문자로 시작).
  • 한 종류의 목록 컨테이너 (배열) 만 있으며 변경할 수 있습니다.
  • 큰 따옴표로 묶인 문자열은 이스케이프 시퀀스 (예 : \ t) 및 특수한 “식 대체”구문을 허용합니다 ( “+”문자열 “+”함께 “를 추가하지 않고도 루비 식의 결과를 다른 문자열에 직접 삽입 할 수 있습니다) . 작은 따옴표로 묶인 문자열은 파이썬의 “원시 문자열”과 같습니다.
  • “새로운 스타일”과 “이전 스타일”클래스는 없습니다. 딱 한 종류 야
  • 속성에 직접 액세스하지 마십시오. Ruby에서는 모든 메소드 호출입니다.
  • 메소드 호출의 괄호는 일반적으로 선택 사항입니다.
  • 파이썬 대신 공개, 비공개 및 보호 액세스가 적용됩니다. _voluntary_ underscore __convention__ 있습니다.
  • 다중 상속 대신 “mixin ‘s”가 사용됩니다.
  • 내장 클래스의 메소드를 추가하거나 수정할 수 있습니다. 두 언어를 사용하면 언제든지 클래스를 열고 수정할 수 있지만 Python은 내장 기능의 수정을 방지합니다.
  • True 및 False 대신 true 및 false가 있으며 None 대신 nil이 있습니다.
  • 진실을 테스트 할 때, 거짓과 무만이 거짓 값으로 평가됩니다. 그 밖의 모든 것은 사실입니다 (0, 0.0, “”및 [] 포함).
  • elif 대신 elsif입니다.
  • 가져 오기 대신 필요합니다. 그렇지 않으면 사용법은 동일합니다.
  • 위의 줄에 대한 일반적인 스타일 주석 (아래의 문서 문자열 대신)은 문서를 생성하는 데 사용됩니다.
  • 기억해야 할 것은 많지만 빨리 배울 수있는 여러 가지 단축키가 있습니다. 그들은 루비를 재미 있고 생산적으로 만드는 경향이 있습니다.

답변

루비가 파이썬보다 가지고있는 것은 스크립팅 언어 기능입니다. 이 컨텍스트에서 스크립팅 언어는 쉘 스크립트 및 일반 텍스트 조작에서 “접착제 코드”에 사용됩니다.

이들은 대부분 Perl과 공유됩니다. 퍼스트 클래스 내장 정규 표현식, $ -Variables, Perl (-a, -e) 등과 같은 유용한 명령 행 옵션

간결하면서도 간결한 구문과 함께 이러한 종류의 작업에 적합합니다.

Python to me는 배우기 쉽고 구문이 깔끔한 동적 유형 비즈니스 언어에 가깝습니다. 루비처럼 “쿨”한 것이 아니라 깔끔합니다. 파이썬이 루비를 능가하는 것은 다른 라이브러리에 대한 수많은 바인딩입니다. Qt 및 기타 GUI 라이브러리에 바인딩, 많은 게임 지원 라이브러리 및 및. 루비는 훨씬 적습니다. 예를 들어 데이터베이스에 많이 사용되는 바인딩은 품질이 좋지만 동일한 라이브러리에 대해 Ruby 바인딩이 있어도 틈새 라이브러리가 Python에서 더 잘 지원되는 것으로 나타났습니다.

따라서 두 언어 모두 사용되며 사용할 언어를 정의하는 작업입니다. 둘 다 배우기 쉽습니다. 나는 나란히 사용합니다. 스크립팅 용 Ruby 및 독립형 앱용 Python