Ketika kita melihat perilaku sebenarnya dari ketiga pernyataan return maka tidak ada perbedaan. Semua ini mengembalikan Tidak ada. Namun, itu tergantung pada situasi di mana waktu dan di mana mereka akan digunakan.
Di bawah ini adalah beberapa petunjuk yang akan menghilangkan keraguan Anda tentang bagaimana metode yang berbeda harus digunakan. -
Di mana menggunakan pengembalian Tidak ada. -
Pernyataan kembali dimaksudkan untuk mengembalikan nilai untuk digunakan nanti, dan dalam hal ini, ia mengembalikan Tidak Ada. Di bawah ini adalah contoh untuk mengembalikan Tidak ada
def get_mother(orang)
if is_human(orang)
orang kembali. ibu
kalau tidak
kembali Tidak ada
Di mana menggunakan pengembalian. -
Pernyataan return digunakan untuk alasan yang sama seperti break digunakan dalam perulangan. Ini digunakan untuk keluar dari seluruh fungsi. Di bawah ini adalah contoh mengenai pernyataan pengembalian
Dalam contoh yang disebutkan di bawah, misalkan kita memiliki 15 balok dan kita tahu salah satunya berisi pisau. Jadi untuk mengetahui mana yang berisi pisau, kita akan melewati setiap blok satu per satu untuk memeriksa apakah mereka memiliki pisau. Jika kita memukul balok yang benar dengan pisau, kita bisa keluar dari fungsi karena kita tahu hanya ada satu pisau dan tidak ada alasan untuk memeriksa sisa balok. Jadi untuk keluar setelah mendapatkan pisau kita akan menggunakan return
def find_prisoner_with_knife(blok)
untuk blok di blok
jika "pisau" di blok. item.
memblokir. pindah_ke_inkuisisi()
kembali
Di mana kami tidak akan menggunakan pengembalian sama sekali. -
Sedangkan jika tidak menggunakan return maka akan mengembalikan None juga.
Di bawah ini adalah contoh di mana kami telah menetapkan nama ibu seseorang, dan kemudian fungsinya keluar setelah berhasil diselesaikan
tetapi jika Anda akan melakukan itu, lebih baik membuat daftar baru di dalam fungsi balik dan mengembalikannya, daripada memutasi num di tempat lalu mengembalikannya
Anda tidak bisa; . Itu sebabnya NameError dilempar. Inilah yang saya jalankan persis seperti yang Anda posting, di bash shell di Linuxkata joshmccraney
Saya menjalankan kode itu kata demi kata seperti yang diposting
Piton
Traceback (most recent call last): File "mcraney.py", line 37, in <module> print(ob1.nextPermutation(nums)) File "mcraney.py", line 16, in nextPermutation if nums[I] > nums[i - 1]: NameError: name 'I' is not defined
Kecuali jika Anda menjalankan kode ini di beberapa jenis IDE atau lingkungan lain yang secara diam-diam mengoreksi kasus variabel Anda, inilah hasil yang harus Anda dapatkan
Oke, saya memang melihat beberapa di antaranya muncul secara acak setelah saya menyalin-tempel, dan bertanya-tanya bagaimana mereka sampai di sana. Kupikir aku menghapus semuanya. Saya pikir itu ada hubungannya dengan saya menekan opsi "pratinjau" berulang kali, tetapi saya bisa saja salah. Jadi tidak tahu bagaimana mereka sampai di sana, tapi terima kasih atas umpan baliknyakata Peter Donis
Ya, tapi itu tidak membantu karena cara baris 32 kode Anda ditulis
Itu akan menjadi salah satu perbaikan yang mungkin. Yang lainnya adalah membiarkan fungsi kebalikannya memutasikan angka di tempatnya dan cukup panggil baris 32 tanpa menetapkan nilai pengembalian apa pun. Kemudian fungsi Permutasi Anda berikutnya hanya dapat mengembalikan num setelah membalikkannya
Opsi pertama mungkin adalah praktik pemrograman yang lebih baik;
Anda tidak bisa; . Itu sebabnya NameError dilempar. Inilah yang saya jalankan persis seperti yang Anda posting, di bash shell di LinuxPiton
Traceback (most recent call last): File "mcraney.py", line 37, in <module> print(ob1.nextPermutation(nums)) File "mcraney.py", line 16, in nextPermutation if nums[I] > nums[i - 1]: NameError: name 'I' is not defined
Kecuali jika Anda menjalankan kode ini di beberapa jenis IDE atau lingkungan lain yang secara diam-diam mengoreksi kasus variabel Anda, inilah hasil yang harus Anda dapatkan
Ya tapi itu hal yang salah untuk diperbaiki, baca teruskata joshmccraney
Sunting. semua yang saya ubah adalah menambahkan angka pengembalian dalam fungsi terbalik dan berfungsi
Tidak perlu mengembalikan apa pun dari nextPermutation karena ini mengubah argumen daftar di tempatnya. Itu harus disebut sebagaikata Peter Donis
Itu akan menjadi salah satu perbaikan yang mungkin. Yang lainnya adalah membiarkan fungsi kebalikannya memutasikan angka di tempatnya dan cukup panggil baris 32 tanpa menetapkan nilai pengembalian apa pun
Kemudian fungsi Permutasi Anda berikutnya hanya dapat mengembalikan num setelah membalikkannya
Piton
ob1.nextPermutation(nums) print(nums)
Tidak terlalu. Saya telah memposting sebelumnya tentang bagaimana efek samping tidak diinginkan, namun untuk fungsi utilitas seperti ini, mengubah daftar asli bukanlah efek samping, itu adalah satu-satunya fungsi yang dilakukan. Bandingkan dengan daftar Python. reverse() dan daftar. sort() metode yang juga bermutasi di tempatkata Peter Donis
Opsi pertama mungkin adalah praktik pemrograman yang lebih baik;
Ini akan sangat mahalkata Peter Donis
tetapi jika Anda akan melakukan itu, lebih baik membuat daftar baru di dalam fungsi balik dan mengembalikannya, daripada memutasi num di tempat lalu mengembalikannya
Saya menduga kode ini diambil dari pengajuan ke pertanyaan LeetCode atau yang serupa. Itu membutuhkan kode Anda untuk disusun dengan cara ini, dengan kelas Solusi dan fungsi yang melakukan pekerjaan sebenarnya sebagai metode di dalamnya. Agak aneh, tapi begitulah cara mereka melakukannyakata pbuk
Cara Anda mengimplementasikannya tidak ada gunanya menggunakan kelas. nextPermutation bisa menjadi fungsi sederhana
Komentar yang sama seperti di ataskata pbuk
Jika Anda akan menerapkannya sebagai kelas dengan cara ini, nextPermutation harus diterapkan sebagai
Ini valid, tetapi begitu juga dengan cara OP. Saya percaya situs LeetCode secara otomatis memformat kode kerangka Python itu memberi Anda cara kode OP diformat. Cara itu tidak salah, meski tidak sesuai dengan preferensi pribadi Andakata pbuk
Deklarasi kelas Anda seharusnya hanya class Solution:, Anda tidak boleh secara eksplisit memperluas objek object
Terkadang orang memilih untuk mengimplementasikan sesuatu sendiri sehingga mereka dapat melihat cara kerjanyakata pbuk
Perhatikan bahwa ada a
Juga, fungsi bawaan tidak memberi Anda cara apa pun untuk memulai dari permutasi yang dipilih dan mendapatkan yang berikutnya, itu hanya mengulangi semuanya dari awal hingga akhir. Jadi menggunakannya berarti Anda harus mengulang melalui permutasi yang dikembalikan bawaan sampai Anda menemukan yang cocok dengan yang Anda berikan, dan kemudian mengembalikan yang berikutnya. Itu mungkin lebih lambat daripada mencari tahu permutasi berikutnya secara langsung
Poin bagus. https. //kode leet. com/masalah/permutasi/ misalnyakata Peter Donis
Saya menduga kode ini diambil dari pengajuan ke pertanyaan LeetCode atau yang serupa. Itu membutuhkan kode Anda untuk disusun dengan cara ini, dengan kelas Solusi dan fungsi yang melakukan pekerjaan sebenarnya sebagai metode di dalamnya. Agak aneh, tapi begitulah cara mereka melakukannya
...
Komentar yang sama seperti di atas
Ini bukan hanya preferensi pribadi, Traceback (most recent call last): File "mcraney.py", line 37, in <module> print(ob1.nextPermutation(nums)) File "mcraney.py", line 16, in nextPermutation if nums[I] > nums[i - 1]: NameError: name 'I' is not defined0 adalah mabuk yang tidak relevan dari Python 2 dan tidak memiliki tempat dalam kode yang ditulis pada tahun 2022. Ini bukan cara leetcode menampilkannya di tautan di ataskata Peter Donis
Ini valid, tetapi begitu juga dengan cara OP. Saya percaya situs LeetCode secara otomatis memformat kode kerangka Python itu memberi Anda cara kode OP diformat. Cara itu tidak salah, meski tidak sesuai dengan preferensi pribadi Anda
Sepakat;kata Peter Donis
Terkadang orang memilih untuk mengimplementasikan sesuatu sendiri sehingga mereka dapat melihat cara kerjanya
Juga, fungsi bawaan tidak memberi Anda cara apa pun untuk memulai dari permutasi yang dipilih dan mendapatkan yang berikutnya, itu hanya mengulangi semuanya dari awal hingga akhir. Jadi menggunakannya berarti Anda harus mengulang melalui permutasi yang dikembalikan bawaan sampai Anda menemukan yang cocok dengan yang Anda berikan, dan kemudian mengembalikan yang berikutnya. Itu mungkin lebih lambat daripada mencari tahu permutasi berikutnya secara langsung
kata pbuk
Sepakat
Ya, tapi apakah itu "mahal" itu relatif. Untuk banyak program, terlalu murah untuk dikhawatirkankata pbuk
Mengkloning daftar angka selalu merupakan operasi yang mahal di Python yang membutuhkan pembuatan objek baru untuk daftar tersebut
TIDAK. Mengkloning daftar tidak akan menyalin objekkata pbuk
dan objek nomor baru untuk setiap entri dalam daftar
Piton
>>> l1 = [1, 2, 3] >>> l2 = list(l1) >>> l2 is l1 False >>> all(l2[i] is l1[i] for i in range(len(l1))) True_
Bahkan untuk daftar yang berisi objek yang dapat diubah, Anda memerlukan Traceback (most recent call last): File "mcraney.py", line 37, in <module> print(ob1.nextPermutation(nums)) File "mcraney.py", line 16, in nextPermutation if nums[I] > nums[i - 1]: NameError: name 'I' is not defined1 jika Anda ingin objek disalin juga
Kode
>>> l1 = [['a'], ['b'], ['c']] >>> l2 = list(l1) >>> l2 is l1 False >>> all(l2[i] is l1[i] for i in range(len(l1))) True >>> import copy >>> l3 = copy.copy(l1) >>> all(l3[i] is l1[i] for i in range(len(l1))) True >>> l4 = copy.deepcopy(l1) >>> all(l4[i] is l1[i] for i in range(len(l1))) False_
Ah, oke, sekarang aku mengerti maksudmu. Tapi ini benar terlepas dari jenis objek apa yang disimpan daftar, jadi saya tidak mengerti maksud dari pernyataan Anda bahwa "berarti jika mereka primitif". Apa yang Anda gambarkan di sini dilakukan setiap kali daftar dikloning, apakah daftar tersebut menyimpan "primitif" atau tidakkata pbuk
Mengkloning daftar selalu merupakan operasi yang mahal dalam Python yang membutuhkan pembuatan objek baru untuk daftar yang dikloning dan entri baru pada daftar penunjuk tertaut internal* untuk setiap entri dalam daftar, membuat (n+1) entri baru pada
Apakah maksud Anda bilangan bulat cukup kecil sehingga dibuat sebelumnya oleh juru bahasa (mirip dengan lajang seperti Tidak Ada)?kata pbuk
* atau bilangan bulat atau kasus pengoptimalan khusus tertentu lainnya di CPython
Seperti yang saya pahami kode C internal untuk objek daftar, tidak ada yang memengaruhi cara daftar menyimpan petunjuk secara internal. Daftar Traceback (most recent call last): File "mcraney.py", line 37, in <module> print(ob1.nextPermutation(nums)) File "mcraney.py", line 16, in nextPermutation if nums[I] > nums[i - 1]: NameError: name 'I' is not defined2 masih harus memiliki lima entri dalam daftar penunjuk tertaut internal, meskipun setiap penunjuk entri identik (semuanya menunjuk ke objek None yang dibuat sebelumnya oleh penafsir)
Ups, Anda benar sekali. . Ini masih O(n) tetapi dengan konstanta yang cukup kecilkata Peter Donis
Memikirkan hal ini, saya tidak yakin itu benar; . Saya harus melihat kode sumber CPython jika ada kesempatan
Pokoknya Anda meminta sesi interaktif;
Piton
from copy import copy, deepcopy compound = [0] original = [1, 1.0, 'Hello', True, compound] copyList = copy(original) deepCopyList = deepcopy(original) compound[0] = 1 comments = ([ 'Integers are a special case and are never deep copied', 'Floats are never deep copied', 'Strings are never deep copied', 'Booleans are a REALLY special case and are never deep copied', 'Only compound objects are deep copied', ]) for i in range(len(original)): print(comments[i]) print(original[i], copyList[i], deepCopyList[i]) print(id(original[i]), id(copyList[i]), id(deepCopyList[i]), '\n') print('Booleans are a REALLY special case: see how anything with the') print('value True always points to the same memory location!', id(True))_
Kode
Integers are a special case and are never deep copied 1 1 1 140714672596784 140714672596784 140714672596784 Floats are never deep copied 1.0 1.0 1.0 2049093583344 2049093583344 2049093583344 Strings are never deep copied Hello Hello Hello 2049093700400 2049093700400 2049093700400 Booleans are a REALLY special case and are never deep copied True True True 140714672314192 140714672314192 140714672314192 Only compound objects are deep copied [1] [1] [0] 2049094088576 2049094088576 2049093240384 Booleans are a REALLY special case: see how anything with the value True always points to the same memory location! 140714672314192_
Ini mengasumsikan bahwa mengetahui opsi mana yang merupakan opsi "paling tidak mengherankan" untuk nama fungsi tertentu adalah hal yang sederhana. Apakah itu?kata pbuk
Jika Anda memiliki fungsi doSomethingToAList(list, moreArgs. ) yang tidak mengembalikan apa pun (atau mengembalikan, katakanlah, bilangan bulat yang memberikan jumlah entri yang terpengaruh) maka jelas bahwa jika itu akan berfungsi sama sekali maka harus mengubah argumen daftar. Karena itu Anda tahu bahwa jika Anda tidak ingin daftar Anda dimutasi, Anda harus menyalin (atau menyalinnya dalam-dalam) terlebih dahulu
Di sisi lain, Anda akan mengharapkan fungsi mengekstrak Nilai Maksimum Dari(daftar, hitung) untuk mengembalikan daftar baru dengan entri tidak lebih dari [hitungan];
Nama fungsi yang relevan di OP adalah Traceback (most recent call last): File "mcraney.py", line 37, in <module> print(ob1.nextPermutation(nums)) File "mcraney.py", line 16, in nextPermutation if nums[I] > nums[i - 1]: NameError: name 'I' is not defined3. Hanya dengan melihat namanya, apakah Anda berharap ini mengubah daftar di tempatnya?
Nama yang dipilih dengan baik dapat membantu inikata Peter Donis
Ini mengasumsikan bahwa mengetahui opsi mana yang merupakan opsi "paling tidak mengherankan" untuk nama fungsi tertentu adalah hal yang sederhana. Apakah itu?
Tidak, nama fungsi yang relevan adalah Traceback (most recent call last): File "mcraney.py", line 37, in <module> print(ob1.nextPermutation(nums)) File "mcraney.py", line 16, in nextPermutation if nums[I] > nums[i - 1]: NameError: name 'I' is not defined5kata Peter Donis
Nama fungsi yang relevan di OP adalah Traceback (most recent call last): File "mcraney.py", line 37, in <module> print(ob1.nextPermutation(nums)) File "mcraney.py", line 16, in nextPermutation if nums[I] > nums[i - 1]: NameError: name 'I' is not defined3
kata pbuk
Ya tapi itu hal yang salah untuk diperbaiki, baca teruskata joshmccraney
Sunting. semua yang saya ubah adalah menambahkan angka pengembalian dalam fungsi terbalik dan berfungsi. Terima kasih sudah membawa ini padaku. Saya menghargainya
Karena ini adalah kata kerja, saya mengharapkannya melakukan sesuatu. Akan lebih baik dinamai Traceback (most recent call last): File "mcraney.py", line 37, in <module> print(ob1.nextPermutation(nums)) File "mcraney.py", line 16, in nextPermutation if nums[I] > nums[i - 1]: NameError: name 'I' is not defined6 karena itulah yang dilakukannya (dan untuk menghindari kebingungan dengan metode Traceback (most recent call last): File "mcraney.py", line 37, in <module> print(ob1.nextPermutation(nums)) File "mcraney.py", line 16, in nextPermutation if nums[I] > nums[i - 1]: NameError: name 'I' is not defined5 objek daftar). Fungsi yang mengembalikan daftar terbalik sebagian akan lebih baik diberi nama Traceback (most recent call last): File "mcraney.py", line 37, in <module> print(ob1.nextPermutation(nums)) File "mcraney.py", line 16, in nextPermutation if nums[I] > nums[i - 1]: NameError: name 'I' is not defined8
Poin yang saya coba sampaikan adalah bahwa suatu fungsi tidak boleh memutasikan daftar sekaligus mengembalikan daftar yang dimutasi; . Sebagai poin sekunder, saya berpendapat bahwa dalam hal ini tidak ada keuntungan dalam mengembalikan daftar baru jadi saya akan memilih mutasi dengan nilai pengembalian batalkata Peter Donis
Anda berdebat sebelumnya di utas bahwa fungsi ini seharusnya tidak mengembalikan nilai tetapi harus mengubah daftar di tempatnya