Python3的一些特性、函数分析

一.@装饰器 

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)})

 

参考资料:

Python绝对简明手册

深入Python 3

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值