11.生成器,模块,加密算法

一.生成器

1。什么是生成器?
2.生成器就是迭代器的一种、
3.生成器作为容器它保存的不是数据,而是产生数据的一种。
4.怎么创建生成器?

注意:调用带有yield的函数,就可以的到一个生成器。

注意函数只要有yield,不管遇不遇的到,调用这个函数都是不会执行函数体的,并且得到一个生成器。

def func1():
    # print("======")
    yield 10
    # print("+++++++")
    yield 100
    yield  10900
    print("============")
    yield  10
    yield  100
    yield  "3243243"

    print("...........")
    yield True
re=func1()

5.生成器怎么产生数据,(怎么确定生成器中的元素).
一个生成器能够产生多少数据和那些数据,看执行完生成器关联的函数的函数体会遇到几次yield.
能够遇到几次yield,生成器就可以产生多少个数据,yield后面的元素就是产生的数据。
6.可以使用next一个一个的获取。

print(next(re))
print(next(re))
print(next(re))
print(next(re))
print(next(re))
print(next(re))
print(next(re))

7.生成器是如何获取元素的:
"""获取第一个元素的时候从函数的第一条语句开始执行,执行到第一个yield为止,并且的到当前的元素。
直到开始获取下一个yield,当从执行开始到函数结束,都没有遇到yield,就会报错
StopIteration
8.控制yield 次数

def func(n):
    for x in range(1,n):
        yield  x*2
print(next(func(4)))
print(next(func(4)))

9.上面这种调用,每次都是产生第一个,不变,因为每次都是调用的这个生成器,
只有你给他赋值了,a=func(n),这样每次产生的才是不一样的。

练习:写一个生成器,班级人数,前缀。
def student(pre,n):
    length=len(str(n))
    for i in range(1,n+1):
      yield  pre+str(i).zfill(length)

s=student("python",30)
for i in s:
    print(i)
zfill___字符串.zfill(宽度),  字符串默认填充这个宽度。

10.生成式:

生成式就是生成器,只是在写法上更简洁,只有一行代码。

语法一:
生成器=(表达式 for 变量 in 序列)

展开成普通的就是:
def 函数名();
for 变量 in 序列:
yield 表达式
语法二:
生成器=(表达式 for 变量 in 序列 if 条件语句)
展开就是:
def 函数名():
for i in 序列:
if 条件语句:
yield 条件语句
语法三:
生成器=( 表达式 for 变量1 in 序列1 for 变量2 in 序列2)
展开:
def 函数名():
for 变量1 in 序列1:
for 变量2 序列2:
yield 表达式

练习:取出1-10数字:
生成器方法:
def num(n):
    for i  in range(1,11):
        yield i


gen1=num(10)
for x in gen1:
    print(x)
生成式方法:
gen2=(num*2 for num in range(1,11))
# 上面这个展开
def fun2(n):
    for i in range(1,11):
        yield num(*2)
for i in gen2:
    print(i)
gen4=(x for x in range(0,10) if x %2)

上面这个的生成式得到的是1,3,7,9
因为他是if 后面的语句成立,才会执行,而这个不成立。
11.列表生成式:
将上面的所有的生成式的语法中的()变成[],结果就会由生成器变成列表。

   gen2=(num*2 for num in range(1,11))
   gen3=[num*2 for num in      range(1,11)]=list(gen2),这两个是相等的。

二 模块

1什么是模块,
一个py文件就是一个模块。
2模块的相互使用。如果想要在一个模块中使用另一个模块,需要在当前导入另一个模块
怎么导入: 模块名导入应该放在开头, 顺序 系统 三方 自定义
import test1
from test1 import a,func1
from test1 import*

1.第一种导入方式
import 模块名
import 模块名 ---导入后可以使用被导入的所有的全局变量。
使用方式:模块名.变量名 方式去使用
2.第二种导入方式 from 模块名 import 变量1,变量2
3.from 模块名 import * ---导入模块中的所有的变量,使用直接用变量名。

4.重命 名用 as 就行了 test as new_test 在这个模块里面改了,其他地方还是一样的。
对模块进行重命名, import 模块名 as 新模块名。

5.对模块名中变量重命名 from 模块名 import 变量1 as 新的名字,变量2 as 新的变量2.。。。。。

三 导入模块的原理

1.不管是通过import 直接导入模块,还是通过from import 去导入模块的变量。当代码执行到导入语句的时候, 系统会自动进入模块,再回到当前的执行,
2导入模块就是先执行一到,有些是我想执行的,有些不想执行。
3.阻止导入:模块中写入,导入的时候不执行,模块中的会执行。
if name == 'main':
如果将模块中的代码写入if语句中,那么这个代码在被导入的时候不会运行,直接在当前的模块中会执行。想要用必须从这里面拿出来。
这个就是为了解决导入模块,模块本身会执行的时候的问题,不想执行就放进去。
4.为什么 if name == 'main':能阻止。
原理:在创建模块的时候,系统会自动给模块添加name属性,会来保存当前模块的名字,name属性的默认值是当前文件的文件名,
当直接运行当前模块的时候,这个模块的name属性的值会变成main,运行完成的时候又变回文件名。

四。什么是包

包含_ _init _ _.py文件的文件夹:包是用来管理模块的

2如何创建自己的包
1创建一个文件夹,在写一个_ init _
2.直接创建一个包。
3导入整个包的时候会执行_ init ,导入包中的模块也会执行 init _
所以你在导入包的时候想要导入所有的模块以及其他的,就把这些放入_ _ init_ _
4.在_ init _ 也可以给包中的模块等创建快捷方式。

五。字符串与二进制的相互转换。

1.字符串转二进制:
python中bytes就是二进制对应的数据类型。
1.字符串转二进制:
bytes(字符串,encoding="utf-8)
字符串.encode()
2.二进制转字符串:
str(二进制,encode="utf-8")
二进制.decode(encodeing="utf-8")
hashlib加密方式
1.加密的方式是不可逆的。
2.是python提供的用来通过哈希算法进行的加密的库,哈希算法又叫离散算法,主要包含md5,sha两种算法。
3.哈希算法加密特点:
"""
1.密文(摘要)是 不可逆的,
2.相同的数据通过相同的算法,产生的摘要是一样的。
3.不同长度的数据,通过同一种算法,产生的密文的长度是一样的。

注意数据必须是二进制的数据

4.怎么产生数据的摘要:
1)创建hasshlib对象 :hashlib.md5()
"""
创建hashlib对象
hash=hashlib.md5()
"""
(2)添加需要产生摘要的数据:哈希对象.update(数据)
"""
pw="123456胜的说法是打发多负的沙发斯蒂芬少的发生地方"
hash.update(pw.encode())
"""
(3)生成摘要(密文):哈希对象.hexdigest()
"""
result=hash.hexdigest()
print(result)

mima=hashlib.md5()
text="dfsadfdsa"
mima.update(text.encode())
rest=mima.hexdigest()
print(rest)

你可能感兴趣的:(11.生成器,模块,加密算法)