루비에서 파이썬 배우기; 차이점과 유사점


131

나는 루비를 잘 알고있다. 나는 현재 파이썬을 배울 필요가 있다고 생각합니다. 두 가지를 모두 알고있는 사람들에게는 두 개념이 비슷한 개념과 다른 개념은 무엇입니까?

JavaScripter를 위해 Learning Lua를 위해 작성한 입문서와 비슷한 목록을 찾고 있습니다 . 공백의 중요성 및 반복 구조와 같은 간단한 것 nil파이썬 의 이름 , 그리고 "가상"으로 간주되는 값; 그것은 동등한 사용하는 관용적 인 mapeach, 또는이다 중얼 somethingaboutlistcomprehensions가 중얼 규범?

다양한 답변을 얻을 수 있다면 커뮤니티 위키로 모아서 기쁩니다. 그렇지 않으면 당신은 모두 하나의 진정한 포괄적 인 목록을 만들려고 서로 싸울 수 있습니다.

편집 : 분명히, 내 목표는 "적절하고"관용적 인 파이썬입니다. 파이썬과 동등한 파이썬이 inject있지만 목록을 반복하고 결과를 누적하는 일반적인 기능을 수행하는 더 나은 / 다른 방법이 있기 때문에 아무도 그것을 사용하지 않는다면, 나는 당신이하는 일을 알고 싶습니다. 아마도이 질문을 일반적인 목표 목록, 루비에서 어떻게 달성하는지, 파이썬에서 동등한 것이 무엇인지 물어볼 것입니다.


1
내가 읽은 유일한 방법이었다 c2.com/cgi/wiki?PythonVsRuby 난 정말 자아와 들여 쓰기처럼 해달라고하지만 난 :) 그것에 익숙해있어,
사이프 알 Harthi

1
관련 : stackoverflow.com/questions/1113611/... (그 질문은 동등한없이 것을 요청으로 내가 확신이 중복 인 경우 아니에요).

19
@SilentGhost 나는 매우 동의하지 않습니다. 나는 "언어간에 같은 것이 무엇이고 무엇이 다른가?"라고 묻고 있습니다. 아래의 많은 답변에서 볼 수 있듯이 이에 대해 매우 명확하고 유용한 답변이 있습니다.
Phrogz

3
@ Phrogz : 나는 그것을보고 질문에 대답 할 수 없게 만듭니다.
SilentGhost

2
@Phrongz-내가 게시 한 메타 주제에 대해 말한 것을 반영하기 위해이 질문의 문제는 문제 공간이 너무 크다는 것입니다. 단 하나의 질문에 대해서만 너무 큰 주제입니다. 두 언어 사이에는 수천 가지 차이점이 있습니다.
Adam Davis

답변:


153

