日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Python編程常用技巧,你知道幾個?

現(xiàn)在Python是個炙手可熱的技能,很多人都想著入手學(xué)學(xué)Python編程,甚至包括一些知名人士,比如知名地產(chǎn)商潘石屹就開始學(xué)Python。關(guān)于Python編程的內(nèi)容在網(wǎng)絡(luò)上也非常多,本文給大家總結(jié)一些Python編程的常見技巧,以幫助初學(xué)者快速入門。

成都創(chuàng)新互聯(lián)專注于雁山網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供雁山營銷型網(wǎng)站建設(shè),雁山網(wǎng)站制作、雁山網(wǎng)頁設(shè)計、雁山網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造雁山網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供雁山網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

一、字符串處理技巧

1. 清理用戶輸入

對輸入的的值進行清理處理,是常見的程序要求。比如要做大小寫轉(zhuǎn)化、要驗證輸入字符的注入,通??梢酝ㄟ^寫正則用Regex來做專項任務(wù)。但是對于復(fù)雜的情況,可以用一些技巧,比如下面:

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

在此示例中,可以看到空格字符"\n"和"\t"都被替換為空格,而 "\r"被刪除。

這是一個簡單的示例,我們還可以使用unicodedata包和combinin()函數(shù)來生成大的映射表,以生成映射來替換字符串。

2. 提示用戶輸入

命令行工具或腳本需要輸入用戶名和密碼才能操作。要用這個功能,一個很有用的技巧是使用getpass模塊:

 
 
 
  1. import getpass 
  2.  
  3. user = getpass.getuser() 
  4. password = getpass.getpass() 

這三行代碼就可以讓我們優(yōu)雅的交互提醒用戶輸入輸入密碼并捕獲當(dāng)前的系統(tǒng)用戶和輸入的密碼,而且輸入密碼時候會自動屏蔽顯示,以防止被人竊取。

3. 查找字符串頻率

如果需要使用查找類似于某些輸入字符串的單詞,可以使用difflib來實現(xiàn):

 
 
 
  1. import difflib 
  2. difflib.get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'], n=2) 

# 返回['apple', 'ape']

difflib.get_close_matches會查找相似度最匹配的字串。本例中,第一個參數(shù)與第二個參數(shù)匹配。提供可選參數(shù)n,該參數(shù)指定要返回的最大匹配數(shù),以及參數(shù)cutoff(默認(rèn)值為0.6)設(shè)置為thr確定匹配字符串的分?jǐn)?shù)。

4. 多行字符串

Python中可以使用反斜杠:

 
 
 
  1. In [20]: multistr = " select * from test \ 
  2. ...: where id < 5" 
  3. In [21]: multistr 
  4. Out[21]: ' select * from test where id < 5' 

還可以使用三引號:

 
 
 
  1. In [23]: multistr ="""select * from test 
  2. ...: where id < 5""" 
  3. In [24]: multistr 
  4. Out[24]: 'select * test where id < 5' 

上面方法共有的問題是缺少合適的縮進,如果我們嘗試縮進會在字符串中插入空格。所以最后的解決方案是將字符串分為多行并且將整個字符串包含在括號中:

 
 
 
  1. In [25]: multistr = ("select * from multi_row " 
  2. ...: "where row_id < 5 " 
  3. ...: "order by age") 
  4. In [26]: multistr 
  5. Out[26]: 'select * from multi_row where row_id < 5 order by age' 

5. 處理IP地址

日常常用的一個是驗證和匹配IP地址,這個功能有個專門的模塊ipaddress可以來處理。比如我們要用IP網(wǎng)段(CIDR用IP和掩碼位)生成一個IP地址列表:

 
 
 
  1. import ipaddress 
  2. net = ipaddress.ip_network('192.168.1.0/27') 

結(jié)果:

 
 
 
  1. #192.168.1.0 
  2. #192.168.1.1 
  3. #192.168.1.2 
  4. #192.168.1.3 
  5. #... 

另一個不錯的功能IP地址是否在IP段的驗證:

 
 
 
  1. ip = ipaddress.ip_address("192.168.1.2") 
  2. ip in net 
  3. # True 
  4.  
  5.  
  6. ip = ipaddress.ip_address("192.168.1. 253") 
  7. ip in net 
  8. # False 

