最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python優(yōu)化代碼的技巧分享

 更新時(shí)間:2023年09月15日 08:22:49   作者:工業(yè)四次元  
Python?是?一種用著很爽的語言,Python也有著很多特性和技巧,可以幫助我們編寫更高效、更優(yōu)雅、更易維護(hù)的代碼,下面小編為大家整理了一些常用的Python代碼優(yōu)化的簡單小技巧,希望對大家有所幫助

短路運(yùn)算(Short-circuit operation)

咱們都知道,短路運(yùn)算也就是 ”與 ,或 ,非“ 這幾個(gè)組成。但是有些時(shí)候,我們很多 if-else語句其實(shí)可以使用這種短路運(yùn)算來簡寫代碼的。

例, 獲取用戶信息,不存在的用戶則返回匿名用戶, 代碼:

def get_user(user):
    # 常規(guī)代碼
    if user:
        return user
    return "匿名用戶"
# 短路來簡寫代碼
def get_user(user):
    return user or "匿名用戶"

使用短路運(yùn)算處理,那么就只需要一行代碼即可,這樣寫也挺易讀的。

切片替代循環(huán)(Slice)

使用切片代替循環(huán)或遞歸來操作序列。切片是一種用于從一個(gè)序列(如字符串、列表、元組等)中獲取一部分或全部元素的語法。

例,反轉(zhuǎn)數(shù)據(jù),代碼:

# 使用循環(huán)
def reverse(lst):
    new_lst = []
    for i in range(len(lst) - 1, -1, -1):
        new_lst.append(lst[i])
    return new_lst
lst = [1, 2, 3, 4, 5]
print(reverse(lst)) # [5, 4, 3, 2, 1]
# 使用切片
def reverse(lst):
    return lst[::-1]
lst = [1, 2, 3, 4, 5]
print(reverse(lst)) # [5, 4, 3, 2, 1]

切片的操作比循環(huán)或遞歸更簡單并且高效,因?yàn)榍衅腔趦?nèi)置函數(shù)實(shí)現(xiàn)的,而循環(huán)或遞歸是基于自定義函數(shù)實(shí)現(xiàn)。

列表推導(dǎo)式(List Comprehension)

列表推導(dǎo)式是一種用于從一個(gè)可迭代對象(如列表、元組、字典、集合等)創(chuàng)建一個(gè)新的列表的簡潔的語法。

例,從一個(gè)列表中篩選出所有的偶數(shù),并將它們乘以2,代碼:

# 使用普通的循環(huán)
lst = [1, 2, 3, 4, 5, 6]
new_lst = []
for x in lst:
    if x % 2 == 0:
        new_lst.append(x * 2)
print(new_lst) # [4, 8, 12]
# 使用列表推導(dǎo)式
lst = [1, 2, 3, 4, 5, 6]
new_lst = [x * 2 for x in lst if x % 2 == 0]
print(new_lst) # [4, 8, 12]

一行代碼實(shí)現(xiàn)循環(huán)、條件判斷和賦值等操作,提高了代碼的可讀性和效率,而且運(yùn)行速度也更快(可以思考一下為什么更快)。

生成器表達(dá)式(Generator Expression)

生成器表達(dá)式是一種類似于列表推導(dǎo)式的語法,但是它不會一次性生成一個(gè)完整的列表,而是返回一個(gè)生成器對象,可以按需逐個(gè)產(chǎn)生元素。

例,計(jì)算一個(gè)列表中所有偶數(shù)的平方和,代碼:

# 使用普通的循環(huán)
lst = [1, 2, 3, 4, 5, 6]
sum = 0
for x in lst:
    if x % 2 == 0:
        sum += x ** 2
print(sum) # 56
# 使用生成器表達(dá)式
lst = [1, 2, 3, 4, 5, 6]
sum = sum(x ** 2 for x in lst if x % 2 == 0)
print(sum) # 56

這個(gè)生成器表達(dá)式可以節(jié)省內(nèi)存空間,提高性能,適合處理大量或無限的數(shù)據(jù),而且不會占用額外的內(nèi)存空間,特別適用于讀取大批量的數(shù)據(jù)。當(dāng)然我們也可以用yeild也能做一個(gè)生成器,這個(gè)太東西很牛逼。

枚舉(Enumerate)

枚舉是一種用于同時(shí)獲取可迭代對象中的元素和索引的函數(shù)。枚舉可以避免使用額外的變量來記錄索引,提高了代碼的可讀性和效率。

