用简易代码快速学习Python(八)

本学习系列介绍:

本学习系列主要针对对编程略有了解有其他语言基础并要进一步学习Python的同学,通过简易的代码快速入门掌握Python语言。

系列总目录:
用简易代码快速学习Python(一)
用简易代码快速学习Python(二)
用简易代码快速学习Python(三)
用简易代码快速学习Python(四)
用简易代码快速学习Python(五)
用简易代码快速学习Python(六)
用简易代码快速学习Python(七)
用简易代码快速学习Python(八)
用简易代码快速学习Python(九)
用简易代码快速学习Python(十)

Day08:

描述符:

描述符就是将某种特殊类型的类的实例指派给另一个类的属性。

目的:用于类中多个相关联属性的共同修改。

例如:摄氏度和华氏度在温度类中的共同修改。

class Myproperty:
    def __init__(self, fget=None, fset=None, fdel=None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel

    def __get__(self, instance, owner):
        return self.fget(instance)

    def __set__(self, instance, value):
        self.fset(instance, value)

    def __delete__(self, instance):
        self.fdel(instance)


class Temperature:
    def __init__(self, she=None, hua=None):
        self.she = she
        self.hua = hua

    def getShe(self):
        if self.she == None:
            return str("温度未设置!")
        return '%.1f' % self.she

    def getHua(self):
        if self.hua == None:
            return str("温度未设置!")
        return '%.1f' %  self.hua

    def setShe(self, value):
        self.she = value
        self.hua = self.she * 1.8 + 32

    def setHua(self, value):
        self.hua = value
        self.she = (self.hua - 32) / 1.8

    def delShe(self):
        del self.she
        del self.hua
        self.she = None
        self.hua = None

    def delHua(self):
        self.she = None
        self.hua = None

    s = Myproperty(getShe, setShe, delShe)
    h = Myproperty(getHua, setHua, delHua)


wendu = Temperature()
print(wendu.s) #输出:温度未设置!
wendu.s = 15
print(wendu.s, wendu.h) #输出:15.0 59.0
wendu.h = 152
print(wendu.s, wendu.h) #输出:66.7 152.0
del wendu.h
print(wendu.s) #输出:温度未设置!

容器类型的协议:

如果希望定制的容器是不可变的话,只需要定义__len__()和__getitem__()方法。

如果希望定制的容器时可变的话,除了需要定义__len__()和__getitem__()方法以外,还需要定义__setitem__()和__delitem__()方法。

例如:

class CountList:
    def __init__(self, *args):
        self.values = [x for x in args]
        self.count = {}.fromkeys(range(len(self.values)), 0)

    def __getitem__(self, item):
        self.count[item] += 1
        return self.values[item]

a = CountList(1, 3, 5, 7, 9)
print(a[3]) #输出:7
print(a[1] + a[3]) #输出:10
print(a.count) #输出:{0: 0, 1: 1, 2: 0, 3: 2, 4: 0}

迭代器:

class B(object):
    def __next__(self):
        raise StopIteration

class A(object):
    def __iter__(self):
        return B()

Iterable: 有迭代能力的对象,一个类,实现了__iter__,那么就认为它有迭代能力,通常此函数必须返回一个实现了__next__的对象,如果自己实现了,你可以返回self,当然这个返回值不是必须的;

Iterator: 迭代器(当然也是Iterable),同时实现了__iter____next__的对象,缺少任何一个都不算是Iterator,比如上面例子中,A()可以是一个Iterable,但是A()B()都不能算是和Iterator,因为A只实现了__iter__,而B只实现了__next__()。

例如:

class Fibs:
    def __init__(self, n):
        self.a = 0
        self.b = 1
        self.n = n

    def __iter__(self):
        return self

    def __next__(self):
        temp = self.a
        self.a = self.b
        self.b = temp + self.b
        if self.a > self.n:
            raise StopIteration
        return self.a

fib = Fibs(15)
for each in fib:
    print(each, end=" ") #输出:1 1 2 3 5 8 13 

生成器:

生成器:在Python中,一边循环一边计算的机制,称为生成器:generator。

生成器的两种情况:

情况一:把一个列表生成式的[]改成(),就创建了一个generator。

a = (x for x in range(10))
print(type(a)) #输出:<class 'generator'>

情况2:如果一个函数中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。调用函数就是创建了一个生成器(generator)对象。yield相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行。

def g():
    print("aaaaaa")
    yield 111
    print("bbbbbb")
    yield 222

b = g()
print(type(b)) #输出:<class 'generator'>
print(next(b))
#输出:
#aaaaaa
#111
print(next(b))
#输出:
#bbbbbb
#222

导包:

import 文件名称

import 文件名称 as 自定义缩略名

from 文件名称 import 函数名

from 文件名称 import *

注意:若自己写的文件,应该将此文件放在sys.path列表所显示的路径目录下(一般为当前文件路径和Python路径),一般会放在python路径中的Lib\site-packages目录下。

注意:若是一组相关的文件,则可以放在文件夹中,称为包(packet),放在sys.path列表所显示的路径目录下(一般为当前文件路径和Python路径),一般会放在python路径中的Lib\site-packages目录下,此时,该包内必须要有名为__init__.py的文件,即使内容为空也应存在,才能将包成功导入。

__init__.py的主要作用是:

1.Python中package的标识,不能删除。

2.定义__all__用来模糊导入。

3.编写Python代码。(不建议在__init__中写python模块,可以在包中在创建另外的模块来写,尽量保证__init__.py简单)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘学长丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值