主頁 > 後端開發 > 資料分析學習筆記—python函式、例外與處理

資料分析學習筆記—python函式、例外與處理

2021-04-12 12:24:16 後端開發

文章目錄

    • 一、python函式例外與處理思維導圖
    • 二、補充說明:python函式引數(如有錯誤,還請指正)
            • 1、python函式引數的傳遞機制
            • 2、python函式引數分類(位置、默認值、關鍵字)
    • 三、補充說明:python函式的例外捕獲
            • 常見錯誤型別和繼承關系

一、python函式例外與處理思維導圖

在這里插入圖片描述

二、補充說明:python函式引數(如有錯誤,還請指正)

1、python函式引數的傳遞機制

說到python函式引數的傳遞機制,就很容易想起C++中令人頭禿的值傳遞、參考傳遞和指標傳遞,如果你想弄清這個概念,然后去查了不同的人的博客說明,或者去知乎搜索,可能會看到不亞于php是世界上最好的語言大戰的一場混戰,這可能導致你和我一樣,糾結這個概念一天,然后頭昏腦漲(當然,可能是我想太多,畢竟之前微機原理記憶體什么的學的不是很好,下意識對指標這種東西產生了恐懼,導致對python函式的傳遞機制也產生理論誤解),

有人說python函式引數的傳遞機制是參考傳遞,有人說python函式引數的傳遞機制是值傳遞,當然,也有人提到是賦值傳遞,我查詢了python的官方檔案,找到了這么兩段話:

The actual parameters (arguments) to a function call are introduced in the local symbol table of the called function when it is called; thus,
arguments are passed using call by value (where the value is always an object reference, not the value of the object). [1] When a function calls another function, or calls itself recursively, a new local symbol table is created for that call.
[1] Actually, call by object reference would be a better description, since if a mutable object is passed, the caller will see any changes the callee makes to it (items inserted into a list).
簡單翻譯就是: 函式呼叫的實際引數(引數)在被呼叫時被引入到被呼叫函式的本地符號表中,因此,引數是通過按值呼叫(其中值始終是物件的參考,而不是物件的值)傳遞的,
[1]當一個函式呼叫另一個函式或遞回呼叫自身時,將為該呼叫創建一個新的本地符號表
Remember that arguments are passed by assignment in Python. Since assignment just creates references to objects, there’s no alias between an argument name in the caller and callee, and so no call-by-reference per se.
請記住在 Python 中引數是通過賦值來傳遞的, 由于賦值只是創建了物件的參考,因此在呼叫者和被呼叫者的引數名稱之間沒有別名,所以本身是沒有按參考呼叫的,

這里提到了,python函式引數的傳遞并不能簡單的稱之為值傳遞或者參考傳遞,
印象中的值傳遞,是將實參的值進行復制,將復制后的值傳過去,隨便你怎么造作,我原來的值都在那里,不會變化,
而參考傳遞,則是給實參取了個小名,對小名如何操作,都還是嚯嚯大名,始終是一個東西,進行操作改變,形參變了,則實參也變了,
這里我寫了三個小代碼片段
第一段代碼中x初始值為1,函式內部對z進行+1操作,然后輸出x

x=1
print("x為%d"%x)
print(id(x))
def test (z):
    z=z+1
    print("z為%d"%z)
    print(id(z))
test(x)
print("x為%d"%x)
print(id(x))
x為1
140708681847616
z為2
140708681847648
x為1
140708681847616

第二段代碼段中x為一個串列,對串列加一個元素4,輸出結果

x=[1,2,3]
print(x)
print(id(x))
def test (z):
    z=z+[4]
test(x)
print(x)
print(id(x))
[1, 2, 3] 
2002223753416 
[1, 2, 3] 
2002223753416

第三段代碼中x仍然是一個串列,對串列x使用append操作,輸出x

x=[1,2,3]
print(x)
print(id(x))
def test (z):
    z=z.append(4)
test(x)
print(x)
print(id(x))
[1, 2, 3]
2002217153672
[1, 2, 3, 4]
2002217153672

從這三段代碼段的運行結果可以看出,python既不是值傳遞也不是參考傳遞,因為如果是值傳遞,那么所有代碼的運行結果應當與最開始一樣,不會受形參的影響,如果是參考傳遞,那么函式呼叫時,應當函式內部的操作會影響到實參,但事實是并沒有,在代碼的運行中,我加入了id(),可以查看運行前后記憶體地址的變化,
具體如何理解python函式引數的傳遞機制,以這段代碼為例:

x=1
print(id(x))  #140708681847616
def test (z):
    z=z+1
    print(id(z))  #140708681847648
test(x)
print(id(x))  #140708681847616

最開始x=1,其記憶體地址為140708681847616,x可以視為系結了物件int 1的一個名字,即可以用x去參考1
在這里插入圖片描述
函式呼叫時,z=x,此時z也是物件int 1的一個名字,這兩個名字指向的都是Int 1,如果沒有意外,那么他們將繼續這樣保持下去,但是
在這里插入圖片描述
函式呼叫后,z=z+1,如果是單純的參考傳遞,那么z的值會變成2并且輸出

但是實際上,z+1是一個新的物件,然后他們系結了z

z的記憶體地址很明顯變為了140708681847648,也就是說,現在z參考的是z+1,即2,而不再是1了
在這里插入圖片描述

所以,最后輸出,x仍然為1的原因是因為x仍然參考的是1,并沒有發生改變,至于上文中list.append后,輸出的值發生改變,是因為它并沒有產生新的物件,不需要重新系結原串列中的某個名字,也就不會發生改變,

2、python函式引數分類(位置、默認值、關鍵字)

![在這里插入圖片描述](https://img-blog.csdnimg.cn/20210410231142139.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NqYXZhXw==,size_16,color_FFFFFF,t_70在這里插入圖片描述
位置引數: 按位置傳遞引數

def ask(name, str,city):
    print(name+str+city)
ask('張三','來自','北京')  #張三來自北京

默認值引數: 為一些改動不大的引數指定默認值,呼叫函式時,可以使用更少的引數,更方便,需要注意,默認值只計算一次,默認值為串列、字典或類實體等可變物件時,后續的呼叫會在第一次呼叫的結果上進行,不想在后續呼叫之間共享默認值時,需要指定例如串列類L=None,

def ask(name, str='來自',city='安徽'):
    print(name+str+city)

只給出必選實參name:

ask('張三') #輸出結果:張三來自安徽

給出一個可選實參name和str:

ask('張三','離開') #張三離開安徽

給出全部實參:

ask('張三','離開','安慶')  #張三離開安慶

關鍵字引數:呼叫函式時使用key=value的方式去指定引數的傳遞

def ask(name, str='來自',city='安徽'):
    print(name+str+city)
ask('張三',city='北京',str='離開')  #張三離開北京

可變引數: 不確定傳遞多少個引數,也就是引數數量未知時,可以用包裹(packing)位置引數,或者包裹關鍵字引數,來進行引數傳遞,
1、包裹位置傳遞:根據傳進引數的位置合并為一個元組進行傳遞

def test(*args):  #元組型別
    ....
func(a, b, c)

當需要傳遞的是串列或者元組時,可以在串列或者元組前面加上*作為一個整體進行傳遞,
2、包裹關鍵字傳遞

def func(**kargs): #字典型別
	  ....
	func(a=1, b=2, c=3)

命名關鍵字引數: 限制引數傳入的名字,例:

 def person(name, age, *, city, job),中間加入*作為分隔符,后面的引數全部限制輸入時的引數名,即為命名關鍵字引數
 或者
 def person(name, age, *args, city,job)  
 如果對命名關鍵字引數賦默認值,則實參可以不用寫該引數

混合引數:位置引數、默認引數、可變引數(包裹位置引數、包裹關鍵字引數)、命名關鍵字引數、關鍵字引數,這5種引數都可以組合使用,但是請注意,引數定義的順序必須是:必選引數、默認引數、可變引數、命名關鍵字引數和關鍵字引數

三、補充說明:python函式的例外捕獲

常見錯誤型別和繼承關系

BaseException (所有例外基類)
±- SystemExit (解釋器請求退出)
±- KeyboardInterrupt (用戶中斷執行)
±-GeneratorExit (生成器發生例外來通知退出)
±- Exception (常規錯誤的基類)
±- StopIteration (迭代器沒有更多的值)
±- StopAsyncIteration ()
±- ArithmeticError (所有數值計算錯誤的基類)
| ±- FloatingPointError (浮點計算錯誤)
| ±- OverflowError (數值計算超出最大限制)
| ±- ZeroDivisionError (除(或取模)0)
±- AssertionError (斷言陳述句失敗)
±- AttributeError (物件沒有這個屬性)
±- BufferError ()
±- EOFError (沒有內建輸入,到達EOF標記)
±- ImportError (匯入模塊/物件失敗)
| ±- ModuleNotFoundError ()
±- LookupError (無效資料查詢的基類)
| ±- IndexError (序列中沒有此索引)
| ±- KeyError (映射中沒有這個鍵)
±- MemoryError (記憶體溢位錯誤)
±- NameError (未宣告/初始化物件)(沒有屬性)
| ±- UnboundLocalError (訪問未初始化的本地變數)
±- OSError 作業系統錯誤
| ±- BlockingIOError
| ±- ChildProcessError
| ±- ConnectionError
| | ±- BrokenPipeError
| | ±- ConnectionAbortedError
| | ±- ConnectionRefusedError
| | ±- ConnectionResetError
| ±- FileExistsError
| ±- FileNotFoundError
| ±- InterruptedError
| ±- IsADirectoryError
| ±- NotADirectoryError
| ±- PermissionError
| ±- ProcessLookupError
| ±- TimeoutError
±- ReferenceError 弱參考試圖訪問已經垃圾回收了的物件
±- RuntimeError 一般的運行時錯誤
| ±- NotImplementedError 尚未實作的方法
| ±- RecursionError
±- SyntaxError 語法錯誤
| ±- IndentationError 縮進錯誤
| ±- TabError Tab和空格混用
±- SystemError 一般的解釋器系統錯誤
±- TypeError 對型別無效的操作
±- ValueError 傳入無效的引數
| ±- UnicodeError Unicode相關錯誤
| ±- UnicodeDecodeError Unicode解碼錯誤
| ±- UnicodeEncodeError Unicode編碼錯誤
| ±- UnicodeTranslateError Unicode轉換錯誤
±- Warning 警告的基類
±- DeprecationWarning 關于被棄用的特征的警告
±- PendingDeprecationWarning 關于特性將會被廢棄的警告
±- RuntimeWarning 可疑的運行時行為警告
±- SyntaxWarning 可疑的語法的警告
±- UserWarning 用戶代碼生成的警告
±- FutureWarning 關于構造將來語意會有改變的警告
±- ImportWarning
±- UnicodeWarning
±- BytesWarning
±- ResourceWarning

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/275158.html

標籤:python

上一篇:Pytorch學習-TORCH.NN

下一篇:使用Selenium實作微博爬蟲:預登錄、展開全文、翻頁

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more