النظير في بيثون وجافا سكريبت. الجزء الثاني

نواصل نشر ترجمة سلسلة من المقالات حول أوجه التشابه والاختلاف بين اللغتين.


سنتحدث اليوم عن تسلسل القواميس و JSON والنظامي والأخطاء والاستثناءات.


مقالات أخرى في هذه السلسلة:


  1. الجزء الأول هو تحويل النوع ، عامل التشغيل الثلاثي ، الوصول إلى خاصية من خلال اسم الخاصية ، القواميس ، القوائم ، السلاسل ، سلسلة متسلسلة.
  2. هذه المقالة
  3. الجزء الثالث : Python و JS الحديث: أنماط السلسلة (سلاسل f) ، تفريغ القوائم ، وظائف لامدا ، قائمة التكرار ، المولدات ، المجموعات.
  4. الجزء الرابع هو الحجج الوظيفية ، وخلق والعمل مع الطبقات ، والميراث ، و gitter وخصائص الطبقة.

جسون


عند العمل مع العديد من واجهات برمجة التطبيقات ، من السهل إجراء تسلسل للكائنات في كائنات JSON لسهولة النقل والتحليل اللاحق.


يحتوي Python على وحدة json قياسية:


import json json_data = json.dumps(dictionary, indent=4) dictionary = json.loads(json_data) 

هنا نقوم بتنسيق JSON مع وضع مسافة بادئة لـ 4 مسافات.


في JS ، يوجد كائن JSON مع طرق لإنشاء سلاسل JSON وتحليلها:


 json_data = JSON.stringify(dictionary, null, 4); dictionary = JSON.parse(json_data); 

سلاسل التحليل مع النظامي


في المقالة الأخيرة ، قمنا بدمج عدة أسطر في سطر واحد. ولكن كيف يمكن تقسيم سلسلة طويلة واحدة إلى عدة ، خاصة إذا لم يكن الفاصل حرفًا واحدًا مثل الفاصلة ، ولكنه نطاق كامل من الخيارات المختلفة؟ هذا هو المكان الذي تأتي فيه التعبيرات العادية وأسلوب split() إلى الإنقاذ.


في بايثون ، تشير طريقة split() إلى نمط تعبير عادي. إليك كيفية تقسيم سلسلة نصية إلى جمل علامات ترقيم:


 import re #     "!?."         delimiter = re.compile(r'[!?\.]+\s*') text = "Hello!!! What's new? Follow me." sentences = delimiter.split(text) # sentences == ['Hello', "What's new", 'Follow me', ''] 

في JS ، تشير طريقة split() إلى السلاسل:


 //     "!?."         delimiter = /[!?\.]+\s*/; text = "Hello!!! What's new? Follow me."; sentences = text.split(delimiter) // sentences === ["Hello", "What's new", "Follow me", ""] 

البحث المنتظم حسب النمط


غالبًا ما تُستخدم التعبيرات العادية للتحقق من صحة البيانات من النماذج.
على سبيل المثال ، للتحقق من صحة عنوان البريد الإلكتروني الذي تم إدخاله ، يجب مقارنته بنمط التعبير العادي.


مؤلف الترجمة في الدورة

أن التحقق من العنوان مع النظامي هو مهمة غير تافهة وأكثر تعقيدًا قليلاً من الطريقة الواردة في هذه المقالة


في Python ، سيبدو شيئًا مثل هذا:


 import re # name, "@", and domain pattern = re.compile(r'([\w.+\-]+)@([\w\-]+\.[\w\-.]+)') match = pattern.match('hi@example.com') # match.group(0) == 'hi@example.com' # match.group(1) == 'hi' # match.group(2) == 'example.com' 

إذا كان قسم من النص يطابق قالبًا ، فإن استخدام طريقة group() يُرجع القسم بأكمله الذي يمكنك من خلاله تحديد مجموعات فردية محددة في القالب.


0 - تطابق الخط بالكامل (الفرعي) ، 1 - المجموعة الأولى ، 2 - الثانية ، إلخ.


إذا لم يتم العثور على تطابقات ، فسيتم إرجاع كائن من النوع بلا.


في JS ، يوجد match() أسلوب السلسلة match() يُرجع إما الجزء المتطابق من السلسلة أو قيمة null .


 // name, "@", and domain pattern = /([\w.+\-]+)@([\w\-]+\.[\w\-.]+)/; match = 'hi@example.com'.match(pattern); // match[0] === 'hi@example.com' // match[1] === 'hi' // match[2] === 'example.com' 

في JS ، يبدو الكائن المتطابق صفيفًا. العنصر ذو الفهرس [0] هو الصف (الفرعي) الذي يتطابق بالكامل ، والعنصر الأول هو المجموعة الأولى ، والثاني هو الثاني ، وما إلى ذلك. - كل ذلك وفقًا للمجموعات المحددة في النموذج.


