python 語法案例必知必會(huì)#02

map() 函數(shù)

map(fun,iter)函數(shù)主要用于讓一個(gè)可迭代對(duì)象進(jìn)行對(duì)應(yīng)的函數(shù)運(yùn)算,第一個(gè)參數(shù)是函數(shù)對(duì)象,負(fù)責(zé)運(yùn)算可迭代對(duì)象的每個(gè)參數(shù),第二個(gè)參數(shù)是可迭代對(duì)象,給函數(shù)對(duì)香港提供需要的參數(shù)和變量;以通過map對(duì)象求列表各個(gè)值得平方數(shù)與立方數(shù)為例:

def square(lst):
    return map(lambda x:x**2,lst)
print(list(square([2,5,6])))
# 定義一個(gè)函數(shù),接收外部傳過來的一個(gè)列表參數(shù),然后對(duì)列表的每個(gè)參數(shù)進(jìn)行平方運(yùn)算
print(list(map(lambda x:x**3,[9,8,7])))
# map() 函數(shù)會(huì)返回一個(gè)map對(duì)象這個(gè)對(duì)象可以被轉(zhuǎn)換為list對(duì)象

通過map()函數(shù)實(shí)現(xiàn)兩個(gè)列表之間的向量運(yùn)算

def mul_lists(lst1, lst2):
    return map(lambda x, y: x * y, lst1, lst2)
print(mul_lists([1,2,3],[4,5,6]))
print(list(mul_lists([1,2,3],[4,5,6])))
# 接收兩個(gè)列表參數(shù),并將兩個(gè)列表參數(shù)都作為可迭代對(duì)象直接傳入map函數(shù)中(兩個(gè)參數(shù)之間用逗號(hào)“,”隔開)
案例:選出字典中最大的元素

需求是在一組字典中,選出值最大的鍵值對(duì);首先我們可以通過 map() 函數(shù)以匿名函數(shù)的方式進(jìn)行比較(挑選出值比較大的鍵值對(duì))然后將鍵值對(duì)以列表形式返回即可

# 測(cè)試用例:可以通過map函數(shù)用返回鍵值對(duì)的形式返回我們需要比較的參數(shù)(也就是值)
e = {'a':8,'b':6,'c':23}
print(map(lambda v:v[1],e.items()))   # 輸出 <map object at 0x0324A970> 返回的是一個(gè)map對(duì)象
# 需要注意的是在 dict 對(duì)象作為一個(gè)可迭代對(duì)象的時(shí)候,遍歷的是dict.items()是其元素,而不是字典對(duì)象本身
print(list(map(lambda v:v[1],e.items())))
# 代碼:選出字典中最大的元素并作為列表返回
def max_pairs(dict):
    if len(dict) == 0:
        return dict
    max_val = max(map(lambda v:v[1],dict.items()))
    return [item for item in dict.items() if item[1] == max_val]
r = max_pairs({'a': -10, 'b': 5, 'c': 3, 'd': 5})
print(r)
# 代碼運(yùn)行結(jié)果: [('b', 5), ('d', 5)]

一行代碼將兩個(gè)字典合并為一個(gè)字典

在python3.5之后可以通過下面這種方式將兩個(gè)字典合并為一個(gè)字典

def merge_dict(dict1,dict2):
    return {**dict1,**dict2}
print(merge_dict({'a':1,'b':5,'c':8},{'d':8,'e':6}))
# 如果兩個(gè)字典里有鍵相同的元素,那么后一個(gè)字典里元素的值會(huì)替代前一個(gè)字典里元素中的值
print(merge_dict({'a':1,'b':5,'c':8},{'a':5,'b':23,'f':10}))
# 也可以直接打印合并(不通過函數(shù)):這一條比較廢話
dict1 = {'a':55,'b':44,'c':203}
dict2 = {'e':88,'f':66}
print({**dict1,**dict2})

查找字典中第n個(gè)大(小)的元素

使用的函數(shù)是 nlargest 和 nsmallest 他們的第一個(gè)參數(shù)都是查找的數(shù)量(查找到第幾個(gè)大,或者小的數(shù)目)第二個(gè)參數(shù)是可迭代對(duì)象;如果可迭代對(duì)象是字典,可以通過第三個(gè)參數(shù):key = lambda 的方式遍歷字典對(duì)象

