Menegaskan nilai dalam daftar python

Ketika sesuatu yang tidak terduga terjadi pada kode untuk suatu fungsi atau metode, ada 4 cara untuk menunjukkan adanya masalah

  1. mengajukan pengecualian, dengan pesan
  2. gunakan penegasan untuk meningkatkan AssertionError dengan pesan
  3. mengembalikan nilai khusus (sesuatu yang biasanya tidak dapat dikembalikan)
  4. mencetak pesan di konsol

Pertimbangkan fungsi untuk mengembalikan indeks nilai dalam daftar

def index(lst, value):
    """Return the index of the first element in lst that equals value"""
    return lst.index(value)

>>> lst = ['a', 'b', 'c', 'b']
>>> index(lst, 'b')
1
>>> index(lst,'z')
ValueError: 'z' is not in list

  1. Naikkan Pengecualian
    Dalam contoh ini, metode

    def index(lst, value):
        assert value in lst, f"{value} is not in list"
        return lst.index(value)
    
    >>> index(['a', 'b', 'c'], 'd')
    AssertionError: 'd' is not in list
    
    _1 bawaan memunculkan ValueError jika argumen tidak ada dalam daftar. Jadi kita tidak perlu menambahkan kode apapun

  2. Gunakan menegaskan dengan tes bahwa nilainya ada dalam daftar

    def index(lst, value):
        assert value in lst, f"{value} is not in list"
        return lst.index(value)
    
    >>> index(['a', 'b', 'c'], 'd')
    AssertionError: 'd' is not in list
    
    _

  3. Mengembalikan nilai khusus. Mari kembalikan -1, yang biasanya tidak pernah menjadi indeks

    def index(lst, value):
        if value not in lst:
            return -1
        return lst.index(value)
    
    >>> index(['a', 'b', 'c'], 'd')
    -1
    

  4. Cetak pesan di konsol. Dalam hal ini, kita masih perlu mengembalikan sesuatu agar program dapat dijalankan. Jika kita hanya menulis
    def index(lst, value):
        assert value in lst, f"{value} is not in list"
        return lst.index(value)
    
    >>> index(['a', 'b', 'c'], 'd')
    AssertionError: 'd' is not in list
    
    _2 Python akan mengembalikan
    def index(lst, value):
        assert value in lst, f"{value} is not in list"
        return lst.index(value)
    
    >>> index(['a', 'b', 'c'], 'd')
    AssertionError: 'd' is not in list
    
    3

    def index(lst, value):
        if value not in lst:
            print(f"{value} is not in list")
            return
        return lst.index(value)
    
    >>> index(['a', 'b', 'c'], 'd')
    # nothing is printed
    
    _

Solusi mana yang terbaik?

Jawabannya tergantung pada tujuan fungsi dan kondisi yang Anda periksa

  • Gunakan penegasan untuk memeriksa kondisi yang tidak boleh terjadi dalam kode yang benar, termasuk pelanggaran prasyarat atau invarian (hal yang harus selalu benar)
    • menegaskan digunakan untuk menangkap kesalahan pemrograman dan untuk debugging
    • jika
      def index(lst, value):
          assert value in lst, f"{value} is not in list"
          return lst.index(value)
      
      >>> index(['a', 'b', 'c'], 'd')
      AssertionError: 'd' is not in list
      
      4 gagal, program akan berhenti dengan AssertionError. Ini lebih baik daripada diam-diam mengabaikan kesalahan sampai program gagal, karena membantu mengidentifikasi sumber masalah
    • programmer tidak diharapkan menangkap AssertionError
    • Dalam penggunaan produksi, pernyataan dapat dinonaktifkan menggunakan opsi python
      def index(lst, value):
          assert value in lst, f"{value} is not in list"
          return lst.index(value)
      
      >>> index(['a', 'b', 'c'], 'd')
      AssertionError: 'd' is not in list
      
      5
    • def index(lst, value):
          assert value in lst, f"{value} is not in list"
          return lst.index(value)
      
      >>> index(['a', 'b', 'c'], 'd')
      AssertionError: 'd' is not in list
      
      _4 pernyataan memberikan dokumentasi internal tentang apa yang diharapkan benar – prasyarat dan kondisi lain yang harus benar jika kodenya benar
  • Gunakan pengecualian untuk kondisi kesalahan yang dapat terjadi dalam kode yang benar, dan untuk fungsi/metode publik (seperti di perpustakaan) di mana fungsi tersebut mungkin dipanggil dengan nilai yang salah
    • programmer dapat menangkap pengecualian dan menanganinya
  • Untuk kondisi yang tidak biasa atau tidak terduga yang dapat terjadi secara wajar dalam kode yang benar dan bukan kesalahan, Anda dapat mengembalikan nilai khusus atau menaikkan Pengecualian. Pilihannya tergantung pada preferensi dan bagaimana kode itu dimaksudkan untuk digunakan
    • programmer diharapkan untuk memeriksa nilai pengembalian khusus
  • Mencetak pesan di konsol bukanlah solusi yang baik
    • Untuk aplikasi interaktif, biarkan penelepon mencetak pesan melalui UI biasa
  • Pencatatan dapat digunakan bersama dengan pengecualian untuk mencatat kondisi kesalahan

