من حلقة إلى تعبير واحد
تبدأ حلقة شائعة جدًا بقائمة فارغة وتُضيف نتيجة لكل عنصر. تقول اشتقاق القائمة (list comprehension) الشيء نفسه في تعبير واحد بين أقواس مربعة: [ما_يُبنى for item in collection]. اقرأه من اليسار إلى اليمين: «ابنِ هذا، لكل عنصر في ذاك». وهو أقصر ويُظهر بنظرة واحدة أن الكل قائمة جديدة.
prices = [184.0, 185.0, 183.0]
# The loop way
notionals = []
for price in prices:
notionals.append(price * 100)
print(notionals) # [18400.0, 18500.0, 18300.0]
# The comprehension way: the same list in one line
notionals = [price * 100 for price in prices]
print(notionals) # [18400.0, 18500.0, 18300.0]الاحتفاظ ببعض العناصر فقط: if
أضف if condition في النهاية للاحتفاظ بالعناصر التي تجتاز اختبارًا فقط. هكذا تُرشِّح: العوائد الموجبة، الأوامر فوق حجم معيّن، الرموز المطابقة. العناصر التي لا تجتاز الاختبار تُحذف ببساطة ويُحفظ ترتيب البقية.
# Keep only the items that pass a test
returns = [0.01, -0.02, 0.005, -0.001, 0.03]
gains = [r for r in returns if r > 0]
print(gains) # [0.01, 0.005, 0.03]المواضع والأزواج
يعمل جزء for كحلقة عادية: يمكنه المرور على range(...) لاستخدام المواضع، وتسمية نصفي الزوج (for symbol, price in quotes). استخدم المواضع عندما تعتمد كل نتيجة على جار، كعائد من السعر السابق؛ واستخدم الأزواج عندما يحمل كل عنصر عدة حقول.
# Simple returns from a price series, using positions
prices = [100.0, 102.0, 101.0]
returns = [prices[i] / prices[i - 1] - 1 for i in range(1, len(prices))]
print([round(r, 4) for r in returns]) # [0.02, -0.0098]
# Pairs can be unpacked, and the result can be transformed
quotes = [("aapl", 184.5), ("msft", 410.2), ("goog", 171.0)]
above = [symbol.upper() for symbol, price in quotes if price > 180]
print(above) # ['AAPL', 'MSFT']if/else تأتي في المقدمة
يحذف if الأخير عناصر. وإذا أردت تغيير كل عنصر بحسب شرط فاستخدم التعبير الشرطي a if condition else b كجزء أول. والخلط بين الاثنين خطأ شائع: if وحدها تأتي بعد for، أما if ... else فتأتي قبلها.
# if/else changes each item; a plain if (at the end) drops items
returns = [0.01, -0.02, 0.005, -0.001, 0.03]
signals = ["long" if r > 0 else "flat" for r in returns]
print(signals) # ['long', 'flat', 'long', 'flat', 'long']for عادية. وإذا طال اشتقاق أو تداخل فقسّمه إلى حلقة أو دالة مساعدة: الوضوح أفضل من الذكاء.[expression for item in items]: نتيجة لكل عنصر.... if conditionفي النهاية: الاحتفاظ ببعض العناصر فقط.a if condition else bفي المقدمة: تغيير كل عنصر.
التالي: القوائم، المجموعة التي كانت هذه الحلقات والاشتقاقات تعمل عليها: الفهرسة والتقطيع والإضافة والحذف والترتيب.
المختبر: ما الذي يُقيَّم
- احسب قيمة كل صفقة في تعبير واحد باستخدام
notionals25 نقطة - حوّل الأسعار إلى عوائد باستخدام
simple_returns25 نقطة - احتفظ بالمكاسب فقط باستخدام
positive_returns25 نقطة - رشِّح الرموز ونظّفها معًا باستخدام
symbols_above25 نقطة