String Python

Python memiliki class string bawaan bernama "str" dengan banyak fitur praktis (ada modul lama bernama "string" yang tidak boleh Anda gunakan). Literal string dapat diapit oleh tanda kutip ganda atau tunggal, meskipun tanda kutip tunggal lebih umum digunakan. Escape garis miring terbalik berfungsi dengan cara yang biasa dalam literal yang diberi tanda kutip tunggal dan ganda -- mis. \n \' \". Literal string dengan tanda kutip ganda dapat berisi tanda kutip tunggal tanpa kerepotan (misalnya, "Saya tidak melakukannya") dan juga string dengan tanda kutip tunggal dapat berisi tanda kutip ganda. Literal string dapat mencakup beberapa baris, tetapi harus ada garis miring terbalik \ di akhir setiap baris untuk meng-escape baris baru. Literal string di dalam tanda kutip tiga, """ atau ''', dapat mencakup beberapa baris teks.

String Python bersifat "tidak dapat diubah" yang berarti tidak dapat diubah setelah dibuat (string Java juga menggunakan gaya yang tidak dapat diubah ini). Karena string tidak dapat diubah, kita membuat string *baru* saat merepresentasikan nilai yang dihitung. Jadi, misalnya ekspresi ('hello' + 'there') menggunakan 2 string 'hello' dan 'there' dan membuat string baru 'hellothere'.

Karakter dalam string dapat diakses menggunakan sintaks [ ] standar, dan seperti Java dan C++, Python menggunakan pengindeksan berbasis nol, jadi jika s adalah 'hello' s[1] adalah 'e'. Jika indeks melampaui batas string, Python akan memunculkan error. Gaya Python (tidak seperti Perl) adalah menghentikan jika tidak mengetahui apa yang harus dilakukan, bukan hanya membuat nilai default. Sintaks "slice" yang praktis (di bawah) juga berfungsi untuk mengekstrak {i>substring<i} apa pun dari suatu string. Fungsi len(string) mengembalikan panjang sebuah {i>string<i}. Sintaks [ ] dan fungsi len() sebenarnya bekerja pada semua jenis urutan -- string, daftar, dll.. Python mencoba membuat operasinya bekerja secara konsisten di berbagai jenis. Getcha pemula Python: jangan gunakan "len" sebagai nama variabel untuk menghindari terhalangnya fungsi len(). Operator '+' dapat menggabungkan dua string. Perhatikan pada kode di bawah ini bahwa variabel tidak dideklarasikan sebelumnya -- cukup tetapkan ke variabel tersebut dan lanjutkan.

  s = 'hi'
  print(s[1])          ## i
  print(len(s))        ## 2
  print(s + ' there')  ## hi there

Tidak seperti Java, '+' tidak secara otomatis mengonversi angka atau tipe lain menjadi bentuk string. Fungsi str() mengubah nilai menjadi bentuk {i>string<i} sehingga dapat digabungkan dengan {i>string<i} lain.

  pi = 3.14
  ##text = 'The value of pi is ' + pi      ## NO, does not work
  text = 'The value of pi is '  + str(pi)  ## yes

Untuk angka, operator standar, +, /, * berfungsi seperti biasa. Tidak ada operator ++, tetapi +=, -=, dll. berfungsi. Jika Anda ingin pembagian bilangan bulat, gunakan 2 garis miring -- misalnya 6 // 5 adalah 1

Fungsi "print" biasanya mencetak satu atau beberapa item Python yang diikuti dengan baris baru. Literal string "raw" diawali dengan 'r' dan meneruskan semua karakter tanpa perlakuan khusus garis miring terbalik, sehingga r'x\nx' mengevaluasi ke string length-4 'x\nx'. "print" dapat menggunakan beberapa argumen untuk mengubah cara mencetaknya (lihat definisi fungsi cetak python.org) seperti menyetel "end" ke "" agar tidak lagi mencetak baris baru setelah selesai mencetak semua item.

  raw = r'this\t\n and that'

  # this\t\n and that
  print(raw)

  multi = """It was the best of times.
  It was the worst of times."""

  # It was the best of times.
  #   It was the worst of times.
  print(multi)