Dalam fungsi

def index(lst, value):
    assert value in lst, f"{value} is not in list"
    return lst.index(value)

>>> index(['a', 'b', 'c'], 'd')
AssertionError: 'd' is not in list
_7, mencari nilai yang tidak ada dalam daftar mungkin merupakan hal yang wajar untuk dilakukan (bergantung pada aplikasinya). Jadi, "berikan pengecualian" atau "kembalikan nilai khusus" adalah solusi yang dapat diterima

  • def index(lst, value):
        assert value in lst, f"{value} is not in list"
        return lst.index(value)
    
    >>> index(['a', 'b', 'c'], 'd')
    AssertionError: 'd' is not in list
    
    8 Python memunculkan ValueError
  • def index(lst, value):
        assert value in lst, f"{value} is not in list"
        return lst.index(value)
    
    >>> index(['a', 'b', 'c'], 'd')
    AssertionError: 'd' is not in list
    
    9 Java mengembalikan -1 jika nilai tidak ada dalam daftar

Latihan

Fungsi ini menghitung rata-rata daftar angka

def average(values) -> float:
    """Return the average of a list of values. Must supply at least one value"""
    return sum(values) / len(values)

  1. Jika parameter

    def index(lst, value):
        if value not in lst:
            return -1
        return lst.index(value)
    
    >>> index(['a', 'b', 'c'], 'd')
    -1
    
    _0 adalah daftar kosong, apa yang terjadi?

  2. Ubah kode untuk menaikkan ValueError jika daftar kosong

  3. Tambahkan

    def index(lst, value):
        assert value in lst, f"{value} is not in list"
        return lst.index(value)
    
    >>> index(['a', 'b', 'c'], 'd')
    AssertionError: 'd' is not in list
    
    _4 untuk menguji apakah daftar tersebut tidak kosong. Tampilkan pesan jika pernyataan gagal

  4. Buat fungsi

    def index(lst, value):
        if value not in lst:
            return -1
        return lst.index(value)
    
    >>> index(['a', 'b', 'c'], 'd')
    -1
    
    _2 pengembalian 0. 0 jika daftar kosong. Bisakah Anda melakukan ini tanpa "jika .. lain"?

  5. Solusi mana yang menurut Anda terbaik untuk rata-rata?

Latihan

Baca baris pertama dari file dan kembalikan

def head(filename) -> str:
    """Return the first line from a file."""
    file = open(filename, 'r')
    first_line = file.readline()
    file.close()
    return first_line

  1. Apa yang harus dilakukan

    def index(lst, value):
        if value not in lst:
            return -1
        return lst.index(value)
    
    >>> index(['a', 'b', 'c'], 'd')
    -1
    
    3 jika nama file yang diminta tidak ada atau tidak dapat dibuka?

  2. Apa yang harus dilakukan

    def index(lst, value):
        if value not in lst:
            return -1
        return lst.index(value)
    
    >>> index(['a', 'b', 'c'], 'd')
    -1
    
    3 jika file kosong?

  3. Apakah ada kesalahan penggunaan yang dapat Anda gunakan untuk memeriksa ________1______4?
    • tidak perlu memeriksa bahwa nama file adalah string.
      def index(lst, value):
          if value not in lst:
              return -1
          return lst.index(value)
      
      >>> index(['a', 'b', 'c'], 'd')
      -1
      
      6 akan menangkapnya
  4. Tulis ulang
    def index(lst, value):
        if value not in lst:
            return -1
        return lst.index(value)
    
    >>> index(['a', 'b', 'c'], 'd')
    -1
    
    _3 untuk menggunakan solusi Anda. Jika berlaku untuk kode Anda, tulis ulang juga untuk menggunakan blok "dengan" untuk menutup file secara otomatis saat eksekusi meninggalkan blok