다음은 몇 가지 주요 차이점입니다.

  1. 루비에는 블록이 있습니다. 파이썬은 그렇지 않습니다.

  2. 파이썬에는 함수가 있습니다. 루비는 그렇지 않습니다. 파이썬에서는 어떤 함수 나 메소드를 가져 와서 다른 함수로 전달할 수 있습니다. 루비에서는 모든 것이 메소드이므로 메소드를 직접 전달할 수 없습니다. 대신, 당신은 그들을 통과하기 위해 Proc 's에 포장해야합니다.

  3. 루비와 파이썬은 클로저를 지원하지만 다른 방식으로 지원합니다. 파이썬에서는 다른 함수 안에 함수를 정의 할 수 있습니다. 내부 함수는 외부 함수에서 변수에 대한 읽기 액세스 권한을 갖지만 쓰기 액세스는 할 수 없습니다. Ruby에서는 블록을 사용하여 클로저를 정의합니다. 클로저는 외부 범위에서 변수에 대한 전체 읽기 및 쓰기 액세스 권한을 갖습니다.

  4. 파이썬에는 목록 이해력이 있습니다. 예를 들어 숫자 목록이 있으면 다음과 같이 쓸 수 있습니다.

    [x*x for x in values if x > 15]

    15보다 큰 모든 값의 제곱의 새로운 목록을 얻으려면 Ruby에서 다음을 작성해야합니다.

    values.select {|v| v > 15}.map {|v| v * v}

    루비 코드는 컴팩트하지 않습니다. 또한 값 배열을 먼저 15보다 큰 값을 포함하는 더 짧은 중간 배열로 변환하기 때문에 비효율적입니다. 그런 다음 중간 배열을 취하여 중간 제곱을 포함하는 최종 배열을 생성합니다. 그런 다음 중간 배열이 처리됩니다. 따라서 Ruby는 계산 중에 메모리에 3 개의 배열로 끝납니다. 파이썬은 입력 목록과 결과 목록 만 필요합니다.

    파이썬도 비슷한지도 이해력을 제공합니다.

  5. 파이썬은 튜플을 지원합니다; 루비는 그렇지 않습니다. Ruby에서는 배열을 사용하여 튜플을 시뮬레이션해야합니다.

  6. Ruby는 switch / case 문을 지원합니다. 파이썬은 그렇지 않습니다.

  7. 루비는 표준 expr ? val1 : val2삼항 연산자를 지원합니다 . 파이썬은 그렇지 않습니다.

  8. 루비는 단일 상속 만 지원합니다. 다중 상속을 모방해야하는 경우 모듈을 정의하고 믹스 인을 사용하여 모듈 메소드를 클래스로 가져올 수 있습니다. 파이썬은 모듈 믹스 인보다는 다중 상속을 지원합니다.

  9. 파이썬은 단선 람다 함수 만 지원합니다. 일종의 람다 함수 인 루비 블록은 임의로 커질 수 있습니다. 이 때문에 Ruby 코드는 일반적으로 Python 코드보다 더 기능적인 스타일로 작성됩니다. 예를 들어 Ruby에서 목록을 반복하려면 일반적으로

    collection.each do |value|
      ...
    end

    블록은에 전달되는 함수와 매우 유사하게 작동합니다 collection.each. 파이썬에서 동일한 작업을 수행하려면 명명 된 내부 함수를 정의한 다음 각 메소드에 컬렉션에 전달해야합니다 (목록 이이 메소드를 지원하는 경우).

    def some_operation(value):
      ...
    
    collection.each(some_operation)

    그것은 아주 잘 흐르지 않습니다. 따라서 일반적으로 다음과 같은 비 기능적 접근 방식이 Python에서 사용됩니다.

    for value in collection:
      ...
  10. 안전한 방법으로 자원을 사용하는 것은 두 언어 사이에서 상당히 다릅니다. 여기서 문제는 일부 리소스를 할당하고 (파일 열기, 데이터베이스 커서 얻기 등) 임의의 작업을 수행 한 다음 예외가 발생하더라도 안전한 방식으로 닫으려고한다는 것입니다.

    Ruby에서는 블록을 사용하기가 쉽기 때문에 (# 9 참조) 일반적으로이 패턴을 임의의 작업이 리소스에서 수행되도록 블록을 취하는 메소드로 코딩합니다.

    파이썬에서, 임의의 액션을위한 함수를 전달하는 것은 명명 된 내부 함수를 작성해야하기 때문에 조금 복잡합니다 (# 9 참조). 대신 파이썬은 with안전한 리소스 처리를 위해 명령문을 사용합니다 . Python 객체를 올바르게 정리하는 방법을 참조하십시오 . 상세 사항은.


2
3. 파이썬 3 nonlocal이 4 파이썬도 제공 수정 당신은 지능형리스트와 유사한 표현을 (발전기, 이에 물었다 때까지하지 컴퓨팅 아무것도 할 - 공급 발전기 식으로 지능형리스트 생각하는 list모든 것을 포함하는 목록 반복 가능하고 수익을 걸립니다 ( iterable yielded)-경우에 따라 많은 노력을 절약 할 수 있습니다).

25
7. 그렇습니다. val1 if expr else val2. 8. 나는 그것이 대부분 믹스 인 스타일 증강에 사용되는 것을 본다.

2
@ClintMiller Whoa, 스위치 / 케이스가 없습니까? 그렇다면 파이썬에서 비슷한 기능을 달성하기 위해 제안 된 방법은 무엇입니까? if / else / if?
Phrogz

15
# 4의 루비 예제는 관용적이지 않습니다. 쓰는 것이 더 루비 쉬고 읽을 수 values.map{|v| v*v if v > 15}.compact있습니다. IMHO, 이것은 파이썬 예제보다 훨씬 표현 적이며 분명합니다.
sml

10
위의! 컴팩트 함수의 버전은 배열의 사본을 피합니다 values.map{|v| v*v if v > 15}.compact!. 즉, 입력 목록과 결과 목록 만 메모리에 존재합니다. 여기 # 4를 참조하십시오 : igvita.com/2008/07/08/6-optimization-tips-for-ruby-mri
SML

27

나는 6 년의 루비 후에 파이썬을 배우는데 몇 달을 보냈습니다. 두 언어에 대한 비교는 그리 많지 않았으므로 직접 작성하고 직접 작성하기로 결정했습니다. 지금, 그것은이 되어 주로 함수형 프로그래밍에 관심을하지만, 당신이 언급 이후 루비의inject 방법을, 나는 우리가 같은 파장에있어 같은데요.

이것이 도움이되기를 바랍니다 : 파이썬의 '추악함'

올바른 방향으로 움직일 수있는 몇 가지 사항 :

  • Ruby에서 사용하는 모든 기능적 프로그래밍 장점은 Python에 있으며 훨씬 더 쉽습니다. 예를 들어, 예상대로 정확하게 함수를 매핑 할 수 있습니다.

    def f(x):
        return x + 1
    
    map(f, [1, 2, 3]) # => [2, 3, 4]
  • 파이썬에는처럼 작동하는 메소드가 없습니다 each. each부작용 에만 사용 하기 때문에 파이썬과 동등한 것은 for 루프입니다.

    for n in [1, 2, 3]:
        print n
  • 목록 이해는 a) 함수와 객체 컬렉션을 함께 처리해야하고 b) 여러 인덱스를 사용하여 반복해야 할 때 좋습니다. 예를 들어, 문자열에서 모든 회문을 찾으려면 (회문에 대해 p()true를 반환 하는 함수 가 있다고 가정하면 ) 단일 목록 이해 만 있으면됩니다.

    s = 'string-with-palindromes-like-abbalabba'
    l = len(s)
    [s[x:y] for x in range(l) for y in range(x,l+1) if p(s[x:y])]

