답변:
자바 녀석을 위해 파이썬은 누구나 클럽을 잡고 당신의 머리를 날려 버릴 수있는 무질서한 playgound입니다.
파이썬 녀석에게 Java는 Orwellian 우주이며, 우주가 어떻게 움직이는 지에 대한 다른 사람의 감소하는 시각에 끊임없이 얽매여 있습니다.
진실은 당신이 한 언어로 당신이 다른 언어로 깨끗하게 할 수있는 모든 것입니다. 그러나 당신이 언급 한 바와 같이, 깨끗한 것이 무엇을 의미 하는지에 대해서는 두 공동체에서 중요한 차이가 있습니다 .
Java 방식 : 깨끗한 시스템은 의도 된 것을 수행하고 다른 목적을 수행하지 않는 시스템으로, 의도 된 목적의 특성에 위배되는 확장 또는 수정을 허용하지 않으며 컴파일러를 통해 가능한 한 많이 시행합니다. 엄격한 구조 내에서 간단한 인터페이스를 신중하게 제작하여 유연성을 얻을 수 있습니다. Java에서는 샌드 박스가 항상 명확하게 묶여 있어야하며 컴파일러의 신속한 피드백으로 충족되어야합니다. Java는 객체 구조 를 정적으로 정의하고 인스턴스로부터 동적 상호 작용을 생성하는 수단을 제공 합니다. Java로 작업 할 때 나는 뇌가 죽은 솔루션을 향한 기본 빌딩 블록을 영리하게 만들려고합니다. 문제를 해결하는 방법에 대한 실무 이론이 있으면 대부분 상향식으로 작업합니다.
Java는 대규모 팀을 포괄 할 수있는 대규모 소프트웨어를 생산하는 경향이 있으며, 무리를 통제 할 수있는 도구와 수단을 제공합니다. 이 옵션을 선택하지 않으면 분리 된 팀이 더 불명확 한 목표를 향해 독립적으로 작업하게됩니다. 결국 각 팀은 자체 "레이 슨 디 트레"가되며 시스템 전체가 주요 프로젝트를 타락하여 희석 운전하게됩니다. 이로 인해 극한의 비용 초과와 성능이 좋지 않은 대규모 소프트웨어 시스템이 발생할 수 있습니다.
Java로 작업하는 빠르고 쉬운 방법은 거의 없지만 IDE와 툴링을 사용하면 몇 번의 클릭만으로 고통스러운 작업을 수행 할 수 있습니다.
파이썬 방식 : 정리는 간결하고 쉽게 읽을 수 있음을 의미합니다. 좋은 파이썬 시스템은 그 핵심에 바로 도달 할 수 있도록 설계되었으며 코드의 의도 된 용도와 목적을 코드에서 이해할 수있는 방식으로 가장 중요한 비밀을 드러냅니다. 또한 원래 디자인이 정확히 방향을 향하도록 확장 및 / 또는 캡슐화하여 자체 솔루션을 디자인 할 수 있습니다. 파이썬은 필요에 따라 인스턴스를 동적으로 변경할 수있는 객체 템플릿을 만드는 수단을 제공합니다. 파이썬에서는 문제를 즉시 해결 한 다음 최종 솔루션이 가능한 한 간단하고 읽을 수 있도록 논리적 구조로 코드를 확산시키는 경향이 있습니다. 파이썬에서는 하향식으로 작업하고 분할 및 정복 접근법을 통해 복잡성을 증가시키는 경향이 있습니다.
파이썬 팀은 가벼운 시스템을 만드는 경향이 있으며 작업 솔루션을 제공하는 데 매우 빠릅니다. 그들은 기회가있을 때마다 서로의 솔루션을 검증하는 시스템의 어느 부분에서나 상호 교환이 가능한 긴밀한 묶음 경향이 있습니다. 그들은 서로에게 먹이를주는 것은 매우 상쾌한 시너지를 창출합니다. 그러나 이것은 더 큰 시스템으로 확장하기가 어렵고 종종 일종의 유리 천장에 부딪 치는 팀을 만듭니다. 팀에 신입 사원을 소개하면 도움이되지만 추가 생산성을 느낄 수있을 정도로 지식이 확산 될 때까지 시간이 걸릴 것입니다. 그런 다음 팀이 나뉘어지고 초기의 분위기와 마찬가지로 전체 시스템에 대한 지속적인 개요가 희석됩니다. 이로 인해 한때 단순한 문제였던 코드가 지나치게 복잡해 졌을 수 있습니다.
파이썬으로 작업을 수행하는 빠르고 쉬운 방법은 거의 항상 있지만 시스템이 특정 임계 값에 도달하면 복잡성을 확인하기가 더 어려울 수 있습니다.
요컨대, 둘 다 어두운면을 가지고 있으며 둘 다 명확한 강도를 가지고 있습니다. 그러나 두 커뮤니티를 따라 갈 때 하나의 강도가 다른 쪽의 어두운면으로 이어지고 그 반대의 경우도 있습니다.
따라서 어느 것이 가장 좋은지에 대한 격렬한 논쟁.
그래서 메소드와 변수의 가시성을 설정하는 것에 대한 모든 것을 알고 있습니까? 예, 더 이상 존재하지 않습니다. 모든 것이 공개됩니다. 명명 규칙과 이름 맹 글링이 있지만 모든 것을 실제로 사용할 수 있습니다.
파이썬의 유연성 중 일부는 거의 모든 것을 할 수 있다는 사실에서 비롯됩니다. 이 때문에 사람들은 메소드가 올바르게 사용되도록하는 API보다는 API를 사용하는 방법을 알아야한다는 철학이 있습니다.
메소드 오버로드 대신 기본 변수가 있습니다. 변경 가능한 객체를 기본값으로 사용하지 마십시오.
# bad
def fL(x=[])
x.append(1)
print x
# good
def fN(x=None)
if (x is None):
x = []
x.append(1)
print x
fL()
fL()
fN()
fN()
클래스와 인스턴스 변수의 차이는 처음 시작할 때 매우 미묘합니다.
class Obj(object):
thing = "class variable"
def __init__(self):
self.thing1 = "instance variable"
print self.thing, self.thing1
이것들은 내가 스위치를 만들 때 익숙해 져야 할 것들입니다.
파이썬에는 인터페이스가없고 메타 클래스도 있고 오리 타이핑도 허용합니다. 파이썬에는 목록 이해력이 있습니다. 이것은 매우 강력하고 Java에는 존재하지 않습니다. Java에는 많은 데이터 구조가있는 풍부한 유형 시스템이 있으며 Python에는 목록이 있습니다. 따라서 파이썬에서 Java가 가지고있는 것을 재생성하는 대신 Python 이하는 일을 활용하고 있다면 아마도 Python 코드를 작성하고있을 것입니다.
그러나 OO 코드가 진행되는 한, 언어에서 언어로 바뀌지 않아야하는 특정 스타일 기본 사항이 있습니다. Applescript, Python, Java 또는 C ++로 작성하든 항상 Shy 및 DRY 인 코드를 작성하려고 노력해야합니다.
----편집하다----
@delnan이 지적했듯이 실제로 커널 수준에서 파이썬에 의해 정의 된 5 가지 복합 데이터 유형이 있습니다 (목록, dict, tuple, set 및 frozenset, 필자의 "Python in a Nutshell"에 따르면). 이것은 사실이지만 실제로 내가 만들고자하는 요점과 관련이 없습니다. Python은 목록을 필수 데이터 구조로 작성합니다. 예, 목록을 스택으로 사용할 수 있지만 대기열 과 동일한 목록을 사용할 수 있습니다 . 그리고 다시 스택.
반면 Java는 하나의 커널 데이터 구조 ( "Java 포켓 가이드"에 따르면 배열)를 갖지만 일반적으로 컬렉션을 가져 오지 않으면 Java로 많은 작업을 수행 할 수 없습니다. 파이썬의 목록과 동일한 기능을 얻을 수있는 '풍부한'(엄격히 복잡한 의미) 유형 라이브러리에.
물론 두 언어에는 클래스가 있고 Java에는 인터페이스가 있지만 복합 데이터 유형이지만 실제로는 교과서 적 의미의 데이터 구조는 아닙니다.
한 가지 차이점은 Java Queue에서 항목을 팝업 할 수없고 Java Linked List가 필요한 곳에서는 Java Queue 객체를 전달할 수 없다는 것입니다. 아마 "풍부한"이라는 말은 실제로 "단단함"을 의미합니다.
"Python just lists have"라는 말로 의미하는 바를 설명하기 위해, Pythons List 유형을 사용하여 Java Collections로 수행 할 수있는 모든 작업을 Python에서 수행 할 수 있습니다. 이 단일 유형은 Java에서 많은 유형의 작업을 수행합니다.
이것은 파이썬 프로그래머에게 무엇을 의미합니까? 즉, 추가 라이브러리를 사용하지 않고도 파이썬리스트 유형을 사용하여 매우 간결하고 직접적인 코드를 작성할 수 있으며, 피티 니스 (즉, 더 적은 문자로 더 많은 가치를 전달하는 특성)는 "피 토닉"코드의 핵심 특성입니다. .