Python中一些实用技巧与值得注意的地方(持续更新)

本文深入讲解了Python中的变量、对象及其类型概念,包括变量无类型但与对象关联,对象有固定类型如int、str等,以及列表、字典等数据结构的切片、排序与操作。还介绍了模块的信息隐藏和陷阱,以及类的属性管理和Python中的基本数据结构如字典和列表的特性和使用技巧。
摘要由CSDN通过智能技术生成

数据类型

  变量与对象

  • 变量没有类型,可以将它理解为一张可以反复粘贴的标签纸,能够贴到不同的对象上。
  • 对象是有类型的,如int、float、str等。
  • 当我们用一个赋值符号定义变量时,实际是将变量和一个对象关联起来了(变量名贴到了这个对象上)。
  • a = 10,将标签“a”贴到一个整数对象上,这个整数对象的值为10,接着执行 a = 20时,并没有改变标签,也没有改变值为10的对象,只是将标签“a”又贴到了值为20的另一个整数对象上。
  • 如果有C语言经验的程序员可以将a认为是一个void*类型,可以指向不同的内存位置,而每个对象都有一个对象头,来区分对象的类型和统计对象的被引用(关联)次数。
  • 当引用次数为0时,对象就会被回收(有些也可能被缓存起来,供以后使用,一般小的整数会被缓存起来)
  • sys.getrefcount(x)函数可以得到x被引用的次数。

       a = 10

        b = a

       整数10对象上被贴了两个标签:a和b

字符串

  raw原始字符串:

  • 在字符串的第一个引号前加上字符 r,如文件名:"c:\net\text.txt'会将字符串中的“\n”和“\t”分别转义为“换行符”和“制表符”,而r"c:\net\text.txt'将会限制其中的转义符进行转义,字符串保持原样。
  • raw字符串不能以奇数个转义符“\”结束,如r'abc\'会报语法错误,原因:raw会抑制转义符转义,所以紧接在转义符后的字符会被当做字符来解析,因此 r'abc\'中最后的\'会解析成“斜杠”和“单引号”这两个字符,它们是这个字符串内容的一部分,这样字符串右侧就少了一个单引号的结束符,因此语法错误。解决办法:r'abc' + '\\' 或 r'abc\\'[:-1] 或 r'abc\''[:-1]。

字符串逆序:

  str[::-1]

列表

  切片替换:设 x = [1, 2, 3, 4]

  • 删除:执行x[1:3] = [ ]后,x 值为 [1, 4]
  • 替换:执行x[1:3] = [5, 6]后,x 值为 [1, 5, 6, 4]
  • 插入:执行x[2:2] = [8, 9]后,x 值为 [1, 2, 8, 9, 3, 4]
  • 注意:执行x[0] = []后,x 值为 [ [ ] , 2, 3, 4]

  排序:

  • 原型:list.sort([key = None], reverse=False),省略参数key时,按元素对象的比较操作符进行比较,加上key时,对每个元素进行fun运算后,根据运算结果进行比较;
  • reverse参数表示排序方式(升序或降序),reverse为False时表示升序,否则为降序;
  • 示例:设x=['abc', 'Abc', 'ABe'],执行x.sort(),x的值为['ABe', 'Abc', 'abc'];如果执行x.sort(key=str.lower),x的值为['abc', 'Abc', 'ABe']。
  • key也可以指定为自己定义的函数,如:

        def mySquare(x):
            return x*x

        x = [-9, 3, -11.5, 6, 33]
        x.sort(key=mySquare)      #x的值为[3, 6, -9, -11.5, 33]

  • 如果列表中的数据类型不一致,则在Python3中不能使用sort进行排序操作;另外sort操作会修改列表对象,返回None。
  • 内置函数sorted(aList, key=None, reserve=False),作用与方法类似,但是不会改变aList对象,返回一个新的排序后的对象。

字典dict

    注意事项

  • 序列运算无效,字典中的元素是没有顺序的,因此连接、分片操作对字典无效。
  • 对新的索引值赋值会添加新的元素。
  • 键不总是字符串。

模块module

    信息隐藏

  • 在模块中以“_”开头定义的模板全局变量,当被以from *的方式导入时会隐藏;
  • 当模块中以有__all__模板全局变量时,当被以from *的方式导入时,只会得到在__all__中指定的变量,其他的会隐藏。__all__是一个字符串列表。

    模块导入的陷阱

  • import 与 from语句只是变量名的复制,而不是连接,当指向不可变类型数据时,对其赋值不会修改模块中的变量;
  • 使用 from 可以进行相对模块的导入,但是在__main__模块(运行的主文件)中,只能使用绝对模块导入,不能使用相对模块导入;

  类的属性管理

  • __getattribute__:可能会导致循环调用,避免方法就是将获取指向一个更高的基类:object.__getattribute__(self, attr)。
  • __setattr__:可能会导致循环调用,避免方法就是到__dict__中设置,self.__dict__[attr] = value,也可以将设置指向更高的基类:object.__setattr__(self, attr, value)。
  • __delattr__:与上述的两个基本相同,也要避免循环调用。
  • __getattribute__与__getattr__的区别:后者只有在获取未设置的属性时才会调用,而前者对于所有属性都会调用。两个都有可能拦截不到一些内置的属性,如__str__在通过print函数调用时。
  • self的双下划线开头的属性名称会变成:_类名__属性名
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hn_tzy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值