ip地址轉(zhuǎn)字符串、整數(shù)值的互轉(zhuǎn):

 
 
 
  1. >>> str(ipaddress.IPv4Address('192.168.0.1')) 
  2. '192.168.0.1' 
  3. >>> int(ipaddress.IPv4Address('192.168.0.1')) 
  4. 3232235521 
  5. >>> str(ipaddress.IPv6Address('::1')) 
  6. '::1' 
  7. >>> int(ipaddress.IPv6Address('::1')) 

注意ipaddress還支持很多其他的功能,比如支持ipv4和ipv6等,具體可以參考模塊的文檔。

二、性能優(yōu)化技巧

1. 限制CPU和內(nèi)存使用量

如果Python程序占用資源太大,想限制資源的使用,可以使用resource包。

 
 
 
  1. # CPU限制 
  2. def time_exceeded(signo, frame): 
  3. print("CPU 超額...") 
  4. raise SystemExit(1) 
  5. def set_max_runtime(seconds): 
  6. soft, hard = resource.getrlimit(resource.RLIMIT_CPU) 
  7. resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard)) 
  8. signal.signal(signal.SIGXCPU, time_exceeded) 
  9. # 限制內(nèi)存使用 
  10. def set_max_memory(size): 
  11. soft, hard = resource.getrlimit(resource.RLIMIT_AS) 
  12. resource.setrlimit(resource.RLIMIT_AS, (size, hard)) 

對CPU限制時候,先獲取特定資源(RLIMIT_CPU)的軟限制和硬限制,然后使用參數(shù)指定的秒數(shù)和獲取的硬限制來設(shè)置。如果超過CPU時間,將注冊導(dǎo)致系統(tǒng)退出的信號。

對內(nèi)存限制,也先獲取軟限制和硬限制,并用帶有size參數(shù)的setrlimit對其進行設(shè)置。

2. 通過__slots__節(jié)省內(nèi)存

如果程序中有一個類需要創(chuàng)建大量實例,那么可能會對內(nèi)存占用會非常大。因為Python使用字典來表示類實例的屬性,這可以加速執(zhí)行,但內(nèi)存效率很差,通常這不是問題??梢允褂胈_slots__來優(yōu)化:

 
 
 
  1. import sys 
  2. class FileSystem(object): 
 
 
 
  1. def __init__(self, files, folders, devices): 
  2. self.files = files 
  3. self.folders = folders 
  4. self.devices = devices 
  5. print(sys.getsizeof( FileSystem )) 
  6.  
  7.  
  8. class FileSystem1(object): 
  9.  
  10.  
  11. __slots__ = ['files', 'folders', 'devices'] 
  12. def __init__(self, files, folders, devices): 
  13. self.files = files 
  14. self.folders = folders 
  15. self.devices = devices 
  16. print(sys.getsizeof( FileSystem1 )) 

  • # Python 3.5下
  • #1-> 1016
  • #2-> 888

當(dāng)定義__slots__屬性時,Python使用固定大小的數(shù)組作為屬性,而不用字典,這大大減少了每個實例所需的內(nèi)存。當(dāng)然使用__slots__也有缺點,比如,無法聲明任何新屬性,而且只能在_??_slots__上使用它們,__slots__的類也不能使用多重繼承。

3. 用lru_cache緩存函數(shù)調(diào)用

都說Python性能差,尤其是一些計算的時候,其實是有一些通用的方法可以解決程序能的問題,比如緩存和記憶術(shù)。使用functools中的lru_cache可以解決迭代計算中大量重復(fù)迭代調(diào)用問題:

 
 
 
  1. # CacheInfo(hits=2, misses=4, maxsize=32, currsize=4) 

在上例中,我們執(zhí)行正在緩存的GET請求(最多3個緩存結(jié)果)。還使用cache_info方法檢查函數(shù)的緩存信息。裝飾器還提供了clear_cache方法,用于刪除緩存。

4. __all__控制import

某些語言支持import成員(變量,方法,接口)的機制。在Python中,默認(rèn)所有內(nèi)容都會import,但是可以使用__all__來限制

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

