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

Python中切片怎么用-創(chuàng)新互聯(lián)

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

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

切片(slice)就是一種截取索引片段的技術(shù),借助切片技術(shù),我們可以十分靈活地處理序列類型的對象。通常來說,切片的作用就是截取序列對象,然而,對于非序列對象,我們是否有辦法做到切片操作呢?在使用切片的過程中,有什么要點(diǎn)值得重視,又有什么底層原理值得關(guān)注呢?

1、切片的基礎(chǔ)用法

列表是 Python 中極為基礎(chǔ)且重要的一種數(shù)據(jù)結(jié)構(gòu),也是最能發(fā)揮切片的用處的一種數(shù)據(jù)結(jié)構(gòu),所以在前兩節(jié),我將以列表為例介紹切片的一些常見用法。

首先是切片的書寫形式:[i : i+n : m] ;其中,i 是切片的起始索引值,為列表首位時(shí)可省略;i+n 是切片的結(jié)束位置,為列表末位時(shí)可省略;m 可以不提供,默認(rèn)值是1,不允許為0 ,當(dāng)m為負(fù)數(shù)時(shí),列表翻轉(zhuǎn)。注意:這些值都可以大于列表長度,不會(huì)報(bào)越界。

切片的基本含義是:從序列的第i位索引起,向右取到后n位元素為止,按m間隔過濾 。

li = [1, 4, 5, 6, 7, 9, 11, 14, 16]

# 以下寫法都可以表示整個(gè)列表,其中 X >= len(li)
li[0:X] == li[0:] == li[:X] == li[:] 
== li[::] == li[-X:X] == li[-X:]

li[1:5] == [4,5,6,7] # 從1起,取5-1位元素
li[1:5:2] == [4,6] # 從1起,取5-1位元素,按2間隔過濾
li[-1:] == [16] # 取倒數(shù)第一個(gè)元素
li[-4:-2] == [9, 11] # 從倒數(shù)第四起,取-2-(-4)=2位元素
li[:-2] == li[-len(li):-2] 
== [1,4,5,6,7,9,11] # 從頭開始,取-2-(-len(li))=7位元素

# 步長為負(fù)數(shù)時(shí),列表先翻轉(zhuǎn),再截取
li[::-1] == [16,14,11,9,7,6,5,4,1] # 翻轉(zhuǎn)整個(gè)列表
li[::-2] == [16,11,7,5,1] # 翻轉(zhuǎn)整個(gè)列表,再按2間隔過濾
li[:-5:-1] == [16,14,11,9] # 翻轉(zhuǎn)整個(gè)列表,取-5-(-len(li))=4位元素
li[:-5:-3] == [16,9] # 翻轉(zhuǎn)整個(gè)列表,取-5-(-len(li))=4位元素,再按3間隔過濾

# 切片的步長不可以為0
li[::0] # 報(bào)錯(cuò)(ValueError: slice step cannot be zero)

上述的某些例子對于初學(xué)者(甚至很多老手)來說,可能還不好理解,但是它們都離不開切片的基本語法,所以為方便起見,我將它們也歸入基礎(chǔ)用法中。

對于這些樣例,我個(gè)人總結(jié)出兩條經(jīng)驗(yàn):

(1)牢牢記住公式[i : i+n : m],當(dāng)出現(xiàn)缺省值時(shí),通過想象把公式補(bǔ)全;

(2)索引為負(fù)且步長為正時(shí),按倒數(shù)計(jì)算索引位置;索引為負(fù)且步長為負(fù)時(shí),先翻轉(zhuǎn)列表,再按倒數(shù)計(jì)算索引位置。

2、切片的高級(jí)用法

一般而言,切片操作的返回結(jié)果是一個(gè)新的獨(dú)立的序列。以列表為例,列表切片后得到的還是一個(gè)列表,占用新的內(nèi)存地址。

