Jalur perkembangan Python - Dari magang menjadi guru

659

Saya sudah belajar, bekerja, dan bermain dengan Python selama satu setengah tahun sekarang. Sebagai seorang ahli biologi yang perlahan-lahan beralih ke bio-informatika, bahasa ini telah menjadi inti dari semua kontribusi utama yang saya buat di lab. Saya kurang lebih jatuh cinta dengan cara Python memungkinkan saya untuk mengekspresikan solusi yang indah dan juga dengan semantik bahasa yang memungkinkan aliran alami dari pikiran ke kode yang bisa diterapkan.

Yang ingin saya ketahui adalah jawaban Anda untuk jenis pertanyaan yang jarang saya lihat di forum ini atau lainnya. Pertanyaan ini tampaknya penting bagi saya bagi siapa saja yang berada di jalur perbaikan Python tetapi siapa yang bertanya-tanya apa langkah selanjutnya.

Biarkan saya meringkas apa yang saya TIDAK ingin tanyakan terlebih dahulu;)

  • Saya tidak ingin tahu cara CEPAT belajar Python
  • Saya juga tidak ingin mencari tahu cara terbaik untuk berkenalan dengan bahasa tersebut
  • Akhirnya, saya tidak ingin tahu pendekatan 'satu trik yang melakukan semuanya'.

Apa yang saya ingin tahu tentang pendapat Anda, adalah:

Apa saja langkah-langkah yang akan Anda rekomendasikan kepada pekerja harian Python, dari magang ke status guru (jangan ragu untuk berhenti di mana pun keahlian Anda menentukannya), agar seseorang MENINGKATKAN DENGAN KONSTAN, menjadi pembuat kode Python yang lebih baik dan lebih baik, selangkah demi selangkah. Beberapa orang di SO hampir tampak layak disembah karena kehebatan Python mereka, mohon beri tahu kami :)

Jenis jawaban yang akan saya nikmati (tapi jangan ragu untuk mengejutkan pembaca: P), diformat kurang lebih seperti ini:

  • Baca ini (misalnya: tutorial python), perhatikan detail seperti itu
  • Kode untuk banyak waktu / masalah / baris kode
  • Kemudian, baca ini (misalnya: buku ini atau itu), tetapi kali ini, perhatikan ini
  • Atasi beberapa masalah kehidupan nyata
  • Kemudian, lanjutkan membaca Y.
  • Pastikan untuk memahami konsep-konsep ini
  • Kode untuk waktu X
  • Kembali ke dasar-dasar ini dan itu atau pindah lebih jauh ke ...
  • (Anda mendapatkan intinya :)

Saya benar-benar peduli tentang mengetahui pendapat Anda tentang apa yang harus diperhatikan seseorang, pada berbagai tahap, untuk maju secara KONSTAN (dengan upaya, tentu saja). Jika Anda berasal dari bidang keahlian tertentu, diskusikan jalur yang Anda lihat sesuai di bidang ini.

EDIT: Terima kasih atas masukan Anda yang luar biasa, saya kembali ke jalur peningkatan Python! Saya sangat menghargai!

Morlock
sumber

Jawaban:

471

Saya pikir proses penguasaan Python berjalan seperti:

  1. Temukan pemahaman daftar
  2. Temukan generator
  3. Menggabungkan peta, kurangi, filter, iter, jangkauan, xrange sesering mungkin ke dalam kode Anda
  4. Temukan Dekorator
  5. Menulis fungsi rekursif, banyak
  6. Temukan itertools dan functools
  7. Baca Haskell Dunia Nyata ( baca online gratis )
  8. Tulis ulang semua kode Python lama Anda dengan banyak fungsi tingkat tinggi, rekursi, dan yang lainnya.
  9. Ganggu pasangan bilik Anda setiap kali mereka memberi Anda kelas Python. Klaim itu bisa "lebih baik" diimplementasikan sebagai kamus plus beberapa fungsi. Merangkul pemrograman fungsional.
  10. Temukan kembali pola Strategi dan kemudian semua hal itu dari kode imperatif yang Anda berusaha keras untuk lupakan setelah Haskell.
  11. Temukan keseimbangan.
