الاختصارات والدوال المضمّنة
اكتب حلولًا موجزة باستخدام اختصارات list وdict وset، وmap وfilter وzip وenumerate وsorted مع دوال key
الاختصارات والدوال المضمّنة درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
استيعاب القوائم: تصفية موجزة
يحوّل استيعاب القوائم حلقة for مع append إلى سطر واحد واضح: [expr for item in iterable if condition]. وهو أسرع قليلًا، كما يدل على إتقان Python.
# Traditional loop
squares = []
for n in range(1, 6):
squares.append(n * n)
print(squares) # [1, 4, 9, 16, 25]
# List comprehension
squares = [n * n for n in range(1, 6)]
print(squares) # [1, 4, 9, 16, 25]
# With filter
evens = [n for n in range(10) if n % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]الاستيعاب المتداخل لشبكات ثنائية الأبعاد
ينشئ الاستيعاب المتداخل شبكات ثنائية الأبعاد، وهي الطريقة القياسية لإعداد جدول DP. تجنبوا [[0]*C]*R؛ إذ تشارك جميع الصفوف القائمة الداخلية نفسها. يوضّح الكود طريقة الإصلاح.
# WRONG: all rows are the same object!
bad = [[0] * 3] * 3
bad[0][0] = 9
print(bad) # [[9,0,0],[9,0,0],[9,0,0]] oops!
# CORRECT: each row is a separate list
good = [[0] * 3 for _ in range(3)]
good[0][0] = 9
print(good) # [[9,0,0],[0,0,0],[0,0,0]]استيعاب القواميس والمجموعات
يستخدم استيعاب القواميس والمجموعات الأقواس المعقوفة: {k: v for ...} للقاموس، و{expr for ...} للمجموعة. ويمكن لكليهما التصفية، لذا تستطيعون التحويل أو إزالة التكرارات في سطر واحد.
# Dict comprehension: square lookup
sq_map = {n: n**2 for n in range(1, 6)}
print(sq_map) # {1:1, 2:4, 3:9, 4:16, 5:25}
# Set comprehension: unique lengths
words = ['cat', 'dog', 'elephant', 'ant']
unique_lengths = {len(w) for w in words}
print(unique_lengths) # {3, 8} (order varies)تعبيرات المولّدات: كفاءة في استخدام الذاكرة
أحيطوا استيعابًا بالقوسين () لتحصلوا على مولّد يُنتج القيم واحدة تلو الأخرى، مما يوفر الذاكرة. مرّروه مباشرةً إلى sum أو max أو أي دالة أخرى عند التعامل مع تسلسلات ضخمة.
# List comprehension builds all values at once
total = sum([n**2 for n in range(1_000_000)])
# Generator yields one at a time — lower memory
total = sum(n**2 for n in range(1_000_000))
print(total) # 333332833333500000
# any/all with generators short-circuit early
nums = [4, 6, 8, 3, 10]
has_odd = any(n % 2 == 1 for n in nums)
print(has_odd) # True (stops at 3)map() وfilter(): الأسلوب الوظيفي
تطبّق map دالة على كل عنصر، بينما تحتفظ filter بالعناصر التي تجتاز اختبارًا. وكلتاهما كسولتان، لذا أحِطوهما بـ list() لرؤية النتائج. وغالبًا ما تكون الاستيعابات أوضح.
nums = [1, 2, 3, 4, 5]
# map: apply function to each element
doubled = list(map(lambda n: n * 2, nums))
print(doubled) # [2, 4, 6, 8, 10]
# filter: keep elements passing predicate
evens = list(filter(lambda n: n % 2 == 0, nums))
print(evens) # [2, 4]
# Equivalent comprehensions (often preferred)
doubled = [n * 2 for n in nums]
evens = [n for n in nums if n % 2 == 0]zip(): إقران التسلسلات
تقرن zip تسلسلين وتتوقف عند التسلسل الأقصر، وهي الطريقة الواضحة للمرور على قائمتين في الوقت نفسه. أما الحيلة zip(*matrix) فتنقل صفوف قائمة ثنائية الأبعاد إلى أعمدتها. راجعوا الكود.
keys = ['a', 'b', 'c']
values = [1, 2, 3]
pairs = list(zip(keys, values))
print(pairs) # [('a',1), ('b',2), ('c',3)]
# Build dict from two lists
d = dict(zip(keys, values))
print(d) # {'a':1, 'b':2, 'c':3}
# Transpose a matrix
matrix = [[1,2,3],[4,5,6],[7,8,9]]
transposed = [list(row) for row in zip(*matrix)]
print(transposed) # [[1,4,7],[2,5,8],[3,6,9]]enumerate(): الفهرس مع القيمة
تمنحكم enumerate الزوج (index, value) أثناء المرور، وهي أوضح من range(len(lst)) وتجنّب أخطاء الواحد الزائد. استخدموا الخيار start لبدء العد من 1.
fruits = ['apple', 'banana', 'cherry']
# Instead of: for i in range(len(fruits)):
for i, fruit in enumerate(fruits):
print(i, fruit)
# 0 apple / 1 banana / 2 cherry
# Start from 1
for i, fruit in enumerate(fruits, 1):
print(f'{i}. {fruit}')
# 1. apple / 2. banana / 3. cherrysorted() مع دوال key
تُرجع sorted قائمة جديدة مرتبة، وتقبل دالة key لترتيب مخصص. يمكنكم الفرز حسب الطول أو حسب حقل في tuple أو بطريقة غير حساسة لحالة الأحرف. يوضّح الكود عمليات الفرز متعددة المفاتيح.
# Sort by second element of tuple
intervals = [(1,3),(2,1),(0,5)]
print(sorted(intervals, key=lambda x: x[1]))
# [(2,1),(1,3),(0,5)]
# Sort strings case-insensitively
words = ['Banana', 'apple', 'Cherry']
print(sorted(words, key=str.lower))
# ['apple', 'Banana', 'Cherry']
# Sort by multiple keys: first by length, then alphabetically
words = ['fig', 'apple', 'ant', 'kiwi']
print(sorted(words, key=lambda w: (len(w), w)))
# ['ant', 'fig', 'kiwi', 'apple']min() وmax() مع Key
تقبل min وmax أيضًا key، لذا يمكنكم الحصول على العنصر ذي القيمة المعيّنة الأصغر أو الأكبر في استدعاء واحد، مثل الحصول على أطول كلمة. راجعوا الكود.
words = ['banana', 'fig', 'strawberry', 'kiwi']
longest = max(words, key=len)
print(longest) # strawberry
shortest = min(words, key=len)
print(shortest) # fig
# Find interval with earliest end
intervals = [(2,6),(1,3),(4,5)]
earlist_end = min(intervals, key=lambda x: x[1])
print(earlist_end) # (1, 3)any() وall() لفحوص التوقف المبكر
تتوقف any عند أول عنصر صادق، بينما تتوقف all عند أول عنصر كاذب. وتستخدم كلتاهما التقييم قصير الدارة، لذا تختبران الشروط بسرعة وبشكل كسول عند إقرانهما بمولّد.
nums = [2, 4, 6, 7, 8]
all_even = all(n % 2 == 0 for n in nums)
print(all_even) # False (7 is odd)
has_large = any(n > 5 for n in nums)
print(has_large) # True (6 qualifies, stops there)
# Practical: check if sudoku row has no duplicates
row = [1, 2, 3, 4, 5, 6, 7, 8, 9]
valid = all(1 <= n <= 9 for n in row) and len(set(row)) == 9
print(valid) # Truesum() وabs() وdivmod()
تظهر ثلاث دوال مساعدة رياضية في كل مكان: sum وabs وdivmod. تُرجع divmod(a, b) حاصل القسمة والباقي معًا، وهي مثالية لاستخراج الأرقام.
# sum with generator
print(sum(n**2 for n in range(1, 6))) # 55
# abs for distance problems
print(abs(-7)) # 7
# divmod for digit extraction
num = 1234
digits = []
while num:
num, d = divmod(num, 10)
digits.append(d)
digits.reverse()
print(digits) # [1, 2, 3, 4]تحقق سريع
تحقق سريع — لنرَ مدى استيعابكم للاستيعابات والدوال المضمّنة. سؤال واحد فقط، وأنتم قادرون على ذلك. ✅
مراجعة الدرس
مراجعة: تحوّل الاستيعابات الحلقات إلى أسطر واحدة، وتقبل الدوال المضمّنة مثل zip وsorted دوال key، بينما توفر المولّدات الذاكرة عند تنفيذ عمل يمر على البيانات مرة واحدة.
الأسئلة الشائعة
هل درس «الاختصارات والدوال المضمّنة» مجاني؟
نعم — نص درس «الاختصارات والدوال المضمّنة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «الاختصارات والدوال المضمّنة»؟
اكتب حلولًا موجزة باستخدام اختصارات list وdict وset، وmap وfilter وzip وenumerate وsorted مع دوال key تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟
لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «الاختصارات والدوال المضمّنة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟
نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- القوائم والصفوف والتقطيع
- القواميس والمجموعات في Python
- الاختصارات والدوال المضمّنة
- الدوال والإغلاقات وLambda