真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

用python簡化函數(shù) python函數(shù)語法

python lambda函數(shù)用法?

這里lambda x的x是函數(shù)的參數(shù),是lst的元素(這里是一個(gè)元組),

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了竹溪免費(fèi)建站歡迎大家使用!

x[1]是函數(shù)的返回值,是lst元素(元組)的第2個(gè)元素即字符串,

所以,lst.sort(key=lambda x:x[1])是以lst元素(元組)的第二個(gè)元素為key排序,默認(rèn)為升序

排序后的lst為[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

print(lst[3][1][2])是打印排序后的lst中的第4個(gè)元素(元組)的第2個(gè)元素(字符串)的第3個(gè)字符,結(jié)果就是打印字符串two的字符o

請(qǐng)問這段Python代碼如何用匿名函數(shù)簡化?

樓主你好!

要解決這道題目并不難,只需要理解匿名lambda是如何使用的便可;

“l(fā)ambda?表達(dá)式1:表達(dá)式2”其實(shí)就是定義了一個(gè)函數(shù),傳入表達(dá)式1的參數(shù),按表達(dá)式2的形式返回,因此,該語句也就返回了一個(gè)函數(shù)對(duì)象,請(qǐng)看如下代碼:

def?demo(x):

return?x*x

lambda_demo?=?lambda?x:x*x

以上代碼中demo函數(shù)和lambda_demo是等效的,都是可以調(diào)用的對(duì)象,傳入一個(gè)參數(shù),返回這個(gè)參數(shù)的平方。

那這題就不難解了,其實(shí)做的事情就是定義了兩層:

1)第一層函數(shù)是傳入一個(gè)參數(shù),返回第二層定義的函數(shù)對(duì)象

2)第二層是不傳入?yún)?shù),返回第一層參數(shù)的平方

套用lambda的定義,便不難解出正確答案:

#?-*-?coding:?utf-8?-*-

def?count():

'''這是原函數(shù)'''

def?f(j):

def?g():

return?j*j

return?g

fs?=?[]

for?i?in?range(1,?4):

fs.append(f(i))

return?fs

def?edited_count():

'''這是修改后的函數(shù)'''

fs=?[]

for?i?in?range(1,?4):

fs.append((lambda?x:(lambda?:x*x))(i))

return?fs

def?evol_count():

'''更加pythonic的寫法'''

return?[(lambda?x:(lambda?:x*x))(i)?for?i?in?range(1,4)]

'''一行式寫法'''

one_line_count?=?lambda?:[(lambda?x:(lambda?:x*x))(i)?for?i?in?range(1,4)]

再分析一下樓主兩段錯(cuò)誤代碼:

第一段的報(bào)錯(cuò)原因在于,樓主混淆了變量的有效空間,lambda中的變量只是形式,并不會(huì)對(duì)外部變量進(jìn)行錄入,所以在f函數(shù)中傳入的j,并不會(huì)記錄在lambda中,因此,在最后執(zhí)行的時(shí)候,列表中的三個(gè)函數(shù)是第一段代碼段中的demo函數(shù),需要樓主傳入一個(gè)參數(shù),再返回你傳入?yún)?shù)的平方。

第二段代碼看代碼邏輯應(yīng)該是正確的,這個(gè)修改發(fā)生了什么呢?其實(shí)你定義的lambda函數(shù)形式變成了這樣:

def?demo(x=1):

return?x*x

也就是變相的把變量的值給定義了,出錯(cuò)的原因應(yīng)該是你在調(diào)用的時(shí)候很可能是以這樣的形式調(diào)用:count()()?才導(dǎo)致了報(bào)錯(cuò)。

希望樓主能夠深入理解lambda以及python的命名空間,今后遇到這樣的題目便能迎刃而解了。

望采納,謝謝!~

使用python簡單封裝selenium常用函數(shù)

年前走查腳本代碼時(shí),發(fā)現(xiàn)大家對(duì)selenium功能都在重復(fù)造輪子,而且容易出現(xiàn)一些常見低級(jí)bug。于是在閑暇之余,封裝一些常用的selenium功能。

在某些網(wǎng)頁中,存在多個(gè)frame嵌套。而selenium提供的find_element函數(shù)只能在當(dāng)前frame中查找,不能切換到其他frame中,需要從最上級(jí)frame中逐步切換(當(dāng)然也可以指定xpath的絕對(duì)路徑,但是一般沒人這么做)。在我們寫代碼過程中,需要明確知道當(dāng)前frame位置和需要尋找元素的frame位置。在frame切換過程中,容易因?yàn)槭韬鰧?dǎo)致frame切換錯(cuò)誤導(dǎo)致元素?zé)o法找到的bug。