Metode String

Berikut adalah beberapa metode {i>string<i} yang paling umum. Metode mirip dengan fungsi, tetapi berjalan "pada" objek. Jika variabel s adalah string, maka kode s.lower() menjalankan metode bottom() pada objek string tersebut dan mengembalikan hasilnya (gagasan tentang metode yang berjalan pada objek ini adalah salah satu ide dasar yang membentuk Pemrograman Berorientasi Objek, OOP). Berikut adalah beberapa metode string yang paling umum:

  • s.lower(), s.upper() -- mengembalikan string versi huruf kecil atau huruf besar
  • s.strip() -- mengembalikan string dengan spasi kosong yang dihapus dari awal dan akhir
  • s.isalpha()/s.isdigit()/s.isspace()... -- menguji apakah semua karakter string berada dalam beragam kelas karakter
  • s.startswith('other'), s.endswith('other') -- menguji apakah string dimulai atau diakhiri dengan string lain yang diberikan
  • s.find('other') -- menelusuri string lain yang diberikan (bukan ekspresi reguler) dalam s, dan mengembalikan indeks pertama yang dimulai atau -1 jika tidak ditemukan
  • s.replace('old', 'new') -- mengembalikan string dengan semua kemunculan 'lama' telah diganti dengan 'new'
  • s.split('delim') -- mengembalikan daftar substring yang dipisahkan oleh pembatas yang diberikan. Pemisah bukan ekspresi reguler, melainkan hanya teks. 'aaa,bbb,ccc'.split(',') -> ['aaa', 'bbb', 'ccc']. Sebagai kasus khusus yang praktis, s.split() (tanpa argumen) dipisahkan pada semua karakter spasi kosong.
  • s.join(list) -- kebalikan dari split(), menggabungkan elemen-elemen dalam daftar yang diberikan bersama-sama menggunakan string sebagai pembatas. misalnya '---'.join(['aaa', 'bbb', 'ccc']) -> aaa---bbb---

Penelusuran google untuk "python str" akan mengarahkan Anda ke metode string python.org resmi yang mencantumkan semua metode str.

Python tidak memiliki jenis karakter yang terpisah. Sebagai gantinya, ekspresi seperti s[8] mengembalikan string-length-1 yang berisi karakter. Dengan string-length-1 itu, operator ==, <=, ... semuanya berfungsi seperti yang Anda harapkan, jadi kebanyakan Anda tidak perlu tahu bahwa Python tidak memiliki tipe "char" skalar terpisah.

Slice String

Sintaks "slice" adalah cara praktis untuk merujuk pada sub-bagian urutan -- biasanya string dan daftar. Slice slice[start:end] adalah elemen yang dimulai dari awal dan memanjang hingga tetapi tidak termasuk akhir. Misalkan s = “Hello”

{i>string<i} &#39;halo&#39; dengan indeks huruf 0 1 2 3 4

  • s[1:4] adalah 'ell' -- karakter yang dimulai pada indeks 1 dan memanjang hingga tetapi tidak termasuk indeks 4
  • s[1:] adalah 'ello' -- menghilangkan default indeks ke awal atau akhir string
  • s[:] adalah 'Hello' -- menghilangkan keduanya selalu memberi kita salinan semuanya (ini adalah cara Pythonic untuk menyalin urutan seperti string atau daftar)
  • s[1:100] adalah 'ello' - indeks yang terlalu besar dipotong ke panjang string

Nomor indeks standar berbasis nol memberikan akses mudah ke karakter di dekat awal string. Sebagai alternatif, Python menggunakan angka negatif untuk memberikan akses mudah ke karakter di akhir string: s[-1] adalah karakter terakhir 'o', s[-2] adalah 'l' karakter berikutnya, dan seterusnya. Nomor indeks negatif dihitung kembali dari akhir string:

  • s[-1] adalah 'o' -- karakter terakhir (1 dari akhir)
  • s[-4] adalah 'e' -- keempat dari akhir
  • s[:-3] adalah 'Dia' -- akan sampai tetapi tidak termasuk 3 karakter terakhir.
  • s[-3:] adalah 'llo' -- dimulai dengan karakter ke-3 dari akhir dan meluas ke akhir {i>string<i}.

