1. 程式人生 > 其它 >學習python,從入門到放棄(15)

學習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
    

總結

今天學習的內容接觸了迭代器這一概念,還有眾多的內建函式,需要多加練習。