Python Dict ve Dosyası

Sözlük Karma Tablosu

Python'un etkili anahtar/değer karma tablosu yapısına "dizin" denir. Bir sözlüğün içeriği, parantez içinde { } bir dizi anahtar:değer çifti olarak yazılabilir. Örneğin, sözlük = {anahtar1:değer1, anahtar2:değer2, ... }. "Boş sözlük", yalnızca boş bir çift parantezdir {}.

Bir sözlükte değer aramak veya ayarlamak için köşeli parantezler kullanılır. Örneğin, sözlük["foo"] ifadesi "foo" anahtarının altındaki değeri arar. Dizeler, sayılar ve demetler anahtar olarak çalışır ve tüm türler değer olabilir. Diğer türler anahtar olarak düzgün çalışabilir veya çalışmayabilir (değişmez oldukları için dize ve tuple'ler düzgün çalışır). Sözlükte bulunmayan bir değeri aramak KeyError hatası oluşturur. Anahtarın sözlükte olup olmadığını kontrol etmek için "in" işlevini veya anahtar yoksa değeri ya da None değerini döndüren dict.get(key) işlevini kullanın (veya get(key, not-found) işlevi, not-found durumunda döndürülecek değeri belirtmenize olanak tanır).

  ## Can build up a dict by starting with the empty dict {}
  ## and storing key/value pairs into the dict like this:
  ## dict[key] = value-for-that-key
  dict = {}
  dict['a'] = 'alpha'
  dict['g'] = 'gamma'
  dict['o'] = 'omega'

  print(dict) ## {'a': 'alpha', 'o': 'omega', 'g': 'gamma'}

  print(dict['a'])     ## Simple lookup, returns 'alpha'
  dict['a'] = 6       ## Put new key/value into dict
  'a' in dict         ## True
  ## print(dict['z'])                  ## Throws KeyError
  if 'z' in dict: print(dict['z'])     ## Avoid KeyError
  print(dict.get('z'))  ## None (instead of KeyError)

"a", "o" ve "g" anahtarlarını içeren sözlük

Sözlükteki bir for döngüsü varsayılan olarak anahtarları üzerinde iterasyon yapar. Anahtarlar rastgele bir sırada gösterilir. dict.keys() ve dict.values() yöntemleri, anahtarların veya değerlerin listelerini açıkça döndürür. Ayrıca, sözlükteki tüm anahtar/değer çifti verilerini incelemenin en verimli yolu olan (anahtar, değer) deliklerinin listesini döndüren bir items() bulunur. Bu listelerin tümü, sellers() işlevine iletilebilir.

  ## By default, iterating over a dict iterates over its keys.
  ## Note that the keys are in a random order.
  for key in dict:
    print(key)
  ## prints a g o

  ## Exactly the same as above
  for key in dict.keys():
    print(key)

  ## Get the .keys() list:
  print(dict.keys())  ## dict_keys(['a', 'o', 'g'])

  ## Likewise, there's a .values() list of values
  print(dict.values())  ## dict_values(['alpha', 'omega', 'gamma'])

  ## Common case -- loop over the keys in sorted order,
  ## accessing each key/value
  for key in sorted(dict.keys()):
    print(key, dict[key])

  ## .items() is the dict expressed as (key, value) tuples
  print(dict.items())  ##  dict_items([('a', 'alpha'), ('o', 'omega'), ('g', 'gamma')])

  ## This loop syntax accesses the whole dict by looping
  ## over the .items() tuple list, accessing one (key, value)
  ## pair on each iteration.
  for k, v in dict.items(): print(k, '>', v)
  ## a > alpha    o > omega     g > gamma

Strateji notu: Performans açısından sözlük en iyi araçlarınızdan biridir. Verileri kolayca düzenlemek için mümkün olduğunda sözlüğü kullanmalısınız. Örneğin, her satırın IP adresiyle başladığı bir günlük dosyasını okuyabilir ve verileri anahtar olarak IP adresini, değer olarak da bu adresin göründüğü satırların listesini kullanarak bir sözlükte saklayabilirsiniz. Dosyanın tamamını okuduktan sonra herhangi bir IP adresini arayabilir ve satır listesini anında görebilirsiniz. Sözlük, dağınık verileri alarak tutarlı bir hale getirir.

Sesli Metin Biçimlendirmesi

% operatörü, bir sözlükteki değerleri isme göre bir dizeye yerleştirmek için kullanışlıdır:

  h = {}
  h['word'] = 'garfield'
  h['count'] = 42
  s = 'I want %(count)d copies of %(word)s' % h  # %d for int, %s for string
  # 'I want 42 copies of garfield'

  # You can also use str.format().
  s = 'I want {count:d} copies of {word}'.format(h)

Sil

"del" operatörü silme işlemi yapar. En basit durumda, bir değişkenin tanımını, sanki değişken tanımlanmamış gibi kaldırabilir. Del, listenin ilgili bölümünü silmek ve bir sözlükteki girişleri silmek için liste öğelerinde veya dilimlerde de kullanılabilir.

  var = 6
  del var  # var no more!

  list = ['a', 'b', 'c', 'd']
  del list[0]     ## Delete first element
  del list[-2:]   ## Delete last two elements
  print(list)      ## ['b']

  dict = {'a':1, 'b':2, 'c':3}
  del dict['b']   ## Delete 'b' entry
  print(dict)      ## {'a':1, 'c':3}

Dosyalar

Open() işlevi açılır ve bir dosyayı her zamanki gibi okumak veya yazmak için kullanılabilecek bir dosya herkese açık kullanıcı adı döndürür. f = open('name', 'r') kodu, dosyayı okuma işlemleri için hazır şekilde f değişkeninde açar ve işlem tamamlandığında f.close() işlevini kullanır. Yazma için "r" yerine "w", ekleme için "a" kullanın. Standart for döngüsü, metin dosyalarında çalışır ve dosyanın satırlarını iteratif olarak işler (bu, yalnızca metin dosyalarında çalışır, ikili dosyalarda çalışmaz). For döngüsü tekniği, bir metin dosyasındaki tüm satırlara bakmanın basit ve etkili bir yoludur:

  # Echo the contents of a text file
  f = open('foo.txt', 'rt', encoding='utf-8')
  for line in f:   ## iterates over the lines of the file
    print(line, end='')    ## end='' so print does not add an end-of-line char
                           ## since 'line' already includes the end-of-line.
  f.close()

Her satır teker teker okumak, tüm dosyanın tek seferde belleğe sığdırılmasına gerek olmadığı güzel kalitededir. f.readlines() yöntemi, tüm dosyayı belleğe okur ve içeriğini satırların bir listesi olarak döndürür. f.read() yöntemi, tüm dosyayı tek bir dizeye okur. Bu, daha sonra göreceğimiz normal ifadeler gibi metinlerle aynı anda ilgilenmek için pratik bir yol olabilir.

Verileri açık bir çıkış dosyasına yazmanın en kolay yolu f.write(string) yöntemidir. Dilerseniz "print"i açık bir dosyayla da kullanabilirsiniz (ör. "print(dize, dosya=f)").

Dosyalar Unicode

Unicode kodlamalı dosyaları okumak ve yazmak için "t" modunu kullanın ve kodlamayı açıkça belirtin:


with open('foo.txt', 'rt', encoding='utf-8') as f:
  for line in f:
    # here line is a *unicode* string

with open('write_test', encoding='utf-8', mode='wt') as f:
    f.write('\u20ACunicode\u20AC\n') #  €unicode€
    # AKA print('\u20ACunicode\u20AC', file=f)  ## which auto-adds end='\n'

Artımlı Geliştirme Alıştırması

Bir Python programı oluştururken her şeyi tek adımda yazmayın. Bunun yerine, yalnızca ilk hedefi belirtin (ör. "ilk adım kelime listesini ayıklamaktır"). Bu aşamaya ulaşacak kodu yazın ve veri yapılarınızı bu noktada yazdırın. Ardından, programın henüz tamamlanmamış bölümlerine geçmemesi için sys.exit(0) yapabilirsiniz. Dönüm noktası kodu çalışmaya başladıktan sonra bir sonraki dönüm noktası kodu üzerinde çalışabilirsiniz. Bir durumdaki değişkenlerinizin çıktısına bakabilmek, bir sonraki duruma geçmek için bu değişkenleri nasıl dönüştürmeniz gerektiğini düşünmenize yardımcı olabilir. Python bu kalıpta çok hızlıdır. Küçük bir değişiklik yapıp programı çalıştırarak nasıl çalıştığını görebilirsiniz. Programınızı küçük adımlarla oluşturmak için bu hızlı geri dönüşten yararlanın.

Alıştırma: wordcount.py

Tüm temel Python materyallerini (dize, liste, sözlük, tuple, dosya) birleştiren Temel Alıştırmalar'daki özet wordcount.py alıştırmasını deneyin.