迭代器是容器型数据类型,迭代器可以使用容器型数据类型的通用操作
(1)用iter将其他序列转换成迭代器
(2)创建生成器 生成器 创建多个数据
i1 = iter('abcdefg')
print(i1)
i2 = iter([1, 2, 3, 4])
print(i2)
不管以什么样的方式获取到了迭代器的元素,那么获取的元素一定会从迭代器中消失
next(迭代器) 迭代器中为空时取元素会报错
# 获取单个元素
i2 = iter([1, 2, 3, 4])
i2 = iter([1, 2, 3, 4])
print(next(i1)) # a
print(next(i1)) # b
print(next(i2)) # 1
# 遍历
i2 = iter([1, 2, 3, 4])
for i in i2:
print(i)
i3 = iter('hello')
result = list(i3)
print(result) # ['h', 'e', 'l', 'l', 'o']
# print(next(i3)) # 报错 因为将i3转换成了列表,已经将元素全部取出,再从i3中取元素就会报错
生成器是容器型数据(具备创建多个数据的能力,而不是保存多个数据的能力)
特点和迭代器一样
打印生成器的时候无法查看迭代器中的所有元素,也不支持len()操作
如果要使用生成器中的元素必须将该元素取出,元素取一个少一个,取出来的元素无法再放回迭代器
生成器获取数据的方式和迭代器一样
生成器保存的不是数据本身,而是产生数据的算法(函数)
如果调用的函数中有yield关键字,调用函数的时候不会执行函数体,也不会获取函数返回值,而是得到一个生成器对象
生成器创建数据的个数和数据的值 由执行 生成器对应的函数的函数体 的时候会遇到几次yield
每次由遇到的yield对应的数据来决定
遇到多少次yield就是产生多个个数据;yield后面的值是什么,元素就是什么
def fun1():
yield 100
yield 200
yield 300
nums = fun1()
print(next(nums)) # 100
print(next(nums)) # 100
print(next(nums)) # 100
def fun2(subject):
for i in range(1, 5):
yield f'{subject}{i:0>3}'
nums2 = fun2('python')
for i in range(1, 5):
print(next(nums2), end=' ') # python001 python002 python003 python004
调用函数的时候不会执行函数体,在获取生成器的元素的时候函数体才执行;
而且每次执行的时候只执行一次yield,不会全部执行函数体
python中一个py文件就是一个模块
前提:被使用的模块的模块名必须符合变量名的要求
使用原则:先导入后使用(能被别的模块使用的内容只能是全局变量)
方法1
import 模块名 导入指定模块,可以通过'模块名.xxx'的方式使用这个模块中所有的全局变量
方法2
from 模块名 import 变量1,变量2,变量3,... 导入指定模块中的指定变量,导入后可以直接使用所有指定的变量
方法3
from 模块名 * 导入指定模块中所有的变量
方法4
import 模块名 as 新模块名 导入模块的时候对模块重命名,通过'新模块.xxx'的方式只用模块中的全局变量
方法5
from 模块名 import 变量1 as 新变量1,变量2 as 新变量2,... 对导入的变量重命名
不管以什么方式导入模块或者模块中内容,系统都会在导入模块的时候进入对应模块,将模块中的代码执行一遍
导入模块的时候选择性执行代码:模块中不需要被别的模块执行的代码放入if __name__ == '__main__':中;需要被别的模块执行的代码不做修改
if __name__ == '__main__':
# 这个模块中的代码不会被别的模块执行
pass
包就是包含__init__.py文件的文件夹
包就是用来管理py文件的,对py文件按照特定的方式进行分类
项目右键 - new - Python Package
方法1
import 包名 导入指定的包,导入后可以通过'包名.xxx'的方式使用'__init__.py'中的内容
方法2
import 包名.模块名 导入指定包中的指定模块
方法3
import 包名.模块名 as 新名字 重命名
方法4
from 包名 import 模块名1,模块名2,... 直接导入包中指定的模块
方法5
from 包名.模块名 import 变量1,变量2,...
异常就是错误
执行程序的过程中,如果出现异常,会中断程序的执行
exit() 程序正常退出
让程序在出现异常的时候不奔溃,还可以继续往后执行。
注意:不要滥用异常捕获,如果是使用者使用不当造成的程序异常又希望程序可以继续执行可以使用异常捕获
结构1
结构1 捕获所有异常
try:
代码段1(需要捕获异常的代码)
except:
代码段2(捕获到异常需要执行的代码)
执行过程:
先执行代码段1,如果出现异常**直接马上**执行代码段2;如果不出现异常就不执行代码段2
try:
age=int(input('输入年龄:'))# 出现异常,直接执行except中的代码,try中剩余的代码不会再执行
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
...