您的位置:首頁>正文

不同類型的Python小技巧

python程式小技巧

1 在作比較時可以這樣寫: 3.143.14 and pi<3.15)是一樣的。

2 Int類型不會在超過31bit或32bit後溢出, 它們會變成long型。 在python裡, long並非就是64位,

他就是”長”類型,(python的長類型可以容納數萬位元大的整數), 效率會降低一點。 在python 3000中, 甚至連int與long的區別都沒有了。

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

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示