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

這些Python高效率技巧,一般人都不會!

開發 后端
你估計已經看了不少關于 Python 技巧的文章,里面可能會提到變量拆包(unpacking)、局部函數等,但是 Python 還有很多不為人知的高效用法,等待著被人發現。本文將介紹作者縱觀全網之后,都屬于很少沒提及的技巧。

[[285806]]

你估計已經看了不少關于 Python 技巧的文章,里面可能會提到變量拆包(unpacking)、局部函數等,但是 Python 還有很多不為人知的高效用法,等待著被人發現。本文將介紹作者縱觀全網之后,都屬于很少沒提及的技巧。

清理字符串輸入

清理用戶輸入的問題,幾乎適用于我們可能編寫的每個程序。通常將字符轉換為小寫或大寫就足夠了,這時只需要使用正則即可,但是對于復雜的情況,有一種更好的方法:   

  1. user_input = "This\nstring has\tsome whitespaces...\r\n"  
  2.     character_map = {  
  3.         ord('\n') : ' ',  
  4.         ord('\t') : ' ',  
  5.         ord('\r') : None  
  6.     } 
  7.      user_input.translate(character_map)  # This string has some whitespaces... " 

在上述示例中,可以看到空格符“ \ n”和“ \ t”已被單個空格替換,而“ \ r”已被完全刪除。這是一個簡單的示例,但是我們可以更進一步,使用 unicodedata包及其 combining()函數生成范圍更廣的映射表,從字符串中刪除所有重音符號。

迭代器切片

如果您嘗試獲取迭代器的切片,系統會報 TypeError,提示生成器對象不可下標,但是解決方案很簡單: 

  1. import itertools  
  2.  s = itertools.islice(range(50), 10, 20)  # <itertools.islice object at 0x7f70fab88138>  
  3.  for val in s:  
  4.  ... 

使用 itertools.islice,我們可以創建一個 islice對象,該對象是產生所需元素的迭代器。不過,請務必注意,這會消耗所有生成器項,直到切片開始為止,而且還會消耗我們的“ islice”對象中的所有項。

Using itertools.islice we can create a islice object which is an iterator that produces desired items. It's important to note though, that this consumes all generator items up until the start of slice and also all the items in our islice object.

跳過可迭代對象的開始