當(dāng)取出切片的結(jié)果時(shí),它是一個(gè)獨(dú)立對象,因此,可以將其用于賦值操作,也可以用于其它傳遞值的場景。但是,切片只是淺拷貝 ,它拷貝的是原列表中元素的引用,所以,當(dāng)存在變長對象的元素時(shí),新列表將受制于原列表。

li = [1, 2, 3, 4]
ls = li[::]

li == ls # True
id(li) == id(ls) # False
li.append(li[2:4]) # [1, 2, 3, 4, [3, 4]]
ls.extend(ls[2:4]) # [1, 2, 3, 4, 3, 4]

# 下例等價(jià)于判斷l(xiāng)i長度是否大于8
if(li[8:]):
  print("not empty")
else:
  print("empty")

# 切片列表受制于原列表
lo = [1,[1,1],2,3]
lp = lo[:2] # [1, [1, 1]]
lo[1].append(1) # [1, [1, 1, 1], 2, 3]
lp # [1, [1, 1, 1]]

由于可見,將切片結(jié)果取出,它可以作為獨(dú)立對象使用,但是也要注意,是否取出了變長對象的元素。

切片既可以作為獨(dú)立對象被“取出”原序列,也可以留在原序列,作為一種占位符使用。

不久前,我介紹了幾種拼接字符串的方法(鏈接見文末),其中三種格式化類的拼接方法(即 %、format()、template)就是使用了占位符的思想。對于列表來說,使用切片作為占位符,同樣能夠?qū)崿F(xiàn)拼接列表的效果。特別需要注意的是,給切片賦值的必須是可迭代對象。

li = [1, 2, 3, 4]

# 在頭部拼接
li[:0] = [0] # [0, 1, 2, 3, 4]
# 在末尾拼接
li[len(li):] = [5,7] # [0, 1, 2, 3, 4, 5, 7]
# 在中部拼接
li[6:6] = [6] # [0, 1, 2, 3, 4, 5, 6, 7]

# 給切片賦值的必須是可迭代對象
li[-1:-1] = 6 # (報(bào)錯(cuò),TypeError: can only assign an iterable)
li[:0] = (9,) # [9, 0, 1, 2, 3, 4, 5, 6, 7]
li[:0] = range(3) # [0, 1, 2, 9, 0, 1, 2, 3, 4, 5, 6, 7]

上述例子中,若將切片作為獨(dú)立對象取出,那你會(huì)發(fā)現(xiàn)它們都是空列表,即 li[:0]==li[len(li):]==li[6:6]==[] ,我將這種占位符稱為“純占位符”,對純占位符賦值,并不會(huì)破壞原有的元素,只會(huì)在特定的索引位置中拼接進(jìn)新的元素。刪除純占位符時(shí),也不會(huì)影響列表中的元素。

與“純占位符”相對應(yīng),“非純占位符”的切片是非空列表,對它進(jìn)行操作(賦值與刪除),將會(huì)影響原始列表。如果說純占位符可以實(shí)現(xiàn)列表的拼接,那么,非純占位符可以實(shí)現(xiàn)列表的替換。

li = [1, 2, 3, 4]

# 不同位置的替換
li[:3] = [7,8,9] # [7, 8, 9, 4]
li[3:] = [5,6,7] # [7, 8, 9, 5, 6, 7]
li[2:4] = ['a','b'] # [7, 8, 'a', 'b', 6, 7]

# 非等長替換
li[2:4] = [1,2,3,4] # [7, 8, 1, 2, 3, 4, 6, 7]
li[2:6] = ['a'] # [7, 8, 'a', 6, 7]

# 刪除元素
del li[2:3] # [7, 8, 6, 7]

切片占位符可以帶步長,從而實(shí)現(xiàn)連續(xù)跨越性的替換或刪除效果。需要注意的是,這種用法只支持等長替換。

li = [1, 2, 3, 4, 5, 6]

