[python] 루비에서 파이썬 배우기; 차이점과 유사점
나는 루비를 잘 알고있다. 나는 현재 파이썬을 배울 필요가 있다고 생각합니다. 두 가지를 모두 알고있는 사람들에게는 두 개념이 비슷한 개념과 다른 개념은 무엇입니까?
JavaScripter를 위해 Learning Lua를 위해 작성한 입문서와 비슷한 목록을 찾고 있습니다 . 공백의 중요성 및 반복 구조와 같은 간단한 것 nil
파이썬 의 이름 , 그리고 “가상”으로 간주되는 값; 그것은 동등한 사용하는 관용적 인 map
과 each
, 또는이다 중얼 somethingaboutlistcomprehensions가 중얼 규범?
다양한 답변을 얻을 수 있다면 커뮤니티 위키로 모아서 기쁩니다. 그렇지 않으면 당신은 모두 하나의 진정한 포괄적 인 목록을 만들려고 서로 싸울 수 있습니다.
편집 : 분명히, 내 목표는 “적절하고”관용적 인 파이썬입니다. 파이썬과 동등한 파이썬이 inject
있지만 목록을 반복하고 결과를 누적하는 일반적인 기능을 수행하는 더 나은 / 다른 방법이 있기 때문에 아무도 그것을 사용하지 않는다면, 나는 당신이하는 일을 알고 싶습니다. 아마도이 질문을 일반적인 목표 목록, 루비에서 어떻게 달성하는지, 파이썬에서 동등한 것이 무엇인지 물어볼 것입니다.
답변
다음은 몇 가지 주요 차이점입니다.
-
루비에는 블록이 있습니다. 파이썬은 그렇지 않습니다.
-
파이썬에는 함수가 있습니다. 루비는 그렇지 않습니다. 파이썬에서는 어떤 함수 나 메소드를 가져 와서 다른 함수로 전달할 수 있습니다. 루비에서는 모든 것이 메소드이므로 메소드를 직접 전달할 수 없습니다. 대신, 당신은 그들을 통과하기 위해 Proc ‘s에 포장해야합니다.
-
루비와 파이썬은 클로저를 지원하지만 다른 방식으로 지원합니다. 파이썬에서는 다른 함수 안에 함수를 정의 할 수 있습니다. 내부 함수는 외부 함수에서 변수에 대한 읽기 액세스 권한을 갖지만 쓰기 액세스는 할 수 없습니다. Ruby에서는 블록을 사용하여 클로저를 정의합니다. 클로저는 외부 범위에서 변수에 대한 전체 읽기 및 쓰기 액세스 권한을 갖습니다.
-
파이썬에는 목록 이해력이 있습니다. 예를 들어 숫자 목록이 있으면 다음과 같이 쓸 수 있습니다.
[x*x for x in values if x > 15]
15보다 큰 모든 값의 제곱의 새로운 목록을 얻으려면 Ruby에서 다음을 작성해야합니다.
values.select {|v| v > 15}.map {|v| v * v}
루비 코드는 컴팩트하지 않습니다. 또한 값 배열을 먼저 15보다 큰 값을 포함하는 더 짧은 중간 배열로 변환하기 때문에 비효율적입니다. 그런 다음 중간 배열을 취하여 중간 제곱을 포함하는 최종 배열을 생성합니다. 그런 다음 중간 배열이 처리됩니다. 따라서 Ruby는 계산 중에 메모리에 3 개의 배열로 끝납니다. 파이썬은 입력 목록과 결과 목록 만 필요합니다.
파이썬도 비슷한지도 이해력을 제공합니다.
-
파이썬은 튜플을 지원합니다; 루비는 그렇지 않습니다. Ruby에서는 배열을 사용하여 튜플을 시뮬레이션해야합니다.
-
Ruby는 switch / case 문을 지원합니다. 파이썬은 그렇지 않습니다.
-
루비는 표준expr ? val1 : val2
삼항 연산자를 지원합니다 . 파이썬은 그렇지 않습니다. -
루비는 단일 상속 만 지원합니다. 다중 상속을 모방해야하는 경우 모듈을 정의하고 믹스 인을 사용하여 모듈 메소드를 클래스로 가져올 수 있습니다. 파이썬은 모듈 믹스 인보다는 다중 상속을 지원합니다.
-
파이썬은 단선 람다 함수 만 지원합니다. 일종의 람다 함수 인 루비 블록은 임의로 커질 수 있습니다. 이 때문에 Ruby 코드는 일반적으로 Python 코드보다 더 기능적인 스타일로 작성됩니다. 예를 들어 Ruby에서 목록을 반복하려면 일반적으로
collection.each do |value| ... end
블록은에 전달되는 함수와 매우 유사하게 작동합니다
collection.each
. 파이썬에서 동일한 작업을 수행하려면 명명 된 내부 함수를 정의한 다음 각 메소드에 컬렉션에 전달해야합니다 (목록 이이 메소드를 지원하는 경우).def some_operation(value): ... collection.each(some_operation)
그것은 아주 잘 흐르지 않습니다. 따라서 일반적으로 다음과 같은 비 기능적 접근 방식이 Python에서 사용됩니다.
for value in collection: ...
-
안전한 방법으로 자원을 사용하는 것은 두 언어 사이에서 상당히 다릅니다. 여기서 문제는 일부 리소스를 할당하고 (파일 열기, 데이터베이스 커서 얻기 등) 임의의 작업을 수행 한 다음 예외가 발생하더라도 안전한 방식으로 닫으려고한다는 것입니다.
Ruby에서는 블록을 사용하기가 쉽기 때문에 (# 9 참조) 일반적으로이 패턴을 임의의 작업이 리소스에서 수행되도록 블록을 취하는 메소드로 코딩합니다.
파이썬에서, 임의의 액션을위한 함수를 전달하는 것은 명명 된 내부 함수를 작성해야하기 때문에 조금 복잡합니다 (# 9 참조). 대신 파이썬은
with
안전한 리소스 처리를 위해 명령문을 사용합니다 . Python 객체를 올바르게 정리하는 방법을 참조하십시오 . 상세 사항은.
답변
나는 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])]
답변
내 제안 : 차이점을 배우려고하지 마십시오. 파이썬에서 문제에 접근하는 방법을 배우십시오. 각 문제에 대한 루비 접근법이있는 것처럼 (언어의 한계와 강점을 잘 제공하는 것처럼), 문제에 대한 파이썬 접근법이 있습니다. 둘 다 다릅니다. 각 언어를 최대한 활용하려면 언어 간의 “번역”뿐만 아니라 언어 자체를 실제로 배워야합니다.
이제 말했듯이 차이점은 더 빨리 적응하고 Python 프로그램을 1 번 수정하는 데 도움이됩니다. 그리고 그것은 글쓰기를 시작하기에 좋습니다. 그러나 다른 프로젝트에서 언어의 의미론이 아닌 아키텍처 및 디자인 결정의 이유를 배우십시오 …
답변
나는 작은 루비를 알고 있지만 다음은 언급 한 것들에 대한 몇 가지 요점입니다.
nil
가치의 부족을 나타내는 값이 될 것이다None
(당신처럼 그것을 확인하는 것이 참고x is None
하거나x is not None
,하지로==
– 또는 부울로 강제로, 다음 지점을 참조).None
제로 – 억양 번호 (0
,0.0
,0j
(복소수))와 빈 컬렉션 ([]
,{}
,set()
, 빈 문자열""
등) falsy, 다른 모든 고려 truthy 간주됩니다.- 부작용의 경우 (
for
-) 루프를 명시 적으로 반복하십시오. 부작용없이 새로운 것들을 생성하려면, 목록 이해력 (또는 그들의 친척-게으른 일회성 반복자에 대한 생성자 표현, 해당 콜렉션에 대한 dict / set 이해력)을 사용하십시오.
루핑에 대해 : for
iterable (! no counting)에서 작동하는, 및 while
기대하는 것을 수행합니다. 이터레이터에 대한 광범위한 지원 덕분에 발신자가 훨씬 강력합니다. 목록 대신 반복자가 될 수있는 거의 모든 것이 반복자 일뿐입니다 (적어도 Python 3-Python 2에서는 기본값이 모두 목록이며 슬프게도 목록입니다). (가) 반복자 작업을위한 다양한 도구 – zip
병렬로 반복 가능 객체의 수를 반복 할, enumerate
당신을 제공합니다 (index, item)
(에 어떤 심지어 abritary (가능성이 크거나 무한) 반복 가능 객체를 얇게, 단지 목록에 반복 가능)! 이것들은 많은 반복 작업을 훨씬 간단하게 만듭니다. 말할 필요도없이,리스트 이해, 생성기 표현 등과 잘 통합됩니다.
답변
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입니다.