Apakah praktik yang baik untuk tidak mengembalikan apa pun dengan python?

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

kata joshmccraney

Saya menjalankan kode itu kata demi kata seperti yang diposting

Anda tidak bisa; . Itu sebabnya NameError dilempar. Inilah yang saya jalankan persis seperti yang Anda posting, di bash shell di Linux

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

 

kata 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 Linux

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 baliknya

 

kata joshmccraney

Sunting. semua yang saya ubah adalah menambahkan angka pengembalian dalam fungsi terbalik dan berfungsi

Ya tapi itu hal yang salah untuk diperbaiki, baca terus

kata 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

Tidak perlu mengembalikan apa pun dari nextPermutation karena ini mengubah argumen daftar di tempatnya. Itu harus disebut sebagai

Piton

    ob1.nextPermutation(nums)
    print(nums)


kata Peter Donis

Opsi pertama mungkin adalah praktik pemrograman yang lebih baik;

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 tempat

kata 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

Ini akan sangat mahal

 

kata pbuk

Cara Anda mengimplementasikannya tidak ada gunanya menggunakan kelas. nextPermutation bisa menjadi fungsi sederhana

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

kata pbuk

Jika Anda akan menerapkannya sebagai kelas dengan cara ini, nextPermutation harus diterapkan sebagai

Komentar yang sama seperti di atas

kata pbuk

Deklarasi kelas Anda seharusnya hanya class Solution:, Anda tidak boleh secara eksplisit memperluas objek object

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

kata pbuk

Perhatikan bahwa ada a

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 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

Poin bagus. https. //kode leet. com/masalah/permutasi/ misalnya

kata 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

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 defined
0 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 atas

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

Sepakat;

 

kata pbuk

Sepakat


kata pbuk

Mengkloning daftar angka selalu merupakan operasi yang mahal di Python yang membutuhkan pembuatan objek baru untuk daftar tersebut

Ya, tapi apakah itu "mahal" itu relatif. Untuk banyak program, terlalu murah untuk dikhawatirkan

kata pbuk

dan objek nomor baru untuk setiap entri dalam daftar

TIDAK. Mengkloning daftar tidak akan menyalin objek

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 defined
1 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
_

 

kata 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

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 tidak

kata pbuk

* atau bilangan bulat atau kasus pengoptimalan khusus tertentu lainnya di CPython

Apakah maksud Anda bilangan bulat cukup kecil sehingga dibuat sebelumnya oleh juru bahasa (mirip dengan lajang seperti Tidak Ada)?

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 defined
2 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)

 

kata Peter Donis

Memikirkan hal ini, saya tidak yakin itu benar; . Saya harus melihat kode sumber CPython jika ada kesempatan

Ups, Anda benar sekali. . Ini masih O(n) tetapi dengan konstanta yang cukup kecil

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
_

 

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];

Ini mengasumsikan bahwa mengetahui opsi mana yang merupakan opsi "paling tidak mengherankan" untuk nama fungsi tertentu adalah hal yang sederhana. Apakah itu?

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 defined
3. Hanya dengan melihat namanya, apakah Anda berharap ini mengubah daftar di tempatnya?

 

kata Peter Donis

Ini mengasumsikan bahwa mengetahui opsi mana yang merupakan opsi "paling tidak mengherankan" untuk nama fungsi tertentu adalah hal yang sederhana. Apakah itu?

Nama yang dipilih dengan baik dapat membantu ini

kata 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 defined
3

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 defined
5

kata pbuk

kata joshmccraney

Sunting. semua yang saya ubah adalah menambahkan angka pengembalian dalam fungsi terbalik dan berfungsi. Terima kasih sudah membawa ini padaku. Saya menghargainya

Ya tapi itu hal yang salah untuk diperbaiki, baca terus


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 defined
6 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 defined
5 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 defined
8

kata Peter Donis

Anda berdebat sebelumnya di utas bahwa fungsi ini seharusnya tidak mengembalikan nilai tetapi harus mengubah daftar di tempatnya

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 batal

Apakah boleh mengembalikan None dengan Python?

Menggunakan pengembalian Tidak Ada . Nilai ini Tidak ada kemudian dapat digunakan di tempat lain. return None tidak pernah digunakan jika tidak ada kemungkinan nilai kembalian lain dari fungsi .

Apakah mengembalikan Tidak ada praktik yang baik?

Mengembalikan Tidak Ada pada umumnya adalah bentuk yang buruk artinya "semuanya baik-baik saja. " Jika Anda memiliki semacam pencarian/pengakses, Tidak ada berarti "nilai item tersebut adalah Tidak Ada", dan jika tidak ditemukan, Anda harus membuang pengecualian yang sesuai.