函數(shù)
1.函數(shù)作為變量
在python中绍填,函數(shù)就是一種特殊的類(lèi)型,其實(shí)就是在聲明類(lèi)型是function的變量
變量能做的是扁远,函數(shù)都可以做
1.使用一個(gè)變量給另外一個(gè)變量賦值
a = 10
b = a
# 聲明一個(gè)函數(shù)func1(聲明了一個(gè)函數(shù)func1平夜,func1就是一個(gè)變量
def func1():
print('hello python')
# c也是一個(gè)函數(shù)
c =func1
func1()
c()
輸出結(jié)果:
hello python
hello python
2.函數(shù)作為列表的元素
list1 = [a,'10',100]
list2 = []
list3 = []
for x in range(10):
def func2(y):
print(x+y)
list2.append(func2)
list3.append(func2(x))
print(list2)
print(list3)
# list2[0]就是一個(gè)函數(shù)
func = list2[0]
print(func(100))
# 調(diào)用list2中下標(biāo)是1對(duì)應(yīng)的函數(shù),并且傳參為10
x = 10
list2[0](10)
# 直接將函數(shù)作為列表的元素
funcs = [func1]
funcs[0]()
3.將函數(shù)作為字典的值
operation = {'+':lambda x,y:x+y,'-':lambda x,y:x-y,'*':lambda x,y,:x*y}
result = operation['+'](10,20)
print(result)
###### 4.函數(shù)作為函數(shù)的參數(shù)(回調(diào)函數(shù))
def clean_kitchen(time):
print("在%s赐稽,打掃廚房"%time)
print("收費(fèi)200元")
return 200
def clean_floor(time):
print("在%s,做地板清潔服務(wù)")
print("收費(fèi)100元")
return 100
# 在指定的時(shí)間浑侥,叫指定的服務(wù)
def call_service(time:str,service):
service(time)
call_service('上午十點(diǎn)',clean_kitchen)
5.函數(shù)作為函數(shù)的返回值
def operation(operator:str):
if operator =='+':
def my_sum(*nums):
sum1 = 0
for num in nums:
sum1 += num
print(sum1)
return my_sum
elif operator =='*':
def my_sum(*nums):
sum1 = 1
for num in nums:
sum1 *= num
print(sum1)
return my_sum
operation('+')(1,2,3
2.生成器和生成式
可以吧迭代器看成一種容器又憨,類(lèi)似列表。生成器就是來(lái)生成迭代器锭吨。
1.生成式(產(chǎn)生一個(gè)迭代器的表達(dá)式)
a0是生成器蠢莺,能夠生成0-9中所有的數(shù)字
a0 = (x for x in range(10))
#2.生成器和迭代器都是通過(guò)next來(lái)獲取里面的數(shù)據(jù)
print(next(a0))
print(next(a0))
print(next(a0))
print('======')
for x in a0:
print(x)
輸出結(jié)果:
0
1
2
======
3
4
5
6
7
8
9
3.將生成器轉(zhuǎn)換成列表
list1 = [x for x in range(10)]
print(list1)
4.將生成器轉(zhuǎn)換成字典
注意:容器類(lèi)型的元素是元組,并且元素中有且只有兩個(gè)元素的零如,才能轉(zhuǎn)換成字典
dict = dict((x,x*2)for x in range(10))
print(dict)
3.生成器
- 有yield的函數(shù)躏将,在調(diào)用函數(shù)的時(shí)候不再是獲取返回值,而是產(chǎn)生一個(gè)生成器對(duì)象考蕾,生成器對(duì)象中保留的是函數(shù)體
2.當(dāng)通過(guò)next來(lái)獲取生成器中的數(shù)據(jù)的時(shí)候祸憋,才回去執(zhí)行函數(shù)體。執(zhí)行到y(tǒng)ield為止肖卧,并且將yield后面的結(jié)果作為生成的數(shù)據(jù)返回蚯窥,同時(shí)記錄結(jié)束的位置,下次再調(diào)用next的時(shí)候從上次結(jié)束的位置接著往后執(zhí)行
def func1():
print('abc')
for x in range(10):
yield x
print('aaa')
gen = func1()
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
輸出結(jié)果:
abc
0
aaa
1
aaa
2
aaa
3
aaa
4
練習(xí):寫(xiě)一個(gè)生成器塞帐,可以產(chǎn)生斐波那契數(shù)列(可以無(wú)限生成)
def feibo(n):
a = 1
b = 1
i = 1
# print(1)
while i<=n:
c = a + b
yield a
a = b
b = c
i += 1
gen2 = feibo(11)
print(next(gen2))
print(next(gen2))
print(next(gen2))
print(next(gen2))
print(next(gen2))
print(next(gen2))
print(next(gen2))
print(next(gen2))
print(next(gen2))
print(next(gen2))
print(next(gen2))
輸出結(jié)果:
1
1
2
3
5
8
13
21
34
55
89
生成器和生成式產(chǎn)生的對(duì)象就是迭代器
4.文件操作
1.程序中不管操作任何文件拦赠,不管怎么操作,過(guò)程都是:打開(kāi)文件-->操作(讀/寫(xiě))-->關(guān)閉文件
2.做數(shù)據(jù)持久化葵姥,本地化都要使用文件來(lái)保存數(shù)據(jù)
(數(shù)據(jù)庫(kù)文件荷鼠,txt文檔,json文件榔幸,plist文件允乐,xml文件等,二進(jìn)制文件(圖片削咆,視頻牍疏,音頻等))
程序中通過(guò)變量,列表拨齐,字典等保存的數(shù)據(jù)鳞陨,在程序結(jié)束后都會(huì)被銷(xiāo)毀的。
1.打開(kāi)文件
open(文件地址奏黑,打開(kāi)方式炊邦,encoding = 編碼方式)
a.文件地址:告訴open函數(shù)要打開(kāi)哪個(gè)文件编矾,填文件路徑熟史∧俸Γ可以填絕對(duì)路徑,也可以填相對(duì)路徑
絕對(duì)路徑:一般不用
相對(duì)路徑:./相對(duì)路徑(相對(duì)于當(dāng)前文件所在的目錄)
../相對(duì)路徑(相當(dāng)于當(dāng)前文件所在的目錄的上一層目錄)
.../相對(duì)路徑(相當(dāng)于當(dāng)前文件所在的目錄的上一層目錄的上一層目錄)
b.打開(kāi)方式:獲取文件的內(nèi)容以讀的形式打開(kāi)蹂匹,在文件中寫(xiě)內(nèi)容就以寫(xiě)的形式打開(kāi)
'r' -->讀(默認(rèn)值),讀出來(lái)的內(nèi)容以文本的形式返回
'rb'/'br' --> 讀碘菜,讀出來(lái)的內(nèi)容以二進(jìn)制(bytes)的形式返回
'w' --->寫(xiě),寫(xiě)文本到文件中
'wb'/'bw'--->寫(xiě)限寞,寫(xiě)二進(jìn)制數(shù)據(jù)到文件中
'a'--->寫(xiě)忍啸,追加
c.編碼方式:以文本的形式讀和寫(xiě)的時(shí)候才需要設(shè)置編碼方式。
utf-8:萬(wàn)國(guó)碼
gbk:只支持中文
d.open函數(shù)的返回值是被打開(kāi)的文件對(duì)象
2.關(guān)閉文件
文件對(duì)象.close()
3.操作文件
# a. 讀操作
# 打開(kāi)文件履植,f就是被打開(kāi)文件對(duì)象
f = open('./test.txt','r',encoding='utf-8')
# 獲取文件中的所有內(nèi)容计雌,將結(jié)果返回給content保存
# 從文件開(kāi)始讀到第二行結(jié)束
content=f.readline()
print(content)
print('=====')
# 從第二行開(kāi)始,讀到第二行結(jié)束
print(f.readline())
print('====')
#從第三行開(kāi)始玫霎,讀到文件結(jié)束
print(f.read())
f.close()
# b.寫(xiě)操作
'''
'w'--->寫(xiě)操作凿滤,完全覆蓋原文件的內(nèi)容
'a'--->寫(xiě)操作,在原文件的內(nèi)容后去追加新的內(nèi)容
'''
f = open('./test.txt','a',encoding='utf-8')
f.write("程序員的詩(shī)")
f.close()
# 4.文件不存在的情況
'''
當(dāng)以讀的形式打開(kāi)文件的時(shí)候庶近,如果文件不存在翁脆,程序會(huì)崩潰。會(huì)報(bào)錯(cuò)
當(dāng)以寫(xiě)的形式打開(kāi)一個(gè)不存在的文件的時(shí)候鼻种,會(huì)自動(dòng)創(chuàng)建一個(gè)新的文件
'''
f = open('./test1.txt','w',encoding='utf-8')
f.write("你好反番,江秀成")
f.close()
# 練習(xí):統(tǒng)計(jì)一個(gè)模塊執(zhí)行的次數(shù)
f = open('./test2.txt','r',encoding='utf-8')
number = int(f.read())
print(number)
f.close()
number +=1
f = open('./test2.txt','w',encoding='utf-8')
f.write(str(number))
f.close()