Python Dizeleri

Python, birçok kullanışlı özelliğe sahip "str" adlı yerleşik bir dize sınıfına sahiptir (kullanmanız gereken "string" adlı eski bir modül vardır). Dize değişmez değerleri çift veya tek tırnak içine alınabilir, ancak tek tırnak daha yaygın olarak kullanılır. Ters eğik çizgi, hem tek hem de çift tırnaklı hazır değerlerde (ör. \n \' \") normal şekilde çalışır. Çift tırnak içine alınmış dize değişmez değeri, herhangi bir karışıklık olmadan tek tırnak işareti içerebilir (ör. "Ben yapmadım") ve aynı şekilde tek tırnak içine alınmış dize çift tırnak içerebilir. Bir dize sabit değeri birden çok satır içerebilir, ancak yeni satırdan çıkış yapmak için her satırın sonunda bir ters eğik çizgi (\) olmalıdır. Üç tırnak içindeki dize değişmez değerleri (""" veya "'") birden fazla metin satırını kapsayabilir.

Python dizeleri "değişmez"dir, yani oluşturulduktan sonra değiştirilemez (Java dizeleri de bu sabit stili kullanır). Dizeler değiştirilemediğinden, hesaplanan değerleri temsil ederken *yeni* dizeler oluştururuz. Örneğin, ('hello' + 'there') ifadesi, 2 "hello" ve "there" dizesini alıp "hellothere" dizesini yeni bir dize oluşturur.

Bir dizedeki karakterlere standart [ ] söz dizimi kullanılarak erişilebilir. Python, Java ve C++ gibi sıfır tabanlı dizine ekleme kullanır. Dolayısıyla s "merhaba" ise s[1], "e" olur. Dizin dizenin sınırlarının dışındaysa Python bir hata verir. Python stili (Perl'in aksine), varsayılan bir değer oluşturmak yerine ne yapılacağını söyleyemezse durdurulur. Kullanışlı "dilim" söz dizimi (aşağıda) bir dizeden herhangi bir alt dizeyi ayıklamak için de çalışır. len(string) işlevi, bir dizenin uzunluğunu döndürür. [ ] söz dizimi ve len() işlevi aslında tüm dizi türlerinde (dizeler, listeler vb.) çalışır. Python, işlemlerinin farklı türlerde tutarlı bir şekilde çalışmasını sağlamaya çalışır. Python'da yeni başlayanlar var: len() işlevinin engellenmesini önlemek için değişken adı olarak "len" kullanmayın. "+" operatörü iki dizeyi birbirine bağlayabilir. Aşağıdaki kodda değişkenlerin önceden bildirilmediğine dikkat edin. Değişkenlere atayın ve başlayın.

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

'+' işareti, Java'nın aksine sayıları veya diğer türleri otomatik olarak dize formuna dönüştürmez. str() işlevi, değerleri diğer dizelerle birleştirilebilmeleri için bir dize formuna dönüştürür.

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

Sayılar için standart operatörler (+, /, *) her zamanki gibi çalışır. ++ operatörü yoktur, ancak +=, -= vb. çalışır. Tam sayıyı bölmek istiyorsanız 2 eğik çizgi kullanın (ör. 6 // 5, 1'dir)

"Yazdır" işlevi normalde bir veya daha fazla python öğesini çıkarıp ardından yeni bir satır getirir. "Ham" dize değişmez değeri "r" ile başlar ve tüm karakterleri ters eğik çizgi olmadan geçirdiğinden, r'x\nx' uzunluk-4 dizesi "x\nx" olarak değerlendirilir. "print", çeşitli bağımsız değişkenler kullanarak öğeleri yazdırma şeklini değiştirebilir (python.org yazdırma işlevinin tanımına bakın). Örneğin, "end"i "" olarak ayarlayarak tüm öğelerin yazdırılması tamamlandıktan sonra yeni bir satırın artık yazdırılmamasını sağlayabilirsiniz.

  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)

Dize Yöntemleri

En yaygın dize yöntemlerinden bazıları aşağıda verilmiştir. Yöntem bir işleve benzer, ancak bir nesne "üzerinde" çalışır. s değişkeni bir dizeyse s.lower() kodu söz konusu dize nesnesinde low() yöntemini çalıştırır ve sonucu döndürür (bir nesne üzerinde çalıştırılan yöntem fikri, Nesne Odaklı Programlama (OOP) özelliğini oluşturan temel fikirlerden biridir). En yaygın dize yöntemlerinden bazıları şunlardır:

  • s.lower(), s.upper() -- Dizenin küçük veya büyük harfli sürümünü döndürür
  • s.strip() -- başında ve sonunda boşluk kaldırılmış bir dize döndürür
  • s.isalpha()/s.isdigital()/s.isspace()... -- tüm dize karakterlerinin çeşitli karakter sınıflarında olup olmadığını test eder
  • s.startswith('other'), s.endswith('other') -- dizenin belirtilen diğer dizeyle başlayıp bitmediğini test eder
  • s.find('other') -- Belirtilen diğer dizeyi (normal ifade değil) s içinde arar ve başladığı ilk dizini veya bulunamazsa -1 değerini döndürür
  • s.replace('old', 'new') -- tüm "old" (eski) tekrarları "new" ile değiştirilecek bir dize döndürür
  • s.split('delim') - Belirtilen ayırıcıyla ayrılmış alt dizelerin bir listesini döndürür. Ayırıcı, normal bir ifade değil, yalnızca bir metindir. 'aaa,bbb,ccc'.split(',') -> ['aaa', 'bbb', 'ccc']. Kullanışlı bir özel durum olan s.split() (bağımsız değişken olmadan), tüm boşluk karakterlerini böler.
  • s.join(list) -- split() fonksiyonunun tersi, dizeyi sınırlayıcı olarak kullanarak belirtilen listedeki öğeleri birleştirir. ör. '---'.join(['aaa', 'bbb', 'ccc']) -> aaa---bbb---ccc

Google'da "python str" ifadesini aratırsanız tüm str yöntemlerini listeleyen resmi python.org dize yöntemlerine yönlendirilirsiniz.

Python ayrı bir karakter türüne sahip değildir. Bunun yerine, s[8] gibi bir ifade, karakteri içeren bir string-length-1 döndürür. Bu string-length-1 dizesinde ==, <=, ... operatörlerinin tümü beklediğiniz gibi çalışır. Dolayısıyla, çoğu zaman Python'ın ayrı bir skaler "char" türüne sahip olmadığını bilmeniz gerekmez.

İp Dilimleri

"Dilim" söz dizimi, dizilerin alt bölümlerine (genellikle dizeler ve listeler) başvuruda bulunmanın kullanışlı bir yoludur. Dilim s[start:end], başta başlayan ve bitişe kadar olan ancak bitişi içermeyen öğelerdir. s = "Hello" ifadesini içeren

harf dizinleriyle &quot;merhaba&quot; dizesi 0 1 2 3 4

  • s[1:4] "ell"dir -- dizin 1'den başlayan ve dizin 4'e kadar uzanan ancak dizin 4'ü içermeyen karakterler
  • s[1:] 'ello'dur. İki dizin de varsayılan olarak dizenin başına veya sonuna atlanır
  • s[:] 'Merhaba'dır. Her ikisinin de atlanması, bize her zaman her şeyin bir kopyasını verir (bu, dize veya liste gibi bir diziyi kopyalamanın pythonik yoludur)
  • s[1:100] değeri "ello"dur. Çok büyük olan bir dizin, dize uzunluğuna kısaltılır.

Standart sıfır tabanlı dizin numaraları, dizenin başlangıcındaki karakterlere kolay erişim sağlar. Alternatif olarak, Python, dizenin sonundaki karakterlere kolay erişim sağlamak için negatif sayılar kullanır: s[-1] son karakter "o"dur, s[-2] sondan bir sonraki karakterdir ve bu böyle devam eder. Negatif dizin sayıları dizenin sonundan geriye doğru sayılır:

  • [-1] değeri "o"dur -- son karakter (sondan 1. karakter)
  • [-4] değeri "e"dir. Sondan 4. saniyedir
  • [:-3] "O"dur. Son 3 karaktere kadar çıkmıyor ancak devam ediyor.
  • s[-3:] "llo"dur. Baştaki 3. karakterle başlar ve dizenin sonuna kadar devam eder.

Bu, herhangi bir endeks n, s[:n] + s[n:] == s için olan dilimlerin düzgün bir işleyişidir. Bu işlev n negatif veya sınır dışı için bile işe yarar. Başka bir şekilde de s[:n] ve s[n:] karakterlerini koruyarak tüm karakterleri koruyarak dizeyi her zaman iki dizeye bölebilirsiniz. Daha sonra liste bölümünde göreceğiniz gibi, dilimler listelerle de çalışır.

Dize biçimlendirmesi

Python'un yapabileceği faydalı şeylerden biri, nesneleri baskıya uygun bir dizeye otomatik olarak dönüştürmektir. Bunu yapmanın iki yerleşik yolu, "f-dizeleri" olarak da adlandırılan biçimlendirilmiş dize değişmez değerleri ve str.format() çağrısıdır.

Biçimlendirilmiş dize sabit değerleri

Genellikle aşağıdaki gibi durumlarda biçimlendirilmiş dize değişmez değerleri görürsünüz:

  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}

Biçimlendirilmiş bir değişmez dizenin önünde "f" bulunur (ham dizeler için kullanılan "r" öneki gibi). Küme ayracı "{}" dışındaki tüm metinler doğrudan yazdırılır. "{}" içindeki ifadeler biçim spesifikasyonunda açıklanan biçim spesifikasyonu kullanılarak yazdırılır.Kesme, bilimsel gösterime dönüştürme ve sola/sağa/ortaya hizalama dahil olmak üzere biçimlendirmeyle yapabileceğiniz birçok faydalı işlem vardır.

f dizeleri, bir nesne tablosu yazdırmak istediğinizde ve farklı nesne özelliklerini temsil eden sütunların aşağıdaki gibi hizalanmasını istediğinizde çok yararlıdır

  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

Dize yüzdesi

Python'da bir dizeyi bir araya getirmek için eski Printf() benzeri bir özellik de bulunur. % operatörü, solda bir Printf türü biçim dizesini (%d int, %s dizesi, %f/%g kayan nokta) ve sağda bulunan bir değişkendeki eşleşen değerleri (genellikle parantez içinde gruplanan değerlerden oluşur) alır:

  # % 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')

Yukarıdaki satır biraz uzun. Bu satırı ayrı satırlara bölmek istediğinizi varsayalım. Python varsayılan olarak her satırı ayrı bir ifade olarak ele aldığından '%' işaretinden sonraki satırı bölemezsiniz. Bu nedenle her satıra noktalı virgül yazmanız gerekmez. Bunu düzeltmek için, ifadenin tamamını bir dış parantez içine alın. Böyle bir durumda ifadenin birden fazla satır içermesine izin verilir. Bu çizgiler arası kod tekniği, aşağıda ayrıntıları verilen çeşitli gruplama yapılarıyla çalışır: ( ), [ ], { }.

  # 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'))

Bu daha iyi, ancak çizgi hâlâ biraz uzun. Python, bir çizgiyi parçalara ayırmanızı sağlar. Daha sonra bunlar otomatik olarak birleştirilir. Bu satırı daha da kısaltmak için şöyle yapabiliriz:

  # 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'))

Dizeler (Unicode ile bayt karşılaştırması)

Normal Python dizeleri unicode'dur.

Python aşağıdaki gibi düz baytlardan (dize değişmez değerinin önünde "b" önekiyle gösterilir) oluşan dizeleri de destekler:

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

Unicode dizesi, bayt dizesinden farklı bir nesne türüdür. Ancak normal ifadeler gibi çeşitli kitaplıklar, bu dize türlerinden herhangi biri iletildiğinde doğru şekilde çalışır.

Normal Python dizesini baytlara dönüştürmek için dizede encode() yöntemini çağırın. Diğer yönde olunca, bayt dizesinin kodu decode() yöntemi, kodlanmış düz baytları unicode dizesine dönüştürür:

> 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

Dosya okuma bölümünde, kodlamaya sahip bir metin dosyasının nasıl açılacağını ve unicode dizelerinin nasıl okunacağını gösteren bir örnek verilmiştir.

Eğer İfade

Python, if/loops/function vb. kod bloklarını eklemek için { } karakterini kullanmaz. Python, ifadeleri gruplandırmak için iki nokta üst üste (:) ve girinti/boşluk kullanır. Bir "if" ifadesinin parantez içinde olması gerekmez (C++/Java'dan büyük fark) ve *elif* ile *else* yan tümceleri olabilir (hatırlatma amaçlı: "elif" kelimesi "else" kelimesi ile aynı uzunluktadır).

Herhangi bir değer, if-test olarak kullanılabilir. "Sıfır" değerlerinin tümü yanlış olarak sayılır: Yok, 0, boş dize, boş liste, boş sözlük. Ayrıca, iki değere sahip bir Boole türü vardır: Doğru ve Yanlış (tam değerine dönüştürülür; bunlar 1 ve 0'dır). Python'da olağan karşılaştırma işlemleri vardır: ==, !=, <, <=, >, >=. Java ve C'den farklı olarak ==, dizelerle doğru şekilde çalışmak için aşırı yüklüdür. Boole operatörleri, *ve*, *veya*, *not* şeklinde yazılan kelimelerdir (Python C stili && || ! kullanmaz). Kod, gün boyunca içecek önerileri sunan bir sağlık uygulaması için şöyle görünebilir. Kodun gün boyunca nasıl göründüğüne bakalım. Sonrasında/else ifadelerinin her blokunun : ile başladığına ve ifadelerin girintilerine göre gruplandırıldığına dikkat edin:

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

Yukarıdaki türde bir kod yazarken en sık yaptığım söz dizimi hatasının ":"'ü hariç tutması olduğunu düşünüyorum. Bunun nedeni, muhtemelen C++/Java alışkanlıklarım yerine yazmam gereken ek bir şey olmasıdır. Ayrıca, boole testini parantez içine almayın. Bu bir C/Java alışkanlığıdır. Kod kısaysa kodu ":" işaretinden sonra aynı satıra yerleştirebilirsiniz. Bunu fonksiyonlar, döngüler vb. için de yapabilirsiniz. Yine de bazı kişiler öğeleri ayrı satırlara ayırmanın daha okunabilir olduğunu düşünüyor.

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

Alıştırma: string1.py

Bu bölümdeki materyali uygulamak için Temel Alıştırmalar'daki string1.py alıştırmasını deneyin.