什么是迭代器(iter)
迭代器是容器型数据类型;
打印一个迭代器无法查看这个迭代器中所有的元素,迭代器无法通过len获取元素个数;
如果想要使用迭代器中的元素,必须将元素从迭代器中取出,而且在取的时候只能从上往下按顺序取,取一个少一个,取出来的数据无法再放回迭代器。
创建迭代器
1)用iter将其他序列转换成迭代器
2)创建生成器
i1 = iter('abc')
i2 = iter([10, 20, 30])
print(i1, i2) #
print(len(i1)) #报错!object of type 'str_iterator' has no len()
迭代器的查操作
不管以什么样的方式获取到了迭代器中元素,那被获取到的元素一定会从迭代器中消失。
得到就消失!!!
1)获取单个元素:next(迭代器)
print(next(i1)) # a
print(next(i1)) # b
print(next(i1)) # c
print(next(i1)) # 报错!StopIteration
2)遍历
for i in i2:
print(f'{i}') #10 20 30
3)迭代器转换成序列
i3 = iter('hello')
result = list(i3)
print(result) #['h', 'e', 'l', 'l', 'o']
print(next(i3)) # 报错!StopIteration
什么是生成器
生成器是容器型数据类型(具备创建多个数据的能力,而不是保存多个数据的能力)。
打印生成器无法查看所有的元素,生成器也不支持len操作。
如果需要使用生成器中的数据,必须将数据取出来,而且取一个元素就少一个元素。
生成器获取数据的方式和迭代器一样。
创建生成器
生成器保存的并不是数据本身,而是产生数据的算法。
怎么创建生成器:调用带有yield关键字的函数,就可以得到一个生成器。
如果被调用的函数的函数体中有yield(不管有没有效,只要有yield),调用函数的时候不会执行函数体,也不会获取函数返回值,而是得到一个生成器对象(函数调用表达式的值就是生成器)
创建生成器对应的函数
生成器创建数据的个数和数据的值,由在执行生成器对应的函数的函数体的时候会遇到几次yield,每次遇到yield的时候对应的数据来决定。
是次数,不是个数!!!
执行函数体会遇到几次yield对应的生成器就可以创建多少个数据;
每次遇到yield,yield后面的值是什么,对应的元素的值就是什么。
def func2():
yield 100
yield 200
yield 300
gen2 = func2()
print(next(gen2)) #100
print(next(gen2)) #200
print(next(gen2)) #300
# print(next(gen2)) #报错!
def func3(sub):
for i in range(1, 100):
yield f'{sub}{i:0>3}'
gen3 = func3('python') #python001
print(next(gen3))
for i in gen3:
print(f'i:{i}')
结果:
i:python002
...
i:python099
生成器产生数据的原理
调用函数创建生成器的时候是不会执行函数体,获取生成器中的元素才会执行函数体。
每次在执行函数体的时候从开始位置开始,执行到yield就停下来,并且将yield后面的数据作为获取到的元素。
def func4():
print('====1====')
yield 10
print('====2====')
yield 20
gen4 = func4()
print(next(gen4))
print('----')
print(next(gen4))
结果:
====1====
10
----
====2====
20
什么是模块
python中一个py文件就是一个模块。
怎么在一个模块中使用另外一个模块内容
前提:被使用的模块的模块名(py文件的文件名)必须符合变量名的要求。
使用原则:先导入才能使用(能被别的模块使用的内容只能是全局变量)。
导入模块
1)导入方式1🌸
import 模块名 导入指定模块,导入可以通过'模块名.xxx'的方式使用这个模块中所有的全局变量
import test01
print(test01.a)
test01.func1()
print(test01.name)
2)导入方式2🌸
from 模块名 import 变量1,变量2,变量3,... 导入指定模块中的指定变量,导入后可以直接使用所有指定的变量
from test01 import a, func1, name
print(a)
func1()
print(name)
3)导入方式3🌸
from 模块名 import * 导入指定模块中所有的变量,导入后可以直接使用所有变量
from test01 import *
print(a) #100
func1() #test中的函数
print(name) #test
4)导入方式4🌸
import 模块名 as 新模块名 导入模块的时候对模块重命名,通过'新模块名.xxx'的方式使用模块中所有的全局变量
1)模块名与模块里的变量冲突
2)名字太长或者不习惯想换一个
import test01 as te
print(te.a)
te.func1()
print(te.name)
5)导入方式5🌸
from 模块名 import 变量1 as 新变量1,变量2 as 新变量2,... 对导入的变量重命名,重命名只对此次导入使用有效
from test01 import a as nam
print(nam)
导入模块的原理
不管以什么样的方式导入了模块或者模块中的内容,系统都会在导入模块的时候进入对应的模块,将模块中的代码执行一遍。
如果只导入一部分变量也会执行整个模块文件。
原理存在的问题:可以存在在导入模块的时候执行一些完全没有必要执行的代码。
导入模块的时候选择性执行代码:
在被导入的模块中添加指定的if语句(if __name__ == '__main__':)(_ _读法:当嘚儿),将不 需要被别的模块执行的代码放入到这个if语句中。
什么是包
包就是包含_ _ init _ _.py文件的文件夹。请添加图片描述

