1??recode
1.匿名函數(shù)
函數(shù)名 = lambda 參數(shù)列表:返回值
函數(shù)體是一條語(yǔ)句,并且語(yǔ)句是有結(jié)果的
匿名函數(shù)也是函數(shù)
2.變量的作用域
全局變量:沒(méi)有聲明在函數(shù)或者類(lèi)中的變量。從聲明開(kāi)始在文件結(jié)束,任何位置都能使用。
局部變量:聲明在函數(shù)或者類(lèi)中的變量。從聲明開(kāi)始到函數(shù)或者是類(lèi)結(jié)束而結(jié)束。
global:在函數(shù)中聲明一個(gè)全局變量/想要在函數(shù)中修改一個(gè)全局變量到值
nonlocal:想要在局部的局部去修改一個(gè)局部變量到值
3.函數(shù)作為變量
聲明函數(shù)就是在聲明一個(gè)類(lèi)型是function的變量。普通變量能做的事,函數(shù)變量都能做。
函數(shù)名 --> 一個(gè)函數(shù)
函數(shù)名() --> 調(diào)用函數(shù),拿到的事函數(shù)的返回值
函數(shù)作為參數(shù) --> 閉包
函數(shù)作為返回 --> 裝飾器
4.調(diào)用過(guò)程
函數(shù)的調(diào)用過(guò)程是一個(gè)壓棧的過(guò)程
調(diào)用函數(shù)的時(shí)候系統(tǒng)會(huì)自動(dòng)在棧區(qū)間開(kāi)辟空間存儲(chǔ)數(shù)據(jù)(函數(shù)的參數(shù),函數(shù)中聲明的變量),調(diào)用結(jié)束后會(huì)自動(dòng)銷(xiāo)毀。
5.遞歸函數(shù)
自己調(diào)用自己的函數(shù)
循環(huán)能做的遞歸都可以做,但是能用循環(huán)的就不要用遞歸
三個(gè)步驟:
a.找臨界值,在這要讓函數(shù)結(jié)束
b.找出f(n)和f(n-1)的關(guān)系
c.使用f(n-1)去實(shí)現(xiàn)f(n)的功能
2??模塊的使用
python中一個(gè)py文件就是一個(gè)模塊。
可以通過(guò)import或者from-import在一個(gè)模塊中去使用另一個(gè)模塊的內(nèi)容
代碼執(zhí)行到import的時(shí)候,會(huì)將import后面的模塊的內(nèi)容執(zhí)行一遍
import 模塊名 ---> 將模塊中所有的內(nèi)容都導(dǎo)入,并且可以在當(dāng)前模塊中通過(guò)'模塊名.'的方式去使用模塊中的所有全局變量
from 模塊名 import 變量1,變量2,... ---> 模塊中所有的內(nèi)容都導(dǎo)入。但是只能使用import后面的變量
from 模塊名 import * ---> 將模塊中所有的內(nèi)容都導(dǎo)入,可以直接使用模塊中所有的全局變量
import test1
from test1 import text_a
print(text_a,test1.text_a)
print(test1.text_a)
2.重命名
import 模塊名 as 新的模塊名
from 模塊名 import 變量名 as 新的名字
import test1 as TS
print(TS.text_a)
3.import:
可以檢查被導(dǎo)入的內(nèi)容之前是否以及導(dǎo)入過(guò),如果已經(jīng)導(dǎo)入過(guò),不會(huì)再次導(dǎo)入
導(dǎo)入多次,但是只執(zhí)行一次。多種導(dǎo)入的效果可以同時(shí)生效
3??關(guān)于選擇性導(dǎo)入(阻止導(dǎo)入)
import test1
1.阻止導(dǎo)入的方法:
if __name__ == '__main__':
代碼塊(不希望被別的模塊導(dǎo)入執(zhí)行的代碼寫(xiě)在這兒)
說(shuō)明:
代碼塊 ---> 直接執(zhí)行當(dāng)前模塊,代碼會(huì)被執(zhí)行。如果在別的模塊中導(dǎo)入,代碼不會(huì)執(zhí)行
2.每一個(gè)模塊都有一個(gè)name屬性,這個(gè)屬性的默認(rèn)值是當(dāng)前模塊對(duì)應(yīng)的py文件的文件名。
當(dāng)前模塊正在被執(zhí)行的時(shí)候,系統(tǒng)會(huì)自動(dòng)將模塊的name屬性變成'main'
3.什么時(shí)候使用模塊
將具有相同的功能的函數(shù)和數(shù)據(jù)封裝到一起
4??什么是迭代器
1.什么是迭代器(iter())
迭代器是python中一種容器類(lèi)的數(shù)據(jù)類(lèi)型。是屬于序列。沒(méi)有具體點(diǎn)字面量,可以將其他的序列轉(zhuǎn)換成迭代器:iter(序列)
2.迭代器的特點(diǎn)
他只能通過(guò)next方法去一個(gè)一個(gè)按順序的獲取迭代器中的元素,取出后迭代器中就不存在這個(gè)元素類(lèi)
iter1 = iter('asda12')
print(next(iter1))
for x in iter1:
print(x)
print(next(iter1)) # StopIteration 迭代器為空在用next()從迭代器中取值報(bào)的錯(cuò)
"""
next()
迭代器.__next__()
"""
iter2 = iter(('hjj', 2, 3))
print(iter2.__next__())
5??生成器和迭代器
1.什么是生成器
生成器就是迭代器,但是迭代器不一定是生成器
生成式就是一種生成器的一種特殊形式:(for 變量 in 序列)
產(chǎn)生一個(gè)生成器,生成器中可以生成的數(shù)據(jù)是數(shù)字0~9(每個(gè)元素是數(shù)字)
ge1 = (x for x in range(10))
print(ge1)
for x1 in ge1:
print(x1)
ge2 = ([x2, x2*2] for x2 in 'abddsc')
for x2 in ge2:
print(x2)
ge3 = (x for x in range(5) if x % 2)
2.生成器就是函數(shù)體中有yield關(guān)鍵字的函數(shù)
--->(函數(shù)中只要有yield,那么調(diào)用這個(gè)函數(shù)不再是執(zhí)行函數(shù)體并且獲取返回值,而是產(chǎn)生一個(gè)生成器)
通過(guò)next獲取生成器的元素的時(shí)候,回去執(zhí)行生成器對(duì)應(yīng)的函數(shù)的函數(shù)體,執(zhí)行到y(tǒng)ield,并且將yield后面的值最為返回值()
后,飯后保存當(dāng)前結(jié)束的位置,下一次獲取元素的時(shí)候會(huì)接著上次絕書(shū)的位置往后執(zhí)行
生成器可以當(dāng)成序列來(lái)使用
def func1(n1):
print('213')
for x2 in range(n1+1):
print(x2)
yield x2
ge4 = func1(10)
for x in range(10):
print(next(ge4))
def func2():
for x in range(101):
yield x
ge5 = func2()
for x in range(10):
print('--', next(ge5))
6??文件的讀和寫(xiě)
使用本地文件可以做數(shù)據(jù)的持久化(本地化) -->數(shù)據(jù)庫(kù)文件\txt、json、plist、二進(jìn)制文件
1.文件操作 -- 讀寫(xiě)操作
讀 -> 取出文件中的數(shù)據(jù)
寫(xiě) -> 將數(shù)據(jù)寫(xiě)到文件中
所有文件操作的過(guò)程:打開(kāi)文件 --> 操作文件 --> 關(guān)閉文件
2.打開(kāi)文件和關(guān)閉文件
open(file, mode='r', encoding=None)
a.file -> 文件路徑(必須傳參),決定需要打開(kāi)的是那個(gè)文件
絕地路徑:
相對(duì)路徑:./相對(duì)路徑(相對(duì)路徑是對(duì)當(dāng)前py文件對(duì)應(yīng)的文件夾)
./ -->當(dāng)前文件
b.mode -> 文件打開(kāi)方式(不同的操作對(duì)應(yīng)不同的打開(kāi)方式)
'r' --> read 以只讀的形式打開(kāi)文件
'rb'/'br' --> 讀操作,讀出來(lái)的數(shù)據(jù)是二進(jìn)制形式的數(shù)據(jù)
'w' --> 以寫(xiě)的形式打開(kāi)文件
'bw'/'wb' --> 寫(xiě)操作,將二進(jìn)制數(shù)據(jù)寫(xiě)入文件
'a' --> 寫(xiě)操作,追加的意思
c.encoding -> 文本文件的編碼方式
utf-8 :幾乎支持所有的語(yǔ)言文字
gbk :只支持英文
d.open函數(shù)的返回值,就是被打開(kāi)的文件對(duì)象
關(guān)閉文件:文件對(duì)象.close()
f1 = open('./test.txt', 'r', encoding='utf_8')
----------------文件的讀操作
1.讀文件中的內(nèi)容
文件對(duì)象.read() --> 從文件讀寫(xiě)位置開(kāi)始讀到文件結(jié)束,返回讀到的結(jié)果
文件對(duì)象.readline() --> 讀一行
文件對(duì)象.readlines() --> 返回一個(gè)列表,列表的元素是文件中每一行的內(nèi)容
content = f1.read()
print(type(content), content)
# contend = f1.readlines()
# print(contend)
2.關(guān)閉文件
f1.close()
----------------文件的寫(xiě)操作
1.打開(kāi)文件
'w' -> 將字符串寫(xiě)入文件中,完全覆蓋文件原來(lái)的內(nèi)容
'wb'/'bw' -> 將二進(jìn)制寫(xiě)入文件中,完全覆蓋文件原來(lái)的內(nèi)容
f2 = open('./test.txt', 'ww', encoding='utf-8')
寫(xiě)入文件
f2.write(content + 'hello world')