Python Dict ve Dosyası

Dict Karma Tablosu

Python'un verimli anahtar/değer karma tablo yapısına "dikt" adı verilir. Bir diktenin içeriği, süslü ayraçlar { } içinde bir anahtar:değer çifti dizisi olarak yazılabilir; ör. dict = {key1:value1, key2:value2, ... }. "Boş dikit" yalnızca boş bir çift küme parantezi {} şeklindedir.

Bir diktedeki bir değer aranırken veya ayarlandığında köşeli parantez kullanılır; ör. dikte['foo'], "foo" anahtarının altındaki değeri arar. Dizeler, sayılar ve tup'lar anahtar olarak çalışır ve tüm türler bir değer olabilir. Diğer türler, anahtar olarak düzgün şekilde çalışabilir veya çalışmayabilir (dizeler ve kümeler sabit olduğundan düzgün çalışır). Diktte olmayan bir değerin aranması bir KeyError hatasına neden olur. Anahtarın dizede olup olmadığını kontrol etmek için "in" komutunu veya değeri döndüren dict.get(key) öğesini ya da anahtar yoksa (veya get(key, not-found), bulunamadı durumunda hangi değerin döndürüleceğini belirtmenize izin veriyorsa None öğesini kullanın.

  ## 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' 'g' tuşlarıyla dikte

Sözlükte bir "for" döngüsü, varsayılan olarak tuşlarının üzerinde yinelenir. Anahtarlar rastgele sırada gösterilecektir. dict.keys() ve dict.values() yöntemleri, anahtarların veya değerlerin listelerini açık bir şekilde döndürür. Ayrıca, (anahtar, değer) gruplarının listesini döndüren bir items() öğesi de vardır. Bu, sözlükteki tüm anahtar/değer verilerini incelemenin en etkili yoludur. Bu listelerin tümü, Sort() işlevine geçirilebilir.

  ## 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 bakıldığında, sözlük en iyi araçlardan biridir ve verileri düzenlemenin kolay bir yolu olarak kullanabileceğiniz şekilde kullanmalısınız. Örneğin, her satırın bir IP adresiyle başladığı bir günlük dosyasını okuyabilir, veri olarak IP adresini ve değer olarak göründüğü satırların listesini kullanarak verileri bir dizede depolayabilirsiniz. Dosyanın tamamını okuduktan sonra, herhangi bir IP adresini arayıp satır listesini anında görebilirsiniz. Sözlük, dağınık verileri alıp tutarlı hale getirir.

Dik Biçimlendirme

% operatörü, bir diktedeki değerleri ada göre bir dizeyle değiştirmek için kolayca çalışı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)

Del

"del" operatörü silme işlemlerini gerçekleştirir. En basit senaryoda, söz konusu değişken henüz tanımlanmamış gibi bir değişkenin tanımını kaldırabilir. Del, listenin bir bölümünü silmek ve bir sözlükten 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}

Files

Open() işlevi, bir dosyayı normal şekilde okumak veya yazmak için kullanılabilecek bir dosya tanıtıcısını açar ve döndürür. f = Open('name', 'r') kodu dosyayı f değişkeninde, okuma işlemlerine hazır bir şekilde açar ve tamamlandığında f.close() değerini kullanır. "r" yerine, yazma için "w" ve ekleme için "a" kullanın. For döngüsü, metin dosyalarında çalışır, dosyanın satırları arasında yineleme yapılır (bu yalnızca metin dosyaları için geçerlidir, ikili dosyalar için geçerli değildir). 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 defasında bir satır okumak, tüm dosyanın aynı anda belleğe sığmamasına gerek olmayan güzel bir kaliteye sahiptir. 10 gigabaytlık bir dosyadaki her satıra 10 gigabayt bellek kullanmadan bakmak isterseniz kullanışlıdır. f.readlines() yöntemi, dosyanın tamamını belleğe okur ve içeriğini satırlarından oluşan bir liste olarak döndürür. f.read() yöntemi, dosyanın tamamını tek bir dizeye dönüştürür. Bu yöntem, daha sonra göreceğimiz normal ifadeler gibi, metinle tek seferde ilgilenmek için kullanışlı bir yöntemdir.

Yazma için, f.write(string) yöntemi, açık bir çıkış dosyasına veri yazmanın en kolay yoludur. İsterseniz "yazdır" komutunu "print(dize, dosya=f)" gibi bir açık dosyayla da kullanabilirsiniz.

Dosyalar Unicode

Unicode olarak kodlanmış dosyaları okumak ve yazmak için "t" modunu kullanın ve açık bir şekilde kodlama 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'

Egzersiz Artımlı Gelişimi

Bir Python programı oluşturun, her şeyi tek adımda yazmayın. Bunun yerine sadece ilk ara hedefi belirleyin. Örneğin, "ilk adım kelime listesini çıkarmaktır." Bu ara hedefe ulaşmak için kodu yazıp o noktada veri yapılarınızı yazdırın. Daha sonra, programın tamamlanmamış kısımlarıyla karşılaşmaması için bir sys.exit(0) işlemi yapabilirsiniz. Ara hedef kodu çalışmaya başladıktan sonra, bir sonraki ara hedef için kod üzerinde çalışabilirsiniz. Değişkenlerinizin çıktısını bir noktada görerek diğer duruma geçmek için o değişkenleri nasıl dönüştürmeniz gerektiğini düşünebilirsiniz. Python bu kalıbı çok hızlıdır. Bu sayede işleyiş şeklini görmek için küçük bir değişiklik yapıp programı çalıştırabilirsiniz. Bu hızlı geri dönüş süresinden yararlanarak programınızı küçük adımlarla oluşturun.

Alıştırma: wordcount.py

Tüm temel Python materyallerini (dizeler, listeler, diktler, tuple'lar, dosyalar) birleştirerek Temel Alıştırmalar'daki özet wordcount.py alıştırmasını deneyin.