手機(jī)網(wǎng)站建設(shè)設(shè)計(jì)6灰色seo推廣
lambda匿名函數(shù)
python使用lambda表達(dá)式來(lái)創(chuàng)建匿名函數(shù)
語(yǔ)法
// lambda 參數(shù)們:對(duì)參數(shù)的處理 lambda x : 2 * x // x 是參數(shù), 2*x 是返回值 ? //使用lambda實(shí)現(xiàn)求和 sum = lambda arg1, arg2 : agr1 + arg2 print(sum(10,20)) ? // 將匿名函數(shù)封裝在一個(gè)函數(shù)里面,可以用同樣的代碼來(lái)創(chuàng)建多個(gè)匿名函數(shù) def myfunc(n):return lambda a : a * n mydoubler myfunc(2) mytripler myfunc(3) print(mydoubler(11)) // 2 * 11 print(mytripler(11)) // 3 * 11
lambda函數(shù)不能訪問(wèn)自己的參數(shù)列表以外或者全局命名空間里面的參數(shù)
lambda的主體是一個(gè)表達(dá)式而不是代碼塊,僅僅能封裝有限的邏輯進(jìn)去
推導(dǎo)式
【Python】推導(dǎo)式(列表推導(dǎo)式、元組推導(dǎo)式、字典推導(dǎo)式、集合推導(dǎo)式)詳解_一個(gè)寫(xiě)濕的程序猿的博客-CSDN博客
-
列表推導(dǎo)式
[表達(dá)式 for 變量 in 列表] 或者 [表達(dá)式 for 變量 in 列表 if 條件] [out_exp_res for out_exp in input_list if condition] ? // 例子 l = [1,2,3] [print(item) for item in l if item > 1]
-
字典推導(dǎo)式
{key_expr:value_expr for value in colletion if conditon} key_expr:新key生成表達(dá)式,可以是有返回值的函數(shù) value_expr:新value生成表達(dá)式,可以是有返回值的函數(shù) for value in colletion if conditon:迭代colletion中滿(mǎn)足條件的value傳入到key_expr:value_expr中
-
集合推導(dǎo)式
{expression for item in Sequence if condition} expression:新元素生成表達(dá)式,可以是有返回值的函數(shù)體 for item in Sequence if condition:將滿(mǎn)足條件的Sequence迭代傳入expression表達(dá)式
-
元組表達(dá)式【生成器表達(dá)式】
元組推導(dǎo)式可以利用range區(qū)間,元組,列表,字典和集合等數(shù)據(jù)類(lèi)型,快速生成一個(gè)滿(mǎn)足指定要求的元組
(expression for item in Sequence if condition) expression:新元素生成表達(dá)式,可以是有返回值的函數(shù)體 for item in Sequence if condition:將滿(mǎn)足條件的Sequence迭代傳入expression表達(dá)式
enumerate內(nèi)建函數(shù)
enumerate()函數(shù)用于將一個(gè)可遍歷的數(shù)據(jù)對(duì)象組合為一個(gè)索引序列,同時(shí)列出數(shù)據(jù)和數(shù)據(jù)下標(biāo)
enumerate(sequence,[start=0])
-
sequence為一個(gè)序列,迭代器,或者其它支持迭代對(duì)象,返回的是一個(gè)enumerate對(duì)象
-
通過(guò)enumerate對(duì)象的遍歷,可以獲得索引于數(shù)據(jù)的組合對(duì)
list = ['1','2','3','4'] for index, value in enumerate(list):print(f'第{index},{value}') # 結(jié)果如下 第0,1 第1,2 第2,3 第3,4 ? ?
迭代器與生成器
-
迭代器是訪問(wèn)集合元素的一種方式,迭代器特征為:
-
是一個(gè)可以記住遍歷位置的對(duì)象
-
迭代器對(duì)象從集合的第一個(gè)元素開(kāi)始訪問(wèn),直到所有的元素被訪問(wèn)完結(jié)束,迭代器只能往前而不會(huì)后退
-
迭代器有兩個(gè)基本方法:iter()和next(),字符串,列表,元組都可以用于創(chuàng)建迭代器
-
迭代器對(duì)象可以用for進(jìn)行遍歷,也可以使用next()函數(shù)來(lái)獲取下一個(gè)值
list = ['1','2','3','4'] ? my_iterator = iter(list) ? while True:try:element = next(my_iterator)print(element)except StopIteration:# 迭代結(jié)束,退出循環(huán)break
-
-
生成器:使用了yield的函數(shù)被稱(chēng)為生成器(generator)
-
生成器是一個(gè)返回迭代器的函數(shù),只能用于迭代操作,簡(jiǎn)單說(shuō)生成器就是一個(gè)迭代器
-
在調(diào)用生成器的運(yùn)行過(guò)程中,每次遇到y(tǒng)ield式函數(shù)都會(huì)暫停并保存當(dāng)前所有信息,返回yield的值。并在下一次執(zhí)行next()方法時(shí)從當(dāng)前位置繼續(xù)運(yùn)行
-
調(diào)用一個(gè)生成器函數(shù),返回的是一個(gè)迭代器對(duì)象
# 定義一個(gè)生成器函數(shù) def my_generatpr(n):for i in range(n):# 使用yield語(yǔ)句返回元素yield i * i ? # 創(chuàng)建一個(gè)生成器對(duì)象并遍歷元素 for element in my_generatpr(5):print(element)
-
迭代器和生成器的作用:
-
節(jié)約內(nèi)存:循環(huán)過(guò)程中,數(shù)據(jù)不用一次讀入,迭代器不會(huì)保存所有值。而是在運(yùn)行中動(dòng)態(tài)的計(jì)算出數(shù)列的各個(gè)值,并將之前的數(shù)值扔掉
-
不依賴(lài)索引取值
-
實(shí)現(xiàn)惰性計(jì)算:需要時(shí)再取值計(jì)算
-
精簡(jiǎn)代碼:使用yield關(guān)鍵字或者生成器表達(dá)式可以很方便的生成一個(gè)迭代器對(duì)象
裝飾器
-
函數(shù)裝飾器:本質(zhì)上是一個(gè)python函數(shù),可以讓其它函數(shù)在不需要做任何代碼改動(dòng)的前提下增加額外功能
-
提供了@符號(hào)作為裝飾器的語(yǔ)法糖
-
使用語(yǔ)法糖要求裝飾件函數(shù)必須retrurn一個(gè)對(duì)象
# 定義一個(gè)函數(shù)裝飾器 def my_decorator(func):def wrapper():print("Before function call")func()print("After function call")return wrapper() ? # 使用函數(shù)裝飾器 # 原有功能:打印”hello world“ @my_decorator def say_hello():print("hello world") ? #調(diào)用函數(shù) say_hello() ? # 結(jié)果 TypeError: 'NoneType' object is not callable Before function call hello world After function call
-
類(lèi)裝飾器
-
可以用來(lái)改變類(lèi)的行為,由python類(lèi)和@符號(hào)組成,在python中通常用于實(shí)現(xiàn)代碼復(fù)用,日志記錄,性能測(cè)試等功能
? # 定義一個(gè)類(lèi)裝飾器 class MyClassDecorator:def __init__(self, cls):self.cls = cls ?def __call__(self, *args, **kwargs):new_args = "Dear " + args[0]instance = self.cls(new_args, **kwargs)return instance ? # 使用類(lèi)裝飾器 # 原有功能:打印 hello+名字 @MyClassDecorator class MyClass:def __init__(self, name):self.name = name ?def say_hello(self):print(f"hello, {self.name}") ? # 創(chuàng)建實(shí)例 my_object = MyClass("Alice") # 調(diào)用實(shí)例的方法 my_object.say_hello() ? # 打印的結(jié)果hello,DearAlice
-
-
需要注意的是,裝飾器本身并不會(huì)改變?cè)即a的功能,而是通過(guò)創(chuàng)建一個(gè)新的函數(shù)來(lái)實(shí)現(xiàn)對(duì)原始函數(shù)或者類(lèi)的修改,因此,在使用裝飾器時(shí),需要確保新創(chuàng)建的函數(shù)或者類(lèi)與原始代碼有相同的接口或者行為,以免對(duì)其它依賴(lài)于改代碼的程序產(chǎn)生影響。