Java 개발자 학습 Python : 머리를 감쌀 때 어떤 개념이 필요합니까?


38

배경 : 몇 가지 튜토리얼을 살펴보고 작은 프로젝트를 작성했습니다. Google과 StackOverflow를 사용하면 충분 합니다.

지난 며칠 동안 여러 번 "내가 무엇을 놓치고 있습니까?" -파이썬으로 쓸 때 여전히 Java로 생각하고 있다고 생각합니다.

StackOverflow 에서이 질문은 파이썬 학습을 위해 읽어야 할 리소스에 대한 팁으로 가득 차 있지만 여전히 파이썬으로 번역 할 사전 (말장난이없는)을 가진 Java 개발자라고 생각합니다.

내가 정말로하고 싶은 것은 Java 기술을 잃지 않고 Python으로 위장한 Java 대신 Pythonic Python을 작성할 수 있도록 머리를 리팩터링하는 것입니다.

내 질문의 요점은 Java 개발자가 실제로 Pythonic을 생각하는 법을 배우기 위해 어떤 개념이 필요합니까? 여기에는 배울 필요가없는 것이 포함됩니다.

참고 : 언어 구문이 아니라 언어 개념에 대해 묻고 있습니다.


9
프로그래밍이 어렵다는 생각을 버리십시오.
직업

답변:


40

이미 말한 것 외에 몇 가지 사항 :

  • 파이썬은 역동적입니다. 클래스의 작성은 모듈의 가져 오기와 마찬가지로 실행 가능한 명령문입니다 . 조건부로 만들 수 있습니다. 클래스는 생성 후 변경 될 수 있습니다. 이것은 쉬운 메타 프로그래밍 및 AOP를 허용합니다.

  • 인터페이스없습니다. 오리 타이핑 규칙. 필사적으로 필요한 경우 'ABC (abstract base class)'가 있지만 정적 유형 검사가 없기 때문에 일반적으로 인터페이스를 놓치지 않습니다.

  • 모든 것이 대상이지만 기능은 대상보다 우선합니다. 모듈에 함수 만 있고 클래스는없는 것이 좋습니다.

  • 모든 것이 일류 기업입니다. 함수를 매개 변수로 전달하고 반환하고 변수에 할당하는 것이 일반적입니다. 수업에 적합합니다. 메소드는 단지 함수일뿐입니다. 인스턴스 함수를 일반 함수처럼 처리하고 전달할 수 있습니다.

  • 내장 된 받아쓰기, 집합, 목록 및 튜플을 사용하십시오. 목록과 dicts는 변경 가능하고 튜플은 변경되지 않습니다. 그들 모두는 매우 효율적이고 구문 적으로 간결합니다. 튜플을 사용하여 함수에서 여러 값을 반환하는 데 익숙해집니다 (괄호가 필요하지 않음). 매우 간단한 객체의 복잡한 계층 구조를 일반 목록, 튜플 및 dicts ( '해시 테이블')로 만든 contraptions로 바꾸는 데 익숙해 져 수명이 단축됩니다.

  • 파이썬은 FP를 상당히 지원합니다. 목록 이해와 반복자와 생성기를 배우십시오. 이것들은 많은 도움이됩니다.

  • 적절한 메소드를 정의하여 모든 연산자를 오버로드 할 수 있으므로 추가 또는 비교를 통해 원하는 것을 반환 할 수 있습니다. SQLAlchemy와 같은 작업을 수행하는 것을 기억하십시오.

  • 본격적인 개체는 null이없고 None 만 있습니다. None 만 인쇄하면됩니다. 다른 인스턴스가 예상되는 경우 None을 전달하면 NPE가 아닌 AttributeError가 발생하며 때로는 실행 파이프 라인보다 더 먼 경우가 있습니다.

  • 파이썬은 완전히 역동적 이므로 정적 검사 가 거의 없습니다 . 프로그램에 존재하지 않는 이름 (예 : 오타)을 참조하거나 특정 실행 경로에서만 정의 된 이름을 참조 할 수 있으며 실행이 실제로이 참조에 도달하여 NameError가 발생할 때까지 아무것도 기억 나지 않습니다. 변수의 범위에주의하고 더 많은 단위 테스트를 작성하십시오.

  • 파이썬의 완전한 동적 특성으로 인해 객체는 거의 항상 가단성입니다. 일반적으로 인스턴스 에 필드와 메소드를 추가 하여 실수로 해당 상태 나 메소드 세트를 삭제하거나 겹쳐 쓸 수 있습니다. 속성을 신중하게 할당하십시오. 이것은 또한 흥미로운 가능성을 허용합니다 :)

  • 기호 상수없고 변수 만 있습니다. 실수로 '일정한'을 덮어 쓰지 않는지 확인하십시오. 상수를 덮어 쓸 수 없다는 것을 확실하게하려면 함수 또는 속성 (변장 함수)을 사용하십시오.

  • 파이썬의 스레드는 I / O 바운드 처리에는 좋지만 CPU 바운드에는 적합하지 않습니다. 병렬 작업으로 계산 작업을 실행하여 속도를 높이려고하지 마십시오.


