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)
# 交換字典的鍵值對
dict1 = dict((x, y) for y, x in {'a': 1, 'b': 2}.items())
print(dict1)
運(yùn)行:
2.模塊的使用
1.什么是模塊
python中一個(gè)py文件就是一個(gè)模塊
函數(shù) - 對功能進(jìn)行封裝 - 獲取當(dāng)前時(shí)間對應(yīng)的代碼封裝到函數(shù)中
模塊 - 對多個(gè)功能和數(shù)據(jù)進(jìn)行封裝 - 將所有和時(shí)間相關(guān)的函數(shù)或者變量放到一個(gè)py文件中
包 - 對多個(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í)捻爷,會執(zhí)行對應(yīng)模塊的py文件中的代碼
b.import導(dǎo)入模塊時(shí)讳嘱,會檢查當(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í)却舀,還是會執(zhí)行對應(yīng)模塊的py文件中的代碼
b.導(dǎo)入模塊時(shí)虫几,會檢查當(dāng)前模塊之前是否已經(jīng)導(dǎo)入過,如果已經(jīng)導(dǎo)入過挽拔,就不再導(dǎo)入
c.使用時(shí)只能使用import后面的變量/函數(shù)辆脸,而且用的時(shí)候不用在前面模塊名
d.import后面可以使用逗號將多個(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 包名 - 會直接執(zhí)行包中的 init.py文件
from 包名 import 模塊名
from 包名.模塊名 import 變量
import test
import test.test1
print(test.test1.test1_a)
運(yùn)行:
3.選擇性導(dǎo)入
在模塊中將不需要其他模塊導(dǎo)入和執(zhí)行的代碼寫到
if __ name __ == ' main ' 語句中螃诅。這樣就能阻止代碼被其他模塊執(zhí)行
聲明在這里面的變量也不會被其他模塊導(dǎo)入
原理:因?yàn)槊總€(gè)模塊都有一個(gè)name,他的默認(rèn)值是模塊對應(yīng)的py文件的名字啡氢。
當(dāng)正在直接執(zhí)行模塊的時(shí)候,模塊的name屬性值就會變成'main'
import test1
4.文件操作
r"""
1.數(shù)據(jù)本地化
將數(shù)據(jù)以文件的形式术裸,存儲到本地磁盤中倘是。
(程序中變量保存的數(shù)據(jù)都是存到內(nèi)存中,當(dāng)程序運(yùn)行結(jié)束袭艺,內(nèi)存中的數(shù)據(jù)全部銷毀)
常見的數(shù)據(jù)本地化方式:
二進(jìn)制文件(包含音頻搀崭,視頻,壓縮包等)匹表,普通文本文件,json和xml文件,數(shù)據(jù)庫文件
2.文件操作(讀和寫)
文件操作的步驟:
打開文件(新建文件) - 文件操作(讀和寫) - 關(guān)閉文件
3.打開文件
open(file,mode='r',...,encoding=None) - 返回的是被打開的文件對象(文件句柄)
說明:
file - 字符串门坷;需要打開的文件的路徑(可以是絕對路徑,也可以是相對路徑)
絕對路徑(一般不用):C:\Users\hai\AppData\Local\SogouExplorer(完整路徑)
相對路徑:相對當(dāng)前的py文件對應(yīng)的目錄
aaa.txt 或者 ./aaa.txt
./ - 當(dāng)前目錄(可省略)
../ - 當(dāng)前目錄的上層目錄
.../ - 當(dāng)前目錄的上上層目錄
......
mode - 打開方式袍镀;打開文件后不同的操作默蚌,對應(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中度帮。對f操作就是對被打開的文件進(jìn)行操作
"""
f = open('aaa.txt', encoding='utf-8')
"""
文件的讀操作
文件對象.read() - 從文件讀寫位置開始讀到文件結(jié)尾(默認(rèn)獲取文件中所有的內(nèi)容)
文件對象.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.文件的寫操作
文件對象.write(字符串) - 將字符串內(nèi)容寫到文件中(會完全覆蓋原文件中的內(nèi)容)
f = open('aaa.txt', 'w', encoding='utf-8')
f.write('你好嗎稿存?')
6.關(guān)閉
文件對象.close() - 關(guān)閉指定的文件
f.close()
print(f.closed) # 判斷文件是否關(guān)閉
5.二進(jìn)制文件的讀和寫
1.open方法的另外一種寫法:
with open(文件路徑, 讀寫方式, encoding=編碼方式) as 文件對象:
文件操作
打開文件笨篷,將文件存在文件對象中。當(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è)置編碼方式(編碼方式只是針對文本文件)
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è)不存在的文件率翅,會報(bào)錯(cuò)誤
當(dāng)以寫的形式打開一個(gè)不存在文件,不會報(bào)錯(cuò)袖迎,并且會創(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))