一、生成器
定義
生成器就是迭代器中的一種; 生成器作為容器它保存的不是數(shù)據(jù),而是產(chǎn)生數(shù)據(jù)的算法
1.創(chuàng)建生成器
調(diào)用帶有yield關(guān)鍵字的函數(shù),就可以得到一個生成器
def func1():
print('=====')
print('+++++')
return 100
if False:
yield
re = func1() # 這兒的re就是生成器
print(re) # <generator object func1 at 0x10830aeb8>
注意: 函數(shù)中只要有yield不管遇不遇得到,調(diào)用這個函數(shù)都不會執(zhí)行函數(shù)體,并且得到的是一個生成器對象
2.生成器產(chǎn)生數(shù)據(jù)
一個生成器能夠產(chǎn)生多少個數(shù)據(jù)和哪些數(shù)據(jù),看執(zhí)行完生成器關(guān)聯(lián)的函數(shù)的函數(shù)體會遇到幾次yield;遇到幾次yield生成器就可以產(chǎn)生多個數(shù)據(jù);
每次遇到y(tǒng)ield,yield后面的數(shù)據(jù)就是對應(yīng)的元素
def func2():
# print('=====')
yield 10
# print('++++')
yield 100
yield 1000
gen1 = func2()
for x in gen1:
print('x:', x) #共產(chǎn)生3個數(shù)據(jù)
3.生成器產(chǎn)生數(shù)據(jù)的規(guī)律
"""
生成器怎么獲取元素:
獲取第一個元素的時候從函數(shù)的第一條語句開始執(zhí)行,執(zhí)行到第一個yield為止,并且將yield后面的值作
為當(dāng)前獲取到的元素;獲取下一個元素的時候接著上次結(jié)束的往后執(zhí)行,直到遇到下一個yield為止,并且將
yield后面的值作為當(dāng)前獲取到的元素;以此類推...
如果從執(zhí)行位置開始到函數(shù)結(jié)束沒有遇到y(tǒng)ield就會報StopIteration的錯誤
"""
4.生成式
定義
生成式就是生成器;只是寫法上更簡潔,只有一行代碼
語法:
1)語法一:
生成器 = (表達(dá)式 for 變量 in 序列)
相當(dāng)于普通生成器:
def 函數(shù)名():
for 變量 in 序列:
yield 表達(dá)式
生成器 = 函數(shù)名()
2)語法二:
生成器 = (表達(dá)式 for 變量 in 序列 if 條件語句)
def 函數(shù)名():
for 變量 in 序列:
if 條件語句:
yield 表達(dá)式
生成器 = 函數(shù)名()
3)語法三
生成器 = (表達(dá)式 for 變量1 in 序列1 for 變量2 in 序列2)
def 函數(shù)名():
for 變量1 in 序列1:
for 變量2 in 序列2:
yield 表達(dá)式
生成器 = 函數(shù)名()
"""
列表生成式
"""
將上面生成式語法中所有的()變成[],結(jié)果就會由原來的生成器,變成列表
生成器 = (表達(dá)式 for 變量 in 序列)
[表達(dá)式 for 變量 in 序列] == list(生成器)
"""
二、模塊
1. 什么是模塊
python中一個py文件就是一個模塊
2.怎么使用其他模塊中的內(nèi)容(導(dǎo)入模塊)
在當(dāng)前模塊中導(dǎo)入其他模塊:
導(dǎo)入后能使用被導(dǎo)入的模塊的所有全局變量(普通全局變量,全局函數(shù),類),以‘模塊 名.變量名’的方式來使用模塊中的內(nèi)容
2.1導(dǎo)入:
a. import 模塊名
導(dǎo)入模塊的代碼應(yīng)該放在文件的開頭
b. from 模塊名 import 變量名1,變量名2......
導(dǎo)入后能使用import后面指定的全局變量;
使用時直接使用變量名
c. from 模塊名 import *
導(dǎo)入模塊中多有全局變量
使用時直接用變量名
d.對模塊進行重命名
import 模塊名 as 新模塊名
重命名后在當(dāng)前模塊中通過新名字來使用導(dǎo)入的模塊
e.對導(dǎo)入模塊中變量重命名
from 模塊名 import 變量名1 as 新變量名1,變量名2 as 新變量名2
不管時通過import直接導(dǎo)入模塊,還是通過from-import去導(dǎo)入模塊的變量。當(dāng)代碼執(zhí)行到導(dǎo)入模塊的語句時,系統(tǒng)會自動進入被導(dǎo)入的模塊中,執(zhí)行這個模塊中所有代碼;執(zhí)行完后再回到當(dāng)前模塊接著往后執(zhí)行
2.2 阻止導(dǎo)入
如果將模塊中的代碼寫入"if name == 'main '"這個if語句中,那么這個if語句代碼在被導(dǎo)入的時候不會執(zhí)行。直接運行當(dāng)前模塊的時候會執(zhí)行
3.包的使用
定義
包含"init .py"文件的文件夾;包是用來管理模塊的
導(dǎo)入
a. import 包名.模塊名.方法名/變量
b. import 包名.模塊名.方法名/變量 as 新名字(重命名)
c. from 包名 import 模塊名1,模塊名2......
d.from 包名.模塊名 import 方法名/變量
init文件的作用:
1.導(dǎo)入包中所有模塊
2.給包中所有模塊或模塊中所有變量創(chuàng)建快捷方式
4.hashlib的使用
定義
hashlib是python提供的用來通過哈希算法進行加密(產(chǎn)生摘要)的一個庫,哈希算法又叫離散算法,主要包含md5,sha兩種算法
哈希算法加密特點
1.加密后的密文(摘要)是不可逆的
2.相同的數(shù)據(jù)通過同一種算法產(chǎn)生的摘要是一樣的
3.不同長度的數(shù)據(jù)通過同一種算法產(chǎn)生的摘要的長度是一樣的
怎么產(chǎn)生數(shù)據(jù)的摘要
1.創(chuàng)建hashlib的對象
ha1 = hashlib.md5()
ha2 = hashlib.sha1()
2.添加需要產(chǎn)生摘要的數(shù)據(jù),生成密文
哈希對象.update(數(shù)據(jù)) ---數(shù)據(jù)必須是二進制數(shù)據(jù)
字符串轉(zhuǎn)二進制:
1).bytes(字符串,encoding = 'utf-8')
2).字符串.encode()
二進制轉(zhuǎn)字符串:
1).str(二進制數(shù)據(jù),encoding = 'utf-8')
2).二進制.decode(encoding = 'utf-8')
3.生成16進制摘要(密文):哈希對象.hexdigest()
作業(yè)
1. 寫一個生成式能夠產(chǎn)生的數(shù)據(jù)為: 1, 2, 27, 256, 3125,…, 9**9
for num in range(1, 10):
print(next(gen))
2. 寫一個生成式能夠產(chǎn)生1-10中所有半徑是偶數(shù)的圓的面積
gen = ((x/2)**2*pi for x in range(1, 11) if x % 2 == 0)
for num in range(1, 6):
print(next(gen))
3. 寫一個生成式交換字段的鍵和值,產(chǎn)生一個新的字典
dic = {'name': '張三', 'age': 25, 'gender': '男'}
gen = ([value, key] for key, value in dic.items())
list1 = []
for x in range(len(dic)):
list1.append(next(gen))
dic2 = dict(list1)
print(dic2)
最后編輯于 :2019.11.19 19:11:31
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者 【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。 平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。