頁面中分布的frame,可以理解為樹狀結(jié)構(gòu)。因此我們可以采用遞歸的方式, 沿著某條搜索路線frame節(jié)點(diǎn),依次對(duì)樹中每個(gè)節(jié)點(diǎn)均做一次訪問。

我們以163網(wǎng)址上的登錄框?yàn)槔狐c(diǎn)擊登錄按鈕,彈出登錄iframe頁面。輸入框位置在iframe中,因此我們不能使用xpath獲取元素位置,需要進(jìn)入iframe中,然后獲取元素。

手動(dòng)切換ifame可能會(huì)產(chǎn)生bug,因此需要一套自動(dòng)切換和檢索frame的機(jī)制。具體代碼如下:

需要注意的是:如果頁面中多個(gè)frame中,存在相同的xpath元素。還是需要指定frame的路徑,否則會(huì)返回搜索到的第一個(gè)元素。

強(qiáng)制等待

直接調(diào)用系統(tǒng)time.sleep函數(shù),不管頁面加載情況一定會(huì)等待指定的時(shí)間, 即使元素已被加載 。

1.如果設(shè)置的時(shí)間較長,會(huì)浪費(fèi)時(shí)間

2.如果設(shè)置的時(shí)間較短,元素可能沒有加載。

頁面中某元素如果未能立即加載,隱式等待告訴WebDriver需等待一定的時(shí)間,然后去查找元素。默認(rèn)不等待,隱式等待作用于整個(gè)WebDriver周期,只需設(shè)置一次即可。

1.在上文的find_element函數(shù)中,采用遞歸方式在所有frame尋找元素。若采用隱式等待,則在每個(gè)frame中都需要等待設(shè)定的時(shí)間,耗時(shí)非常長。

2.某些頁面我們想要的元素已經(jīng)加載完畢,但是部分其他資源未加載。隱式等待必須等待所有元素加載完畢,增加額外等待時(shí)間。

顯示等待一般作用于某一個(gè)元素,在設(shè)定的時(shí)間范圍內(nèi),默認(rèn)每間隔0.5秒查找元素。返回被加載的元素,若超過設(shè)定的時(shí)間范圍未能查找則報(bào)錯(cuò)。顯示等待作為selenium常用的等待機(jī)制,我們來看下他的源碼和機(jī)制。

driver 注釋中解釋為WebDriver實(shí)例,但是代碼中并未有相關(guān)檢測,因此可以傳入任何對(duì)象

但是__repr__函數(shù)中使用到session_id屬性,如果需要顯示屬性或者轉(zhuǎn)為str對(duì)象,最好在driver對(duì)象中添加session_id屬性

在until函數(shù)中,我們可以看到driver對(duì)象傳入method函數(shù)。在計(jì)時(shí)結(jié)束前,在不斷循環(huán)執(zhí)行method函數(shù),如果method函數(shù)有正常返回值則退出循環(huán),否則報(bào)TimeoutException錯(cuò)誤。

可以采用裝飾器對(duì)隱式等待進(jìn)行封裝,這樣代碼更加精簡

同樣的,采用裝飾器對(duì)其他常用的函數(shù)進(jìn)行封裝,例如強(qiáng)制等待、點(diǎn)擊、輸入文本等。

裝飾器雖然很方便,但也會(huì)產(chǎn)生一些麻煩。例如在find_element函數(shù)遞歸調(diào)用過程中,理應(yīng)只要執(zhí)行一次裝飾器函數(shù)。但因?yàn)檠b飾器已經(jīng)裝飾完畢,導(dǎo)致每次遞歸都會(huì)執(zhí)行。例如強(qiáng)制等待的sleep函數(shù),如果遞歸次數(shù)越多等待時(shí)間越長。

解除裝飾器一般有兩種做法:一是約定參數(shù),當(dāng)遞歸第二次調(diào)用時(shí)則不生效。例如

這種方式實(shí)現(xiàn)簡單,容易理解。但是增加了參數(shù)限制,在fun函數(shù)中就不能使用first_sleep參數(shù)。

二是采用裝飾器采用wrapped實(shí)現(xiàn),通過訪問wrapped屬性獲得原始函數(shù)。例如

