Python学习--property属性、with语句、生成器

property属性

说明

property属性就是负责把类中的一个方法当做属性进行使用这样做可以简化代码使用。

property属性装饰器定义方式

class Person(object):
    def __init__(self):
        self.__age = 0

    # 获取属性
    @property
    def age(self):
        return self.__age

    # 修改属性
    @age.setter
    def age(self, new_age):
        self.__age = new_age
# 原始调用方式
# p = Person()
# age = p.age()
# print(age)

p = Person()
print(p.age)
# 修改属性
p.age = 100
print(p.age)

  1. @property 表示把方法当做属性使用, 表示当获取属性时会执行下面修饰的方法(修饰取值方法)
  2. @方法名.setter 表示把方法当做属性使用,表示当设置属性时会执行下面修饰的方法(修饰设值方法)
  3. 装饰器方式的property属性修饰的方法名一定要一样

property属性类属性定义方式

定义property属性

类属性 = property(获取值方法, 设置值方法)

使用

对象.类属性
对象.类属性=

例子

class Person(object):
    def __init__(self):
        self.__age = 0

    def get_age(self):
        """当获取age属性时会使用该方法"""
        return self.__age

    def set_age(self, new_age):
        """当设置属性时会使用该方法"""
        if new_age >= 150:
            print("年龄错误")
        else:
            self.__age = new_age
    # 定义property属性
    age = property(get_age, set_age)

p = Person()
print(p.age)
# 设置属性
p.age = 100
print(p.age)

with语句和上下文管理器

with语句使用

简化try...except...finlally的处理流程,让读写文件变得更加简洁安全

语法

with expression [as target]:
        with_body 

在这里插入图片描述

# 即使出现异常也系统也会自动关闭流,不再需要手动关闭文件
with open("1.txt", "r") as f:
    file_data = f.read()
    print(file_data)

上下文管理器定义

一个类只要实现了__enter__()__exit__()这个两个方法,这个就是上下文管理器,通过这个类创建的对象就是上下文管理器对象

__enter__上文方法,需要返回一个操作文件对象
__exit__下文方法,with语句执行完成会自动执行,即使出现异常也会执行该方法

# 1定义一个File类
class File(object):
    def __init__(self, file_name, file_model):
        self.file_name = file_name
        self.file_model = file_model

# 2实现 __enter__() 和 __exit__()方法

    def __enter__(self):
        """上文方法"""
        print("这是上文")
        self.file = open(self.file_name, self.file_model)
        return self.file

    def __exit__(self, exc_type, exc_val, exc_tb):
        """下文方法"""
        print("这是下文")
        self.file.close()

# 3然后使用 with 语句来完成操作文件
with File("1.txt","r") as f:
    file_data = f.read()
    print(file_data)

生成器

指定循环生成数据的规则,当条件不成立生成数据结束。数据不是一次性全部生成,而是使用一个在生成一个,可以节省内存的使用

特点

  1. 惰性机制
  2. 只能向前
  3. 节省内存

生成器推导式

my_generator = (i * 2 for i in range(5)),生成器推导式与列表推导式类型,中不过生成器推导式使用的是小括号,列表推导式使用的是列表[i * 2 for i in range(5)]

my_generator = (i * 2 for i in range(5))
# 使用next()函数获取生成器中下一个值
print(next(my_generator ))
# 循环遍历生成器
for i in my_generator:
	print(i)

yield关键字

只要在函数中使用yield关键字,这个函数就是生成器yield类似return,中不过会再次从yield位置开始执行

def generater(num):
    for i in range(num):
        print("开始")
        yield i # 暂停并返回i值
        print("生成完成")

说明:

  1. 代码执行到yield暂停并返回结果下次启动生成器会从暂停位置继续向下执行
  2. 生成器把数据全部生成完成,在向下执行会抛出StopIteration异常
  3. while循环需要手动处理异常
  4. for循环内部自动回处理异常
def generater(num):
    for i in range(num):
        print("开始")
        yield i
        print("生成完成")

g = generater(5)
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))

# 不产生异常的遍历全部数据
for i in g:
    print(i)

执行结果:
在这里插入图片描述
超过总体数量时会抛出异常
在这里插入图片描述

斐波那契数列

# 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
def fb(num):
    a = 0
    b = 1

    # 记录生成了几个数字
    index = 0

    while index < num:
        result = a
        #1  1      1   1
        #1  2      1   2
        #2  3      2   3
        a, b = b, a+b
        # 执行到yield暂停,并返回result结果。下次启动生成器会在暂停位置继续向下执行
        yield result
        index += 1

f = fb(5)
# print(next(f))
# print(next(f))
for i in f:
    print(i)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值