Sintaks Assert

assert condition, expression

"Tegaskan" kondisi yang seharusnya Benar. Jika kondisinya Salah, maka AssertionError dimunculkan dengan hasil

def index(lst, value):
    if value not in lst:
        return -1
    return lst.index(value)

>>> index(['a', 'b', 'c'], 'd')
-1
8 sebagai teks pesan pengecualian.
def index(lst, value):
    if value not in lst:
        return -1
    return lst.index(value)

>>> index(['a', 'b', 'c'], 'd')
-1
8 dapat berupa string atau apapun yang menghasilkan string (seperti referensi fungsi yang mengembalikan string)

assert math.sqrt(25)==5, "sqrt is broken"

Jangan Menaikkan root def index(lst, value): if value not in lst: print(f"{value} is not in list") return return lst.index(value) >>> index(['a', 'b', 'c'], 'd') # nothing is printed 0 Type

Anda harus memunculkan jenis pengecualian tertentu, seperti ValueError atau TypeError. Jika Anda sedang menulis fungsi perpustakaan dan tidak ada tipe pengecualian standar yang berlaku untuk situasi tersebut, maka tentukan subkelas pengecualian Anda sendiri

Anda tidak boleh menaikkan jenis

def index(lst, value):
    if value not in lst:
        print(f"{value} is not in list")
        return
    return lst.index(value)

>>> index(['a', 'b', 'c'], 'd')
# nothing is printed
_0 atau
def index(lst, value):
    if value not in lst:
        print(f"{value} is not in list")
        return
    return lst.index(value)

>>> index(['a', 'b', 'c'], 'd')
# nothing is printed
2 basis, yang merupakan kelas dasar untuk pengecualian lainnya

Kenapa tidak?

  • Itu tidak deskriptif atau spesifik
  • Jika pemrogram menggunakan
    def index(lst, value):
        if value not in lst:
            print(f"{value} is not in list")
            return
        return lst.index(value)
    
    >>> index(['a', 'b', 'c'], 'd')
    # nothing is printed
    
    _3, ia akan menangkap pengecualian apa pun, termasuk hal-hal yang tidak dimaksudkan untuk ditangkap
  • def index(lst, value):
        if value not in lst:
            print(f"{value} is not in list")
            return
        return lst.index(value)
    
    >>> index(['a', 'b', 'c'], 'd')
    # nothing is printed
    
    4 juga akan menangkap KeyboardInterrupt (Ctrl-C)

Pengecualian Khusus "Tangkap" Saja

Hindari menulis

def index(lst, value):
    if value not in lst:
        print(f"{value} is not in list")
        return
    return lst.index(value)

>>> index(['a', 'b', 'c'], 'd')
# nothing is printed
_5 (menangkap hampir semua pengecualian). Itu dapat menutupi kesalahan yang tidak terduga. Hanya tangkap pengecualian yang Anda harapkan terjadi

Apa yang menegaskan () dengan Python?

Kata kunci assert digunakan saat men-debug kode . Kata kunci assert memungkinkan Anda menguji apakah suatu kondisi dalam kode Anda mengembalikan True, jika tidak, program akan memunculkan AssertionError. Anda dapat menulis pesan yang akan ditulis jika kode kembali False, periksa contoh di bawah ini.

Bagaimana Anda menyatakan angka dengan Python?

x = 10 menegaskan x > 0 print('x adalah bilangan positif. ') x adalah bilangan positif. Pada contoh di atas, kondisi penegasan, x > 0 bernilai True, sehingga akan terus mengeksekusi pernyataan berikutnya tanpa error.

Bagaimana Anda menegaskan nilai boolean dengan Python?

assertTrue() dengan Python adalah fungsi pustaka unittest yang digunakan dalam pengujian unit untuk membandingkan nilai tes dengan true. Fungsi ini akan mengambil dua parameter sebagai input dan mengembalikan nilai boolean tergantung pada kondisi tegas. Jika nilai tes adalah true maka assertTrue() akan mengembalikan true jika tidak maka return false.

Bagaimana Anda mencetak nilai tegas dengan Python?

>>> menegaskan (1==2, 1==1) . Peringatan Sintaks. pernyataan selalu benar, mungkin hapus tanda kurung? . >>> menegaskan (1==2), ("Kondisi ini mengembalikan nilai %s. ") % Traceback "Salah" (panggilan terbaru terakhir). File "