li[::2] = ['a','b','c'] # ['a', 2, 'b', 4, 'c', 6]
li[::2] = [0]*3 # [0, 2, 0, 4, 0, 6]
li[::2] = ['w'] # 報(bào)錯(cuò),attempt to assign sequence of size 1 to extended slice of size 3

del li[::2] # [2, 4, 6]

3、自定義對象實(shí)現(xiàn)切片功能

切片是 Python 中最迷人最強(qiáng)大最 Amazing 的語言特性(幾乎沒有之一),以上兩小節(jié)雖然介紹了切片的基礎(chǔ)用法與高級(jí)用法,但這些還不足以充分地展露切片的魅力,所以,在接下來的兩章節(jié)中,我們將聚焦于它的更高級(jí)用法。

前兩節(jié)內(nèi)容都是基于原生的序列類型(如字符串、列表、元組……),那么,我們是否可以定義自己的序列類型并讓它支持切片語法呢?更進(jìn)一步,我們是否可以自定義其它對象(如字典)并讓它支持切片呢?

3.1、魔術(shù)方法:`getitem()`

想要使自定義對象支持切片語法并不難,只需要在定義類的時(shí)候給它實(shí)現(xiàn)魔術(shù)方法 __getitem__() 即可。所以,這里就先介紹一下這個(gè)方法。

語法:object.__getitem__(self, key)

官方文檔釋義:Called to implement evaluation of self[key]. For sequence types, the accepted keys should be integers and slice objects. Note that the special interpretation of negative indexes (if the class wishes to emulate a sequence type) is up to the __getitem__() method. If key is of an inappropriate type, TypeError may be raised; if of a value outside the set of indexes for the sequence (after any special interpretation of negative values), IndexError should be raised. For mapping types, if key is missing (not in the container), KeyError should be raised.

概括翻譯一下: __getitem__() 方法用于返回參數(shù) key 所對應(yīng)的值,這個(gè) key 可以是整型數(shù)值和切片對象,并且支持負(fù)數(shù)索引;如果 key 不是以上兩種類型,就會(huì)拋 TypeError;如果索引越界,會(huì)拋 IndexError ;如果定義的是映射類型,當(dāng) key 參數(shù)不是其對象的鍵值時(shí),則會(huì)拋 KeyError 。

3.2、自定義序列實(shí)現(xiàn)切片功能

接下來,我們定義一個(gè)簡單的 MyList ,并給它加上切片功能。(PS:僅作演示,不保證其它功能的完備性)。

import numbers

class MyList():
  def __init__(self, anylist):
    self.data = anylist
  def __len__(self):
    return len(self.data)
  def __getitem__(self, index):
    print("key is : " + str(index))
    cls = type(self)
    if isinstance(index, slice):
      print("data is : " + str(self.data[index]))
      return cls(self.data[index])
    elif isinstance(index, numbers.Integral):
      return self.data[index]
    else:
      msg = "{cls.__name__} indices must be integers"
      raise TypeError(msg.format(cls=cls))

l = MyList(["My", "name", "is", "Python貓"])

### 輸出結(jié)果:
key is : 3
Python貓
key is : slice(None, 2, None)
data is : ['My', 'name']
<__main__.MyList object at 0x0000019CD83A7A90>
key is : hi
Traceback (most recent call last):
...
TypeError: MyList indices must be integers or slices

從輸出結(jié)果來看,自定義的 MyList 既支持按索引查找,也支持切片操作,這正是我們的目的。

3.3、自定義字典實(shí)現(xiàn)切片功能

切片是序列類型的特性,所以在上例中,我們不需要寫切片的具體實(shí)現(xiàn)邏輯。但是,對于其它非序列類型的自定義對象,就得自己實(shí)現(xiàn)切片邏輯。以自定義字典為例(PS:僅作演示,不保證其它功能的完備性):

class MyDict():
  def __init__(self):
    self.data = {}
  def __len__(self):
    return len(self.data)
  def append(self, item):
    self.data[len(self)] = item
  def __getitem__(self, key):
    if isinstance(key, int):
      return self.data[key]
    if isinstance(key, slice):
      slicedkeys = list(self.data.keys())[key]
      return {k: self.data[k] for k in slicedkeys}
    else:
      raise TypeError

d = MyDict()
d.append("My")
d.append("name")
d.append("is")
d.append("Python貓")
print(d[2])
print(d[:2])
print(d[-4:-2])
print(d['hi'])

### 輸出結(jié)果:
is
{0: 'My', 1: 'name'}
{0: 'My', 1: 'name'}
Traceback (most recent call last):
...
TypeError

上例的關(guān)鍵點(diǎn)在于將字典的鍵值取出,并對鍵值的列表做切片處理,其妙處在于,不用擔(dān)心索引越界和負(fù)數(shù)索引,將字典切片轉(zhuǎn)換成了字典鍵值的切片,最終實(shí)現(xiàn)目的。

4、迭代器實(shí)現(xiàn)切片功能

好了,介紹完一般的自定義對象如何實(shí)現(xiàn)切片功能,這里將迎來另一類非同一般的對象。

迭代器是 Python 中獨(dú)特的一種高級(jí)對象,它本身不具備切片功能,然而若能將它用于切片,這便仿佛是錦上添花,能達(dá)到如虎添翼的效果。所以,本節(jié)將隆重地介紹迭代器如何實(shí)現(xiàn)切片功能。

4.1、迭代與迭代器

首先,有幾個(gè)基本概念要澄清:迭代、可迭代對象、迭代器。

迭代 是一種遍歷容器類型對象(例如字符串、列表、字典等等)的方式,例如,我們說迭代一個(gè)字符串“abc”,指的就是從左往右依次地、逐個(gè)地取出它的全部字符的過程。(PS:漢語中迭代一詞有循環(huán)反復(fù)、層層遞進(jìn)的意思,但 Python 中此詞要理解成單向水平線性的,如果你不熟悉它,我建議直接將其理解為遍歷。)

那么,怎么寫出迭代操作的指令呢?最通用的書寫語法就是 for 循環(huán)。

# for循環(huán)實(shí)現(xiàn)迭代過程
for char in "abc":
  print(char, end=" ")
# 輸出結(jié)果:a b c

for 循環(huán)可以實(shí)現(xiàn)迭代的過程,但是,并非所有對象都可以用于 for 循環(huán),例如,上例中若將字符串“abc”換成任意整型數(shù)字,則會(huì)報(bào)錯(cuò): 'int' object is not iterable .

這句報(bào)錯(cuò)中的單詞“iterable”指的是“可迭代的”,即 int 類型不是可迭代的。而字符串(string)類型是可迭代的,同樣地,列表、元組、字典等類型,都是可迭代的。

那怎么判斷一個(gè)對象是否可迭代呢?為什么它們是可迭代的呢?怎么讓一個(gè)對象可迭代呢?

要使一個(gè)對象可迭代,就要實(shí)現(xiàn)可迭代協(xié)議,即需要實(shí)現(xiàn)__iter__() 魔術(shù)方法,換言之,只要實(shí)現(xiàn)了這個(gè)魔術(shù)方法的對象都是可迭代對象。

那怎么判斷一個(gè)對象是否實(shí)現(xiàn)了這個(gè)方法呢?除了上述的 for 循環(huán)外,我還知道四種方法:

# 方法1:dir()查看__iter__
dir(2)   # 沒有,略
dir("abc") # 有,略

# 方法2:isinstance()判斷
import collections
isinstance(2, collections.Iterable)   # False
isinstance("abc", collections.Iterable) # True

# 方法3:hasattr()判斷
hasattr(2,"__iter__")   # False
hasattr("abc","__iter__") # True

# 方法4:用iter()查看是否報(bào)錯(cuò)
iter(2)   # 報(bào)錯(cuò):'int' object is not iterable
iter("abc") # <str_iterator at 0x1e2396d8f28>

### PS:判斷是否可迭代,還可以查看是否實(shí)現(xiàn)__getitem__,為方便描述,本文從略。

這幾種方法中最值得一提的是 iter() 方法,它是 Python 的內(nèi)置方法,其作用是將可迭代對象變成迭代器 。這句話可以解析出兩層意思:(1)可迭代對象跟迭代器是兩種東西;(2)可迭代對象能變成迭代器。

實(shí)際上,迭代器必然是可迭代對象,但可迭代對象不一定是迭代器。兩者有多大的區(qū)別呢?

Python中切片怎么用

如上圖藍(lán)圈所示,普通可迭代對象與迭代器的最關(guān)鍵區(qū)別可概括為:一同兩不同 ,所謂“一同”,即兩者都是可迭代的(__iter__),所謂“兩不同”,即可迭代對象在轉(zhuǎn)化為迭代器后,它會(huì)丟失一些屬性(__getitem__),同時(shí)也增加一些屬性(__next__)。

首先看看增加的屬性 __next__ , 它是迭代器之所以是迭代器的關(guān)鍵,事實(shí)上,我們正是把同時(shí)實(shí)現(xiàn)了 __iter__ 方法 和 __next__ 方法的對象定義為迭代器的。

有了多出來的這個(gè)屬性,可迭代對象不需要借助外部的 for 循環(huán)語法,就能實(shí)現(xiàn)自我的迭代/遍歷過程。我發(fā)明了兩個(gè)概念來描述這兩種遍歷過程(PS:為了易理解,這里稱遍歷,實(shí)際也可稱為迭代):它遍歷 指的是通過外部語法而實(shí)現(xiàn)的遍歷,自遍歷 指的是通過自身方法實(shí)現(xiàn)的遍歷。

借助這兩個(gè)概念,我們說,可迭代對象就是能被“它遍歷”的對象,而迭代器是在此基礎(chǔ)上,還能做到“自遍歷”的對象。

ob1 = "abc"
ob2 = iter("abc")
ob3 = iter("abc")

# ob1它遍歷
for i in ob1:
  print(i, end = " ")  # a b c
for i in ob1:
  print(i, end = " ")  # a b c
# ob1自遍歷
ob1.__next__() # 報(bào)錯(cuò): 'str' object has no attribute '__next__'

# ob2它遍歷
for i in ob2:
  print(i, end = " ")  # a b c  
for i in ob2:
  print(i, end = " ")  # 無輸出
# ob2自遍歷
ob2.__next__() # 報(bào)錯(cuò):StopIteration

# ob3自遍歷
ob3.__next__() # a
ob3.__next__() # b
ob3.__next__() # c
ob3.__next__() # 報(bào)錯(cuò):StopIteration

通過上述例子可看出,迭代器的優(yōu)勢在于支持自遍歷,同時(shí),它的特點(diǎn)是單向非循環(huán)的,一旦完成遍歷,再次調(diào)用就會(huì)報(bào)錯(cuò)。

對此,我想到一個(gè)比方:普通可迭代對象就像是子彈匣,它遍歷就是取出子彈,在完成操作后又裝回去,所以可以反復(fù)遍歷(即多次調(diào)用for循環(huán),返回相同結(jié)果);而迭代器就像是裝載了子彈匣且不可拆卸的槍,進(jìn)行它遍歷或者自遍歷都是發(fā)射子彈,這是消耗性的遍歷,是無法復(fù)用的(即遍歷會(huì)有盡頭)。

寫了這么多,稍微小結(jié)一下:迭代是一種遍歷元素的方式,按照實(shí)現(xiàn)方式劃分,有外部迭代與內(nèi)部迭代兩種,支持外部迭代(它遍歷)的對象就是可迭代對象,而同時(shí)還支持內(nèi)部迭代(自遍歷)的對象就是迭代器;按照消費(fèi)方式劃分,可分為復(fù)用型迭代與一次性迭代,普通可迭代對象是復(fù)用型的,而迭代器是一次性的。

