Syntax | سینتکس
Open in Telegram
Focus: Web Lan: Python & Go Website: https://syntaxfa.ir Quick connect: https://quick-connect.syntaxfa.ir Github: https://github.com/syntaxfa Group: https://t.me/Syntax_fa_group
Show more3 262
Subscribers
+224 hours
+77 days
-330 days
Posts Archive
3 262
EOF
ارور EOF یا "End of File" به معنی پایان فایل است و یکی از ارورهایی است که هنگام خواندن فایلها در برنامهنویسی ممکن است با آن مواجه شوید. این ارور نشاندهنده این است که عملیات خواندن به انتهای فایل رسیده و دیگر دادهای برای خواندن وجود ندارد. کاربردها و اهمیت EOF در برنامهنویسی به چندین مورد مختلف برمیگردد:
کاربردهای EOF
1. پایاندادن به خواندن فایل:
- EOF به برنامهنویس اطلاع میدهد که دیگر دادهای برای خواندن در فایل موجود نیست. این به ویژه زمانی مفید است که شما نمیدانید طول فایل چقدر است و میخواهید کل محتوا را پردازش کنید.
2. کنترل حلقههای خواندن:
- هنگام خواندن دادهها از فایل با استفاده از حلقهها، EOF به شما کمک میکند تا بدانید چه زمانی باید از حلقه خارج شوید. این امر باعث جلوگیری از تلاش برای خواندن دادههای غیرموجود و در نتیجه جلوگیری از خطاهای برنامه میشود.
3. ارتباط با منابع خارجی:
- در ارتباط با منابع خارجی مانند شبکهها یا پایگاههای داده، EOF میتواند نشاندهنده پایان جریان داده باشد. به عنوان مثال، وقتی اطلاعات از یک API دریافت میکنید، EOF میتواند نشان دهد که تمام دادهها دریافت شدهاند.
4. مدیریت دادههای ورودی و خروجی:
- در برنامههای تعاملی که ورودی از کاربر دریافت میکنند، EOF میتواند نشاندهنده پایان ورودی باشد. این امر به ویژه در برنامههای خط فرمان و اسکریپتهای پایپلاین مفید است.
مثالهایی از کاربرد EOF در زبانهای مختلف
مثال در زبان Go
در زبان گو، EOF هنگام خواندن فایلها استفاده میشود تا بدانیم چه زمانی به انتهای فایل رسیدهایم.
package main
import (
"bufio"
"fmt"
"os"
"io"
)
func main() {
file, err := os.Open("filename.txt")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer func() {
if err := file.Close(); err != nil
{
fmt.Errorf(...)
}
}
reader := bufio.NewReader(file)
for {
line, err := reader.ReadString('\n')
if err != nil {
if err == io.EOF {
// اگر به انتهای فایل رسیدیم، از حلقه خارج شویم
break
}
fmt.Println("Error reading file:", err)
return
}
fmt.Print(line)
}
}
مثال در زبان Python
در زبان Python، هنگامی که به انتهای فایل میرسیم، تابع read() یا readline() یک رشته خالی برمیگرداند که نشاندهنده EOF است.
with open('filename.txt', 'r') as file:
while True:
line = file.readline()
if not line:
break
print(line, end='')
#EOF
@Syntax_fa3 262
سوال:
تو پایتون چطور از string builder استفاده کنیم؟
جواب:
تو سایت real python یه مقاله خوب راجبش هست که. یکی از مثال هایی که زده:
from io import StringIO
sentence = StringIO()
while True:
word = input("Enter a word (or './!/?' to end the sentence): ")
if word in ".!?":
sentence.write(word)
break
if sentence.tell() == 0:
sentence.write(word)
else:
sentence.write(" " + word)
print("The concatenated sentence is:", sentence.getvalue())
لینک:
https://realpython.com/python-string-concatenation/
#python #string_builder
@Syntax_fa3 262
https://t.me/boost/Syntax_fa
جای بوس کردن بقیه، کانال سینتکسو بوس کنید روزی یه استوری زیبا میذارم براتون
3 262
الگوریتم Luhn
تاحالا شده که از کاربر شماره کارت و ... رو بگیرید اما نمیدونید چطور میشه در سطح برنامتون اعتبارسنجیش کنید!؟ این پست قراره درباره الگوریتم luhn صحبت کنیم و آخر کار تو کد یه مثال از نحوه اعتبار سنجی شماره حساب بانکی با الگوریتم luhn رو براتون میزنم.
خب قسمت توضیح چت جی بی تی عزیز زحمتو کشیده🤌😘:
الگوریتم Luhn که به عنوان "فرمول Luhn" نیز شناخته میشود، یک الگوریتم ساده برای اعتبارسنجی شمارههای شناسایی است. این الگوریتم توسط Hans Peter Luhn، محقق IBM، در سال 1954 اختراع شده است. الگوریتم Luhn به طور گسترده در اعتبارسنجی شمارههای کارت اعتباری، شمارههای شناسایی ملی، و شمارههای شناسایی دیگر استفاده میشود.
### نحوه عملکرد الگوریتم Luhn
1. ورودی:
- یک رشته از ارقام که باید اعتبارسنجی شود. این رشته معمولاً شامل شماره کارت اعتباری یا شماره شناسایی است.
2. مراحل:
- از سمت راست به چپ شروع کنید و هر عدد دوم را دو برابر کنید. اگر دو برابر کردن یک عدد منجر به یک عدد دو رقمی شد (یعنی بزرگتر یا مساوی 10)، جمع ارقام آن عدد را به دست آورید (برای مثال، 18 تبدیل به 1 + 8 = 9 میشود).
خراب کردی هوش مصنوعی جان😒😒
بذار با یه روش ساده توضیح بدم:
از عدد سمت چپ شروع میکنیم. یکیو ضربدر دو میکنیم. بعدی رو ضربدر یک و حاصل رو جمع میکنیم. اگه موقعی که داریم ضربدر دو میکنیم، عدد بزرگ تر از 9 شد، 9 تا ازش کم میکنیم.
مثلا عدد ما 7 هستش ضربدر دو میشه 14 چون از 9 بزرگ تر شده منهای 9 میکنیم پس میشه 5.
در نهایت حاصل جمعی که بدست آوردیم باید باقی موندش به پیمانه که 10 هستش صفر بشه.
مثال
فرض کنید شماره کارت این شخص عزیز که نمیدونیم کی هستش رو میخوایم اعتبارسنجی کنیم. "6037697646845005" است:
1. از چپ به راست شروع می کنیم اولی ضربدر دو، دومی ضربدر یک، سومی ضربدر دو و ... اگه هم بزرگ تر از 9 شده منهای 9 میکنیم:
result = 3 + 0 + 6 + 7 + 3 + 9 + 5 + 6 + 8 + 6 + 7 + 4 + 1 + 0 + 0 + 5حاصل جمعشون مساوی میشه با 70 پس شماره کارت معتبر هستش 🍸 خب هوش مصنوعی ادامه توضیحاتو بده: کاربردهای الگوریتم Luhn 1. اعتبارسنجی شمارههای کارت اعتباری: - تمامی کارتهای اعتباری صادر شده توسط شرکتهای مالی معتبر از الگوریتم Luhn برای اعتبارسنجی شماره کارتها استفاده میکنند. 2. شمارههای شناسایی ملی: - برخی کشورها از الگوریتم Luhn برای اعتبارسنجی شمارههای شناسایی ملی استفاده میکنند. 3. شمارههای شناسایی محصول: - برخی از کدهای محصول و شمارههای سریال از این الگوریتم برای اطمینان از صحت دادههای ورودی استفاده میکنند. 4. سیستمهای مالی و بانکی: - در بسیاری از فرآیندهای پرداخت و انتقال وجه، الگوریتم Luhn برای بررسی صحت شمارههای حساب و کارتها استفاده میشود. ### مزایا و محدودیتها مزایا: - سادگی و کارایی: الگوریتم بسیار ساده است و به راحتی پیادهسازی میشود. - جلوگیری از خطاهای تایپی: بیشتر خطاهای تایپی در وارد کردن شمارههای شناسایی را تشخیص میدهد. محدودیتها: - امنیت: الگوریتم Luhn برای امنیت طراحی نشده است و نمیتواند از جعل شمارهها جلوگیری کند. - تشخیص محدود: تنها قادر به تشخیص خطاهای ساده است و نمیتواند همه انواع خطاها را شناسایی کند. الگوریتم Luhn به دلیل سادگی و کارایی بالا، به طور گسترده در سیستمهای مختلف برای اعتبارسنجی شمارههای شناسایی مورد استفاده قرار میگیرد. بریم سراغ پیاده سازیش تو گولنگ:
package main
import (
"fmt"
"strconv"
)
func main() {
fmt.Println(Valid("6037697646845005"))
}
func Valid(cardNumber string) bool {
var sum int
for i := 0; i < len(cardNumber); i++ {
intNum, _ := strconv.Atoi(string(cardNumber[i]))
if (i+1)%2 != 0 {
if intNum*2 > 9 {
sum += (intNum * 2) - 9
} else {
sum += intNum * 2
}
} else {
sum += intNum
}
}
return sum%10 == 0
}
#luhn
@Syntax_Fa3 262
خب من بعد مدتها تصمیم گرفتم یه پست بذارم و اونم نتیجه یه تجربه که شاید خیلیا مث من دوس دارن چیزای جدید و بروز رو استفاده کنن.
من روی سیستم شرکت از اوبونتو ۲۳.۰۴ فردای روزی که نسخه lts جدید اومد اپگرید کردم به ۲۴.۰۴ و باگای عجیبی رو دیدم که کافر نبینه و مسلمون نشنوه.
از مصرف زیادی منابع تا پر شدن خیلی سریع حافظه تا اخرین بایت ممکن بخاطر لاگ سیستمی.
ریپورت باگ زدم و بهم توصیه کردن از مطالب فوروم اوبونتو کمک بگیرم :(
باگ عجیبترش این بود که وقتی یه برنامه ای رو مکسیمایز میکردی، حدود یک سوم از صفحه که میشد سمت راست صفحه رو نمیشد با موس انتخاب و کلیک کرد :|
با اپدیت های متوالی هم درست نشد و مجبور شدم حدود یه ماه باهاش سر کنم یه جوری و بیشتر کارامو به سیستم ویندوزی کنم تا سر فرصت داونگرید کنم.
دیروز هم اپدیت ۳۰۰ مگابایتی اومد براش، نصب کردم و دیدم اوکی شده مشکلاتش (بجز حجم زیاد لاگ تولیدی که با روشایی که قبلا لاگ رو لیمیت میکردم جواب نداد)
و کلام اخر اینکه اگه میخواید حدودا بدونید چه زمانی مناسبه که به اوبونتو جدید اپگرید کنید، به نظرم زمانی که مینت میخواد نسخه جدید بده زمان مناسبیه (چون مینت بر پایه اوبونتو هستش).
و من الله توفیق...
@Syntax_fa
3 262
یه روش آوردم صد درصد جوابه💅
میگه:
هربار که یه سوال برنامه نویسی دارم و واقعا به کمک نیاز دارم. میرم تو ردیت پستش میکنم بعد با یه اکانت دیگه یه جواب خیلی پرت میدم.
ملت براشون مهم نیست بهم کمک کنن ولی خیلی دوست دارن جواب اشتباهو تصحیح کنن
#fun
@Syntax_fa
3 262
من هنوز فکر میکنم توضیح بیشتر نیازه ولی این دیگه آخریشه 😂
پس میشه گفت encoding زمانی اتفاق می افتد که یک byte array را به یک فرمت دیگه از byte array تبدیل کنیم ؟
دقیقاً. Encoding فرایندی است که طی آن یک byte array (آرایه ای از بایت ها) به یک فرمت دیگر از byte array تبدیل میشود. هدف از encoding معمولاً این است که دادهها به شکلی تبدیل شوند که برای انتقال، ذخیرهسازی یا نمایش آسانتر یا امنتر باشند.
توضیح بیشتر با مثال
مثال 1:
Base64 Encoding
یک روش encoding است که دادههای باینری را به یک رشته متنی تبدیل میکند که شامل تنها کاراکترهای قابل چاپ (A-Z، a-z، 0-9، +، /) است. این روش معمولاً برای انتقال دادههای باینری به صورت متنی در پروتکلهایی مانند HTTP یا ایمیل استفاده میشود.
import base64
data = b'This is some binary data.'
encoded_data = base64.b64encode(data)
print(encoded_data) # Output: b'VGhpcyBpcyBzb21lIGJpbmFyeSBkYXRhLg=='
# Decoding
decoded_data = base64.b64decode(encoded_data)
print(decoded_data) # Output: b'This is some binary data.'
#### مثال 2: URL Encoding
URL encoding (یا percent encoding)
فرایندی است که طی آن کاراکترهای خاص در یک URL به یک فرمت خاص تبدیل میشوند که برای انتقال از طریق URL مناسب باشد.
import urllib.parse
data = 'This is a string with spaces and symbols: !@#'
encoded_data = urllib.parse.quote(data)
print(encoded_data) # Output: 'This%20is%20a%20string%20with%20spaces%20and%20symbols%3A%20%21%40%23'
# Decoding
decoded_data = urllib.parse.unquote(encoded_data)
print(decoded_data) # Output: 'This is a string with spaces and symbols: !@#'
#encoding
@Syntax_fa3 262
توضیحات ساده تر
مفهوم serialization و encoding گاهی ممکن است کمی گیجکننده باشد، خصوصاً زمانی که صحبت از تبدیل دادهها به فرمتهای مختلف میشود. بیاید یک مثال بزنیم:
تبدیل دیکشنری به JSON
زمانی که یک دیکشنری (یا هر ساختار دادهای دیگر) را به JSON تبدیل میکنیم، این عملیات serialization نام دارد. در این فرآیند، دادههای ساختاریافته به یک رشته متنی تبدیل میشوند. این رشته متنی، نمایشی از دادههای اصلی است که در حافظه برنامه وجود دارد.
JSON به عنوان Byte Array
درست است که هر رشته متنی (مانند JSON) در نهایت به صورت بایتها (byte array) در حافظه ذخیره میشود، اما این تبدیل به طور ضمنی توسط سیستم انجام میشود. یعنی، وقتی ما یک دیکشنری را به JSON تبدیل میکنیم، نتیجه یک رشته متنی (string) است که در حافظه به صورت بایتها ذخیره میشود. این رشته متنی را میتوانیم به یک فایل ذخیره کنیم یا از طریق شبکه ارسال کنیم.
تفاوت بین Serialization و Encoding
- Serialization: فرایندی است که دادههای ساختاریافته را به یک فرمت قابل انتقال یا ذخیرهسازی (مانند JSON یا XML) تبدیل میکند. این عملیات معمولاً شامل تبدیل دادههای پیچیده به رشتههای متنی یا باینری است. هدف از serialization این است که دادهها را به شکلی تبدیل کنیم که بتوان آنها را ذخیره کرد یا از طریق شبکه انتقال داد.
- Encoding: فرایندی است که دادهها را به یک فرمت خاص برای انتقال یا ذخیرهسازی تبدیل میکند. این ممکن است شامل تبدیل دادههای متنی یا باینری به یک فرمت دیگر باشد. برای مثال، تبدیل یک رشته JSON به Base64 یک عملیات encoding است.
پس
زمانی که دیکشنری را به JSON تبدیل میکنیم، نتیجه یک رشته متنی است. این رشته متنی به طور ضمنی به بایتها تبدیل میشود زیرا رشتهها در حافظه به صورت بایتها ذخیره میشوند. اما این تبدیل به بایتها به معنای encoding نیست.
چرا این تبدیل encoding نیست؟
- Serialization: زمانی که دیکشنری را به JSON تبدیل میکنیم، این عملیات serialization است زیرا ما دادههای ساختاریافته را به یک فرمت متنی (JSON) تبدیل کردهایم.
- Encoding: اگر بخواهیم این JSON را به فرمت دیگری (مانند Base64) تبدیل کنیم تا برای انتقال مناسبتر باشد، این عملیات encoding است.
مثال
1. Serialization:
- دیکشنری را به JSON تبدیل میکنیم.
- نتیجه: یک رشته متنی (مثلاً
{"key": "value"}).
2. Encoding:
- JSON را به Base64 تبدیل میکنیم.
- نتیجه: یک رشته متنی دیگر که نمایشی از دادههای اصلی است (مثلاً eyJrZXkiOiAidmFsdWUifQ==).
#serialization #encoding
@Syntax_fa3 262
Serialization و Encoding
Serialization
سریالیزیشن فرآیندی است که طی آن یک شیء (object) در حافظه به یک فرمت قابل حمل تبدیل میشود تا بتوان آن را ذخیره کرد یا از طریق شبکه ارسال نمود. این فرایند شامل تبدیل وضعیت (state) یک شیء به یک رشته بایت (byte stream) است که میتواند بعداً deserialized شود تا شیء اصلی بازیابی شود.
موارد استفاده از Serialization:
- ذخیرهسازی پایدار: برای ذخیرهسازی اشیاء در فایلها یا پایگاه دادهها به طوری که بتوان بعداً آنها را بازیابی کرد.
- انتقال دادهها: برای ارسال اشیاء بین سیستمهای مختلف از طریق شبکه، مثلاً در پروتکلهای ارتباطی یا وب سرویسها.
- کپی عمیق (Deep Copy): برای ایجاد نسخهای دقیق از یک شیء.
فرمتهای متداول Serialization:
- JSON: یک فرمت متنی سبک که برای تبادل دادهها بین سرور و وب مناسب است.
- XML: یک فرمت متنی که برای ذخیره و انتقال دادهها استفاده میشود و بیشتر در سیستمهای سازمانی کاربرد دارد.
- Protocol Buffers: یک فرمت باینری کارآمد و فشرده که توسط گوگل توسعه یافته است.
- Avro: یک فرمت باینری که توسط Apache برای استفاده در سیستمهای بزرگ دادهای توسعه یافته است.
Encoding
فرآیندی است که طی آن دادهها به یک فرمت خاص تبدیل میشوند تا قادر به انتقال یا ذخیرهسازی باشند. این فرایند میتواند شامل تبدیل دادههای متنی به یک فرمت باینری خاص یا تبدیل دادههای باینری به یک فرمت متنی باشد.
موارد استفاده از Encoding:
- انتقال دادهها: برای اطمینان از اینکه دادهها به درستی از طریق شبکه منتقل میشوند.
- ذخیرهسازی دادهها: برای اطمینان از اینکه دادهها به درستی در فایلها یا پایگاه دادهها ذخیره میشوند.
- نمایش دادهها: برای تبدیل دادهها به فرمتی که قابل نمایش یا چاپ باشد.
فرمتهای متداول Encoding:
- UTF-8: یک فرمت متنی که برای رمزگذاری کاراکترهای یونیکد استفاده میشود.
- Base64: یک فرمت متنی که برای رمزگذاری دادههای باینری استفاده میشود به طوری که بتوان آنها را در متنهای ASCII ذخیره یا انتقال داد.
تفاوت بین Serialization و Encoding
1. هدف:
- Serialization: هدف اصلی serialization تبدیل یک شیء به یک فرم قابل حمل است که بتوان آن را ذخیره یا منتقل کرد و سپس دوباره به شیء اصلی تبدیل نمود.
- Encoding: هدف اصلی encoding تبدیل دادهها به یک فرمتی است که قابل انتقال، ذخیره یا نمایش باشد.
2. نوع دادهها:
- Serialization: معمولاً شامل تبدیل اشیاء پیچیده و دادههای ساختاریافته به یک رشته بایت است.
- Encoding: معمولاً شامل تبدیل دادههای متنی یا باینری به یک فرمت خاص برای انتقال یا ذخیرهسازی است.
3. فرایند معکوس:
- Serialization: فرایند معکوس serialization، deserialization نامیده میشود که طی آن رشته بایت به شیء اصلی تبدیل میشود.
- Encoding: فرایند معکوس encoding به decoding معروف است که طی آن دادههای رمزگذاری شده به فرم اولیه خود بازگردانده میشوند.
4. سطح کاربرد:
- Serialization: بیشتر در سطح برنامهنویسی و برای انتقال اشیاء بین سیستمها و ذخیرهسازی پایدار استفاده میشود.
- Encoding: بیشتر در سطح شبکه و انتقال دادهها و برای اطمینان از اینکه دادهها به درستی منتقل یا ذخیره میشوند استفاده میشود.
#encoding
@Syntax_fa
3 262
اگه کارفرمایی
ری اکشنارو میبینی؟
به خودت بیا مرد/زن
وگرنه «شاید برای شما هم اتفاق بیوفتند» 🔪
3 262
پورت صفر:
در مفاهیم شبکه و ارتباطات، پورت 0 یک پورت خاص است و به عنوان پورت "رزرو شده" شناخته میشود. وقتی به یک برنامه یا سرویس شبکه نیاز دارید تا به یک پورت خاص متصل شود، میتوانید از یک شماره پورت عددی استفاده کنید. پورتها از اعداد صحیح بین 0 تا 65535 تشکیل شدهاند.
وقتی یک برنامه یا سرویس به پورت 0 متصل میشود، این به معنای این است که برنامه یا سرویس مورد نظر، سیستم عامل را مکلف میکند یک پورت آزاد و در دسترس را به آن اختصاص دهد.
به عنوان مثال، در برنامهنویسی شبکه، وقتی یک سوکت (socket) برای برقراری ارتباط با سروری فراخوانی میشود و شماره پورت آن را برابر با 0 قرار میدهید، سیستم عامل یک پورت آزاد را به برنامه اختصاص میدهد و برنامه میتواند آن را برای ارتباط استفاده کند.
استفاده از پورت 0 معمولاً برای برنامههایی است که نمیخواهند به طور صریح پورت خاصی را انتخاب کنند، به سیستم اجازه میدهند یک پورت خالی را برایشان انتخاب کند.
برای مثال توی جنگو اگه بنویسید runserver 0 بصورت رندوم یک پورت خالی رو انتخاب می کنه.
#zero_port
@Syntax_fa
