Python for Data Science
314 subscribers
127 photos
16 videos
12 files
61 links
اطلاعات مفید جهت یادگیری پایتون برای علم داده
Download Telegram
Forwarded from سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی (SeYeD.Dev)
یک لیستی میخوایم داشته باشیم که تعداد مشخصی داده بگیره و اگر اضافه تر بشه از اولش حذف کنه اینطوری اگر داده ای رو اضافه کنیم به اندازه طول لیستمون میمونه و بعدش حذف میشه

راه حل ساخت چنین لیستی چی هستش ؟یک راهکار ساده اینه که با اینسرت به ایندکس صفرم اضافه کنیم و بعد دوباره محتوای لیست رو بهش بدیم به همون تعداد که میخوایم

def list_insert(item, limited_list):
limited_list.insert(0, item)
return limited_list[:10]

ids = []
ids = list_insert(1, ids)

اما یک راهکار بهتر هم هست 😚

import collections
ids = collections.deque(maxlen=10)

به همین راحتی. الان ids یک لیسته که میتونید توش دیتا اضافه کنید و مثلا اگر اعداد یک تا ده اضافه کنید وقتی ۱۱ اضافه میکنید یک پاک میش

🖥 @SEYED_BAX
Please open Telegram to view this post
VIEW IN TELEGRAM
Python for Data Science
در رابطه با deque یه کد نمونه براتون میذارم
فرض کنید میخواید یه مجموعه‌ای از آیتمها رو توی خروجی چاپ کنید
این آیتمها اینقدر مهم نیست که همش نیاز باشه چاپ بشه اینقدر هم بی اهمیت نیست که در حد یک خط سریع چاپ کنیم و پاکش کنیم

راه حل چیه؟

بیایم و n آیتمها آخر رو توی خروجی چاپ کنیم برای اینکار باید بتونیم خطوط قبلی رو هم پاک کنیم
کد زیر نمونه‌ای از استفاده از deque برای نگهداری خطوط چاپ شده‌ی قبل (تا nخط) هست


from collections import deque
from random import choices, randint
from string import ascii_letters
from sys import stdout
from time import sleep

deq = deque(maxlen=5)
delay = 0.15
sep = " "


def get_random_items(num):
n = randint(2, 10)
return [num, *choices(ascii_letters, k=n)]


args_list = [get_random_items(i) for i in range(50)]

for args in args_list:
# clear last print lines
for _ in range(len(deq)):
stdout.write("\x1b[1A\x1b[2K") # move up cursor and delete whole line

# prepare new lines
deq.append(
sep.join(map(lambda x: str(x), args))
) # remove first element and append new to the end

# re-print the lines
stdout.write("\n".join(deq) + "\n")
sleep(delay)

سورس کد

#آموزش

🔎 @py4ds
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
🔺 یه نسخه اولیه از کتابخونه komet رو توی pypi منتشر کردم.

این کتابخونه رو میتونید با دستور زیر نصب کنید
pip install komet

نمونه کد زیر نشون میده که این کتابخونه چطوری کار می‌کنه


from komet import TailPrint

tprint = TailPrint(max_count=10, delay=0.15)

tprint("#### Step 1 ####")

for i in range(50):
tprint(i, end=" * " if i % 2 == 0 else "\n")

tprint("#### Step 2 ####")

tp2 = TailPrint(5) # override by previous instance (singleton)
for i in range(200, 250):
tp2(i)



این کتابخونه که بر اساس کدی که دیروز منتشر کرده بودم با استفاده از یک deque و الگوی Singleton یه آبجکت بهتون میده که میتونید به جای پرینت معمولی ازش استفاده کنید

این کتابخونه هیچ پیشنیازی نداره و به صورت خالص با خود پایتون نوشته شده همچنین سعی کردم از دستورات جدیدتر استفاده نکنم که با پایتون‌های +۳.۷ هم سازگار باشه
پ.ن: روی ۳.۶ تست نکردم ولی احتمالا مشکلی نداشته باشه

🔎 @py4ds
This media is not supported in your browser
VIEW IN TELEGRAM
👨🏻‍💻فیلم با کیفیت از اجرای کد
🔎 @py4ds
📗 #معرفی_کتاب
Grokking Algorithms
Aditya Bhargava

