1. 程式人生 > 其它 >百度飛槳領航團課程Python函式知識整理

百度飛槳領航團課程Python函式知識整理

技術標籤:pythonpython

近日,百度推出了《百度飛槳領航團零基礎Python速成營》的免費課程。雖然python用了2年了,但都是自學,正好利用這個機會梳理一下,於是就參加了課程。

函式的應用,是Python的強項,這裡就把函式相關內容梳理一下,方便查閱。

一、基礎函式定義

def show_name(name):
    print('姓名:', name)
    return {'姓名':name}


show_name("小紅")

#輸出:
姓名: 小紅

預設約定:

*def 定義,命名推薦用小寫字母,字母間用_連線

*如果沒有return語句,預設返回None

二、引數順序

def show_info(name, age=18, *books, **kw):
    print('我的名字叫:', name, '年齡:', age,'其它資訊:',kw)
    if 'city' in kw:
        print('來自:', kw['city'])
    for book in books:
        print('我有',book,'書')

show_info('張三', 18, '語文','數學','計算機', city='北京', height=180, weight=75)

#輸出:
我的名字叫: 張三 年齡: 18 其它資訊: {'city': '北京', 'height': 180, 'weight': 75}
來自: 北京
我有 語文 書
我有 數學 書
我有 計算機 書


*函式的引數順序:

  1. 常規必須引數:此引數呼叫函式時必須提供
  2. 預設引數:有引數預設值。如果不指定,則使用預設值
  3. *引數:此引數方式,可以接收一系列引數,引數被當做一個list對待
  4. **引數:用鍵值對的方式提供引數,被當做一個字典輸入

三、函式的變數作用域

name = '張三'

def print_my_name():
    name = '李四'
    print(name)

print_my_name()

#輸出:
李四

呼叫print_my_name時,print_my_name範圍內,起作用的是函式內定義的變數。如果要使用函式為的變數,需用global宣告變數:

name = '張三'

def change_my_name():
    global name
    print('全域性名', name)
    name = '李四'
    print('函式內名', name)

change_my_name()

輸出:
全域性名 張三
函式內名 李四

四、lambda匿名函式

add = lambda arg1, arg2: arg1 + arg2  #定義輸入兩個變數,求和的匿名函式

print(add(1,2))   


(lambda arg1, arg2: arg1 + arg2 )(1, 2)  #等效於上面兩句

#輸出:
3

五、map、reduce函式

*map 用於將一個可迭代的物件(如list)中每一個元素,用指定函式處理,返回一個新的迭代物件

iterB=map(func,iterA)

nums = [1,2,3,4,5,6,7,8,9]
func=lambda x:x**2

square=list(map(func,nums))   #等價於:square=type(nums)(map(func,nums))

print(square)

#輸出:
[1, 4, 9, 16, 25, 36, 49, 64, 81]

*reduce 使用指定函式,依照下圖方式對資料逐次進行處理

from functools import reduce

nums=[14,5,32,87]
func=lambda x,y:x+y

result=reduce(func,nums)

print(result)

#輸出:
138

六、sorted排序函式

在python中,迭代物件(如list),本身有sort()方法,其直接作用於物件本身。

nums=[14,5,32,87]
nums.sort()

print(nums)

#輸出:
[5, 14, 32, 87]

而sorted函式,則是返回一個新的物件,原物件不變。

nums=[14,5,32,87]
new_nums=sorted(nums)

print(new_nums)
#輸出:
[5, 14, 32, 87]

print(nums)
#輸出:
[14, 5, 32, 87]
points = [(5,2), (7,3), (3,4),(1,1),(2,6)]  # 按x座標將點排序
func = lambda x:x[0]

new_points=sorted(points, key=func)

print(new_points)
#輸出:
[(1, 1), (2, 6), (3, 4), (5, 2), (7, 3)]

七、裝飾器

裝飾器(Decorators)是 Python 的一個重要部分,是可以修改其他函式的功能的函式。常用在認證、日誌等功能上。

def say(conv):
    def sayHello():
        print('你好啊')
    def sayBye():
        print('再見')

    sayHello()
    conv()     #自動執行被傳入的conv函式
    sayBye()


@say
def conv1():
    print('conv1--')

@say
def conv2():
    print('conv2--')


#輸出:
你好啊
conv1--
再見
你好啊
conv2--
再見

用@decorator ,等效於將被裝飾的函式名,傳入裝飾器。

def arg_decorator(func):
    def wrapper(*args, **kw):
        print(f'{func.__name__} is working...')
        func(*args, **kw)
    return wrapper


# 帶引數的裝飾器
@arg_decorator
def student_info(name, age=18, *books, **kw):
    print(f'我的名字叫{name}, 今年{age}歲,我有很多本書:')
    for book in books:
        print(book)
    print(kw)

student_info('Molly',18, '語文書','數學書',height=170)

#輸出:
student_info is working...
我的名字叫Molly, 今年18歲,我有很多本書:
語文書
數學書
{'height': 170}

帶引數的裝飾器,可以在裝飾器裡使用被裝飾函式傳入的引數。

八、偏函式

使用partial函式,將已有函式的一部分引數固定,構造出一個新的函式。以後再呼叫新函式時,可以輸入更少的引數。

注意partial中輸出引數的順序與原函式引數順序的對應關係。

from functools import partial

def mod(n, m):
    return n % m

mod_by_100 = partial(mod, 100)  #mod需要兩個引數,100為第一個引數

print(mod(100, 7))  # 2

print(mod_by_100(7))  # 2

下例為通過引數名指定固定的引數。

from functools import partial

def student_info(name, age, city):
    print(f'我的名字叫{name}, 今年{age}歲,來自{city}')

student_info_beijing = partial(student_info, city='北京')
student_info_beijing("小紅",22)

輸出:
我的名字叫小紅, 今年22歲,來自北京