通過這樣的方式我們可以限制從some_module import *使用時可以導(dǎo)入的內(nèi)容。該實例中,則僅import bar函數(shù)。如果將__all__保留為空,并且在使用通配符import時,不會import任何東西,會觸發(fā)AttributeError錯誤。

三、面向?qū)ο?/strong>

1. 創(chuàng)建支持With語句的對象

我們都知道如何使用打開或關(guān)閉語句,例如打開文件或獲取鎖,但是如何實現(xiàn)自己的方法呢?

可以使用__enter__和__exit__方法實現(xiàn):

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

這是在Python中實現(xiàn)上下文管理的最常見方法,但是有一種更簡單的方法:

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

上面的代碼段使用contextmanager管理器裝飾器實現(xiàn)了內(nèi)容管理協(xié)議。進入with塊時,執(zhí)行標(biāo)記函數(shù)的第一部分(在yield之前),然后執(zhí)行該塊,最后執(zhí)行其余的標(biāo)記函數(shù)。

2. 重載運算符號的技巧

考慮到有很多比較運算符:__lt__ , __le__ , __gt__,對于一個類實現(xiàn)所有比較運算符可能會很煩人。這時候可以使用functools.total_ordering:

 
 
 
  1. from functools import total_ordering 
  2. @total_ordering 
  3. class Number: 
  4. def __init__(self, value): 
  5. self.value = value 
  6. def __lt__(self, other): 
  7. return self.value < other.value 
  8. def __eq__(self, other): 
  9. return self.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裝飾器用于簡化為類實現(xiàn)實例排序的過程。只需要定義__lt__和__eq__。

3. 在一個類中定義多個構(gòu)造函數(shù)

函數(shù)重載是編程語言中非常常見的功能。即使Python不能重載正常的函數(shù),我們也可以使用類方法重載構(gòu)造函數(shù):

 
 
 
  1. import datetime 
  2. class Date: 
  3. def __init__(self, year, month, day): 
  4. self.year = year 
  5. self.month = month 
  6. self.day = day 
  7. @classmethod 
  8. def today(cls): 
  9. t = datetime.datetime.now() 
  10. return cls(t.year, t.month, t.day) 
  11. d = Date.today() 
  12. print(f"{d.day}/{d.month}/{d.year}") 

# 14/9/2019

可以不使用構(gòu)造函數(shù)將所有邏輯都放入__init__并使用*args,**kwargs和一堆if語句來解決,但是比較丑陋,沒有可讀性和可維護性。

4. 獲取對象信息

Python提供了幾個函數(shù)以便我們更好的獲取對象的信息,這些函數(shù)包括:type、isinstance和dir。

其中type():用于判斷對象類型:

 
 
 
  1. >>> type(None) 
  2.  
  3. >>> type(abs) 
  4.  

對類對象type()返回的是對應(yīng)class類型。下面是判斷兩個變量的type類型是否相同:

 
 
 
  1. >>> type(11) == type(22) 
  2. True 
  3. >>> type('abc') == str 
  4. True 
  5. >>> type('abc') == type(33) 
  6. False 

isinstance():可以顯示對象是否是某種類型

 
 
 
  1. >>> class Husty(Dog): 
  2. ... pass 
  3. ... 
  4. >>> a = Animal() 
  5. >>> b = Dog() 
  6. >>> c = Husty() 
  7. >>> isinstance(c,Husty) 
  8. True 
  9. >>> isinstance(c,Dog) 
  10. True 
  11. >>> isinstance(c,Animal) 
  12. True 
  13. >>> isinstance(b,Husty) 
  14. False 

Husty是Husty、Dog、Animal類型的對象,卻不能說Dog是Husty的對象。

dir():用于獲取一個對象的所有方法和屬性。返回值是一個包含字符串的list:

 
 
 
  1. >>> dir('abc') 
  2. ['__add__', '__class__',…… '__hash__', '__init__', '__i 
  3. ……'isalnum 
  4. 'isidentifier', 'islower', …… 'translate', 'upper', 'zfill'] 

其中,類似__xx__的屬性和方法都是有特殊用途的。如果調(diào)用len()函數(shù)視圖獲取一個對象的長度,其實在len()函數(shù)內(nèi)部會自動去調(diào)用該對象的__len__()方法。

