前言一、開篇
先從我看到的乙個簡單的語句開始。
text =
'拍照'
any(word in text for word in
["拍照"
,"拍張照"
])
剛看到這個語句的時候我整個人完全懵住了,完全看不懂這是幹啥的。不過其實程式設計難的不是這些東西,這些東西再也不怕,也能想辦法解決掉,而隱藏在這後面的程式設計思維及數學等知識是很難解決的。
1.1 any、all
言歸正傳,看到這個語句後,我想到的就是如何將複雜的問題簡單化。
於是我先查了一下any函式,查到any和all函式都是對於集合而言的。
描述
any() 函式用於判斷給定的可迭代引數 iterable 是否全部為空物件,如果都為空、0、false,則返回 false,如果不都為空、0、false,則返回 true。
函式等價於:
'''
'''def
any(iterable)
:for element in iterable:
if element:
return
true
return
false
python 2.5 以上版本可用。
語法
以下是 any() 方法的語法:
any
(iterable)
引數
iterable -
- 元組或列表。
返回值如果都為空、0、false,則返回false,如果不都為空、0、false,則返回true。
描述
all() 函式用於判斷給定的可迭代引數 iterable 中的所有元素是否不為 0、』』、false 或者 iterable 為空,如果是返回 true,否則返回 false。
函式等價於:
'''
'''def
all(iterable)
:for element in iterable:
ifnot element:
return
false
return
true
python 2.5 以上版本可用。
語法
以下是 all() 方法的語法:
all
(iterable)
引數
iterable -
- 元組或列表。
返回值如果iterable的所有元素不為0、』』、false或者iterable為空,all(iterable)返回true,否則返回false;
注意:空元組、空列表返回值為true,這裡要特別注意。
簡單點說,any函式用於判斷給定的可迭代引數iterable是否全部為空物件,如果都為空、0、false中的一種(以下簡稱為空),則返回false,如果不都為空,則返回true;而all函式剛好相反,如果全不為空,則返回true,否則返回false。
1.2 for in
這就是說上面的語句any裡面是乙個iterable物件。我們再來看一下裡面的語句:
for 迴圈語句
python for迴圈可以遍歷任何序列的專案,如乙個列表或者乙個字串。
語法:for迴圈的語法格式如下:
for iterating_var in sequence:
statements(s)
流程圖:
'拍照'
(word in text for word in
["拍照"
,"拍張照"
])可以明顯的看到乙個for,for in在python裡面很明顯,簡單的說就是迴圈乙個集合,並對此集合進行過濾、計算等操作。同樣先簡化它:
(word for word in
["拍照"
,"拍張照"
])
這很明顯,生成的集合與原來相同,但是平常我們看到的都是這樣的:
[word for word in
["拍照"
,"拍張照"
]]
這裡面就牽涉到python生成器的概念。
1.3 生成器
生成器的優點在於不需要事先計算,只需要在需要的時候才會呼叫,不浪費儲存空間和計算時間。簡單的說生成器是一種特殊的集合,這種集合並不像普通的集合一樣事先全部算出,而是在需要的時候才去計算。其實實現方式很簡單,將換成()即可,於是就有了上面的語句。關於生成器的其他操作和生成方式可以在網上查閱相關資料,這裡不再贅述。
1.4 繼續for in
接著上面的for in繼續介紹,(word for word in [「拍照」, 「拍張照」])結果與原始資料相同,那麼如果我們想要產生一點變化就要對第乙個word執行乙個函式,於是就有了word in text,這裡的in就是個函式,判斷word是否是在text中,即word是否是text的子串,相當於其他語言的contain。
這樣就很清楚了,(word in text for word in [「拍照」, 「拍張照」])表示迴圈原始集合,判斷每個元素是否是給定的text字串的子串,返回的是個true、false集合。
當然我們也可以在迴圈的時候實現過濾,看如下語句:
(word for word in
["拍照"
,"拍張照"
]if word in text)
貌似這條語句跟上面的差別就在於word in text的位置發生了變化,並多了個if。其實二者差別非常大,這裡實現的功能是判斷word是否是text的子串,如果是則取出,相當於過濾掉不是子串的物件,最終返回的是乙個字串集合。
1.5 總體
那麼這裡我們再來看一下最開始的語句:
text =
'拍照'
any(word in text for word in
["拍照"
,"拍張照"
])
綜合以上語句就可以知道此語句實現的是迴圈集合判斷每乙個字串是否是給定的text的子串,最終如果不全為空的話就返回true,即text只要包含集合中的任意乙個字串,則返回true。可以用於命令檢測等等場合。
二、總結
一條SQL語句研究
現有 select from t where a in 5,3,2,1,8,9,30.假設 a 是主鍵,in裡面的引數是唯一的。現要求輸出的結果集按照 in 提供的引數順序排序。而不是按照a本身的排序規則排序?另 如果不要求使用臨時表或表變數,那麼又有什麼辦法實現。臨時表方案參卡 create ta...
優化一條UPDATE語句
最近見到一條開發人員寫的update語句,覺得沒什麼不對,可又覺得有地方不對,因為效能低下.update a set col2,col3 select col1,t from b where b.col1 a.col1 where exists select b.col1 from b where ...
解讀一條SHELL語句
今天群裡有個哥們問道這麼一條語句 tar cf cd ltos tar xvpf 這條語句是什麼意思呢?這條語句的意思是 把當前目錄的檔案打包之後,又解包到lito目錄。下面我們把這條語句分解開,這樣就好理解了。tar cf cd ltos tar xvpf 這裡大家只要了解了一下三個知識點就好理解...