第1章--python数据模型

第1章–python数据模型

这一章主要介绍了python的特殊函数的使用和注意事项,特殊函数即内置的以‘__’为开头结尾的函数

  • collections.namedtuple用于构造只有少数属性但没有方法的对象,类似于c语言中的struct https://docs.python.org/3.8/library/collections.html#collections.namedtuple
from collections import namedtuple

Student=namedtuple('Student',['name','grader'])

stu=Student('jason',2)
print(stu)
#Student(name='jason', grader=2)
  • random.choice 用于从序列中随机选出一个元素
from random import choice

arr=[1,2,3,4,5]
choice(arr)
# a num in arr
  • 原文中有一句话‘仅仅实现了 _getitem_() 方法,这一摞牌就变成可迭代的’

图书截图

如果类实现了__iter__方法,那么这个类就是可迭代iterable的
对for x in arr这类语句,如果arr没有实现__iter__,解释器会找arr的__getitem__方法,如果有则用__getitem__迭代对象,没有的话报错对象不可迭代. 参考
但是!我们用isinstance(arr,collections.Iterable)来判断arr是否可迭代时返回false,意思就是实现了__getitem__, 没有实现__iter__的类依然不是可迭代iterable的,尽管它能跟在in 语句后面

from collections import Iterable
class Person:
    def __getitem__(self, item):
        return 1

person=Person()
print(isinstance(person,Iterable)) #False
for i in person:
    print(i) #repeat output 1

结论:判断类是否可迭代只需要看它是否实现了__iter__,文中这句话我觉得翻译得不对

  • 迭代通常是隐式的,比如一个集合类型没有实现 contains 那么if … in …运算式就会顺序做一次迭代搜索,这一点在某些场景下会影响性能,要注意避免

  • 特殊方法是为了被python解释器调用的,而不是程序员自己调用,所以不应该写my_object.len() 而是len(my_object) __init__除外,因为有时候要调用父类的构造函数

  • repr__和__str
    repr的目标是提供明确的信息,str的目标是提供易读的信息,如果没有实现str,那么在需要用到str的地方python会用repr返回的结果
    https://stackoverflow.com/questions/1436703/difference-between-str-and-repr

  • 所有的特殊函数集合 https://docs.python.org/3/reference/datamodel.html
    部分特殊方法一栏

  • 为什么len不是普通方法
    这个问题应该等同于为什么len是特殊方法,答案是对于python内置类型实例x,len(x)的速度会非常快,原因是CPython对内置类型有特殊的len实现,会直接从一个C结构体中读取对象的长度,避免调用任何方法

发布了51 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_36267931/article/details/102754598