wheaties
sumber
@watiati daftar super bagus, menyukainya! Anda tampaknya memiliki bias terhadap pemrograman fungsional dan jauh dari berorientasi objek ... apakah ada alasan tertentu? Sudahkah pengalaman Haskell mengarahkan Anda kembali ke pendekatan ini?
Morlock
8
Iya dan tidak. Saya menemukan saya menulis kode yang lebih baik dan lebih ringkas semakin dekat saya dengan pemrograman fungsional. Yang mengatakan, ada banyak tempat di mana hal-hal diekspresikan lebih jelas dengan cara imperatif. Ada alasan Real World Haskell dijual di konvensi Python, itu membuat Anda seorang programmer yang lebih baik. Saran saya, jelajahi sebanyak mungkin aspek Python, lalu coba bahasa fungsional.
ketika
@wheaties mendapat balasan karena lebih dekat ke format yang diminta dan sangat menginspirasi. Terima kasih telah meluangkan waktu Anda untuk membalas!
Morlock
1
Pemula: Kamus lalu nanti ... Penguasaan: Metaprogramming
gath
Bisakah Anda menguraikan >> bisa "lebih baik" diimplementasikan sebagai kamus ditambah beberapa fungsi. <<?
Koobz
108

Salah satu cara yang baik untuk meningkatkan pengetahuan Python Anda adalah menggali kode sumber perpustakaan, platform, dan kerangka kerja yang sudah Anda gunakan.

Misalnya, jika Anda membangun situs di Django , banyak pertanyaan yang mungkin membingungkan Anda dapat dijawab dengan melihat bagaimana Django mengimplementasikan fitur yang dimaksud.

Dengan cara ini Anda akan terus mengambil idiom baru, gaya pengkodean, dan trik Python . (Beberapa akan menjadi baik dan beberapa akan menjadi buruk.)

Dan ketika Anda melihat sesuatu Pythony yang tidak Anda mengerti di sumbernya, naiklah ke saluran #python IRC dan Anda akan menemukan banyak "pengacara bahasa" yang senang menjelaskan.

Akumulasi dari klarifikasi kecil ini selama bertahun-tahun mengarah pada pemahaman yang jauh lebih mendalam tentang bahasa dan semua seluk beluknya.

dkamins
sumber
1
Saya akan menambahkan ini bahwa alih-alih hanya menginstal ekstensi Django / plugin, coba tambahkan kode secara manual menggunakan cabang git. Ini akan memaksa Anda untuk benar-benar membaca kode yang Anda tambahkan ke proyek.
g33kz0r
14
Apakah saya penasaran mengapa menggunakan IRC ketika kita semua dapat mengambil manfaat dari Pertanyaan?
tshepang
1
+1 untuk "idiom, gaya, dan trik". Hidup BUDAYA nyata yang dibuat oleh orang-orang nyata dalam kontak (bahkan jika kontak ini berarti sebagian besar membaca kode satu sama lain dalam kasus ini) adalah apa yang pernah membuat pengetahuan manusia EVOLVE dari waktu ke waktu.
heltonbiker
92

Memahami (lebih dalam) tipe data Python dan perannya terkait dengan memori mgmt

Seperti yang diketahui oleh sebagian dari Anda di komunitas, saya mengajar kursus Python , yang paling populer adalah kursus Intro + Intermediate yang komprehensif serta kursus "lanjutan" yang memperkenalkan berbagai bidang pengembangan aplikasi.

Cukup sering, saya ditanya pertanyaan yang sangat mirip, "Haruskah saya mengambil kursus intro atau lanjutan Anda? Saya sudah memprogram Python selama 1-2 tahun, dan saya pikir intro terlalu sederhana untuk saya, jadi saya akan ingin melompat langsung ke mahir ... kursus mana yang akan Anda rekomendasikan? "

Untuk menjawab pertanyaan mereka, saya menyelidiki untuk melihat seberapa kuat mereka di bidang ini - bukan itu benar-benar cara terbaik untuk mengukur apakah mereka siap untuk kursus lanjutan, tetapi untuk melihat seberapa baik pengetahuan dasar mereka tentang objek Python dan model memori, yang merupakan penyebab banyak bug Python ditulis oleh mereka yang bukan hanya pemula tetapi mereka yang telah melampaui itu.

