1. 程式人生 > 其它 >2022.3.22 學習筆記

2022.3.22 學習筆記

2022.3.22學習筆記

  • 三元表示式
  • 各種生成式
  • 匿名函式
  • 常見重要內建函式
  • 常見內建函式補充

一、三元表示式

使用場景:資料二選一的時候,推薦使用三元表示式

結構:

結果1+條件if判斷+else+結果二

注意:if條件成立輸出左邊的結果1,反之輸出右邊的結果2

a = 4
b = 3
print(a if a > b else b )  # 結果為3
注意:三元表示式一般用於二選一,也可以巢狀使用,但是最好不要巢狀,保持程式碼整潔

另外,針對if分支補充,有簡化版本,可以這樣寫:

name = 'jason'
if name == 'jaosn':print(name)
else:print('哈哈哈')  # 這樣不換行寫也可以,但是最好不這樣寫

二、各種生成式

1、列表生成式

就是在原有列表基礎上生成一個新的列表,並進行相應處理,如:

name_list = ['jaosn', 'tony', 'jerry', 'marry']
# 需求:將列表中所有人名都加上'666'
利用學過的知識,我們自然會想到for迴圈,但是這裡有個簡單的方法,列表生成式
res = [name + '666' for name in name_list]
# 這裡的意思是,將列表name_list進行for迴圈,每次迴圈獲得的值放入左邊name+'666'進行處理,由此得到一個新的列表

這就是列表生成式,利用這種方式我們就可以簡單地對列表批量進行同樣地操作或者改動了

2、字典生成式

同樣字典也有生成式,並且跟列表生成式一樣使用for迴圈

可以將兩個列表的元素組成鍵值對,前提兩個列表元素個數一致,舉例如下:

l1 = ['name', 'age', 'pwd']
l2 = ['jason', 18, 123]
# 需求:將兩個列表組成鍵值對
他的生成方式和列表相似,但是需要引用range引數代替索引值
res = {l1[i]:l2[i] for i in range(len(l1))}
# 這樣也是使用for迴圈,只不過左邊的資料處理是利用右邊索引值
注意:列表和字典生成後邊也可以加上if判斷,但是不能再加else,因為for迴圈也可加else,所以容易導致混亂

3、集合生成式

同樣的,集合也可以快速生成,如:

res = {i for i in range(10)}  # 得到0-9的數字集合
res = {i for i in range(10) if i != 2}  # 也可銜接if條件

那麼有沒有元組生成式呢,答案是沒有的,因為元組依據上述寫法得到的是後續即將要學的迭代器

三、匿名函式

匿名函式,顧名思義就是沒有函式名,一般匿名函式是結合其他函式或者結構進行使用的

# 定義匿名函式
lambda x:x+2
結構:lambda 形參:返回值,等同於下面這個函式
def index(x):
    return x+2
注意:冒號後面的資料既可以是具體資料或者變數,也可以是判斷比如x>2,一般是和其他函式結合使用時,處理多個元素,意思是x>2的資料

結合max:統計最大值

l1 = [11,32,41,22,13,66,54,78,96,34,54,99,35]
print(max(l1))  # 結果是l1列表中最大的元素值

max()也可以使用多個引數求字典的最大值,結構是:

max(l1, key = func)左邊是字典,右邊是函式

這個函式可以使用匿名函式代替,如下:

l1 = {'jason':123, 'tony':321, 'jack':456}
print(max(l1, key = lambda key:l1[key]))  # 結果是456,就是將左邊字典的每一個元素丟到右邊函式進行處理,得到的結果組成一個數據集取最大值

四、常見重要內建函式

1、map對映

結構:map(函式,資料集)

作用:可以對資料集進行批量操作

l1 = [1, 2, 3, 4, 5]
# 需求:所有元素加10
res = map(lambda x:x+10, l1)  # 結果是個物件
print(list(res))  # [11,12,13,14,15] 需要先用list轉為列表

2、zip拉鍊

結構:zip(資料集1,資料集2...)

作用:可以將兩個或者多個數據集的元素一一對應

l1 = [11, 22, 33, 44]
l2 = ['jaosn', 'tony', 'jerry', 'jack']
# 需求:將兩個列表元素一一對應組隊
res = zip(l1,l2)  # 結果是個物件,賦值給res
print(list(res))  # [(11,'jason'), (22, 'tony'), (33,'jerry'), (44, 'jack')]
注意:zip可以整合多個數據集,並且每個資料集len可以不一致,只取最短的那個!

3、filter過濾

結構:

filter(函式,資料集)

作用:可以根據指定條件篩選出需要的資料

l1 = [11, 22,, 33, 44, 55]
# 需求:篩選出大於30的元素
res = filter(lambda x:x>30, l1)  # 結果也是個物件
print(list(res))  # [33,44,55]

4、reduce歸總

結構:

from functools import reduce

reduce(函式名,資料集)

作用:可以將資料集所有資料值相加

l1 = [11, 22, 33]
# 需求:求l1所有元素之和
from functools import reduce
res = reduce(lambda x,y:x+y, l1)  # 66
res = reduce(lambda x,y:x+y, l1, 100)  # 166,相當於計算結果加100

課堂練習

編寫一個二分法(快排)和裝飾器

統計二分法(快排)執行的時間 資料自己模擬

def get_time(func):
    def inner(*args, **kwargs):
        import time
        a = time.time()
        res = func(*args, **kwargs)
        b = time.time()
        # time.sleep(1)
        print(b - a)
        return res
    return inner


l = [12,34,56,78,90,102,133,156,189,199,203,555]


@get_time
def get_num(target_num, l1):
    if len(l1) == 0:
        print('不好意思沒找到!')
        return
    else:
        mid_num = len(l1) // 2
        if target_num > l1[mid_num]:
            l1_right = l1[mid_num + 1:]
            print(l1_right)
            get_num(target_num, l1_right)
        elif target_num < l1[mid_num]:
            l1_left = l1[:mid_num]
            print(l1_left)
            get_num(target_num, l1_left)
        else:
            print('找到了%s' % target_num)
            return
get_num(102, l)  # 結果如下
'''
[12, 34, 56, 78, 90, 102]
[90, 102]
找到了102
0.0
0.0
0.0
'''