有時候需要處理的文件里,明確存在一些不需要的數據行,但是我們不確定數量,比如說代碼中的注釋。這時, itertools 再次為我們提供了簡潔的方案:   

  1. string_from_file = "" 
  2.    // Author: ...  
  3.    // License: ...  
  4.    //  
  5.    // Date: ...  
  6.    Actual content...  
  7.    """  
  8.    import itertools  
  9.    for line in itertools.dropwhile(lambda line: line.startswith("//"), string_from_file.split("\n")):  
  10.    print(line) 

這段代碼僅在初始注釋部分之后,才會產生數據行。如果我們只想在迭代器的開頭丟棄數據,而又不知道有具體數量時,這個方法很有用。

僅帶關鍵字參數(kwargs)的函數

有時候,使用僅支持關鍵字參數的函數可以讓代碼更加清晰易懂:   

  1. def test(*, a, b):  
  2.    pass  
  3.    test("value for a", "value for b")  # TypeError: test() takes 0 positional arguments...  
  4.    test(a="value"b="value 2")  # Works... 

只需要在關鍵字參數前面再加一個 * 參數,就可以輕松實現了。當然,如果還希望再加上位置參數,可以在 * 參數前面再增加。

創建支持 with語句的對象

我們都知道如何打開文件或使用 with語句獲取鎖,但是怎樣自己可以實現類似的功能呢?一般來說,我們可以使用 __enter__和 __exit__方法來實現上下文管理器協議:   

  1. classConnection:  
  2.    def __init__(self):  
  3.    ...  
  4.    def __enter__(self):  
  5.    # Initialize connection...  
  6.    def __exit__(self, type, value, traceback):  
  7.    # Close connection...  
  8.    withConnection() as c:  
  9.    # __enter__() executes  
  10.    ...  
  11.    # conn.__exit__() executes 

上面是最常見的實現方式,但是還有一種更簡單的方法:   

  1. from contextlib import contextmanager  
  2.    @contextmanager  
  3.    def tag(name):  
  4.    print(f"<{name}>")  
  5.    yield  
  6.    print(f"")  
  7.    with tag("h1"):  
  8.    print("This is Title.") 

上面的代碼段使用 contextmanager管理器裝飾器實現了內容管理協議。進入“ with”塊時,執行“ tag”函數的第一部分(在“ yield”之前),然后執行 yield,最后執行其余部分。

用 __slots__節省內存

如果程序需要創建大量的類實例,我們會發現程序占用了大量內存。這是因為 Python 使用字典來表示類實例的屬性,這樣的話創建速度很快,但是很耗內存。如果內存是你需要考慮的一個問題,那么可以考慮使用 __slots__:   

  1. classPerson:  
  2.        __slots__ = ["first_name", "last_name", "phone"]  
  3.    def __init__(self, first_name, last_name, phone):  
  4.    self.first_name = first_name  
  5.    self.last_name = last_name  
  6.    self.phone = phone 

當我們定義 __slots__屬性時,Python會使用固定大小的數組(占用內存少)來存儲屬性,而不是字典,這大大減少了每個實例所需的內存。不過使用 __slots__還有一些缺點:無法聲明任何新屬性,我們只能使用 __slots__中的那些屬性。同樣,帶有 __slots__的類不能使用多重繼承。

限制CPU和內存使用量

如果不是想優化程序內存或CPU使用率,而是想直接將其限制為某個數值,那么Python也有一個可以滿足要求的庫:   

  1. import signal  
  2.     import resource  
  3.     import os  
  4.     # To Limit CPU time  
  5.     def time_exceeded(signo, frame):  
  6.     print("CPU exceeded...")  
  7.     raiseSystemExit(1)  
  8.     def set_max_runtime(seconds):  
  9.     # Install the signal handler and set a resource limit  
  10.         soft, hard = resource.getrlimit(resource.RLIMIT_CPU)  
  11.         resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard))  
  12.         signal.signal(signal.SIGXCPU, time_exceeded)  
  13.     # To limit memory usage  
  14.     def set_max_memory(size):  
  15.         soft, hard = resource.getrlimit(resource.RLIMIT_AS)  
  16.         resource.setrlimit(resource.RLIMIT_AS, (size, hard)) 

在這里,我們可以設置了最大cpu運行時間以及最大內存使用限制的兩個選項。對于cpu限制,我們首先獲得該特定資源( RLIMIT_CPU)的軟限制和硬限制,然后使用參數指定的秒數和先前獲取的硬限制來設置。

最后,我們注冊了一個在超過CPU時間后,讓系統退出的信號。至于內存,我們再次獲取軟限制和硬限制,并使用帶有大小參數的 setrlimit和硬限制完成配置

控制導入的內容

某些語言提供了導出成員(變量,方法,接口)的顯式機制,例如Golang,它僅導出以大寫字母開頭的成員。但是在Python中,所有對象都會導出,除非我們使用 __all__:   

  1. def foo():  
  2.    pass  
  3.    def bar():  
  4.    pass  
  5.    __all__ = ["bar"] 

上面的代碼段中,只會導出 bar函數。另外,如果 __all__的值為空,那么不會導出任何函數,而且在導入該模塊時系統會報 AttributeError。

實現比較運算符

如果我們要逐一為某個類實現所有的比較運算符,你肯定會覺得很麻煩,因為要實現的方法還不少,有 __lt__,__le__,__gt__, 和 __ge__。 

其實,Python 提供了一種便捷的實現方式,就是通過 functools.total_ordering裝飾器。   

  1. from functools import total_ordering  
  2.    @total_ordering  
  3.    classNumber:  
  4.    def __init__(self, value):  
  5.    self.value = value  
  6.    def __lt__(self, other):  
  7.    returnself.value < other.value  
  8.    def __eq__(self, other):  
  9.    returnself.value == other.value  
  10.    print(Number(20) > Number(3))  
  11.    print(Number(1) < Number(5))  
  12.    print(Number(15) >= Number(15))  
  13.    print(Number(10) <= Number(2)) 

這是怎么實現的呢? total_ordering可以用來簡化實現類排序的過程。我們只需要定義 __lt__和 __eq__(這是映射剩余操作的最低要求),然后就交給裝飾器去完成剩余的工作了。

結語

在日常Python編程時,上述特性并非都是必不可少的和有用的,但是其中某些功能可能會不時派上用場,并能簡化冗長且令人討厭的任務。

還要指出的是,所有這些功能都是Python標準庫的一部分,而在我看來,其中一些功能似乎不像是應該在標準庫中的功能。

因此,每當你決定要用Python實現某些功能時,都請先在標準庫中找一找,如果找不到合適的庫,那么可能是因為查找的姿勢不對。而且即使標準庫里沒有,有很大的概率已經存在一個第三方庫了! 

 

責任編輯:龐桂玉 來源: Python之禪
相關推薦

2018-01-25 09:15:16

機房機柜走線

2017-07-21 11:12:51

跳線裝機技巧

2015-03-16 11:33:16

程序員代碼bug

2020-03-23 08:36:18

Python編程代碼

2021-12-14 10:55:14

Python元素數據

2019-07-22 06:33:55

R語言編程函數

2021-04-20 09:55:37

Linux 開源操作系統

2016-12-29 11:41:45

2015-06-24 10:01:47

2023-05-16 07:15:11

架構模型對象

2022-03-27 22:07:35

元宇宙虛擬人IBM

2010-01-04 09:40:12

雙i7服務器主板

2015-11-27 12:59:11

Android技巧提高效率

2010-08-19 10:18:02

寬帶路由器

2018-09-30 14:46:38

Linux命令技巧

2010-11-17 15:55:31

VMware虛擬機

2018-06-28 12:47:30

2020-06-04 15:55:54

GitHub代碼開發者

2025-01-15 17:00:00

開發Linux命令

2021-01-14 07:46:08

Windows 7微軟操作系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美午夜精品 | 欧美国产视频 | 久久国产一区二区 | 亚洲精品在线免费 | 国产日本精品视频 | 亚洲色欲色欲www | 日韩精品一区二区在线 | 综合久久av | 天天干天天玩天天操 | 亚洲一区二区视频 | 成人在线电影网站 | 中文字幕成人网 | 中文字幕免费视频 | 日本一道本 | 瑞克和莫蒂第五季在线观看 | 91电影院| 国产欧美在线一区 | 91久久久www播放日本观看 | 日本亚洲精品成人欧美一区 | 国产精品久久久久久久久久三级 | 亚洲一区二区三区桃乃木香奈 | 人成久久| 国产天天操 | 久久精品日产第一区二区三区 | 在线观看中文视频 | 成人在线观看网站 | www.国产.com| 色av一区二区 | 亚洲不卡在线观看 | 精品欧美激情在线观看 | 一区二区三区四区在线视频 | 国精日本亚洲欧州国产中文久久 | 毛片网在线观看 | 请别相信他免费喜剧电影在线观看 | 99精品国产一区二区青青牛奶 | 91av入口| 成人免费在线播放 | 久久久久亚洲精品 | 可以免费看的毛片 | 情侣av| 99日韩 |