day 13 模块和异常捕获

day 13 模块和异常捕获

生成器
1. 什么是生成器

生成器是一种同时创建多个数据的容器,生成器中保存的是创建数据的方法,而不是数据本身

  • 特点:

    a. 打印生成器无法查看元素

    b. 不能通过len统计元素的个数

    c. 如果需要生成器中的数据,必须将数据取出,且取一个少一个。

  • 取出数据和迭代器相同:next()、for遍历、转换为列表

    取完数据后再取会报错

  • 优势:内存占用少

2. 怎么创建生成器

调用带有yield关键字的函数,就可以得到一个生成器

def func1():
	yield
	print('h')
	return 100
result = func1()  # 函数的返回值
print(f'result:{result}')
# result:<generator object func1 at 0x0000018345178120>

在一个普通函数中放一个yield关键字,最后调用时不会执行函数体,且返回的是一个生成器对象。

3. 怎么控制生成器中的元素个数和元素的值

执行创建生成器的函数的函数体时,会遇到几次yield,对应的生成器就会创建几个数据,yield后面的值就是能创建出来的数据

def func3(n):
    yield 100
    if n % 2 == 0:
        yield 200
    yield 300


gen3 = func3(3)
print(gen3)  # 此时遇到yield两次,所以生成器会创建两个元素:100、300
print('next:', next(gen3))  # next: 100
print('next:', next(gen3))  # next: 300
print(list(gen3))  # []
模块
1. 什么是模块

Python中一个py文件就是一个模块

2. 怎么在一个模块中使用另外一个模块中的内容
  • 前提:如果想要在一个模块中使用另外一个模块中的内容,被使用的模块的模块名必须符合变量名要求。

  • 导入模块(需要将要使用的模块(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_demo1
    
    print(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)   # 小明
    
    包 packeage
    1. 什么是包 Python package
    # 包含__init__.py文件的文件夹就是包
    
    2. 怎么使用包或文件夹中的内容

    需要使用的内容所在模块不在当前项目下,而是在一个文件夹(包)中。

    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. 语法结构1 – 捕获所有异常

    try:
        代码段1(需要捕获异常的代码)
    except:
        代码段2(出现异常后会执行的代码)
    finally:(可有可无,所有语法结构最后都可以加,不影响前面代码的执行)
        代码段3
    # 执行过程:先执行代码段1,若代码段1报错(出现异常),程序不报错且立刻会执行代码段2;若代码段1不报错(没有出现异常),则代码段2不执行
    
    

    finally 后的代码是无论前面代码发生什么都会执行代码段3. 即使报错程序中途结束,代码段3也会执行。

    try:
        age = int(input('请输入年龄:'))
        print(age)
    except:
        print('年龄输入有误!')
    
  2. 语法结构2 — 捕获指定类型的异常(推荐使用)

    try:
        代码段1(需要捕获异常的代码)
    except 异常类型:
        代码段2(出现异常后会执行的代码)
    
    #执行过程:如果代码段1出现的异常刚好是except后的异常类型,则执行代码段2;如果不是指定异常类型则程序报错
             # 如果没有出现异常,代码段2不执行。
    
  3. 语法结构3 ---- 同时捕获多种异常类型,且统一处理

    try:
        代码段1(需要捕获异常的代码)
    except (异常类型1、异常类型2……):
        代码段2(出现异常后会执行的代码) 
    
  4. 语法结构4 ---- 同时捕获多种异常类型,分类处理

try:
    代码段1(需要捕获异常的代码)
except 异常类型1:
    代码段2(出现异常类型1后会执行的代码) 
except 异常类型2:
    代码段3(出现异常类型2后会执行的代码) 
except 异常类型3:
    代码段4(出现异常类型3后会执行的代码) 
……

"""
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值