Java dev Python'u öğrenme: kafamı sarmak için hangi kavramları kullanmam gerekir?


38

Amaç: Birkaç ders verdim ve bazı küçük projeler yazdım. Google ve StackOverflow'u kullanarak her şey yeterince iyi gidiyor .

Son birkaç gün içinde birkaç kez kendimi "Neyi özlüyorum?" Diye merak ettim. - Python'da yazarken hala Java'da düşünüyorum.

StackOverflow'taki bu soru, Python'u öğrenmek için hangi kaynakların okunacağına dair ipuçlarıyla doludur, ancak hala Python'a çevirmek için bir sözlük (punto amaçsız) içeren bir Java geliştiricisi olduğumu hissediyorum.

Gerçekten yapmak istediğim şey, Java becerilerimi de kaybetmeden, Python gibi gizlenmiş Java yerine Pythonic Python yazabilmek için başımın kırılması.

Öyleyse sorumun temel noktası şudur: Bir Java devinin Pythonic'i düşünmeyi öğrenmek için hangi kavramları gerçekten öğrenmesi gerekir? Bu, öğrenilmesi gereken her şeyi içerir.

Not: Dil sözdizimi hakkında değil, dil kavramları hakkında soru soruyorum.


9
Programlamanın zor olması gerektiği fikrinden vazgeç.
Meslek

Yanıtlar:


40

Zaten söylenenlere ek olarak birkaç nokta:

  • Python dinamiktir. Bir sınıfın oluşturulması, bir modülün içe aktarılması gibi yürütülebilir bir ifadedir ; şartlı yapılabilir. Yaratılıştan sonra bir sınıf değiştirilebilir; Bu kolay metaprogramming ve AOP sağlar.

  • Orada hiçbir arayüzler; ördek yazım kuralları. Onlara umutsuzca ihtiyacınız varsa, 'soyut temel sınıflar (ABC'ler)' vardır, ancak genellikle hiçbir statik tip kontrolü olmadığı için arayüzleri kaçırmazsınız.

  • Her şey bir nesne olmasına rağmen, işlevler nesnelerden önce gelir. Bir modülde sadece fonksiyonlara (ve sınıfsız) sahip olmak gayet iyi.

  • Her şey birinci sınıf bir varlıktır. İşlevleri parametre olarak geçmek, bunları döndürmek ve değişkenlere atamak normdur. Sınıflar için aynen. Yöntemler sadece fonksiyonlardır; Bir örnek yöntemi normal bir işlevmiş gibi ele alabilir, etrafından geçirebilirsiniz.

  • Yerleşik dikteleri, kümeleri, listeleri ve tuple'ları kullanın. Listeler ve alıntılar değişkendir, tuples değildir. Hepsi çok verimli ve sözdizimsel olarak özlü. Bir tuple kullanarak bir fonksiyondan birkaç değer döndürmeye alışın (parantez bile gerekmez). Çok basit nesnelerin karmaşık hiyerarşilerini düz listelerden, totelerden ve diktenlerden ('hashtables') yapılan düzenlemelerle değiştirmeye alışın, hayatı kolaylaştırır.

  • Python'un bir miktar FP desteği var; liste kavramalarını ve sonra yineleyiciler ve jeneratörleri öğrenir Bunlar çok yardımcı olur.

  • Herhangi bir operatör uygun yöntemler tanımlayarak aşırı yüklenebilir, bu nedenle ekleme veya karşılaştırma istediğiniz şeyi geri getirebilir. Bunun SQLAlchemy gibi şeylerle çalıştığını unutmayın.

  • Boş yok, sadece Yok, tam teşekküllü bir nesne. Hiçbirini iyi, vb. Olarak yazdırabilirsiniz. Başka hiçbir örneğin beklendiği durumlarda Yok'u geçmek, genellikle bir NPE'de değil, bazen yürütme hattında daha da aşağıya atılan bir AttributeError'da sonuçlanır.

  • Python'un tamamen dinamik doğası nedeniyle, neredeyse hiç statik çekiniz yok . Programınızda hiçbir zaman bulunmayan bir adama (örneğin bir yazım hatası) veya yalnızca belirli bir yürütme yolunda tanımlanmış olan bir adama başvurabilirsiniz ve yürütme bu başvuruya ulaşana ve bir NameError yükseltilinceye kadar hiçbir şey size hatırlatmaz. Değişkenlerinizin kapsamına dikkat edin ve daha fazla birim testi yazın.

  • Python'un tamamen dinamik olması nedeniyle, nesneler neredeyse her zaman dövülebilir. Genellikle bir örneğe bile alanlar ve yöntemler ekleyebilir ve böylece durum veya yöntem kümesini istemeden silebilir veya üzerine yazabilirsiniz. Öznitelikler atarken dikkatli olun. Bu da ilginç olasılıklara izin verir :)

  • Orada hiçbir sembolik sabitler , sadece değişkenler. Yanlışlıkla 'sabit' üzerine yazmadığınızdan emin olun. Olumlu bir sabitin üzerine yazamayacağınızdan emin olmak istiyorsanız, bir işlev veya özellik kullanın (bu, gizlenmiş bir işlevdir).

  • Python'un konuları G / Ç'ye bağlı işlemler için iyidir, ancak CPU'ya bağlı değildir. Paralel iş parçacıklarında çalıştırarak hesaplama işlemini hızlandırmaya çalışmayın.