🔺این کتاب با زبانی بسیار شیوا الگوریتم‌های عمومی در حل مسائل مختلف (مثل جستجوی دودویی، مرتب سازی و غیره) رو توضیح داده

🔺این کتاب به دوستانی که قصد مطالعه کتاب Data Structures & Algorithms in Python رو دارن توصیه میشه.

🔎 @py4ds
🔺چند روزی هست که با کمک یکی از دوستان یه پروژه جالب شروع کردم.

🔹توی این پروژه میتونید از پوشه یک پکیج از قبل آماده شده، دو پکیج whl که یکی به صورت obfuscate شده (اصلی) و یکی فقط شامل interfaces ساختارها هست بسازید.

👈پروژه اینجاست هنوز README اش آماده نشده ولی میتونید فعلا یه نگاه بهش بندازید.

در روزهای آینده بیشتر در موردش صحبت می‌کنم.
🔎 @py4ds
🔺 یک ویژگی جدید در پایتون ۳.۱۱

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

🔹یه راه ساده اینه که از روش زیر استفاده کنیم

import os
from contexlib import contextmanager

@contextmanager
def enter_dir(path):
old_path = os.getcwd()
os.chdir(path)
try:
yield
finally:
os.chdir(old_path)


🔸توی پایتون 3.11 یه context manager برای این کار به صورت زیر اضافه شده:

import os
from contextlib import chdir

print('before:', os.getcwd())
# before: /home/py4ds
with chdir('/'):
print('inside:', os.getcwd())
# inside: /
print('after:', os.getcwd())
# after: /home/py4ds


به همین راحتی و تمیزی!
#py311

🔎 @py4ds
👍4
🔺 حذف استرینگ خالی در split

>>> s = 'abc,'
>>> s.split(',')
['abc', '']
>>> [item for item in s.split(',') if item]
['abc']

😊 Fast and clean

🔎 @py4ds
👍2
Forwarded from سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی (SeYeD.Dev)
💥 حذف استرینگ خالی در split


>>> s = 'سایر رسانه ها,'
>>> s.split(',')
['سایر رسانه ها', '']
>>> list(filter(None, s.split(',')))
['سایر رسانه ها']

❤️ @SeYeD_BaX
Please open Telegram to view this post
VIEW IN TELEGRAM
سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی
💥 حذف استرینگ خالی در split >>> s = 'سایر رسانه ها,' >>> s.split(',') ['سایر رسانه ها', ''] >>> list(filter(None, s.split(','))) ['سایر رسانه ها'] ❤️ @SeYeD_BaX
🎯یه مقایسه روی این دوتا روش داشته باشیم
پست ریپلای و این پست

🔺به طور کلی استفاده از تابع فیلتر به همراه lambda می‌تونه سرعت رو بیاره پایین

اما اینجا خبری از lambda نیست پس نتیجه هم احتمالا کند نیست

یه بررسی اجمالی داشتم روی حالت‌های مختلف:
حالتی که خودم توی کانال گذاشتم هم سریع هست هم تمیز اما حالتی که دوستمون نوشتن برای مواردی که رشته طولانی و تعداد splitها زیاد بشه می‌تونه کمی(شاید حدود کمتر از ۲-۳ درصد) سریعتر باشه

🔺 توجه کنید که این یه حالت خاص هست و خود پایتون هم توصیه می‌کنه که اگر نیاز به لیست هست بهتره از list comprehension (روش اول) استفاده بشه

❗️به طور کلی بهتره اگر نیاز به لیست ندارید کد رو طوری بنویسید که با جنریتور(خروجی مستقیم filter,map,...) کار کنه؛ اینطوری حالت ایده‌آل هست!

🔎 @py4ds
🔥4
Python for Data Science
🔺چند روزی هست که با کمک یکی از دوستان یه پروژه جالب شروع کردم. 🔹توی این پروژه میتونید از پوشه یک پکیج از قبل آماده شده، دو پکیج whl که یکی به صورت obfuscate شده (اصلی) و یکی فقط شامل interfaces ساختارها هست بسازید. 👈پروژه اینجاست هنوز README اش آماده نشده…
🔺قبلا در این مورد صحبت کرده بودم
اما الان میخوام بیشتر توضیح بدم

