python 3-5(2019-11-08 ) Python基礎(chǔ) (五)

函數(shù) functoin

def 函數(shù)名():
函數(shù)實(shí)現(xiàn)
pass # pass空語(yǔ)句
函數(shù)執(zhí)行的順訊,調(diào)用的時(shí)候才會(huì)被執(zhí)行

num = 100
print(num) # 100
def say_hello():
    print('hello1') # hello1
    print('hello2') # hello2
    print('hello3') # hello3
print('haha') # haha
# 調(diào)用函數(shù)
say_hello()

為什么使用函數(shù)

七個(gè)長(zhǎng)度的字符串,替換第三個(gè)字符

str1 = 'abcdefg'
str1 = str1[:2] + 'z' + str1[3:]
print(str1) # abzdefg
str1 ='1234567'
str1 = str1[:2] + '8' + str1[3:]
print(str1) # 1284567

改進(jìn)封裝成函數(shù)

def set_str(msg, index, char):
    """
    將目標(biāo)字符串的指定位置進(jìn)行替換
    :param msg: 目標(biāo)字符串
    :param index: 替換字符串的索引位置
    :param char: 要替換的字符
    :return: 返回替換完成的字符串
    """
    # res = msg[:index] + char + msg[index+1:]
    # return res
    # 對(duì)給定的char進(jìn)行判斷 isinstance(char, type) 判斷兩個(gè)變量是否屬于同一類型
    if isinstance(char, int):
        char = str(char)
    return msg[:index] + char + msg[index+1:]
    pass

res = set_str('1234567', 2, '9') # 1284567
set_str('abcdefddd', 1, 4)
res = set_str('abcdefddd', 1, 4) # a4cdefddd
print(res)

函數(shù)的形參和實(shí)參

形式上的參數(shù), 實(shí)際調(diào)用的參數(shù)
區(qū)別: 形參是虛擬的, 不占內(nèi)存空間,形參變量只有在調(diào)用的時(shí)候猜分配內(nèi)存空間
實(shí)參是一個(gè)變量, 占用內(nèi)存空間
數(shù)據(jù)是單向傳送的 實(shí)參傳給形參

求矩形面積

def area(width, length):
    return width*length
w = 4
l = 6

area(width=4, length=6)
print(area(4, 6)) # 24

函數(shù)參數(shù)

1.必須參數(shù):以正確的順訊傳入函數(shù),調(diào)用的時(shí)候必須和聲明的時(shí)候保持一致

def f(name, age):
    print('我叫%s,我今年%d歲'%(name, age))
f('張三', 18) # 我叫張三,我今年18歲
# f(19, '李四' ) #錯(cuò)誤

2.關(guān)鍵字參數(shù), 關(guān)鍵字參數(shù)允許函數(shù)調(diào)用時(shí)的參數(shù)的順序與聲明的不一致, 因?yàn)镻ython解釋器能夠用參數(shù)名匹配參數(shù)值

f(age=19, name='李四') # 我叫李四,我今年19歲

3.默認(rèn)參數(shù)(缺省參數(shù))
在調(diào)用函數(shù)時(shí), 缺省的參數(shù)如果沒(méi)有被傳入,則會(huì)使用默認(rèn)值

def f(name, age, sex = 'male'):
    print('我叫%s,我今年%d歲'%(name, age))
    print('性別%s'%(sex))
f(age=19, name= '李四') # 我叫李四,我今年19歲 性別male
f(age=19, name='李四', sex='female') # 我叫李四,我今年19歲 性別female

不定長(zhǎng)參數(shù)

有時(shí)可能需要一個(gè)函數(shù)能處理比當(dāng)初聲明時(shí)更多的參數(shù), 這些參數(shù)叫不定長(zhǎng)參數(shù)
語(yǔ)法如下

def funcname([formal_args,]*args,**kwargs): 
 """文檔#字符串"""
     pass

加了星號(hào)()的變量args會(huì)存放所有未命名的變量參數(shù),args為元組*
加了星星號(hào)()的變量kwargs會(huì)存放命名參數(shù),即形如ket=value形式的參數(shù),kwargs為字典**

def func(a, b, *args, **kwargs):
    """

    :param a: formal_args
    :param b: formal_args
    :param args: 未命名的變量參數(shù) args為元組
    :param kwargs: 命名參數(shù) kwargs為字典
    :return: 無(wú)
    """
    print('a=', a) # a = 1
    print('b=', b) # b = 2
    print('args=', args) # args= (3, 4, 5)
    print('kwargs = ') # kwargs =
    for k, v in kwargs.items():
        print(k, '---->', v)    # m ----> 6
                                # n ----> 7
                                # p ----> 8
func(1, 2, 3, 4, 5, m=6, n=7, p=8)
c = {3, 4, 5}
d = {"m":6, "n":7, "p":8}
func(1, 2, *c, **d)
func(1, 2, c, d) # 不加星號(hào)的傳入方式 #args= ({3, 4, 5}, {'m': 6, 'n': 7, 'p': 8})
def f(*args):
    print(args) # (1, 2, 5)

f(*[1,2,5])

def f1(**kargs):
   print(kargs) # {'name': 'alex'}

f1(**{'name':'alex'})

-- coding: utf-8 --

@Time : 2019/11/8 10:32

@Author : Nix Chen

@Email : lethe4ever@163.com

@File : demo19_20191108.py

@Software: PyCharm

函數(shù)的返回值

如果想要獲取函數(shù)的執(zhí)行結(jié)果 我們一般要設(shè)置編寫函數(shù)的返回值,使用return 可以把結(jié)果返回
return 作用:
1. return 停止這個(gè)函數(shù)的執(zhí)行,返回指定的結(jié)果
2. Python中的return可以返回多個(gè)結(jié)果, 解釋器會(huì)將其組裝成一個(gè)元組作為一個(gè)整體結(jié)果輸出
3. 如果未指定return,這個(gè)函數(shù)的返回值是None

給定一個(gè)列表, 將列表中所有數(shù)字進(jìn)行累加, 并且返回他們的累加和以及平均數(shù)

def sum_and_ave(list):
    """

    :param list: 給定一個(gè)列表
    :return: 返回他們的累加及平均值
    """
    count = 0
    sum = 0
    for x in list:
        if isinstance(x, int) or isinstance(x, float):
            #進(jìn)行累加
            sum += x
            # 計(jì)數(shù)
            count += 1
    ave = sum/count
    return sum, ave

li  = [20, 15, 2.8, 'a', 35, 5.9, -1.8]
print(sum_and_ave(li)) # (76.9, 12.816666666666668)
print('累加和', sum_and_ave(li)[0]) # 累加和 76.9
print('平均數(shù)',sum_and_ave(li)[1]) # 平均數(shù) 12.816666666666668

-- coding: utf-8 --

@Time : 2019/11/8 11:16

@Author : Nix Chen

@Email : lethe4ever@163.com

@File : demo20_20191108.py

@Software: PyCharm

高階函數(shù)

滿足 (輸入: 接受一個(gè)或多個(gè)函數(shù), 輸出: 一個(gè)函數(shù))

def add(x, y, f):
    return f(x) + f(y)
# 傳入的是函數(shù)名
res = add(3, -6, abs)
print(res) # 9
def method():
    x = 2
    def double(n):
        return  n*x
    return double
dou = method()
res2 = dou(40)
print(res2) # 80

-- coding: utf-8 --

@Time : 2019/11/8 14:15

@Author : Nix Chen

@Email : lethe4ever@163.com

@File : demo22_20191108.py

@Software: PyCharm

匿名函數(shù): 不需要顯示指定名字的函數(shù)

格式
函數(shù)名 = lambda 參數(shù)1, 參數(shù)2, ..., 參數(shù)n:返回表達(dá)式
lambda 的參數(shù)可以是無(wú)限個(gè), 但是返回表達(dá)式只能有一個(gè)
優(yōu)點(diǎn): 1.不用擔(dān)心函數(shù)名沖突 2.減少代碼量 3.優(yōu)雅
主要目的是聯(lián)合其他函數(shù)使用

def mul(x, y):
    return x*y
mul2 = lambda x,y:x*y
print(mul2(3,4)) # 12

x, y 如果 x > y,返回 xy else x <y x/y*

def cheng_chu(x, y):
    if x > y:
        return x*y
    else:
        return x/y
print(cheng_chu(2, 5)) # 0.4
print(cheng_chu(5, 2)) # 10

回顧三目運(yùn)算符

store = ['吳楠的書店']
store = []
if len(store) == 0:
    store = '當(dāng)當(dāng)自營(yíng)'
else:
    store = store[0]
print(store)

改成三目運(yùn)算符

print('當(dāng)當(dāng)自營(yíng)' if len(store) == 0 else store[0])
# 滿足條件時(shí)返回的值 if 滿足條件 else不滿足條件返回的值

將x, y 如果x > y 返回xy else x <= y x/y*

res = lambda x, y:x*y if x > y else x/y
print(res(2, 5)) # 0.4
print(res(5, 2)) # 10

-- coding: utf-8 --

@Time : 2019/11/8 11:25

@Author : Nix Chen

@Email : lethe4ever@163.com

@File : demo21_20191108.py

@Software: PyCharm

- map()

map(func, iterable)
該函數(shù)使用函數(shù)是自己的一個(gè)參數(shù), 它可以將iterable(可迭代對(duì)象)中的數(shù)據(jù)一次傳遞給func函數(shù)處理
最后把處理的結(jié)果作為新的可迭代對(duì)象返回
舉例: [1, 2, 3, 4, 5]---->[1, 4, 9, 16,25]

def power(x):
    return x*x
result = map(power, [1, 2, 3, 4, 5])
print(list(result)) # [1, 4, 9, 16, 25]
result = map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(list(result)) # ['1', '2', '3', '4', '5', '6', '7', '8', '9']

-reduce()