+1 아주 좋은 점수. 하찮은 일에 속 태우고은 : None일반적으로 발생합니다 AttributeError(그러나 중요하지 않습니다, 당신은 일반적으로 어쨌든 필요하지 않습니다) 그리고 당신은 할 수 있습니다 (예를 통해 (어떤 경우에해야한다) 불변의 객체를 쓰기 namedtuple).

@ danlan : 감사합니다. 텍스트를 수정했습니다 :) 그렇습니다. 불변의 객체를 만들 수 있습니다. 그러나 일반적으로 일반 클래스를 만들어서 만든 개체는 여러 가지 특별한 조치를 취하지 않는 한 변경이 가능합니다. 정의되지 않은 인스턴스 속성에 할당하면 일반적으로 오류를 발생시키는 대신 자동으로 정의한다는 사실이 Java 프로그래머에게는 놀라운 일입니다.
9000

1
Python (및 기타 FP 언어)은 더 간단한 빌딩 블록의 더 자세한 코드 빌드를 더 복잡한 빌딩 블록의 컴팩트 코드 빌드로 대체합니다. RISC와 CISC 프로세서를 비교해보십시오.
Paul

1
데이터 구조에 세트를 추가합니다.
사키 스크

2
이 질문을 한 지 3 년이 조금 넘었습니다. 나는이 조언이 아주 잘 일어났다 고 말해야한다.
LRE

14

이 기사를 읽으십시오 : Python은 Java가 아닙니다 . (자바 관련 기사는 아니지만, 사이드 바에있는 대부분의 다른 기사는 읽을 가치가있다.)이 기사는 자바 프로그래머가 의도하지 않게 파이썬을 잘못 사용할 수있는 방법과 그렇지 않은 방법에 대한 훌륭한 지침을 제공한다.


6
"XML은 답이 아닙니다." -그것은 Java v Python을 훨씬 능가합니다 ;-)
LRE

3

Java에서 Python으로 옮겼으며 가장 유용한 것 중 하나는 명령 줄 인터프리터에서 코드를 테스트 할 수 있다는 것입니다. 명령 행에 python을 입력하고 코드가 올 때까지 코드를 실행하십시오.

프레임 워크는 파이썬에서 조금 덜 정의되었습니다. 초보자를위한 10 가지 웹 프레임 작업이 있습니다. Django는 Hibernate의 Spring 및 SQL Alchemy를 대체합니다.


2

중요한 것은 동적 타이핑을 이해하는 것입니다. 다른 하나는 객체가 변경 가능하고 공개적이라는 것입니다. 적어도 초기에는 덜 중요한 것은 이름 바인딩과 변수입니다.

class MyJob:
    pass        # an empty class
job = MyJob()
job.title = "Ruler of Omicron Persei 8"
job.startDate = "2086"
job.startDate = time.strptime("2035/01/02", "%Y/%m/%d")
myjobtitle = job.title
import new
def myjobduration(self, when):  # create a function
    return when - time.mktime(self.startDate)
MyJob.duration = myjobduration
job.duration(time.time()) # now

여기서 myjobtitle과 job.title의 값은 동일한 객체를 가리 킵니다. job.startDate 클래스 속성에 먼저 문자열이 할당 된 다음 시간 객체에 지정되었습니다. 그리고이를 통해 작업 인스턴스와 클래스 자체를 동적으로 변경할 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.