‼️یکی از قابلیت‌های پایتون این هست که شما میتونید کدهایی با سورس بسته تولید کنید اصطلاحا به این مدل کدها کدهای آبفاسکیت یا مبهم شده میگن

❗️کدی که آبفاسکیت میشه می‌تونه بعد از یک مدت زمان خاص اکسپایر بشه و دیگه اجرا نشه یا مثلا فقط از طریق یک ماژول خاص(استارتر) اجرا بشه و ماژول‌های دیگه‌ی اون به تنهایی اجرا نشن

چرا کد نیاز به کد آبفاسکیت داریم؟ دلایل زیادی ممکنه وجود داشته باشه از جمله توسعه دانشهایی که برای یک شرکت درآمدزایی داره و با عمومی شدنش ممکنه به درآمد شرکت ضربه زیادی وارد بشه. دلیل دیگه اینه که ممکنه ویرایش یک کد باعث اختلال توی الگوریتم از پیش تعیین شده بشه پس برای اینکه از تغییرات جلوگیری بشه اونو آبفاسکیت میکنن

در اینکه آیا این کار مفید هست یا نه میشه بحث کرد. شاید یه جایی واقعا آبفاسکیت کردن ضررش بیشتر از سودش باشه!

اما در مورد پروژه
من قبلا با کدهایی کار میکردم که آبفاسکیت بودن و مبهم شدنشون باعث میشد نشه به متدها و خواص داخلی اشیایی که کدشون آبفاسکیت شده دسترسی داشت
در کل برای کسی که داره از یک کد آبفاسکیت شده استفاده می‌کنه هیچ چیزی عذاب آور تر از این نیست که بعد از دات چیزی رو نبینه🤯


این پروژه دقیقا چیه؟
یک قالب هست برای کدهایی که قراره آبفاسکیت بشن و در اختیار دیگران قرار بگیرن🫤

چطوری کار می‌کنه؟
شما باید کدتون رو در قالب یک پکیج پایتونی آماده کنید! یکی از مهمترین بخش‌های این کار هم نوشتن فایل setup.py هست😮

👈کد خودتون رو میتونید توی یه پوشه مشابه چیزی که می‌بینید template/src_pkg بذارید

🫵یادتون باشه که یه پروژه خوب پروژه‌ای هست که بشه متدها و توابع داخلی‌اش رو هم دید پس بهتره که یه پوشه مثل template/stub_pkg هم داشته باشید و توی اون هم یه فایل setup.py برای پکیج stub بذارید

پکیج stub چیه؟
توصیه میکنم برای درک بهتر pep561 رو بخونید.
خلاصه: این یک پکیج شامل فایل‌هایی مشابه با ساختار پروژه هست که هیچ کد قابل اجرایی توش نیست و صرفا یک سری فایل با پسوند .pyi توش هست که نام تمام ساختارهایی مثل توابع و کلاس‌ها و همچنین نام و نوع پارامترهای ورودی و نوع خروجی اونها با استفاده از type hinting تعریف شده!
تمام ‌LSP(Language Server Protocol) ها ابتدا دنبال فایل‌های .pyi میگردن و ساختار پروژه رو از روی اون به کاربر نشون میدن؛ اگر چنین فایلی وجود نداشت میرن سراغ فایل .py
🫴پس اینجا یه امکان خوب داریم تا ساختار پروژه رو(بدون کدهای داخلی) توش نشون بدیم!

من بلد نیستم فایل .pyi رو بنویسم چیکار کنم؟
پکیج mypy توسط بزرگان پایتون از جمله خود آقای روسوم در حال توسعه هست این پکیج ابزاری(stubgen) داره که میتونید باهاش این فایل‌ها رو ایجاد کنید🤗

تهش رو بگو خسته شدیم!
هیچی دیگه این پروژه ۲ تا پکیج whl براتون میسازه یکی پکیج اصلی شما به صورت آبفاسکیت هست و دیگری هم پکیج stub که هر دو رو میشه با pip نصب کرد
🤌خوبیش اینه که حداقل کد آبفاسکیت رو میشه ورژن زد و روی مخزن‌های pipطور، نگهداری کرد و اینکه تغییرات ساختاری اون رو هم با پکیج stub دید!
🤝