4.2、迭代器切片

前面提到了“一同兩不同”,最后的不同是,普通可迭代對象在轉(zhuǎn)化成迭代器的過程中會(huì)丟失一些屬性,其中關(guān)鍵的屬性是 __getitem__ 。在前一節(jié)中,我已經(jīng)介紹了這個(gè)魔術(shù)方法,并用它實(shí)現(xiàn)了自定義對象的切片特性。

那么問題來了:為啥迭代器不繼承這個(gè)屬性呢?

首先,迭代器使用的是消耗型的遍歷,這意味著它充滿不確定性,即其長度與索引鍵值對是動(dòng)態(tài)衰減的,所以很難 get 到它的 item ,也就不再需要 __getitem__ 屬性了。其次,若強(qiáng)行給迭代器加上這個(gè)屬性,這并不合理,正所謂強(qiáng)扭的瓜不甜……

由此,新的問題來了:既然會(huì)丟失這么重要的屬性(還包括其它未標(biāo)識(shí)的屬性),為什么還要使用迭代器呢?

這個(gè)問題的答案在于,迭代器擁有不可替代的強(qiáng)大的有用的功能,使得 Python 要如此設(shè)計(jì)它。限于篇幅,此處不再展開,后續(xù)我會(huì)專門填坑此話題。

還沒完,死纏爛打的問題來了:能否令迭代器擁有這個(gè)屬性呢,即令迭代器繼續(xù)支持切片呢?

hi = "歡迎關(guān)注公眾號(hào):Python貓"
it = iter(hi)

# 普通切片
hi[-7:] # Python貓

# 反例:迭代器切片
it[-7:] # 報(bào)錯(cuò):'str_iterator' object is not subscriptable

迭代器因?yàn)槿鄙賍_getitem__ ,因此不能使用普通的切片語法。想要實(shí)現(xiàn)切片,無非兩種思路:一是自己造輪子,寫實(shí)現(xiàn)的邏輯;二是找到封裝好的輪子。

Python 的 itertools 模塊就是我們要找的輪子,用它提供的方法可輕松實(shí)現(xiàn)迭代器切片。

import itertools

# 例1:簡易迭代器
s = iter("123456789")
for x in itertools.islice(s, 2, 6):
  print(x, end = " ")  # 輸出:3 4 5 6
for x in itertools.islice(s, 2, 6):
  print(x, end = " ")  # 輸出:9

# 例2:斐波那契數(shù)列迭代器
class Fib():
  def __init__(self):
    self.a, self.b = 1, 1

  def __iter__(self):
    while True:
      yield self.a
      self.a, self.b = self.b, self.a + self.b
f = iter(Fib())
for x in itertools.islice(f, 2, 6):
  print(x, end = " ") # 輸出:2 3 5 8
for x in itertools.islice(f, 2, 6):
  print(x, end = " ") # 輸出:34 55 89 144

itertools 模塊的 islice() 方法將迭代器與切片完美結(jié)合,終于回答了前面的問題。然而,迭代器切片跟普通切片相比,前者有很多局限性。首先,這個(gè)方法不是“純函數(shù)”(純函數(shù)需遵守“相同輸入得到相同輸出”的原則);其次,它只支持正向切片,且不支持負(fù)數(shù)索引,這都是由迭代器的損耗性所決定的。

那么,我不禁要問:itertools 模塊的切片方法用了什么實(shí)現(xiàn)邏輯呢?下方是官網(wǎng)提供的源碼:

def islice(iterable, *args):
  # islice('ABCDEFG', 2) --> A B
  # islice('ABCDEFG', 2, 4) --> C D
  # islice('ABCDEFG', 2, None) --> C D E F G
  # islice('ABCDEFG', 0, None, 2) --> A C E G
  s = slice(*args)
  # 索引區(qū)間是[0,sys.maxsize],默認(rèn)步長是1
  start, stop, step = s.start or 0, s.stop or sys.maxsize, s.step or 1
  it = iter(range(start, stop, step))
  try:
    nexti = next(it)
  except StopIteration:
    # Consume *iterable* up to the *start* position.
    for i, element in zip(range(start), iterable):
      pass
    return
  try:
    for i, element in enumerate(iterable):
      if i == nexti:
        yield element
        nexti = next(it)
  except StopIteration:
    # Consume to *stop*.
    for i, element in zip(range(i + 1, stop), iterable):
      pass

