ما هي ميزات اللغة الهامة (التعابير) من Python للتعلم مبكرا على [مكررة

StackOverflow https://stackoverflow.com/questions/567251

  •  05-09-2019
  •  | 
  •  

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

سأكون مهتما بمعرفة ما يعتقده مجتمع StackoverFlow هي ميزات اللغة الهامة (التعابير) من Python. الميزات التي من شأنها تحديد مبرمج كمثمر.

Python (Pythonic) IDIOM - "تعبير الكود" هذا طبيعي أو خاصية باللغة بيثون.

بالإضافة إلى ذلك، ما هي التعابير التي يجب أن يتعلمها جميع مبرمجي Python في وقت مبكر؟

شكرا مقدما

متعلق ب:

هل كانت مفيدة؟

المحلول

بيثون هي لغة يمكن وصفها بأنها:

"القواعد التي يمكنك تناسبها في راحة يدك مع حقيبة ضخمة من السنانير".

تقريبا كل شيء في بيثون يتبع نفس المعايير البسيطة. كل شيء يمكن الوصول إليه وقابل للتغيير وتشغيله. هناك عدد قليل جدا من عناصر مستوى اللغة.

خذ على سبيل المثال، وظيفة Len (البيانات). len(data) يعمل ببساطة التحقق من data.__len__() الطريقة، ثم يدعوها وإرجاع القيمة. من ذلك الطريق، len() يمكن أن تعمل على أي كائن ينفذ __len__() طريقة.


ابدأ بالتعلم عن الأنواع والبناء الأساسي:

  1. اللغة الديناميكية مكتوبة بشدة
  2. Bool، Int، Float، String، قائمة، Tuple، Dict، مجموعة
  3. البيانات، المسافة البادئة، "كل شيء كائن"
  4. تعريفات الوظيفة الأساسية

ثم انتقل إلى التعلم عن كيفية عمل بيثون:

  1. الواردات والوحدات (بسيطة حقا)
  2. Python Path (SYS.PATH)
  3. ال dir() وظيفة
  4. __builtins__

بمجرد فهم تفهم لكيفية تناسب القطع معا، عد وتغطي بعض ميزات اللغة الأكثر تقدما:

  1. المحامون
  2. تجاوز مثل __len__ (هناك الكثير من هذه)
  3. قائمة الفصيلة والمولدات
  4. الفصول والأشياء (مرة أخرى، بسيطة حقا بمجرد معرفة قواعد زوجين)
  5. قواعد الميراث بيثون

وبمجرد أن يكون لديك مستوى راحة مع هذه العناصر (مع التركيز على ما يجعلها بيثونية)، انظر إلى عناصر أكثر تحديدا:

  1. خيوط في بيثون (لاحظ قفل المترجم العالمي)
  2. مديري السياق
  3. الوصول إلى قاعدة البيانات
  4. ملف io.
  5. مآخذ
  6. إلخ...

ولا تنس أبدا زن بيثون (بواسطة تيم بيترز)

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

نصائح أخرى

تغطي هذه الصفحة جميع التعابير الكبيرة بيثون: http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html.

المصطلح المهمة في بيثون هو docStrings.

كل كائن لديه سمة __doc__ التي يمكن استخدامها للحصول على مساعدة في هذا الكائن. يمكنك تعيين سمة __DOC__ على الوحدات والفئات والأساليب والوظائف مثل هذا:

# this is m.py
""" module docstring """

class c:
    """class docstring"""
    def m(self):
        """method docstring"""
        pass

def f(a):
    """function f docstring"""
    return

الآن، عند الكتابة help(m), help(m.f) وما إلى ذلك سوف يطبع docString كرسالة مساعدة.

نظرا لأنها جزء فقط من تأمل الكائن العادي، يمكن استخدام ذلك بواسطة أنظمة توليد المستندات مثل Epydoc أو استخدامها لأغراض الاختبار من قبل Unittest.

يمكن أيضا أن يتم وضعها على استخدام أكثر غير تقليدية (أي عدم الاصطلاحية) مثل النحو في DPARSER..

حيث يصبح أكثر إثارة للاهتمام بالنسبة لي هو أنه، على الرغم من Doc. هي سمة للقراءة فقط على معظم الكائنات، يمكنك استخدامها في أي مكان مثل هذا:

x = 5
""" pseudo docstring for x """

وأدوات الوثائق مثل epydoc. يمكن التقاطها وتنسيقها بشكل صحيح (بدلا من التعليق العادي يبقى داخل تنسيق الرمز.

الديكور الحصول على تصويتي. أين يمكنك كتابة شيء مثل:

def trace(num_args=0):
  def wrapper(func):
    def new_f(*a,**k):
      print_args = ''
      if num_args > 0:
        print_args = str.join(',', [str(x) for x in a[0:num_args]])
      print('entering %s(%s)' %(f.__name__,print_args))
      rc = f(*a,**k)
      if rc is not None:
        print('exiting %s(%s)=%s' %(f.__name__,str(rc)))
      else:
        print('exiting %s(%s)' %(f.__name__))
      return rc
    return new_f
  return wrapper

@trace(1)
def factorial(n):
  if n < 2:
    return 1
  return n * factorial(n-1)
factorial(5)

والحصول على الإخراج مثل:

entering factorial(5)
entering factorial(4)
entering factorial(3)
entering factorial(2)
entering factorial(1)
entering factorial(0)
exiting factorial(0)=1
exiting factorial(1)=1
exiting factorial(2)=2
exiting factorial(3)=6
exiting factorial(4)=24
exiting factorial(5)=120

كل شيء متصل باستخدام القائمة.
الفهم والمولدات، إلخ.

من وجهة نظر أكثر تقدما، فهم كيفية استخدام القواميس داخليا من قبل بيثون. الطبقات والوظائف والوحدات والمراجع هي كل خصائص فقط على القاموس. بمجرد فهم ذلك، من السهل فهم كيفية قرد التصحيح واستخدام الأساليب قوية __GetTTTR__، __setattr__، و __call__.

هنا واحد يمكن أن يساعد. ما الفرق بين:

[ foo(x) for x in range(0, 5) ][0]

و

( foo(x) for x in range(0, 5) ).next()

الإجابة: في المثال الثاني، يسمى FOO مرة واحدة فقط. قد يكون هذا مهما إذا كان لدى FOO تأثير جانبي، أو إذا كان قادرا على استخدام القائمة كبيرة.

شخصيا، أنا حقا أحب جملة Python تحديد كتل التعليمات البرمجية باستخدام المسافة الفارغة, ، وليس بالكلمات "تبدأ" و "النهاية" (كما هو الحال في Microsoft Basic و Visual Basic - لا أحب هذه) أو باستخدام الأقواس الأيسر والأيمن (كما في C، C ++، Java، Perl - i مثل هذه).

هذا مندهشني حقا لأنه على الرغم من أن المسافة البادئة كانت دائما مهمة للغاية بالنسبة لي، لم أقم ب "الضوضاء" كثيرا في الأمر - كنت تعيش معها، وهي تعتبر مهارة لتكون قادرة على قراءة الشعوب الأخرى "، السباغيتي" " الشفرة. علاوة على ذلك، لم أسمع مبرمج آخر لا أقترح إجراء المسافة البادئة جزءا من لغة. حتى بيثون! أتمنى فقط أنني أدركت هذه الفكرة أولا.

بالنسبة لي، سيكون الأمر كما لو أن بناء جملة Python يجبرك على كتابة رمز جيد وقابل للقراءة.

حسنا، سأخرج من صندوق الصابون. ؛-)

شيئان أصيب بي بحيث يكون بيثونيكيا بشكل خاص كتابة ديناميكية ونكهات النكهات المختلفة المستخدمة في بيثون، خاصة Tuples.

يمكن القول أن هوس قائمة بيثون LISP-Y، لكنها حصلت على نكهة فريدة من نوعها. خط مثل:

return HandEvaluator.StraightFlush, (PokerCard.longFaces[index + 4], 
  PokerCard.longSuits[flushSuit]), []

او حتى

return False, False, False

فقط يشبه بيثون ولا شيء آخر. (من الناحية الفنية، سترى الأخيرة في لوا كذلك، لكن لوا هي جميلة بيثونية بشكل عام.)

باستخدام بدائل السلسلة:

name = "Joe"
age = 12
print "My name is %s, I am %s" % (name, age)

عندما لا أكون برمجة في بيثون، هذا الاستخدام البسيط هو ما أفتقده أكثر.

شيء آخر لا يمكنك البدء فيه مبكرا بما فيه الكفاية هو اختبار ربما. هنا خاصة Doctests هي وسيلة رائعة لاختبار التعليمات البرمجية الخاصة بك عن طريق شرحها في نفس الوقت.

Doctests هي ملف نصي بسيط يحتوي على جلسة مترجم تفاعلية بالإضافة إلى نص مثل هذا:

Let's instantiate our class::

>>> a=Something(text="yes")
>>> a.text
yes

Now call this method and check the results::

>>> a.canify()
>>> a.text
yes, I can

إذا قام EGTOXT بإرجاع شيء مختلف، فسوف تفشل الاختبار.

يمكن أن يكون Doctests داخل DocStrings أو TextFiles مستقل ويتم تنفيذه باستخدام وحدة المستندات. وبعد بالطبع تتوفر أيضا اختبارات الوحدات الأكثر شهرة.

أعتقد أن البرامج التعليمية عبر الإنترنت والكتب تتحدث فقط عن القيام بالأشياء، ولا تفعل الأشياء بأفضل طريقة. جنبا إلى جنب مع بناء جملة Python وأعتقد أن السرعة في بعض الحالات مهمة.

يوفر Python طريقة للوظائف القياسية، في الواقع اثنين!

طريقة واحدة هي استخدام profile الوحدة، مثل ذلك:

import profile

def foo(x, y, z):
    return x**y % z # Just an example.

profile.run('foo(5, 6, 3)')

طريقة أخرى للقيام بذلك هي استخدام timeit الوحدة، مثل هذا:

import timeit

def foo(x, y, z):
    return x**y % z # Can also be 'pow(x, y, z)' which is way faster.

timeit.timeit('foo(5, 6, 3)', 'from __main__ import *', number = 100) 
# timeit.timeit(testcode, setupcode, number = number_of_iterations)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top