diff --git a/translations/fa-farsi/README.md b/translations/fa-farsi/README.md index f872be4..54df2c5 100644 --- a/translations/fa-farsi/README.md +++ b/translations/fa-farsi/README.md @@ -869,7 +869,7 @@ for i, some_dict[i] in enumerate(some_string): - عبارت مقداردهی `i = 10` به خاطر نحوه کار کردن حلقه‌ها، هیچوقت باعث تغییر در تکرار حلقه نمیشه. قبل از شروع هر تکرار، مقدار بعدی که توسط شیء قابل تکرار (که در اینجا `range(4)` است) ارائه میشه، از بسته خارج میشه و به متغیرهای لیست هدف (که در اینجا `i` است) مقداردهی میشه. -* تابع `enumerate(some_string)`، یک متغیر `i` (که یک شمارنده اقزایشی است) و یک حرف از حروف رشته `some_string` رو در هر تکرار برمیگردونه. و بعدش برای کلید `i` (تازه مقداردهی‌شده) در دیکشنری `some_dict`، مقدار اون حرف رو تنظیم می‌کنه. بازشده این حلقه می‌تونه مانند مثال زیر ساده بشه: +* تابع `enumerate(some_string)`، یک متغیر `i` (که یک شمارنده افزایشی است) و یک حرف از حروف رشته `some_string` رو در هر تکرار برمیگردونه. و بعدش برای کلید `i` (تازه مقداردهی‌شده) در دیکشنری `some_dict`، مقدار اون حرف رو تنظیم می‌کنه. بازشده این حلقه می‌تونه مانند مثال زیر ساده بشه: ```py >>> i, some_dict[i] = (0, 'w') >>> i, some_dict[i] = (1, 't') @@ -969,10 +969,15 @@ False ```py + # بیاید یک سطر تشکیل بدیم + row = [""] * 3 #row i['', '', ''] + # حالا بیاید تخته بازی رو ایجاد کنیم + board = [row] * 3 + ``` **خروجی:** @@ -1036,7 +1041,7 @@ for x in range(7): def some_func(): return x funcs.append(some_func) - results.append(some_func()) # note the function call here + results.append(some_func()) # به فراخوانی تابع دقت کنید. funcs_results = [func() for func in funcs] ``` @@ -1150,7 +1155,6 @@ False - هیچ کلاس پایه واقعی بین کلاس‌های `object` و `type` وجود نداره. سردرگمی که در قطعه‌کدهای بالا به وجود اومده، به خاطر اینه که ما به این روابط (یعنی `issubclass` و `isinstance`) از دیدگاه کلاس‌های پایتون فکر می‌کنیم. رابطه بین `object` و `type` رو در پایتون خالص نمیشه بازتولید کرد. برای اینکه دقیق‌تر باشیم، رابطه‌های زیر در پایتون خالص نمی‌تونند بازتولید بشن. + کلاس A یک نمونه از کلاس B، و کلاس B یک نمونه از کلاس A باشه. + کلاس A یک نمونه از خودش باشه. -- - این روابط بین `object` و `type` (که هردو نمونه یکدیگه و همچنین خودشون باشند) به خاطر "تقلب" در مرحله پیاده‌سازی، وجود دارند. --- @@ -1289,7 +1293,7 @@ True چرا این تغییر درست-نادرسته؟ -#### 💡 Explanation: +#### 💡 توضیحات: - پیاده‌سازی تابع `all` معادل است با @@ -1400,7 +1404,7 @@ True SyntaxError: invalid syntax ``` -#### 💡 Explanation: +#### 💡 توضیح: * تقدم عملگرها بر نحوه‌ی ارزیابی یک عبارت تأثیر می‌گذارد، و در پایتون، عملگر `==` تقدم بالاتری نسبت به عملگر `not` دارد. * بنابراین عبارت `not x == y` معادل `not (x == y)` است که خودش معادل `not (True == False)` بوده و در نهایت به `True` ارزیابی می‌شود. @@ -1417,7 +1421,7 @@ SyntaxError: invalid syntax wtfpython >>> print("wtfpython""") wtfpython ->>> # The following statements raise `SyntaxError` +>>> # کد های زیر خطای سینکس دارند. >>> # print('''wtfpython') >>> # print("""wtfpython") File "", line 3 @@ -1428,12 +1432,14 @@ SyntaxError: EOF while scanning triple-quoted string literal #### 💡 توضیح: + پایتون از الحاق ضمنی [رشته‌های متنی](https://docs.python.org/3/reference/lexical_analysis.html#string-literal-concatenation) پشتیبانی می‌کند. برای مثال، + ``` >>> print("wtf" "python") wtfpython >>> print("wtf" "") # or "wtf""" wtf ``` + + `'''` و `"""` نیز جداکننده‌های رشته‌ای در پایتون هستند که باعث ایجاد SyntaxError می‌شوند، چون مفسر پایتون هنگام اسکن رشته‌ای که با سه‌نقل‌قول آغاز شده، انتظار یک سه‌نقل‌قول پایانی به‌عنوان جداکننده را دارد. --- @@ -1442,9 +1448,10 @@ SyntaxError: EOF while scanning triple-quoted string literal 1\. +‫ یک مثال ساده برای شمردن تعداد مقادیر بولی # اعداد صحیح در یک iterable با انواع داده‌ی مخلوط. + ```py -# یک مثال ساده برای شمردن تعداد مقادیر بولی و -# اعداد صحیح در یک iterable با انواع داده‌ی مخلوط. + mixed_list = [False, 1.0, "some_string", 3, True, [], False] integers_found_so_far = 0 booleans_found_so_far = 0 @@ -1528,7 +1535,7 @@ I have lost faith in truth! --- -### ◀ ویژگی‌های کلاس و ویژگی‌های نمونه +### ◀ متغیرهای کلاس و متغیرهای نمونه 1\. ```py @@ -1599,7 +1606,7 @@ True --- -### ◀ yielding None +### ◀ واگذار کردن None ```py some_iterable = ('a', 'b') @@ -1608,7 +1615,7 @@ def some_func(val): return "something" ``` -**Output (<= 3.7.x):** +**خروجی (<= 3.7.x):** ```py >>> [x for x in some_iterable] @@ -1623,16 +1630,16 @@ def some_func(val): ['a', 'something', 'b', 'something'] ``` -#### 💡 Explanation: -- This is a bug in CPython's handling of `yield` in generators and comprehensions. -- Source and explanation can be found here: https://stackoverflow.com/questions/32139885/yield-in-list-comprehensions-and-generator-expressions -- Related bug report: https://bugs.python.org/issue10544 -- Python 3.8+ no longer allows `yield` inside list comprehension and will throw a `SyntaxError`. +#### 💡 توضیح: +- این یک باگ در نحوه‌ی مدیریت `yield` توسط CPython در ژنراتورها و درک لیستی (comprehensions) است. +- منبع و توضیحات را می‌توانید اینجا ببینید: https://stackoverflow.com/questions/32139885/yield-in-list-comprehensions-and-generator-expressions +- گزارش باگ مرتبط: https://bugs.python.org/issue10544 +- از نسخه‌ی ۳.۸ به بعد، پایتون دیگر اجازه‌ی استفاده از `yield` در داخل درک لیستی را نمی‌دهد و خطای `SyntaxError` ایجاد خواهد کرد. --- -### ◀ Yielding from... return! * +### ◀ بازگرداندن با استفاده از `yield from`! 1\. @@ -1677,7 +1684,7 @@ def some_func(x): + از پایتون نسخه ۳.۳ به بعد، امکان استفاده از عبارت `return` همراه با مقدار در داخل ژنراتورها فراهم شد (نگاه کنید به [PEP380](https://www.python.org/dev/peps/pep-0380/)). [مستندات رسمی](https://www.python.org/dev/peps/pep-0380/#enhancements-to-stopiteration) می‌گویند: -> "... `return expr` در یک ژنراتور باعث می‌شود که هنگام خروج از ژنراتور، `StopIteration(expr)` ایجاد شود." +> دلیل: "... `return expr` در یک ژنراتور باعث می‌شود که هنگام خروج از ژنراتور، `StopIteration(expr)` ایجاد شود." + در حالت `some_func(3)`، استثنای `StopIteration` در ابتدای اجرا به دلیل وجود دستور `return` رخ می‌دهد. این استثنا به‌طور خودکار درون پوشش `list(...)` و حلقه `for` گرفته می‌شود. بنابراین، دو قطعه‌کد بالا منجر به یک لیست خالی می‌شوند. @@ -1752,7 +1759,7 @@ True #### 💡 توضیح: -- `'inf'` و `'nan'` رشته‌هایی خاص هستند (نسبت به حروف بزرگ و کوچک حساس نیستند) که وقتی به‌طور صریح به نوع `float` تبدیل شوند، به ترتیب برای نمایش "بی‌نهایت" ریاضی و "عدد نیست" استفاده می‌شوند. +- در اینجا، `'inf'` و `'nan'` رشته‌هایی خاص هستند (نسبت به حروف بزرگ و کوچک حساس نیستند) که وقتی به‌طور صریح به نوع `float` تبدیل شوند، به ترتیب برای نمایش "بی‌نهایت" ریاضی و "عدد نیست" استفاده می‌شوند. - از آنجا که طبق استاندارد IEEE، `NaN != NaN`، پایبندی به این قانون فرض بازتاب‌پذیری (reflexivity) یک عنصر در مجموعه‌ها را در پایتون نقض می‌کند؛ یعنی اگر `x` عضوی از مجموعه‌ای مثل `list` باشد، پیاده‌سازی‌هایی مانند مقایسه، بر اساس این فرض هستند که `x == x`. به دلیل همین فرض، ابتدا هویت (identity) دو عنصر مقایسه می‌شود (چون سریع‌تر است) و فقط زمانی مقادیر مقایسه می‌شوند که هویت‌ها متفاوت باشند. قطعه‌کد زیر موضوع را روشن‌تر می‌کند، @@ -2244,7 +2251,7 @@ for idx, item in enumerate(list_4): می‌توانید حدس بزنید چرا خروجی `[2, 4]` است؟ -#### 💡 Explanation: +#### 💡 توضیح: * هیچ‌وقت ایده‌ی خوبی نیست که شیئی را که روی آن پیمایش می‌کنید تغییر دهید. روش درست این است که روی یک کپی از آن شیء پیمایش کنید؛ در این‌جا `list_3[:]` دقیقاً همین کار را می‌کند.