Python Dict ve Dosyası

Dikte Karma Tablosu

Python'un verimli anahtar/değer karma tablosu yapısına "dict" adı verilir. Bir dizenin içeriği süslü ayraçlar { } içinde bir dizi anahtar:değer çifti olarak yazılabilir, ör. dict = {anahtar1:değer1, anahtar2:değer2, ... }. "Boş metin" boş bir çift ayraçtan ibarettir {}.

Bir ifadede değer ararken veya ayarlarken köşeli parantez kullanılır, ör. dict['foo'], 'foo' anahtarının altındaki değere bakar. Dizeler, sayılar ve demetler anahtar olarak çalışır ve tüm türler değer olabilir. Diğer türler anahtar olarak doğru şekilde çalışabilir veya çalışmayabilir (dizeler ve delikler sabit oldukları için sorunsuz çalışır). Diktede olmayan bir değer arandığında KeyError hatası verilir. "in" komutunu kullanın. değerini kontrol edin.

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

Bir sözlükteki "for" döngüsü varsayılan olarak anahtarlarının üzerinde yinelenir. Anahtarlar rastgele bir sırada gösterilir. dict.keys() ve dict.values() yöntemleri, anahtar veya değerlerin listelerini açık bir şekilde döndürür. Ayrıca, sözlükteki tüm anahtar/değer 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 bakıldığında sözlük en iyi araçlarınızdan biridir. Söz konusu sözlüğü, verileri düzenlemenin kolay bir yolu olarak mümkün olduğunda kullanmanız gerekir. Örneğin, her satırın bir IP adresiyle başladığı bir günlük dosyası okuyabilir ve verileri, anahtar olarak IP adresini ve değer olarak göründüğü satırların listesini kullanarak bir Dikte depolayabilirsiniz. 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.

Dikte Biçimlendirmesi

% operatörü, değerleri bir diktten dizeye ada göre değiştirmek için uygundur:

  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şlemleri yapar. En basit senaryoda, değişken tanımlanmamış gibi o değişkenin tanımını kaldırabilir. Del, listenin ilgili bölümünü 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. "r" yerine "w" kullanın ve 'a' eklemek için kullanılır. For-loop, dosya satırlarında yineleme yapılan metin dosyalarında çalışır (bu yalnızca metin dosyaları için geçerlidir, ikili dosyalar için geçerli değildir). For-loop tekniği, bir metin dosyasındaki tüm satırları incelemenin 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.

Yazmada, açık bir çıkış dosyasına veri yazmanın en kolay yolu f.Write(string) yöntemidir. İsterseniz "print(string, file=f)" gibi bir açık dosya ile değiştirin.

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'

Egzersiz Artımlı Gelişim

Bir Python programı oluştururken her şeyi tek adımda yazmayın. Bunun yerine yalnızca ilk bir ara hedefi tanımlayın, örneğin, "ilk adım kelime listesini çıkarmaktır." Bu ara hedefe ulaşmak için kodu yazın ve bu noktada veri yapılarınızı yazdırın. Ardından, programın bitmemiş bölümlere ilerlememesi için bir sys.exit(0) işlemi yapabilirsiniz. Aşama kodu çalışmaya başladıktan sonra bir sonraki aşama için kod üzerinde çalışabilirsiniz. Değişkenlerinizin çıktısını belirli bir durumda görebilmek, 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 oldukça hızlıdır. Bu şekilde küçük bir değişiklik yapabilir ve nasıl çalıştığını görmek için programı çalıştırabilirsiniz. Bu hızlı teslimattan yararlanarak programınızı küçük adımlarla oluşturun.

Alıştırma: wordcount.py

Tüm temel Python materyallerini (dizeler, listeler, dikteler, delikler, dosyalar) birleştirmek için wordcount.py'daki özet wordcount.py egzersizini deneyin.