在工作中遇到一個項目的陳年老bug,如圖:
創(chuàng)新互聯(lián)公司公司2013年成立,先為撫順等服務建站,撫順等地企業(yè),進行企業(yè)商務咨詢服務。為撫順企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。
bug原因是這里本應該傳idx,結(jié)果傳成了id。
但是這里最有意思的地方來了。
從截圖可以看出,這個id并不是入?yún)?,也沒有定義過,那他直接用怎么不會報參數(shù)未定義的語法錯誤呢?按說函數(shù)應該執(zhí)行不了直接報錯,但是實際上整個方法可以執(zhí)行不會報錯。
排查import也沒有import id,也沒有定義全局變量。那么這個id變量沒有在任何地方定義,為什么可以直接使用呢,還不會報語法錯誤?
經(jīng)過查閱資料才發(fā)現(xiàn),id在這里其實 不是一個變量,而是一個函數(shù)!
查看官方文檔可以看到:
所以id()本身是python內(nèi)置的一個函數(shù),但是因為很少用到,所以很多人并不太清楚。
循環(huán)用于重復執(zhí)行一些程序塊。從上一講的選擇結(jié)構(gòu),我們已經(jīng)看到了如何用縮進來表示程序塊的隸屬關系。循環(huán)也會用到類似的寫法。
for循環(huán)
for循環(huán)需要預先設定好循環(huán)的次數(shù)(n),然后執(zhí)行隸屬于for的語句n次。
基本構(gòu)造是
for 元素 in 序列:
statement
舉例來說,我們編輯一個叫forDemo.py的文件
for a in [3,4.4,'life']:
print a
這個循環(huán)就是每次從表[3,4.4,'life'] 中取出一個元素(回憶:表是一種序列),然后將這個元素賦值給a,之后執(zhí)行隸屬于for的操作(print)。
介紹一個新的Python函數(shù)range(),來幫助你建立表。
idx = range(5)
print idx
可以看到idx是[0,1,2,3,4]
這個函數(shù)的功能是新建一個表。這個表的元素都是整數(shù),從0開始,下一個元素比前一個大1, 直到函數(shù)中所寫的上限 (不包括該上限本身)
(關于range(),還有豐富用法,有興趣可以查閱, Python 3中, range()用法有變化,見評論區(qū))
舉例
for a in range(10):
print a**2
while循環(huán)
while的用法是
while 條件:
statement
while會不停地循環(huán)執(zhí)行隸屬于它的語句,直到條件為假(False)
舉例
while i 10:
print i
i = i + 1
中斷循環(huán)
continue # 在循環(huán)的某一次執(zhí)行中,如果遇到continue, 那么跳過這一次執(zhí)行,進行下一次的操作
break # 停止執(zhí)行整個循環(huán)
for i in range(10):
if i == 2:
continue
print i
當循環(huán)執(zhí)行到i = 2的時候,if條件成立,觸發(fā)continue, 跳過本次執(zhí)行(不執(zhí)行print),繼續(xù)進行下一次執(zhí)行(i = 3)。
for i in range(10):
if i == 2:
break
print i
當循環(huán)執(zhí)行到i = 2的時候,if條件成立,觸發(fā)break, 整個循環(huán)停止。
# coding = GBK
a =[1,2,3,4,5]
sum=0
b = len(a)
print("這個數(shù)組的長度為:",b)
for i? in a:
sum =sum +i
print("這個數(shù)組之和為:",sum)
print("這個數(shù)組平均數(shù)為",sum/b)
或
import sys
sum = 0
cnt = 0
f = open('1.txt', 'r')
files = f.readline()
while (files ):
sum = sum + float(files .split(",")[0])
cnt = cnt + 1
files = f.readline()
print(sum / cnt)
f.close()
或者。
#!/usr/bin/env pythonimport timeimport numpy as np
dd = np.random.randint(0, 20, size=(2*1000*1000))t_start = time.clock()avg_sum1 =
0.0BlockOffset = 0 ? ? while BlockOffset len(dd):
if dd[BlockOffset + 1] = 10:
avg_sum1 += dd[BlockOffset + 1] * 0.1
else:
avg_sum1 += dd[BlockOffset + 0] * 0.01
BlockOffset += 2print('Avg: ' + str(avg_sum1 / len(dd) / 2)) ? ?print('Exe time: ' +
str(time.clock() - t_start))
擴展資料:
python 實現(xiàn)求和、計數(shù)、最大最小值、平均值、中位數(shù)、標準偏差、百分比。
import?sys
class?Stats:
def?__init__(self, sequence):
# sequence of numbers we will process
# convert all items to floats for numerical processing
self.sequence?=?[float(item)?for?item?in?sequence]
def?sum(self):
if?len(self.sequence) ?1:
return?None
else:
return?sum(self.sequence)
def?count(self):
return?len(self.sequence)
def?min(self):
if?len(self.sequence) ?1:
return?None
else:
return?min(self.sequence)
def?max(self):
if?len(self.sequence) ?1:
return?None
else:
return?max(self.sequence)
def?avg(self):
if?len(self.sequence) ?1:
return?None
else:
return?sum(self.sequence)?/?len(self.sequence)?
def?median(self):
if?len(self.sequence) ?1:
return?None
else:
self.sequence.sort()
return?self.sequence[len(self.sequence)?//?2]
def?stdev(self):
if?len(self.sequence) ?1:
return?None
else:
avg?=?self.avg()
sdsq?=?sum([(i?-?avg)?**?2?for?i?in?self.sequence])
stdev?=?(sdsq?/?(len(self.sequence)?-?1))?**?.5
return?stdev
def?percentile(self, percentile):
if?len(self.sequence) ?1:
value?=?None
elif?(percentile =?100):
sys.stderr.write('ERROR: percentile must be 100.? you supplied: %s\n'%?percentile)
value?=?None
else:
element_idx?=?int(len(self.sequence)?*?(percentile?/?100.0))
self.sequence.sort()
value?=?self.sequence[element_idx]
return?value
參考資料來源:百度百科-python
enumerate(x,y)函數(shù)是把元組tuple、字符串str、列表list里面的元素遍歷和索引組合,其用法與range()函數(shù)很相似,
下面示例enumerate(x,y)用法以及range(x)相似的用法,但是,enumerate(x,y)函數(shù)在遍歷excel等時,可以實現(xiàn)與人視覺了解到的認識更好的理解。
enumerate(x,y)中參數(shù)y可以省略,省略時,默認從0開始,
如示例一:
list_words=["this","is","blog","of","white","mouse"]
for idx,word in enumerate(list_words):
print(idx,word)
打印結(jié)果:
使用range()函數(shù)遍歷實現(xiàn):
list_words=["this","is","blog","of","white","mouse"]
for? i in range(len(list_words)):
print(i,list_words[i])
打印結(jié)果:
自定義開始索引號:
示例二:
list_words=["this","is","blog","of","white","mouse"]
for idx,word in enumerate(list_words[1:],2):#也可以寫成for idx,word in enumerate(list_words,start=2):
print(idx,word)
打印結(jié)果:
從上面示例中可以看出,enumerate(x,y)中x是需要遍歷的元組tuple、字符串str、列表list,可以和切片組合使用,
y是自定義開始的索引號,根據(jù)自己的需要設置開始索引號。