هذا هو الاختيار الحادي عشر لنصائح Python والبرمجة من خلاصتيpythonetc.
←
المجموعات السابقةالحرف
\
على سطر منتظم له معنى خاص.
\t
عبارة عن حرف علامة تبويب ،
\r
هو فاصل أسطر ، وهكذا.
لتعطيل هذا السلوك ، يمكنك استخدام سلاسل خام. ثم سوف يتحول
r'\t'
إلى مجرد شرطة مائلة للخلف و
t
.
من الواضح ، لا يمكنك استخدام
'
داخل
r'...'
. وعلى الرغم من إمكانية التحايل على هذا التقييد بـ
\
، إلا أن الخط
\
سيبقى:
>>> print(r'It\'s insane!') It\'s insane!
يمكن أن تحتوي مولدات القوائم على أكثر من زوج من
for
التعبيرات
if
:
In : [(x, y) for x in range(3) for y in range(3)] Out: [ (0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2) ] In : [ (x, y) for x in range(3) for y in range(3) if x != 0 if y != 0 ] Out: [(1, 1), (1, 2), (2, 1), (2, 2)]
بالإضافة إلى ذلك ، أي تعبير من الداخل
for
if
يمكن استخدام جميع المتغيرات المحددة مسبقًا:
In : [ (x, y) for x in range(3) for y in range(x + 2) if x != y ] Out: [ (0, 1), (1, 0), (1, 2), (2, 0), (2, 1), (2, 3) ]
يمكنك المزج
if
كنت ترغب في ذلك:
In : [ (x, y) for x in range(5) if x % 2 for y in range(x + 2) if x != y ] Out: [ (1, 0), (1, 2), (3, 0), (3, 1), (3, 2), (3, 4) ]
تتيح
sorted
وظيفة
sorted
تحديد طرق الفرز المخصصة. يتم ذلك باستخدام وسيطة
key
، التي تصف كيفية تحويل القيم الأصلية للمقارنة اللاحقة:
>>> x = [dict(name='Vadim', age=29), dict(name='Alex', age=4)] >>> sorted(x, key=lambda v: v['age']) [{'age': 4, 'name': 'Alex'}, {'age': 29, 'name': 'Vadim'}]
للأسف ، لا تدعم جميع المكتبات العاملة في المقارنة الوسيطة
key
. من تلك المشاع ، يمكن
heapq
(الدعم الجزئي)
heapq
(لا يوجد دعم).
هناك طريقتان للذهاب في هذا الموقف. يمكنك استخدام كائنات مخصصة تدعم المقارنة المناسبة:
>>> class User: ... def __init__(self, name, age): ... self.name = name ... self.age = age ... def __lt__(self, other): ... return self.age < other.age ... >>> x = [User('Vadim', 29), User('Alex', 4)] >>> [x.name for x in sorted(x)] ['Alex', 'Vadim']
ومع ذلك ، قد تحتاج إلى إنشاء إصدارات متعددة من هذه الفئات ، لأنه يمكن مقارنة الكائنات بطرق مختلفة. هذا يمكن أن يكون غير مريح ، لذلك هناك طريقة ثانية.
بدلاً من إنشاء كائنات مخصصة ، يمكنك استخدام tuples
(a, b)
، والتي تكون فيها القيمة للمقارنة (الأولوية) ، و
b
هي القيمة الأصلية:
>>> users = [dict(name='Vadim', age=29), dict(name='Alex', age=4)] >>> to_sort = [(u['age'], u) for u in users] >>> [x[1]['name'] for x in sorted(to_sort)] ['Alex', 'Vadim']
الفرق بين التعريف ومولد الوظيفة هو وجود الكلمة المفتاحية في نص الدالة:
In : def f(): ...: pass ...: In : def g(): ...: yield ...: In : type(f()) Out: NoneType In : type(g()) Out: generator
هذا يعني أنه لإنشاء مولد فارغ تحتاج إلى القيام بذلك:
In : def g(): ...: if False: ...: yield ...: In : list(g()) Out: []
ولكن نظرًا لأن
yield from
يدعم التكرارات البسيطة ، أي إصدار أجمل:
def g(): yield from []
في Python ، يمكنك إنشاء سلاسل من عوامل المقارنة:
>>> 0 < 1 < 2 True >>> 0 < 1 < 0 False
لا يجب أن تكون هذه السلاسل صحيحة رياضيا ، يمكنك المزج
>
و
<
:
>>> 0 < 1 > 2 False >>> 0 < 1 < 2 > 1 > 0 True
==
المشغلون مدعومون أيضًا.
in
و:
>>> [] is not 3 in [1, 2, 3] True
ينطبق كل عامل على اثنين من المعاملات المجاورة.
a OP1 b OP2 c
تعادل تمامًا
(a OP1 b) AND (b OP2 c)
. لم
c
تنفيذ مقارنة
a
و
c
:
class Spy: def __init__(self, x): self.x = x def __eq__(self, other): print(f'{self.x} == {other.x}') return self.x == other.x def __ne__(self, other): print(f'{self.x} != {other.x}') return self.x != other.x def __lt__(self, other): print(f'{self.x} < {other.x}') return self.x < other.x def __le__(self, other): print(f'{self.x} <= {other.x}') return self.x <= other.x def __gt__(self, other): print(f'{self.x} > {other.x}') return self.x > other.x def __ge__(self, other): print(f'{self.x} >= {other.x}') return self.x >= other.x s1 = Spy(1) s2 = Spy(2) s3 = Spy(3) print(s1 is s1 < s2 <= s3 == s3)
النتيجة:
1 < 2 2 <= 3 3 == 3 True