3
한숨, 나는 그 게시물을 읽고 내 의심을 확인합니다. 파이썬에서 특수 메소드의 역할과 유틸리티를 이해하는 사람은 거의 없습니다. 그것들은 엄청나게 유용하고 표준화되어 있으며 자주 구현하는 내장과의 이름 충돌을 피하기 위해 밑줄이 그어져 있습니다. 실제로 파이썬을 아는 사람은 사용을 권장하지 않습니다.
Rafe Kettler

5
방법이 어떻게 작동하는지 이해하지 못하는 것 같습니다. 메소드는 본질적으로 첫 번째 인수가 메소드가 속한 클래스의 인스턴스 인 함수입니다. 쓸 때 Class.method메소드는 "unbound"이고 첫 번째 인수는 Class인스턴스 여야 합니다. 쓰면 object.method메소드는의 object인스턴스에 "바운드"됩니다 Class. 이를 통해 map 등을 사용하여 매번 차이 인스턴스에서 메소드를 호출하거나 (바인드되지 않은 메소드 전달) 인스턴스를 고정 상태로 유지하고 매번 다른 두 번째 인수를 전달할 수 있습니다. 둘 다 유용합니다.
LaC

2
네 말이 맞아, 나는 그들이 어떻게 작동하는지 이해하지 못했다. 기사를 게시 한 이후로 더 잘 이해했습니다. 감사!
David J.

