Planladığım bir nesneyi oluşturmak için bu dosyalardan vişne almak için bir dizi açılmış dosyayı ayrıştırmak üzere bir dizi jeneratör oluşturmak üzere Python 3.5 kullanıyorum daha sonra ihraç etmek. Orijinal olarak her dosyanın bütünüyle ayrışıyor ve herhangi bir analiz yapmadan önce bir sözlük nesnesi listesi oluşturuyordum, ancak bu işlem bazen 30 saniyeye kadar çıkabiliyordu ve sadece her bir satırın her satırında yalnızca bir kez çalışmam gerektiğinden Jeneratör kullanmak için harika bir fırsat. Bununla birlikte, kavramsal olarak bir şeyleri jeneratörlerle ve belki de bir jeneratör içindeki nesnelerin mutabilitesiyle özlediğimi hissediyorum.Python Generator İfadelerinin Muhtemelen Liste ve Sözlük Anlaşılırlığının Mutability: İç içe Sözlük Sözlük Tuhaflık
parsers = {}
# iterate over files in the file_name file to get their attributes
for dataset, data_file in files.items():
# Store each dataset as a list of dictionaries with keys that
# correspond to the attributes of that dataset
parsers[dataset] = [{attributes[dataset][i]: value.strip('~')
for i, value in enumerate(line.strip().split('^'))}
for line
in data_file]
Ve arayarak listesine erişebilir: şu şekildedir: sözlükleri bir listesini yapar
Benim orijinal kod gider
>>>parsers['definitions']
Ve sözlükler bir listesini dönen beklendiği gibi çalışır . Ancak bu listeyi bir jeneratöre dönüştürdüğümde, her çeşit gariplik olur.
parsers = {}
# iterate over files in the file_name file to get their attributes
for dataset, data_file in files.items():
# Store each dataset as a list of dictionaries with keys that
# correspond to the attributes of that dataset
parsers[dataset] = ({attributes[dataset][i]: value.strip('~')
for i, value in enumerate(line.strip().split('^'))}
for line
in data_file)
Ve kullanarak çağrı:
>>> next(parsers['definitions'])
Bu kod çalıştırma aralığı hata bir dizin döndürür.
İki kod bölümü arasında görebildiğim en önemli fark, liste anlaması sürümünde, python'un listeyi dosyadan oluşturması ve anlama değişkenlerini daha sonra kullanmak üzere saklamak zorunda kalmadan devam etmesidir. Tersine, jeneratör ifadesinde, jeneratörü içinde tanımlanmış olan değişkenler, jeneratörün her bir sonraki çağrısını kodumda daha sonra etkiledikleri için, jeneratörle birlikte depolanması gerekir. Jeneratörün içindeki değişkenlerin belki de kodumun oluşturduğu diğer jeneratörler ile bir isim alanını paylaştığını düşünüyorum ve bu nedenle her jeneratörün en son hangi jenerasyon ifadesinin çalıştırıldığına bağlı olarak değişken davranışı vardır ve bu nedenle değişkenlerin değerlerini en son olarak ayarlar.
Bu sorunun nedeni ile ilgili herhangi bir düşünceyi takdir ediyorum!
Tam izini kaydeder misiniz? Bu yardımcı olabilir. . . – mgilson