25个python专属骚操作
本文我總結(jié)了25個(gè)python專屬騷操作,實(shí)屬提高效率/同事吹牛只利器,確定不收藏嗎?
一、原地交換
Python 提供了一個(gè)直觀的在一行代碼中賦值與交換(變量值)的方法
x, y = 10, 20 print(x, y)x, y = y, x print(x, y)#1 (10, 20) #2 (20, 10)原理:賦值的右側(cè)形成了一個(gè)新的元組,左側(cè)立即解析(unpack)那個(gè)(未被引用的)元組到變量<a>和<b>。一旦賦值完成,新的元組變成了未被引用狀態(tài)并且被標(biāo)記為可被垃圾回收,最終也完成了變量的交換。
二、鏈狀比較操作符
Python不用很多條件一個(gè)一個(gè)寫,比較操作符可以聚合。
n = 10 result = 1 < n < 20 print(result)# Trueresult = 1 > n <= 9 print(result)# False三、三元操作符進(jìn)行條件賦值
三元操作符是 if-else 語句也就是條件操作符的一個(gè)快捷方式:[表達(dá)式為真的返回值] if [表達(dá)式] else [表達(dá)式為假的返回值]
這里給出一個(gè)你可以用來使代碼緊湊簡(jiǎn)潔的例子。下面的語句是說“如果 y 是 9,給 x 賦值 10,不然賦值為 20”。
x = 10 if (y == 9) else 20在列表推導(dǎo)中:
[m**2 if m > 10 else m**4 for m in range(50)]判斷最小值:
def small(a, b, c):return a if a <= b and a <= c else (b if b <= a and b <= c else c)類中:
x = (classA if y == 1 else classB)(param1, param2)四、多行字符串
這個(gè)比c方便多了,c打上換行符再加上轉(zhuǎn)義,真的很難受
a='''dvfssd fsdfdsfsd dsdsfbfdfasf afasfaf''' print(a)五、in判斷
可以直接用來判斷某個(gè)變量是否在列表中
我們可以使用下面的方式來驗(yàn)證多個(gè)值:
if m in [1,3,5,7]:而不是:
if m==1 or m==3 or m==5 or m==7:六、 四種翻轉(zhuǎn)字符串/列表的方式
翻轉(zhuǎn)列表本身
testList = [1, 3, 5] testList.reverse() print(testList) #-> [5, 3, 1]在一個(gè)循環(huán)中翻轉(zhuǎn)并迭代輸出
''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' for element in reversed([1,3,5]):print(element)#1-> 5 #2-> 3 #3-> 1一行代碼翻轉(zhuǎn)字符串
"Test Python"[::-1]#輸出 “nohtyP tseT”使用切片翻轉(zhuǎn)列表
[1, 3, 5][::-1]#輸出 [5,3,1]。七、一次性初始化多個(gè)變量
可以直接賦值:
a,b,c,d=1,2,3,4可以利用列表:
List = [1,2,3] x,y,z=List print(x, y, z) #-> 1 2 3(元素個(gè)數(shù)應(yīng)與列表長(zhǎng)度相同)
八、打印模塊路徑
import socket print(socket) #<module 'socket' from '/usr/lib/python2.7/socket.py'>九、字典推導(dǎo)
Python不光列表用推導(dǎo)式,字典/集合也有
''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' #列表 l=[[0 for i in range(4)] for i in range(4)]#生成二維列表 print(l) # [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]testDict = {i: i * i for i in xrange(10)} testSet = {i * 2 for i in xrange(10)}print(testSet) print(testDict)#set([0, 2, 4, 6, 8, 10, 12, 14, 16, 18]) #{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}十、拼接字符串
眾所周知,python中字符串可以相加:
a="i " b="love " c="you" print(a+b+c)拼接列表中的所有元素為一個(gè)字符串
l=['a','b','c'] print(''join(l)) #以join左邊的字符做分割十一、循環(huán)枚舉索引
list = [10, 20, 30] for i, value in enumerate(list):print(i, ': ', value)#1-> 0 : 10 #2-> 1 : 20 #3-> 2 : 30很方便的找到下標(biāo)和對(duì)應(yīng)元素
十二、返回多個(gè)值
并沒有太多編程語言支持這個(gè)特性,然而 Python 中的方法確實(shí)(可以)返回多個(gè)值
def a():return 1,2,3,4,5十三、開啟文件分享
Python 允許運(yùn)行一個(gè) HTTP 服務(wù)器來從根路徑共享文件,下面是開啟服務(wù)器的命令:
python3 -m http.server上面的命令會(huì)在默認(rèn)端口也就是 8000 開啟一個(gè)服務(wù)器,你可以將一個(gè)自定義的端口號(hào)以最后一個(gè)參數(shù)的方式傳遞到上面的命令中。
十四、調(diào)試腳本
我們可以在<pdb>模塊的幫助下在 Python 腳本中設(shè)置斷點(diǎn),例子:
import pdb pdb.set_trace()十五直接迭代序列元素
對(duì)序列(str、list、tuple等),直接迭代序列元素,比迭代元素的索引速度要更快。
''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' >>> l=[0,1,2,3,4,5] >>> for i in l:print(i) #快 >>> for i in range(len(l)):print(l[i]) #慢十六、巧用else語句(重要)
python的else 子句不僅能在 if 語句中使用,還能在 for、while 和 try 等語句中使用,這個(gè)語言特性不是什么秘密,但卻沒有得到重視。
for:l=[1,2,3,4,5] for i in l:if i=='6':print(666)break else:print(999)如果不這么實(shí)現(xiàn),我們只能設(shè)置一個(gè)變量來記錄了:
l=[1,2,3,4,5] a=1 for i in l:if i=='6':print(666)a=0break if a:print(999)while和for類似
看一下try:
try:a() except OSError:#語句1 else:#語句2僅當(dāng) try 塊中沒有異常拋出時(shí)才運(yùn)行 else 塊。
總結(jié)一下else:
for:
僅當(dāng) for 循環(huán)運(yùn)行完畢時(shí)(即 for 循環(huán)沒有被 break 語句中止)才運(yùn)行 else 塊。
while:
僅當(dāng) while 循環(huán)因?yàn)闂l件為假值而退出時(shí)(即 while 循環(huán)沒有被break 語句中止)才運(yùn)行 else 塊。
try:
僅當(dāng) try 塊中沒有異常拋出時(shí)才運(yùn)行 else 塊。
即,如果異常或者 return、break 或 continue 語句導(dǎo)致控制權(quán)跳到了復(fù)合語句的主塊之外,那么else 子句也會(huì)被跳過。
按正常的理解應(yīng)該是“要么運(yùn)行這個(gè)循環(huán),要么做那件事”。可是,在循環(huán)中,else 的語義恰好相反:“運(yùn)行這個(gè)循環(huán),然后做那件事。”
十七、except的用法和作用
-
try/except: 捕捉由PYTHON自身或?qū)懗绦蜻^程中引發(fā)的異常并恢復(fù)
-
except: 捕捉所有其他異常
-
except name: 只捕捉特定的異常
-
except name, value: 捕捉異常及格外的數(shù)據(jù)(實(shí)例)
-
except (name1,name2) 捕捉列出來的異常
-
except (name1,name2),value: 捕捉任何列出的異常,并取得額外數(shù)據(jù)
-
else: 如果沒有引發(fā)異常就運(yùn)行
-
finally: 總是會(huì)運(yùn)行此處代碼
十八、Python自省
這個(gè)也是python彪悍的特性.自省就是面向?qū)ο蟮恼Z言所寫的程序在運(yùn)行時(shí),所能知道對(duì)象的類型.簡(jiǎn)單一句就是運(yùn)行時(shí)能夠獲得對(duì)象的類型.比如type(),dir(),getattr(),hasattr(),isinstance().
十九、python容器
-
列表:元素可變(任何數(shù)據(jù)類型),有序(可索引),append/insert/pop;
-
元組:元素不可變,但元素中的可變?cè)厥强勺兊?#xff1b;有序(可索引);而且元組可以被散列,例如作為字典的鍵。
-
集合:無序(不可被索引)、互異
-
字典:無序,鍵值對(duì)(key:value),key唯一不可重復(fù)
二十、map()
map() 函數(shù)接收兩個(gè)參數(shù),一個(gè)是函數(shù),一個(gè)是 Iterable , map 將傳入的函數(shù)依次作用到序列的每個(gè)元素, 并把結(jié)果作為新的 Iterator 返回。(重點(diǎn)理解)
舉例說明,比如我們有一個(gè)函數(shù)f(x)=x2,要把這個(gè)函數(shù)作用在一個(gè)list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用 map() 實(shí)現(xiàn)如下:
''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' >>> def f(x): ... return x * x ... >>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> list(r) [1, 4, 9, 16, 25, 36, 49, 64, 81]map() 作為高階函數(shù),事實(shí)上它把運(yùn)算規(guī)則抽象了,因此,我們不但可以計(jì)算簡(jiǎn)單的f(x)=x2,還可以計(jì)算任意復(fù)雜的函數(shù),比如,把這個(gè)list所有數(shù)字轉(zhuǎn)為字符串:
>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])) ['1', '2', '3', '4', '5', '6', '7', '8', '9']二十一、reduce
reduce 把一個(gè)函數(shù)作用在一個(gè)序列 [x1, x2, x3, …] 上,這個(gè)函數(shù)必須接收兩個(gè)參數(shù), reduce 把結(jié)果繼續(xù)和序列的下一個(gè)元素做累積計(jì)算
簡(jiǎn)單例子:
>>> from functools import reduce >>> def fn(x, y):return x * 10 + y>>> reduce(fn, [1, 3, 5, 7, 9]) 13579結(jié)合一下,我們可以自己寫出int()函數(shù)
from functools import reducea={'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}def charnum(s):return a[s]def strint(s):return reduce(lambda x, y: x * 10 + y, map(charnum, s))我們繼續(xù)說一些好用的函數(shù)
二十二、split
Python split() 通過指定分隔符對(duì)字符串進(jìn)行切片,如果參數(shù) num 有指定值,則僅分隔 num 個(gè)子字符串。
語法:
str.split(str="", num=string.count(str))簡(jiǎn)化:
str.split("")二十三、理論結(jié)合實(shí)際
1)結(jié)合第四期所學(xué)知識(shí),我們可以寫出這一行代碼
print ( " " .join( input ().split( " " )[:: - 1 ]))實(shí)現(xiàn)功能,leetcode原題:給定一個(gè)句子(只包含字母和空格),將句子中的單詞位置反轉(zhuǎn),單詞用空格分割,單詞之間只有一個(gè)空格,前后沒有空格。比如:(1)“hello xiao mi” - >“ mi xiao你好“
2)再舉一例:
將兩個(gè)整型數(shù)組按照升序合并,并且過濾掉重復(fù)數(shù)組元素
輸入?yún)?shù):
-
int* pArray1 :整型數(shù)組1
-
intiArray1Num:數(shù)組1元素個(gè)數(shù)
-
int* pArray2 :整型數(shù)組2
-
intiArray2Num:數(shù)組2元素個(gè)數(shù)
對(duì)于python來說,給個(gè)數(shù)沒什么卵用。
a,b,c,d=input(),list(map(int,input().split())),input(),list(map(int,input().split())) print("".join(map(str,sorted(list(set(b+d))))))3)我們把最近的知識(shí)結(jié)合起來做一道題:
輸入一個(gè)int型整數(shù),按照從右向左的閱讀順序,返回一個(gè)不含重復(fù)數(shù)字的新的整數(shù)。
''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' result="" for i in input()[::-1]:if i not in result:result+=i print(result)還有很多具體的簡(jiǎn)潔操作,這里就不再舉例子了,多體會(huì)吧。
好,我們繼續(xù)其它函數(shù)。
二十四、filter
Python內(nèi)建的 filter() 函數(shù)用于過濾序列。
和 map() 類似, filter() 也接收一個(gè)函數(shù)和一個(gè)序列。和 map() 不同的是, filter() 把傳入的函數(shù)依次作用于每個(gè)元素,然后根據(jù)返回值是 True 還是 False 決定保留還是丟棄該元素。
簡(jiǎn)單例子,刪掉偶數(shù):
def is_odd(n):return n % 2 == 1list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])) # 結(jié)果: [1, 5, 9, 15]本代碼非原創(chuàng):
#先構(gòu)造一個(gè)從3開始的奇數(shù)序列: def _odd_iter():n = 1while True:n = n + 2yield n #這是一個(gè)生成器,并且是一個(gè)無限序列。#篩選函數(shù) def _not_divisible(n):return lambda x: x % n > 0 #生成器 def primes():yield 2it = _odd_iter() # 初始序列while True:n = next(it) # 返回序列的第一個(gè)數(shù)yield nit = filter(_not_divisible(n), it) # 構(gòu)造新序列利用 filter() 不斷產(chǎn)生篩選后的新的序列
Iterator 是惰性計(jì)算的序列,所以我們可以用Python表示“全體自然數(shù)”,“全體素?cái)?shù)”這樣的序列,而代碼非常簡(jiǎn)潔。
二十五、sorted
>>> sorted([36, 5, -12, 9, -21]) [-21, -12, 5, 9, 36] #可以接收一個(gè)key函數(shù)來實(shí)現(xiàn)自定義的排序,例如按絕對(duì)值大小排序: >>> sorted([36, 5, -12, 9, -21], key=abs) [5, 9, -12, -21, 36]我們?cè)倏匆粋€(gè)字符串排序的例子:
>>> sorted(['bob', 'about', 'Zoo', 'Credit']) ['Credit', 'Zoo', 'about', 'bob']默認(rèn)情況下,對(duì)字符串排序,是按照ASCII的大小比較的,由于 ‘Z’ < ‘a(chǎn)’ ,結(jié)果,大寫字母 Z 會(huì)排在小寫字母 a 的前面。
現(xiàn)在,我們提出排序應(yīng)該忽略大小寫,按照字母序排序。要實(shí)現(xiàn)這個(gè)算法,不必對(duì)現(xiàn)有代碼大加改動(dòng),只要我們能用一個(gè)key函數(shù)把字符串映射為忽略大小寫排序即可。忽略大小寫來比較兩個(gè)字符串,實(shí)際上就是先把字符串都變成大寫(或者都變成小寫),再比較。
這樣,我們給 sorted 傳入key函數(shù),即可實(shí)現(xiàn)忽略大小寫的排序:
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower) ['about', 'bob', 'Credit', 'Zoo']要進(jìn)行反向排序,不必改動(dòng)key函數(shù),可以傳入第三個(gè)參數(shù) reverse=True :
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True) ['Zoo', 'Credit', 'bob', 'about']從上述例子可以看出,高階函數(shù)的抽象能力是非常強(qiáng)大的,而且,核心代碼可以保持得非常簡(jiǎn)潔。
sorted() 也是一個(gè)高階函數(shù)。用 sorted() 排序的關(guān)鍵在于實(shí)現(xiàn)一個(gè)映射函數(shù)。
總結(jié)
以上是生活随笔為你收集整理的25个python专属骚操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 序列赋值引发的Python列表陷进
- 下一篇: 如何使用Python创建自己的加密货币