English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
أولاً، كيف يمكن تحقيق كائن قابلة للتكرار وكائن Iterator؟
الحالة الفعلية
يتطلب برنامج معين سحب معلومات رائحة المدينات من الإنترنت، ثم عرضها:
بكين: 15 ~ 20 تيانجين: 17 ~ 22 تشانغتشون: 12 ~ 18 ......
إذا تم سحب جميع معلومات الطقس لمدينات مختلفة مرة واحدة ثم عرضها، سيكون هناك تأخير كبير في عرض درجة حرارة المدينة الأولى، وسيتم إهدار مساحة التخزين، ونحن نرغب في استخدام استراتيجية الوصول عند الحاجة، ونقوم بتعليق جميع درجات الحرارة لمدينات مختلفة في كائن، يمكن استخدام جملة for لتكرارها، كيف يمكن حل هذا؟
الحلول
تحقيق كائن وحدة تحليل درجة الحرارة Iterator، باستخدام method next ليعود درجة الحرارة لمدينة واحدة، تحقيق كائن قابلة للتكرار Weatherlterable، باستخدام method iter__ ليعود كائن Iterator
استيراد مكتبة requests من مكتبات collections، استيراد Iterable و Iterator # وحدة تحليل درجة الحرارة class WeatherIterator(Iterator): def __init__(self, cities): self.cities = cities self.index = 0 def getWeather(self, city): r = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=' + city) data = r.json()['data']['forecast'][0] return '%s:%s , %s' % (city, data['low'], data['high']) def __next__(self): if self.index == len(self.cities): raise StopIteration city = self.cities[self.index] self.index += 1 return self.getWeather(city) # عنصر قابلة للتكرار class WeatherIterable(Iterable): def __init__(self, cities): self.cities = cities def __iter__(self): return WeatherIterator(self.cities) for x in WeatherIterable(['بكين', 'شانغهاي', 'كانغتشو', 'شانغشن'): print(x)
النتيجة تنفيذها كالتالي:
C:\Python\Python35\python.exe E:/python-intensive-training/s2.py بكين: درجة الحرارة المنخفضة 21℃ , درجة الحرارة العالية 30℃ شنغهاي: درجة الحرارة المنخفضة 23℃ , درجة الحرارة العالية 26℃ قوانغتشو: درجة الحرارة المنخفضة 26℃ , درجة الحرارة العالية 34℃ شينزن: درجة الحرارة المنخفضة 27℃ , درجة الحرارة العالية 33℃ Process finished with exit code 0
ثانيًا، كيف يمكن تنفيذ وظيفة المولد لتحقيق العنصر القابل للتسلسل؟
الحالة الفعلية
تحقيق فئة قابلة للتسلسل تستطيع إرجاع جميع الأعداد الأولية ضمن نطاق معين:
python pn = عدد اولات(1, 30) for k in pn: print(k) `` نتائج النص text 2 3 5 7 11 13 17 19 23 29 “`
الحلول
-تم تنفيذ دالة __iter__ للفئة كوظيفة مولدة، وتقوم بالتسلسل مرة واحدة عند إرجاع عدد أولي
class عدد اولات: def __init__(self, start, stop): self.start = start self.stop = stop def isPrimeNum(self, k): if k < 2: return False for i in range(2, k): if k % i == 0: return False return True def __iter__(self): for k in range(self.start, self.stop + 1): if self.isPrimeNum(k): yield k for x in عدد اولات(1, 20): print(x)
نتيجة التنفيذ
C:\Python\Python35\python.exe E:/python-intensive-training/s3.py 2 3 5 7 11 13 17 19 Process finished with exit code 0
ثالثًا، كيفية القيام بالاستدلال المعكوس وكيفية تنفيذه؟
الحالة الفعلية
تنفيذ مولد عدد عشري متتابع FloatRange (مثل rrange)، بناءً على نطاق المقدار (start, stop) وخطوة (step) يولد سلسلة من الأعداد العشر المتتابعة، مثل الت迭代 FloatRange(3.0,4.0,0.2) يمكن أن يولد سلسلة:
إيجابي: 3.0 > 3.2 > 3.4 > 3.6 > 3.8 > 4.0 معكوس: 4.0 > 3.8 > 3.6 > 3.4 > 3.2 > 3.0
الحلول
تنفيذ معيار الاستدلال المعكوس __reversed__، الذي يعود بمع迭代
فئة FloatRange: def __init__(self, start, stop, step=0.1): self.start = start self.stop = stop self.step = step def __iter__(self): t = self.start while t <= self.stop: yield t t += self.step def __reversed__(self): t = self.stop while t >= self.start: yield t t -= self.step print("الاستدلال الإيجابي-----") for n in FloatRange(1.0, 4.0, 0.5): print(n) print("الاستدلال المعكوس-----") for x in reversed(FloatRange(1.0, 4.0, 0.5)): print(x)
نتائج الإخراج
C:\Python\Python35\python.exe E:/python-intensive-training/s4.py التباعد المباشر----- 1.0 1.5 2.0 2.5 3.0 3.5 4.0 التباعد المعاكس----- 4.0 3.5 3.0 2.5 2.0 1.5 1.0 انتهت عملية مع رمز الخروج 0
كيفية القيام بعمل قطع على الم迭代ر؟
الحالة الفعلية
هناك ملف نصي معين، نريد أن نأخذ محتويات نطاق معين منه، مثل محتويات الأسطر بين 100 و300، هل يمكننا استخدام طريقة قطع القائمة مثل list slicing للحصول على مولد محتويات الملف بين الأسطر 100 و300؟
الحلول
استخدام مكتبة standard library الخاصة بـislice يمكنها العودة إلى مولد الجوازات المقطعة لجوايزة السلسلة
من مكتبة itertools import islice f = open('access.log') # # الـ500 سطر # islice(f, 500) # # من السطر الـ100 حتى لا شيء # islice(f, 100, None) for line in islice(f,100,300): print(line)
islice يتطلب كل مرة استدعاءً استهلاك الج�체 الم迭代 السابق
l = rang(20) t = iter(l) for x in islice(t, 5, 10): print(x) print('التحديث الثاني') for x in t: print(x)
نتائج الإخراج
C:\Python\Python35\python.exe E:/python-intensive-training/s5.py 5 6 7 8 9 المرة الثانية 10 11 12 13 14 15 16 17 18 19 Process finished with exit code 0
خامساً: كيفية تكرار عدة عناصر متكررة في جملة for؟
الحالة الفعلية
1. في فصل دراسي معين، يتم تخزين نتيجة اختبار نهاية السنة للطلاب في ثلاث قوائم، حيث يتم تكرار الثلاث قوائم في نفس الوقت، وتحديد مجموع النقاط لكل طالب (متوازي)
2. في سنة معينة، هناك أربعة فصول دراسية، ونتائج اختبار الإنجليزية في كل فصل دراسي يتم تخزينها في قوائم أربعة، حيث يتم تكرار كل قائمة، وإحصاء عدد الطلاب الذين حصلوا على أكثر من 90 نقطة في العام كله (متسلسل)
الحلول
التعامل المتوازي: استخدام دالة مدمجة zip، يمكنها دمج عدة عناصر متكررة، حيث يعود كل تحويل إلى مجموعة من التراكيب
from random import randint # نتيجة الأداء اللغوي الشينغهوا،# 40 شخص، النقاط بين 60-100 chinese = [randint(60, 100) for _ in range(40)] math = [randint(60, 100) for _ in range(40)] # الرياضيات english = [randint(60, 100) for _ in range(40)] # اللغة الإنجليزية total = [] for c, m, e in zip(chinese, math, english): total.append(c + m + e) print(total)
النتيجة تنفيذها كالتالي:
C:\Python\Python35\python.exe E:/python-intensive-training/s6.py [232, 234, 259, 248, 241, 236, 245, 253, 275, 238, 240, 239, 283, 256, 232, 224, 201, 255, 206, 239, 254, 216, 287, 268, 235, 223, 289, 221, 266, 222, 231, 240, 226, 235, 255, 232, 235, 250, 241, 225] Process finished with exit code 0
السلسلة: باستخدام مكتبة الوسائط القياسية من itertools.chain، يمكنها ربط عدة أوبجكتات قابلين للسلسلة
من random import randint من itertools import chain # إنشاء درجات عشوائية لأربعة فصول e1 = [randint(60, 100) for _ in range(40)] e2 = [randint(60, 100) for _ in range(42)] e3 = [randint(60, 100) for _ in range(45)] e4 = [randint(60, 100) for _ in range(50)] # عدد الطلاب الافتراضي = 1 count = 0 for s in chain(e1, e2, e3, e4): # إذا كانت الدرجات الحالية أكبر من 90، فأضف 1 إلى count if s > 90: count += 1 print(count)
نتائج الإخراج
C:\Python\Python35\python.exe E:/python-intensive-training/s6.py 48 Process finished with exit code 0
الخلاصة
هذا هو محتوى المقالة الكامل، آمل أن يكون هذا المقال قد ساعدكم في التعلم أو العمل، إذا كان لديكم أي أسئلة، يمكنكم ترك تعليقات للتفاعل.