生成器是一种同时创建多个数据的容器,生成器中保存的是创建数据的方法,而不是数据本身
特点:
a. 打印生成器无法查看元素
b. 不能通过len统计元素的个数
c. 如果需要生成器中的数据,必须将数据取出,且取一个少一个。
取出数据和迭代器相同:next()、for遍历、转换为列表
取完数据后再取会报错
优势:内存占用少
调用带有yield关键字的函数,就可以得到一个生成器
def func1():yieldprint('h')return 100
result = func1() # 函数的返回值
print(f'result:{result}')
# result:
在一个普通函数中放一个yield关键字,最后调用时不会执行函数体,且返回的是一个生成器对象。
执行创建生成器的函数的函数体时,会遇到几次yield,对应的生成器就会创建几个数据,yield后面的值就是能创建出来的数据
def func3(n):yield 100if n % 2 == 0:yield 200yield 300gen3 = func3(3)
print(gen3) # 此时遇到yield两次,所以生成器会创建两个元素:100、300
print('next:', next(gen3)) # next: 100
print('next:', next(gen3)) # next: 300
print(list(gen3)) # []
Python中一个py文件就是一个模块
前提:如果想要在一个模块中使用另外一个模块中的内容,被使用的模块的模块名必须符合变量名要求。
导入模块(需要将要使用的模块(py文件)放在当前项目里才能导入)
方法1 import 模块名(即文件名) – 导入指定模块,导入后可以通过 模块名.xxx 使用这个模块中所有内容
import demo
print(demo.a) # 100
print(demo.name) # 小明
demo.f_demo1() # demo中函数
方法2 from 模块名 import 内容1,内容2 ,……— 导入模块后可以直接使用指定内容。
from demo import a, f_demo1print(a) # 100
f_demo1() # demo中函数print(name) 会报错,因为name没有导入。只能使用import后导入的内容
方法3 from 模块名 import * — 导入指定模块,导入后可以直接使用模块中所有内容
from demo import *
print(a)
print(name)
f_demo1()
方法4 import 模块名 as 新模块名 — 导入指定模块后,对模块进行重命名,使用其中内容:新模块名.xxx
import demo as d
print(d.name)
print(d.a)
d.f_demo1()f
方法5 from 模块名 import 内容1 as 新内容1,内容2,…… — 可以对其中某一个内容重命名,其他内容导入但不命名
from demo import a as score, name
print(score) # 100
print(name) # 小明
# 包含__init__.py文件的文件夹就是包
需要使用的内容所在模块不在当前项目下,而是在一个文件夹(包)中。
1)只适用于python package:
方法1 import 包名 — 导入指定包,导入后通过 包名.xxx 去使用 —init–.py文件中所有内容
import files2
files2.f_test2()
print(files2.name)
方法2 from 包名 import 内容1,内容2 …… — 导入 指 定包中–init–.py文件中指定内容
from files2 import name
print(name)
2)包和普通文件夹都可以用
方法3 from 包名 import 模块1,模块2…… — 导入指 定包中指定模块, ’模块名.xxx’
导入包:
from files2.abc import test3,test4
print(test3.demo)
print(test4.a)导入普通文件夹
from files import test1
print(test1.name)
方法4 import 包名 模块名 – 包名.模块名.内容1
import files2.test2 as t2
print(t2.msg)
方法5 from 包名.模块名 import 内容1, 内容2…… 直接用
from files2.test2 import msg
print(msg)
异常 – 程序中错误
程序中出现异常(报错)会直接让程序结束(在那个位置出现的异常,程序就会在那个地方结束)
# print('+++++')
# print('abc'[3]) 程序报错,在此结束,则打印结果只有 +++++
# print('=====')
让程序在出现异常时,程序不结束,还可以接着往后执行
异常捕获针对 用户操作不当时而导致的程序报错(代码本身是没有问题的) 如不小心在输入年龄是输入了字符
age = int(input('请输入年龄:'))
语法结构1 – 捕获所有异常
try:代码段1(需要捕获异常的代码)
except:代码段2(出现异常后会执行的代码)
finally:(可有可无,所有语法结构最后都可以加,不影响前面代码的执行)代码段3
# 执行过程:先执行代码段1,若代码段1报错(出现异常),程序不报错且立刻会执行代码段2;若代码段1不报错(没有出现异常),则代码段2不执行
finally 后的代码是无论前面代码发生什么都会执行代码段3. 即使报错程序中途结束,代码段3也会执行。
try:age = int(input('请输入年龄:'))print(age)
except:print('年龄输入有误!')
语法结构2 — 捕获指定类型的异常(推荐使用)
try:代码段1(需要捕获异常的代码)
except 异常类型:代码段2(出现异常后会执行的代码)#执行过程:如果代码段1出现的异常刚好是except后的异常类型,则执行代码段2;如果不是指定异常类型则程序报错# 如果没有出现异常,代码段2不执行。
语法结构3 ---- 同时捕获多种异常类型,且统一处理
try:代码段1(需要捕获异常的代码)
except (异常类型1、异常类型2……):代码段2(出现异常后会执行的代码)
语法结构4 ---- 同时捕获多种异常类型,分类处理
try:代码段1(需要捕获异常的代码)
except 异常类型1:代码段2(出现异常类型1后会执行的代码)
except 异常类型2:代码段3(出现异常类型2后会执行的代码)
except 异常类型3:代码段4(出现异常类型3后会执行的代码)
……"""
上一篇:ADS负载牵引设计要点总结
下一篇:【MySQL】锁