در زبان برنامه نویسی پایتون (Python Programming Language)، شش «نوع داده» (Data Type) اصلی وجود دارد. این انواع داده، شامل «عدد» (Number)، «لیست» (List)، «تاپل» (Tuple)، «رشته» (String)، «دیکشنری» (Dictionary) و «مجموعه» (Set) می‌شوند. در این مطلب، نوع داده مجموعه در پایتون مورد بررسی قرار گرفته و به روش ساخت مجموعه، اضافه و حذف کردن عنصر از آن و همه عملیات انجام شده روی مجموعه‌ها در پایتون پرداخته شده است.

نوع داده مجموعه در پایتون

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

روش ساخت مجموعه در پایتون

مجموعه با کنار هم قرار دادن همه عناصر درون آکولاد ساخته می‌شود. عناصر مجموعه به وسیله کاما یا تابع توکار ()set از هم جدا می‌شوند. مجموعه‌ها می‌توانند هر تعدادی عنصر داشته باشند. همچنین، عناصر مجموعه می‌توانند دارای انواع مختلفی (صحیح، ممیز شناور، تاپل، رشته) باشند. نوع داده مجموعه در پایتون، همانند لیست و دیکشنری، نمی‌تواند عنصر تغییرپذیر داشته باشند. در ادامه، مثال‌هایی از ساخت مجموعه در پایتون ارائه شده است.

# set of integers
my_set = {1, 2, 3}
print(my_set)

# set of mixed datatypes
my_set = {1.0, "Hello", (1, 2, 3)}
print(my_set)

در کد بالا، ابتدا یک مجموعه با عناصر ۱، ۲ و ۳ تعریف شده است. سپس، با استفاده از تابع ()print، مجموعه مذکور چاپ می‌شود.

{1, 2, 3}

