عمل ضرب در هر زبان برنامهنویسی به عنوان یکی از تواناییهای اصلی شناخته میشود. در زبان برنامهنویسی پایتون هم که یکی از زبانهای چندکاره و قدرتمند است، ضرب کردن جزو تواناییهای بنیادین این زبان محسوب میشود. جای تعجب نیست که پایتون چند روش مختلف برای ضرب اعداد ارائه میدهد.در این مطلب از مجله فرادرس، تلاش داریم همه روشهای ضرب اعداد را در پایتون بررسی کنیم. از روشهای ریاضیات پایه تا تکنیکهای پیشرفته را خواهیم آموخت. میتوانیم با تسلط بر کار با این عملیات پایه ریاضی به برنامهنویس حرفهای در پایتون تبدیل شویم.
در واقع چندین تفسیر مختلف از عمل ضرب در دنیای برنامهنویسی وجود دارد و هر تفسیر روشهای مختلفی و منحصر به خودش را برای رسیدن به هدف دارد. در این مطلب علاوه بر بررسی روشهای ضرب در پایتون برای هر کدام از این تفسیرها، مثالی نیز در فضای پایتون کدنویسی خواهیم کرد.
استفاده از عملگر «*»
البته که اولین روش، استفاده از نماد ستاره به معنی عملگر ضرب است. نماد ستاره تقریبا در همه زبانهای برنامهنویسی عملیات ضرب را انجام میدهد. در ادامه کد سادهای از پایتون را نمایش دادهایم که استفاده از این عملگر را نمایش میدهد.
1num_bananas = 3
2banana_price = 0.50
3
4print(num_bananas*banana_price)
این برنامه برای محاسبه مجموع کل قیمت محصول موز در محیط اجرای کد نوشته شده است.
1.5
توجه کنید که عملگر *
نهتنها روی نوع داده «اعداد صحیح» (Integers) بلکه روی اعداد اعشار Float هم نتیجه میدهد. به عنوان مثال به عملیاتی توجه کنید که در زیر پیادهسازی کردهایم.
1# Assign the value 3.14 to the variable x
2x = 3.14
3# Assign the value 2.71 to the variable y
4y = 2.71
5# Multiply x and y and store the result in the variable 'result'
6result = x * y
7# Print the value stored in 'result'
8print(result)
خروجی کد بالا مقدار دقیق حاصل ضرب عدد 3.14
در 2.71
را نشان میدهد که برابر با 8.5094
است.
8.5094
استفاده عملگر تخصیص «=*»
پایتون، سیستم نشانهگزاری کوتاهنویسی خاصی ارائه میدهد که برای ضرب کردن متغیر در یک مقدار خاص و بهروزرسانی مقدار متغیر بهصورت همزمان استفاده میشود. به این نوع از عملگرها، عملگر تخصیص میگویند. وقتی که بخواهیم مقدار متغیری را با استفاده از عمل ضرب افزایش دهیم این عملگر کارایی بسیار مناسبی دارد.
به کدی که در ادامه در رابطه با قیمت موز آوردهایم توجه کنید.
1banana_price = 0.50
2inflation = 1.03
3
4banana_price *= inflation
5
6print(banana_price)
در اینجا میدانیم که موزها ۵۰ سنت یا 0.50
دلار میارزند و تورم برابر با ۳ درصد است که با ضریب تورم 1.03
نشان داده میشود. وقتی که قیمت موز banana_price
ضرب در تورم شود قیمت جدید موز بدست میآید. علت این اتفاق تاثیر عملگر تخصیص *=
است. مقدار نهایی قیمت برابر با مقدار زیر است. بنابراین میبینیم که قیمت موز ۳درصد افزایش داشته است.
0.515
عملیات ضرب در پایتون بر روی لیست ها
لیستها یکی از ساختارهای ذخیره داده بنیادین و بسیار قدرتمند در پایتون هستند. بهطور طبیعی باید توانایی اجرای عملیات ریاضی را نیز داشته باشند. ضرب کردن هم یکی از عملیات پایهای و اساسی ریاضیات است. پس لیستها باید توانایی این را داشته باشند که در عملیات ضرب استفاده شوند.
برای اجرای عمل ضرب بر روی لیست چند روش مختلف در پایتون وجود دارد که در این بخش به بررسی آنها خواهیم پرداخت.
ضرب بر روی لیست با استفاده از تابع map
در این بخش، عمل ضرب در پایتون را بر روی لیستی از اعداد با استفاده از تابع map()
خواهیم دید. فرض کنید لیستی از اعداد داریم و باید هر عنصر را در مقدار یکسانی ضرب کنیم. برای انجام این کار میتوانیم از تابع map()
استفاده کنیم.
به کدی که در زیر نوشتهایم توجه کنید.
1numbers = [1,2,3,4]
2
3print(list(map(lambda x: 2*x, numbers)))
در اینجا تابع «لامبدا» (Lambda) داریم که صرفا فقط دادههای ورودی خود را ضرب در عدد 2 میکند. از تابع map()
برای بکار گرفتن این تابع – در آرگومان اول آمده است– بر روی هر عنصر لیست که در واقع همان اعداد هستند استفاده میکنیم. این کد، شی map()
را برمیگرداند که میتوان آن را با استفاده از سازنده list()
به ساختار تعریف شده شی از نوع لیست تبدیل کرد.
بنابراین خروجی زیر را بدست میآوریم.
[2, 4, 6, 8]
توجه کنید که بهطور ساده عمل ضرب کردن لیست در عدد ۲ متفاوت از چیزی خواهد بود که دیدیم. اگرچه که از لحاظ نحوی و نوشتاری صحیح است اما جواب متفاوتی را برمیگرداند. بنابراین برنامه زیر سینتکس صحیحی دارد.
1numbers = [1,2,3,4]
2
3print(numbers*2)
خروجی برنامه بالا بهصورت زیر است.
[1, 2, 3, 4, 1, 2, 3, 4]
به عبارت دیگر، این عملیات عناصر لیست را بهصورت مجزا ضرب نمیکند بلکه در عوض کل لیست را به تعداد عدد مشخص شده تکرار میکند. به این صورت که لیست را به عنوان یک موجودیت میبیند. میدانیم که ضرب هر عدد در یک موجودیت برابر با تکرار آن موجودیت به اندازه آن عدد است.
استفاده از عملیات reduce روی لیست
تابع reduce()
در پایتون به عنوان ورودی، تابعی را به همراه شی پیمایشپذیری به عنوان دو پارامتر جدا از هم میپذیرد. سپس تابع را بر روی اعضای شی پیمایشپذیر اعمال میکند. در نهایت نتایج را از سراسر شی پیمایشپذیر جمع میکند و بهصورت یک مقدار مجزا برگشت میدهد. در کد پایین مثالی از روش کار این تابع را کدنویسی کردهایم.
1from functools import reduce
2
3def product(x,y):
4 return(x*y)
5
6numbers = [1,2,3,4]
7print(reduce(product,numbers))
خروجی کد بالا بهصورت زیر است.
24
در این مثال، ماژول functools
از پایتون را در محیط کار «وارد» (Import) کردهایم. به کمک ماژول functools
به تابع reduce()
دسترسی پیدا میکنیم. تابع reduce()
خود تابع دیگری را به عنوان پارمتر ورودی میپذیرد. در این کد تابع product()
را به تابع reduce()
ارسال کردهایم. این تابع، تابع product()
را که به عنوان پارامتر گرفته است بر روی لیستی که به عنوان پارامتر دوم گرفته اعمال میکند. در اینجا لیست numbers
را به عنوان پارامتر دوم به تابع reduce()
ارسال کردهایم. در هر مرحله جواب صحیح را برای استفاده در مرحله بعد تابع reduce()
جدا میکند و این عملیات را بر روی عناصر باقیمانده لیست یک به یک اعمال کند.
برای استفاده از تابع reduce()
لازم نیست که حتما تابعی را بهصورت جداگانه تعریف کرده باشیم یا از قبل آماده داشته باشیم. میتوانیم از تابع reduce()
در ترکیب با تابع lambda
نیز برای کار -در اینجا اجرای عمل ضرب- روی عناصر لیست استفاده کنیم.
به مثال کدنویسی شده پایین نگاه کنید.
1# Using the `reduce()` function from the `functools` module:
2from functools import reduce # Import the reduce function
3numbers = [1, 2, 3, 4, 5] # Initialize a list of numbers
4
5# Use the reduce function to apply the lambda function to all elements in the list
6result = reduce(lambda x, y: x * y, numbers)
7
8print(result) # Print the final result
خروجی کد بالا به صورت زیر است.
120
در کد بالا لیستی از اعداد ایجاد کردهایم. سپس تابع reduce()
را از ماژول functools
در محیط کدنویسی پایتون وارد کردهایم تا با کمک تابع تعریف شده lambda
بر روی اعداد موجود در لیست عمل ضرب را انجام دهیم.
کار تابع lambda
به این صورت است که دو آرگومان x
و y
را میپذیرد و حاصل ضرب این دو عدد را برمیگرداند. در این مثال نتیجه حاصل از ضرب همه اعضای لیست در یکدیگر در متغیر result
ذخیره میشود. این نتیجه برابر با 120
است. تابع reduce()
ابزار قدرتمندی برای کم کردن تعداد عناصر لیست در مقدار یک متغیر مجزا است و برای استفاده در برنامهنویسی تابعی و لیستهای بزرگ بسیار مناسب است.
ضرب با کمک List Comprehension
عملیات «List Comprehension» یکی از روشهای بسیار مناسب، خلاصهنویسی شده و خوانا است که برای تعریف لیستی با کمک لیست دیگر در پایتون بهوجود آمده است. در این روش برای نمایش ضرب در پایتون از List Comprehension استفاده میکنیم تا حاصل ضرب همه اعضای لیست را در یک مقدار خاص در متغیر result
بدست بیاوریم.
به کد پیادهسازی شده پایین از اجرای این عملیات نگاه کنید.
1# Using List comprehension :
2numbers = [1, 2, 3, 4, 5] # Initialize a list of numbers
3result = 1 # Initialize a variable to store the result
4
5# Use list comprehension to create a new list with the product of each number and the initial result
6result = [result*i for i in numbers]
7
8print(result[-1]) # Print the final result by accessing the last element of the final list
خروجی کد بالا بهصورت زیر است.
[1, 2, 3, 4, 5]
در کد بالا اول از همه لیستی برای اعداد تشکیل دادهایم و متغیر result
را با مقدار 1، مقداردهی اولیه کردیم. سپس با استفاده از عمل Comprehension بر روی لیست اعداد پیمایش کردیم و لیست جدیدی را با حاصل ضرب هر عدد در مقدار result
ایجاد کردیم. در نهایت مقدار جواب با رسیدن پیمایش به انتهای لیست، برابر با لیست جدید در result
میشود.
هربار که عمل پیمایش در Comprehension انجام میشود نتیجه به عنصری در لیست جدید تبدیل میشود. چون اینجا مقدار result
برابر 1 بود نتیجه دقیقا همسان با لیست مرجع است. اما میتوان تمام عناصر لیست را در هر عدد مشخصی ضرب کرد. مقدار result
را تغییر دهید تا تغییر را در عناصر لیست مشاهده کنید.
استفاده از math.prod
پایتون ماژول math را به منظور استفاده در عملیات پیشرفته ریاضی ارائه داده است. این کتابخانه توابع ریاضی گسترده و متنوعی را ارائه میدهد. عمل ضرب نیز در شمار این توابع محسوب میشود. در ادامه مثالی از استفاده تابع math.prod()
را خواهید دید که نتیجه اجرای عملیات را بر روی همه عناصر لیست برمیگرداند. این عملیات همه اعضای لیست را در یکدیگر ضرب میکند.
1import math as m
2
3numbers = [1,2,3,4]
4print(m.prod(numbers))
خروجی کد بالا باز هم مقدار زیر است.
24
ضرب با استفاده از حلقه for
در این روش از حلقه for برای پیمایش اعضای لیستی از اعداد استفاده میشود. همچنین از متغیری به نام دلخواه result
برای نگهداری مقدار جواب عمل ضرب در هر لحظه و بهروزرسانی این مقدار با ضرب عدد بعدی بر روی نتیجه قبلی استفاده میشود.
به مثالی که در ادامه پیادهسازی شده توجه کنید.
1# Using a for loop:
2numbers = [1, 2, 3, 4, 5] # Initialize a list of numbers
3result = 1 # Initialize a variable to store the result
4
5# Iterate over the list of numbers
6for number in numbers:
7 result *= number # Multiply the current number with the previous result
8
9print(result) # Print the final result
خروجی کد بالا برابر با مقدار زیر است.
120
کد بالا در ابتدا لیستی از اعداد تشکیل میدهد. سپس متغیر result
را با مقدار 1 مقداردهی اولیه میکند. بعد از حلقه for برای پیمایش بر روی لیست اعداد استفاده میکند. پیمایش لیست ادامه دارد تا وقتی که مقدار هر پیمایش و همه اعداد موجود در لیست در یکدیگر ضرب شوند. سپس نتیجه نهایی در متغیر result
ذخیره شود. در نهایت مقدار result
برابر با ضرب همه اعداد موجود در لیست در یکدیگر خواهد بود که در این مثال برابر با عدد 120 است. جواب در این مسئله خاص برابر با محاسبه فاکتوریل بزرگترین و آخرین عنصر در لیست است.
استفاده از numpy.multiply
کتابخانه NumPy ابزار بسیار قدرتمندی است مخصوصا وقتی که با آرایهها یا ماتریسها کار میکنید. کتابخانه NumPy توابع ریاضی کارآمدی را برای عملیات عددی و آرایههای چندبعدی، ارائه میدهد.
در ادامه مثالی از ضرب دو آرایه NumPy را در یکدیگر میبینید.
1import numpy as np
2
3a = np.array([1, 2, 3])
4b = np.array([4, 5, 6])
5
6result = np.multiply(a, b)
7print(result)
8
خروجی کد بالا بهصورت زیر است.
[ 4 10 18]
روش ضرب اعداد مختلط
در این بخش به بررسی همه روشهای ممکن برای انجام عمل ضرب روی اعداد مختلط میپردازیم. برای انجام این کار دو روش وجود دارد.
- استفاده از عملگر *
برای ضرب
- استفاده از تابع complex()
در ادامه هر دو روش را بررسی میکنیم.
عملگر ضرب با نماد ستاره یا «*»
عملگر ستاره همینطور که برای اجرای ضرب معمولی بین اعداد ساده بکار میرود، در پایتون میتواند اعداد مختلط را نیز در هم ضرب کند. نکته مهم این است که عملگر *
از قوانین استاندار ریاضی برای ضرب کردن اعداد مختلط استفاده میکند. پس نظم عملوندها اهمیتی ندارد. به کد آمده در پایین توجه کنید.
1# Assign the value 3+4j to the variable x
2x = 3 + 4j
3# Assign the value 2+3j to the variable y
4y = 2 + 3j
5# Multiply x and y and store the result in the variable 'result'
6result = x * y
7# Print the value stored in 'result'
8print(result)
جواب دقیق ضرب اعداد مختلط (2 + 3j)
و (3 + 4j)
برابر با (-6 + 17j)
است که در ادامه میبینید. خروجی کد بالا بهصورت صحیح پاسخ این عملیات را محاسبه کرده است.
(-6 + 17j)
استفاده از تابع complex
از تابع complex()
برای تبدیل کردن رشتهای که به عنوان پارامتر به این تابع داده شده به عدد مختلط و سپس ضرب دو عدد استفاده میشود. هر عدد مختلط دارای دو بخش حقیق و موهومی است.
به کد آمده در پایین برای نمایش روش استفاده از تابع complex()
نگاه کنید.
1# Assign the string "3+4j" to the variable c
2c = "3+4j"
3# convert the string to a complex number and multiply it by 2
4d = complex(c) * 2
5# Print the value stored in d
6print(d)
خروجی کد بالا برابر با (6+8j)
است که همان مقدار صحیح ضرب (3+4j)
در عدد ۲ میشود.
(6+8j)
روش ضرب رشته در اعداد صحیح
میتوانید در پایتون برای ضرب رشتهها در عدد صحیح از عملگر *
استفاده کنید. نتیجه این عمل تکرار متن رشته به تعدادی است که در عدد صحیح مشخص شده. باید به این نکته توجه کنید که رشته حتما در عدد صحیح ضرب شود. اگر تلاش کنید که رشته را در هر نوع داده دیگری ضرب کنید با خطای TypeError
روبهرو خواهید شد.
در پایین برای نمایش مثال از ضرب رشته در اعداد صحیح کدی پیادهسازی کردهایم.
1# Assign the string "Hello" to the variable x
2x = "USA"
3# Assign the value 3 to the variable y
4y = 3
5# Multiply x and y and store the result in the variable 'result'
6result = x * y
7# Print the value stored in 'result'
8print(result)
خروجی کد بالا به صورت زیر است.
USAUSAUSA
ضرب اعداد منفی در پایتون
برای عمل ضرب در پایتون میتوانیم از اعداد منفی نیز استفاده کنیم. یکی از اساسیترین روشهای ضرب اعداد منفی استفاده از عملگر ضرب *
است. به کد آمده در زیر توجه کنید.
1x = -2 # Assign the value -2 to variable x
2y = -3 # Assign the value -3 to variable y
3result = x * y # Multiply the values of x and y and store the result in variable result
4print(result)
خروجی کد بالا بهصورت زیر است.
6
در کد بالا مقدار -2
را به متغیر x
و مقدار -3
را به متغیر y
تخصیص دادهایم. سپس متغیرهای x
و y
را در یکدیگر با استفاده از عملگر *
ضرب کردیم و جواب را در متغیر result
قرار دادیم. در نهایت نیز مقدار متغیر result
را که اکنون برابر با 6
است بر روی نمایشگر کاربر چاپ کردیم.
سوالات متداول
در این بخش از مطلب ضرب در پایتون در مجله فرادرس به سوالات پرتکرار درباره این مبحث میپردازیم. این سوالات بیشترین تکرار پرسش را در بین دانشجویان زبان برنامهنویسی در ارتباط با عمل ضرب داشتهاند.
آیا عملگر ضرب می تواند از انواع داده مختلف عددی در پایتون پشتیبانی کند؟
بله، عملگر ضرب در پایتون میتواند انواع داده عددی مختلف شامل اعداد integer و Float را پشتیبانی کند. این عملگر حتی میتواند اعداد با نوع داده مختلف را -مانند ضرب عدد صحیح در عدد اعشار- در هم ضرب کند.
پایتون چگونه ترتیب اجرای عملگرها را با عملگر ضرب مدیریت می کند؟
زبان برنامهنویسی پایتون از قوانین PEMDAS پیروی میکند. به این معنا است که عملگر ضرب، همسان با عملگر تقسیم حق تقدم بر سایر عملگرها دارد. اولویت عملگر ضرب برای اجرا بعد از عبارتهای داخل پرانتز و توان است. البته به شرطی که در مسئله وجود داشته باشند.
آیا می توان از عملگر ضرب برای چندین عملوند مختلف در یک عبارت استفاده کرد؟
بله، عملگر ضرب در پایتون تنها محدود به اجرای عملیات بر روی دو عدد نشده است. از این عملگر میتوان برای ضرب کردن هرچند عدد دلخواه در یک عبارت ریاضی استفاده کرد.
چطور می توانم در پایتون عددی را در خودش ضرب کنم؟
برای اینکه در پایتون بتوانید عددی را در خودش ضرب کنید، هم میتوانید از عملگر ضرب بهصورت تکراری (مانند 4 * 4 * 4) استفاده کنید و هم میتوانید از عملگر ستاره «*» بهصورت دوبار کنار هم یعنی «**» استفاد کنید.
به جز استفاده از عملگر ضرب روش دیگری برای انجام عملیات ضرب در پایتون وجود دارد؟
بله، در کنار استفاده از عملگر ضرب میتوانید تابع سفارشی خود را برای انجام عمل ضرب در پایتون تعریف کنید و یا از توابع مخصوص عملیات ضرب که توسط ماژول math در پایتون ارائه میشوند استفاده کنید.
آیا میتوان اعدادی که توسط ورودی کاربر گرفته شده اند را نیز ضرب کرد؟
بله، میتوان اعدادی را که توسط کاربر به عنوان ورودی به پایتون داده شدهاند را نیز ضرب کرد. از تابع ()input برای گرفتن ورودی کاربر بهصورت رشته استفاده کنید. دادههای ورودی را به نوع داده عددی مورد نظرتان تبدیل کنید و سپس به راحتی با عملگر ضرب، عملیات مربوط به ضرب را روی دادهها انجام دهید.
چگونه پایتون عمل ضرب را برای رشته ها مدیریت می کند؟
رشتهها را در پایتون فقط میتوان در اعداد integer ضرب کرد. وقتی که رشتهای را در عدد صحیح ضرب میکنید، نتیجه ضرب تکرار رشته مورد نظر به تعداد مقدار عدد صحیح است. برای مثال ضرب رشته « Hello» در عدد صحیح ۳ برابر با رشته «Hello Hello Hello» میشود.
آیا در پایتون محدودیتی در اندازه اعداد برای ضرب وجود دارد؟
در اندازه اعدادی که پایتون میتواند بر روی آنها عملیات ضرب انجام دهد هیچ محدودیت عملیاتی وجود ندارد. پایتون از هر عدد بسیار بزرگی پشتیبانی میکند و عملیات ضرب میتواند اعداد بسیار بزرگ را بهخوبی مدیریت کند.
آیا می توان با عملگر ضرب در پایتون اعداد مختلط را نیز در یک دیگر ضرب کرد؟
بله، میتوانید برای محاسبه روی اعداد مختلط از عملگر ضرب «*» استفاده کنید. این عملگر در پایتون، عملیات ضرب مختلط را همانگونه که انتظار میرود انجام میدهد و میتواند هر دو قسمت حقیقی و موهومی عدد را بهطور مناسبی شناسایی و نتیجه محاسبه کند.
جمع بندی
همانطور که اشاره کردیم عملیات ضرب یکی از عملهای اساسی ریاضی در پایتون است و بنابراین، روشهای گوناگونی برای انجام ضرب در پایتون فراهم شده است. از عملیات بسیار ساده ریاضی توسط عملگرهای پایه روی اعداد صحیح گرفته تا کتابخانههای حرفهای برای محاسبات پیچیده هر کدام روش منحصر بهفرد خود را برای انجام صحیح عمل ضرب دارند.
در این مطلب از مجله فرادرس سعی کردیم که با انواع سناریوهای ضرب در پایتون پیشبیاید آشنا شویم و روش حل هر کدام را بررسی کنیم. با دانش کسب شده درباره ضرب در پایتون حتما خواهیم توانست که بهتر به حل مسائل دنیای واقعی پایتون بپردازیم و برنامههایی با کارایی بالاتر بنویسیم.
source