包就是用来管理py文件,对py文件按照特定的方式进行分类。
怎么使用包中的内容

_ _ init _ _.py文件有变量b=12;
time1.py有变量a=100
1)导入方式1🌸
import 包名 导入指定的包(必须是包,文件夹无意义),导入后可以通过'包名.xxx'的方式使用__init__.py文件中的所有内容
import timeMangen
print(timeMangen.b) #12
2)导入方式2🌸
import 包名.模块名 导入指定包中的指定模块(文件夹也可以使用)通过'包名.模块名.xxx'(太麻烦了,重命名变简单些)
直接导入包中的模块,然后重命名
import timeMangen.time1
print(timeMangen.time1.a) #100
import timeMangen.time1 as t1
print(t1.a) #100
3)导入方式3🌸
from 包名 import 模块名1,模块名2,... 直接导入包中指定多个模块
‘模块名.变量名’
from timeMangen import time1
print(time1.a) #100
4)导入方式4🌸
from 包名.模块名 import 变量1,变量2,... 导入指定包中指定模块中的指定内容
直接使用变量
from timeMangen.time1 import a
print(a) #100
_ _ init _ _.py文件
1)创建快捷键

在_ _ init _ _.py里面先导入,化简
1)先在__init__.py文件导入
from timeMangen.img.img import c
2)再在需要导入的文件直接导入变量
from timeMangen import c,b
3)使用
print(b)
print(c)
2)封装通用工具
把通用的工具写在该文件中。
也可以不写
异常
异常就是错误!
执行程序的过程中,如果出现异常,会中断程序的执行(让程序提前结束)。
exit()让程序正常退出。
异常捕获
让程序在出现异常的时候,不崩溃,还可以接着走往后执行。
注意:不要滥用异常捕获。如果是因为使用者使用不当导致程序出现异常,又希望在出现异常程序可以继续执行才使用异常捕获。
1)结构1🌸
try:
代码段1(需要捕获异常的代码段)
except:
代码段2(捕获到异常需要执行的代码段)
执行过程:先执行代码段1,如果出现异常直接马上执行代码段2;如果没有出现异常,就不执行代码段2
try:
age = int(input('请输入年龄:'))
if age >= 18:
print('成年')
else:
print('未成年')
except:
print('年龄输入异常!')
捕获所有的异常。
2)结构2🌸
try:
代码段1(需要捕获异常的代码段)
except 异常类型:
代码段2(捕获到异常需要执行的代码段)
捕获指定异常。最保险。
3)结构3🌸
try:
代码段1(需要捕获异常的代码段)
except (异常类型1,异常类型2,...):
代码段2(捕获到异常需要执行的代码段)
同时捕获多种异常。
4)结构4🌸
try:
代码段1(需要捕获异常的代码段)
except 异常类型1:
代码段2(捕获到异常需要执行的代码段)
except 异常类型2:
代码段3(捕获到异常需要执行的代码段)
...
捕获所有的异常。
2)结构2🌸
try:
代码段1(需要捕获异常的代码段)
except 异常类型:
代码段2(捕获到异常需要执行的代码段)
捕获指定异常。最保险。
3)结构3🌸
try:
代码段1(需要捕获异常的代码段)
except (异常类型1,异常类型2,...):
代码段2(捕获到异常需要执行的代码段)
同时捕获多种异常。
4)结构4🌸
try:
代码段1(需要捕获异常的代码段)
except 异常类型1:
代码段2(捕获到异常需要执行的代码段)
except 异常类型2:
代码段3(捕获到异常需要执行的代码段)
...
同时捕获多种异常。