🔎 @py4ds
👏4
Forwarded from 🐍 Python & Raspberry 🐍 (DailyProjects)
✔️ شاید با شنیدن کلمه‌ی ORM همه‌‌مون یاد SQLAlchamy یا Django ORM بیوفتیم، باشه اینا خیلی خوبن ولی لایبرری‌های جدیدی که نوشته میشن دارن از تمام language feature‌های نایس عه پایتون ۳ خصوصا 3.6 به بعد (Type Hints, F strings and async/await)
با قدرت استفاده میکنن و زیبایی خلق میکنن.

پیکولو، یکی از همین کتابخونه‌هاست.
نویسنده‌ی پیکولو چون از اوایل روزهای کاریش غرق در دنیای async بوده این ORM رو به صورت async first مینویسه :))
ولی میشه ازش به صورت sync هم استفاده کرد.

✔️ از دیگر ویژگی‌هاش
• A builtin playground, which makes learning a breeze.

• Tab completion support - works great with iPython and VSCode.

• Batteries included - a User model, authentication, migrations, an admin GUI, and more.

• Modern Python - fully type annotated.

• Make your codebase modular and scalable with Piccolo apps (similar to Django apps) 👌


میتونید ازش به عنوان یه کوئری بیلدر استفاده کنید:
# Select:
await Band.select(
Band.name
).where(
Band.popularity > 100
)

یا مثل یه ORM عادی باهاش رفتار کنید:
# To fetch an object from the database, and update it:

b = await Band.objects().get(Band.name == 'Pythonistas')
b.popularity = 10000
await b.save()


✔️ این ORM بهترین عملکرد رو با postgresql داره ولی از sqlite هم پشتیبانی میکنه و همچنین قسمت زیبای ماجرا اینه که از:
Starlette, FastAPI, BlackSheep, Xpresso and Starlite are currently supported.
هم برای ساختن web app های نایس پشتیبانی میکنه :))

🐙 https://github.com/piccolo-orm/piccolo

#m4hdi
#ORM
#library
#async

©raspberry_python

دنبال کردن هشتگ m4hdi
دنبال کردن هشتگ orm
دنبال کردن هشتگ library
دنبال کردن هشتگ async
🔹 تاپل(tuple) در پایتون

چیزی که معمولا در رابطه با پایتون آموزش داده میشه اینه که تعریف تاپل با استفاده از پرانتز انجام میشه

📍دو عبارت زیر رو ببینید

a = (5)
b = 5,

type(a) # int
type(b) # tuple


🔺با وجود داشتن پرانتز چرا a تاپل نیست؟
🔹جواب: چون هیچ علامت «کاما» یی وجود نداره که سمت راست رو به صورت یک ساختار چندمقداری نشون بده ضمن اینکه پرانتز یکی از علائم ریاضی هست و به این صورت ۵ داخل پرانتز با عدد ۵ تفاوتی نداره 😃

🔺آیا برای تعریف تاپل حتما به پرانتز نیاز داریم؟
🔹جواب: خیر! برای تعریف تاپل بیشتر از پرانتز به کاما احتیاج داریم!😉


🔺فرق لیست و تاپل چیه؟
🔹جواب: مهمترین تفاوت‌شون، تغییر پذیری لیست و تغییر ناپذیری تاپل هست؛ به این صورت که عناصر لیست ساخته شده بدون بازتعریف و با استفاده از قابلیت‌های پایتون یا متدهای داخلی خودش میتونه حذف یا اضافه بشه اما هرنوع دستکاری قابل انجام روی تاپل، منجر به بازتعریف اون میشه!

🔸منظور از بازتعریف: حذف کردن از حافظه و ایجاد دوباره اون در حافظه

🔺فرق‌های دیگه‌شون چیه؟
🔹جواب: تاپل متدهای کمی داره (۲تا) اما لیست یازده متد برای دستکاری و تغییر داره اما این مسئله باعث میشه که سرعت پردازش در تاپل نسبت به لیست بیشتر باشه!

