python初學一(函式與生成器一)
一、函式的基本知識:
理解:封裝重複程式碼塊的某種規則,實現一個功能。
1、函式的定義:
注意:
(1)函式程式碼塊以 def 關鍵詞開頭,後接函式識別符號名稱和圓括號()。
(2)任何傳入引數和自變數必須放在圓括號中間。
(3)函式的第一行語句可以選擇性地使用文件字串
(4)函式內容以冒號起始,並且縮排
2、函式的呼叫:
函式名() 表示執行 而 print(函式名())表示列印return值。
def func(): # 注意 print列印的 是返回值 print('內部列印') return '返回值' a = func # 函式 是一種特殊的 資料型別 ,函式名可以賦值。 print(func()) print(a())
二、函式的返回值return:
def func(x,y,z):
return x,y,z
print(func(1,2,3)) 結果 (1,2,3) print列印時轉化為 元組
a,b,c = func(1,2,3) a = 1,b=2,c=3
三、函式的引數:
函式引數有四種:位置引數、關鍵字引數、預設引數、不定長引數組。
1、位置引數:
def name(username,age): #形參:佔位的作用,並沒有實際的含義
print('hello,%s,%s歲'%(username,age))
# 位置引數 函式,形參和實參的位置要一一對應了,個數要相同
name('小紅',10)
name('小明',20)
2、關鍵字引數:
def name(username,age): #形參:佔位的作用,並沒有實際的含義
print('hello,%s,%s歲'%(username,age))
# 關鍵字引數 函式,形參和實參的個數要相同,位置無需一一對應。
name(username = '小紅',age = 10)
name(age = 10,username = '小紅')
3、預設引數:
def name(username,age = 20): #形參:佔位的作用,並沒有實際的含義
print('hello,%s,%s歲'%(username,age))
# 預設引數 函式,不傳值時輸入 預設值
name(username = '小紅')
name(age = 10,username = '小紅')
4、不定長引數組:
def func1(a,b,c,*args,**kwargs):
print(a)
print(b)
print(c)
print(args)
print(kwargs)
print(*args)
# print(**kwargs) # 無效報錯
func1(1,2,3,4,5,6,name = 'liu',age = 22) p
func1(1,2,3,*(4,5,6),name = 'liu',age = 22)
四、yield(會暫停的return)將函式轉化為生成器:
1、yiled的概念:
yield 的作用就是把一個函式變成一個generator生成器(特殊的迭代器,且只能迭代一次。),帶有 yield 的函式
不再是一個普通函式,Python 直譯器會將其視為一個生成器,return 一個iterable的物件。
2、遍歷生成器的方法():
①系統函式next()、迭代物件內部方法 . —next—()、for迴圈遍歷、內部方法send(值)
yield >> 生成器 (特殊的迭代器)
def Xun(max):
n=0
b=1
while n < max:
yield b
b+=1
n = n + 1
print(Xun(5))
// <generator object Xun at 0x000001984A207BA0> 可以迭代,且迭代一次
a = Xun(5) 變數的目的是為了儲存迭代位置
生成器: 遍歷方法1:系統函式next()方法,一個一次。
print(next(a)) 1 print(next(Xun(5)) 1
print(next(a)) 2 print(next(Xun(5)) 1
print(next(a)) 3 與 print(next(Xun(5)) 1 注意這兩者的區別。
print(next(a)) 4 print(next(Xun(5)) 1
print(next(a)) 5 print(next(Xun(5)) 1
遍歷方法2:
print(a.__next__())
print(a.__next__()) next() 系統函式
print(a.__next__()) iterable.__next__() 迭代物件內部函式 ,一個一次
print(a.__next__())
print(a.__next__())
自動迭代 使用for 遍歷所有
for i in Xun(5):
print(i)
3、 生成器 yield 執行過程:
① 過程:
如下:
② 生成器物件內部方法: . send(值) 、 . __next__() :
如下:
1、
def f():
print('start')
a = yield 1
print(a)
print('middle....')
b = yield 2 # 2這個值只是迭代值,呼叫next時候返回的值
print(b)
print('next')
c = yield 3
print(c)
a = f()
print(next(a)) 結果 : start 1
print(next(a)) 結果 : start 1 None middle 2
print(next(a))
print(next(a)) 結果:報錯,超過範圍。
a = f()
print(a.send('msg')) 結果 : start 1
print(a.send('msg1')) 結果 : start 1 msg middle 2
print(next(a))
2、
def myGen():
v1=yield 1
v2=yield 9
gen=myGen()
print(next(gen)) 結果 1
print(gen.send(8)) 結果 9
五、生成器中send(值)的用法:
1、特性:
(1)send(值)一次 相當於 next()一次 並傳一個值,不同的是next()是系統方法,send是迭代器內部方法: iterable.send(值)。
2、例項:
本章節 第四章程式碼。
六、函式傳參中的可變物件與不可變物件:
①可變型別資料與不可變資料型別回顧:
1、在 python 中,strings, tuples, 和 numbers 是不可更改的物件,而 list,dict,set等則是可以修改的物件。
2、不可變型別:變數賦值 a=5 後再賦值 a=10,這裡實際是新生成一個 int 值物件 10,再讓 a 指向它,而 5 被丟棄,不是改變a的值,相當於新生成了a。
3、可變型別:變數賦值 la=[1,2,3,4] 後再賦值 la[2]=5 則是將 list la 的第三個元素值更改,本身la沒有動,只是其內部的一部分值被修改了,記憶體地址沒有改變。由於可變資料型別的這個特性,誕生的copy模組中的 深淺拷貝 來保證list修改後 原list 不改變。
②可變型別資料與不可變資料型別函式傳參:
七、返回值return:
1、特點:
(1)函式執行後會得到返回值,沒有print不會展示到使用者介面,可以作為其他函式的引數使用。
(2)函式沒有return語句時預設返回 None。
(3)return可以返回可以理解為 print()語句 去掉 print 和(),因此return可以返回多個值,用 “,”隔開。
2、例項:
def func(x,y):
return x,y
print(func(1,2)) 結果: (1,2) 》》 元組
詳細見函式二