第十一天:生成器和模塊

一、生成器

定義

生成器就是迭代器中的一種; 生成器作為容器它保存的不是數(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)
最后編輯于
?著作權(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ù)。

友情鏈接更多精彩內(nèi)容