IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> python描述符、生成器、迭代器、定制序列 -> 正文阅读

[开发工具]python描述符、生成器、迭代器、定制序列

1.属性访问

?对象有一个特殊的属 性,称为_ _dict_ _,它的作用是以字典的形式显示出当前对象的所有属 性以及相对应的值。

描述符(descriptor),用一句话来解释,描述 符就是将某种特殊类型的类的实例指派给另一个类的属性。那什么是特殊类型的类呢?就是至少要在这个类里边定义_ _get_ _()、_ _set_ _()或_ _delete_ _()三个特殊方法中的任意一个。

?访问属性的时候,python 会自动调用__get__()方法。几个参数内容分别是:self是描述符类自身的实例;instance是这个描 述符的拥有者所在的类的实例,在这里也就是Test类的实例;owner是 这个描述符的拥有者所在的类本身。

对属性进行赋值操作的时候,Python会自动调用_ _set_ _()方法, 前两个参数与_ _get_ _()方法是一样的,最后一个参数value是等号右边 的值。

del操作也是同样的道理

property 事实上就是一个描述符类

# p12_7.py
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 C:
    def __init__(self):
        self._x = None

    def getX(self):
        return self._x

    def setX(self, value):
        self._x = value

    def delX(self):
        del self._x

    x = MyProperty(getX, setX, delX)

# c = C()
# c.x = 'X-man'
# c.x
# c._x
# del c.x
# c._x

?

# p12_8.py
class Celsius:
    def __init__(self, value=26.0):
        self.value = float(value)

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

    def __set__(self, instance, value):
        self.value = float(value)

class Fahrenheit:
    def __get__(self, instance, owner):
        return instance.cel * 1.8 + 32

    def __set__(self, instance, value):
        instance.cel = (float(value) - 32) / 1.8

class Temperature:
    cel = Celsius()
    fah = Fahrenheit()


# temp = Temperature()
# temp.cel #26.0
# temp.fah #78.80000000000001

2.定制序列

在Python中,像序列类型(如列表、元组、字符串)或映射类型 (如字典)都属于容器类型.

? 如果希望定制的容器不可变,则只需要定义_ _len_ _()和_ _getitem_ _()方法。 ? 如果希望定制的容器是可变的,除了_ _len_ _()和_ _getitem_ _() 方法,还需要定义_ _setitem_ _()和_ _delitem_ _()两个方法。

?自定义不可变列表

# p12_9.py
class CountList:
    def __init__(self, *args):
        self.values = [x for x in args]
        self.count = {}.fromkeys(range(len(self.values)), 0)
        # 这里使用列表的下标作为字典的键,注意不能用元素作为字典的建
        # 因为列表的不同下标可能有值一样的元素,但字典不能有两个相同的键

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

# c1 = CountList(1,3,5,7,9)
# c2 = CountList(2,4,6,8,10)
# c1[1]
# c2[1]
# c1[1]+c2[1]
# c1.count
# c2.count
# len(c1)

3.迭代器

提供迭代方法的容器称为迭代器,通常接触的迭代器有序列(如列表、元组、字符)、字典等,它们都支持迭代的操作。关于迭代,Python提供了两个BIF:iter()和next() 对一个容器对象调用iter()就得到它的迭代器,调用next()迭代器就会返回下一个值,然后怎么样结束呢?如果迭代器没有值可以返回了, Python会抛出一个名为StopIteration的异常。关于实现迭代器的魔法方法有两个:_ _iter_ _()和_ _next_ _()。 一个容器如果是迭代器,那就必须实现_ _iter_ _()魔法方法,这个方法实际上就是返回迭代器本身。

#Fibonacci迭代器
class Fibs:
    def __init__(self):
        self.a = 0
        self.b = 1
    def __iter__(self):
        return self
    def __next__(self):
        self.a,self.b = self.b,self.a+self.b
        return self.a


fibs = Fibs()
for each in fibs:
    if each < 20:
        print(each)
    else:
        break

1
1
2
3
5
8
13

#改编版
class Fibs:
    def __init__(self, n = 20):
        self.a = 0
        self.b = 1
        self.n = n
    def __iter__(self):
        return self
    def __next__(self):
        self.a,self.b = self.b,self.a+self.b
        if self.a > self.n:
            raise StopIteration
        return self.a

fibs = Fibs()
for each in fibs:
    print(each)
print()
fibs = Fibs(10)
for each in fibs:
    print(each)

1
1
2
3
5
8
13

1
1
2
3
5
8

4.生成器

生成器的学习,并不涉及魔法方法,甚至它巧妙地避开了类和对象,仅通过普通的函数就可以实现。

生成器其实是迭代器的一种实现

Python是通过生成器来实现类似于协同程序的概念:生成器可以暂时挂起函数,并保留函数的局部变量等数据,然后再次调用它的时候, 从上次暂停的位置继续执行下去。

#生成器版本
def fibs():
    a = 0
    b = 1
    while True:
        a, b = b, a + b
        yield a
        
for each in fibs():
    if each > 100:
        break
    print(each)

1
1
2
3
5
8
13
21
34
55
89

x = 3
y = 6
x, y = y, x + y
x, y

#(6, 9)

生成器表达式

列表推导式(list comprehensions)也叫列表解析,灵感取自函数式编程语言Haskell,它是一个非常有用和灵活的工具,可以用来动态地创建列表

list1 = []
for i in range(100):
    if not(i % 2) and i % 3:
        list1.append(i)
list1

#上面代码等价于下面
[i for i in range(100) if not(i % 2) and i % 3]

字典推导式(dictionary comprehension)

{i:i % 2 == 0 for i in range(10)}

集合推导式(set comprehension)

{i for i in [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 7, 7, 8]}
#对于字符串和元组,没有相应的推导式
>>> "i for i in 'I love FishC.com!'"
"i for i in 'I love FishC.com!'"
>>> (i for i in range(10)) #没错,用普通的小括号括起来的正是生成器表达式(generator expressions)
<generator object <genexpr> at 0x03135300>

如果将生成器表达式作为函数的参数使用的 话,可以直接写推导式,而不必加小括号:

#这个的输出为什么是2500???
sum(i for i in range(100) if i % 2)

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-07-21 21:44:34  更:2022-07-21 21:45:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:58:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码