تابع نقشه در پایتون

شکل ۱. محیط پایتون
شکل ۱. محیط پایتون
منتشر‌شده در: towardsdatascience به تاریخ ۱۸ آوریل ۲۰۲۱
لینک منبع: The Map Function in Python

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

مطالعه مقاله ۵ روش برای شخصی‌سازی رابط کاربری Streamlit توصیه می‌شود.

تابع نقشه map function

بیایید بگوییم که شما می‌خواهید با استفاده از لیستی که ما در حال حاضر داریم، یک لیست ایجاد کنید. به این معنا که می‌خواهیم از فهرستی که داریم استفاده کنیم، نوعی عملیات یا عملکرد را برای هر عنصر اعمال کنیم، و از آن خروجی‌ها برای ایجاد یک لیست جدید استفاده کنیم.

یک مثال دیگر این است که اگر ما یک لیست از اعداد داشته باشیم و می‌خواهیم یک لیست جدید ایجاد کنیم که شامل مربع‌های آن‌ها باشد. خب، یک راه برای انجام این کار تکرار کردن لیست اعداد با استفاده از یک حلقه و اعمال یک تابع است که مربع هر عدد یا عنصر را باز می‌گرداند. و همانطور که در لیست تکرار می‌کنیم، می‌توانیم مقادیر مربع را به لیست جدیدمان اضافه یا ضمیمه کنیم.

بیایید ببینیم چگونه این کار را در کد انجام می‌دهیم:

# defining a function that returns the square of a number
def squared(num):
return num**2
# original list
num_list = [1,2,3,4,5,6]
# list that will contain the squared numbers
num_list_squared = []
# using a for loop to iterate over our num_list and create a new list with the squared values
for num in num_list:
num_list_squared.append(squared(num))
print(num_list_squared) # output is [1,4,9,16,25,36]

ما یک لیست از اعداد داریم، num _ list، و می‌خواهیم یک لیست جدید، num _ list _ square، که شامل مربع‌های num _ list است، ایجاد کنیم. ما از یک حلقه برای حلقه کردن رویnum _ list استفاده می‌کنیم، و مربع هر عدد یاnum را به لیست مربع num _ list الحاق می‌کنیم.

یک راه دیگر برای انجام این کار استفاده از عملکرد ساخته‌شده پایتون به نام map است. تابع map دو آرگومان دارد: تابعی که می‌خواهیم به کار ببریم و شی یا توالی قابل تکرار که می‌خواهیم به آن اعمال کنیم (مانند یک لیست در این مورد). به عبارت دیگر، تابع نقشه این تابع را برای هر عنصر از توالی که وارد آن می‌شویم، به کار می‌برد.

نقشه (تابع، قابل تکرار) :‌map(function, iterable)

این تابع نقشه map object را باز می‌گرداند که تکراری است. اگر بخواهیم لیستی از این شی نقشه ایجاد کنیم، باید شی نقشه خود را به تابع لیست توکار به شرح زیر منتقل کنیم:

فهرست (نقشه (تابع، قابل تکرار) ) : list(map(function, iterable))

بنابراین اگر تکراری، فهرستی از عناصرx، y و z باشد، تابع نقشه موارد زیر را انجام می‌دهد:

list (map (f، [ x، y، z ]) [ f (x) ، f (y) ، f (z) ]

تابع f تابعی است که به عنوان یک آرگومان به تابع نقشه منتقل می‌شود. بیایید ببینیم که چگونه می‌توانیم کد بالا را با استفاده از تابع نقشه داخلی به انجام برسانیم:

# defining a function that returns the square of a number
def squared(num):
return num**2
# original list
num_list = [1,2,3,4,5,6]
# using the map function to create this new list of squared values
num_list_squared = list(map(squared, num_list))
print(num_list_squared) # output is [1,4,9,16,25,36]

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

num_list_squared = list(map(squared, num_list))

تابع نقشه اولین عنصر را ازnum _ list که یک ۱ است گرفت و آن را به عنوان آرگومان به تابع مربع انتقال داد (از زمانی که آن تابع را به عنوان آرگومان اول به تابع نقشه منتقل کردیم). تابع مربع سپس مربع ۱ را برگرداند، که ۱است، و به شی نقشه ما اضافه شد. سپس تابع نقشه عنصر دوم را از num _ list که ۲ است می‌گیرد و آن را به عنوان آرگومان به تابع مربعی منتقل می‌کند. تابع مربع، مربع ۲ را برگرداند، که ۴است، که سپس به شی نقشه (map object)‌ما اضافه شد. پس از اتمام کار از طریق عناصر num _ list و باقی مربع اعداد ما به شی نقشه اضافه شد، تابع لیست این شی نقشه را در یک لیست قرار می‌دهد، و آن لیست به مربع متغیر num _ list تخصیص داده می‌شود.

ممکن است به مطالعه مقاله ۱۰ منبع آزاد برای یادگیری پردازش زبان طبیعی علاقمند باشید.

استفاده از عبارات lambda

ما می‌توانیم با عبور از یک lambda expression به عنوان تابع خود، کد خود را حتی کوتاه تر کنیم:

# original list
num_list = [1,2,3,4,5,6]
# using the map function to create this new list of squared values
num_list_squared = list(map(lambda x:x**2, num_list))
print(num_list_squared) # output is [1,4,9,16,25,36]

توابعی که ما به نقشه منتقل می‌کنیم، می‌توانند به عنوان توابعی نیز در پایتون ساخته شوند. برای مثال، اگر ما یک لیست از رشته‌ها داشته باشیم و بخواهیم یک لیست جدید ایجاد کنیم که شامل طول این رشته‌ها باشد، می‌توانیم فقط از تابع داخلی len به صورت زیر عبور کنیم:

list(map(len, list_of_strings))

رمزنگاری: رمز سزار caesar cipher

بیایید مثال جالب‌تری از رمز‌نگاری، به ویژه رمز سزار را امتحان کنیم. رمز سزار یک پیام را با گرفتن هر حرف در پیام رمزگذاری می‌کند، و آن را با یک حرف تغییر یافته، یا یک حرف که تعداد مشخصی از فضاهای دور از حروف الفبا است جایگزین می‌کند. بنابراین اگر تعداد فضاهای ۱ را انتخاب کنیم، هر حرف جای خود را به حرف ۱ می‌دهد. بنابراین حرفa با حرف b جایگزین خواهد شد، حرف b با حرف c جایگزین خواهد شد، و غیره. اگر تعداد فضاهای ۲ را انتخاب کنیم، آنگاه a با c جایگزین خواهد شد، و b با d جایگزین خواهد شد.

اگر ما در حال شمارش فضاهایی باشیم که به انتهای الفبا می‌رسیم، آن وقت به ابتدای الفبا برمی‌گردیم. به عبارت دیگر، حرفz با حرف a (اگر ۱ فضا را تغییر دهیم) ، یا با حرف b (اگر ۲ فضا را تغییر دهیم) جایگزین خواهد شد.

برای مثال، اگر پیامی که می‌خواهیم رمزگذاری کنیم «abc» باشد و تعداد فضاها را ۱انتخاب کنیم، پیام رمز‌شده «bcd» خواهد بود. اگر پیغام«xyz» باشد، پیام رمزگذاری شده«yza» خواهد بود.

شاید مطالعه مقاله ۶ نکته برای تمرین برنامه‌نویسی برای شما مفید باشد.

استفاده از تابع نقشه

خوب، ما در حال اعمال چیزی به هر عنصر یک شی قابل تکرار هستیم. در این حالت، شی قابل تکرار یک رشته است و ما می‌خواهیم هر حرف / عنصر را در رشته خود با یک رشته دیگر جایگزین کنیم. و تابع نقشه دقیقا می‌تواند این کار را انجام دهد! بیایید فرض کنیم که تمام پیغام‌ها تنها حروف کوچک خواهند بود. و تعداد فضاها عددی بین ۰تا ۲۶ خواهد بود. به یاد داشته باشید، ما فقط می‌خواهیم حروف را با حروف دیگر جایگزین کنیم. بنابراین، هر عنصر غیر حرفی، مانند یک فضا یا نماد، بدون تغییر خواهد بود.

ما ابتدا نیاز به دسترسی به الفبای حروف کوچک داریم. ما می‌توانیم یک رشته با تمام حروف کوچک بنویسیم، یا می‌توانیم از ماژول رشته به شرح زیر استفاده کنیم:

abc = 'abcdefghijklmnopqrstuvwxyz'orimport stringabc = string.ascii_lowercaseprint(abc)

# 'abcdefghijklmnopqrstuvwxyz'

سپس می‌توانیم تابع رمزنگاری خود را به صورت زیر بنویسیم:

def encrypt(msg, n):

    return ''.join(map(lambda x:abc[(abc.index(x)+n)%26] if x in abc else x, msg))encrypt('how are you?',2)

# 'jqy ctg aqw?'

ما این تابع را با دو پارامتر رمزگذاری می‌کنیم: پیامی که می‌خواهیم رمزگذاری کنیم، msg، و تعداد فضاهای n که می‌خواهیم حروف را به آن‌ها منتقل کنیم. قابلیت تکرارپذیری که ما به تابع نقشه منتقل می‌کنیم، پیام،msg است. تابعی که ما به تابع نقشه وارد می‌کنیم یک تابع lambda خواهد بود که هر عنصر را از رشته msg می‌گیرد و اگر عنصر یک حرف در الفبا باشد، آن را با حرف جا به جا شده بسته به n مقداری که وارد می‌کنیم جایگزین می‌کند. این کار را با در نظر گرفتن شاخص فعلی آن حرف در الفبا یا abc.inde (x) انجام می‌دهد، مقدار n را به آن اضافه می‌کند و سپس مدول آن مجموع را می‌گیرد. عملگر قدرمطلق برای شروع دوباره در ابتدای الفبایی استفاده می‌شود اگر به انتها برسیم (اگرabc.inde (x) + n عددی بزرگ‌تر از ۲۵ باشد). به عبارت دیگر، اگر حرف اصلی z باشد (که شاخص ۲۵ را در رشته abc که در بالا ایجاد کردیم خواهد داشت) ، و مقدارn برابر با ۲ باشد، آنگاه (abc.inde (x) + n) % ۲۶ به ۲۷٪ ۲۶خواهد رسید، که باقیمانده ۱را نتیجه می‌دهد.بنابراین حرف z را با حرف شاخص ۱ در الفبای b جایگزین می‌کنیم.

map(lambda x:abc[(abc.index(x)+n)%26] if x in abc else x, msg)

به یاد داشته باشید که تابع نقشه یک شی نقشه را باز می‌گرداند. بنابراین ما می‌توانیم از روش رشته استفاده کنیم، که تکرار پذیر است (که شی نقشه است، چون تکراری است، و همه تکرارکننده‌ها قابل تکرار هستند) ، و سپس آن را به یک رشته متصل می‌کنیم. سپس تابع این رشته را برمی‌گرداند.

برای رمزگشایی یک پیغام، می‌توانیم از تابع رمزگشایی زیر استفاده کنیم (توجه داشته باشید که چگونه ما n را از abc.inde (x) به جای اضافه کردن آن کم می‌کنیم:

def decrypt(coded, n):

    return ''.join(map(lambda x:abc[(abc.index(x)-n)%26] if x in abc else x, coded))decrypt('jqy ctg aqw?',2)

# 'how are you?'

امیدوارم از این برنامه آموزشی روی تابع نقشه در پایتون لذت برده باشید.

این متن با استفاده از ربات ترجمه مقالات برنامه‌نویسی ترجمه شده و به صورت محدود مورد بازبینی انسانی قرار گرفته است.در نتیجه می‌تواند دارای برخی اشکالات ترجمه باشد.
مقالات لینک‌شده در این متن می‌توانند به صورت رایگان با استفاده از مقاله‌خوان ترجمیار به فارسی مطالعه شوند.