با دستور {(my_set = {1.0, “Hello”, (1, 2, 3، مجموعه‌ای با سه نوع داده ممیز شناور، رشته و تاپل ساخته و سپس با تابع پرینت، خروجی آن چاپ شده است.

{1.0, 'Hello', (1, 2, 3)}

مثال‌های زیر نیز قابل توجه هستند.

# set do not have duplicates
# Output: {1, 2, 3, 4}
my_set = {1,2,3,4,3,2}
print(my_set)

# set cannot have mutable items
# here [3, 4] is a mutable list
# If you uncomment line #12,
# this will cause an error.
# TypeError: unhashable type: 'list'

#my_set = {1, 2, [3, 4]}

# we can make set from a list
# Output: {1, 2, 3}
my_set = set([1,2,3,2])
print(my_set)

در قطعه کد بالا، ابتدا یک مجموعه به صورت {my_set = {1,2,3,4,3,2 تعریف می‌شود. ولی به دلیل آنکه مجموعه‌ها نمی‌توانند عنصر تکراری داشته باشند، خروجی دستور (print(my_set به صورت زیر خواهد بود.

{1, 2, 3, 4}

نکته مهم دیگر آن است که لیست‌ها نمی‌توانند عنصر قابل تغییر داشته باشند. بنابراین، در صورتی که دستور {[my_set = {1, 2, [3, 4 از حالت توضیحات خارج و اجرا شود، پیام خطایی به صورت زیر صادر می‌شود.

unhashable type: 'list'

می‌توان از یک لیست، مجموعه ساخت. در قطعه کد آورده شده در بالا، دستور ([my_set = set([1,2,3,2 این کار را انجام می‌دهد. خروجی (print(my_set برای این مجموعه، به صورت خواهد بود.

{1, 2, 3}

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

# initialize a with {}
a = {}

# check data type of a
# Output: <class 'dict'>
print(type(a))

# initialize a with set()
a = set()

# check data type of a
# Output: <class 'set'>
print(type(a))

در قطعه کد بالا، ابتدا دستور {} = a وارد شده است. سپس، نوع متغیر a با استفاده از تابع ()type تعیین و با تابع ()print چاپ می‌شود. خروجی به صورت زیر است.

<class 'dict'>

در خط کد بعدی، با استفاده از دستور ()a = set یک مجموعه خالی ساخته می‌شود. خروجی ((print(type(a به صورت زیر است.

<class 'set'>

روش تغییر مجموعه در پایتون

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

# initialize my_set
my_set = {1,3}
print(my_set)

# if you uncomment line 9,
# you will get an error
# TypeError: 'set' object does not support indexing

#my_set[0]

# add an element
# Output: {1, 2, 3}
my_set.add(2)
print(my_set)

# add multiple elements
# Output: {1, 2, 3, 4}
my_set.update([2,3,4])
print(my_set)

# add list and set
# Output: {1, 2, 3, 4, 5, 6, 8}
my_set.update([4,5], {1,6,8})
print(my_set)

در قطعه کد بالا، ابتدا با استفاده از دستور {my_set = {1,3 یک مجموعه ساخته و سپس، با بهره‌گیری از تابع ()print چاپ می‌شود.

{1, 3}

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

TypeError: 'set' object does not support indexing

مثال بعدی که در قطعه کد بالا آورده شده، مربوط به اضافه کردن یک عنصر به مجموعه است. در این راستا، از دستور (my_set.add(2 استفاده شده و سپس، مجموعه با (print(my_set چاپ شده است.

{1, 2, 3}

به طور کلی، خروجی قطعه کد بالا به صورت زیر خواهد بود.

{1, 3}
{1, 2, 3}
{1, 2, 3, 4}
{1, 2, 3, 4, 5, 6, 8}

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

# initialize my_set
my_set = {1, 3, 4, 5, 6}
print(my_set)

# discard an element
# Output: {1, 3, 5, 6}
my_set.discard(4)
print(my_set)

# remove an element
# Output: {1, 3, 5}
my_set.remove(6)
print(my_set)

# discard an element
# not present in my_set
# Output: {1, 3, 5}
my_set.discard(2)
print(my_set)

# remove an element
# not present in my_set
# If you uncomment line 27,
# you will get an error.
# Output: KeyError: 2

#my_set.remove(2)

در کد بالا، ابتدا یک مجموعه داده با ۵ عنصر از نوع صحیح ساخته و به متغیر my_set تخصیص داده شده است. سپس، مجموعه my_set چاپ شده است.

{1, 3, 4, 5, 6}

در ادامه، با استفاده از دستور (my_set.discard(4، عنصر ۴ از مجموعه داده حذف می‌شود. خروجی (print(my_set به صورت زیر خواهد بود.

{1, 3, 5, 6}

با استفاده از دستور (my_set.remove(6، عنصر ۶ از مجموعه حذف می‌شود. خروجی (print(my_set به صورت زیر خواهد بود.

{1, 3, 5}

در ادامه، با استفاده از دستور (my_set.discard(2 عنصر ۲ از مجموعه حذف می‌شود. خروجی (print(my_set به صورت زیر است.

{1, 3, 5}

در صورتی که در قطعه کد بالا، دستور (my_set.remove(2 از حالت توضیحات خارج و اجرا شود، پیغام خطای زیر صادر می‌شود، زیرا عنصر ۲ اصلا در مجموعه داده وجود ندارد که حذف شود.

KeyError: 2

برای نوع داده مجموعه در پایتون، می‌توان با استفاده از متد ()pop یک عنصر را حذف و مقدار آن را بازگرداند. مجموعه‌ها فاقد ترتیب هستند و بنابراین راهی برای تعیین اینکه کدام عنصر حذف خواهد شد وجود ندارد. این امر کاملا دلخواه است. همچنین، می‌توان همه عناصر یک مجموعه را با استفاده از ()clear حذف کرد. در ادامه، مثال‌هایی در همین رابطه ارائه شده‌اند.

# initialize my_set
# Output: set of unique elements
my_set = set("HelloWorld")
print(my_set)

# pop an element
# Output: random element
print(my_set.pop())

# pop another element
# Output: random element
my_set.pop()
print(my_set)

# clear my_set
#Output: set()
my_set.clear()
print(my_set)

در قطعه کد بالا، ابتدا با استفاده از دستور (“my_set = set(“HelloWorld یک مجموعه با عنوان my_set تعریف شده که عنصر آن یک رشته است. خروجی (print(my_set در زیر آمده است.

{'r', 'H', 'l', 'd', 'o', 'W', 'e'}

دستور (()print(my_set.pop یکی از عناصر مجموعه را به طور دلخواه حذف می‌کند و مقدار آن را باز می‌گرداند. خروجی به صورت زیر خواهد بود.

r

مجددا، با استفاده از دستور ()my_set.pop یک عنصر دیگر از مجموعه حذف و مقدار آن بازگردانده می‌شود. خروجی (print(my_set در ادامه آمده است.

{'l', 'd', 'o', 'W', 'e'}

چنانکه مشهود است، این بار عنصر h حذف شده است. در نهایت، با استفاده از ()my_set.clear کلیه عناصر مجموعه حذف می‌شوند. خروجی (print(my_set به صورت زیر است.

set()

عملیات مجموعه در پایتون

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

 A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

اتحاد مجموعه در پایتون

نوع داده مجموعه در پایتون — به زبان سادهاتحاد A و B مجموعه‌ای از همه عناصر هر دو مجموعه است. اتحاد با استفاده از عملگر «|» انجام می‌شود. همچنین، می‌توان از متد ()union نیز برای انجام این کار استفاده کرد.

# initialize A and B
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

# use | operator
# Output: {1, 2, 3, 4, 5, 6, 7, 8}
print(A | B)

خروجی کد بالا به صورت زیر است.

{1, 2, 3, 4, 5, 6, 7, 8}

مثال‌های دیگر در ادامه آمده‌اند.

A.union(B)

خروجی قطعه کد بالا به صورت زیر است.

{1, 2, 3, 4, 5, 6, 7, 8}

مثال دیگری در همین رابطه، در ادامه آمده است.

B.union(A)

خروجی قطعه کد بالا به صورت زیر است.

{1, 2, 3, 4, 5, 6, 7, 8}

اشتراک مجموعه در پایتون

نوع داده مجموعه در پایتون — به زبان سادهاشتراک A و B مجموعه‌ای از عناصر است که در هر دو مجموعه مشترک هستند. اشتراک با استفاده از عملگر & انجام می‌شود. همچنین، می‌توان از ()intersection برای اشتراک مجموعه‌ها در پایتون استفاده کرد.

# initialize A and B
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

# use & operator
# Output: {4, 5}
print(A & B)

در کد بالا، ابتدا دو مجموعه A و B تعریف شده‌اند. سپس، اشتراک این دو مجموعه با استفاده از تابع ()print چاپ شده است.

{4, 5}

نمونه‌های دیگری در ادامه آمده‌اند.

# use intersection function on A
>>> A.intersection(B)

خروجی قطعه کد بالا به صورت زیر است.

{4, 5}

مثالی دیگر در همین رابطه، در ادامه آمده است.

# use intersection function on B
B.intersection(A)

خروجی قطعه کد بالا به صورت زیر است.

{4, 5}

تفاضل مجموعه در پایتون

نوع داده مجموعه در پایتون — به زبان ساده

تفاضل A و B (یعنی A – B) مجموعه‌ای از عناصر است که تنها در A هستند و در B وجود ندارند. به طور مشابه، B – A مجموعه‌ای از عناصر در B است که در A حضور ندارند. تفاضل با استفاده از عملگر – انجام می‌شود. همچنین، می‌توان از عملگر ()difference برای تفاضل مجموعه‌ها استفاده کرد.

# initialize A and B
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

# use - operator on A
# Output: {1, 2, 3}
print(A - B)

در قطعه کد بالا، ابتدا دو مجموعه A و B تعریف شده‌اند. سپس، تفاضل A از B با استفاده از دستور (print(A – B محاسبه و چاپ شده است.

{1, 2, 3}

مثال‌های دیگری در ادامه آمده‌اند که می‌توان آن‌ها را در شل پایتون بررسی کرد.

# use difference function on A
>>> A.difference(B)
{1, 2, 3}

# use - operator on B
>>> B - A
{8, 6, 7}

# use difference function on B
>>> B.difference(A)
{8, 6, 7}

تفاضل متقارن مجموعه‌ها

نوع داده مجموعه در پایتون — به زبان ساده

تفاضل متقارن A و B مجموعه‌ای از عناصر در A و B به جز مواردی است که در هر دو مجموعه مشترک هستند. تفاضل متقارن با استفاده از عملگر ^ انجام می‌شود. همچنین، می‌توان از متد ()symmetric_difference برای تفاضل مجموعه‌ها استفاده کرد.

# initialize A and B
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

# use ^ operator
# Output: {1, 2, 3, 6, 7, 8}
print(A ^ B)

در قطعه کد بالا، ابتدا دو مجموعه A و B تعریف شده‌اند. سپس، تفاضل متقارن آن‌ها با استفاده از عملگر ^ محاسبه و خروجی با تابع ()print چاپ شده است.

{1, 2, 3, 6, 7, 8}

در ادامه، مثال‌های دیگری در همین رابطه آمده است که می‌توان آن‌ها را در شل پایتون آزمود.

# use symmetric_difference function on A
>>> A.symmetric_difference(B)
{1, 2, 3, 6, 7, 8}

# use symmetric_difference function on B
>>> B.symmetric_difference(A)
{1, 2, 3, 6, 7, 8}

انواع متدها برای نوع داده مجموعه در پایتون

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

  • ()add: یک عنصر را به مجموعه اضافه می‌کند.
  • ()clear: همه عناصر را از مجموعه حذف می‌کند.
  • ()copy: یک کپی از مجموعه را باز می‌گرداند.
  • ()difference: تفاضل دو یا تعداد بیشتری مجموعه را به صورت یک مجموعه جدید باز می‌گرداند.
  • ()difference_update: همه عناصر مجموعه دیگر را از این مجموعه حذف می‌کند.
  • ()discard: یک عنصر را (که به عنوان آرگومان به متد داده شده) از آن حذف می‌کند. در صورتی که عنصر مذکور در مجموعه وجود نداشته باشد، کاری انجام نمی‌دهد.
  • ()intersection: اشتراک دو مجموعه را به عنوان یک مجموعه جدید محاسبه می‌کند.
  • ()intersection_update: مجموعه با اشتراک خودش و مجموعه دیگر به روز رسانی می‌شود.
  • ()isdisjoint: اگر اشتراک دو مجموعه خالی باشد، مقدار True را باز می‌گرداند.
  • ()issubset: اگر مجموعه، زیرمجموعه یک مجموعه دیگر باشد، مقدار True را باز می‌گرداند.
  • ()issuperset: اگر مجموعه، شامل مجموعه دیگر باشد، مقدار True را باز می‌گرداند.
  • ()pop: یک عنصر دلخواه را حذف می‌کند و مقدار آن را باز می‌گرداند.
  • ()remove: یک عنصر را (که به عنوان آرگومان به متد داده شده) از مجموعه حذف می‌کند. اگر عنصر در مجموعه وجود نداشته باشد، منجر به وقوع خطای KeyError می‌شود.
  • ()symmetric_difference: تفاضل متقارن دو مجموعه را به عنوان یک مجموعه جدید باز می‌گرداند.
  • ()symmetric_difference_update: یک مجموعه را با تفاضل متقارن خودش و مجموعه دیگر به روز رسانی می‌کند.
  • ()union: اتحاد مجموعه‌ها را در یک مجموعه جدید باز می‌گرداند.
  • ()update: مجموعه را با اتحاد خودش و دیگر موارد به روز رسانی می‌کند.

فروزن‌ست در پایتون

«فروزن‌ست» (Frozenset) یک کلاس جدید است که ویژگی‌های یک مجموعه را دارد، اما عناصر آن پس از تخصیص پیدا کردن قابل تغییر نیستند. در حالی که تاپل‌ها در واقع لیست‌های غیر قابل تغییر هستند، فروزن‌ست‌ها، مجموعه‌های غیر قابل تغییر هستند. مجموعه‌های قابل تغییر غیر قابل هش (Hash) شدن هستند، بنابراین نمی‌توان از آن‌ها به عنوان کلیدهای دیکشنری استفاده کرد. از سوی دیگر، frozenset‌ها قابل هش کردن هستند و می‌توانند به عنوان کلیدهای دیکشنری مورد استفاده قرار بگیرند.

frozenset را می‌توان با استفاده از تابع ()frozenset ساخت. این نوع داده از متدهایی مانند ()copy() ،difference() ،intersection() ،isdisjoint() ،issubset() ،issuperset() ،symmetric_difference و ()union پشتیبانی می‌کند. به دلیل غیر قابل تغییر بودن، متدهایی که عناصر را اضافه یا حذف می‌کنند برای این نوع داده وجود ندارند.

# initialize A and B
A = frozenset([1, 2, 3, 4])
B = frozenset([3, 4, 5, 6])

در قطعه کد بالا، دو متغیر A و B از نوع frozenset تعریف شده‌اند. مثال‌های زیر را می‌توان برای درک بهتر موضوع، در شل پایتون بررسی کرد.

>>> A.isdisjoint(B)
False
>>> A.difference(B)
frozenset({1, 2})
>>> A | B
frozenset({1, 2, 3, 4, 5, 6})
>>> A.add(3)
...
AttributeError: 'frozenset' object has no attribute 'add'

فیلم آموزش پایتون مقدماتی

نوع داده مجموعه در پایتون — به زبان ساده

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

آموزش کار با کتابخانه های NumPy و Matplotlib در پایتون

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

فیلم آموزش پایتون با مثال‌های عملی

نوع داده مجموعه در پایتون — به زبان ساده

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

فیلم آموزش پایتون با برنامه‌نویسی شی‌گرا

نوع داده مجموعه در پایتون — به زبان ساده

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

اگر این مطلب برای شما مفید بوده است، آموزش‌ها و مطالب زیر نیز به شما پیشنهاد می‌شوند:

بر اساس رای ۲ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

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

یک نظر ثبت شده در “نوع داده مجموعه در پایتون | به زبان ساده

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد.

مشاهده بیشتر