from heapq import nsmallest,nlargest
def topn_dict(d,n):
    return nlargest(n,d,key=lambda k:d[k])#通過匿名函數(shù),把比較的標(biāo)準(zhǔn)定為字典里的鍵值對(duì)(遍歷字典)
print(topn_dict({'a': 10, 'b': 8, 'c': 9, 'd': 10}, 2))  # 輸出結(jié)果:['a', 'd']

nlargest() 與 nsmallest()

heapq模塊中的兩個(gè)函數(shù)
nlargest:找到集合(可迭代對(duì)象)中的最大的n個(gè)值;
nsmallest:找到可迭代對(duì)象中的最小的n個(gè)值;這兩個(gè)函數(shù)的第一個(gè)參數(shù)是取到第幾個(gè)(最大的值或者最小的值),第二個(gè)參數(shù)是可迭代對(duì)象(需要取值的集合),如果可迭代對(duì)象是字典,則會(huì)使用第三個(gè)參數(shù),也就是key = lambda k:dict[k] 的形式遍歷這個(gè)字典(取得鍵值對(duì)對(duì)象)

lst = [2,4,6,8,10,12]
print(nlargest(3,lst))   # [2,4,6]
print(nsmallest(3,lst))    # [12,10,8]

判斷字符串是否是異位詞

異位詞:指的是相同字母的異序排列;簡(jiǎn)稱:互為變位詞
counter 函數(shù)可以統(tǒng)計(jì)字符串或者集合中每個(gè)字符出現(xiàn)的次數(shù),函數(shù)中定義了,如果兩個(gè)字符串的每個(gè)字符出現(xiàn)的次數(shù)相等,返回true;如果兩個(gè)字符串中字符出現(xiàn)的頻率不相等,返回false

from collections import Counter
def anagram(str1,str2):
    # 如果兩個(gè)詞是異位詞 返回 true 如果兩個(gè)詞語不是異位詞,則返回false
    return Counter(str1) == Counter(str2)
print(anagram('eleven+two', 'twelve+one'))
print(anagram('eleven', 'twelve'))
同樣counter函數(shù)也可以用于進(jìn)行統(tǒng)計(jì)

統(tǒng)計(jì)在一個(gè)多元素的可迭代對(duì)象或一個(gè)字符串中,對(duì)應(yīng)數(shù)字或者字符出現(xiàn)的次數(shù) 并返回一個(gè)Counter對(duì)象

from collections import Counter
a = [1,2,3,4,5,6,7]
print(Counter(a))    # Counter({1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1})
print(type(Counter(a)))
str = 'I LOVE AMERICA'   
# Counter({'I': 2, ' ': 2, 'E': 2, 'A': 2, 'L': 1, 'O': 1, 'V': 1, 'M': 1, 'R': 1, 'C': 1})
print(Counter(str))

邏輯合并兩個(gè)字典

通過collection包中的函數(shù) ChainMap 實(shí)現(xiàn)邏輯合并兩個(gè)字典并返回一個(gè) ChainMap 對(duì)象 ;函數(shù)的兩個(gè)參數(shù)分別表示兩個(gè)需要合并成一個(gè)對(duì)象的字典

from collections import ChainMap
dic1 = {'a':1,'b':10}
dic2 = {'b':3,'d':15}
merged = ChainMap(dic1,dic2)
print(merged)
print(type(merged))   # <class 'collections.ChainMap'>
merged['b'] = 100
merged['d'] = 100
print(merged)   # ChainMap({'a': 1, 'b': 100, 'd': 100}, {'b': 3, 'd': 15})
# 如果修改的值的哥字典中,有對(duì)應(yīng)的鍵,那么修改第一個(gè)字典中對(duì)應(yīng)的值;大怒如果第一個(gè)字典中沒有對(duì)應(yīng)的鍵,那么在第一個(gè)字典中添加對(duì)應(yīng)的鍵值對(duì)(第二個(gè)字典始終不做變動(dòng))

列表切片

從隨機(jī)生成的范圍為:0--50的100個(gè)數(shù)字的序列中抽取前5個(gè)數(shù)存放在一個(gè)新的列表中

from random import randint
lst = [randint(0,50) for _ in range(0,100)]
print(lst[:5])   # [5, 10, 4, 4, 11]
# _ 作為 for 循環(huán)的變量;一般使用的前提是這個(gè)參數(shù)不會(huì)被調(diào)用(僅用作控制循環(huán)次數(shù))

