<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محمدحسین</title>
        <link>https://virgool.io/feed/@MS27</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-07 16:05:27</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/448445/avatar/iArXgA.jpeg?height=120&amp;width=120</url>
            <title>محمدحسین</title>
            <link>https://virgool.io/@MS27</link>
        </image>

                    <item>
                <title>ریاضی != پایتون، متود های جادویی!</title>
                <link>https://virgool.io/LupineGuys/%D8%B1%DB%8C%D8%A7%D8%B6%DB%8C-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%85%D8%AA%D9%88%D8%AF-%D9%87%D8%A7%DB%8C-%D8%AC%D8%A7%D8%AF%D9%88%DB%8C%DB%8C-qdfurwtwtfyi</link>
                <description>همونطور که میدونید در ریاضی، جابجایی در ضرب و اضافه کردن تاثیری نداره.2 + 5 = 5 + 2ولی جالبه بدونید در زبان برنامه نویسی پایتون، اینطور نیست!اگر تاحالا نگاهی به attribute های آبجکت های پایتون کرده باشید، اجزایی رو دیده اید که اسمشون با __ شروع و تموم میشه. شاید براتون سوال پیش اومده که این ها چی هستند و به چه درد میخورند!؟در این مقاله بعضی از اون هارو توضیح میدیم&gt;&gt;&gt; dir(5)[&#x27;__abs__&#x27;, &#x27;__add__&#x27;, &#x27;__and__&#x27;, &#x27;__bool__&#x27;, &#x27;__ceil__&#x27;, &#x27;__class__&#x27;, &#x27;__delattr__&#x27;, &#x27;__dir__&#x27;, &#x27;__divmod__&#x27;, &#x27;__doc__&#x27;, &#x27;__eq__&#x27;, &#x27;__float__&#x27;, &#x27;__floor__&#x27;, &#x27;__floordiv__&#x27;, &#x27;__format__&#x27;, &#x27;__ge__&#x27;, &#x27;__getattribute__&#x27;, &#x27;__getnewargs__&#x27;, &#x27;__gt__&#x27;, &#x27;__hash__&#x27;, &#x27;__index__&#x27;, &#x27;__init__&#x27;, &#x27;__init_subclass__&#x27;, &#x27;__int__&#x27;, &#x27;__invert__&#x27;, &#x27;__le__&#x27;, &#x27;__lshift__&#x27;, &#x27;__lt__&#x27;, &#x27;__mod__&#x27;, &#x27;__mul__&#x27;, &#x27;__ne__&#x27;, &#x27;__neg__&#x27;, &#x27;__new__&#x27;, &#x27;__or__&#x27;, &#x27;__pos__&#x27;, &#x27;__pow__&#x27;, &#x27;__radd__&#x27;, &#x27;__rand__&#x27;, &#x27;__rdivmod__&#x27;, &#x27;__reduce__&#x27;, &#x27;__reduce_ex__&#x27;, &#x27;__repr__&#x27;, &#x27;__rfloordiv__&#x27;, &#x27;__rlshift__&#x27;, &#x27;__rmod__&#x27;, &#x27;__rmul__&#x27;, &#x27;__ror__&#x27;, &#x27;__round__&#x27;, &#x27;__rpow__&#x27;, &#x27;__rrshift__&#x27;, &#x27;__rshift__&#x27;, &#x27;__rsub__&#x27;, &#x27;__rtruediv__&#x27;, &#x27;__rxor__&#x27;, &#x27;__setattr__&#x27;, &#x27;__sizeof__&#x27;, &#x27;__str__&#x27;, &#x27;__sub__&#x27;, &#x27;__subclasshook__&#x27;, &#x27;__truediv__&#x27;, &#x27;__trunc__&#x27;, &#x27;__xor__&#x27;, &#x27;as_integer_ratio&#x27;, &#x27;bit_length&#x27;, &#x27;conjugate&#x27;, &#x27;denominator&#x27;, &#x27;from_bytes&#x27;, &#x27;imag&#x27;, &#x27;numerator&#x27;, &#x27;real&#x27;, &#x27;to_bytes&#x27;]در پایتون وقتی دو عدد با هم جمع داده میشه، کاربر فقط عددها و علامت + رو وارد میکنه و نتیجه رو دریافت میکنه، اما در پشت صحنه برای پردازش این عمل جمع، متود __add__ اجرا میشه.برای مثال وقتی عدد 3 رو با 5 جمع میکنید (3 + 5)، در حقیقت این عمل انجام میگیره:&gt;&gt;&gt; (3).__add__(5)
8پس طبیعیه که اگر برعکسش رو انجام بدیم (5 + 3)، عمل متفاوتی انجام میشه:&gt;&gt;&gt; (5).__add__(3)
8ولی نتیجه یکسانه، چون دو آبجکتی که ما جمع میکنیم یه نوع دارن و شرط های یکسانی هم برای جمع کردن دارن.حالا بیاید دو تا آبجکت بسازیم که جمع اولی با دومی ممکن، و برعکسش یعنی جمع دومی با اولی غیر ممکن باشه.class ObjectA:
    def __add__(self, obj):
        return f&#039;Added ObjectA to {obj}&#039;

class ObjectB:
    def __add__(self, obj):
        if type(obj) != ObjectA:
            return f&#039;Added ObjectB to {obj}&#039;
        else:
            raise Exception(&#039;You can\&#039;t add a ObjectB to a ObjectA!&#039;)        همونطور که میبینید ObjectA قابلیت اینو داره که با هر آبجکتی جمع بسته بشه ولی ObjectB با ObjectA نمیتونه اینکار رو بکنه.پس دیدید که جابجایی در + میتونه تغییر ایجاد کنه!به اینجور متود ها که به جز call کردن با روش های دیگه ای هم فراخوانی میشن اصطلاحا میگن magic methods یا متود های جادویی.ضرب و تقسیم و خیلی از قابلیتای دیگه هم با این متودا عمل میکنن.چند مثال از متود های جادویی:__add__  | جمع (+)__reduce__ | تفریق (-)__mul__ | ضرب (*)__repr__ | استفاده برای متود repr__divmod__ | استفاده برای متود divmodو بسیار متود های دیگه که میتونید اونارو از این سایت و سایت های دیگر موجود در گوگل دریافت کنید.برای مثالی دیگر متود __str__ رو توضیح میدم.در حالت عادی وقتی کلاستون رو پرینت میکنید یا جایی نمایشش میدید، چیزی مثل عکس زیر دریافت میکنید:&lt;__main__.Tutorial object at 0x7fb1037678b0&gt;ولی با متود __str__ میتونید اونو تغییر بدید!این متود ها برای شی گرایی و ساختن کتاب خونه و فریم ورک خیلی کاربردی هستن و میتونن در user-friendly ساختن محصولتون خیلی کمک کنن.</description>
                <category>محمدحسین</category>
                <author>محمدحسین</author>
                <pubDate>Sat, 09 Jan 2021 13:51:46 +0330</pubDate>
            </item>
                    <item>
                <title>شروع برنامه نویسی ربات تلگرام با پایتون</title>
                <link>https://virgool.io/CodeLovers/%D8%B4%D8%B1%D9%88%D8%B9-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%B1%D8%A8%D8%A7%D8%AA-%D8%AA%D9%84%DA%AF%D8%B1%D8%A7%D9%85-%D8%A8%D8%A7-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-uhws9fsocpa2</link>
                <description>تو این پست نمیخوام یه دوره آموزشی رو شروع کنم و صرفا فقط درباره ربات تلگرام و کدنویسیش تو پایتون رو توضیح میدم طوری که ادامشو بتونید خودتون یاد بگیرید.برای استفاده از متود های تلگرامی دو راه وجود داره:HTTP API تلگرامMTProtoبا ای پی آی ربات های تلگرامی, به سادگی میشه هر دستوری رو در هرزبانی اجرا کردقالب کلی api به این شکل است:https://api.telegram.org/bot&lt;token&gt;/METHOD_NAMEبجای &lt;token&gt; توکنی که از Bot Father گرفته شده و بجای METHOD_NAME دستوری که میخواید ربات اجرا کنه رو جاگذاری کنیدبرای مثال میخوایم با ربات یه پیام به خودمون بفرستیمبرای اینکه ربات بتونه به یه کاربر پیام بفرسته حتما باید اون کاربر رباتو حداقل یک بار /start کرده باشهبرای اینکار از متود sendMessage استفاده میکنیمhttps://core.telegram.org/bots/api#sendmessagehttps://api.telegram.org/bot&lt;token&gt;/sendMessage?chat_id=&lt;your_id&gt;&amp;text=سلامدر این لینک اگر توکن رباتتون و آیدی خودتون رو بجای &lt;your_id&gt; جاگذاری کنید و لینکو با یه مرورگر بارگذاری کنید, ربات متن سلام رو برای شما میفرسته.بقیه دستورات ربات هم با همین روش کار میکنند ولی ورودی‌(Parameter) های مختلفی دارند.ولی ربات هایی که از MTproto استفاده میکنن با این روش کار نمیکنن.ربات های MTProto دقیقا مثل اپلیکیشن تلگرام خود شما عمل میکنن.یعنی برای اولین بار مثل اپلیکیشن باید در اکانت یا ربات لاگین کنن و متود هاشونم مثل اونه.بنابراین قابلیت های یکسانی هم دارند.مثلا وقتی شما یه متنی رو تایپ میکنی و میفرستی, مثل همون کاری هست که یه ربات MTproto موقع sendMessage میکنه.تو این آموزش از فریم ورک pyrogram استفاده میکنیم که با MTproto کار میکنه.پایروگرم بعد از ورژن 1.0.0 کتابخونه async شده و به همین دلیل سرعتش هم بالاتر رفته, ولی برای استفاده از ورژن های بالاتر 1.0.0 باید آشنایی حدودی با async داشته باشید تا در نوشتن کدتون به مشکل نخورید.درغیر این صورت میتونید از ورژن 0.18.0 استفاده کنید ولی امکان داره به این مشکلات بربخورید:دلیت شدن اکانت! یکی از بزرگترین مشکلات پایروگرم ورژن 0.18.0 و پایین تر, اینه که به محض اینکه شما کد رو روی اکانتتون ران میکنید, اکانت دلیت میشه. (اگر اکانتتون با شماره مجازی ساخته شده باشه احتمال دلیت شدن خیلی بیشتره)اگر قابلیت جدیدی به تلگرام اضافه بشه و آپدیت بشه, کتابخونه پایروگرم فقط اون آپدیت هارو روی نسخه async پیاده میکنه, و شما در نسخه 0.18.0 قادر به استفاده از اون قابلیت جدید نیستید.برای همین نسخه پیشنهادی من 1 به بالا یا همون نسخه آخر هست.نصب پایروگرم نسخه آخر:pip install pyrogram tgcryptoنصب پایروگرم نسخه 0.18.0 (sync):pip install pyrogram==0.18.0 tgcryptoبرای شروع کدنویسی, باید Client رو از pyrogram ایمپورت کنیمClient آبجکت اکانت یا ربات ما هست که تمام دستورات توش وجود دارهfrom pyrogram import Clientحالا با استفاده از Client آبجکت رباتمون رو میسازیم.app = Client(&#039;my_telegram_bot&#039;, api_id, api_hash)&#x27;my_telelgram_bot&#x27; اسمی هست که ما برای سشن انتخاب کردیم تا برای هردفعه ران کردن ربات, نیاز به لاگین نداشته باشیمapi_id و api_hash اطلاعات مربوط به api key شما هستکه باید اونارو از My Telegram بگیرید.حالا برای شروع ربات به کار کردن باید متود run رو فراخوانی کنیمapp.run()درحال حاضر کد به این شکله:from pyrogram import Client
app = Client(&#039;my_telegram_bot&#039;, api_id, api_hash)
app.run()کد رو اجرا میکنیم. بعد از اجرا برنامه از ما شماره تلفن و کدی که تلگرام فرستاده رو میگیره, و اگر اطلاعات رو درست وارد کنید از تلگرام براتون پیامی درباره لاگین در اکانتتون میاد.خب ما تونستیم یه ربات روی اکانتمون ران کنیم! ولی حالا چطوری دستوراتو بهش وارد کنیم؟قبل از اون بیاید نگاهی به app.run بندازیم. کل این دستور از این کد تشکیل شده:from pyrogram import idle

app.start()
idle()
app.stop()متود استارت باعث میشه ربات شروع به کار کردن کنهبعد از استارت idle برنامه رو وارد یه حلقه بینهایت میکنه تا ربات همیشه بتونه update ها و پیام هارو دریافت کنهوقتی برنامه با Ctrl-C یا هر نحو دیگه ای kill بشه, از حلقه idle خارج میشه و app.stop رو اجرا میکنه تا دیتابیس برنامه رو ببنده.تمام دستورات باید بعد از start شدن و قبل از stop شدن ربات اجرا بشه.حالا برای مثال با دستور send_message یه پیام میفرستیم.این دستور پارامترهای زیرو میگیره که chat_id و text الزامی هستن.همونطور که گفته شد باید دستورات بین استارت و استاپ نوشته بشنولی میتونیم از with هم استفاده کنیم, with app قبل از کدی که زیرش نوشته میشه app رو استارت و بعد از اون app رو استاپ میکنه. یعنی دقیقا همون چیزی که ما میخوایم!from pyrogram import Client
app = Client(&#039;my_telegram_bot&#039;, api_id, api_hash)

with app:
    app.send_message(&#039;me&#039;, &#039;تست&#039;)بجای پارامتر chat_id, کلمه me قرار داده شده که منظور همون اکانتیه که ربات روش ران شده,به عبارتی پیام به Saved Messages فرستاده میشه.به جز send_message میتونید از هر متودی که میخواید استفاده کنید, لیست کامل دستورات رو میتونید از این لینک دریافت کنیدبرای دریافت پیام ها و آپدیت ها, برنامه باید همیشه درحال کار کردن باشه پس باید از app.run استفاده کنیم و روش بالا جوابگو نیست.در ربات های تلگرامی چند نوع آپدیت گرفته میشه که پر استفاده ترینشون این ها هستند:Message - هر پیامی که توی چت دیده میشهCallback - وقتی روی دکمه شیشه ای کلیک میشهInline - وقتی یوزرنیم یه ربات اینلاین توی چت نوشته میشه و ربات جواب میدهبرای دریافت پیام, از دیکوریتور on_message استفاده میکنیم.@app.on_message()
def message_handler(client, message):
    print(&#039;I received a message!&#039;)به این صورت, هروقت پیامی به کلاینت فرستاده میشه, آبجکت appـی که پیام رو دریافت کرده به client, و آبجکت Message ساخته شده با پیام به متود پاس داده میشه و متود رو اجرا میکنه و عبارت I received a message چاپ میشه.حالا مشکل اینجاست که هرپیامی بیاد تابع اجرا میشه, باید از filters استفاده کنیم تا نحوه دریافت پیام رو محدود کنیم.به خط اول برمیگردیم و filters رو ایمپورت میکنیم:from pyrogram import Client, filtersنسخه 0.18.0 و پایین تر:from pyrogram import Client, Filters as filtersبرای مثال برای دریافت پیام هایی که به صورت دستور هستند از filters.command استفاده میکنیم:@app.on_message(filters.command(&#039;start&#039;))
def start_command(client, message):
    print(&#039;I received /start command!&#039;)در کد بالا هر پیامی که با کلمه /start شروع شه موجب اجرای تابع start_command میشه.لیست کاملی از فیلتر ها رو میتونید از این لینک دریافت کنیدخب حالا چجوری به پیام دریافت شده پاسخ بدیم؟اگه یادتون باشه برای فرستادن پیام به خود کلاینت, از &quot;me&quot; بجای پارامتر chat_id در متود send_message استفاده کردیم.ولی چت آیدی کسی که پیامو فرستاده رو میتونیم از message خارج کنیم!message.chat چتی هست که پیام داخلش فرستاده شدهو message.chat.id هم آیدی اون چت.همونطور که گفته شد, client هم دریافت کننده پیام هست.پس:@app.on_message(filters.command(&#039;start&#039;))
def start_command(client, message):
    client.send_message(message.chat.id, f&#039;Salam {message.from_user.first_name}&#039;)این کد به کسی که دستور /start رو ارسال کنه یه پیام حاوی اسمش میفرسته!message.from_user کسی هست که پیامو فرستاده و تمام اطلاعاتش هم تو همین آبجکت قرار دادهمثلا ما از message.from_user.first_name استفاده کردیم که اسم فرستنده پیامه.از بقیه اطلاعات message هم میتونید به نحوی که میخواید ارسال کنید.لیست کامل اطلاعات message رو میتونید از این لینک دریافت کنیدکتابخونه پایروگرم یه سری Bound Method واسه راحتی کار ما درست کرده,درواقع این متود ها دقیقا متود های Client هستن با این تفاوت که بعضی پارامتر ها خودکار داده میشن تا کار رو برای ما آسون کنن‌Bound Method: message.reply_textما هم در این کد از message.reply_text استفاده میکنیم تا خیلی راحت تر و تمیز تر به کاربر جواب بدیم:@app.on_message(filters.command(&#039;start&#039;))
def start_command(client, message):
    message.reply_text(f&#039;Salam {message.from_user.first_name}&#039;)همونطور که میبینید این متود همونکار send_message رو انجام میده ولی پارامتر های chat_id و reply_to_message_id خودکار داده شدن.برای دریافت همه Bound Method ها روی این لینک کلیک کنید.کد نهایی:from pyrogram import Client, filters

app = Client(&#039;my_telegram_bot&#039;, api_id, api_hash)

@app.on_message(filters.command(&#039;start&#039;))
def start_command(client, message):
    message.reply_text(f&#039;Salam {message.from_user.first_name}&#039;)

app.run()خب این از یه سری توضیحات درباره ربات تلگرام و پایروگرم و نحوه کار کردنشون.هر متود یا تایپ یا چیز دیگه ای که خواستید استفاده کنید میتونید از داکیومنت پایروگرم توضیحاتشو بخونید.Pyrogram Documentationبرای یادگیری اون Callback و Inline و چیزای دیگه میتونید از بخش مثال ها کمک بگیرید.Pyrogram Code Examplesامیدوارم این پست بتونه بهتون کمک کنه. یاعلی.</description>
                <category>محمدحسین</category>
                <author>محمدحسین</author>
                <pubDate>Sat, 02 Jan 2021 23:46:11 +0330</pubDate>
            </item>
                    <item>
                <title>پنج نکته کلیدی که هر برنامه نویسی نیاز داره</title>
                <link>https://virgool.io/@MS27/%D9%BE%D9%86%D8%AC-%D9%86%DA%A9%D8%AA%D9%87-%DA%A9%D9%84%DB%8C%D8%AF%DB%8C-%DA%A9%D9%87-%D9%87%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%86%DB%8C%D8%A7%D8%B2-%D8%AF%D8%A7%D8%B1%D9%87-vlr8lkvx9ude</link>
                <description>تو این پست پنج نکته یا رهنمایی مینویسم که امیدوارم بتونه مفید باشه.۱- با گوگل دوست شید.توی گوگل هزاران منبع و پرسش پاسخ با ارزش هست که شاید سوال شما هم بوده باشه.خیلی وقتا سوالایی برامون پیش میاد که میخوایم یه کار خاصیو در خصوص یه چیزی انجام بدیم. مثل:چجوری متن صفحه رو بزرگ کنم؟توی فلان زبان برنامه نویسی چجوری فلان کارو بکنم؟ یا حتی چیزای خارج از برنامه نویسی مث آشپزی و غیره.میتونم بگم جواب ۹۰ درصد این سوالا رو میتونید تو گوگل پیدا کنید.هر سوالی و هر مشکلی که براتون پیش اومد احتمال داره که قبلا برای دیگران هم پیش اومده باشه و اونو تو سایت های مختلف پرسیده باشن.بعضی وقتا کدتون به مشکل برمیخوره و یه اروری به شما میدهاگر فهمیدید منظور ارور چیه که سرچ کنید که چطوری حلش کنید و اگر نه,  دقیقا خود متن ارورو کپی کنید و تو گوگل بزنید!یک توصیه: سعی کنید هر سرچی که میکنید انگلیسی باشه چون خیلی مطالب تو سایتای فارسی نیست. حتی اگر شده از گوگل ترنسلیت استفاده کنید و فارسی سرچ کردنو بزارید انتخاب آخر.میدونم اولش شاید ندونید چه سرچی بزنید و حتی سخت و عجیب باشه ولی بهتون قول میدم نتیجه خوبی میگیرید و عادت میکنید.یک سایت کاربردی هم در این مورد بگم:Stack Overflowاستک اور فلو بهشت برنامه نویساس. خیلی از مشکلات و سوالایی که دارید از قبل پرسیده شده و اگه نتونستید به جواب برسید میتونید خودتون یه سوال بپرسید و هرکی که جوابو بدونه میتونه کمکتون کنهو خیلی سایتای دیگه هست که توی حل ارورا و سوالا کمکتون میکنن و توی همون گوگل پیدا میشن۲- از آزمایش و امتحان نترسید.وقتی یه تکنولوژی یا یه چیز جدید دستتون میاد, هرکاری که میتونید توش تست کنید!از خراب شدن یا به مشکل برخوردن هم نترسید.چون با این روش با اینکه غیر عادیه خیلی چیزا میشه یاد گرفتو با نکته اولی هم که گفتم خیلی خراب کاریارو میشه درست کرد۳- هر چیزی که یاد میگیرید رو انجام بدید.کد هایی که از یک مقاله یا فیلم رو یاد میگیرید, هرچند آسون باشن و فهمیدنشون با همون فیلم امکان پذیر باشه رو اجرا کنید.درسته که نتیجه ای که به دست میاد دقیقا مثل همون آموزشه ولی این روش باعث میشه که کد رو خیلی بهتر بفهمید.۴- به هیچ وجه کپی پیست نکنید.سعی کنید کد هایی که از آموزش یاد میگیرید رو بفهمید و خودتون بنویسید.ولی حتی اگر نتونستید, کد رو کاملا تایپ کنید.روش عجیبیه ولی از کپی کردن نتیجه خیلی بهتری داره۵- چجوری برنامه نویسیو شروع کنم؟در مرحله اول فک میکنم بهتر باشه که بفهمید مفهوم برنامه نویسی چی هست و الفبای برنامه نویسی رو یادبگیریدکه در این مورد من ویدیوی درک برنامه نویسی جادی رو پیشنهاد میکنم.لینک یوتیوبلینک آپاراتبعد از اون باید بفهمید که چه زبان های برنامه نویسی ای کاربردشون بیشتره و رو بورسن و هرکدوم چه کاربردی دارنکه میتونید توی گوگل زبان های پرکاربرد و معروف و پیدا کنید.و میتونید بر اساس هدف و علاقتون ادامه بدید.چند منبع خوب برای یادگیری:ویدیو های Corey Schaferویدیو های جادیW3Schoolsاین سایت یک منبع خوب برای یادگیری یک زبان برنامه نویسیه.در هر مقاله هر بخش از زبان رو طبقه بندی کرده, و در هر بخش کامل مطلبو توضیح دادههر کدی که به شما آموزش داده میشه, قابلیتی داره برای اجرا کردن کد و بهتر فهمیدنش داخل سایت.و در آخر هر مطلب هم از شما چند سوال و تست ساده پرسیده میشه.سایت تاپ لرنسایت فرادرسسایت فرانشامیدوارم که این متن بتونه براتون مفید باشه ?❤️</description>
                <category>محمدحسین</category>
                <author>محمدحسین</author>
                <pubDate>Thu, 10 Dec 2020 15:09:55 +0330</pubDate>
            </item>
            </channel>
</rss>