+1 çok iyi puan. Kusur arama: NoneGenellikle neden olur AttributeError(ancak önemli değil, genellikle zaten gerek yoktur) ve yapabilirsiniz (örneğin içinden (ve bazı durumlarda olmalı) iletmenin nesneleri yazma namedtuple).

@ danlan: teşekkürler, metni düzelttim :) Evet, değişmez nesneler oluşturabilirsiniz. Ancak, genellikle normal bir sınıf oluşturarak yarattığınız nesneler ve daha sonra bazı özel önlemler almadıkça, örnekleri çok değişkendir. Tanımsız bir örnek niteliğine atamanın genellikle sessizce bir hataya neden olmak yerine tanımladığı gerçeği, bir Java programcısı için sürpriz olabilir.
9000

1
Python (ve diğer FP dilleri), daha basit yapı taşlarının daha ayrıntılı kod yapısını, daha karmaşık yapı taşlarının üzerinde kompakt kod yapılarıyla değiştirir. RISC ve CISC işlemcileri düşünün.
Paul

1
Veri yapılarına kümeler eklerdim.
sakisk

2
Bu soruyu sorduğumdan bu yana 3 yıldan biraz fazla bir süre. Bu tavsiyenin çok iyi ayağa kalktığını söylemeliyim.
LRE

14

Bu makaleyi okuyun: Python Java değil . (Ayrıca, kenar çubuğundaki diğer makalelerin çoğu, Java ile ilgili olmasa da, okumaya değer.) Bu makale, Java programcılarının yanlışlıkla Python'u (ve nasıl kullanmayacaklarını) yanlış kullanabileceği konusunda bazı önemli ipuçları veriyor.


6
"XML cevap değil." - Java v Python'un çok ötesine geçen ;-)
LRE

3

Java'dan Python'a geçtim ve bulduğum en yararlı şeylerden biri, komut satırı yorumlayıcısından kodu test edebilmekti. Komut satırına python yazın ve kodunuzu oradan doğru olana kadar çalıştırın.

Piton'da çerçeveler de biraz daha az tanımlandı. Sadece yeni başlayanlar için 10'lu web çerçeve çalışması var. Django az ya da çok, Hibernate için Spring ve SQL Alchemy'in yerini aldı.


2

Önemli bir şey dinamik yazmayı anlamak olacaktır; diğeri ise nesnelerin değişebilir ve halka açık olmasıdır. Daha az önemli, en azından başlangıçta, değişkenlere karşı isim bağlamadır.

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

Burada benim iş yerim ve iş yerimdeki değer aynı nesneye işaret ediyor. Job.startDate class niteliğine önce bir dize, ardından bir zaman nesnesine atanmış. Ve hepsinden öte, iş örneği ve hatta sınıfın kendisi dinamik olarak değiştirilebilir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.