但是某一個(gè)函數(shù)被多個(gè)裝飾器裝飾時(shí),需要遞歸解除裝飾器。例如

最后整體代碼如下

這次的封裝其實(shí)還存在很多問題

1.find_element函數(shù)不僅僅只是提供查找元素功能,還提供一些其他功能,因此叫element_operation更為合適。

2.find_element函數(shù)的參數(shù)過多,并且很多參數(shù)的使用并不在函數(shù)本身中,對(duì)代碼閱讀很不友好。

3.得小心避免參數(shù)重復(fù)問題,假設(shè)裝飾器sleep和裝飾器wait_time都使用time這個(gè)參數(shù),將無法區(qū)分具體是哪個(gè)函數(shù)使用。

4.不利于擴(kuò)展和維護(hù),當(dāng)功能過多時(shí)find_element的參數(shù)過于龐大。

如果只是簡單地封裝和使用,上面這種方式也能達(dá)到較好的效果。如果想進(jìn)一步封裝,建議采用鏈?zhǔn)秸{(diào)用方式,裝飾器輔助封裝。例如

這樣函數(shù)的擴(kuò)展性和可閱讀性有較大的提升

Python中冷門但非常好用的內(nèi)置函數(shù)

Python中有許多內(nèi)置函數(shù),不像print、len那么廣為人知,但它們的功能卻異常強(qiáng)大,用好了可以大大提高代碼效率,同時(shí)提升代碼的簡潔度,增強(qiáng)可閱讀性

Counter

collections在python官方文檔中的解釋是High-performance container datatypes,直接的中文翻譯解釋高性能容量數(shù)據(jù)類型。這個(gè)模塊實(shí)現(xiàn)了特定目標(biāo)的容器,以提供Python標(biāo)準(zhǔn)內(nèi)建容器 dict , list , set , 和 tuple 的替代選擇。在python3.10.1中它總共包含以下幾種數(shù)據(jù)類型:

容器名簡介

namedtuple() 創(chuàng)建命名元組子類的工廠函數(shù)

deque 類似列表(list)的容器,實(shí)現(xiàn)了在兩端快速添加(append)和彈出(pop)

ChainMap 類似字典(dict)的容器類,將多個(gè)映射集合到一個(gè)視圖里面

Counter 字典的子類,提供了可哈希對(duì)象的計(jì)數(shù)功能

OrderedDict 字典的子類,保存了他們被添加的順序

defaultdict 字典的子類,提供了一個(gè)工廠函數(shù),為字典查詢提供一個(gè)默認(rèn)值

UserDict 封裝了字典對(duì)象,簡化了字典子類化

UserList 封裝了列表對(duì)象,簡化了列表子類化

UserString 封裝了字符串對(duì)象,簡化了字符串子類化

其中Counter中文意思是計(jì)數(shù)器,也就是我們常用于統(tǒng)計(jì)的一種數(shù)據(jù)類型,在使用Counter之后可以讓我們的代碼更加簡單易讀。Counter類繼承dict類,所以它能使用dict類里面的方法

舉例

#統(tǒng)計(jì)詞頻

fruits = ['apple', 'peach', 'apple', 'lemon', 'peach', 'peach']

result = {}

for fruit in fruits:

if not result.get(fruit):

result[fruit] = 1

else:

result[fruit] += 1

print(result)

#{'apple': 2, 'peach': 3, 'lemon': 1}下面我們看用Counter怎么實(shí)現(xiàn):

from collections import Counter

fruits = ['apple', 'peach', 'apple', 'lemon', 'peach', 'peach']

c = Counter(fruits)

print(dict(c))

#{'apple': 2, 'peach': 3, 'lemon': 1}顯然代碼更加簡單了,也更容易閱讀和維護(hù)了。

elements()

返回一個(gè)迭代器,其中每個(gè)元素將重復(fù)出現(xiàn)計(jì)數(shù)值所指定次。元素會(huì)按首次出現(xiàn)的順序返回。如果一個(gè)元素的計(jì)數(shù)值小于1,elements()將會(huì)忽略它。

c = Counter(a=4, b=2, c=0, d=-2)

sorted(c.elements())

['a', 'a', 'a', 'a', 'b', 'b']most_common([n])

返回一個(gè)列表,其中包含n個(gè)最常見的元素及出現(xiàn)次數(shù),按常見程度由高到低排序。如果n被省略或?yàn)镹one,most_common()將返回計(jì)數(shù)器中的所有元素。計(jì)數(shù)值相等的元素按首次出現(xiàn)的順序排序:

Counter('abracadabra').most_common(3)

[('a', 5), ('b', 2), ('r', 2)]這兩個(gè)方法是Counter中最常用的方法,其他方法可以參考 python3.10.1官方文檔

實(shí)戰(zhàn)

Leetcode 1002.查找共用字符

給你一個(gè)字符串?dāng)?shù)組words,請(qǐng)你找出所有在words的每個(gè)字符串中都出現(xiàn)的共用字符(包括重復(fù)字符),并以數(shù)組形式返回。你可以按任意順序返回答案。

輸入:words = ["bella", "label", "roller"]

輸出:["e", "l", "l"]

輸入:words = ["cool", "lock", "cook"]

輸出:["c", "o"]看到統(tǒng)計(jì)字符,典型的可以用Counter完美解決。這道題是找出字符串列表里面每個(gè)元素都包含的字符,首先可以用Counter計(jì)算出每個(gè)元素每個(gè)字符出現(xiàn)的次數(shù),依次取交集最后得出所有元素共同存在的字符,然后利用elements輸出共用字符出現(xiàn)的次數(shù)

class Solution:

def commonChars(self, words: List[str]) - List[str]:

from collections import Counter

ans = Counter(words[0])

for i in words[1:]:

ans = Counter(i)

return list(ans.elements())提交一下,發(fā)現(xiàn)83個(gè)測試用例耗時(shí)48ms,速度還是不錯(cuò)的

sorted

在處理數(shù)據(jù)過程中,我們經(jīng)常會(huì)用到排序操作,比如將列表、字典、元組里面的元素正/倒排序。這時(shí)候就需要用到sorted(),它可以對(duì)任何可迭代對(duì)象進(jìn)行排序,并返回列表

對(duì)列表升序操作:

a = sorted([2, 4, 3, 7, 1, 9])

print(a)

# 輸出:[1, 2, 3, 4, 7, 9]對(duì)元組倒序操作:

sorted((4,1,9,6),reverse=True)

print(a)

# 輸出:[9, 6, 4, 1]使用參數(shù):key,根據(jù)自定義規(guī)則,按字符串長度來排序:

fruits = ['apple', 'watermelon', 'pear', 'banana']

a = sorted(fruits, key = lambda x : len(x))

print(a)

# 輸出:['pear', 'apple', 'banana', 'watermelon']all

all() 函數(shù)用于判斷給定的可迭代參數(shù)iterable中的所有元素是否都為 TRUE,如果是返回 True,否則返回 False。元素除了是 0、空、None、False外都算True。注意:空元組、空列表返回值為True。

all(['a', 'b', 'c', 'd']) # 列表list,元素都不為空或0

True

all(['a', 'b', '', 'd']) # 列表list,存在一個(gè)為空的元素

False

all([0, 1,2, 3]) # 列表list,存在一個(gè)為0的元素

False

all(('a', 'b', 'c', 'd')) # 元組tuple,元素都不為空或0

True

all(('a', 'b', '', 'd')) # 元組tuple,存在一個(gè)為空的元素

False

all((0, 1, 2, 3)) # 元組tuple,存在一個(gè)為0的元素

False

all([]) # 空列表

True

all(()) # 空元組

Trueany函數(shù)正好和all函數(shù)相反:判斷一個(gè)tuple或者list是否全為空,0,F(xiàn)alse。如果全為空,0,F(xiàn)alse,則返回False;如果不全為空,則返回True。

F-strings

在python3.6.2版本中,PEP 498提出一種新型字符串格式化機(jī)制,被稱為 “字符串插值” 或者更常見的一種稱呼是F-strings,F(xiàn)-strings提供了一種明確且方便的方式將python表達(dá)式嵌入到字符串中來進(jìn)行格式化:

s1='Hello'

s2='World'

print(f'{s1} {s2}!')

# Hello World!在F-strings中我們也可以執(zhí)行函數(shù):

def power(x):

return x*x

x=4

print(f'{x} * {x} = {power(x)}')

# 4 * 4 = 16而且F-strings的運(yùn)行速度很快,比傳統(tǒng)的%-string和str.format()這兩種格式化方法都快得多,書寫起來也更加簡單。

本文主要講解了python幾種冷門但好用的函數(shù),更多內(nèi)容以后會(huì)陸陸續(xù)續(xù)更新~


分享文章:用python簡化函數(shù) python函數(shù)語法
新聞來源:http://weahome.cn/article/doccijs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部