Ini adalah irisan yang rapi yang untuk setiap indeks n, s[:n] + s[n:] == s. Hal ini berfungsi bahkan untuk n negatif atau di luar batas. Atau dengan kata lain s[:n] dan s[n:] selalu mempartisi string menjadi dua bagian string, dengan mempertahankan semua karakter. Seperti yang akan kita lihat di bagian daftar nanti, slice juga berfungsi dengan daftar.

Pemformatan string

Satu hal praktis yang dapat dilakukan Python adalah otomatis mengonversi objek menjadi string yang cocok untuk dicetak. Dua cara bawaan untuk melakukannya adalah literal string berformat, juga disebut "f-string", dan memanggil str.format().

Literal string yang telah diformat

Anda akan sering melihat literal string berformat yang digunakan dalam situasi seperti:

  value = 2.791514
  print(f'approximate value = {value:.2f}')  # approximate value = 2.79

  car = {'tires':4, 'doors':2}
  print(f'car = {car}') # car = {'tires': 4, 'doors': 2}

String literal yang diformat diawali dengan 'f' (seperti awalan 'r' yang digunakan untuk string mentah). Teks apa pun di luar tanda kurung kurawal '{}' akan dicetak secara langsung. Ekspresi yang terdapat dalam '{}' dicetak menggunakan spesifikasi format yang dijelaskan dalam spesifikasi format. Ada banyak hal rapi yang dapat Anda lakukan dengan pemformatan termasuk pemotongan dan konversi ke notasi ilmiah dan perataan kiri/kanan/tengah.

{i>f-string<i} sangat berguna saat Anda ingin mencetak tabel objek dan ingin kolom yang mewakili atribut objek yang berbeda disejajarkan seperti

  address_book = [{'name':'N.X.', 'addr':'15 Jones St', 'bonus': 70},
      {'name':'J.P.', 'addr':'1005 5th St', 'bonus': 400},
      {'name':'A.A.', 'addr':'200001 Bdwy', 'bonus': 5},]

  for person in address_book:
    print(f'{person["name"]:8} || {person["addr"]:20} || {person["bonus"]:>5}')

  # N.X.     || 15 Jones St          ||    70
  # J.P.     || 1005 5th St          ||   400
  # A.A.     || 200001 Bdwy          ||     5

% String

Python juga memiliki fasilitas lama seperti printf() untuk mengumpulkan string. Operator % mengambil string format tipe printf di sebelah kiri (%d int, string %s, %f/%g floating point), dan nilai yang cocok dalam tuple di sebelah kanan (tuple terdiri dari nilai yang dipisahkan oleh koma, biasanya dikelompokkan di dalam tanda kurung):

  # % operator
  text = "%d little pigs come out, or I'll %s, and I'll %s, and I'll blow your %s down." % (3, 'huff', 'puff', 'house')

Baris di atas cukup panjang -- anggaplah Anda ingin memecahnya menjadi beberapa baris terpisah. Anda tidak bisa begitu saja memisahkan baris setelah '%' seperti yang Anda lakukan dalam bahasa lain, karena secara default Python memperlakukan setiap baris sebagai pernyataan terpisah (di sisi positifnya, inilah sebabnya kita tidak perlu mengetik titik koma di setiap baris). Untuk memperbaikinya, sertakan seluruh ekspresi dalam kumpulan tanda kurung luar -- lalu ekspresi diizinkan menjangkau beberapa baris. Teknik kode lintas baris ini berfungsi dengan berbagai konstruksi pengelompokan yang diperinci di bawah ini: ( ), [ ], { }.

  # Add parentheses to make the long line work:
  text = (
    "%d little pigs come out, or I'll %s, and I'll %s, and I'll blow your %s down."
    % (3, 'huff', 'puff', 'house'))

