學習python,從入門到放棄(15)
學習python,從入門到放棄(15)
三元表示式
值1 if 條件 else 值2
條件如果成立則使用值 1,條件如果不成立則使用值 2
三元表示式只用於二選一的情況,與普通的 if 語句差不多,上面的寫法看起來有點變扭,其實還有另一種寫法
(值2, 值1)[條件]
生成式
-
列表生成式
當我們需要在列表中的每一個元素後面新增相同的內容時需要 for 迴圈遍歷每一個元素然後一一新增內容,這樣子會使用很多的記憶體,而且特別的麻煩,列表生成式就可以一步到位解決問題。
name_list = ['jason', 'kevin', 'tony', 'oscar', 'jerry'] res = [name+'_SB' for name in name_list] print(res) # ['jason_SB', 'kevin_SB', 'tony_SB', 'oscar_SB', 'jerry_SB']
就相當於把 for 迴圈壓縮排一個語句裡,還可以加入 if 語句增加篩選能力。但要注意後續不能新增 else 語句,因為不能分辨 else 究竟是屬於 for 還是屬於 if 。
name_list = ['jason', 'kevin', 'tony', 'oscar', 'jerry'] res = [name+'_SB' for name in name_list if name != 'jason'] print(res) # ['kevin_SB', 'tony_SB', 'oscar_SB', 'jerry_SB']
-
字典生成式
當我們要把兩個列表合成一個字典時,也要經過一個複雜的操作,同樣,字典生成式也會將其縮略成一句。
l1 = ['name', 'age', 'pwd'] l2 = ['jason', 18, 123] res = {l1[i]: l2[i] for i in range(len(l1))} print(res) # {'name': 'jason', 'age': 18, 'pwd': 123} res = {l1[i]: l2[i] for i in range(len(l1)) if i == 1} print(res) # {'age': 18}
-
集合生成式
res = {i for i in range(10)} print(res, type(res)) # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} <class 'set'> res = {i for i in range(10) if i != 2} print(res, type(res)) # {0, 1, 3, 4, 5, 6, 7, 8, 9} <class 'set'>
可以看出生成式是可以區分出集合和字典的。
匿名函式
匿名函式與普通函式比起來,語法結構更加簡單,不用使用 def 函式名(引數名):這種方式定義,直接使用 lambda 引數:返回值 定義即可。
def index(x):
"""普通函式"""
return x + 2
print(index(1)) # 3
f = lambda x: x + 2 # 匿名函式
print(f(1)) # 3
常見內建函式
-
map 對映
當我們需要對列表中的元素進行普遍函式操作時,可以使用。支援匿名函式。
l1 = [11, 22, 33, 44, 55] def index(n): return n + 10 res = map(index,l1) print(list(res)) # [21, 32, 43, 54, 65] res = map(lambda x: x + 10, l1) print(list(res)) # [21, 32, 43, 54, 65]
-
zip 拉鍊
用於將兩個列表中的元素一一對於起來,類似與字典生成器。
l1 = [11, 22, 33, 44] l2 = ['jason', 'kevin', 'tony', 'oscar'] res = zip(l1, l2) print(list(res)) # [(11, 'jason'), (22, 'kevin'), (33, 'tony'), (44, 'oscar')]
當需要觀看裡面的資料時一定要記得型別轉換成 list 才能觀看。
也可以用於整合多個數據。
l1 = [11, 22, 33, 44] l2 = ['jason', 'kevin', 'tony', 'oscar'] l3 = [1, 2, 3, 4] l4 = [55, 66, 77, 88] res = zip(l1, l2, l3, l4) print(list(res)) # [(11, 'jason', 1, 55), (22, 'kevin', 2, 66), (33, 'tony', 3, 77), (44, 'oscar', 4, 88)]
但是當資料集元素不一樣時,會按照短的資料集為準。
l1 = [11, 22, 33, 44, 55] l2 = ['jason', 'kevin'] res = zip(l1, l2) print(list(res)) # [(11, 'jason'), (22, 'kevin')]
-
filter 過濾
一般用於條件篩選,一般搭配條件篩選函式使用。
l1 = [11, 22, 33, 44, 55, 66] def index(x): return x > 30 res = filter(index, l1) print(list(res)) # [33, 44, 55, 66]
-
reduce 歸總
可以對列表中的元素進行累積。
from functools import reduce def add(x, y): # 兩數相加 return x + y sum1 = reduce(add, [1, 2, 3, 4, 5]) # 計算列表和:1+2+3+4+5 sum2 = reduce(lambda x, y: x + y, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函式 print(sum1) # 15 print(sum2) # 15
-
abs()
獲取絕對值
print(abs(-123)) # 123 print(abs(123)) # 123
-
all() 與 any()
相當於 and 符號與 or 符號的列表版本,all() 資料集中必須所有的元素對應的布林值為 True 返回的結果才是 True ,any() 資料集中所有的元素對應的布林值只要有一個為 True,返回的結果就是 True 。
l1 = [0, 0, 1, 0, True] print(all(l1)) # False print(any(l1)) # True
-
bin() oct() hex()
產生對應進位制數
print(bin(100)) # 0b1100100 print(oct(100)) # 0o144 print(hex(100)) # 0x64
-
bytes()
將其轉換成二進位制編碼。
s = '你好啊 hello world!' print(bytes(s, 'utf8')) # b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x95\x8a hello world!'
-
callable()
判斷當前物件是否可以加括號呼叫
name = 'jason' def index():pass print(callable(name)) # False 變數名不能加括號呼叫 print(callable(index)) # True 函式名可以加括號呼叫
-
chr() 和 ord()
字元與數字的對應轉換
print(chr(65)) # A 根據數字轉字元 依據ASCII碼 print(ord('A')) # 65 根據字元轉數字 依據ASCII碼
-
dir()
返回資料型別可以呼叫的內建方法(檢視物件內部可呼叫的屬性)
print(dir(123)) # ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
-
divmod()
整除和取餘
print(divmod(250, 25)) # (10, 0) 第一個引數是整數部分 第二個是餘數部分 print(divmod(251, 25)) # (10, 1) print(divmod(249, 25)) # (9, 24)
-
enumerate()
列舉
name_list = ['jason', 'kevin', 'oscar', 'tony'] for name in name_list: print(name) """ jason kevin oscar tony """ for i, j in enumerate(name_list): print(i, j) # i類似於是計數 預設從0開始 """ 0 jason 1 kevin 2 oscar 3 tony """ for i, j in enumerate(name_list, start=1): print(i, j) # 還可以控制起始位置 """ 1 jason 2 kevin 3 oscar 4 tony """
-
eval() 和 exec()
識別字符串中的python程式碼。
print('print("有點餓了")') # print("有點餓了") eval('print("有點餓了111")') # 有點餓了111 exec('print("有點餓了222")') # 有點餓了222
總結
今天學習的內容接觸了迭代器這一概念,還有眾多的內建函式,需要多加練習。