例,打印一個(gè)列表中每個(gè)元素及其對應(yīng)的索引,代碼:

# 使用普通的循環(huán)
lst = ["a", "b", "c", "d", "e"]
index = 0
for x in lst:
    print(index, x)
    index += 1
# 輸出:
# 0 a
# 1 b
# 2 c
# 3 d
# 4 e
# 使用枚舉
lst = ["a", "b", "c", "d", "e"]
for index, x in enumerate(lst):
    print(index, x)
# 輸出:
# 0 a
# 1 b
# 2 c
# 3 d
# 4 e

使用枚舉的代碼更加簡潔和清晰,而且不需要手動更新索引。

三元運(yùn)算符(Ternary Operator)

三元運(yùn)算符是一種用于根據(jù)一個(gè)條件表達(dá)式來選擇兩個(gè)不同的值的簡潔的語法。

例,根據(jù)一個(gè)數(shù)字的正負(fù)來賦值一個(gè)字符串,代碼:

# 使用普通的if-else語句
num = -5
if num > 0:
    sign = "positive"
else:
    sign = "negative"
print(sign) # negative
# 使用三元運(yùn)算符
num = -5
sign = "positive" if num > 0 else "negative"
print(sign) # negative

三元運(yùn)算符可以用一行代碼實(shí)現(xiàn)簡單的條件判斷和賦值,提高了代碼的可讀性和效率,而且不需要多余的變量和語句。

字典處理?xiàng)l件判斷

遇到if循環(huán)語句很長的時(shí)候,其實(shí)可以使用字典來替代,兩者的執(zhí)行效率沒有試驗(yàn)過,感覺差不了多少。

例, 使用字典來判斷返回值, 代碼:

# 使用多個(gè)if-elif-else語句
def foo(x):
    if x == "a":
        return 1
    elif x == "b":
        return 2
    elif x == "c":
        return 3
    else:
        return -1
print(foo("a")) # 1
print(foo("d")) # -1
# 使用字典
def foo(x):
    dic = {"a": 1, "b": 2, "c": 3}
    return dic.get(x, -1)
print(foo("a")) # 1
print(foo("d")) # -1

合理利用字典的get方法,可以減少很多代碼的使用。

裝飾器(Decorator)

裝飾器是一種用于在不修改原函數(shù)定義和調(diào)用的情況下,給函數(shù)添加額外的功能或修改其行為的語法。

例,給一個(gè)函數(shù)添加一個(gè)計(jì)時(shí)的功能,記錄其運(yùn)行時(shí)間,代碼:

# 使用普通的函數(shù)調(diào)用
import time
def foo():
    # do something
    time.sleep(1)
start = time.time()
foo()
end = time.time()
print(f"foo() took {end - start} seconds to run.") 
# 使用裝飾器
import time
def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__}() took {end - start} seconds to run.")
        return result
    return wrapper
@timer # 相當(dāng)于 foo = timer(foo)
def foo():
    # do something
    time.sleep(1)
foo() 

裝飾器能做的事太多了,比如flask 框架,真尼瑪裝飾器用到飛天。勇哥也就一般用于實(shí)現(xiàn)一些通用的功能,如日志、緩存、計(jì)時(shí)、權(quán)限檢查等,讓代碼可復(fù)用更強(qiáng)一寫。

上下文管理器(Context Manager)

上下文管理器是一種用于在執(zhí)行某些操作之前和之后自動執(zhí)行一些預(yù)設(shè)的操作的語法。上下文管理器可以用于實(shí)現(xiàn)一些資源管理的功能,

例如,打開一個(gè)文件,讀取其內(nèi)容,并在完成后自動關(guān)閉文件,代碼:

# 使用普通的try-finally語句
file = open("test.txt", "r")
try:
    content = file.read()
    print(content)
finally:
    file.close()
# 使用上下文管理器
with open("test.txt", "r") as file:
    content = file.read()
    print(content)

使用上下文管理器我們一般用于 打開和關(guān)閉文件、獲取和釋放鎖、連接和斷開數(shù)據(jù)庫等。代碼的安全性問題和可讀性也很好處理。

Lambda 表達(dá)式(Lambda Expression)

