python基礎 第六天(函式詳解)

2021-10-08 18:36:48 字數 4321 閱讀 5198

目錄

1、函式即是物件

2、變數的作用域(全域性變數和區域性變數)

3、引數的傳遞

4、淺拷貝與深拷貝

5、引數的幾種型別

6、lamda函式

7、eval()函式

8、遞迴函式

python中一切都是物件。執行def定義函式後,系統就建立了相應的函式物件。

全域性變數:

(1)在函式和類定義之外宣告的變數,作用域為定義的模組,從定義位置開始知道模組結束。

(2)全域性變數降低了函式的通用性和可讀性,應盡量避免使用。

(3)全域性變數一般做常量使用。

(4)函式內部想改變全域性變數的值,使用global宣告一下。

區域性變數:

(1)在函式體中(包含形式引數)宣告的變數。

(2)區域性變數的引用比全域性變數快,優先考慮使用

(3)如果區域性變數和全域性變數同名,則在函式內隱藏全域性變數,只是用同名的區域性變數。

全域性變數和區域性變數效率測試

引數傳遞都是引用傳遞,不是值傳遞,分為兩類:

(1)對可變物件進行寫操作,直接作用於物件本身。可變物件主要是列表,字典等。

b=[10,20]

def test(m):

print("m:",id(m))

test(b)

print("b:",id(b))

print(b)

********結果如下*******

m: 1529479844232

b: 1529479844232

[10, 20, 30]

傳遞的引數是可變物件時,實際上指向的物件在堆中的物件是相同的,所有操作都會在原物件上進行。

(2)對不可變物件進行寫操作,會產生乙個新的物件空間,並用新的值填充這塊空間,(起到了值傳遞的效果,但不是值傳遞)

a=100

def test(n):

print("n:",id(n))

n=n+200

print("n:",id(n))

print(n)

test(a)

print('a:',id(a))

******結果如下*****

n: 140704077032944

n: 2060362282160

300a: 140704077032944

傳遞不可變物件時,由於物件不可變,會產生乙個新物件來做修改。

淺拷貝copy.copy():不拷貝子物件的內容,只是拷貝子物件的引用。

深拷貝copy.deepcopy():會連子物件的記憶體也全部拷貝乙份,對子物件的修改不會影響源物件。

import copy

a=[1,2,[2,3]]

d=[1,2,[2,3]]

b=copy.copy(a)

c=copy.deepcopy(d)

print('a:',a)

print('b:',b)

print('d:',d)

print('c:',c)

print('淺拷貝')

print("a:",a,"a.id",id(a))

print("b:",b,"b.id",id(b))

print('深拷貝')

print("d:",d,"d.id:",id(d))

print("c:",c,"c.id:",id(c))

*******結果如下*******

a: [1, 2, [2, 3]]

b: [1, 2, [2, 3]]

d: [1, 2, [2, 3]]

c: [1, 2, [2, 3]]

淺拷貝a: [1, 2, [2, 3, 4]] a.id 1909256358344

b: [1, 2, [2, 3, 4], 5] b.id 1909256358600

深拷貝d: [1, 2, [2, 3]] d.id: 1909256358856

c: [1, 2, [2, 3, 4], 5] c.id: 1909256358664

淺拷貝時,對子物件的修改,會反饋到原物件的子物件上,深拷貝時則不會。

在傳遞不可變物件時,如果發生拷貝,是淺拷貝。當不可變物件含有可變子物件時,子物件的修改會反饋到源物件的子物件上。

bukebian=(10,20,[30,40])

print("bukebian:",bukebian,"bukebian.id:",id(bukebian))

def test(m):

print("bukebian:",id(m))

m[2][0]=1

print(m)

print("bukebian:",id(m))

test(bukebian)

print(bukebian)

******結果如下*****

bukebian: (10, 20, [30, 40]) bukebian.id: 2003880841368

bukebian: 2003880841368

(10, 20, [1, 40])

bukebian: 2003880841368

(10, 20, [1, 40])

5.1位置引數

函式呼叫時,實參預設按照位置順序傳遞,需要個數與形參相匹配,按位置傳遞的引數,成為位置引數。

5.2預設值引數

可以為某些引數設定預設值,這樣的引數就是可選的,稱為預設值引數,放在位置引數後面。

5.3命名引數

按照形參的名稱傳遞引數,成為命名引數。

def test(a,b,c=20,d=30):

print (a,b,c,d)

test(10,20)

test(10,20,40,50)

test(b=20,a=10)

*****結果如下*******

10 20 20 30

10 20 40 50

10 20 20 30

5.4可變引數

(1)*param(乙個星號),將多個引數收集到乙個元組物件中

(1)**param(兩個星號),將多個引數收集到乙個字典物件中

def test2(a,b,*c,**d):

print(a,b,c,d)

test2(10,20,30,40,names='sha',age=10)

*********結果如下**********

10 20 (30, 40)

注意,這裡傳字典的時候,鍵不能加引號。

5.5強制命名引數

在可變引數後面增加新的引數,必須是強制命名引數,必須通過名稱呼叫。

lamda表示式可以用來宣告匿名函式,實際生成乙個函式物件。只允許乙個表示式,不能包含複雜語句。表示式的計算結果就是函式的返回值。

a=lambda x,y,z:(x+y)*z

print(a(1,2,3))

b=[lambda x:x**2,lambda y:y**3]

print(b[0](2))

print(b[1](2))

****結果如下*****94

8

eval() 函式用來執行乙個字串表示式,並返回表示式的值。

eval(expression[, globals[, locals]])
expression -- 表示式。globals -- 變數作用域,全域性命名空間,如果被提供,則必須是乙個字典物件。locals -- 變數作用域,區域性命名空間,如果被提供,可以是任何對映物件。

x = 7

eval( '3 * x' )

eval('2 + 2')

eval("print('abc')")

a=10

b=20

dict1=dict(a=100,b=200)

c=eval('a+b',dict1)

print(c)

****結果如下****214

abc300

遞迴函式指:自己呼叫自己的函式,在函式內部直接或間接的自己呼叫自己。

練習,階乘計算

def test(a,sum=1):

sum = sum * a

if a>1:

test(a-1,sum)

else :

print(sum)

test(5)

***結果如下***

120

java基礎第六天

物件導向思想 面向過程 一步一步做事情 物件導向 找物件來做事情,物件本身包含做事情的步驟 特點 角色發生轉變,執行者變成指揮者 特徵 封裝 繼承多型 類和物件 類 對事物的描述 物件 這一類事物的實體 例項 物件導向 我們需要操作實實在在的物件 定義類的步驟 1.類名 2.成員變數 屬性 通常的叫...

第六天 路由基礎

引入要顯示的元件 import helloworld from components helloworld 使用路由中介軟體 vue.use router 宣告vue路由的例項 export default new router 3.在mian.js中引入剛剛改好的index.js檔案 import...

python學習 第六天

在下這廂有禮了 原始碼安裝說明 很多第三方庫都是開源的,幾乎都可以在github或者pypi上找到原始碼,找到的原始碼的格式大都是zip tar.zip tar.bz2格式的壓縮包。解壓這些壓縮包,會看到setup.py的檔案。開啟命令列,進入資料夾。執行 這個命令,就能把這個第三庫安裝到系統中,也...