10
[s[x:y] for x in range(l) for y in range(x,l+1) if p(s[x:y])]-이 줄은 파이썬이 읽기 어려운 정도를 보여줍니다. 루비 코드를 읽으면 돌아 오지 않고 눈을 왼쪽에서 오른쪽으로 움직입니다. 그러나 파이썬 코드를 읽으려면 왼쪽-오른쪽-왼쪽-오른쪽-왼쪽-오른쪽으로 가야합니다. 괄호, 괄호, 괄호, 괄호 ... 또한 파이썬에서는 종종 메소드와 함수를 혼합해야합니다. 광기 : E(C(A.B()).D())Ruby 대신A.B.C.D.E
Nakilon

2
@Nakilon 그렇기 때문에 위와 같지 않은 단순한 경우에만 중첩 목록 이해를 사용해야합니다. 문자열에서 모든 회문을 찾는 하나의 라이너를 작성하는 것은 '영리한'일 수도 있지만 코드 골프 용으로 가장 적합합니다. 다른 사람이 나중에 읽어야하는 실제 코드의 경우 몇 줄 함수 만 작성하면됩니다. 예, 그 줄은 읽기 어렵지만 언어의 문제가 아니라 프로그래머의 잘못입니다.
Cam Jackson

10

내 제안 : 차이점을 배우려고하지 마십시오. 파이썬에서 문제에 접근하는 방법을 배우십시오. 각 문제에 대한 루비 접근법이있는 것처럼 (언어의 한계와 강점을 잘 제공하는 것처럼), 문제에 대한 파이썬 접근법이 있습니다. 둘 다 다릅니다. 각 언어를 최대한 활용하려면 언어 간의 "번역"뿐만 아니라 언어 자체를 실제로 배워야합니다.

이제 말했듯이 차이점은 더 빨리 적응하고 Python 프로그램을 1 번 수정하는 데 도움이됩니다. 그리고 그것은 글쓰기를 시작하기에 좋습니다. 그러나 다른 프로젝트에서 언어의 의미론이 아닌 아키텍처 및 디자인 결정의 이유를 배우십시오 ...


7
당신의 제안에 감사드립니다. 나는 감정에 전적으로 동의한다 ( "관용적 파이썬 프로그래밍 배우기") . 바로 내가하려고하는 일입니다. "루비의 each방법에 대한 파이썬 이름은 무엇입니까 ?" 라고 묻지 않습니다. 내가 부탁 해요 "일이 루비에서 파이썬 다른 제대로 수행하는 방법과 장소는 제대로 같은 완료?" 파이썬 false이 실제로 False라면 루비 케스 방식으로 언제 어디서해야하는지, 언제 어디서해야하는지 아는 것이 중요합니다.
Phrogz

2
@Phrogz : 공평합니다. 귀하의 질문을 해석 한 방식은 다음과 같습니다. 차이점을 목록으로 작성하여 프로그래밍중인 언어를 변경할 수 있습니다 . 그러나 그것은 공정한 질문입니다. 나는 당신이 요구 한 것을 잘못 해석했다고 생각합니다. 나는 이것을 참고로 여기에 남겨 둘 것이지만, 무엇이 더 나올지 보는 것은 흥미로울 것이다…
ircmaxell

나는 파이썬과 루비를 동시에 배우고 있으며 웹 응용 프로그램 개발자에서는 차이점보다 더 많은 유사점을 봅니다.
WesternGun

8

