日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Python應知小技巧:如何用更少的代碼做更多的事情

來源: 責編: 時間:2023-09-18 21:41:52 395觀看
導讀Python 是 一種用著很爽的語言。Python也有著很多特性和技巧,可以幫助我們編寫更高效、更優雅、更易維護的代碼。下面勇哥將介紹一些我常用的Python代碼優化的簡單小技巧,少寫很多代碼。短路運算(Short-circuit operatio

Python 是 一種用著很爽的語言。Python也有著很多特性和技巧,可以幫助我們編寫更高效、更優雅、更易維護的代碼。下面勇哥將介紹一些我常用的Python代碼優化的簡單小技巧,少寫很多代碼。zRl28資訊網——每日最新資訊28at.com

zRl28資訊網——每日最新資訊28at.com

短路運算(Short-circuit operation)

咱們都知道,短路運算也就是 ”與 ,或 ,非“ 這幾個組成。但是有些時候,我們很多 if-else語句其實可以使用這種短路運算來簡寫代碼的。zRl28資訊網——每日最新資訊28at.com

例, 獲取用戶信息,不存在的用戶則返回匿名用戶, 代碼:zRl28資訊網——每日最新資訊28at.com

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

使用短路運算處理,那么就只需要一行代碼即可,這樣寫也挺易讀的。zRl28資訊網——每日最新資訊28at.com

切片替代循環(Slice)

使用切片代替循環或遞歸來操作序列。切片是一種用于從一個序列(如字符串、列表、元組等)中獲取一部分或全部元素的語法。zRl28資訊網——每日最新資訊28at.com

例,反轉數據,代碼:zRl28資訊網——每日最新資訊28at.com

# 使用循環def reverse(lst):    new_lst = []    for i in range(len(lst) - 1, -1, -1):        new_lst.append(lst[i])    return new_lstlst = [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]

切片的操作比循環或遞歸更簡單并且高效,因為切片是基于內置函數實現的,而循環或遞歸是基于自定義函數實現。zRl28資訊網——每日最新資訊28at.com

列表推導式(List Comprehension)

列表推導式是一種用于從一個可迭代對象(如列表、元組、字典、集合等)創建一個新的列表的簡潔的語法。zRl28資訊網——每日最新資訊28at.com

例,從一個列表中篩選出所有的偶數,并將它們乘以2,代碼:zRl28資訊網——每日最新資訊28at.com

# 使用普通的循環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]
# 使用列表推導式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]

一行代碼實現循環、條件判斷和賦值等操作,提高了代碼的可讀性和效率,而且運行速度也更快(可以思考一下為什么更快)。zRl28資訊網——每日最新資訊28at.com

生成器表達式(Generator Expression)

生成器表達式是一種類似于列表推導式的語法,但是它不會一次性生成一個完整的列表,而是返回一個生成器對象,可以按需逐個產生元素。zRl28資訊網——每日最新資訊28at.com

例,計算一個列表中所有偶數的平方和,代碼:zRl28資訊網——每日最新資訊28at.com

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

這個生成器表達式可以節省內存空間,提高性能,適合處理大量或無限的數據,而且不會占用額外的內存空間,特別適用于讀取大批量的數據。當然我們也可以用yeild也能做一個生成器,這個太東西很牛逼。zRl28資訊網——每日最新資訊28at.com

枚舉(Enumerate)

枚舉是一種用于同時獲取可迭代對象中的元素和索引的函數。枚舉可以避免使用額外的變量來記錄索引,提高了代碼的可讀性和效率。zRl28資訊網——每日最新資訊28at.com

例,打印一個列表中每個元素及其對應的索引,代碼:zRl28資訊網——每日最新資訊28at.com

# 使用普通的循環lst = ["a", "b", "c", "d", "e"]index = 0for 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

使用枚舉的代碼更加簡潔和清晰,而且不需要手動更新索引。zRl28資訊網——每日最新資訊28at.com

三元運算符(Ternary Operator)

三元運算符是一種用于根據一個條件表達式來選擇兩個不同的值的簡潔的語法。zRl28資訊網——每日最新資訊28at.com

例,根據一個數字的正負來賦值一個字符串,代碼:zRl28資訊網——每日最新資訊28at.com

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

三元運算符可以用一行代碼實現簡單的條件判斷和賦值,提高了代碼的可讀性和效率,而且不需要多余的變量和語句。zRl28資訊網——每日最新資訊28at.com

字典處理條件判斷

遇到if循環語句很長的時候,其實可以使用字典來替代,兩者的執行效率沒有試驗過,感覺差不了多少。zRl28資訊網——每日最新資訊28at.com

例, 使用字典來判斷返回值, 代碼:zRl28資訊網——每日最新資訊28at.com

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

合理利用字典的get方法,可以減少很多代碼的使用。zRl28資訊網——每日最新資訊28at.com

裝飾器(Decorator)

裝飾器是一種用于在不修改原函數定義和調用的情況下,給函數添加額外的功能或修改其行為的語法。zRl28資訊網——每日最新資訊28at.com

例,給一個函數添加一個計時的功能,記錄其運行時間,代碼:zRl28資訊網——每日最新資訊28at.com

# 使用普通的函數調用import timedef foo():    # do something    time.sleep(1)start = time.time()foo()end = time.time()print(f"foo() took {end - start} seconds to run.") 
# 使用裝飾器import timedef 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 # 相當于 foo = timer(foo)def foo():    # do something    time.sleep(1)foo() 

裝飾器能做的事太多了,比如flask 框架,真尼瑪裝飾器用到飛天。勇哥也就一般用于實現一些通用的功能,如日志、緩存、計時、權限檢查等,讓代碼可復用更強一寫。zRl28資訊網——每日最新資訊28at.com

上下文管理器(Context Manager)

上下文管理器是一種用于在執行某些操作之前和之后自動執行一些預設的操作的語法。上下文管理器可以用于實現一些資源管理的功能,zRl28資訊網——每日最新資訊28at.com

例如,打開一個文件,讀取其內容,并在完成后自動關閉文件,代碼:zRl28資訊網——每日最新資訊28at.com

# 使用普通的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)

使用上下文管理器我們一般用于 打開和關閉文件、獲取和釋放鎖、連接和斷開數據庫等。代碼的安全性問題和可讀性也很好處理。zRl28資訊網——每日最新資訊28at.com

Lambda 表達式(Lambda Expression)

lambda表達式(代替簡單的函數定義來創建匿名函數。lambda表達式是一種用于定義一個只有一行代碼的函數的簡潔的語法。zRl28資訊網——每日最新資訊28at.com

例,處理排序sorted,指定字段,代碼:zRl28資訊網——每日最新資訊28at.com

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

lambda表達式我們一般用來實現一些簡單的功能,如排序、過濾、映射等。使用匿名函數,代碼有時候少寫一些外,還有一點就是 lambda 表達式用完就會在內存中舍棄,也挺好。zRl28資訊網——每日最新資訊28at.com

map 函數

map函數代替循環來對可迭代對象中的每個元素應用一個函數。map函數是一種用于將一個函數作用于一個可迭代對象中的每個元素,并返回一個新的可迭代對象的函數。zRl28資訊網——每日最新資訊28at.com

例,將一批字符列表字符串轉數字列表,代碼:zRl28資訊網——每日最新資訊28at.com

# 不使用map函數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函數lst = ["1", "2", "3", "4", "5"]new_lst = list(map(int, lst))print(new_lst) # [1, 2, 3, 4, 5]

是不是看起來代碼又少了很多,而且這種內置函數,一般速度都比咱們自己寫的代碼運行效率高,基于這個強大的高階函數,我們可以用來實現一些批量處理的功能,如類型轉換、格式化、計算,數據合并等。zRl28資訊網——每日最新資訊28at.com

filter 函數

filter函數代替循環來從可迭代對象中篩選出滿足一個條件的元素。filter函數是一種用于將一個條件函數作用于一個可迭代對象中的每個元素,并返回一個只包含滿足條件元素的新的可迭代對象的函數。zRl28資訊網——每日最新資訊28at.com

例,從一個列表中挑選符合要求的數據出來組成另一個列表,代碼:zRl28資訊網——每日最新資訊28at.com

# 不使用filter函數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函數lst = [1, 2, 3, 4, 5]new_lst = list(filter(lambda x: x % 2 == 0, lst))print(new_lst) # [2, 4]

filter函數可以用于實現一些篩選和過濾的功能,如刪除空值、去重、選擇子集等,也是一個很牛的高階函數。zRl28資訊網——每日最新資訊28at.com

@properyt 裝飾器

@property 裝飾器有些時候可以用來替代 geter和setter 方法來管理類書信。這個裝飾器裝飾的函數會轉為一個屬性的語法,可以在訪問和修改屬性的時候,執行一些額外的操作,不用顯式調用。zRl28資訊網——每日最新資訊28at.com

例,對類屬性的修改與獲取, 代碼:zRl28資訊網——每日最新資訊28at.com

# 不使用@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 = agep = Person("kira", 40) # 實例化print(p.get_name()) # kiraprint(p.get_age()) # 40p.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 = agep = Person("kira", 30)print(p.name) # kiraprint(p.age) # 30p.name = "勇哥"p.age = 35print(p.name) # 勇哥print(p.age) # 35

從上面的代碼,我們就可以了解到@property 可以做的事就很多了,比如實現屬性管理,數據驗證,類型轉換,緩存... 可讀性和安全性也不錯.zRl28資訊網——每日最新資訊28at.com

slots屬性

來到本文的最后一個要分享的 __slots__ 屬性,這個事用來指定一個類可以有那些屬性的語法,可以用來替代一下__dict__ 來節省類的內存空間,因為他避免了給每個實例創建一個 __dict__ 屬性來存儲所有屬性和值。一般用于內存優化。zRl28資訊網——每日最新資訊28at.com

例,指定一個類實例時只有指定的屬性,代碼:zRl28資訊網——每日最新資訊28at.com

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

輸出:zRl28資訊網——每日最新資訊28at.com

{'name': '測試玩家勇哥', 'age': 90}32
# 使用__slots__屬性class Person:    # 指定該類只能擁有name和age兩個屬性    __slots__ = ("name", "age")    def __init__(self, name, age):        self.name = name        self.age = agep = Person("Alice", 20)print(p.__sizeof__()) print(p.__dict__) 

輸出:zRl28資訊網——每日最新資訊28at.com

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

很明顯,這個類已經沒有了__dict__屬性了,也就是可以減少內存占用,提高訪問速度這種玩意,但是也有不好的地方,比如不能多重繼承了,也不能添加新屬性。要打印出來你限制的屬性也就只能dir 或者 getter來獲取了。總之小伙伴們看著使用吧。zRl28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-10472-0.htmlPython應知小技巧:如何用更少的代碼做更多的事情

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 使用上 Spring 的事件機制,真香!

下一篇: 利用開放接口,如何一步步打造自己的獨特圖片網站

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美呦呦网站| 猛干欧美女孩| 欧美亚洲网站| 精品成人在线视频| 国产精品久久久久久亚洲毛片| 久久在线视频| 欧美亚洲免费在线| 日韩午夜精品| 亚洲高清激情| 国产三级精品三级| 欧美日韩亚洲高清一区二区| 老鸭窝毛片一区二区三区| 欧美在线影院在线视频| 制服丝袜激情欧洲亚洲| 亚洲福利国产精品| 国产一区二区你懂的| 国产精品久久久久影院色老大| 欧美成人午夜77777| 久久九九99视频| 亚洲一区二区日本| 夜夜嗨av色一区二区不卡| 亚洲第一色在线| 国产一区二区三区高清| 国产伦精品一区二区三区免费 | 国产一区二区三区黄| 亚洲欧洲精品成人久久奇米网| 精品成人a区在线观看| 亚洲免费观看高清完整版在线观看熊| 1024国产精品| 91久久国产综合久久蜜月精品| 中文av字幕一区| 亚洲无亚洲人成网站77777| 久久精品国产v日韩v亚洲| 久久久久久久久久久久久女国产乱| 欧美一区二区三区免费大片| 欧美伊人影院| 欧美日韩高清不卡| 欧美日韩精品在线| 黄色在线一区| 亚洲第一在线综合在线| 亚洲一区亚洲二区| 午夜免费久久久久| 欧美在线免费| 可以看av的网站久久看| 国产精品视频福利| 国产午夜亚洲精品羞羞网站| 国产日韩亚洲欧美综合| 99精品免费| 欧美亚洲一区二区三区| 欧美日韩免费高清| 国产精品yjizz| 国产精品乱码久久久久久| 亚洲国产裸拍裸体视频在线观看乱了中文| 最新成人在线| 久久久久久夜| 国产欧美一区二区三区在线老狼 | 亚洲第一色中文字幕| 欧美一级专区| 国产精品久久激情| 国产一区二三区| 亚洲欧美日韩专区| 开心色5月久久精品| 国产一区二区三区日韩欧美| 雨宫琴音一区二区在线| 国产欧美日韩精品在线| 在线精品视频在线观看高清| 欧美在线日韩在线| 欧美成人dvd在线视频| 欧美精品在线视频观看| 国产精品xxx在线观看www| 亚洲狼人精品一区二区三区| 亚洲欧美综合一区| 久色婷婷小香蕉久久| 欧美日本一道本| 国产无一区二区| 亚洲人精品午夜| 亚洲尤物精选| 国产精品久久国产愉拍| 黄色国产精品一区二区三区| 一区二区三区久久| 欧美一区高清| 国产欧美一区二区三区久久| 亚洲毛片一区| 欧美精品在线观看| 亚洲精品乱码久久久久久日本蜜臀| 亚洲欧美日本国产有色| 国产精品日韩专区| 午夜视频精品| 欧美激情第3页| 国产综合网站| 夜夜嗨网站十八久久| 欧美激情在线观看| 国产专区欧美精品| 亚洲一区二区影院| 欧美国产日韩一区二区在线观看| 国产精品你懂的| 午夜免费久久久久| 国产一区二区精品久久91| 久久九九全国免费精品观看| 一区二区在线看| 欧美亚洲一区| 国产精品久久久久久久电影 | 香蕉久久国产| 国内视频一区| 欧美freesex交免费视频| 国产亚洲精品久| 久久免费视频网站| 国产啪精品视频| 久久久久久久久久久一区| 亚洲国产精品视频一区| 久久久精品国产免大香伊| 欧美视频一区在线观看| 亚洲国产另类久久精品| 久久国产黑丝| 国产精品日韩专区| 亚洲最新视频在线播放| 国产精品久久97| 久久精品国产亚洲a| 国产欧美日韩综合| 久久亚洲国产精品日日av夜夜| 91久久国产综合久久蜜月精品| 欧美午夜宅男影院| 亚洲美女精品成人在线视频| 免费不卡亚洲欧美| 一区二区三区国产在线观看| 欧美日韩a区| 亚洲精品日韩精品| 欧美大胆人体视频| 亚洲视频二区| 欧美丝袜第一区| 欧美在线免费看| 亚洲电影免费观看高清| 欧美三级网址| 亚洲一级黄色| 国内自拍亚洲| 久久天堂成人| 一本一本大道香蕉久在线精品| 欧美激情一区二区三区| 亚洲欧美美女| 亚洲国产日韩欧美综合久久| 国产精品久久久亚洲一区 | 校园激情久久| 亚洲精品欧美在线| 国产一区在线看| 欧美日韩精品一区视频| 久久精品视频99| 影音欧美亚洲| 美女网站久久| 亚洲大胆美女视频| 国产精品黄色在线观看| 蜜乳av另类精品一区二区| **性色生活片久久毛片| 欧美午夜无遮挡| 免费成人av资源网| 欧美一二区视频| 日韩一级二级三级| 激情文学综合丁香| 国产精品你懂的| 欧美日韩精品综合| 美女精品自拍一二三四| 欧美一级电影久久| 一区二区毛片| 亚洲国产综合91精品麻豆| 国产在线欧美| 国产精品素人视频| 久久免费视频在线| 午夜精品福利视频| 一二三区精品福利视频| 国产欧美一区二区三区视频| 欧美理论在线播放| 麻豆成人在线| 久久久99免费视频| 午夜在线精品| 亚洲一区二区欧美| av成人免费在线观看| 亚洲国产天堂网精品网站| 黄色日韩在线| 国产一区二区三区观看| 国产精品视频你懂的| 欧美午夜影院| 久久久蜜桃精品| 欧美一二三区在线观看| 亚洲午夜激情在线| 国产有码在线一区二区视频| 国产精品大片| 欧美色精品天天在线观看视频| 欧美在线一区二区| 亚洲欧美一区二区三区在线| 中国女人久久久| 一区二区成人精品| 日韩视频一区二区在线观看 | 国产精品一二一区| 国产精品黄色在线观看| 欧美网站大全在线观看| 欧美日韩综合另类| 欧美三级资源在线| 美女网站久久| 欧美91视频| 欧美成黄导航| 欧美激情按摩| 久久久久久日产精品| 久久成年人视频| 久久久久国产成人精品亚洲午夜| 久久爱www.|