في بعض الأحيان ، بالإضافة إلى البحث ، يلزم تحديد موضع العينة في النص. يمكن القيام بذلك باستخدام طريقة search() .
في Python ، تشير هذه الطريقة إلى التعبيرات العادية وترجع كائنًا مطابقًا. يحتوي هذا الكائن المطابق على طريقة start() التي ترجع بداية حدوث هذه السلسلة الفرعية في السطر الرئيسي:


 text = 'Say hi at hi@example.com' first_match = pattern.search(text) if first_match: start = first_match.start() # start == 10 

يحتوي أسلوب JS على search() أسلوب سلسلة search() بإرجاع فهرس بداية السلسلة الفرعية. أو -1 إذا لم يتم العثور على تطابقات.


 text = 'Say hi at hi@example.com'; first_match = text.search(pattern); if (first_match > -1) { start = first_match; // start === 10 } 

استبدل بالنمط باستخدام التعبيرات العادية


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


لدى Python طريقة نمط تعبير sub() لهذا:


 html = pattern.sub( r'<a href="mailto:\g<0>">\g<0></a>', 'Say hi at hi@example.com', ) # html == 'Say hi at <a href="mailto:hi@example.com">hi@example.com</a>' 

يمكن لمطوري JS استخدام طريقة السلسلة replace() :


 html = 'Say hi at hi@example.com'.replace( pattern, '<a href="mailto:$&">$&</a>', ); // html === 'Say hi at <a href="mailto:hi@example.com">hi@example.com</a>' 

في Python ، تتوفر المجموعات المطابقة مثل \g<0>, \g<1>, \g<2> ، إلخ.
في JS ، مثل $&, $1, $2 ، إلخ.


من الممكن أيضًا استبدال الجزء المطابق بوظيفة. هذه الوظائف مفيدة عند استبدال التفاف النص المصدر أو لحساب أو جمع أو الحصول على معلومات أخرى حول النص. على سبيل المثال ، عندما أستخدم استدعاء دالة عند الاستبدال ، يمكنني كتابة تمييز بناء جملة HTML.


دعنا نغير جميع عناوين البريد الإلكتروني في حروف كبيرة.


في Python ، تحصل وظيفة الاستبدال على الكائن المتطابق. نستخدم طريقة group () لتنفيذ إجراءات مع النص المطابق وإعادته كبديل:


 text = pattern.sub( lambda match: match.group(0).upper(), 'Say hi at hi@example.com', ) # text == 'Say hi at HI@EXAMPLE.COM' 

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


 text = 'Say hi at hi@example.com'.replace( pattern, function(match, p1, p2) { return match.toUpperCase(); } ); // text === 'Say hi at HI@EXAMPLE.COM' 

معالجة الخطأ


على عكس Python ، عادةً لا يتم استخدام JavaScript المستند إلى المستعرض الأمامي لكتابة / قراءة الملفات أو الوصول إلى قواعد البيانات. لذلك ، try..catch كتل try..catch نادرة جدًا في JS مقارنةً try..catch الكتل في Python.


ولكن ، على أي حال ، يمكن إجراء معالجة الأخطاء في برنامج نصي للمستخدم ، يتم استدعاؤه من وظيفة مكتبة ، ويتم اعتراضه في التعليمات البرمجية الرئيسية.


في مثال MyException التالي ، سنقوم بتحديد MyException ، MyException في دالة ، ونرى كيفية الإمساك به والتعامل معه في MyException :


 class MyException(Exception): def __init__(self, message): self.message = message def __str__(self): return self.message def proceed(): raise MyException('Error happened!') try: proceed() except MyException as err: print('Sorry! {}'.format(err)) finally: print('Finishing') 

يفعل كود JS التالي نفس الشيء - نحدد فئة MyException ، MyException في دالة ، try..catch..finally في محاولة .. try..catch..finally


 function MyException(message) { this.message = message; this.toString = function() { return this.message; } } function proceed() { throw new MyException('Error happened!'); } try { proceed(); } catch (err) { if (err instanceof MyException) { console.log('Sorry! ' + err); } } finally { console.log('Finishing'); } 

في كلتا اللغتين ، MyException فئة MyException على معلمة رسالة وأسلوب لتمثيل السلسلة اعتمادًا على قيمة message .


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


الاستنتاجات


  • التسلسل من / إلى JSON واضح إلى حد ما - ما هو في Python ، وما هو في JS.
  • Regulars هي أداة قوية لمعالجة الكلمات باللغتين.
  • يمكنك إجراء الاستبدالات باستخدام الوظائف.
  • بالنسبة للحالات الأكثر تعقيدًا ، يمكنك استخدام المكالمات والاعتراض ومعالجة الأخطاء.

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


في الجزء التالي ، سنتحدث عن أنماط النص وقوائم التفريغ ووظائف لامدا والتكرارات دون استخدام الفهارس والمولدات والمجموعات.

Source: https://habr.com/ru/post/ar417513/


All Articles