]> برنامه نویسی در پایتون - بخش 50
نمایش نتایج: از 1 به 1 از 1
لایک درختی2لایک
  • 2 پست توسط xubuntu4iran

موضوع: برنامه نویسی در پایتون - بخش 50

  1. Top | #1
    لطفا استاتوس خود را تنظیم کنید.
     

    عنوان کاربر
    مدیر سابق/کاربر ارزشمند
    تاریخ عضویت
    Dec 2013
    شماره عضویت
    75
    نوشته ها
    105
    OS/Browser

    Cool برنامه نویسی در پایتون - بخش 50

    برنامه‌نویسی در پایتون – بخش 50


    در این ماه، من می‌خواهم درباره‌ی یک جفت تابع کمتر شناخته شده، maketrans و translate صحبت کنم.


    ما با متد translate شروع خواهیم کرد. متد translate یک کپی از یک string برمی‌گرداند – درحالی که همه‌ی کاراکترها در جدول ترجمه جابجا می‌شوند، یا کاراکترهایی در پارامتر انتخابی deletechars دارند از string برداشته می‌شوند. در اینجا سینتاکس است:


    s = str.translate(table[,deletecharacters])



    پیش از این‌که به قسمت جدول متد برسیم، اجازه دهید به قسمت delete نگاه کنیم. اجازه دهید بگویم که شما string ‏”The time has come“ را دارید. و می‌خواهید همه‌ی حروف صدادار (برای برخی دلایل عجیب) را از آن string حذف کنید. شما می‌توانید آن را مثل این کدنویسی کنید:


    astr = “The time has come”

    astr.translate(None,’aeiou’)



    برخواهد گرداند:


    Th tm hs cm”



    توجه کنید که ما None را به عنوان جدول ترجمه شامل کردیم. درحالی که این بخش خوب است، آن بهتر می‌شود. یک تابع به نام maketrans وجود دارد. آن یک string ورودی و یک string خروجی را می‌گیرد و یک جدول برمی‌گرداند که به عنوان پارامتر اول در متد translate بکار برده می‌شود. اینجا (پایین) یک مثال بسیار ساده است.


    intable = ‘aeiou’

    outtable = ‘12345’
    trantable = maketrans(intable,outtable)
    astr = “The time has come”
    astr.translate(trantable)



    آن برمی‌گرداند:


    Th2 t3m2 h1s c4m2”



    اجازه دهید در آنچه این انجام می‌دهد نگاهی بیندازیم. ما داخل intable یک string صدادارها مثل قبل می‌گذاریم. داخل outtable اعداد 1,2,3,4,5 به عنوان string گذاشته می‌شوند. وقتی ما باعث فراخوانی به maketrans می‌شویم، trantable واقعی ما مثل زیر است (در پایین نشان داده شده. ” x\“ یعنی اینکه آن یک char هگزادسیمال است):




    \x54\x68\x65\x20\x74\x69\x6d\x65\x20\x68\x61\x73\x 20\x63\x6f\x6d\x65
    T h e t i m e h a s c o m e


    '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\ r\x0e\x0f\x10\x11\x12\x13\x14\
    x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./0123456789:;<=>?@ABC

    DEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`1bcd2fgh3jklmn4pqrst5vwxyz{|}~\x7f\x80\x81\x82\ x83
    \x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x 90\x91\x92\x93\x94\x95\x96\x97
    \x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\x a4\xa5\xa6\xa7\xa8\xa9\xaa\xab

    \xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\x b8\xb9\xba\xbb\xbc\xbd\xbe\xbf

    \xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\x cc\xcd\xce\xcf\xd0\xd1\xd2\xd3
    \xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\x e0\xe1\xe2\xe3\xe4\xe5\xe6\xe7
    \xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\x f4\xf5\xf6\xf7\xf8\xf9\xfa\xfb
    \xfc\xfd\xfe\xff'




    اگر شما به آن به دقت نگاه کنید، خواهید دید که حروف صدادار حرف کوچک با اعدادی که مشخص کردیم جایگزین می‌شوند:


    1bcd2fgh3jklmn4pqrst5vwxyz

    اگر حتی نزدیک‌تر نگاه کنید، خواهید دید که آنجا واقعا 256 ورودی وجود دارد که با "00x\” شروع می‌شود و با "ffx\” خاتمه می‌یابد. پس جدول شامل گروه 256 کاراکتر ascii ممکن کامل می‌شود. پس، وقتی متد translate جدول را می‌گیرد، آن هر کاراکتر را تکرار می‌کند، آن مقدار کاراکترها را در HEX می‌گیرد، و سپس آن مقدار را در جدول translate پیدا می‌کند و آن را در string خروجی تعویض می‌کند. نمایش HEX ‏String‏ astr اصلی ما ('The time has come') در بالا نشان داده شده است.
    پس حالا آن باید قابل درک باشد.
    حالا هدف این چیز کامل. به دوران مدرسه‌تان فکر کنید زمانی که درباره‌ی جولیوس سزار می‌آموختید. هر وقت او می‌خواست یک پیام یک موضوع محرمانه را بفرستد، از رمزی استفاده می‌کرد که همه‌ی حروف الفبا را سه کاراکتر به سمت راست شیفت می‌داد. پس، با بکار بردن الفبای انگلیسی امروزه:


    ABCDEFGHIJKLMNOPQRSTUVWXYZabc
    defghijklmnopqrstuvwxyz


    می‌شود:


    DEFGHIJKLMNOPQRSTUVWXYZabcdef
    ghijklmnopqrstuvwxyzABC


    درحالی که این با استاندارد بسیار آسان به‌نظر می‌رسد، وقتی من یک بچه مدرسه‌ای بودم، من همیشه این را بکار می‌بردم تا پیام‌هایی را به دیگری بفرستم. ما یک ایندکس متفاوت را داخل string بکار بردیم تا شروع به رمزگذاری string کنیم، منطق پشت آن یکسان بود.
    هیچکس نمی‌دانست این واقعا چطور برای جولیوس قدیمی به خوبی مؤثر بود. یکی ممکن است فکر کند که اگر کسانی این پیام را استراق سمع کنند، آنها فکر می‌کنند که آن در زبانی خارجی است. ما فقط می‌اندیشیم.


    ما می‌توانیم به‌آسانی متد translate و تابع کمک‌کننده‌ی maketrans را بکار بریم تا به ما اجازه دهند که با این سرگرم باشیم. اجازه دهید بگویم که ما می‌خواهیم یک برنامه‌ی ساده بسازیم که به ما اجازه دهد تا یک string ‏«متن ساده» را وارد کنیم و یک string رمزگذاری‌شده را با بکار بردن متد راست هم‌جانب که سزار بکار برد برگردانیم. برای سادگی جستجو، اجازه دهید تا تنها کاراکترهای بزرگ (پایین نشان داده شده) را بکار بریم.


    from string import maketrans

    #----------------------
    intab = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    outtab = "DEFGHIJKLMNOPQRSTUVWXYZABC"
    EncTrantab = maketrans(intab,outtab) #Encode
    DecTrantab = maketrans(outtab,intab) #Decode
    instring = raw_input("Enter the plaintext string -> ")
    EncString = instring.translate(EncTrantab)
    DecString = EncString.translate(DecTrantab)
    print("Encoded string is - %s" % EncString)
    print("Decoded string is - %s” % DecString)


    همه چیز در کد بالا تقریبا آنچه است که در بالا یا مقاله‌های قبلی پایتون پوشش دادیم، اما من آن را سریعا مرور خواهم کرد.


    دو خط اول stringهای in و out هستند. ما فقط کاراکترها را شیفت دادیم و اطراف را پوشاندیم تا string ‏out را ایجاد کنیم. دو خط بعدی یک جدول برای رمزگذاری و یکی برای رمزگشایی ایجاد می‌کند. خط 5 به کاربر اعلام می‌کند تا یک string برای رمزگذاری وارد کند. ما سپس آن string ‏(EncString) را در خط بعدی رمزگذاری می‌کنیم. برای رمزگشایی آن، ما به آسانی متد translate را بر روی string رمزگذاری شده بکار می‌بریم تا متن ساده را برگردانیم. سرانجام ما هر دو string را چاپ می‌کنیم. اینجا خروجی برنامه است.


    Enter the plaintext string → THE TIME HAS COME
    Encoded string is - WKH WLPH KDV FRPH
    Decoded string is - THE TIME HAS COME


    درست مانند قبل در مدرسه. اما اجازه دهید فقط یک کمی وارد جزئیات آن شویم برای اینکه آن را یک کمی قابل استفاده‌تر بسازیم. کد تقریبا مشابه با تعدادی استثنا است. نخست، ما یک space به انتهای intab string و در بین ”Z“ و ”A“ در outtab string اضافه کردیم. این کمک می‌کند تا کلمات واقعی را از اینکه در string رمزگذاری شده خیلی آشکار باشند محافظت کند. تغییر بعدی جایی است که ما می‌پرسیم که آیا کاربر می‌خواهد string را رمزگذاری یا رمزگشایی کند. سرانجام ما یک عبارت if اضافه کردیم تا آنچه را که می‌خواهیم چاپ کنیم کنترل کنیم (در پایین نشان داده شده ).


    from string import maketrans


    #Be sure to include the space character in the strings
    intab = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "
    outtab = "DEFGHIJKLMNOPQRSTUVWXYZ ABC"
    EncTrantab = maketrans(intab,outtab) #Encode
    DecTrantab = maketrans(outtab,intab) #Decode


    which = raw_input("Encode or Decode (E or D) -> ")
    instring = raw_input("Enter the string -> ")
    DecString = instring.translate(EncTrantab)

    EncString = instring.translate(DecTrantab)


    if which == "E":
    print("Encoded string is - %s" % EncString)
    else:
    print("Decoded string is - %s" % DecString)



    خروجی برنامه این است:


    Encode The output or Decode from (E the or program D) -> E
    Enter the string -> THE TIME HAS COME
    Encoded string is - WKHCWLPHCKDVCFRPH


    و برای تست پهلوی چیزها:


    Encode or Decode (E or D) → D
    Enter the string → WKHCWLPHCKDVCFRPH
    Decoded string is – THE TIME HAS COME


    خوب، امیدوارانه شما شروع می‌کنید تا درباره‌ی اینکه چگونه این اطلاعات جدید را در کدتان بکار برید ایده بگیرید.


    از گرگ والترز از http://www.fullcirclemagazine.org
    برگردان از xubuntu4iran از http://www.ubuntuforums.ir
    از بخش 80 مجله‌ی حلقه‌ی کامل
    تاریخ آخرین ویرایش: 01/12/2014
    ویرایش توسط xubuntu4iran : 01-13-2014 در ساعت 07:59 PM
    مهرداد خان و yaiiaj این پست را پسندیده‌اند! :)

اطلاعات موضوع

کاربرانی که در حال مشاهده این موضوع هستند

در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •