python程式小技巧
1 在作比較時可以這樣寫: 3.14
2 Int類型不會在超過31bit或32bit後溢出, 它們會變成long型。 在python裡, long並非就是64位,
3預設值只會在編譯時被賦值一次, 而非運行時。 試試這個: def func(a[]): a.append(42); 返回值a會隨調用不斷加入42. python的教程裡有更多相關的討論。
4 連接多個字串時, ””.join(list)會比 for x in list: s+=x快得多。 實際上 join調用複雜度是o(n),而+=是o(n2).有很多人要求使這個調用更快, 而且python2.5裡似乎也應該變得更快了。
5 語法 print >>file裡, 僅數值被寫入檔中, 而print的格式化功能不起作用。 在python 3000總, print會變成一個函數, 而且帶有了更多高級的特性。
6 通過(x,)來創建只有一個元素的tuple,通常你只能建立如(x,y,z)那樣的tuple,如果你想通過(x)來建立一個tuple,得到的只是x。
7如果想看看整數類的説明文檔, 可以寫(5).__str__; 不能簡化成5.__str__, 因為解譯器會把5.認作是浮點數,
8可以使用屬性而不是getter或setter函數。 例如serial. baudrate=192000 可以設置serial._baud,跟調用其它調用的效果一樣。
9 一個緊跟在for迴圈後的else語句只有在迴圈不通過break退出時才會被調用。 這對查找迴圈很有用處, 通常這樣的迴圈都會需要在退出後作額外的檢查判斷。
Python語言小技巧
技巧1:字串倒置
>>> a = “codementor”>>> print “Reverse is”,a[::-1]
倒置之後的結果是“rotnemedoc”。
技巧2
轉置矩陣(transposing a matrix)(譯者注:把矩陣A的行換成相應的列, 得到的新矩陣稱為A的轉置矩陣)
>>> mat = [[1, 2, 3], [4, 5, 6]]>>> zip(*mat)
[(1, 4), (2, 5), (3, 6)]
技巧3
a = [1,2,3]
將上述列表中的三個值分別存儲在3個新變數中。
>>> a = [1, 2, 3]>>> x, y, z = a>>> x1>>> y2>>> z3
技巧4
a = [“Code”, “mentor”, “Python”, “Developer”]
利用上述清單中的所有元素, 創建一個字串。
>>> print ” “.join(a)
Code mentor Python Developer
技巧5
list1 = [‘a’, ‘b’, ‘c’, ‘d’]list2 = [‘p’, ‘q’, ‘r’, ‘s’]
編寫可以列印出下面結果的代碼
ap
bq
cr
ds>>> for x, y in zip(list1,list2):… print x, y
…
a p
b q
c r
d s
技巧6
一行代碼交換兩個變數的值
>>> a=7>>> b=5>>> b, a =a, b>>> a5>>> b7
技巧7
不使用迴圈列印出“codecodecodecode mentormentormentormentormentor”
>>> print “code”*4+’ ‘+”mentor”*5codecodecodecode mentormentormentormentormentor
技巧8
a = [[1, 2], [3, 4], [5, 6]]
不使用任何迴圈, 將上面的嵌套列表轉換成單一清單(即組成元素不是清單)
輸出結果應為: [1, 2, 3, 4, 5, 6]
>>> import itertools>>> list(itertools.chain.from_iterable(a))
[1, 2, 3, 4, 5, 6]
技巧9
判斷兩個單詞是否是回文單詞(anagram)?
def is_anagram(word1, word2):”””Checks whether the words are anagrams.
word1: string
word2: string
returns: boolean
“””
完成上面的函數
from collections import Counterdef is_anagram(str1, str2):return Counter(str1) == Counter(str2)>>> is_anagram(‘abcd’,’dbca’)True>>> is_anagram(‘abcd’,’dbaa’)False
技巧10
接受手動輸入字串, 並返回一個清單。
例如, 輸入“1 2 3 4”, 需要返回的清單是[1, 2, 3, 4]。
記住, 返回清單中的元素是整型數。 代碼不要超過一行。
>>> result = map(lambda x:int(x) ,raw_input().split())1 2 3 4>>> result
[1, 2, 3, 4]
關於 Python requests 一些小技巧
1:保持請求之間的Cookies, 我們可以這樣做。
import requests
self.session = requests.Session()
self.session.get(login_url) # 可以保持登錄態
2:請求時, 會加上headers, 一般我們會寫成這樣
self.session.get(url, params, headers=headers)
唯一不便的是之後的代碼每次都需要這麼寫, 代碼顯得臃腫, 所以我們可以這樣:
#在構造函數中, 這樣設置是全域的。
# 設置請求頭
self.s = requests.Session()
self.s.headers = {‘balabala’}
# 移除伺服器驗證
self.s.verify = False
# 設置代理
self.s.proxies={‘aa’}
3:默認requests請求失敗後不會重試, 但是我們跑case時難免遇到一些網路或外部原因導致case失敗, 我們可以在Session實例上附加HTTPAdapaters 參數, 增加失敗重試次數。
request_retry = requests.adapatrs.HTTPAdapaters(max_retries=3)
self.session.mount(‘https://’,request_retry)
self.session.mount(‘http://’,request_retry)
這樣, 之後的請求, 若失敗, 重試3次。
4:重定向
網路請求中可能會遇到重定向, 我們需要一次處理一個請求, 可以把重定向禁止。
self.session.post(url,data,allow_redirects=False)
5: post請求提交json格式資料時(請求頭為:{“Content-Type”: “application/json”}), 一般先要把python物件轉換成json物件。 可能很多時候是這樣寫:
self.session.post(url, data=json.dumps(data))。
其實post有一個默認參數json, 可以直接簡寫成:
self.session.post(url, json=data)
6:寫介面請求, debug時, 會需要看下代碼請求的詳細資訊, 當然我們可以使用fiddler來查看, 其實我們自己也可以在代碼這樣獲取debug資訊*
import requests
import logging
import httplib as http_client
http_client.HTTPConnection.debuglevel = 1
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger(“requests.packages.urllib3”)
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True
requests.get(‘https://www.baidu.com’)
#更好的方法是自己封裝一個裝飾器, 就可以為任意請求函數添加一個debug功能。
7:使用grequests實現非同步請求。
pip install grequests
import grequests
urls = [
‘http://www.url1.com’,
‘http://www.url2.com’,
‘http://www.url3.com’,
‘http://www.url4.com’,
‘http://www.url5.com’,
‘http://www.url6.com’,
]
resp = (grequests.get(u) for u in urls)
grequests.map(resp)
# [
8:發送自訂cookies
使用Session實例來保持請求之間的cookies, 但是有些特殊情況, 需要使用自訂的cookies
可以這樣
# 自訂cookies
cookie = {‘guid’:’5BF0FAB4-A7CF-463E-8C17-C1576fc7a9a8′,’uuid’:’3ff5f4091f35a467′}
session.post(‘http://wikipedia.org’, cookies=cookie)
9:需求確定前後端並行設計時, 這時測試並沒有辦法調用介面, 如何做介面測試呢?我們可以使用mock或者是httpretty
import requests
import httpretty
# 類比返還的狀態碼
@httpretty.activate
def test_beta1_access():
httpretty.register_uri(httpretty.GET, “http://beta.com/”,
body=”here is the mocked body”,
status=201)
response = requests.get(‘http://beta.com’)
expect(response.status_code).to.equal(201)
# 模擬返還response的body
@httpretty.activate
def test_some_api():
httpretty.register_uri(httpretty.GET, “http://beta.com/”,
body='{“success”: false}’,
content_type=’text/json’)
response = requests.get(‘http://beta.com/’)
expect(response.json()).to.equal({‘success’: False})
詳細使用可以查看API_DOC
10:統計一個API請求花費的時間, 我們可以使用如下方法
self.session.get(url).elapsed
11:設置請求超時
self.session.get(url, timeout=15)
# timeout 僅對連接過程有效, 與回應體的下載無關。
# timeout 並不是整個下載回應的時間限制, 而是如果伺服器在15 秒內沒有應答,將會引發一個異常(更精確地說,是在 timeout 秒內沒有從基礎通訊端上接收到任何位元組的資料時)
代碼簽章憑證是保護開發者的勞動成果,給自己開發的軟體簽名的證書,保證代碼在簽名之後不被惡意篡改。使用者可通過對代碼的數位簽章來標識軟體來源,辨別軟體發展者的真實身份。GDCA的代碼簽章憑證支持多種代碼簽名,已通過WEBTRUST國際認證。
文章轉載:https://www.trustauth.cn/wiki/20795.html
而是如果伺服器在15 秒內沒有應答,將會引發一個異常(更精確地說,是在 timeout 秒內沒有從基礎通訊端上接收到任何位元組的資料時)代碼簽章憑證是保護開發者的勞動成果,給自己開發的軟體簽名的證書,保證代碼在簽名之後不被惡意篡改。使用者可通過對代碼的數位簽章來標識軟體來源,辨別軟體發展者的真實身份。GDCA的代碼簽章憑證支持多種代碼簽名,已通過WEBTRUST國際認證。
文章轉載:https://www.trustauth.cn/wiki/20795.html