lambda表達(dá)式(代替簡單的函數(shù)定義來創(chuàng)建匿名函數(shù)。lambda表達(dá)式是一種用于定義一個(gè)只有一行代碼的函數(shù)的簡潔的語法。

例,處理排序sorted,指定字段,代碼:

lst = [9,2,3,4,5,5,1,2,3]
# 不使用lambda表達(dá)式
def add(item):
   return item
print(sorted(add, item))
# 使用lambda表達(dá)式
print(sorted(lst, key=lambda x:x))

lambda表達(dá)式我們一般用來實(shí)現(xiàn)一些簡單的功能,如排序、過濾、映射等。使用匿名函數(shù),代碼有時(shí)候少寫一些外,還有一點(diǎn)就是 lambda 表達(dá)式用完就會在內(nèi)存中舍棄,也挺好。

map 函數(shù)

map函數(shù)代替循環(huán)來對可迭代對象中的每個(gè)元素應(yīng)用一個(gè)函數(shù)。map函數(shù)是一種用于將一個(gè)函數(shù)作用于一個(gè)可迭代對象中的每個(gè)元素,并返回一個(gè)新的可迭代對象的函數(shù)。

例,將一批字符列表字符串轉(zhuǎn)數(shù)字列表,代碼:

# 不使用map函數(shù)
lst = ["1", "2", "3", "4", "5"]
new_lst = []
for x in lst:
    new_lst.append(int(x))
print(new_lst) # [1, 2, 3, 4, 5]
# 使用map函數(shù)
lst = ["1", "2", "3", "4", "5"]
new_lst = list(map(int, lst))
print(new_lst) # [1, 2, 3, 4, 5]

是不是看起來代碼又少了很多,而且這種內(nèi)置函數(shù),一般速度都比咱們自己寫的代碼運(yùn)行效率高,基于這個(gè)強(qiáng)大的高階函數(shù),我們可以用來實(shí)現(xiàn)一些批量處理的功能,如類型轉(zhuǎn)換、格式化、計(jì)算,數(shù)據(jù)合并等。

filter 函數(shù)

filter函數(shù)代替循環(huán)來從可迭代對象中篩選出滿足一個(gè)條件的元素。filter函數(shù)是一種用于將一個(gè)條件函數(shù)作用于一個(gè)可迭代對象中的每個(gè)元素,并返回一個(gè)只包含滿足條件元素的新的可迭代對象的函數(shù)。

例,從一個(gè)列表中挑選符合要求的數(shù)據(jù)出來組成另一個(gè)列表,代碼:

# 不使用filter函數(shù)
lst = [1, 2, 3, 4, 5]
new_lst = []
for x in lst:
    if x % 2 == 0:
        new_lst.append(x)
print(new_lst) # [2, 4]
# 使用filter函數(shù)
lst = [1, 2, 3, 4, 5]
new_lst = list(filter(lambda x: x % 2 == 0, lst))
print(new_lst) # [2, 4]

filter函數(shù)可以用于實(shí)現(xiàn)一些篩選和過濾的功能,如刪除空值、去重、選擇子集等,也是一個(gè)很牛的高階函數(shù)。

@properyt 裝飾器

@property 裝飾器有些時(shí)候可以用來替代 geter和setter 方法來管理類書信。這個(gè)裝飾器裝飾的函數(shù)會轉(zhuǎn)為一個(gè)屬性的語法,可以在訪問和修改屬性的時(shí)候,執(zhí)行一些額外的操作,不用顯式調(diào)用。

例,對類屬性的修改與獲取, 代碼:

# 不使用@property裝飾器
class Person:
   def __init__(self, name, age):
       self.name = name
       self.age = age
   def get_name(self):
       return self.name
   def set_name(self, name):
       if not isinstance(name, str):
           raise TypeError("name must be a string")
       self.name = name
   def get_age(self):
       return self.age
   def set_age(self, age):
       if not isinstance(age, int):
           raise TypeError("age must be an integer")
       if age < 0 or age > 150:
           raise ValueError("age must be between 0 and 150")
       self.age = age
p = Person("kira", 40) # 實(shí)例化
print(p.get_name()) # kira
print(p.get_age()) # 40
p.set_name("勇哥")
p.set_age(35)
print(p.get_name()) # 勇哥
print(p.get_age()) # 35
# 使用@property裝飾器
class Person:
   def __init__(self, name, age):
       self._name = name
       self._age = age
   @property
   def name(self):
       return self._name
   @name.setter
   def name(self, name):
       if not isinstance(name, str):
           raise TypeError("name must be a string")
       self._name = name
   @property
   def age(self):
       return self._age
   @age.setter
   def age(self, age):
       if not isinstance(age, int):
           raise TypeError("age must be an integer")
       if age < 0 or age > 150:
           raise ValueError("age must be between 0 and 150")
       self._age = age
p = Person("kira", 30)
print(p.name) # kira
print(p.age) # 30
p.name = "勇哥"
p.age = 35
print(p.name) # 勇哥
print(p.age) # 35

從上面的代碼,我們就可以了解到@property 可以做的事就很多了,比如實(shí)現(xiàn)屬性管理,數(shù)據(jù)驗(yàn)證,類型轉(zhuǎn)換,緩存... 可讀性和安全性也不錯(cuò).

slots屬性

來到本文的最后一個(gè)要分享的 slots 屬性,這個(gè)事用來指定一個(gè)類可以有那些屬性的語法,可以用來替代一下__dict__ 來節(jié)省類的內(nèi)存空間,因?yàn)樗苊饬私o每個(gè)實(shí)例創(chuàng)建一個(gè) dict 屬性來存儲所有屬性和值。一般用于內(nèi)存優(yōu)化。

