Ruby로부터 Python 배우기; 차이점과 유사점
저는 루비를 잘 압니다.지금 당장 파이썬을 배워야 할 것 같습니다.둘 다 아는 사람들에게, 둘 사이에 어떤 개념이 비슷하고, 무엇이 다릅니까?
저는 Learning Lua for JavaScripts에 작성한 입문서와 유사한 목록을 찾고 있습니다: 공백 의미 및 루프 구조와 같은 간단한 것;nil
파이썬에서, 그리고 어떤 값이 "진실"로 간주되는지; 동등한 것을 사용하는 것이 관용적입니까?map
그리고.each
아니면 목록 이해에 대해 중얼거리는 것이 일반적인가요?
만약 제가 다양한 답을 얻는다면, 저는 기꺼이 그것들을 커뮤니티 위키로 통합하는 것을 기쁘게 생각합니다.아니면 여러분 모두가 서로 싸우고 서로에게 거짓말을 해서 하나의 진정한 포괄적인 목록을 만들 수 있습니다.
편집: 분명히 말씀드리자면, 제 목표는 "적절한" 관용적인 파이썬입니다.다음과 같은 Python이 있는 경우inject
그러나 목록을 반복하고 그 과정에서 결과를 축적하는 공통 기능을 달성할 수 있는 더 나은/다른 방법이 있기 때문에 아무도 사용하지 않습니다. 저는 당신이 어떻게 일을 하는지 알고 싶습니다.아마도 저는 이 질문을 루비에서 어떻게 목표를 달성하는지에 대한 목록으로 업데이트하고 Python에서 그에 상응하는 것이 무엇인지 물어볼 것입니다.
저의 주요 차이점은 다음과 같습니다.
Ruby에는 블록이 있지만 Python에는 블록이 없습니다.
Python에는 기능이 있지만 Ruby에는 기능이 없습니다.Python에서는 어떤 함수나 메소드를 가져다가 다른 함수로 전달할 수 있습니다.루비에서는 모든 것이 메소드이며 메소드를 직접 전달할 수 없습니다.대신에, 당신은 그것들을 통과시키기 위해 Proc's로 포장해야 합니다.
Ruby와 Python은 모두 폐쇄를 지원하지만, 다른 방식으로 폐쇄를 지원합니다.Python에서는 다른 함수 안에 함수를 정의할 수 있습니다.내부 함수는 외부 함수에서 변수에 대한 읽기 액세스 권한을 가지고 있지만 쓰기 액세스 권한은 가지고 있지 않습니다.루비에서는 블럭을 사용하여 폐쇄를 정의합니다.폐쇄는 외부 범위에서 변수에 대한 전체 읽기 및 쓰기 액세스 권한을 가집니다.
Python은 목록 이해를 가지고 있는데, 이것은 꽤 표현력이 있습니다.예를 들어, 만약 당신이 숫자들의 목록을 가지고 있다면, 당신은 쓸 수 있습니다.
[x*x for x in values if x > 15]
15보다 큰 모든 값의 제곱 리스트를 새로 가져옵니다.Ruby에서는 다음과 같이 적어야 합니다.
values.select {|v| v > 15}.map {|v| v * v}
루비 코드는 컴팩트하게 느껴지지 않습니다.또한 먼저 값 배열을 15보다 큰 값을 포함하는 더 짧은 중간 배열로 변환하기 때문에 효율적이지 않습니다.그런 다음 중간 배열을 사용하여 중간의 제곱을 포함하는 최종 배열을 생성합니다.그런 다음 중간 배열이 삭제됩니다.따라서 Ruby는 계산 중에 3개의 어레이를 메모리에 저장합니다. Python은 입력 목록과 결과 목록만 필요합니다.
Python은 또한 유사한 지도 이해를 제공합니다.
Python은 튜플을 지원하지만 Ruby는 지원하지 않습니다.루비에서는 튜플을 시뮬레이션하기 위해 배열을 사용해야 합니다.
Ruby는 스위치/케이스 문을 지원하지만 Python은 지원하지 않습니다.
는 표준 를 지원합니다.expr ? val1 : val2
3차 연산자; Python은 그렇지 않습니다.Ruby는 단일 상속만 지원합니다.다중 상속을 모방해야 하는 경우 모듈을 정의하고 혼합을 사용하여 모듈 메서드를 클래스로 가져올 수 있습니다.Python은 모듈 믹스인이 아닌 여러 상속을 지원합니다.
Python은 한 줄 람다 함수만 지원합니다.일종의 람다 함수인 루비 블록은 임의로 클 수 있습니다.이 때문에 Ruby 코드는 일반적으로 Python 코드보다 더 기능적인 스타일로 작성됩니다.예를 들어, Ruby에서 목록을 루프하려면 일반적으로 다음 작업을 수행합니다.
collection.each do |value| ... end
블록은 전달되는 함수와 매우 유사하게 작동합니다.
collection.each
Python에서 동일한 작업을 수행하려면 명명된 내부 함수를 정의한 다음 각 메서드를 컬렉션에 전달해야 합니다(목록에서 이 메서드를 지원하는 경우).def some_operation(value): ... collection.each(some_operation)
그것은 잘 흐르지 않습니다.따라서 일반적으로 Python에서는 다음과 같은 비기능적 접근 방식이 사용됩니다.
for value in collection: ...
안전한 방법으로 리소스를 사용하는 것은 두 언어 간에 상당히 다릅니다.여기서 문제는 일부 리소스를 할당하고(파일 열기, 데이터베이스 커서 가져오기 등), 해당 리소스에 대해 임의 작업을 수행한 다음 예외가 발생하더라도 안전한 방식으로 닫으려는 것입니다.
Ruby에서는 블록을 사용하기가 매우 쉬우므로(#9 참조), 일반적으로 임의 작업이 리소스에서 수행되는 데 블록을 사용하는 방법으로 이 패턴을 코딩합니다.
파이썬에서 임의 동작을 위한 함수를 전달하는 것은 명명된 내부 함수를 작성해야 하기 때문에 조금 더 둔탁합니다(#9 참조).은 "Python"을 사용합니다.
with
안전한 리소스 처리를 위한 문입니다.Python 개체를 올바르게 정리하는 방법을 참조하십시오.자세한 내용은
처럼 나도당럼처를 .inject
Python을 학습할 때 기타 기능적 방법을 사용할 수 있습니다.저는 그들이 모두 거기에 있지 않거나 Python이 필수적인 접근 방식을 선호한다는 것을 알고 실망했습니다.그렇긴 하지만, 보시면 대부분의 건축물들이 그곳에 있습니다.어떤 경우에는, 도서관이 상황을 더 좋게 만들 것입니다.
저를 위한 몇 가지 주요 사항:
Ruby에서 알고 있는 기능적 프로그래밍 패턴은 Python에서 사용할 수 있습니다.그들은 단지 조금 다르게 보일 뿐입니다.예를 들어 지도 기능이 있습니다.
def f(x): return x + 1 map(f, [1, 2, 3]) # => [2, 3, 4]
마찬가지로 목록을 접는 기능 등이 있습니다.
즉, Python은 블록이 부족하고, 함수를 연결하거나 구성하기 위한 간소화된 구문이 없습니다. (블록 없이 이를 수행하는 좋은 방법은 Haskell의 풍부한 구문을 확인하십시오.)
이런저런 이유로, 파이썬 커뮤니티는 루비에서 돌연변이 없이 수행될 것들에 대한 명령적 반복을 선호하는 것 같습니다.들어 접기 접기), 접기(접기,
inject
로 수행되는 가 많습니다.for
대신 루프를 사용합니다.reduce
:running_total = 0 for n in [1, 2, 3]: running_total = running_total + n
이는 단순한 컨벤션이 아니라 Python 유지 관리자에 의해 강화되었습니다.예를 들어, Python 3 릴리스 노트는 다음과 같이 명확하게 선호합니다.
for
루프한 위의 루프reduce
:사용하다
functools.reduce()
만약 당신이 그것이 정말로 필요하다면; 하지만, 99 퍼센트의 시간은 명시적입니다.for
루프가 더 읽기 쉽습니다.목록 이해는 복잡한 함수 연산을 표현하는 간결한 방법입니다(해스켈의 목록 모나드와 유사함).이러한 기능은 Ruby에서 사용할 수 없으며 일부 시나리오에서는 도움이 될 수 있습니다.예를 들어, 한 줄의 모든 팔린드롬을 찾기 위한 브루트 포스 원라이너(함수가 있다고 가정)
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의 메소드는 많은 경우 컨텍스트 없는 함수로 취급될 수 있으며, 이는 Ruby에서 익숙해져야 하지만 상당히 강력할 수 있습니다.
만약 이것이 도움이 된다면, 저는 2011년에 여기에 더 많은 생각을 썼습니다.파이썬의 '못생김'.ML에 대한 오늘의 초점을 고려하여 업데이트가 필요할 수 있습니다.
내 제안:차이점을 배우려고 하지 마세요.Python에서 문제에 접근하는 방법에 대해 알아봅니다.각 문제에 Ruby 접근 방식이 있는 것처럼(언어의 한계와 강점을 고려할 때 매우 잘 작동함), 문제에 Python 접근 방식이 있습니다.둘 다 다릅니다.각 언어를 최대한 활용하기 위해서는 단순히 "번역"을 다른 언어로 바꾸는 것이 아니라 언어 자체를 배워야 합니다.
이제, 그것과 함께, 그 차이는 당신이 더 빨리 적응하고 파이썬 프로그램에 1 off 수정을 하는 데 도움이 될 것입니다.글을 쓰기 시작하는 것도 좋습니다.하지만 다른 프로젝트에서 언어의 의미론보다는 아키텍처와 디자인 결정의 이면에 있는 이유를 배우려고 노력합니다.
저는 루비를 잘 모르지만, 당신이 언급한 것들에 대한 몇 가지 요점이 있습니다.
nil
값이 부족함을 나타내는 값은 다음과 같습니다.None
((으)와 같이x is None
또는x is not None
는다가 아닌==
또는 강제로 부울(boolean)로 전환하여 다음 점을 참조하십시오.None
숫자0-esque 숫자(()0
,0.0
,0j
및 빈으)로 표시)[]
,{}
,set()
문자열 빈""
등)은 거짓으로 간주되고, 다른 모든 것은 진실로 간주됩니다.- (부용의경우작▁(,경우,
for
-) 명시적으로 루프합니다.부작용 없이 새로운 항목을 생성하려면 목록 이해(또는 해당 관계식 - 게으른 일회성 반복자에 대한 생성자 표현식, 해당 컬렉션에 대한 dict/set 이해)를 사용합니다.
루프 관련:당신은 가지고 있다for
이는 반복 가능(! 카운트 없음)으로 작동합니다.while
당신이 기대하는 것을 할 수 있습니다.반복기에 대한 광범위한 지원 덕분에 프로퍼는 훨씬 더 강력합니다.목록 대신 반복자가 될 수 있는 거의 모든 것이 반복자일 뿐만 아니라(적어도 파이썬 3 - 파이썬 2에서는 둘 다 있고 기본값은 목록입니다).반복기로 작업할 수 있는 수많은 도구가 있습니다.zip
로 반복합니다.enumerate
에게 에게주는을 줍니다.(index, item)
(목록뿐만 아니라 반복 가능한 모든 항목에서), 심지어 대규모(대규모 또는 무한대) 반복 가능한 항목을 슬라이스합니다!저는 이것들이 많은 루프 작업을 훨씬 더 단순하게 만든다는 것을 알게 되었습니다.말할 필요도 없이, 그것들은 목록 이해, 생성자 표현식 등과 잘 통합됩니다.
Ruby에서 인스턴스 변수와 메서드는 완전히 관련이 없습니다. 단, 사용자가 명시적으로 attr_accessor와 관련이 있는 경우는 예외입니다.
Python에서 메서드는 실행 가능한 특성의 특수 클래스에 불과합니다.
예를 들어 다음과 같습니다.
>>> class foo:
... x = 5
... def y(): pass
...
>>> f = foo()
>>> type(f.x)
<type 'int'>
>>> type(f.y)
<type 'instancemethod'>
예를 들어 f.x를 참조하는 것이 메서드 개체를 호출하는 것이 아니라 메서드 개체를 참조하는 것과 같이 이러한 차이는 많은 의미를 갖습니다.또한 보시다시피 f.x는 기본적으로 공용이지만 Ruby에서는 인스턴스 변수가 기본적으로 비공개입니다.
언급URL : https://stackoverflow.com/questions/4769004/learning-python-from-ruby-differences-and-similarities
'programing' 카테고리의 다른 글
R 마크다운에 그림/표 삽입 (0) | 2023.06.05 |
---|---|
py.test 테스트를 실행하도록 PyCharm을 구성하려면 어떻게 해야 합니까? (0) | 2023.06.05 |
Firebase 사용자 테이블에 추가 세부 정보 추가 (0) | 2023.06.05 |
요소가 활성화되었을 때 indexpath.row를 가져오는 방법은 무엇입니까? (0) | 2023.05.31 |
CSS에서 다중 변환을 적용하는 방법은 무엇입니까? (0) | 2023.05.31 |