函數(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)]