🔺تاپل کجا به درد میخوره؟
🔹جواب: معمولا هرجایی که نیاز به مجموعه ثابتی از عناصر مرتب دارید میشه استفاده کرد مثلا زوج مرتب، ۳تایی مرتب و ...
☑️شکل متداولی که برای زوج مرتب نوشته میشه به این صورت هست
pairs = [(1,2), (3,4), (5,6)]

🔺چرا اینطوری👇 نمی‌نویسن؟
([1,2], [3,4], [5,6])
🔹جواب: عناصر داخلی تاپل لیست هستن و ممکنه در اثر کدنویسی اشتباه تغییر کنن اما لیستی از تاپل‌ها احتمال اشتباه کمتری داره و زوج مرتب‌ها تغییرناپذیر هستن!
🔸ضمن اینکه کپی کردن(کم عمق) لیستی از تاپل‌ها نتیجه کاملا مستقلی میده ولی کپی کردن(کم عمق) تاپلی از لیست‌ها منجر به نتیجه مستقل نخواهد شد!


import copy

a1 = ([1,2], [3,4], [5,6])
b1 = copy.copy(a1)

b1[0][0] = 7

print(a1)
print(b1)

#output:
# ([7,2], [3,4], [5,6])
# ([7,2], [3,4], [5,6])


🔸اما اگر از ساختار لیستی از تاپل‌ها استفاده کنیم چنین مشکلی پیش نمیاد چون اصولاً نمیشه مقداری رو درون تاپل تغییر داد و حتی اگر هم تغییر بدیم روی مقدار اصلی تغییری اتفاق نمی‌افته!👌

🔎 @py4ds
👍3
Forwarded from جنگولرن
آیا همیشه بهتره از آخرین نسخه پایتون برای همه پروژه ها استفاده کنیم؟
نظر چند تا از دوستان با تجربه در این مورد:

✔️یکسری پکیج هایی که اپدیت ندادن از ۳.۹ به ۳.۱۰ نیاز به یکسری تغییرات ریز دارن که باید فورک کنی دستی اپدیت کنی. ولی من خودم از ۳.۱۰ استفاده میکنم همه جا

✔️چون رو ۳.۱۰ یک تایمی انقدر سر پکیج ها ارور خوردم اومدم ۳.۹ همچی اوکی بود و اینکه الان دیفالت ۳.۱۰ وصله اوکی، ولی قدیمی ها روی ۳.۸ و ۳.۹ موندن دیگ

✔️تقریبا تمام پروژه هایی که تجاری هستن پایتون ۳.۸ و ۳.۹ استفاده میکنم. پروژه های استارتاپی و شخصی و ... آخرین نسخه پایتون (فکرکنم ۳.۱۱) برای من اینطوریه. روی همین ۳.۸ و ۳.۹ تا حالا چندین بار سر package conflict سرویس شدیم جرات نداریم بالاتر ببریم توی پروژه هایی که حساسن

✔️ببین من معتقدم که بسته به نیازت باید بری جلو و میدونم این خیلی کلیشه ای هست ولی اگر کاری نداشته باشم و لنگ نسخه بالا تر نباشم ۳.۹ ولی مثلاً من الان تفاوت سرعتم با ۳.۱۰ مشهوده و نیاز دارم سریع تر باشم توی یه پروژه دیگه با ۳.۱۰ میرم جلو

🙏🏻 شما هم نظر خودتون رو بدید (خصوصی هم بگید اوکیه). نظرات بقیه رو هم به کامنت ها اضافه میکنم
👍2
😄

🔎 @py4ds
😁2
Forwarded from مطالب رایگان و آزاد🎈 ( behrad)
مشکل سال 2038 چیست؟!

سوالش باحالیه مگه نه؟! نه پایان جهان نیست، تقویم قوم شبه‌مایاها هم تموم نمیشه، فضایی‌ها هم حمله نمیکنن... یه اتفاق خطرناکتری ممکنه بیفته...🤭

ممکنه زمان کامپیوتر شما یهو 137 ســـــــــــــــال برگرده به عقب🥴

=+=+=+=+=+=+=+=+=+=+

حوالی سال 1970 که داشتن پروتکلهارو طراحی میکردن، باید مفهوم زمان رو با دقت ثانیه توی پروتکلهای مختلف یجوری ذخیره میکردن...

