使用python已经有很长一段时间了,在比赛中python语言的简洁易懂性给了我很大的帮助。当对一项技能使用的熟练度到达一定程度的时候,就该重新入门了。本文章将长期保持更新,收集记录各种python黑魔法,努力使自己的代码变得更加pythonic!
变量交换
对可变字符串不建议再使用temp = “(“+str(i)+”,”+str(j)+”)”的写法,给两种替换:
类似于C里面的三元操作符:
直接生成的列表(不是那种定义后一直要修改的)
python装饰器
作用就是为函数外加一层代码,可以用于日志记录,函数运行时间记录,对于不合适的函数进行代码补充等等场景
@runTime(True)相当于:myFunc = runTime(True)(myFunc(path))
调用逻辑为:
- runTime(True) 返回_deco 因此等价于 _deco函数
- _deco(myFunc(path))返回wrapper 因此等价于 wrapper函数
- 所以myFunc 等价于 执行逻辑之后的wrapper(path)函数
装饰器书写需要把握的重点是:
- 装饰器的本质是函数转换,经过@之后的那个函数其实最后都是变为装饰代码后的wrapper函数
- 基本的函数转换方式就是在每层函数中定义个子函数,然后逻辑执行后return 子函数
python函数中的可变参数:
其实实现原理很简单,def xie(args, **kwargs)中的args就相当于一个list, **kwargs就相当于一个dict,只是python为方便使用做出了进一步定义
迭代器中使用计数模式
将迭代列表用enumerate对象封装,每次迭代值返回两个————index, data。
同时enumerate()的第二个参数用于指定index的起始值,默认为0
对于对象的迭代器遍历如果只是为了循环检测是否存在某种情况,可以这样写:
之后使用any() all() 函数做检测
any([1,0,0])列表中存在1即返回真 all([1,1,1])列表中全为真则返回真
因此具体可以这样写
之前对dict的操作认识太浅显,重新整理下dict操作
使用defaultdict类型来进行遍历的结果记录
在对遍历结果统计时经常使用dict类型来记录,但dict在这种情况下有个问题就是,如果是第一次引用一个键,dict[‘xie’] += 1就会出现问题,需要先dict[‘xie’] = 0,再dict[‘xie’] += 1,而defaultdict会在dict[]遇到新的键时为其分配指定的值
更加健壮的python程序需要进行参数检查:
要检查的数据有:
- 用户输出的数据
- 从文件中解析出来的数据,如从网页中解析出来的数据,从txt中获取的数据
需要在以下几个地方做参数检查:
- 最初遇到这种参数时就做出了检查
- 必须保证安全性关键的子函数,如果def download(url)
- 检测函数中,经常会做切片分析检测,要防止越界