reduce(func, sequence) # 函數(shù), 累計(jì)操作
func函數(shù)必須接收兩個(gè)參數(shù), reduce會(huì)把func的運(yùn)行結(jié)果做一個(gè)參數(shù),然后從sequence中依次取出一個(gè)數(shù)據(jù)當(dāng)作另一個(gè)參數(shù)

from functools import reduce
def mul(x, y):
    return x*y
li = [1, 2, 3, 4, 5]
res = reduce(mul, li)
print(res) # 120
# 使用lambda表達(dá)式改寫 lambda主要目的是聯(lián)合其他函數(shù)使用
print(reduce(lambda x, y: x * y, li)) # 120

reduce函數(shù)的具體運(yùn)行
第一次運(yùn)算時(shí)從迭代對(duì)象中去除兩個(gè)數(shù) 12 = 2*
第二次運(yùn)算時(shí) 將第一次的運(yùn)行結(jié)果2 作為第一個(gè)參數(shù)傳入, 再取出一個(gè)數(shù) 3 作為第二個(gè)參數(shù) 傳入 23 = 6*
同理 64 = 24*
...
最后返回最后一次處理結(jié)果

把序列[1, 3, 5, 7, 9]變成 整數(shù)13579

def fn(x, y):
    return x*10+y
li = [1, 3, 5, 7, 9]
res = reduce(fn, li)
print(res) # # 13579
li = [1, 3, 5, 7, 9]
res =reduce(lambda x, y: x*10+y, li)
print(res) # 13579

寫出str 轉(zhuǎn)化為 int 的 函數(shù)
編寫函數(shù)fn 進(jìn)行累加移動(dòng)位置
編寫一個(gè)函數(shù)將 char 轉(zhuǎn)換成 num map函數(shù)中的映射模式
{'0':0, '1':1}
'13579' int('13579'),使用map和reduce函數(shù)結(jié)合編寫

def fn(x):
    digits = {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9 }
    return  digits[x]

print(reduce(lambda y, z: y * 10 + z, map(fn, '13579'))) # 13579

編寫str2int函數(shù):

digits = {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9 }
def str2int(s):
    def fn1(s):
        return digits[s]
    def fn2(y,z):
        return y*10+z
    return reduce(fn2, map(fn1, s))
# str2int('13579') --->13579
print(str2int('13579')) # 13579

寫成lambda表達(dá)式

digits = {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9 }
def str2int(s):
    return reduce(lambda y, z: y * 10 + z, map(lambda x:digits[x], s))
# str2int('13579') --->13579
print(str2int('13579')) # 13579

-filter()

filter(function, iterable)
根據(jù)函數(shù)func來(lái)過(guò)濾iterable,將iterable中的數(shù)據(jù)傳入func中
如果函數(shù)返回True, 則保留該數(shù)據(jù), 否則就不保留

li = [i for i in range(15)]
# 將li中的奇數(shù)篩選出來(lái)
print(list(filter(lambda x: x % 2 ==1,li))) # [1, 3, 5, 7, 9, 11, 13]

-sorted()

對(duì)數(shù)據(jù)進(jìn)行排序, 并且返回一個(gè)新的對(duì)象, 原對(duì)象不變
key參數(shù)可以用來(lái)指定排序的規(guī)則, key接受的值是一個(gè)函數(shù)
reverse參數(shù)是指定排序的順序(升序還是降序), 默認(rèn)是升序

from random import randint
li2 = [randint(-10, 10) for _ in range(5)]
print('排序前', li2) # 排序前 [0, 10, 9, -6, -4]
# res = li2.sort() # None
res = sorted(li2)
print('排序后', li2) # 排序后 [0, 10, 9, -6, -4]
print('返回值', res) # 返回值 [-6, -4, 0, 9, 10]

res = sorted(li2, key=abs)
print(res) # [0, -4, -6, 9, 10]
chars = ['abc', 'defg', 'sdasda', 'asdsadasda']
# 對(duì)chars 進(jìn)行排序 按照字母的長(zhǎng)度 降序
chars = sorted(chars, key=lambda x: len(x), reverse=True)
print(chars) # ['asdsadasda', 'sdasda', 'defg', 'abc']

符合列表的排序

grade_list = [
    {'name':'張三', 'grade':90},
    {'name':'李四', 'grade':30},
    {'name':'王五', 'grade':70},
    {'name':'趙六', 'grade':52}
]
print(grade_list) # [{'name': '張三', 'grade': 90}, {'name': '李四', 'grade': 30}, {'name': '王五', 'grade': 70}, {'name': '趙六', 'grade': 52}]

# 按照成績(jī)進(jìn)行排序
grade_list = sorted(grade_list,key=lambda d:d['grade'])

print(grade_list) # [{'name': '李四', 'grade': 30}, {'name': '趙六', 'grade': 52}, {'name': '王五', 'grade': 70}, {'name': '張三', 'grade': 90}]
stu_info = [
    ('a', 22), ('b', 39), ('c', 17), ('d', 90)
]
# 降序排列
stu_info = sorted(stu_info, key=lambda x: x[1], reverse=True)
print(stu_info) #[('d', 90), ('b', 39), ('a', 22), ('c', 17)]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容