<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>

          Python常見(jiàn)編程基礎(chǔ)問(wèn)題總結(jié)

          共 6060字,需瀏覽 13分鐘

           ·

          2021-12-25 21:25

          Python global 語(yǔ)句的作用

          在編寫(xiě)程序的時(shí)候,如果想要**改變(重新賦值)**函數(shù)外部的變量,并且這個(gè)變量會(huì)作用于許多函數(shù)中,就需要告訴 Python 程序這個(gè)變量的作用域是全局變量,global 語(yǔ)句可以實(shí)現(xiàn)定義全局變量的作用。

          lambda 匿名函數(shù)好處

          精簡(jiǎn)代碼,lambda省去了定義函數(shù),map 省去了寫(xiě) for 循環(huán)過(guò)程:

          str_1?=?["中國(guó)",?"美國(guó)",?"法國(guó)",?"",?"",?"英國(guó)"]
          res?=?list(map(lambda?x:?"填充值"?if?x==""?else?x,?str_1))
          print(res)??#?['中國(guó)',?'美國(guó)',?'法國(guó)',?'填充值',?'填充值',?'英國(guó)']

          Python 錯(cuò)誤處理

          和其他高級(jí)語(yǔ)言一樣,Python 也內(nèi)置了一套try...except...finally... 的錯(cuò)誤處理機(jī)制。

          當(dāng)我們認(rèn)為某些代碼可能會(huì)出錯(cuò)時(shí),就可以用 try 來(lái)運(yùn)行這段代碼,如果執(zhí)行出錯(cuò),則后續(xù)代碼不會(huì)繼續(xù)執(zhí)行,而是直接跳轉(zhuǎn)至跳轉(zhuǎn)至錯(cuò)誤處理代碼,即 except 語(yǔ)句塊,執(zhí)行完 except 后,如果有 finally 語(yǔ)句塊,則執(zhí)行。至此,執(zhí)行完畢。跳轉(zhuǎn)至錯(cuò)誤處理代碼,

          Python 內(nèi)置錯(cuò)誤類(lèi)型

          • IOError:輸入輸出異常
          • AttributeError:試圖訪問(wèn)一個(gè)對(duì)象沒(méi)有的屬性
          • ImportError:無(wú)法引入模塊或包,基本是路徑問(wèn)題
          • IndentationError:語(yǔ)法錯(cuò)誤,代碼沒(méi)有正確的對(duì)齊
          • IndexError:下標(biāo)索引超出序列邊界
          • KeyError: 試圖訪問(wèn)你字典里不存在的鍵
          • SyntaxError: Python 代碼邏輯語(yǔ)法出錯(cuò),不能執(zhí)行
          • NameError: 使用一個(gè)還未賦予對(duì)象的變量

          簡(jiǎn)述 any() 和 all() 方法

          • any(): 只要迭代器中有一個(gè)元素為真就為真;
          • all(): 迭代器中所有的判斷項(xiàng)返回都是真,結(jié)果才為真.

          Python 中什么元素為假?

          答案:(0,空字符串,空列表、空字典、空元組、None, False)

          提高 Python 運(yùn)行效率的方法

          1. 使用生成器,因?yàn)榭梢怨?jié)約大量?jī)?nèi)存;
          2. 循環(huán)代碼優(yōu)化,避免過(guò)多重復(fù)代碼的執(zhí)行;
          3. 核心模塊用 Cython PyPy 等,提高效率;
          4. 多進(jìn)程、多線程、協(xié)程;
          5. 多個(gè) if elif 條件判斷,可以把最有可能先發(fā)生的條件放到前面寫(xiě),這樣可以減少程序判斷的次數(shù),提高效率。

          為什么 Python 不提供函數(shù)重載

          我們知道 函數(shù)重載 主要是為了解決兩個(gè)問(wèn)題。

          1. 可變參數(shù)類(lèi)型。
          2. 可變參數(shù)個(gè)數(shù)。

          另外,一個(gè)函數(shù)重載基本的設(shè)計(jì)原則是,僅僅當(dāng)兩個(gè)函數(shù)除了參數(shù)類(lèi)型和參數(shù)個(gè)數(shù)不同以外,其功能是完全相同的,此時(shí)才使用函數(shù)重載,如果兩個(gè)函數(shù)的功能其實(shí)不同,那么不應(yīng)當(dāng)使用重載,而應(yīng)當(dāng)使用一個(gè)名字不同的函數(shù)。

          1. 對(duì)于情況 1 ,函數(shù)功能相同,但是參數(shù)類(lèi)型不同,Python 如何處理?答案是根本不需要處理,因?yàn)?Python 可以接受任何類(lèi)型的參數(shù),如果函數(shù)的功能相同,那么不同的參數(shù)類(lèi)型在 Python 中很可能是相同的代碼,沒(méi)有必要做成兩個(gè)不同函數(shù)。
          2. 對(duì)于情況 2 ,函數(shù)功能相同,但參數(shù)個(gè)數(shù)不同,Python 如何處理?大家知道,答案就是缺省參數(shù)(默認(rèn)參數(shù))。對(duì)那些缺少的參數(shù)設(shè)定為缺省參數(shù)(默認(rèn)參數(shù))即可解決問(wèn)題。因?yàn)槟慵僭O(shè)函數(shù)功能相同,那么那些缺少的參數(shù)終歸是需要用的。所以,鑒于情況 1 跟 情況 2 都有了解決方案,Python 自然就不需要函數(shù)重載了。

          實(shí)例方法/靜態(tài)方法/類(lèi)方法

          Python 類(lèi)語(yǔ)法中有三種方法,實(shí)例方法,靜態(tài)方法,類(lèi)方法,它們的區(qū)別如下:

          • 實(shí)例方法只能被實(shí)例對(duì)象調(diào)用,靜態(tài)方法(由 @staticmethod 裝飾器來(lái)聲明)、類(lèi)方法(由 @classmethod 裝飾器來(lái)聲明),可以被類(lèi)或類(lèi)的實(shí)例對(duì)象調(diào)用;
          • 實(shí)例方法,第一個(gè)參數(shù)必須要默認(rèn)傳實(shí)例對(duì)象,一般習(xí)慣用self。靜態(tài)方法,參數(shù)沒(méi)有要求。類(lèi)方法,第一個(gè)參數(shù)必須要默認(rèn)傳類(lèi),一般習(xí)慣用 cls .

          實(shí)例代碼如下:

          class?Foo(object):
          ????"""類(lèi)三種方法語(yǔ)法形式
          ????"""

          ????def?instance_method(self):
          ????????print("是類(lèi){}的實(shí)例方法,只能被實(shí)例對(duì)象調(diào)用".format(Foo))

          ????@staticmethod
          ????def?static_method():
          ????????print("是靜態(tài)方法")

          ????@classmethod
          ????def?class_method(cls):
          ????????print("是類(lèi)方法")


          foo?=?Foo()
          foo.instance_method()
          foo.static_method()
          foo.class_method()
          print('##############')
          Foo.static_method()
          Foo.class_method()

          __new__和 __init __方法的區(qū)別

          • __init__ 方法并不是真正意義上的構(gòu)造函數(shù), __new__ 方法才是(類(lèi)的構(gòu)造函數(shù)是類(lèi)的一種特殊的成員函數(shù),它會(huì)在每次創(chuàng)建類(lèi)的新對(duì)象時(shí)執(zhí)行);
          • __new__ 方法用于創(chuàng)建對(duì)象并返回對(duì)象,當(dāng)返回對(duì)象時(shí)會(huì)自動(dòng)調(diào)用 __init__ 方法進(jìn)行初始化, __new__ 方法比 __init__ 方法更早執(zhí)行;
          • __new__ 方法是靜態(tài)方法,而 __init__實(shí)例方法。

          Python 的函數(shù)參數(shù)傳遞

          個(gè)人總結(jié)(有點(diǎn)不好):

          • 將可變對(duì)象:列表list、字典dict、NumPy數(shù)組ndarray和用戶(hù)定義的類(lèi)型(類(lèi)),作為參數(shù)傳遞給函數(shù),函數(shù)內(nèi)部將其改變后,函數(shù)外部這個(gè)變量也會(huì)改變(對(duì)變量進(jìn)行重新賦值除外 rebind the reference in the method
          • 將不可變對(duì)象:字符串string、元組tuple、數(shù)值numbers,作為參數(shù)傳遞給函數(shù),函數(shù)內(nèi)部將其改變后,函數(shù)外部這個(gè)變量不會(huì)改變

          Python 實(shí)現(xiàn)對(duì)函參做類(lèi)型檢查

          Python 自帶的函數(shù)一般都會(huì)有對(duì)函數(shù)參數(shù)類(lèi)型做檢查,自定義的函數(shù)參數(shù)類(lèi)型檢查可以用函數(shù) isinstance() 實(shí)現(xiàn),例如:

          def?my_abs(x):
          ????"""
          ????自定義的絕對(duì)值函數(shù)
          ????:param?x:?int?or?float
          ????:return:?positive?number,?int?or?float
          ????"""

          ????if?not?isinstance(x,?(int,?float)):
          ????????raise?TypeError('bad?operand?type')
          ????if?x?>?0:
          ????????return?x
          ????else:
          ????????return?-x

          添加了參數(shù)檢查后,如果傳入錯(cuò)誤的參數(shù)類(lèi)型,函數(shù)就可以?huà)伋鲆粋€(gè) TypeError 錯(cuò)誤。

          為什么說(shuō) Python 是動(dòng)態(tài)語(yǔ)言

          Python 中,等號(hào) = 是賦值語(yǔ)句,可以把任意數(shù)據(jù)類(lèi)型賦值給變量,同樣一個(gè)變量可以反復(fù)賦值,而且可以是不同類(lèi)型的變量,例如:

          a?=?100?#?a是int型變量
          print(a)
          a?=?'ABC'??#?a?是str型變量
          print(a)

          Pyhon 這種變量本身類(lèi)型不固定,可以反復(fù)賦值不同類(lèi)型的變量稱(chēng)為動(dòng)態(tài)語(yǔ)言,與之對(duì)應(yīng)的是靜態(tài)語(yǔ)言。靜態(tài)語(yǔ)言在定義變量時(shí)必須指定變量類(lèi)型,如果賦值的時(shí)候類(lèi)型不匹配,就會(huì)報(bào)錯(cuò),Java/C++ 都是靜態(tài)語(yǔ)言(int a; a = 100

          Python 裝飾器理解

          裝飾器本質(zhì)上是一個(gè) Python 函數(shù)或類(lèi),它可以讓其他函數(shù)或類(lèi)在不需要做任何代碼修改的前提下增加額外功能,裝飾器的返回值也是一個(gè)函數(shù)/類(lèi)對(duì)象。它經(jīng)常用于有切面需求的場(chǎng)景,比如:插入日志、性能測(cè)試、事務(wù)處理、緩存、權(quán)限校驗(yàn)等場(chǎng)景,裝飾器是解決這類(lèi)問(wèn)題的絕佳設(shè)計(jì)。有了裝飾器,我們就可以抽離出大量與函數(shù)功能本身無(wú)關(guān)的雷同代碼到裝飾器中并繼續(xù)重用。概括的講,裝飾器的作用就是為已經(jīng)存在的對(duì)象添加額外的功能

          map 與 reduce 函數(shù)用法解釋

          1、map() 函數(shù)接收兩個(gè)參數(shù),一個(gè)是函數(shù),一個(gè)是 Iterable,map 將傳入的函數(shù)依次作用到序列的每個(gè)元素,并將結(jié)果作為新的 Iterator 返回,簡(jiǎn)單示例代碼如下:

          #?示例1
          def?square(x):
          ????return?x?**?2
          r?=?map(square,?[1,?2,?3,?4,?5,?6,?7])
          squareed_list?=?list(r)
          print(squareed_list)??#?[1,?4,?9,?16,?25,?36,?49]
          #?使用lambda匿名函數(shù)簡(jiǎn)化為一行代碼
          list(map(lambda?x:?x?*?x,?[1,?2,?3,?4,?5,?6,?7,?8,?9]))
          #?示例2
          list(map(str,?[1,?2,?3,?4,?5,?6,?7,?8,?9]))?#?['1',?'2',?'3',?'4',?'5',?'6',?'7',?'8',?'9']

          注意map函數(shù)返回的是一個(gè)Iterator(惰性序列),要通過(guò)list函數(shù)轉(zhuǎn)化為常用列表結(jié)構(gòu)。map()作為高階函數(shù),事實(shí)上它是把運(yùn)算規(guī)則抽象了。

          2、reduce() 函數(shù)也接受兩個(gè)參數(shù),一個(gè)是函數(shù)(兩個(gè)參數(shù)),一個(gè)是序列,與 map 不同的是reduce 把結(jié)果繼續(xù)和序列的下一個(gè)元素做累積計(jì)算,效果如下:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

          示例代碼如下:

          from?functools?import?reduce
          CHAR_TO_INT?=?{
          ????'0':?0,
          ????'1':?1,
          ????'2':?2,
          ????'3':?3,
          ????'4':?4,
          ????'5':?5,
          ????'6':?6,
          ????'7':?7,
          ????'8':?8,
          ????'9':?9
          }
          def?str2int(str):
          ????ints?=?map(lambda?x:CHAR_TO_INT[x],?str)??#?str對(duì)象是Iterable對(duì)象
          ????return?reduce(lambda?x,y:10*x?+?y,?ints)
          print(str2int('0'))
          print(str2int('12300'))
          print(str2int('0012345'))??#?0012345

          Python 深拷貝、淺拷貝區(qū)別

          Python 中的大多數(shù)對(duì)象,比如列表 list、字典 dict、集合 setnumpy 數(shù)組,和用戶(hù)定義的類(lèi)型(類(lèi)),都是可變的。意味著這些對(duì)象或包含的值可以被修改。但也有些對(duì)象是不可變的,例如數(shù)值型 int、字符串型 str 和元組 tuple。

          1、復(fù)制不可變數(shù)據(jù)類(lèi)型:

          復(fù)制不可變數(shù)據(jù)類(lèi)型,不管 copy 還是 deepcopy, 都是同一個(gè)地址。當(dāng)淺復(fù)制的值是不可變對(duì)象(數(shù)值,字符串,元組)時(shí)和=“賦值”的情況一樣,對(duì)象的 id 值與淺復(fù)制原來(lái)的值相同。

          2、復(fù)制可變數(shù)據(jù)類(lèi)型:

          1. 直接賦值:其實(shí)就是對(duì)象的引用(別名)。
          2. 淺拷貝(copy):拷貝父對(duì)象,不會(huì)拷貝對(duì)象內(nèi)部的子對(duì)象(拷貝可以理解為創(chuàng)建內(nèi)存)。產(chǎn)生淺拷貝的操作有以下幾種:
            • 使用切片 [:] 操作
            • 使用工廠函數(shù)(如 list/dir/set ), 工廠函數(shù)看上去像函數(shù),實(shí)質(zhì)上是類(lèi),調(diào)用時(shí)實(shí)際上是生成了該類(lèi)型的一個(gè)實(shí)例,就像工廠生產(chǎn)貨物一樣.
            • 使用copy 模塊中的 copy() 函數(shù),b = a.copy(), ab 是一個(gè)獨(dú)立的對(duì)象,但他們的子對(duì)象還是指向統(tǒng)一對(duì)象(是引用)。
          3. 深拷貝(deepcopy):copy 模塊的 deepcopy() 方法,完全拷貝了父對(duì)象及其子對(duì)象,兩者是完全獨(dú)立的。深拷貝,包含對(duì)象里面的子對(duì)象的拷貝,所以原始對(duì)象的改變不會(huì)造成深拷貝里任何子元素的改變

          注意:淺拷貝和深拷貝的不同僅僅是對(duì)組合對(duì)象來(lái)說(shuō),所謂的組合對(duì)象(容器)就是包含了其它對(duì)象的對(duì)象,如列表,類(lèi)實(shí)例。而對(duì)于數(shù)字、字符串以及其它“原子”類(lèi)型(沒(méi)有子對(duì)象),沒(méi)有拷貝一說(shuō),產(chǎn)生的都是原對(duì)象的引用。

          看一個(gè)示例程序,就能明白淺拷貝與深拷貝的區(qū)別了:

          #!/usr/bin/Python3
          #?-*-coding:utf-8?-*-

          import?copy
          a?=?[1,?2,?3,?['a',?'b',?'c']]

          b?=?a??#?賦值,傳對(duì)象的引用
          c?=?copy.copy(a)??#?淺拷貝
          d?=?copy.deepcopy(a)??#?深拷貝

          a.append(4)
          a[3].append('d')

          print(id(a),?id(b),?id(c),?id(d))??#?a?與?b?的內(nèi)存地址相同
          print('a?=?',?a)
          print('b?=?',?b)
          print('c?=?',?c)
          print('d?=?',?d)??#?[1,?2,?3,?['a',?'b',?'c']]

          程序輸出如下:

          2061915781832 2061915781832 2061932431304 2061932811400

          a = ?[1, 2, 3, ['a', 'b', 'c', 'd'], 4] b = ?[1, 2, 3, ['a', 'b', 'c', 'd'], 4] c = ?[1, 2, 3, ['a', 'b', 'c', 'd']] d = ?[1, 2, 3, ['a', 'b', 'c']]

          Python 繼承多態(tài)理解

          多態(tài)是指對(duì)不同類(lèi)型的變量進(jìn)行相同的操作,它會(huì)根據(jù)對(duì)象(或類(lèi))類(lèi)型的不同而表現(xiàn)出不同的行為。

          總結(jié)

          • 繼承可以拿到父類(lèi)的所有數(shù)據(jù)和方法,子類(lèi)可以重寫(xiě)父類(lèi)的方法,也可以新增自己特有的方法。
          • 有了繼承,才有了多態(tài),不同類(lèi)的對(duì)象對(duì)同一消息會(huì)作出不同的相應(yīng)。




          Python“寶藏級(jí)”公眾號(hào)【Python之王】專(zhuān)注于Python領(lǐng)域,會(huì)爬蟲(chóng),數(shù)分,C++,tensorflow和Pytorch等等

          近 2年共原創(chuàng) 100+ 篇技術(shù)文章。創(chuàng)作的精品文章系列有:

          日常收集整理了一批不錯(cuò)的?Python?學(xué)習(xí)資料,有需要的小伙可以自行免費(fèi)領(lǐng)取。

          獲取方式如下:公眾號(hào)回復(fù)資料。領(lǐng)取Python等系列筆記,項(xiàng)目,書(shū)籍,直接套上模板就可以用了。資料包含算法、python、算法小抄、力扣刷題手冊(cè)和 C++ 等學(xué)習(xí)資料!

          瀏覽 63
          點(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>
                  91中文字日产乱幕4区 | 操逼视频在线观看视频 | 欧美成人一区三区无码乱码A片 | 伊人毛片| 日韩V区|