Untuk melakukan ini, saya mengarahkan mereka pada pertanyaan kuis 2-bagian sederhana ini: Ex1: x = 42;  y = x;  x + = 1;  cetak x, y Ex2: x = [1,2,3]; y = x; x [0] = 4; cetak x, y

Banyak kali, mereka bisa mendapatkan output, tetapi mengapa lebih sulit dan jauh lebih penting dari suatu respons ... Saya akan menimbang output sebagai 20% dari jawaban sementara "mengapa" mendapat kredit 80%. Jika mereka tidak bisa mendapatkan alasannya, terlepas dari bagaimana pengalaman Python yang mereka miliki, saya akan selalu mengarahkan orang ke kursus intro + menengah yang komprehensif karena saya menghabiskan satu kuliah tentang objek dan manajemen memori ke titik di mana Anda harus dapat menjawab dengan output dan alasannya dengan keyakinan yang cukup. (Hanya karena Anda tahu sintaksis Python setelah 1-2 tahun tidak membuat Anda siap untuk bergerak melampaui label "pemula" sampai Anda memiliki pemahaman yang jauh lebih baik sejauh cara Python bekerja di bawah selimut.)

Penyelidikan selanjutnya yang membutuhkan jawaban yang serupa bahkan lebih sulit, misalnya,

Contoh 3

x = ['foo', [1,2,3], 10.4]
y = list(x) # or x[:]
y[0] = 'fooooooo'
y[1][0] = 4
print x
print y

Topik berikutnya yang saya sarankan adalah memahami penghitungan referensi dengan baik, mempelajari apa arti "magang" (tetapi tidak harus menggunakannya), belajar tentang salinan dangkal dan dalam (seperti dalam Contoh 3 di atas), dan akhirnya, keterkaitan antara berbagai jenis dan konstruksi dalam bahasa, yaitu daftar vs tupel, dikt vs. vs. set, daftar pemahaman vs ekspresi generator, iterator vs generator, dll.; namun semua saran lainnya adalah posting lain untuk waktu yang lain. Semoga ini bisa membantu! :-)

ps. Saya setuju dengan tanggapan lain untuk menjadi lebih intim dengan introspeksi serta mempelajari kode sumber proyek lain dan menambahkan "+1" yang kuat untuk kedua saran!

pps. Pertanyaan bagus BTW. Saya berharap pada awalnya saya cukup pintar untuk menanyakan sesuatu seperti ini, tapi itu sudah lama sekali, dan sekarang saya mencoba untuk membantu orang lain dengan bertahun-tahun pemrograman Python penuh waktu saya !!

wescpy
sumber
Wesley Chun! Morlock, ini tipe cowok yang kamu bicarakan di bagian tebal dari pertanyaanmu. Seorang pria yang sangat berpengetahuan luas yang juga seorang guru yang sangat berbakat, saya mendapat dorongan besar dari buku ini.
terpasang
thx @bvmou! saya hanya bisa menjawab pertanyaan ini karena saya harus melalui proses pembelajaran ini seperti orang lain ... hanya milik saya 13 tahun yang lalu! :-) thx untuk memasang corepython.com tho! :-)
wescpy
@wescpy Bisakah Anda menjelaskan kepada saya output untuk example3 atau arahkan saya ke sumber yang bagus untuk mempelajari hal ini. Terima kasih.
Sankalp
1
Kuncinya adalah bahwa hanya referensi objek yang disalin, bukan objek itu sendiri. Hanya itu yang ada di sana ... semoga membantu! Sebenarnya saya memberi ceramah tentang ini beberapa minggu yang lalu, di OSCON. Saya terkejut ketika seseorang mengatakan kepada saya bahwa itu adalah pembicaraan Python berperingkat tertinggi di konferensi! Anda dapat mengunduh slide di sini: oscon.com/oscon2013/public/schedule/detail/29374
wescpy
Outputnya adalah SyntaxError: sintaks tidak valid, bukan? Mengapa? Karena saya telah menggunakan Python 3, dan printbukan pernyataan.
Konrad Borowski
67

Lihatlah esai Peter Norvig tentang menjadi programmer utama dalam 10 tahun: http://norvig.com/21-days.html . Saya bertaruh itu berlaku untuk bahasa apa pun.

twneale
sumber
59

Pahami Introspeksi

  • tulis yang dir()setara
  • tulis yang type()setara
  • mencari tahu cara "monkey-patch"
  • gunakan dismodul untuk melihat bagaimana berbagai konstruksi bahasa bekerja

Melakukan hal-hal ini akan

  • memberi Anda pengetahuan teori yang bagus tentang bagaimana python diimplementasikan
  • memberi Anda beberapa pengalaman praktis yang baik dalam pemrograman tingkat rendah
  • memberi Anda perasaan intuitif yang bagus untuk struktur data python
Mark Harrison
sumber
1
"Tulis yang type()setara" itu akan sangat sulit jika Anda mengambil spesifikasi metaclassy penuh dari type!
asmeurer
48
def apprentice():
  read(diveintopython)
  experiment(interpreter)
  read(python_tutorial)
  experiment(interpreter, modules/files)
  watch(pycon)

def master():
  refer(python-essential-reference)
  refer(PEPs/language reference)
  experiment()
  read(good_python_code) # Eg. twisted, other libraries
  write(basic_library)   # reinvent wheel and compare to existing wheels
  if have_interesting_ideas:
     give_talk(pycon)

def guru():
  pass # Not qualified to comment. Fix the GIL perhaps?
ya
sumber
4
guru () harus lulus. tidak ada yang bisa menggambarkan guru, biarkan lulus
inv
1
Jika Anda memperbaiki GIL maka saya pikir itu menempatkan Anda pada tingkat yang lebih tinggi daripada guru, tetapi tepat di bawah diktator yang baik hati. ;)
Adam Parkin
41

Saya akan memberi Anda nasihat paling sederhana dan paling efektif yang saya pikir semua orang bisa memberi Anda: kode .

Anda hanya bisa lebih baik dalam menggunakan bahasa (yang menyiratkan memahaminya) dengan coding . Anda harus secara aktif menikmati pengkodean, terinspirasi, mengajukan pertanyaan, dan menemukan jawaban sendiri.

Masih punya waktu satu jam? Tulis kode yang akan membalik string, dan cari solusi yang paling optimal. Malam yang gratis? Mengapa tidak mencoba menggores web. Baca kode orang lain. Lihat bagaimana mereka melakukan sesuatu. Tanyakan pada diri sendiri apa yang akan Anda lakukan.

Ketika saya bosan di komputer saya, saya membuka IDE dan badai kode saya. Saya menuliskan ide-ide yang terdengar menarik, dan menantang. Penyingkat URL? Tentu, saya bisa melakukannya. Oh, saya belajar cara mengubah angka dari satu basis ke basis lainnya sebagai efek samping!

Ini valid, apa pun tingkat keahlian Anda. Anda tidak pernah berhenti belajar. Dengan secara aktif menyandi waktu luang Anda, Anda akan, dengan sedikit usaha tambahan, memahami bahasa, dan akhirnya, menjadi seorang guru. Anda akan membangun pengetahuan dan kode yang dapat digunakan kembali dan menghafal idiom.

Humphrey Bogart
sumber
24

Jika Anda berada di dan menggunakan python untuk sains (yang tampaknya Anda) bagian dari yang akan belajar dan memahami perpustakaan ilmiah, bagi saya ini akan menjadi

  • numpy
  • Scipy
  • matplotlib
  • mayavi / mlab
  • chaco
  • Cython

mengetahui cara menggunakan perpustakaan yang tepat dan membuat vektor kode Anda sangat penting untuk komputasi ilmiah.

Saya ingin menambahkan bahwa, menangani dataset numerik besar dengan cara pythonic yang umum (pendekatan berorientasi objek, daftar, iterator) bisa sangat tidak efisien. Dalam komputasi ilmiah, mungkin perlu untuk menyusun kode Anda dengan cara yang berbeda secara drastis dari cara kebanyakan pengkode python konvensional mendekati data.

pengguna503635
sumber
Terima kasih. Tentunya layak untuk mengambil waktu untuk mempelajari numpy dan scipy untuk mendapatkan efisiensi dalam penggunaan memori untuk dataset besar!
Morlock
1
Mungkin tambahkan panda dan IPython ke daftar.
Eric Wilson
20

Unduh Twisted dan lihat kode sumbernya. Mereka menggunakan beberapa teknik yang cukup canggih.

Jason Christa
sumber
12

Memahami Semua Jenis dan Struktur Data

Untuk setiap jenis dan struktur, tulislah serangkaian program demo yang melatih setiap aspek dari jenis atau struktur data. Jika Anda melakukan ini, mungkin bermanfaat untuk membuat catatan blog pada masing-masing ... mungkin bermanfaat bagi banyak orang!

Mark Harrison
sumber
Ini tidak hanya berguna dalam Python, tetapi juga dalam arti abstrak.
Humphrey Bogart
1
Ini adalah sesuatu yang saya lakukan juga, setiap kali saya menemukan konstruksi baru saya menulis program mainan yang menunjukkan cara menggunakannya. Dan letakkan online di repo github: github.com/pzelnip/MiscPython
Adam Parkin
10

Saya belajar python pertama kali sendirian selama musim panas hanya dengan melakukan tutorial di situs python (sayangnya, saya sepertinya tidak dapat menemukannya lagi, jadi saya tidak dapat memposting tautan).

Kemudian, python diajarkan kepada saya di salah satu kursus tahun pertama saya di universitas. Di musim panas berikutnya, saya berlatih dengan PythonChallenge dan dengan masalah dari Google Code Jam . Memecahkan masalah ini membantu dari perspektif algoritmik serta dari perspektif belajar apa yang bisa dilakukan Python serta bagaimana memanipulasi untuk mendapatkan hasil maksimal dari python.

Untuk alasan yang sama, saya pernah mendengar bahwa golf code juga berfungsi, tetapi saya belum pernah mencobanya sendiri.

inspectorG4dget
sumber
3
Anda maksud tutorial ini? Python 2: docs.python.org/tutorial/index.html ; Python 3: docs.python.org/py3k/tutorial/index.html .
Humphrey Bogart
10

Algoritma pembelajaran / matematika / file IO / optimasi Pythonic

Ini tidak akan membuat Anda jadi guru tetapi untuk memulai, coba selesaikan masalah - masalah Project Euler 50 atau lebih yang pertama seharusnya tidak membebani Anda jika Anda memiliki matematika sekolah menengah yang baik dan tahu cara menggunakan Google. Ketika Anda memecahkan satu, Anda masuk ke forum di mana Anda dapat melihat melalui solusi orang lain yang akan mengajarkan Anda lebih banyak lagi. Tetaplah sopan dan jangan posting solusi Anda karena idenya adalah untuk mendorong orang untuk mengerjakannya sendiri.

Memaksa diri Anda untuk bekerja dengan Python tidak akan memaafkan jika Anda menggunakan algoritma brute-force. Ini akan mengajarkan Anda cara meletakkan dataset besar dalam memori dan mengaksesnya secara efisien dengan fitur-fitur bahasa cepat seperti kamus.

Dari melakukan ini sendiri, saya belajar:

  • Mengarsipkan IO
  • Algoritma dan teknik seperti Dynamic Programming
  • Tata letak data python
    • Kamus / peta hash
    • Daftar
    • Tuples
    • Berbagai kombinasi darinya, misalnya kamus untuk daftar tupel
  • Generator
  • Fungsi rekursif
  • Mengembangkan perpustakaan Python
    • Tata letak sistem file
    • Reload mereka selama sesi juru bahasa

Dan juga sangat penting

  • Kapan menyerah dan menggunakan C atau C ++!

Semua ini harus relevan dengan Bioinformatika

Memang saya tidak belajar tentang fitur OOP Python dari pengalaman itu.

Kapten Lepton
sumber
3
Saya suka situs PE, tapi jujur ​​saja: ini situs matematika, bukan situs pemrograman. Sebagian besar masalah (atau setidaknya sebagian besar yang telah saya lakukan) benar-benar bermuara pada mengetahui beberapa trik matematika daripada apa pun yang terkait dengan bahasa pemrograman. Seringkali solusi yang baik di forum tenggelam oleh gelombang solusi naif, dll.
Adam Parkin
Sebaliknya saya menemukan bahwa itu melibatkan penerapan kedua pemrograman dan keterampilan Matematika dan yang paling penting kombinasi keduanya untuk memecahkan masalah nyata. Anda tidak dapat menggunakan PE untuk mempelajari pemrograman Python jika Anda memiliki keterampilan Matematika yang buruk tetapi Anda hanya akan belajar bagaimana menggunakan bahasa dengan menggunakannya sehingga sangat ideal jika Matematika Anda cukup baik.
Kapten Lepton
7

Pernahkah Anda melihat buku " Pemrograman Bioinformatika menggunakan Python "? Sepertinya Anda adalah anggota tepat dari grup fokusnya.

Tim Pietzcker
sumber
2
Setelah membaca buku dengan cepat beberapa waktu lalu, saya menemukan bahwa buku ini tidak terlalu menarik. Ini diarahkan untuk pengguna Python yang sangat baru dan masalahnya sendiri tidak terlalu menarik. Sayang sekali, ini jelas merupakan area di mana penggunaan Python meningkat. Buku yang lebih menggembirakan pasti bagus.
Morlock
6

Anda sudah memiliki banyak bahan bacaan, tetapi jika Anda dapat menangani lebih banyak, saya sarankan Anda mempelajari tentang evolusi python dengan membaca Proposal Peningkatan Python, terutama PEP "Selesai" dan "PEP yang Ditunda, Ditinggalkan, Dicabut, Dicabut, dan Ditolak" PEPs.

Dengan melihat bagaimana bahasa telah berubah, keputusan yang dibuat dan alasannya, Anda akan menyerap filosofi Python dan memahami bagaimana "Python idiomatik" muncul.

http://www.python.org/dev/peps/

Greg Ball
sumber
3

Mengajar kepada orang lain yang mulai belajar Python selalu merupakan cara yang bagus untuk menjelaskan ide-ide Anda dan kadang-kadang, saya biasanya mendapatkan banyak pertanyaan rapi dari siswa yang membuat saya memikirkan kembali hal-hal konseptual tentang Python.

Marc-Olivier Titeux
sumber
2

Tidak persis apa yang Anda minta, tapi saya pikir itu saran yang bagus.

Belajar bahasa lain, tidak masalah yang mana. Setiap bahasa memiliki ide dan konvensi sendiri yang dapat Anda pelajari. Pelajari perbedaan dalam bahasa dan yang lebih penting whyperbedaannya. Cobalah bahasa yang murni fungsional seperti Haskell dan lihat beberapa manfaat (dan tantangan) fungsi yang bebas dari efek samping. Lihat bagaimana Anda dapat menerapkan beberapa hal yang Anda pelajari dari bahasa lain ke Python.

Davy8
sumber
1
Haskell menarik, dan saya tertarik pada Lisp, tetapi saya merasa masih banyak yang harus saya temukan di dunia Python sebelum saya ingin melanjutkan.
Morlock
2
landoflisp (.com) baru-baru ini menarik perhatian saya.
Jiaaro
Jika ada yang berpikir tentang Lisp, saya sarankan Skema
Tharindu Rusira
2

Saya sarankan memulai dengan sesuatu yang memaksa Anda untuk mengeksplorasi kekuatan ekspresif dari sintaks. Python memungkinkan banyak cara berbeda untuk menulis fungsionalitas yang sama, tetapi seringkali ada satu pendekatan yang paling elegan dan tercepat. Jika Anda terbiasa dengan idiom bahasa lain, Anda mungkin tidak akan pernah menemukan atau menerima cara yang lebih baik ini. Saya menghabiskan akhir pekan dengan susah payah menelusuri 20 atau lebih masalah Project Euler pertama dan membuat webapp sederhana dengan Django di Google App Engine. Ini hanya akan membawa Anda dari magang ke pemula, mungkin, tetapi Anda kemudian dapat terus membuat aplikasi web yang agak lebih maju dan memecahkan masalah Project Euler yang lebih maju. Setelah beberapa bulan saya kembali dan menyelesaikan 20 masalah PE pertama dari awal dalam satu jam, bukan akhir pekan.

hus787
sumber