成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發
Python有著很多特性和技巧,可以幫助我們編寫更高效、更優雅、更易維護的代碼。下面將介紹一些我常用的Python代碼優化的簡單小技巧,少寫很多代碼。

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

短路運算(Short-circuit operation)

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

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

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

def get_user(user):
    return user or "匿名用戶"

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

切片替代循環(Slice)

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

例,反轉數據,代碼:

# 使用循環
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]

切片的操作比循環或遞歸更簡單并且高效,因為切片是基于內置函數實現的,而循環或遞歸是基于自定義函數實現。

列表推導式(List Comprehension)

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

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

# 使用普通的循環
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]

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

生成器表達式(Generator Expression)

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

例,計算一個列表中所有偶數的平方和,代碼:

# 使用普通的循環
lst = [1, 2, 3, 4, 5, 6]
sum = 0
for x in lst:
    if x % 2 == 0:
        sum += x ** 2
print(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也能做一個生成器,這個太東西很牛逼。

枚舉(Enumerate)

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

例,打印一個列表中每個元素及其對應的索引,代碼:

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

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

三元運算符(Ternary Operator)

三元運算符是一種用于根據一個條件表達式來選擇兩個不同的值的簡潔的語法。

例,根據一個數字的正負來賦值一個字符串,代碼:

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

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

字典處理條件判斷

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

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

# 使用多個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)

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

例,給一個函數添加一個計時的功能,記錄其運行時間,代碼:

# 使用普通的函數調用
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 # 相當于 foo = timer(foo)
def foo():
    # do something
    time.sleep(1)

foo() 

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

上下文管理器(Context Manager)

上下文管理器是一種用于在執行某些操作之前和之后自動執行一些預設的操作的語法。上下文管理器可以用于實現一些資源管理的功能,

例如,打開一個文件,讀取其內容,并在完成后自動關閉文件,代碼:

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

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

Lambda 表達式(Lambda Expression)

lambda表達式(代替簡單的函數定義來創建匿名函數。lambda表達式是一種用于定義一個只有一行代碼的函數的簡潔的語法。

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

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

print(sorted(add, item))

# 使用lambda表達式
print(sorted(lst, key=lambda x:x))

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

map 函數

map函數代替循環來對可迭代對象中的每個元素應用一個函數。map函數是一種用于將一個函數作用于一個可迭代對象中的每個元素,并返回一個新的可迭代對象的函數。

例,將一批字符列表字符串轉數字列表,代碼:

# 不使用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]

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

filter 函數

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

例,從一個列表中挑選符合要求的數據出來組成另一個列表,代碼:

# 不使用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函數可以用于實現一些篩選和過濾的功能,如刪除空值、去重、選擇子集等,也是一個很牛的高階函數。

@properyt 裝飾器

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

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

# 不使用@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) # 實例化
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 可以做的事就很多了,比如實現屬性管理,數據驗證,類型轉換,緩存... 可讀性和安全性也不錯.

slots屬性

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

例,指定一個類實例時只有指定的屬性,代碼:

# 不使用__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兩個屬性
    __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

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

責任編輯:趙寧寧 來源: 測試玩家勇哥
相關推薦

2020-09-21 10:45:38

邊緣計算

2011-03-28 08:51:41

網頁設計WebSEO

2022-07-20 00:03:10

Python列表字典推導

2012-07-03 09:59:03

程序員

2010-09-14 14:28:58

Scala

2016-02-19 09:28:08

Applepay開發者

2021-12-07 11:31:47

Python代碼if…elif…els

2024-03-13 08:22:18

Sort()函數Python

2022-09-21 15:11:28

MySQL數據庫技巧

2021-05-22 10:01:45

PythonPython列表Python程序開發

2017-12-04 09:39:41

瀏覽器Chrome小技巧

2011-05-27 17:06:11

SEO

2024-01-08 17:09:07

Python解釋器CPython

2016-05-03 10:19:04

H5技巧干貨

2021-12-19 22:36:42

Python代碼開發

2018-11-28 12:30:58

Python命令行編程語言

2022-11-24 10:34:05

CSS前端

2019-07-04 18:41:13

物聯網農業數據

2020-09-26 21:50:26

JavaScript代碼開發

2022-03-10 08:01:06

CSS技巧選擇器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一本色道精品久久一区二区三区 | 亚洲国产中文字幕 | 国产精品久久久久久久久大全 | 成人免费观看男女羞羞视频 | 国产精品视频久久久 | 国产亚洲一区二区三区 | 国产精品日韩欧美一区二区三区 | 亚洲成人av一区二区 | 精品欧美色视频网站在线观看 | 福利网址| 欧美视频精品 | 亚洲成人在线网 | 毛片韩国| 中文字幕二区 | 日韩快播电影网 | 国产高清视频在线观看播放 | 国内精品免费久久久久软件老师 | av免费观看网站 | 日韩在线一区二区三区 | 久久久久国产 | www狠狠干| 国产精品色 | 成人中文网| 欧美激情一区二区三区 | 欧美国产精品 | 日韩在线资源 | 超碰av免费 | 男女精品久久 | 午夜天堂 | 久久国产精品精品国产色婷婷 | 国产成视频在线观看 | 久久久久91 | 中文字幕一区二区三区精彩视频 | 在线亚洲电影 | 黄免费在线 | 在线中文一区 | 一区二区三区欧美大片 | 91精品国产综合久久精品图片 | 国产精品极品美女在线观看免费 | 日韩欧美国产一区二区 | 久久亚洲一区二区三 |