5. Iterator和切片

如果直接對Iterator切片,則會得到TypeError,指出生成器對象不可下標(biāo)反問,但是有一個技巧:

 
 
 
  1. import itertools 
  2. s = itertools.islice(range(50), 10, 20) 
  3. for val in s: 
  4. ... 

使用itertools.islice,可以創(chuàng)建一個islice對象,該對象是生成所需項目的迭代器。但是,這會消耗所有生成器項,直到分片開始為止,而且還會消耗islice對象中的所有項。

6. 跳過一些行

有時,必須使用已知以可變數(shù)量的不需要的行(例如注釋)。也可以使用itertools:

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

該代碼段僅在初始注釋部分之后產(chǎn)生行。如果只想在迭代器的開頭丟棄并且不知道其中有多少個項目,則此方法很有用。

7. 命名切片

使用大量硬編碼的索引值會很容易引起代碼繁瑣和破壞代碼可讀性。常用的技巧是對索引值使用常量,除此之外我們可以使用命名切片:

示例中,可以看到可以索引,方法是先使用slice函數(shù)命名它們,然后在切出一部分字符串時使用它們。還可以使用切片對象的屬性.start,.stop和.step獲得更多信息。

四、調(diào)試技巧

1. 腳本調(diào)試

Python的腳本調(diào)試可以是使用pdb模塊。它可以讓我們在腳本中隨意設(shè)置設(shè)置斷點:

 
 
 
  1. import pdb 
  2. pdb.set_trace() 

可以在腳本中任何位置指定pdb.set_trace()并設(shè)置斷點,非常便捷

2. 在shell中調(diào)試程序

在shell中,可以使用python的-i選項就可以啟動交互式環(huán)境,在該環(huán)境下可以打印運行時變量值并調(diào)用函數(shù)的操作等,比如下面的test.py腳本

 
 
 
  1. def func(): 
  2. return 0 / 0 
  3. func() 

在shell中通過python -i test.py運行腳本

我們import pdb然后調(diào)用pdb.pm()啟動調(diào)試器

會顯示程序到崩潰的地方,我們退出程序的在該處設(shè)置一個斷點:

 
 
 
  1. import pdb; 
  2. def func(): 
  3. pdb.set_trace() 
  4. return 0 / 0 
  5. func() 

再次運行它,會在斷點處停止,step到下一步

用這樣的方法,我們可以調(diào)試和回溯程序的執(zhí)行。通過設(shè)置斷點,然后在運行程序時,執(zhí)行將在斷點處停止,可以檢查程序,例如列出函數(shù)參數(shù),對表達式求值,列出變量或step逐步執(zhí)行等。

五、有用的小工具

1. 一鍵web服務(wù)共享

在Python中可以使用http.server一鍵啟用一個 HTTP 服務(wù)器,這是一個非常方便的共享工具:

 
 
 
  1. python -m http.server 

在默認(rèn)監(jiān)聽端口為 8000 開啟一個服務(wù)器,可以自定義端口,比如8888

 
 
 
  1. python -m http.server 8888 

代碼自動補齊Jedi

Jedi是一個用于Python代碼自動補齊和靜態(tài)分析的庫。Jedi可以讓我們高效的敲代碼。

目前Jedi已經(jīng)提供了絕大多數(shù)的編輯器插件,包括Vim(jedi-vim),VSC,Emacs,Sublime,Atom等。

2. 美化異常輸出pretty-errors

Python默認(rèn)的報錯輸出非常亂,看的人頭大,可讀性差。這時候就需要用pretty-errors這個錯誤美化工具了。

結(jié)論

本文我們總結(jié)了一些Python日常并使用中常見的一些技巧,拋磚引玉以給大家一些幫助和啟發(fā)。所有這些功能是Python標(biāo)準(zhǔn)庫中內(nèi)容,在日常使用中也建議大家盡量使用python標(biāo)準(zhǔn)庫,避免使用第三方庫。


文章標(biāo)題:Python編程常用技巧,你知道幾個?
網(wǎng)站網(wǎng)址:http://www.5511xx.com/article/coioios.html