常用的列表切片方法:
a = [1,2,3,4,5,6,7,8,9,10]
# 一般是通過下標(biāo)取數(shù)值
a[0:1] = [1]
a[0:2] = [1,2]
# 包含開頭,不包含結(jié)尾。
a [:-1]  # 從頭一直到最后一個(gè)元素a[-1],但不包含最后一個(gè)元素。
word = 'I-love-China'
word[:2] # 取前兩個(gè)
word[2:] # 除了前兩個(gè),其他全部選取

sample() 函數(shù)

sample()函數(shù)是random包中的函數(shù);一般用于隨機(jī)獲取列表中的元素,有兩個(gè)參數(shù);第一個(gè)參數(shù)是可迭代對(duì)象(可以是列表,數(shù)組等數(shù)據(jù)集合)第二個(gè)參數(shù)是隨機(jī)抽取的個(gè)數(shù)

from random import randint,sample
lst = [randint(0,50) for _ in range(0,100)]
lst_sample = sample(lst,10)
print(lst_sample)   # [33, 6, 4, 0, 28, 39, 33, 13, 28, 16]

sample()函數(shù)也可以用來處理字符串,此時(shí)第一個(gè)參數(shù)是字符串對(duì)象,第二個(gè)參數(shù)是需要隨機(jī)抽取的字符的個(gè)數(shù),最后會(huì)返回一個(gè)列表對(duì)象作為結(jié)果

str = 'aaaannnhhhsuuiocnaibcubvaocns'
str_sample = sample(str,12)
print(str_sample)      # ['a', 'a', 'a', 'v', 'n', 'b', 'a', 'c', 'n', 'o', 's', 'n']
print(type(str_sample))    # <class 'list'>

重洗數(shù)據(jù)集

使用的是random包中的shuffle函數(shù)這個(gè)函數(shù)的返回值是None,但是可以起到對(duì)數(shù)據(jù)集合重新排序的作用使用shuffle用來重洗數(shù)據(jù)集,值得注意shuffle是對(duì)lst就地(in place)洗牌,節(jié)省存儲(chǔ)空間

from random import shuffle,randint
lst = [randint(0,50) for _ in range(100)]
print(lst)
shuffle(lst)
print(lst)
print(shuffle(lst))     # 直接打印這個(gè)函數(shù)的返回值:None

生成坐標(biāo)點(diǎn)

生成十個(gè)隨機(jī)分布的坐標(biāo)點(diǎn):這個(gè)案例使用到的函數(shù)是random包中的uniform()函數(shù);uniform() 方法將隨機(jī)生成下一個(gè)實(shí)數(shù),它在 [x, y] 范圍內(nèi)。其中x是隨機(jī)數(shù)的最小值,生成的數(shù)據(jù)中可以包含這個(gè)值,y是隨機(jī)數(shù)范圍的最大值,生成的數(shù)據(jù)不包括這個(gè)值

from random import uniform
lst = [(uniform(1,10),uniform(1,10)) for _ in range(10)]
print(lst)

生成十個(gè)高斯分布的坐標(biāo)點(diǎn),使用gauss()函數(shù),gauss(u,sigma)有兩個(gè)參數(shù):生成均值為u, 標(biāo)準(zhǔn)差為sigma;的滿足高斯分布的值;但是gauss()函數(shù)只能生成對(duì)應(yīng)的分布數(shù)字,需要生成坐標(biāo)點(diǎn)列表的話要與zip函數(shù)連用

from random import gauss
x = range(10)
y = [2*xi*gauss(0,1) for xi in x]
points = list(zip(x,y))    # 通過 zip() 函數(shù),將之前生成的range序列與在對(duì)應(yīng)循環(huán)中生成的高斯分布的數(shù)字連接在一起,形成坐標(biāo)點(diǎn),因?yàn)閦ip返回的是zip對(duì)象,將其轉(zhuǎn)換為列表之后可以看見高斯坐標(biāo)點(diǎn)列表
print(points)

chain()函數(shù)

chain 函數(shù)可以用來串聯(lián)多個(gè)容器(相同或者不同的數(shù)據(jù)集合)中的對(duì)象并返回一個(gè)chain對(duì)象;返回的對(duì)象是一個(gè)可迭代對(duì)象,這個(gè)對(duì)象可以被轉(zhuǎn)換為列表,也可以被轉(zhuǎn)換為其他數(shù)據(jù)集合