islice() 方法的索引方向是受限的,但它也提供了一種可能性:即允許你對一個(gè)無窮的(在系統(tǒng)支持范圍內(nèi))迭代器進(jìn)行切片的能力。這是迭代器切片最具想象力的用途場景。

除此之外,迭代器切片還有一個(gè)很實(shí)在的應(yīng)用場景:讀取文件對象中給定行數(shù)范圍的數(shù)據(jù)。

我們知道,從文件中讀取內(nèi)容主要有兩種方法(參見之前關(guān)于文件讀寫的文章):read() 適合讀取內(nèi)容較少的情況,或者是需要一次性處理全部內(nèi)容的情況;而 readlines() 適用性更廣,因?yàn)樗堑刈x取內(nèi)容,既減少內(nèi)存壓力,又方便逐行對數(shù)據(jù)處理。

雖然 readlines() 有迭代讀取的優(yōu)勢,但它是從頭到尾逐行讀取,若文件有幾千行,而我們只想要讀取少數(shù)特定行(例如第1000-1009行),那它還是效率太低了??紤]到文件對象天然就是迭代器 ,我們可以使用迭代器切片先行截取,然后再處理,如此效率將大大地提升。

# test.txt 文件內(nèi)容
'''
貓
Python貓
python is a cat.
this is the end.
'''

from itertools import islice
with open('test.txt','r',encoding='utf-8') as f:
  print(hasattr(f, "__next__")) # 判斷是否迭代器
  content = islice(f, 2, 4)
  for line in content:
    print(line.strip())

### 輸出結(jié)果:
True
python is a cat.
this is the end.

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

分享標(biāo)題:Python中切片怎么用-創(chuàng)新互聯(lián)
文章源于:http://aaarwkj.com/article4/pgpie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、面包屑導(dǎo)航定制網(wǎng)站、網(wǎng)站營銷關(guān)鍵詞優(yōu)化、網(wǎng)站收錄

廣告

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

手機(jī)網(wǎng)站建設(shè)
欧美日韩另类综合91| 精品人妻一区二区av| 五十路六十路美熟人妻| 亚洲天堂精品日韩电影| 日韩一区二区三区成人| 日韩毛片免费看美日韩毛片| 日韩欧美亚洲综合另类| 久久精品免费激情视频| 三级视频一区二区三区| 黑人一区二区三区在线| 91国内精品手机在线高清| 亚州无吗一区二区三区| 亚洲成年人黄色小说网站| 高清日韩精品视频在线观看| 手机在线观看av大片| 日韩精品中文女同在线播放| 高清免费在线自偷自拍| 国产精品午夜福利亚洲综合网 | 亚洲午夜激情视频在线| 日韩在线国产亚洲精品| 成人一区二区三区播放| 人妻av天堂综合一区| 91欧美日韩在线观看视频| 国产av剧情精品亚洲| 亚洲视频在线男人天堂| 国产91黑丝视频在线观看| 午夜男女激情在线观看| 日本一区二区三区高清不卡| 国产精品乱码中文字幕| 日本一区二区三区日韩欧美| 一区二区三区免费视频少妇| 黄片在线免费观看欧美中文| 国产在线成年人免费观看| 日韩欧美亚洲自拍另类| 欧洲一区二区在线激情| 欧美女人又粗又长亚洲| 日韩无砖区2021不卡| av剧情在线观看免费| 亚洲熟女熟妇另类中文| 亚洲欧美日韩之国产综合| 亚洲一区二区三区免费在线看 |