나는 작은 루비를 알고 있지만 다음은 언급 한 것들에 대한 몇 가지 요점입니다.

  • nil가치의 부족을 나타내는 값이 될 것이다 None(당신처럼 그것을 확인하는 것이 참고 x is None하거나 x is not None,하지로 ==- 또는 부울로 강제로, 다음 지점을 참조).
  • None제로 - 억양 번호 ( 0, 0.0, 0j(복소수))와 빈 컬렉션 ( [], {}, set(), 빈 문자열"" 등) falsy, 다른 모든 고려 truthy 간주됩니다.
  • 부작용의 경우 ( for-) 루프를 명시 적으로 반복하십시오. 부작용없이 새로운 것들을 생성하려면, 목록 이해력 (또는 그들의 친척-게으른 일회성 반복자에 대한 생성자 표현, 해당 콜렉션에 대한 dict / set 이해력)을 사용하십시오.

루핑에 대해 : foriterable (! no counting)에서 작동하는, 및 while기대하는 것을 수행합니다. 이터레이터에 대한 광범위한 지원 덕분에 발신자가 훨씬 강력합니다. 목록 대신 반복자가 될 수있는 거의 모든 것이 반복자 일뿐입니다 (적어도 Python 3-Python 2에서는 기본값이 모두 목록이며 슬프게도 목록입니다). (가) 반복자 작업을위한 다양한 도구 - zip병렬로 반복 가능 객체의 수를 반복 할, enumerate당신을 제공합니다 (index, item)(에 어떤 심지어 abritary (가능성이 크거나 무한) 반복 가능 객체를 얇게, 단지 목록에 반복 가능)! 이것들은 많은 반복 작업을 훨씬 간단하게 만듭니다. 말할 필요도없이,리스트 이해, 생성기 표현 등과 잘 통합됩니다.


2
생성기 표현이 멋지다. 그들은 파이썬에게 Haskell과 같은 언어의 게으른 평가 기능을 제공합니다.
클린트 밀러

@Clint : 그렇습니다. 전체 발전기는 훨씬 더 성능이 뛰어납니다 (단, 간단한 경우에는 필요하지 않지만 대부분 발생합니다).

x is None또는 왜 확인 x is not None합니까? 나는 항상 확인 x == None하고 x != None.
John

@ 존 : 바보 같은 방식으로 x정의 __eq__하면 잘못된 긍정을 줄 수 있습니다. 이 경우 __eq__주의 깊게 충분히 프로그래밍되지, 그것은 (예를 들어 충돌 수 AttributeError(IE)를 주어 특정 값을 None). 반대로, is재정의 될 수는 없습니다. 단일을 확인하는 가장 올바른 (가장 강력하고 단순하며 가장 깨끗한) 방법 인 객체 ID를 항상 비교합니다.

1
@남자. "x is None"은 절대적으로 관용적 인 방법입니다. python.net/~goodger/projects/pycon/2007/idiomatic/handout.html
tokland

6

Ruby에서 인스턴스 변수와 메소드는 attr_accessor 또는 이와 유사한 것을 명시 적으로 연관시키는 경우를 제외하고는 완전히 관련이 없습니다.

파이썬에서 메소드는 특별한 속성 클래스, 즉 실행 가능한 클래스입니다.

예를 들어 :

>>> class foo:
...     x = 5
...     def y(): pass
... 
>>> f = foo()
>>> type(f.x)
<type 'int'>
>>> type(f.y)
<type 'instancemethod'>

그 차이는 예를 들어 fx를 참조하는 것이 메소드 오브젝트를 호출하는 것이 아니라 메소드 오브젝트를 참조하는 것과 같이 많은 영향을 미칩니다. 또한 알 수 있듯이 fx는 기본적으로 public이고 Ruby에서는 인스턴스 변수가 기본적으로 private입니다.


2
실제로, 나는 그것을 훨씬 더 확연히 말하고 싶습니다 : 파이썬에서는 메소드가 특정 종류의 속성 인 반면, 루비에서는 속성이 특정 종류의 메소드입니다. 파이썬에서 퍼스트 클래스 기능, 루비의 통일 접근 원칙 : 두 언어 사이의 몇 가지 중요한 대조 기능이 밖으로 가을
philomory
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.