from itertools import chain
a = [1,2,3,4,5,6,7]
b = (8,9,5,6,3,4,2)
print(chain(a,b))   # <class 'itertools.chain'> 返回的是一個(gè)可迭代的對(duì)象
print(list(chain(a,b)))

生成逆序序列

可以使用range()函數(shù)生成一個(gè)逆序序列,這會(huì)用到range函數(shù)的第三個(gè)參數(shù)(也就是步長(zhǎng))當(dāng)?shù)谌齻€(gè)參數(shù)為負(fù)值的時(shí)候,意味著是從后向前生成一個(gè)序列,這個(gè)數(shù)值的絕對(duì)絕對(duì)值意味著兩個(gè)數(shù)值之間的間隔

x = range(10,-1,-1)
print(list(x))
y = range(20,-1,-2)
print(list(y))   # 同樣 range 函數(shù)返回的是一個(gè) range對(duì)象,這個(gè)對(duì)象可以被轉(zhuǎn)換成列表

python 函數(shù)的五類參數(shù)

函數(shù)的五類參數(shù)分別為:位置參數(shù)、默認(rèn)參數(shù)、可變位置參數(shù)、可變關(guān)鍵字參數(shù)、命名關(guān)鍵字參數(shù)

def fun(a,*b,c=10,**d):
    print(f'a:{a},b:,c:{c},d:u0z1t8os')
fun(1,2,5,width=10,height=20)   #輸出:a:1,b:(2, 5),c:10,d:{'width': 10, 'height': 20}
fun(10,20,c=30)    # a:10,b:(20,),c:30,d:{}

位置參數(shù)在調(diào)用的時(shí)候一定要有參數(shù);關(guān)鍵字參數(shù)會(huì)把對(duì)應(yīng)位置的參數(shù)解析成一個(gè)可遍歷的元組對(duì)象;如果默認(rèn)參數(shù)被賦值,那么調(diào)用默認(rèn)參數(shù)的時(shí)候就采用賦值的數(shù)值,如果默認(rèn)參數(shù)沒有被賦值,調(diào)用的時(shí)候就采用函數(shù)自帶的默認(rèn)參數(shù)值;可變位置參數(shù)會(huì)把對(duì)應(yīng)位置的參數(shù)解析為字典

函數(shù)的默認(rèn)參數(shù)案例
def add_END(L=[]):
    L.append('END')
    return L
print(add_END([1,2,3,8,5,6]))
print(add_END([7,5,64,2,11,223]))

如果每次運(yùn)行只調(diào)用一次這個(gè)函數(shù),的確沒什么問題,但是如果運(yùn)行多次會(huì)導(dǎo)致關(guān)鍵詞‘END’重復(fù)的額情況發(fā)生

def add_END(L = []):
    L.append('END')
    return L
print(add_END())
print(add_END())   # 輸出:['END', 'END']

因?yàn)槊看握{(diào)用這個(gè)函數(shù)的時(shí)候,都執(zhí)行了一次添加 ’END‘關(guān)鍵字;Python函數(shù)在定義的時(shí)候,默認(rèn)參數(shù)L的值就被計(jì)算出來了,即[],因?yàn)槟J(rèn)參數(shù)L也是一個(gè)變量,它指向?qū)ο骩],每次調(diào)用該函數(shù),如果改變了L的內(nèi)容,則下次調(diào)用時(shí),默認(rèn)參數(shù)的內(nèi)容就變了,不再是函數(shù)定義時(shí)的[]了。(第二次調(diào)用的時(shí)候,函數(shù)的參數(shù)變成了[’END‘])

def add_END(L=None):
    if L is None:
        L = []
    else:
        L.append('END')
        return L
print(add_END())
print(add_END([1,2,4,5,6]))      # None || [1, 2, 4, 5, 6, 'END']

可變位置參數(shù):可變參數(shù)意味著;傳入的參數(shù)是可變的,可以是1個(gè)、2個(gè)到任意個(gè),還可以是0個(gè);被傳入的參數(shù)都會(huì)被解析為一個(gè)成一個(gè)可以遍歷的元組對(duì)象

python可變位置參數(shù)案例:計(jì)算1,2,3,4,5,6的平方和
def calc(*nums):
    sum = 0
    for n in nums:   # 在調(diào)用這個(gè)參數(shù)的時(shí)候,可以不用加 * 
        sum += n * n
    return sum
print(calc(1,2,3,4,5,6))   # 91;嗯,我就隨便找?guī)讉€(gè)數(shù)那么一算

