1.函數(shù)作為變量
在python中废士,函數(shù)就是一種特殊的類型蚯姆。聲明函數(shù)的時候,其實就是在聲明類型是function的變量弟断。(變量能做的咏花,函數(shù)都可以做)
1.給變量賦值
def func1():
print('abc')
a = func1
a()
func1()
'''
abc
abc
'''
2.函數(shù)作為列表的元素(可以把函數(shù)存放到列表中)
a = []
for x in range(3):
def fun1():
print('abc')
a.append(fun1)
print(a)
a[0]()
'''
[<function fun1 at 0x008DB8A0>, <function fun1 at 0x008DB2B8>, <function fun1 at 0x008DB8E8>]
abc
'''
3.函數(shù)作為函數(shù)的參數(shù)(回調(diào)函數(shù))
def fun1():
print('a')
def fun2():
print('b')
def mai_fun(n):
n()
mai_fun(fun2)
'''
b
'''
4.函數(shù)作為函數(shù)的返回值
def fun(str1):
if str1 == '+':
def sum2(*n):
sum1 = 0
for num in n:
sum1 += num
return sum1
return sum2
print(fun('+')(1,2,3))
'''
6
2.生成器和生成式
1.可以把迭代器看成一種容器,類似列表夫嗓。生成器就是來生成迭代器。
2.生成式--------產(chǎn)生一個迭代器的表達(dá)式
a = (x for x in range(10))
print(next(a))
print(next(a))
結(jié)果:0,1
'''
1.a是生成器冲秽,能夠生成0-9中的所有的數(shù)字舍咖。
2.生成器和迭代器都是通過next來獲取里面的數(shù)據(jù)
'''
2.b = (char for x in 'waqsw' if x =='wa')
'''
后面可以加判斷條件。
'''
3.list1 = [x for x in range(10)]
'''
通過將生成式產(chǎn)生的迭代器轉(zhuǎn)換成了一個列表
'''
4.將生成器轉(zhuǎn)換成字典(容器類型的元素是元組锉桑,并且元素中有且只有兩個元素排霉,才能轉(zhuǎn)換成字典)
dict1 = [(x,x+1) for x in range(10)]
print(dict1)
dict2 = dict(dict1)
print(dict2)
'''
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10)]
{0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}
'''
練習(xí),key,value互換民轴。
dict2 = {'a':1,'b':2}
dict3 = dict(((dict2[x],x) for x in dict2))
dict1 = dict(((v,k) for k,v in {'a':1,'b':2}.items()))
print(dict1)
print(dict3)
'''
{1: 'a', 2: 'b'}
{1: 'a', 2: 'b'}
'''
3.yield
1.只要函數(shù)中有yield關(guān)鍵字攻柠,那么這個函數(shù)就會變成一個生成器球订。(只要有yield不管有沒有執(zhí)行到y(tǒng)ield,函數(shù)的調(diào)用結(jié)果都是生成器)
2.有yield的函數(shù)瑰钮,在調(diào)用函數(shù)的時候不再是獲取返回值冒滩,而是產(chǎn)生一個生成器對象,生成器對象中保留的是函數(shù)體浪谴。
3.當(dāng)通過next獲取生成器中的數(shù)據(jù)的時候开睡,才會去執(zhí)行函數(shù)體,執(zhí)行到y(tǒng)ield為止苟耻,并且將yield后面的結(jié)果作為生成的數(shù)據(jù)返回篇恒。同時記錄結(jié)束的位置,下次再調(diào)用next的時候凶杖,從上次結(jié)束的位置接著往后執(zhí)行胁艰。
'''
def fun1():
yield 1
yield 1
x = y = 1
while True:
yield x+y
x,y = y,x+y
gen = fun1()
for _ in range(10):
print(next(gen),end=' ')
'''斐波拉切數(shù)列
1 1 2 3 5 8 13 21 34 55
4.生成器和生成式產(chǎn)生的對象就是迭代器智蝠。
iter1 = iter([1,2,3,4,5])
print(next(iter1))
for item in iter1:
print(item,end=' ')
'''
1
2 3 4 5
'''
將列表轉(zhuǎn)換成迭代對象
5.文件操作
1.程序中不管操作任何文件腾么,不管怎么操作,過程都是:打開文件-->操作(讀/寫)--->關(guān)閉文件
2.做數(shù)據(jù)持久化,本地化寻咒,都要使用文件來保存數(shù)據(jù)(數(shù)據(jù)庫文件哮翘,txt文檔,json文件毛秘,plist饭寺,xml文件等,二進(jìn)制文件(圖片叫挟,視頻艰匙,音頻等))
a.文本文件的操作
1.打開文件
open(文件地址,打開方式,encoding=編碼方式)
'''
a.文件地址:文件所在的地址(路徑)。絕對路徑和相對路徑抹恳。
b.打開方式:
'r' ------ > 讀(默認(rèn)值),以文本的形式返回(str)
'rb'------> 讀员凝,讀出來的內(nèi)容以二進(jìn)制(bytes)的形式返回。
'w' ------> 寫奋献,寫文本到文件中(先抹除文本的原內(nèi)容在寫入健霹,如果文件不存在,會自動創(chuàng)建)
'wb'------>寫瓶蚂,寫二進(jìn)制數(shù)據(jù)到文件中
'a' -------->寫(追加),在原有的內(nèi)容后面寫糖埋。
c.編碼方式:以文本的形式讀和寫的時候才需要設(shè)置編碼方式。utf -8(萬國碼)
2.操作文件
open函數(shù)的返回值是被打開的文件對象
f1 = open(r'C:/Users/Administrator/Desktop/1.txt','r')
f2 = open(r'C:/Users/Administrator/Desktop/1.txt','w')
一.讀
'''
f1.read() # 讀所有內(nèi)容窃这,將結(jié)果返回瞳别。
f1.readline() # 一行一行的讀
注意:當(dāng)打開這個文件,沒關(guān)閉之前。假如讀一行祟敛,下次再讀就從第二行開始疤坝。
'''
二.寫
'''
f2.write() # 'w' 抹除之前的內(nèi)容,然后寫馆铁。如果想不抹除就用 'a'
'''
1.當(dāng)以讀的形式打開文件的時候跑揉,如果文件不存在,程序會報錯叼架。
2.當(dāng)以寫的形式寫文件的時候畔裕,如果文件不存在,文件會被創(chuàng)建乖订。