چطور در پایتون کد بهتری بزنیم؟

چطور در پایتون کد بهتری بزنیم؟

سلام. توی این مطلب میخوام بهتون بگم که چطوری توی پایتون یه کد کارآمد تر توی پایتون بنویسید. با من همراه باشید.به جای اضافه کردن line1 و line2 به mymsg به صورت جداگانه ، از لیست و jion استفاده کنید.این کار را نکنید:mymsg=’line1n’
mymsg+=’line2n’راه بهتر:mymsg=[‘line1’,’line2′]
‘n’.join(mymsg)اگر می توانید از عملگر + برای الحاق استفاده نکنید. از آنجا که رشته ها تغییرناپذیر هستند ، هر بار که عنصری را به یک رشته اضافه می کنید ، پایتون یک رشته و آدرس جدید ایجاد می کند. این بدان معنی است که هر بار که رشته تغییر می کند ، باید حافظه جدید اختصاص یابد.این کار را نکنید:msg=&quotHello&quot+myMissage+&quotWorld&quotراه بهتر:msg=&quotHello %s World&quot %myMessage
و یا
msg=f&quotHello {myMessage} World&quot ژنراتور ها به شما امکان می دهند تابعی را ایجاد کنید که در آن واحد یک مورد را برگرداند نه همه موارد را به صورت همزمان. این به این معنی است که اگر یک مجموعه داده بزرگ دارید ، لازم نیست منتظر بمانید تا کل مجموعه داده قابل دسترسی باشد.def __iter__(self):
return self._generator()

def _generator(self):
for item in self.item:
yield itemاگر از طریق داده iterating می شوید ، می توانید از نسخه ذخیره شده regex استفاده کنید.match_regex=re.compile(&quotfoo|Bar&quot)
for i in big_it:
m=match_rejex.search(i)پایتون بسیار کارآمدتر از متغیرهای global به متغیرهای local دسترسی پیدا می کند. توابع را به متغیرهای local اختصاص دهید سپس از آنها استفاده کنید.myLocalFunc=myObj.func
for i in range(n):
myLocalFunc(i)هر زمان که می توانید از توابع و کتابخانه های داخلی استفاده کنید. توابع داخلی اغلب با استفاده از بهترین روشهای استفاده از حافظه اجرا می شوند.این کار را نکنید:mylist=[]
for myword in oldlist:
mylist.append(myword.upper())راه بهتر:mylist=map(str.lower, oldlist)راه بهتر برای ایجاد یک مجموعه داده با آرگومان های کلمه کلیدی (key word arguments) از حلقه ها:mycounter = Counter (a = 1, b = 2, c = 3, d = 5, e = 6, f = 7, g = 8)
for i in mycounter.elements():
doSomeThingاین ابزار (itertools) باعث صرفه جویی در وقت شما در حلقه ها می شود. همچنین از پیچیدگی کد خلاص می شود.این کار را انجام ندهید:mylist=[]
for shape in [True, False]:
for weight in (1, 5):
firstlist=firstlist+function(shape, weight)راه بهتر:from itertools import product, chain
list(chain.from_iterable(function(shape, weight) for weight, shape in product([True, False], range(1, 5))))رونویسی از __new__ و بهره گیری از کلاسهای فرعی نیز برای مدیریت حافظه در هنگام اجرای الگوهای Singleton و Flyweight مفید و ایمن است. به عنوان مثال ، در اینجا مثالی از یک شی dict است که یک فایل Yaml را می خواند. از آنجا که این متا کلاس یک الگوی طراحی یکپارچه است پس از تعریف ، می توان آن را در هر نقطه از سیستم وارد کرد و دوباره تعریف کرد و مفسر فقط به شی initial اولیه اشاره می کند. اثر حافظه را کاهش می دهد و ایمنی را تضمین می کند. هر چقدر یک توسعه دهنده دیگر در تیم جوان باشد ، آنها باعث ایجاد اشیا تکراری نخواهند شد ، و از این کار جلوگیری می کنند تا دستورالعمل را در یک قسمت از سیستم تغییر دهند و در قسمت دیگر دستور دیگری را ارجاع دهند.class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class ConfigDict(dict, metaclass=Singleton):
def __init__(self):
super().__init__(self.read_config_file()) @staticmethod def read_config_file(): “”” Reads config file based on path passed when running app. :return: (dict) loaded data from yml file “”” config_file_path = sys.argv[-1]
if not config_file_path.endswith(“.yml”):
raise ConfigDictError(message=”yml file not passed into flask app but {}
instead”.format(config_file_path))
return yaml.load(open(str(config_file_path)), Loader=yaml.FullLoader)

Author: admin

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *