1.匿名函數(shù)
函數(shù)名 = lambda 參數(shù)列表:返回值
函數(shù)名(實參)
sum1 = lambda x, y:x*y
def sum1_a(x, y):
return x*y
2.作用域
函數(shù)的調(diào)用過程是一個全棧的過程
全局變量:函數(shù)和類外面聲明的變量都是全局變量杠氢,作用域:從聲明到程序結(jié)束
局部變量:在函數(shù)/類里面聲明的變量時局部變量盐杂,作用域:從聲明到函數(shù)結(jié)束
3.遞歸函數(shù)(能不用就不用)
a.找臨界值(結(jié)束循環(huán))
b.找關(guān)系(上次循環(huán)和本次循環(huán)的關(guān)系f(n)和f(n-1)的關(guān)系)
c.根據(jù)f(n-1)實現(xiàn)f(n)的功能
4.模塊的使用
一個py文件就是一個模塊
2.函數(shù)作為變量
在python中,函數(shù)就是一種特殊的類型豪诲。聲明函數(shù)的時候其實就是在聲明類型是function個的變量
變量能做的事情,函數(shù)都可以做
1.函數(shù)給其他變量賦值
def func1():
print('hello python')
c = func1 #c也是一個函數(shù)
2.函數(shù)作為列表的函數(shù)
list1 = ['a', '0, 100]
list2 = []
list3 = []
for x in range(10):
def func2():
print(x+y, end=' ')
return x+y
list2.append(func2)
list3.append(func2(2))
#list2中每個元素的值都是函數(shù)
print(list2)
print(list3)
list2[0]就是一個函數(shù)
func = list2[0]
print(func(100))
直接將函數(shù)作為列表的元素
funcs = [func1]
funcs[0]()
3.將函數(shù)作為字典的值
operation = {'+':lambda x, y:x+y, '-':lambda x, y:x-y}
result = operation['*'](10, 20)
print(result)
4.函數(shù)作為函數(shù)的參數(shù)(回調(diào)函數(shù))
def cleac_kitchen(time):
print('%s,打掃廚房' % time)
print('收費200')
return 200
def clean_floor(time):
print('在%s,做地板清潔服務' % time)
print('收費100元')
return 100
#在指定的時間叫指定的服務
def call_service(time, service):
service(time)
#將函數(shù)作為參數(shù),傳給其他函數(shù)
call_service('上午十點', cleac_kitchen)
5.函數(shù)作為函數(shù)的返回值
def operation(operetor:str):
if operetor == '+':
def my_sum(*nums):
sum1 = 0
for num in nums:
sum1+=num
print(sum1)
#將求和的函數(shù)返回
return my_sum()
#operation('+')函數(shù)
operation('+')(1, 3)
3.生成器和生成式
1.可以吧迭代器看成一種容器粥惧,類似于列表。生成器就是來生成迭代器最盅。
a是生成器突雪,能夠生成0-9中的所有數(shù)字
a = (x for x in range(10))
print(a,type(a))
2.生成器和迭代器都是通過next來獲取里面的數(shù)據(jù)
print(next(a))
生成式:產(chǎn)生一個迭代器的表達式
3.通過鍵生成式產(chǎn)生的迭代器轉(zhuǎn)換成一個列表。
a = (char for char in 'hello python')
a = (char for char in 'he123llo python' if '0'<char<'9' )
print(next(a))
print(next(a))
list1 = [x for x in range(10)]
print(list1, type(list1))
4.將生成器轉(zhuǎn)化成列表
list1 = [(x for x in range(10))]
print(list1)
5.將生成器轉(zhuǎn)換成字典
注意:容器類型的元素是元祖涡贱,并且元祖中有且只有兩個元素咏删,才能轉(zhuǎn)換成元祖
dict1 =dict([(x, x*2) for x in range(10)])
print(dict1)
練習:用一句代碼實現(xiàn)交換一個字典中的key和value的值
dict3 = {'a':1, 'b':2}
dict2 = ((dict3[key],key) for key in {'a':1, 'b':2})
print(dic2)
4.生成器
1.只要函數(shù)中有yield關(guān)鍵字,那么這個函數(shù)就會變成一個生成器问词。
a.有yield的函數(shù)督函,在調(diào)用函數(shù)的時候不再是獲取返回值,而是產(chǎn)生一個生成器的對象激挪,生成器對象中保留的是函數(shù)體辰狡。
b.當通過next獲取生成器中的數(shù)據(jù)的時候,才會執(zhí)行函數(shù)體垄分,執(zhí)行到y(tǒng)ield并且將yield后面的結(jié)果作為生成的數(shù)據(jù)返回宛篇。同時記錄結(jié)束的位置,下次調(diào)用next的時候薄湿,從上次結(jié)束的位置接著往后執(zhí)行些己。
def func2():
print('abc')
for x in range(10):
yield x
print('aaa')
# 注意:函數(shù)中只要有yield,不管函數(shù)的調(diào)用結(jié)果嘿般,都是生成器
def func3(x):
print('abc')
if x > 10:
yield 100
return 20
print(func2(), type(func2()), type(func2()))
#這兒的func2()是一個生成器
gen = (func2())
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
gen2 = func3(1000)
print(gen2)
練習:寫一個生成器段标,可以產(chǎn)生斐波那契數(shù)列
def fei_bo(n):
yield 1
yield 1
f1 = 1
f2 = 1
while True:
yield f1+f2
f1,f2 = f2, f1+f2
fei = fei_bo()
for _ in range(6):
print(next(fei))
生成器和生成式產(chǎn)生的對象就是迭代器
- 將列表轉(zhuǎn)換成迭代器對象
迭代器(iter)
iter1 = iter([1, 2, 3, 4])
print(iter1)
print(next(iter1))
print(next(iter1))
for item in iter1:
print(item)
5.文件操作
1.程序中不管操作任何文件,不管怎么操作炉奴,過程都是:打開文件逼庞,然后再操作(讀,寫) _>關(guān)閉文件
2.做數(shù)據(jù)持久化瞻赶,本地化赛糟,都要使用文件來保存數(shù)據(jù)派任。(數(shù)據(jù)庫文件、txt文檔璧南、json文件掌逛、plist/xml、二進制文件(圖片司倚,視頻等))豆混。程序中通過變量、列表动知、字典等保存的數(shù)據(jù)皿伺,在程序結(jié)束后都會被銷毀
打開文件(open)
open(文件地址,打開方式盒粮,encoding=編碼方式)
a.文件地址:告訴open函數(shù)要打開的是哪個文件鸵鸥,填文件路徑(可以填絕對路徑,也可以填相對路徑)
絕對路徑:(一般不用)
相對路徑;./相對路徑(相對于當前文件所在的目錄)
../相對路徑(相對于當前文件所在目錄的上一級)
b.打開方式:獲取文件內(nèi)容以讀的形式打開丹皱,往文件中寫內(nèi)容就以寫的形式打開
'r'-->讀(默認值)妒穴,讀出來的內(nèi)容以文本(str)的形式返回
'rb/br'-->讀,讀出來的內(nèi)容(bytes)以二進制的形式返回摊崭。
'w'-->寫讼油,寫文本到文件中
'wb/bw'-->寫,寫二進制數(shù)據(jù)到文件中
'a'-->寫爽室,追加
c.編碼方式:以文本的 形式讀和寫的時候才需要設置編碼方式汁讼。
utf-8:萬國碼
gbk:只支持中文
d.open函數(shù)的返回值是被打開的文件對象
2.關(guān)閉文件
文件對象.close()
打開文件,f就是被打開的文件對象
f = open('./files/test2.txt', 'r', encoding='utf-8')
# 獲取文件中的所有的內(nèi)容阔墩,將結(jié)果返回給content保存
content = f.read()
print(content)
f.close()
# readline 就是讀一行
f1 = open('./files/test2.txt', 'r', encoding='utf-8')
# 從文件開始讀到第一行結(jié)束
content = f1.readline()
print(content)
# 從第二行開始嘿架,讀到第二行結(jié)束
print(f1.readline())
# 從第三上開始,讀到第三行結(jié)束
print(f1.read())
f1.close()
b.寫操作
'w'-->寫操作啸箫,完全覆蓋文件的內(nèi)容
'a'-->寫操作耸彪,在原文件的內(nèi)容后去追加新的內(nèi)容
f = open('./files/test2.txt', 'w', encoding='utf-8')
f.write('程序員的詩詞')
f.close
4.文件不存在的情況
當以讀的形式打開文件的時候,如果文件不存在忘苛,程序會崩潰蝉娜。
當以寫的形式打開文件時候,如果不存在扎唾,系統(tǒng)不會報錯召川,會創(chuàng)建這個文件,并且將內(nèi)容存在新建的文件里面胸遇。```