یه استانداردی دادن به اسم
Timestamp
یا برچسب زمانی، یه استاندارد یونیکسی هست که الان اکثر سیستمهای ما + اینترنت با اون کار میکنه،
مقدارش تعداد ثانیه‌هایی هست که از سال 1970 تا این لحظه گذشته...😬

یعنی 1970 رو گرفتن مبدا زمان و با این کار 69 سال قبل و بعد از 1970 توی کامپیوتر مدل کردن.

مثلا تایم‌استمپ لحظه فعلی که من دارم این پیامو مینویسم هست:
1678537870

این یعنی 1678537870 ثانیه از 1970 گذشته... این توی خیــــلی از زبانها هست، مثلا اگه توی PHP بدمش به تابع date میگه که:
echo date("m/d/Y h:i:s a", 1678537870);
03/11/2023 12:31:10 pm
ساعتش به وقت ایران نیست، و اینکه جزئیات تابعش اصلا مهم نیست...

ولی جالبه که خیلیا نمیدونن که سیستمشون با این تایم‌استمپ داره میچرخه...

میتونین پرتکل NTP رو بخونین چیزای جذابی داره....
Network Time Protocol

=+=+=+=+=+=+=+=+=+=+=+=+


حالا مشکل کجاست؟
این تایم استمپ یا برچسب زمانی داره توی خیــــلی از رکوئست و ریسپانس ها انکپسوله میشه و میره و میاد...

برای همین باید برای ذخیره سازیش کمترین طول ممکن رو استفاده کنن که بهینه باشه.... اینا تایم استمپ رو اینتیجر گرفتن...

اینتیجر مثل هر زبان برنامه‌نویسی ، 4 بایت فضا اشغال میکنه...

اینا اون موقعی که طراحیش کردن گفتن که این ساختار تاااااا 70 سال دیگه کار میکنه... همینقدر بسه... اون موقع آیندگان یه فکری میکنن *-*

اتفاقی که میافته اینه که سال 2038 4 بایت پر میشه :)) و سرریز میکنه.... اصلاحا میگن اورفلو میکنه :3

یعنی تعداد ثانیه ها میشه
2147483647
و یک ثانیه که بگذره از 4 بایت (32 بیت) اورفلو میکنه و میشه 33 بیت و بیت علامت 0 میشه و عدد منفی میشه...🥴 شاید برای هضمش لازم باشه که روی کاغذ باینریش رو بنویسین.

*گیفش رو میفرستم پایین*

اگه مثلا 8 بایت میگرفتن میتونستن تا ملیاردها سال دیگه رو بدون اشکال پیش برن... ولی غیر بهینه بود...


خیلی از سیستما همین الان جلوی این اتفاق رو گرفتن... و خیلی از سیستم‌ها هم اصلا روهشون خبر نداره😬 نشستن دارن خودشونو باد میزنن، اگه تا 2038 ایران متلاشی نشده باشه و آبش تموم نشده باشه، بهتون قول میدم نصف سیستماش از کار می‌افته *-*

=+=+=+=+=+=+=+=+=+=+=+

این مشکل از اولشم میدونستن که بوجود میاد... ولی بهترین راه این بود که 50 سال دیگه آینده‌گان کامپیوترهاشون رو به روز کنن!!! یا محور قراردادی رو از 1970 تغییر بدن...

این مشکل بزرگیه که باید روش فکر بشه
مساله اگر فقط نرم‌افزاری بود مشکلی نبود ، یه پج میدادن حل میشد...!


ولی بسیــــــــــــاری از پیاده سازی های تایم سخت افزاری هستن!... مثلا طرف روی FPGA یا میکروکنترلر یا ROM {که قابل تغییر نیست} گرفته timestamp رو مدلسازی کرده...، یا توی امبدد سیستمها اینکارو کرده...
اون سخت افزارا کلا منسوخ میشن...!

ولی چیز جالبیه...😆
=+=+=+=+=+=+=+=+=+=+
👍7
وقتی کارفرما گفته سریع پروژه رو تحویل بده میخوام زود ببرمش روی پروداکشن 😁
🔎 @py4ds
😁3