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

سلام. توی این مطلب میخوام بهتون بگم که چطوری توی پایتون یه کد کارآمد تر توی پایتون بنویسید. با من همراه باشید.برای افزودن موارد به لیست ها از پیوندها استفاده کنیدبه جای اضافه کردن line1 و line2 به mymsg به صورت جداگانه ، از لیست و jion استفاده کنید.این کار را نکنید:mymsg=’line1\n’ mymsg+=’line2\n’راه بهتر:mymsg=[‘line1’,’line2'] ‘\n’.join(mymsg)از استفاده از عملگر + برای رشته ها خودداری کنیداگر می توانید از عملگر + برای الحاق استفاده نکنید. از آنجا که رشته ها تغییرناپذیر هستند ، هر بار که عنصری را به یک رشته اضافه می کنید ، پایتون یک رشته و آدرس جدید ایجاد می کند. این بدان معنی است که هر بار که رشته تغییر می کند ، باید حافظه جدید اختصاص یابد.این کار را نکنید:msg=&quotHello&quot+myMissage+&quotWorld&quotراه بهتر:msg=&quotHello %s World&quot %myMessage و یا msg=f&quotHello {myMessage} World&quot استفاده از Generator هاژنراتور ها به شما امکان می دهند تابعی را ایجاد کنید که در آن واحد یک مورد را برگرداند نه همه موارد را به صورت همزمان. این به این معنی است که اگر یک مجموعه داده بزرگ دارید ، لازم نیست منتظر بمانید تا کل مجموعه داده قابل دسترسی باشد.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)تابع را به یک متغیر local اختصاص دهیدپایتون بسیار کارآمدتر از متغیرهای 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این ابزار (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))))رونویسی (Overwriting) و بهره برداری از کلاس های بزرگ برای مدیریت ایمنی و حافظهرونویسی از __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)