例,指定一個(gè)類實(shí)例時(shí)只有指定的屬性,代碼:

# 不使用__slots__屬性
class Person:
   def __init__(self, name, age):
       self.name = name
       self.age = age
p = Person("勇哥", 90)
print(p.__dict__) 
print(p.__sizeof__()) 

輸出:

{'name': '測試玩家勇哥', 'age': 90}
32

# 使用__slots__屬性
class Person:
    # 指定該類只能擁有name和age兩個(gè)屬性
    __slots__ = ("name", "age")
    def __init__(self, name, age):
        self.name = name
        self.age = age
p = Person("Alice", 20)
print(p.__sizeof__()) 
print(p.__dict__) 

輸出:

Traceback (most recent call last):
 File "D:\app\apitest\debug\ts.py", line 82, in <module>
   print(p.__dict__) # AttributeError: 'Person' object has no attribute '__dict__'
AttributeError: 'Person' object has no attribute '__dict__'
32

很明顯,這個(gè)類已經(jīng)沒有了__dict__屬性了,也就是可以減少內(nèi)存占用,提高訪問速度這種玩意,但是也有不好的地方,比如不能多重繼承了,也不能添加新屬性。要打印出來你限制的屬性也就只能dir 或者 getter來獲取了。總之小伙伴們看著使用吧。

最后,推薦一款應(yīng)用開發(fā)神器

關(guān)于目前低代碼在技術(shù)領(lǐng)域很活躍!

低代碼是什么?一組數(shù)字技術(shù)工具平臺,能基于圖形化拖拽、參數(shù)化配置等更為高效的方式,實(shí)現(xiàn)快速構(gòu)建、數(shù)據(jù)編排、連接生態(tài)、中臺服務(wù)等。通過少量代碼或不用代碼實(shí)現(xiàn)數(shù)字化轉(zhuǎn)型中的場景應(yīng)用創(chuàng)新。它能緩解甚至解決龐大的市場需求與傳統(tǒng)的開發(fā)生產(chǎn)力引發(fā)的供需關(guān)系矛盾問題,是數(shù)字化轉(zhuǎn)型過程中降本增效趨勢下的產(chǎn)物。

這邊介紹一款好用的低代碼平臺——JNPF快速開發(fā)平臺。近年在市場表現(xiàn)和產(chǎn)品競爭力方面表現(xiàn)較為突出,采用的是最新主流前后分離框架(SpringBoot+Mybatis-plus+Ant-Design+Vue3)。代碼生成器依賴性低,靈活的擴(kuò)展能力,可靈活實(shí)現(xiàn)二次開發(fā)。

以JNPF為代表的企業(yè)級低代碼平臺為了支撐更高技術(shù)要求的應(yīng)用開發(fā),從數(shù)據(jù)庫建模、Web API構(gòu)建到頁面設(shè)計(jì),與傳統(tǒng)軟件開發(fā)幾乎沒有差異,只是通過低代碼可視化模式,減少了構(gòu)建“增刪改查”功能的重復(fù)勞動,還沒有了解過低代碼的伙伴可以嘗試了解一下。

