一.@装饰器
Python中,将函数传递给另外一个函数的方式有两种,第一种采用直接传递函数名,第二种使用@符号。
如:@A def B:pass 等价于 def B:pass B=A(B) 即将函数B作为参数传给参数A
源代码:
二. 不定长参数 *para,**para
参数格式为 *para 表示接受一个元组, **para 表示接受一个字典, *para要在**para之前。
如下源代码:
注意:源代码中用到了%s %a这两种格式化字符串的方式,得到的结果是不同的。
参考:
格式符号 表示类型 %s 字符串 %d/%i 十进制整数 %u 十进制整数 %o 八进制整数 %x/%X 十六进制整数 %e/%E 科学计数 %f/%F 浮点数 %% 输出% %a 中文编码(官方帮助文档中没有给出,但是通过与assii()函数对比就会发现,%a就是中文编码字符串)
继续测试,我们传递进去的是指定了的变量与值,那如果传递进去的是元组变量与字典变量呢?答案就是直接使用(args,dic)参数,不使用不定长参数*、**符号。
源代码:
在官方文档中,有这么一句话:
write the function call with the *-operator to unpack the arguments out of a list or tuple。
那么也就是说,我们可以将列表直接传递到函数里面去,让他自己解析,而不用给参数逐个传递值,这对于动态构成列表之后,传递到某个方法中计算尤其有用。
如下:
三.生成器表达式
生成器表达式:类似于没有中括号的列表推导式,可用在参数中 。
注:这样我就发现可以用for的方式很轻松的处理和分析文本字符串。这种方式漂亮。但是需要记得每次打开文本之后,要关闭。
扩展:虽然close()方法调用了,但是流对对象openTxt并没有真正的销毁。不过此时已经不能再执行其他的如读取等的操作,也就是说,这是需要等待垃圾回收机制来回收吧。如下继续调用close(),则并不引发异常。其实那只是一个空操作(no-op)而已:
另外,如果在遇到异常的情况下,要确保文件关闭呢,那么我们可以使用一贯常用的try..catch...finally块来处理。而python里面提供了一种更加轻便的操作方式,使用with语句,with语句引出一个代码块,无论你想要调用什么,当with结束的时候,将自动调用close()。如下:
四.Sort函数
python对List进行排序给予了比较大的支持,无论list里面是单个元素列表,还是元组列表都可以进行排序。但注意,如果是元组,他们的数目需要一样。
Python提供了两个函数:
第一种,使用list列表对象的sort()函数。
第二种,直接使用sorted(list列表对象)函数。
他们都有两个参数:
key:用列表元素的某个属性和函数进行作为关键字,有默认值,迭代集合中的一项;
reverse:排序规则. reverse = True 或者 reverse = False,有默认值。
sort()与sorted()的不同在于:sort是在原位重新排列列表,而sorted()是产生一个新的列表。sort()是list对象的函数,sorted()是全局存在的。
sort()函数排序效果如下:
sorted()函数排序方式相似,如下:
五.对象序列化
python里面对对象序列化的支持可谓是很便捷。一种是专注于内部使用的pickle协议序列化,另外一种是使用跨语言的json结构序列化。
pickle序列化:支持所有的python的所有对象序列。二进制方式存取。速度快。最新版本的pickle协议是二进制格式的。
json序列化:文本方式存取,支持字符串、数字、布尔值、列表等但是不支持python 字节组、集合、元组。因为json跨语言,在数据集合这一块只支持数组。当然我们可以使用其他的方式来处理。
他们的处理的方法都是dump()或者dumps()。参数除开dump中存入的file对象,其他都一样。
dump():主要针对文件读写,没有返回值。
dumps():主要针对数据结构对象的直接读写到变量,代替读写文件操作。
1.pickle序列化源代码:
pickletools可以用来反编译二进制pickle对象(或者二进制文件流)
2.json序列化源代码:
这里要注意两点:
第一:sortkeys参数排序之后,在json文件中存取确实是排好序的结构:
如json.dump({"a":1,"中文":2,"c":4,"b":0},f,indent=2,sort_keys = True)得到的结果是:
{
"a": 1,
"b": 0,
"c": 4,
"/u4e2d/u6587": 2
}
第二:to_json函数处理之后,得到的结果是:'b': {'__class__': 'set', '__value__': ['g', 'o']}。这个需要我们在python或者其他语言中调用的手动处理。
扩展:
1.json.dump()或者json.dumps()可以直接将字符串写入字符串流里面。
2.time.strptime()主要针对将格式化的日期字符串转化为time.struct_time日期结构。time.asctime()用来反向解析,即将日期结构转化为日期字符串。(这将在序列化的时候比较有用,譬如:
if isinstance(obj, time.struct_time):
return {'__class__': 'time.asctime',
'__value__': time.asctime(obj)})
参考资料: