Saya perhatikan bahwa operator pra-kenaikan / penurunan dapat diterapkan pada variabel (seperti ++count
). Mengkompilasi, tetapi sebenarnya tidak mengubah nilai variabel!
Apa perilaku operator pra-kenaikan / penurunan (++ / -) di Python?
Mengapa Python menyimpang dari perilaku operator ini terlihat di C / C ++?
++
dan--
operator?sta x++
... instruksi atom yang dihasilkan menyimpana
akumulator di manax
menunjuk, kemudian bertambahx
menurut ukuran akumulator. Ini dilakukan karena lebih cepat daripada pointer aritmatika, karena sangat umum, dan karena itu mudah dimengerti. Baik pra- dan-pos.Jawaban:
++
bukan operator. Itu adalah dua+
operator. The+
Operator adalah identitas operator, yang tidak apa-apa. (Klarifikasi: operator+
dan-
unary hanya bekerja pada angka, tetapi saya berasumsi bahwa Anda tidak akan mengharapkan++
operator hipotetis untuk bekerja pada string.)Pars sebagai
Yang diterjemahkan menjadi
Anda harus menggunakan
+=
operator yang sedikit lebih lama untuk melakukan apa yang ingin Anda lakukan:Saya curiga
++
dan--
operator ditinggalkan untuk konsistensi dan kesederhanaan. Saya tidak tahu argumen pasti yang diberikan Guido van Rossum untuk keputusan itu, tetapi saya bisa membayangkan beberapa argumen:++count
adalah ambigu, karena bisa+
,+
,count
(dua unary+
operator) semudah itu bisa++
,count
(satu unary++
operator). Ini bukan ambiguitas sintaksis yang signifikan, tetapi memang ada.++
tidak lebih dari sinonim untuk+= 1
. Itu adalah singkatan yang ditemukan karena kompiler C bodoh dan tidak tahu bagaimana mengoptimalkan instruksi yanga += 1
dimilikiinc
kebanyakan komputer. Pada hari ini mengoptimalkan kompiler dan bytecode bahasa yang ditafsirkan, menambahkan operator ke bahasa untuk memungkinkan programmer untuk mengoptimalkan kode mereka biasanya disukai, terutama dalam bahasa seperti Python yang dirancang agar konsisten dan dapat dibaca.++
operator adalah mencampur perbedaan (baik dalam nilai sebelum dan di kembali) antara operator sebelum / sesudah kenaikan / penurunan, dan Python suka menghilangkan bahasa "gotcha" -s. The isu diutamakan dari pra / pasca-kenaikan di C cukup berbulu, dan sangat mudah untuk mengacaukan.sumber
+
Operator unary memiliki penggunaan. Untuk desimal. Objek desimal, membulatkan ke presisi saat ini.+ +
dan++
tanpa melanggar LL (1).++
itu tidak lebih dari sinonim untuk+= 1
. Ada varian pre-increment dan post-increment dari ++ sehingga jelas bukan hal yang sama. Saya setuju dengan sisa poin Anda.Saat Anda ingin menambah atau mengurangi, Anda biasanya ingin melakukannya pada bilangan bulat. Seperti itu:
Namun dalam Python, bilangan bulat tidak berubah . Itu adalah Anda tidak dapat mengubahnya. Ini karena objek integer dapat digunakan dengan beberapa nama. Coba ini:
a dan b di atas sebenarnya adalah objek yang sama. Jika Anda menambahkan a, Anda juga akan bertambah b. Bukan itu yang Anda inginkan. Jadi, Anda harus menugaskan kembali. Seperti ini:
Atau lebih sederhana:
Yang akan dipindahkan
b
keb+1
. Itu bukan operator kenaikan, karena tidak naikb
, itu ditugaskan kembali.Singkatnya: Python berperilaku berbeda di sini, karena itu bukan C, dan bukan pembungkus tingkat rendah di sekitar kode mesin, tetapi bahasa dinamis tingkat tinggi, di mana kenaikan tidak masuk akal, dan juga tidak sepenting di C , di mana Anda menggunakannya setiap kali Anda memiliki loop, misalnya.
sumber
i++
berarti menugaskani + 1
ke variabeli
.i = 5; i++
sarana untuk menetapkan6
kei
, tidak memodifikasiint
objek ditunjuk olehi
. Artinya, bukan berarti menambah nilai5
!i++
hanya beroperasi pada lvalues. Jika itu dimaksudkan untuk menambah objek yang ditunjuk olehi
, pembatasan ini tidak perlu.Sementara jawaban yang lain adalah benar sejauh mereka menunjukkan apa yang
+
biasa dilakukan (yaitu, biarkan angkanya apa adanya, jika itu adalah satu), mereka tidak lengkap sejauh mereka tidak menjelaskan apa yang terjadi.Tepatnya,
+x
mengevaluasi kex.__pos__()
dan++x
kex.__pos__().__pos__()
.Saya dapat membayangkan struktur kelas yang SANGAT aneh (Anak-anak, jangan lakukan ini di rumah!) Seperti ini:
sumber
Python tidak memiliki operator ini, tetapi jika Anda benar-benar membutuhkannya, Anda dapat menulis fungsi yang memiliki fungsi yang sama.
Pemakaian:
Di dalam fungsi Anda harus menambahkan lokal () sebagai argumen kedua jika Anda ingin mengubah variabel lokal, jika tidak maka ia akan mencoba mengubah global.
Juga dengan fungsi-fungsi ini yang dapat Anda lakukan:
Namun menurut saya pendekatan berikut ini jauh lebih jelas:
Operator penurunan:
Saya menggunakan fungsi-fungsi ini dalam modul saya menerjemahkan javascript ke python.
sumber
Wikipedia
Jadi dengan memperkenalkan operator seperti itu, Anda akan merusak ekspresi / pernyataan.
Untuk alasan yang sama Anda tidak dapat menulis
yang Anda bisa dalam beberapa bahasa lain di mana perbedaan seperti itu tidak dipertahankan.
sumber
if (n := len(a)) > 10: y = n + 1
misalnya. Perhatikan bahwa perbedaannya jelas karena pengenalan operator baru untuk tujuan itu (:=
)TL; DR
Python tidak memiliki operator kenaikan / penurunan unary (
--
/++
). Sebagai gantinya, untuk menambah nilai, gunakanLebih detail dan mengerti
Tapi hati-hati di sini. Jika Anda berasal dari C, bahkan ini berbeda dalam python. Python tidak memiliki "variabel" dalam pengertian C, sebaliknya python menggunakan nama dan objek , dan dalam python
int
s tidak dapat diubah.jadi katakanlah Anda lakukan
Apa artinya ini di python adalah: membuat objek bertipe
int
memiliki nilai1
dan mengikat namaa
untuk itu. The objek adalah instance dariint
memiliki nilai1
, dan namaa
mengacu pada itu. Namaa
dan objek yang dirujuk berbeda.Sekarang katakanlah Anda lakukan
Karena
int
s tidak dapat diubah, apa yang terjadi di sini adalah sebagai berikut:a
merujuk (itu adalahint
dengan id0x559239eeb380
)0x559239eeb380
(itu1
)int
dengan nilai2
(memiliki id objek0x559239eeb3a0
)a
ke objek baru inia
merujuk ke objek0x559239eeb3a0
dan objek asli (0x559239eeb380
) tidak lagi dirujuk oleh namanyaa
. Jika tidak ada nama lain yang merujuk ke objek asli itu akan menjadi sampah yang dikumpulkan nanti.Cobalah sendiri:
sumber
Ya, saya melewatkan fungsi ++ dan - juga. Beberapa juta baris kode c menanamkan pemikiran seperti itu di kepala saya yang lama, dan bukannya melawannya ... Ini adalah kelas yang saya gunakan untuk mengimplementasikan:
Ini dia:
Anda mungkin menggunakannya seperti ini:
... sudah memiliki c, Anda bisa melakukan ini ...
....atau hanya...
... dan untuk (ulang) penugasan ke dalam bilangan bulat ...
... sementara ini akan mempertahankan c sebagai penghitung tipe:
EDIT:
Dan kemudian ada sedikit perilaku tak terduga (dan benar-benar tidak diinginkan) ini ,
... karena di dalam tuple itu, getitem () bukan yang digunakan, alih-alih referensi ke objek diteruskan ke fungsi pemformatan. Mendesah. Begitu:
... atau, lebih jelasnya, dan secara eksplisit apa yang sebenarnya kita inginkan terjadi, meskipun diindikasikan dalam bentuk sebenarnya oleh verbosity (digunakan
c.v
sebagai gantinya) ...sumber
Tidak ada operator pasca / kenaikan / penurunan dalam python seperti dalam bahasa seperti C.
Kita dapat melihat
++
atau--
sebagai beberapa tanda yang dikalikan, seperti yang kita lakukan dalam matematika (-1) * (-1) = (+1).Misalnya
Pars sebagai
Yang diterjemahkan menjadi
Karena, penggandaan
-
tanda dengan-
tanda adalah+
Dan akhirnya,
sumber
-----count
.Dengan python 3.8+ Anda dapat melakukan:
Anda dapat melakukan banyak pemikiran dengan ini.
Atau jika Anda ingin menulis sesuatu dengan sintaksis yang lebih canggih (tujuannya bukan optimasi):
Ini mengembalikan 0 jika ada yang tidak ada tanpa kesalahan, dan kemudian akan menetapkan ke 1
sumber