1.生成式
格式1: - 結(jié)果是一個(gè)生成器(迭代器)
表達(dá)式 for 變量 in 序列
--> 展開:
def func():
for 變量 in 序列:
yield 表達(dá)式
注意: 表達(dá)式的結(jié)果就是每次循環(huán)生成器產(chǎn)生的數(shù)據(jù)
這兒的for循環(huán)可以控制生成器產(chǎn)生的數(shù)據(jù)的個(gè)數(shù)心墅,和產(chǎn)生的值
gen1 = (10 for x in range(10))
print(gen1)
for x in range(2):
print(next(gen1))
格式2:
表達(dá)式 for 變量 in 序列 if 條件語句
展開:
def func():
for 變量 in 序列:
if 條件語句:
yield 表達(dá)式
gen3 =(x for x in range(3) if x % 2)
print(next(gen3))
M = [i for i in range(1, 100) if i % 2 != 0] # 將一個(gè) list 映射為另一個(gè) list瞧壮,每個(gè)元素設(shè)為變量i
print(M)
b = (i for i in range(1, 10) if i % 2 == 0)
print(b)
a = [1 for i in range(1, 100) if i % 2 == 0] # 將列表range(n)映射到列表x瘩将,每個(gè)元素設(shè)為常量1
print(a)
squared = {x for x in [1, 1, 2]}
print(squared)
交換字典的鍵值對(duì)
dict1 = dict((x, y) for y, x in {'a': 1, 'b': 2}.items())
print(dict1)
運(yùn)行:
image.png
2.模塊的使用
1.什么是模塊
python中一個(gè)py文件就是一個(gè)模塊
函數(shù) - 對(duì)功能進(jìn)行封裝 - 獲取當(dāng)前時(shí)間對(duì)應(yīng)的代碼封裝到函數(shù)中
模塊 - 對(duì)多個(gè)功能和數(shù)據(jù)進(jìn)行封裝 - 將所有和時(shí)間相關(guān)的函數(shù)或者變量放到一個(gè)py文件中
包 - 對(duì)多個(gè)模塊進(jìn)行封裝 - 將所有和時(shí)間相關(guān)的py文件放到一個(gè)文件夾中
什么是包 : 含有init.py文件的文件夾
2.怎么關(guān)聯(lián)多個(gè)模塊
方式1:
import 模塊名 - 將指定的模塊導(dǎo)入到當(dāng)前模塊中(模塊名就是py文件名)
說明:
a.執(zhí)行import時(shí)垫桂,會(huì)執(zhí)行對(duì)應(yīng)模塊的py文件中的代碼
b.import導(dǎo)入模塊時(shí)焚虱,會(huì)檢查當(dāng)前模塊之前是否已經(jīng)導(dǎo)入過堰燎,如果已經(jīng)導(dǎo)入過楣责,就不再導(dǎo)入
c.通過import 導(dǎo)入模塊后,可以通過 模塊名.全局變量 去使用被導(dǎo)入的模塊中的內(nèi)容
import test1
a = test1.test1_a
print(a)
方式2:
from 模塊名 import 變量/函數(shù)名 - 導(dǎo)入模塊中指定的變量或者函數(shù)
說明:
a.執(zhí)行到導(dǎo)入模塊的語句時(shí)坯台,還是會(huì)執(zhí)行對(duì)應(yīng)模塊的py文件中的代碼
b.導(dǎo)入模塊時(shí)炬丸,會(huì)檢查當(dāng)前模塊之前是否已經(jīng)導(dǎo)入過,如果已經(jīng)導(dǎo)入過捂人,就不再導(dǎo)入
c.使用時(shí)只能使用import后面的變量/函數(shù)御雕,而且用的時(shí)候不用在前面模塊名
d.import后面可以使用逗號(hào)將多個(gè)變量/函數(shù)隔開,也可以使用*將模塊中所有的全局變量和函數(shù)一起導(dǎo)入
from test1 import test1_a
print(test1_a)
3.重命名
import 模塊名 as 新模塊名
from 模塊名 import 變量名/函數(shù)名 as 新變量名/函數(shù)名
4.包的導(dǎo)入中的代碼
import 包名 - 會(huì)直接執(zhí)行包中的init.py文件
from 包名 import 模塊名
from 包名.模塊名 import 變量
import test
import test.test1
print(test.test1.test1_a)
運(yùn)行:
image.png
3.選擇性導(dǎo)入
在模塊中將不需要其他模塊導(dǎo)入和執(zhí)行的代碼寫到
if name == 'main' 語句中滥搭。這樣就能阻止代碼被其他模塊執(zhí)行
聲明在這里面的變量也不會(huì)被其他模塊導(dǎo)入
原理:因?yàn)槊總€(gè)模塊都有一個(gè)name,他的默認(rèn)值是模塊對(duì)應(yīng)的py文件的名字酸纲。
當(dāng)正在直接執(zhí)行模塊的時(shí)候,模塊的name屬性值就會(huì)變成'main'
import test1
4.文件操作
r"""
1.數(shù)據(jù)本地化
將數(shù)據(jù)以文件的形式瑟匆,存儲(chǔ)到本地磁盤中闽坡。
(程序中變量保存的數(shù)據(jù)都是存到內(nèi)存中,當(dāng)程序運(yùn)行結(jié)束愁溜,內(nèi)存中的數(shù)據(jù)全部銷毀)
常見的數(shù)據(jù)本地化方式:
二進(jìn)制文件(包含音頻疾嗅,視頻,壓縮包等)冕象,普通文本文件,json和xml文件,數(shù)據(jù)庫(kù)文件
2.文件操作(讀和寫)
文件操作的步驟:
打開文件(新建文件) - 文件操作(讀和寫) - 關(guān)閉文件
3.打開文件
open(file,mode='r',...,encoding=None) - 返回的是被打開的文件對(duì)象(文件句柄)
說明:
file - 字符串代承;需要打開的文件的路徑(可以是絕對(duì)路徑,也可以是相對(duì)路徑)
絕對(duì)路徑(一般不用):C:\Users\hai\AppData\Local\SogouExplorer(完整路徑)
相對(duì)路徑:相對(duì)當(dāng)前的py文件對(duì)應(yīng)的目錄
aaa.txt 或者 ./aaa.txt
./ - 當(dāng)前目錄(可省略)
../ - 當(dāng)前目錄的上層目錄
.../ - 當(dāng)前目錄的上上層目錄
......
mode - 打開方式渐扮;打開文件后不同的操作论悴,對(duì)應(yīng)的打開方式不一樣
'r' - 默認(rèn)值,以讀的方式打開文件墓律,讀出來的是文本(字符串)
'w' - 以寫的方式打開文件
'rb'膀估、'br' - 以讀的方式打開,讀出來的數(shù)據(jù)是二進(jìn)制
'wb'耻讽、'bw' - 以寫的方式打開,寫二進(jìn)制數(shù)據(jù)到文件中
'a' - 以寫的方式打開,追加(寫字符串)
'+' - 以讀寫的方式打開
encoding - 文件的編碼方式亩歹,一般賦值為'utf-8'
utf-8 - 支持中文編碼
gbk - 不支持中文編碼
以讀的形式打開一個(gè)文本文件象迎,保存到變量f中。對(duì)f操作就是對(duì)被打開的文件進(jìn)行操作
"""
f = open('aaa.txt', encoding='utf-8')
"""
文件的讀操作
文件對(duì)象.read() - 從文件讀寫位置開始讀到文件結(jié)尾(默認(rèn)獲取文件中所有的內(nèi)容)
文件對(duì)象.readline() - 讀一行內(nèi)容
"""
?讀文件所有的內(nèi)容
content = f.read()
print(content)
?讀一行
content = f.readline()
print('===:', content)
?練習(xí):將文件中的內(nèi)容讀完祖驱,要求一行一行的讀
content = f.readline()
while content:
print(content)
content = f.readline()
5.文件的寫操作
文件對(duì)象.write(字符串) - 將字符串內(nèi)容寫到文件中(會(huì)完全覆蓋原文件中的內(nèi)容)
f = open('aaa.txt', 'w', encoding='utf-8')
f.write('你好嗎握恳?')
6.關(guān)閉
文件對(duì)象.close() - 關(guān)閉指定的文件
f.close()
print(f.closed) # 判斷文件是否關(guān)閉
5.二進(jìn)制文件的讀和寫
1.open方法的另外一種寫法:
with open(文件路徑, 讀寫方式, encoding=編碼方式) as 文件對(duì)象:
文件操作
打開文件,將文件存在文件對(duì)象中捺僻。當(dāng)文件操作完成會(huì)自動(dòng)關(guān)閉
with open('aaa.txt', encoding='utf-8') as f:
print(f.read())
print(f.closed)
2.二進(jìn)制文件的讀
普通文本文件也可以以二進(jìn)制的形式讀和寫
只要將讀寫方式設(shè)置為'rb'/'br' 就可以了乡洼。讀出來的數(shù)據(jù)直接就是二進(jìn)制數(shù)據(jù)
注意: 二進(jìn)制操作不能設(shè)置編碼方式(編碼方式只是針對(duì)文本文件)
with open('aaa.txt', 'rb') as f:
content = f.read()
print(content, type(content))
with open('image.jpg', 'rb') as f:
content = f.read()
print(content, type(content))
with open('imge.jpg', 'wb') as f:
f.write(content)
3.文件不存在
當(dāng)以讀的方式打開一個(gè)不存在的文件,會(huì)報(bào)錯(cuò)誤
當(dāng)以寫的形式打開一個(gè)不存在文件匕坯,不會(huì)報(bào)錯(cuò)束昵,并且會(huì)創(chuàng)建這個(gè)文件
6.文件操作的應(yīng)用
使用數(shù)據(jù)的時(shí)候去本地文件中去數(shù)據(jù)
數(shù)據(jù)修改后,將新的數(shù)據(jù)更新到本地文件中
?寫一個(gè)程序統(tǒng)計(jì)當(dāng)前程序執(zhí)行次數(shù).
with open('num.txt') as f:
count = int(f.read()) # 讀到的是字符串
print('第%d次執(zhí)行程序' % count)
count += 1
with open('num.txt', 'w') as f:
f.write(str(count))