一. 迭代器(iter)
1. 定义:
- 容器型数据类型,可以同时保存多个数据
- 不能直接用代码创建一个迭代器数据,只能将别的容器转换成迭代器
2.特点:
- 打印迭代器看不到里面的元素
- 不支持len操作
- 如果想要使用迭代器中的元素必须从迭代器中取走,取一个少一个。每次只能取一个元素
- 将迭代器转换成其他容器,迭代器就不能再次使用,因为元素被取完了
3. 获取迭代器中的元素(取一个少一个)
a. 获取一个元素:
i2 = iter([20,30,40,59,60,77])
print(next(i2)) #20
print(next(i2)) #30
b.遍历
i2 = iter([20,30,40,59,60,77])
for i in i2:
print(i)
二. 生成器
1. 定义:
- 是一个可以创建多个数据的容器(不具备同时保存多个数据的能力)(例如母鸡和鸡蛋关系)
2.特点:
- 打印生成器无法查看元素;
- 无法通过len统计元素个数
- 需要生成器中元素时,必须把元素取出来,取一个少一个。
3. 如何创建生成器
- 调用带有 'yield ' 关键字的函数就可以得到一个生成器对象
- 如果一个函数的函数体中有yield关键字,那么调用这个函数的时候不会执行函数体,也不会获取函数返回值。而是得到一个生成器对象。
def func1():
# yield
print('hello world')
return 100
print(func1())
'''
hello world
100
'''
def func1():
yield
print('hello world')
return 100
print(func1())
#<generator object func1 at 0x7fac600623c0>
4. 如何控制生成器产生的数据
- 一个生成器能创建多少个数据就看执行生成器对应的函数的函数体的时候会遇到几次yield,每次遇到yield的时候yield后面的数据就是生成器产生的值
def func2():
yield 100
yield 200
yield 300
g2 = func2()
print(list(g2))
#[100, 200, 300]
def func2():
yield 100
yield 200
return
yield 300
g2 = func2()
print(list(g2))
#[100,200]
5. 获取生成器的元素
- 和迭代器一样
def func2():
yield 100
yield 200
yield 300
g2 = func2()
print(next(g2)) #100
print(next(g2)) #200
print(next(g2)) #300
三. 包
1. 模块的定义:
- 模块就是py文件
2.如何在一个模块中使用另一个模块内容
- a. 被使用的模块的模块名必须符合变量名的要求(标识符不是关键字)
- b. 使用之前必须导入指定模块
3. 如何导入模块
- import 模块名(模块名就是python文件的名字)--- 导入指定模块,导入后可以通过 '模块名'.xxx' 的方式使用这个模块中所有内容
例如: 想用test.py ----- import test
# test是一个py文件,里面有name=小欣, age =18
import test
print(test.name)
print(test.age)
#小欣
#18
2. from 模块名 import 内容1,内容2,内容3,.... 导入指定模块,导入后可以直接使用指定内容
from test import name
print(name)
#小欣
3. from 模块名 import *
- 导入指定模块,导入后可以直接使用模块中所有内容
4. import 模块名 as 新名字 ---- 对导入的模块进行重命名
import test as ts
print(ts.name)
5. from 模块名 import 内容 as 新名字
from test import name as t_name
print(t_name)
四. 包中的模块
1. 包的含义:
- 包 -- 包含了 _init_.py的文件夹(可以直接把包含py文件的文件夹看成包)
2. 如何导入包中模块的内容
- import 包名 ---- 导入指定包,导入后可以通过 '包名.xxx' 方法去使用包中的 _ _ init _ _里面的内容
import files(这是包含init的文件夹名) print(files.xx)
- import 包名.模块名 --- 导入指定包中的指定模块,导入后可以通过'包名.模块名.xxx'去使用指定模块中所有内容
# test1 是文件夹名 try是文件夹中py文件
import test1.try1
print(test1.try1.dog)
- import 包名.模块名 as 新名字
#将try1 改名为t2
import test1.try1 as t2
print(t2.dog)
- from 包 import 模块1,模块2,....
from test1 import try1
print(try1.dog)
- from 包.模块名 import 内容1,内容2
from test1.try1 import dog
print(dog)
2. 导入模块的原理
- 不管以什么样的方式去导入模块或者模块中的内容,导入模块的时候会将模块中所有代码都执行一遍
2. 如何不运行所有的代码:
- if __ name__ == '_main_' 是输入main 再回车直接出来,没必要手打,放在这下面的内容在被引入时不会被打印
dog = {'name':'旺财'}
print(dog)
if __name__ == '__main__':
cat = {'name': '小猫'}
print(cat)
五. 异常捕获
1. 异常定义:
- 程序报错就叫程序出现异常
- 程序如果在执行过程中出现异常,程序会直接结束(执行之前的正常输出)
2. 异常捕获
- 结构一:捕获所有类型异常 ,让程序在异常的时候不崩溃(不结束)可以继续执行。
'''
try:
需要捕获异常的代码 # 代码段1
except:
捕获到异常后会执行的代码 #代码段2
'''
try:
age = int(input('请输入年龄'))
if age >= 18:
print('成年')
else:
print('未成年')
except:
print('年龄输入有误')
- 执行过程: 先执行代码段1,执行过程中如果发现异常程序不会立马报错会马上去执行代码段2;如果没有出现异常就不执行代码段2
2. 结构二: 捕获指定类型的异常
'''
try:
需要捕获异常的代码
except 异常类型:
捕获到异常后会执行的代码
'''
try:
age = int(input('请输入年龄'))
if age >= 18:
print('成年')
else:
print('未成年')
except ValueError:
print('年龄输入有误')
3. 结构三 : 同时捕获多种异常
'''
try:
需要捕获异常的代码
except (异常类型1,异常类型2,异常类型3):
捕获到异常后会执行的代码
'''
4. 结构四 ---- 同时捕获多种异常,针对不同异常做相同的处理
'''
try:
代码段
except 异常类型1:
代码段1
except 异常类型2:
代码段2
except 异常类型3:
....
'''