如果是求列表中的各個(gè)元素的平方和(或者列表中的各個(gè)元素是函數(shù)的參數(shù)),可以采用列表名稱[下標(biāo)]的方式調(diào)用,或者直接在調(diào)用的時(shí)候輸入:函數(shù)名(*列表名);以剛剛求平方和的函數(shù)為例

# 如果已經(jīng)有一個(gè)list或者tuple,要調(diào)用一個(gè)可變參數(shù)
lst = [7,8,9,10,11]
# 可以使用列表(或者其他數(shù)據(jù)集合)下標(biāo)的方法來表示,也可以直接將列表名變成一個(gè)可變參數(shù)
print(calc(lst[0],lst[1],lst[2],lst[3],lst[4]))
print(calc(*lst))

可變關(guān)鍵字參數(shù):參數(shù)允許你傳入0個(gè)或任意個(gè)含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)dict

def person(name,age,**kw):
    print('name:', name, 'age:', age, 'others:', kw)
person('Tom',21,job='engineer',address='Hongkong')

在調(diào)用帶有可變關(guān)鍵字的參數(shù)的時(shí)候,注意一定要以鍵值對(duì)的形式進(jìn)行調(diào)用;在函數(shù)內(nèi)部使用這個(gè)參數(shù),不需要加上**
在使用 *kw 參數(shù)的時(shí)候,調(diào)用函數(shù)注意點(diǎn)
1、關(guān)鍵字參數(shù)會(huì)把對(duì)應(yīng)位置的參數(shù)解析為字典;所以寫的時(shí)候要做道鍵值一一對(duì)應(yīng)
2、在調(diào)用的時(shí)候(程序中)使用kw不需要再加

3、可以向關(guān)鍵字參數(shù)的位置傳入若干字?jǐn)?shù)的關(guān)鍵字參數(shù)

和可變位置參數(shù)一樣,當(dāng)調(diào)用的參數(shù)是對(duì)應(yīng)的字典中的鍵值對(duì)時(shí)可以通過引用字典名[鍵名]的方式給對(duì)應(yīng)的參數(shù)賦值;也可以通過**字典名的方式調(diào)用整個(gè)字典中的鍵值對(duì):以上述函數(shù)為例:

extra = {'gender':'female','job':'engineer','address':'Shanghai'}
person('katheine',22,gender=extra['gender'],address=extra['address'])
person('linda',23,**extra)
# 輸出的結(jié)果為:
# name: katheine age: 22 others: {'gender': 'female', 'address': 'Shanghai'}
# name: linda age: 23 others: {'gender': 'female', 'job': 'engineer', 'address': 'Shanghai'}

命名關(guān)鍵字參數(shù):命名關(guān)鍵字參數(shù)可以用來限制可變關(guān)鍵字參數(shù)的鍵值,如果要限制可變關(guān)鍵字參數(shù)的鍵(接受特定鍵名)可以使用命名關(guān)鍵字參數(shù);命名關(guān)鍵字也可以有缺省值(類似于默認(rèn)參數(shù))從而簡(jiǎn)化調(diào)用

def person(name, age, *, city, job):
    print('name:', name, 'age:', age, 'city:', city, 'job:', job)
person('TOM',21,city='Beijing')   # 會(huì)因?yàn)槿鄙賹?duì)應(yīng)的鍵值 job 而報(bào)錯(cuò),
person('TOM',21,city='Beijing',job='engineer')

一旦使用了命名關(guān)鍵字參數(shù),調(diào)用函數(shù)時(shí)每個(gè)命名關(guān)鍵字的參數(shù)值都要給出,否則會(huì)報(bào)缺少參數(shù)的錯(cuò)誤;也可以用一種缺省關(guān)鍵字的做法(類似于默認(rèn)參數(shù))用來避免多次錄入同樣的參數(shù)

def person(name, age, *, city, job='fireman'):   # 在這里如果我們加上了 = ’fireman‘ 這個(gè)參數(shù),沒有賦值的鍵就會(huì)自動(dòng)使用這個(gè)默認(rèn)參數(shù)
    print('name:', name, 'age:', age, 'city:', city, 'job:', job)
person('TOM',21,city='Beijing')
person('TOM',21,city='Beijing',job='engineer')
# name: TOM age: 21 city: Beijing job: fireman
# name: TOM age: 21 city: Beijing job: engineer 
最后編輯于
?著作權(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)容