《python基础教程第3版》笔记——对象和魔法(6到9章)

本文介绍了Python编程中的实用技巧,包括函数注释、列表和字典的深拷贝、字符串操作、zip函数的使用、参数传递机制、类的私有属性、抽象方法、魔法方法等,并探讨了迭代器和生成器的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1

函数说明:在函数中写一个字符串说明,用__doc__属性访问

def cal(x):
    'Calculate the square of x'
    return x * x
print(cal.__doc__)

2

列表作为参数传入函数时会改变列表中的值,类似指针,需要采用深拷贝确保原始列表不会改变。可以采用切片的方法,如n = name[:],这样n能获得name的全部值且地址不同。字典也会改变,只要是可改变的数据类型一般都会改变,元组和数不会改变。

3

‘zhao ming xu’.split(),会根据空格划分。如果指定了划分分隔符则按照指定的划分。

4

zip用法,zip(x,y),返回的是一个zip 对象,list(zip(x,y))后返回一个由x,y各个元素对应组成的元组形成的列表,比如x=[1,2,3],y=[4,5,6],list(zip(x,y))返回[(1,4),(2,5),(3,6)].

5

*和**的收集和分配参数的作用。
例如收集参数 def func(x,y,z=3,*args,**kwargs),调用func(1,2,3,4,5,6,foo=‘f’,bar=‘bar’),args是(4,5,6)组成的元组,kwargs={‘foo’=‘f’,‘bar’=‘bar’}字典类型。
分配参数,add(x,y,z),params = [1,2,3],add(*params),将params分别赋值给x,y,z.

func(x,y,z,foo=2,bar=3),
params = [1,2,3]
kwparams = {
‘foo’=‘foo’,
‘bar’=‘bar’
}
func(*params,**kwparams),将分别分配给函数的各个参数

在定义函数的时候使用了*,**的话在分配时比较麻烦,比如func(*args,**kwargs),args=[1,2,3],kwargs = {‘foo’=2,‘bar’=10},在传入参数时仍然需要*,func(*args,**kwargs),如果是定义时func(args,kwargs),则传入时func(args,kwargs)

6

vars()返回一个字典,包含各种变量、函数等python对象的键值对,locals(),globals()分别返回局部和全局变量的键值对。如需在函数内部方位和形参同名的全局变量,可以使用globals()[‘name’]。
重新关联全局变量,
x = 1
def func(): global x return x+1
func()
x会成为2

7

class的私有属性和方法通过两个下划线实现,从而对该类的属性和方法完全隐藏,外部不能访问。类内部仍然可以访问。一般打一个下划线以警示不要从外部修改。

8

abc模块里面的abstractmethod,抽象方法的意思是抽象类的方法,其必须在抽象类的子类中实现,抽象类不能(至少不应该)实例化抽象类的使用均应该作为基类存在。

9

所谓魔法方法(magic method)一般指的就是类中有两个下划线构成的,如构造函数__init__等等。

10

魔法方法,getitem,setitem,delitem,其中delitem是在调用del函数时使用,getitem是在利用[]取元素时使用。

11

模块collections中包含很多抽象和具体的类可以用来作为基类。也可以用内置类型作为基类,如果要使用基类的方法,则调用super().__init__(), super().__getitem__(),注意传入的参数。

class counterlist(list):
    def __init__(self,*args):
        super().__init__(*args)
        self.counter = 0
    def __getitem__(self,index):
        self.counter += 1
        return super().__getitem__(index)

12

静态方法和类方法,staticmethod和classmethod,都可以由对象直接调用,也可以用实例调用,静态方法没有类似self的参数,类方法有,一般命名为cls,其关联到类。

class myclass():
    @staticmethod
    def smeth():
        print('this is the static method')
    @classmethod
    def cmeth(cls):
        print('this is the class method')
if __name__ == '__main__':
    m = myclass()
    m.smeth()
    m.cmeth()
    myclass().cmeth()
    myclass().smeth()

13

hasattr和getattr可以获取类的属性和方法

14 迭代器和生成器

更正规的定义是,实现了方法__iter__的对象是可迭代的,而实现了方法__next__的对象
是迭代器。
通过对可迭代对象调用内置函数iter,可获得一个迭代器。
it = iter([1, 2, 3])
next(it)
1
next(it)
2
可迭代对象和迭代器不是一个意思。
生成器是一种使用普通函数语法定义的迭代器,有yield的是生成器,迭代器一般用类来创建,生成器用简单的函数创建。
生成器就是通过函数生成一个迭代器,从而利用该迭代器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值