以上就是Python優(yōu)化代碼的技巧分享的詳細(xì)內(nèi)容,更多關(guān)于Python優(yōu)化代碼的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python爬蟲模擬登錄帶驗(yàn)證碼網(wǎng)站

    Python爬蟲模擬登錄帶驗(yàn)證碼網(wǎng)站

    這篇文章主要介紹了Python爬蟲模擬登錄帶驗(yàn)證碼網(wǎng)站的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Python中typing.Annotated使用全面指南

    Python中typing.Annotated使用全面指南

    在Python中typing.Annotated是一種用于向類型提示添加元數(shù)據(jù)的方式,這篇文章主要介紹了Python中typing.Annotated使用的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-12-12
  • python簡單驗(yàn)證碼識別的實(shí)現(xiàn)方法

    python簡單驗(yàn)證碼識別的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于python簡單驗(yàn)證碼識別的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 最新Python爬蟲從入門到精通:靜態(tài)爬取+JS逆向+反爬繞過實(shí)戰(zhàn)教程

    最新Python爬蟲從入門到精通:靜態(tài)爬取+JS逆向+反爬繞過實(shí)戰(zhàn)教程

    本文從零基礎(chǔ)出發(fā),系統(tǒng)講解Python爬蟲的靜態(tài)抓取、動態(tài)接口分析、JS逆向破解加密參數(shù)、反爬繞過(IP代理、Cookie維持、延時(shí)控制)及數(shù)據(jù)存儲,包含完整可運(yùn)行代碼、抓包技巧、簽名算法還原、常見報(bào)錯(cuò)解決方案,幫助讀者真正實(shí)現(xiàn)從入門到精通
    2026-04-04
  • 解決python nohup linux 后臺運(yùn)行輸出的問題

    解決python nohup linux 后臺運(yùn)行輸出的問題

    今天小編就為大家分享一篇解決python nohup linux 后臺運(yùn)行輸出的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python中input輸入與While循環(huán)超詳細(xì)講解

    Python中input輸入與While循環(huán)超詳細(xì)講解

    python是一種廣泛使用的解釋型、高級和通用的編程語言,它支持多種編程范型,包括函數(shù)式、指令式、結(jié)構(gòu)化、面向?qū)ο蠛头瓷涫骄幊痰?這篇文章主要介紹了Python中input輸入與While循環(huán)的相關(guān)資料,需要的朋友可以參考下
    2025-07-07
  • 代碼分析Python地圖坐標(biāo)轉(zhuǎn)換

    代碼分析Python地圖坐標(biāo)轉(zhuǎn)換

    這篇文章主要介紹了Python地圖坐標(biāo)轉(zhuǎn)換的相關(guān)知識點(diǎn)以及分享了相關(guān)的代碼實(shí)例,對此有興趣的朋友學(xué)習(xí)下。
    2018-02-02
  • Python調(diào)用Java接口失敗(Java日志打印警告:JSON parse error:xxxx)的解決方案

    Python調(diào)用Java接口失敗(Java日志打印警告:JSON parse error:xxxx)

    文章描述了Python調(diào)用Java接口時(shí)遇到400錯(cuò)誤和JSON解析錯(cuò)誤的問題,通過分析問題發(fā)現(xiàn)參數(shù)傳遞方式可能存在問題,修改Python代碼使用data參數(shù)并序列化數(shù)據(jù)后,問題解決,文章總結(jié)了在Python調(diào)用Java接口傳遞JSONObject數(shù)據(jù)時(shí)的注意事項(xiàng),需要的朋友可以參考下
    2025-11-11
  • Python pyttsx3庫實(shí)現(xiàn)文本轉(zhuǎn)語音功能的示例

    Python pyttsx3庫實(shí)現(xiàn)文本轉(zhuǎn)語音功能的示例

    pyttsx3是一個(gè)功能強(qiáng)大且易于使用的文本轉(zhuǎn)語音庫,適合需要離線語音合成的場景,本文就來介紹一下Python pyttsx3庫實(shí)現(xiàn)文本轉(zhuǎn)語音功能的示例,感興趣的可以了解一下
    2025-04-04
  • python反反爬蟲技術(shù)限制連續(xù)請求時(shí)間處理

    python反反爬蟲技術(shù)限制連續(xù)請求時(shí)間處理

    這篇文章主要為大家介紹了python反反爬蟲技術(shù)限制連續(xù)請求時(shí)間處理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06

最新評論

新泰市| 灵宝市| 简阳市| 蒙山县| 朝阳县| 陆丰市| 太原市| 昔阳县| 海晏县| 鄯善县| 历史| 洪江市| 永昌县| 栖霞市| 府谷县| 慈溪市| 如皋市| 凉山| 雷州市| 嘉荫县| 信宜市| 怀宁县| 博爱县| 武宁县| 句容市| 奉贤区| 闻喜县| 文水县| 渑池县| 延寿县| 甘德县| 武功县| 焦作市| 陈巴尔虎旗| 呼伦贝尔市| 巴中市| 东台市| 徐水县| 高密市| 吴堡县| 定襄县|