欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Python中深不見底的坑有哪些-創(chuàng)新互聯(lián)

小編給大家分享一下Python中深不見底的坑有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

為東阿等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及東阿網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、東阿網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

Python是一門清晰簡潔的語言,如果你對(duì)一些細(xì)節(jié)不了解的話,就會(huì)掉入到那些深不見底的“坑”里。

列表創(chuàng)建和引用

嵌套列表的創(chuàng)建

使用*號(hào)來創(chuàng)建一個(gè)嵌套的list:

  li = [[]] * 3
  print(li)
  # Out: [[], [], []]

通過這個(gè)方法,可以得到一個(gè)包含3個(gè)list的嵌套list,我們來給第一個(gè)list增加一個(gè)元素:

  li[0].append(1)
  print(li)
  # Out: [[1], [1], [1]]

通過輸出的結(jié)果可以看初,我們只給第一元素增加元素,結(jié)果三個(gè)list都增加了一個(gè)元素。這是因?yàn)閇[]]*3并不是創(chuàng)建了三個(gè)不同list,而是創(chuàng)建了三個(gè)指向同一個(gè)list的對(duì)象,所以,當(dāng)我們操作第一個(gè)元素時(shí),其他兩個(gè)元素內(nèi)容也會(huì)發(fā)生變化的原因。效果等同于下面這段代碼:

  li = []
  element = [[]]
  li = element + element + element
  print(li)
  # Out: [[], [], []]
  element.append(1)
  print(li)
  # Out: [[1], [1], [1]]

我們可以打印出元素的內(nèi)存地址一探究竟:

  li = [[]] * 3
  print([id(inner_list) for inner_list in li])
  # Out: [6830760, 6830760, 6830760]

到這我們可以明白原因了。那如何解決了?可以這樣:

li = [[] for _ in range(3)]

這樣我們就創(chuàng)建了三個(gè)不同的list對(duì)象

  print([id(inner_list) for inner_list in li])
  # Out: [6331048, 6331528, 6331488]

列表元素的引用

不要使用索引方法遍歷list,例如:

  for i in range(len(tab)):
    print(tab[i])

比較好的方法是:

  for elem in tab:
  print(elem)

for語句會(huì)自動(dòng)生成一個(gè)迭代器。如果你需要索引位置和元素,使用enumerate函數(shù):

  for i, elem in enumerate(tab):
    print((i, elem))

注意 == 符號(hào)的使用

  if (var == True):
    # 當(dāng)var是:True、1、 1.0、 1L時(shí)if條件成立
  if (var != True):
    # 當(dāng)var不是 True 和 1 時(shí)if條件成立
  if (var == False):
    # 當(dāng)var是 False 或者 0 (or 0.0, 0L, 0j) if條件成立

  if (var == None):
    # var是None if條件成立

  if var:
    # 當(dāng)var非空(None或者大小為0)對(duì)象 string/list/dictionary/tuple, non-0等if條件成立

  if not var:
    # 當(dāng)var空(None或者大小為0)對(duì)象 string/list/dictionary/tuple, non-0等if條件成立

  if var is True:
    # 只有當(dāng)var時(shí)True時(shí) if條件成立 1也不行

  if var is False:
    # 只有當(dāng)var時(shí)False時(shí) if條件成立 0也不行

  if var is None:
  # 和var == None 一致

捕獲異常由于提前檢查

不夠優(yōu)雅的代碼:

  if os.path.isfile(file_path):
    file = open(file_path)
  else:
    # do something

比較好的做法:

  try:
    file = open(file_path)
  except OSError as e:
    # do something

在python2.6+的里面可以更簡潔:

with open(file_path) as file:

之所以這么用,是這么寫更加通用,比如file_path給你傳個(gè)None就瞎了,還得判斷是不是None,如果不判斷,就又得抓異常,判斷的話,代碼有多寫了很多。

類變量初始化

不要在對(duì)象的init函數(shù)之外初始化類屬性,主要有兩個(gè)問題

  • 如果類屬性更改,則初始值更改。

  • 如果將可變對(duì)象設(shè)置為默認(rèn)值,您將獲得跨實(shí)例共享的相同對(duì)象。

錯(cuò)誤示范(除非你想要靜態(tài)變量)

```
  class Car(object):
    color = "red"
    wheels = [Wheel(), Wheel(), Wheel(), Wheel()]
```

正確的做法:

```
  class Car(object):
    def __init__(self):
      self.color = "red"
      self.wheels = [Wheel(), Wheel(), Wheel(), Wheel()]
```

**函數(shù)默認(rèn)參數(shù)**

```
def foo(li=[]):
  li.append(1)
  print(li)

foo([2])
# Out: [2, 1]
foo([3])
# Out: [3, 1]
```

該代碼的行為與預(yù)期的一樣,但如果我們不傳遞參數(shù)呢?

```
foo()
# Out: [1] As expected...

foo()
# Out: [1, 1] Not as expected...
```

這是因?yàn)楹瘮?shù)參數(shù)類型是定義是確認(rèn)的而不是運(yùn)行時(shí),所以在兩次函數(shù)調(diào)用時(shí),li指向的是同一個(gè)list對(duì)象,如果要解決這個(gè)問題,可以這樣:

```
def foo(li=None):
  if not li:
    li = []
  li.append(1)
  print(li)

foo()
# Out: [1]

foo()
# Out: [1]
```

這雖然解決了上述的問題,但,其他的一些對(duì)象,比如零長度的字符串,輸出的結(jié)果就不是我們想要的。

```
x = []
foo(li=x)
# Out: [1]

foo(li="")
# Out: [1]

foo(li=0) 
# Out: [1]
```

最常用的辦法是檢查參數(shù)是不是None

```
def foo(li=None):
  if li is None:
    li = []
  li.append(1)
  print(li)

foo()
# Out: [1]
```

**在遍歷時(shí)修改**

for語句在遍歷對(duì)象是會(huì)生成一個(gè)迭代器,如果你在遍歷的過程中修改對(duì)象,會(huì)產(chǎn)生意想不到的結(jié)果:

  alist = [0, 1, 2]
  for index, value in enumerate(alist):
    alist.pop(index)
  print(alist)
  # Out: [1]

第二個(gè)元素沒有被刪除,因?yàn)榈错樞虮闅v索引。上述循環(huán)遍歷兩次,結(jié)果如下:

  # Iteration #1
  index = 0
  alist = [0, 1, 2]
  alist.pop(0) # removes '0'

  # Iteration #2
  index = 1
  alist = [1, 2]
  alist.pop(1) # removes '2'

  # loop terminates, but alist is not empty:
  alist = [1]

如果避免這個(gè)問題了,可以創(chuàng)建另外一個(gè)list

  alist = [1,2,3,4,5,6,7]
  for index, item in reversed(list(enumerate(alist))):
    # delete all even items
    if item % 2 == 0:
      alist.pop(index)
  print(alist)
  # Out: [1, 3, 5, 7]

整數(shù)和字符串定義

python預(yù)先緩存了一個(gè)區(qū)間的整數(shù)用來減少內(nèi)存的操作,但也正是如此,有時(shí)候會(huì)出很奇特的錯(cuò)誤,例如:

  >>> -8 is (-7 - 1)
  False
  >>> -3 is (-2 - 1)
  True

另外一個(gè)例子

  >>> (255 + 1) is (255 + 1)
  True
  >>> (256 + 1) is (256 + 1)
  False

通過不斷的測(cè)試,會(huì)發(fā)現(xiàn)(-3,256)這區(qū)間的整數(shù)都返回True,有的甚至是(-8,257)。默認(rèn)情況下,[-5,256]會(huì)在解釋器第一次啟動(dòng)時(shí)創(chuàng)建并緩存,所以才會(huì)有上面的奇怪的行為。這是個(gè)很常見但很容易被忽略的一個(gè)坑。解決方案是始終使用equality(==)運(yùn)算符而不是 identity(is)運(yùn)算符比較值。

Python還保留對(duì)常用字符串的引用,并且可以在比較is字符串的身份(即使用)時(shí)產(chǎn)生類似的混淆行為。

>>> 'python' is 'py' + 'thon'
True

python字符串被緩存了,所有python字符串都是該對(duì)象的引用,對(duì)于不常見的字符串,即使字符串相等,比較身份也會(huì)失敗。

>>> 'this is not a common string' is 'this is not' + ' a common string'
False
>>> 'this is not a common string' == 'this is not' + ' a common string'
True

所以,就像整數(shù)規(guī)則一樣,總是使用equal(==)運(yùn)算符而不是 identity(is)運(yùn)算符比較字符串值。
列表推導(dǎo)和循環(huán)中的變量泄漏

有個(gè)例子:

  i = 0
  a = [i for i in range(3)]
  print(i) # Outputs 2

python2中列表推導(dǎo)改變了i變量的值,而python3修復(fù)了這個(gè)問題:

  i = 0
  a = [i for i in range(3)]
  print(i) # Outputs 0

類似地,for循環(huán)對(duì)于它們的迭代變量沒有私有的作用域

  i = 0
  for i in range(3):
    pass
  print(i) # Outputs 2

這種行為發(fā)生在Python 2和Python 3中。

為了避免泄漏變量的問題,請(qǐng)?jiān)诹斜硗茖?dǎo)和for循環(huán)中使用新的變量。

or操作符

例如

if a == 3 or b == 3 or c == 3:

這個(gè)很簡單,但是,再看一個(gè):

if a or b or c == 3: # Wrong

這是由于or的優(yōu)先級(jí)低于==,所以表達(dá)式將被評(píng)估為if (a) or (b) or (c == 3):。正確的方法是明確檢查所有條件:

if a == 3 or b == 3 or c == 3: # Right Way

或者,可以使用內(nèi)置函數(shù)any()代替鏈接or運(yùn)算符:

if any([a == 3, b == 3, c == 3]): # Right

或者,為了使其更有效率:

if any(x == 3 for x in (a, b, c)): # Right

更加簡短的寫法:

if 3 in (a, b, c): # Right

以上是“Python中深不見底的坑有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

文章名稱:Python中深不見底的坑有哪些-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://aaarwkj.com/article42/cojchc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、網(wǎng)站營銷、外貿(mào)建站、標(biāo)簽優(yōu)化營銷型網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
日本一级a级黄免视频| 日本一区二区免费高清不卡| 日韩精品一区二区三区四区在线视频| 日韩精品一区中文字幕在线| 一区二区三区亚洲精品在线| 在线日韩观看免费av| 97视频在线观看免费| 浮力草草日韩欧美三级| 未满十八周岁禁看视频| 女同欲望一区二区三区久久| 亚洲黄色暴力一区视频| 久久亚洲精品中文字幕一 | 国产成人精品视频午夜蜜蜂| 亚洲中少妇久久中文字幕| 日韩一区二区三区四区精品| 午夜激情在线观看国产| 久久精品国产亚洲av麻豆网站| 黄色片一区二区三区四区| 国产剧情av专业在线观看| 国产一区二区黄色在线| 欧美aⅴ一区二区三区| 亚洲天堂欧美天堂淫人天堂| 一区二区久久精品视频| 欧美日韩另类中文字幕| 一区二区三区国产激情| 日本福利写真在线观看| 国产成人亚洲欧美激情| 91午夜精品亚洲一区二区三区| 美女在线观看av少妇| 在线免费观看国产黄色av| 91伊人激情综合久久| 中文国产人精品久久蜜桃| 亚洲av污精品一区二区三区| 在线观看免费在线观看免费 | 韩国福利短片在线观看| 欧美一区二区三区四区久久| 日本写真视频一区二区三区| 国产aaa级日本一区二区三区 | 国产极品美女高潮抽搐| 粉嫩极品美女国产精品| 四虎在线观看精品一区|