<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          10個(gè)你必須知道的Python內(nèi)置函數(shù)

          共 6365字,需瀏覽 13分鐘

           ·

          2021-09-19 15:25

          1. reduce()

          reduce() 是 functools 模塊下面的一個(gè)函數(shù),接收兩個(gè)參數(shù),一個(gè)是函數(shù)對(duì)象,一個(gè)是可迭代對(duì)象(比如list), reduce每次會(huì)把迭代對(duì)象中的下一個(gè)元素作用在函數(shù)上做累積計(jì)算,最后得到一個(gè)值。

          來(lái)看個(gè)例子你就明白

          # 創(chuàng)建函數(shù)
          def add(a, b):
              result = a + b
              print(f"{a} +  = {result}")
              return result


          from functools import reduce

          result = reduce(add, [1234])
          print("結(jié)果:", result)

          輸出

          1 + 2 = 3
          3 + 3 = 6
          6 + 4 = 10
          結(jié)果: 10

          執(zhí)行過(guò)程:第一次將列表中的前兩個(gè)數(shù)取出來(lái)作為函數(shù)add的參數(shù),第二次將上一次函數(shù)add的返回值與列表的第3個(gè)數(shù)作為參數(shù),依此類推,最后得到一個(gè)值。這就是reduce的作用。有點(diǎn)像萬(wàn)物歸一的感覺(jué)。

          當(dāng)然,如果只是計(jì)算列表中的元素之和,大可不必繞這么大彎子用reduce來(lái)處理,直接用 sum 函數(shù)就可以解決。

          result = sum([1234])

          如果是計(jì)算列表中元素的乘積,python并沒(méi)有內(nèi)置的函數(shù)直接計(jì)算,這時(shí)候我們可以借用reduce來(lái)處理

          def mul(a, b):
              return a * b

          result = reduce(mul, [1234])
          print("結(jié)果:", result)

          輸出

          結(jié)果: 24

          或者使用 lambda 匿名函數(shù)

          result = reduce(lambda a, b: a * b, [1234])

          甚至可以直接使用operator模塊下的乘法操作符函數(shù)

          from operator import mul
          result = reduce(mul, [1234])
          print("結(jié)果:", result)

          最后你會(huì)發(fā)現(xiàn)解法其實(shí)很多種,不過(guò)我們應(yīng)該記住python之禪里面那句話:

          There should be one-- and preferably only one --obvious way to do it.

          用最合適的方式去做一件事

          2. split()

          split 接收一個(gè)參數(shù),用于將字符串切割成列表,比如一段英文字符串按照空格切割就可以統(tǒng)計(jì)出單詞的個(gè)數(shù),

          words = "python is the best programming language"
          words = words.split(" ")
          print(words)

          輸出

          ['column1''column2''column3']

          3. enumerate()

          enumerate 函數(shù)用于迭代列表等可迭代對(duì)象,它的使用場(chǎng)景一般出現(xiàn)在你需要獲取列表的下標(biāo)位置時(shí),我們知道直接用for循環(huán)去迭代列表時(shí),是拿不到元素下標(biāo)位置的,而 enumerate 就可以獲取,否則你還得自己去定義一個(gè)索引變量。

          words = ['python''is''the''best''programming''language']
          index = 0
          for w in words:
              print(index, w)
              index += 1
          0 python
          1 is
          2 the
          3 best
          4 programming
          5 language

          使用 enumerate 函數(shù),處理起來(lái)就更優(yōu)雅了

          for index, w in enumerate(words):
              print(index, w)
          0 python
          1 is
          2 the
          3 best
          4 programming
          5 language

          4. map()

          map是一個(gè)與reduce函數(shù)對(duì)應(yīng)的函數(shù),Google的map/reduce框架的思想其實(shí)就是從這兩個(gè)函數(shù)借鑒而來(lái)的。map函數(shù)用于把一個(gè)列表通過(guò)函數(shù)處理,映射成一個(gè)新的列表。例如給列表的每個(gè)元素做平方,將列表元素轉(zhuǎn)換成字符串,得到一個(gè)新的列表。

          result = map(lambda x: str(x), [1234])
          print(list(result))
          result = map(lambda x: x * x, [1234]))
          print(list(result))

          輸出:

          ['1''2''3''4']
          [14916]

          此外,map 函數(shù)還可以接受多個(gè)列表參數(shù),使得多個(gè)列表合并為一個(gè)列表成為可能,例如,將兩個(gè)列表相同位置的元素相加得到一個(gè)新的列表

          def merge(x, y):
              return x + y


          result = map(merge, [123], [321])
          print(list(result))

          輸出

          [444]

          5. getattr()

          getattr() 返回對(duì)象屬性對(duì)應(yīng)的值,接受兩個(gè)參數(shù),第一個(gè)是對(duì)象,第二個(gè)是屬性名,這個(gè)函數(shù)通常用戶動(dòng)態(tài)或者某個(gè)對(duì)象下面的某些屬性的值,看例子:

          class Foo:
              def __init__(self):
                  self.a = 10


          foo = Foo()

          a = getattr(foo, "a")
          print(a)

          輸出

          10

          你可能會(huì)問(wèn),我直接 foo.a 不就可以獲取a屬性的值了嗎?正常情況是這樣沒(méi)錯(cuò),如果是你在不知道什么情況下要獲取什么屬性的值時(shí),這時(shí)候getattr就可以派上用場(chǎng)了。初學(xué)者可能還體驗(yàn)不到,當(dāng)你嘗試去寫(xiě)些框架級(jí)的代碼時(shí),你要想起來(lái)有這樣的函數(shù)可以使用就行。

          6. slice

          slice 是一個(gè)切片函數(shù),切片操作你可能使用過(guò),通過(guò)切片來(lái)獲取列表的子集, 例如:

          s = [1,2,3,4]
          >>> s[1:3]  # 獲取列表s中第1到第3之間的元素組成的子列表

          "1:3" 其就是 就是 slice(1:3) 函數(shù)的縮寫(xiě)方式,前者就像是語(yǔ)法糖

          s = [1234]
          print(s[slice(13)])

          通常實(shí)際應(yīng)用過(guò)程中,直接用語(yǔ)法糖的寫(xiě)法就可以,沒(méi)必要用slice函數(shù)進(jìn)行切片,但是你至少應(yīng)該知道slice是怎么用的。

          7. sorted()

          sorted 函數(shù)應(yīng)該日常代碼中,算是一個(gè)高頻函數(shù)了,用于將列表等可迭代對(duì)象進(jìn)行排序,它不會(huì)改變?cè)斜淼捻樞颍欠祷匾粋€(gè)新的列表。默認(rèn)按照升序排列

          nums = [45631]

          print(sorted(nums))

          輸出

          [13456]

          如果想要降序排列,則需要指定第二個(gè)參數(shù):reverse=True

          nums = [45631]
          print(sorted(nums, reverse=True))  # [6, 5, 4, 3, 1]

          sorted 函數(shù)的強(qiáng)大之處遠(yuǎn)不止如此,因?yàn)槟氵€可以自定義排序規(guī)則,比如參與比較是一個(gè)自定義的類Student, 我需要按照Student里面的年齡age進(jìn)行排序,這時(shí)候我們需要自定義排序因子函數(shù)

          def my_sort_key(s):
              return s.age


          class Student:
              def __init__(self, age):
                  self.age = age

              def __str__(self):
                  return f"Student({self.age})"


          s1 = Student(12)
          s2 = Student(2)
          s3 = Student(30)

          new_list = (sorted([s1, s2, s3], key=my_sort_key))
          for i in new_list:
              print(i)

          輸出:

          Student(2)
          Student(12)
          Student(30)

          8. format

          format 函數(shù)曾經(jīng)字符串格式化最常用的函數(shù),使用也是非常簡(jiǎn)單,但自從f字符串出現(xiàn)之后,format 的功能逐漸被取代,但是3.6之前還是可以常見(jiàn)到該函數(shù)的應(yīng)用場(chǎng)景。

          s = "{} is first name"
          print(s.format("liu"))

          如果需要占位符比較多搞不清次序的話,可以給每個(gè)占位符一個(gè)名字,這樣就不拍對(duì)不上位置了

          s = "{first_name} is first name"
          print(s.format(first_name="liu"))

          9. join()

          join 也是比較常用的一個(gè)內(nèi)置函數(shù),它可以將列表對(duì)象用指定的字符作為元素之間的連接,轉(zhuǎn)換為字符串。

          words = ['python''is''the''best''programming''language']

          print(" ".join(words)) # 用空格連接 python is the best programming language

          10. type

          type 我認(rèn)為是python最難理解的一個(gè)內(nèi)置函數(shù)了,新手可能以為type就是一個(gè)用來(lái)查看某個(gè)對(duì)象的類型是什么,例如:

          print(type(10)) # <class 'int'>
          print(type([])) # <class 'list'>
          print(type("s"))#  <class 'str'>

          它的另一個(gè)作用是可以用type來(lái)創(chuàng)建類,一般情況下,我們都用關(guān)鍵字 class 來(lái)定義一個(gè)類,而type也可以用來(lái)創(chuàng)建類

          >>> Person = type("Person", (), {"live":True})
          >>> Person
          <class '__main__.Person'>

          第一個(gè)參數(shù) Person是類的名字, 第二個(gè)參數(shù)用來(lái)指定父類是誰(shuí), 第三個(gè)參數(shù)是這個(gè)類的類屬性有哪些。上面這段代碼等價(jià)于:

          >>> class Person:
          ...     live = True
          ...
          >>> Person
          <class '__main__.Person'>

          創(chuàng)建Person這類的type函數(shù)其實(shí)是一個(gè)叫“元類”的東西。而關(guān)于元類甚至可以話一整篇文章來(lái)講解了,好在我在之前的文章中有介紹過(guò),感興趣的可以查看一下之前寫(xiě)的一篇叫什么是 Python 元類這篇文章。元類在寫(xiě)一些框架時(shí)用的較多,比如你去按sqlalchemy的源碼的時(shí)候,你會(huì)發(fā)現(xiàn)有大量使用元類的場(chǎng)景。


          - EOF -


          回復(fù)關(guān)鍵字“簡(jiǎn)明python ”,立即獲取入門必備書(shū)籍簡(jiǎn)明python教程》電子版

          回復(fù)關(guān)鍵字爬蟲(chóng)”,立即獲取爬蟲(chóng)學(xué)習(xí)資料

          點(diǎn)擊關(guān)注【python入門與進(jìn)階】,閱讀更多精彩內(nèi)容
          ??????

          推薦

          瀏覽 44
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  影音先锋AV色 | 免费成人一级片 | 国产777 | 国产无码免费高清 | 国产性爱精品 |