Itu lebih baik, tetapi garisnya masih sedikit lebih panjang. Python memungkinkan Anda memotong baris menjadi beberapa bagian, yang kemudian akan digabungkan secara otomatis. Jadi, untuk membuat baris ini lebih pendek, kita dapat melakukan ini:

  # Split the line into chunks, which are concatenated automatically by Python
  text = (
    "%d little pigs come out, "
    "or I'll %s, and I'll %s, "
    "and I'll blow your %s down."
    % (3, 'huff', 'puff', 'house'))

String (Unicode vs byte)

String Python reguler adalah unicode.

Python juga mendukung string yang terdiri dari byte biasa (ditunjukkan dengan awalan 'b' di depan literal string) seperti:

> byte_string = b'A byte string'
> byte_string
  b'A byte string'

String unicode adalah jenis objek yang berbeda dari string byte, tetapi berbagai library seperti ekspresi reguler akan berfungsi dengan benar jika salah satu jenis string diteruskan.

Untuk mengonversi string Python reguler ke byte, panggil metode encode() pada string tersebut. Sebaliknya, metode decode() string byte mengonversi byte biasa yang dienkode menjadi string unicode:

> ustring = 'A unicode \u018e string \xf1'
> b = ustring.encode('utf-8')
> b
b'A unicode \xc6\x8e string \xc3\xb1'  ## bytes of utf-8 encoding. Note the b-prefix.
> t = b.decode('utf-8')                ## Convert bytes back to a unicode string
> t == ustring                         ## It's the same as the original, yay!

True

Di bagian pembacaan file, ada contoh yang menunjukkan cara membuka {i>file<i} teks dengan beberapa encoding dan membaca {i>string<i} unicode.

Pernyataan Jika

Python tidak menggunakan { } untuk mengapit blok kode untuk if/loops/function dll.. Sebagai gantinya, Python menggunakan tanda titik dua (:) dan indentasi/spasi kosong untuk mengelompokkan pernyataan. Pengujian boolean untuk if tidak perlu dalam tanda kurung (perbedaan besar dari C++/Java), dan dapat memiliki klausa *elif* dan *else* (mnemonik: kata "elif" memiliki panjang yang sama dengan kata "else").

Setiap nilai dapat digunakan sebagai uji if. Semua nilai "zero" dihitung sebagai false: Tidak ada, 0, string kosong, daftar kosong, kamus kosong. Ada juga tipe Boolean dengan dua nilai: True dan False (dikonversi ke int, ini adalah 1 dan 0). Python memiliki operasi perbandingan biasa: ==, !=, <, <=, >, >=. Tidak seperti Java dan C, == kelebihan beban untuk bekerja dengan benar dengan string. Operator boolean adalah kata yang dieja *and*, *or*, *not* (Python tidak menggunakan C-style && || !). Berikut adalah tampilan kode untuk aplikasi kesehatan yang menyediakan rekomendasi minuman sepanjang hari -- perhatikan bagaimana setiap blok pernyataan then/else dimulai dengan : dan pernyataan tersebut dikelompokkan berdasarkan indentasinya:

  if time_hour >= 0 and time_hour <= 24:
    print('Suggesting a drink option...')
    if mood == 'sleepy' and time_hour < 10:
      print('coffee')
    elif mood == 'thirsty' or time_hour < 2:
      print('lemonade')
    else:
      print('water')

Saya menemukan bahwa menghilangkan ":" adalah kesalahan sintaks paling umum saya saat mengetik jenis kode di atas, mungkin karena itu adalah hal tambahan yang harus diketik vs. kebiasaan C++/Java saya. Selain itu, jangan letakkan pengujian boolean di dalam tanda kurung -- itu adalah kebiasaan C/Java. Jika kodenya pendek, Anda dapat menempatkan kode pada baris yang sama setelah ":", seperti ini (ini juga berlaku untuk fungsi, loop, dll.), meskipun beberapa orang merasa lebih mudah untuk menempatkan kode di baris terpisah.

  if time_hour < 10: print('coffee')
  else: print('water')

Latihan: string1.py

Untuk mempraktikkan materi di bagian ini, cobalah latihan string1.py di Latihan Dasar.