python特性几则
近日闲暇翻看十一前购得的一本Python书籍----《深入理解Python特性》,或有几处平日常用但是并没有真正审视过类似于语法糖的Python操作,读者诸君读来也会心一笑,有豁然开朗之感,故摘取几处放上来共享。
1.assert 断言
函数很好理解,商品价格*折扣,返回实际支付,通过assert 的方式来检测折扣是否有效,当实际支付价格小于0或者大于商品原价的时候,程序引发异常。断言需要与异常处理区别开来,断言作为一种辅助工具,用于程序内部检查,声明代码中不可能出现的情况,如果出现某个条件,则意味着程序中存在相应的bug,不用来处理运行时的错误机制。
def apply_discount(product,discount):
price=int(product['price']*(discount))
assert 0<=price <=product['price']
return price
shoes={'name':'Fancy','price':200}
apply_discount(shoes,0.8)
同时还有一个需要注意的地方,如果你运行以下语句,会得到可疑的语法警告,因为该断言1==2为非空元组总为真,所以判断条件永远不会失败,也就没有作为断言的必要,故可以移除该断言。
assert (1==2,'this should fail')
#SyntaxWarning: assertion is always true, perhaps remove parentheses?
#assert (1==2,'this should fail')
2.返回空值
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#1
def return_none_a(value):
if value:
return value
else:
return None
#2
def return_none_b(value):
if value:
return value
else:
return
#3
def return_none_c(value):
if value:
return value
如果向这三个函数传递一个假值,三个函数都能正常返回None,第一个是寻常写法,后面两个就是python的隐式返回行为,这里还需要拿print和return做一个简单的说明,print只是把结果打印出来,如果没有return,调用这个函数的时候会得到一个空值,函数似乎没有起到应有的作为,在debug阶段百思不得其解,而这是初学者容易犯的一个错误。作者在这里总结了两点,如果函数没有指定返回值,则返回None。是否明确的返回None是风格方面的问题,不存在对错,显示的return None语句能更清楚的表达代码的意图。
3.具有Python特色的循环
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#1
list_a=['a','b','c']
i=0
while i<len(list_a):
print(list_a[i])
i+=1
#2
for i in range(len(list_a)):
print(list_a[i])
#3
for item in list_a:
print(item)
以上第一段代码非常没有Python特色,原因如下:
-
代码手动跟踪了索引 i ,即先初始化将其置为0,然后每次循环迭代时递增索引;
-
为确定迭代次数,使用len()获取列表list_a容器的大小。
以上代码风格,市面上确有书就是用这种C或者Java风格写就;
第二段代码比第一段好,但是依然是Java风格的迭代结构,用容器遍历的方式迭代。第三段就是具有python特色的代码,看上去就是伪代码,既不用跟踪容器大小,也不使用索引来访问元素,如果需要同时使用索引时,有enumerate函数来完成。
4.解析式
我们听到最多的列表解析式,其实还有集合解析式和字典解析式,这里举例的都是一层for循环,当存在嵌套循环时,代码将变得难以理解,此时建议直接使用for循环,不使用解析式。
#列表解析式
list_exp_=[x*x for x in range(10) if x%2==0]
#集合解析式
set_exp_={x*x for x in range(-9,10)}
#字典解析式
dict_exp_={x : x*x for x in range(5)}
5.列表切片
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
list_b=[1,2,3,4]
#反转列表
list_b_reverse=list_b[::-1]
#浅复制
list_b_copy=list_b[:]
#清空列表
del list_b[:]
其中,反转列表是Python尤其不同于其他编程语言的地方,清空列表是虽然删除了列表中的元素,但是保持列表这个容器还在。
6.合并字典
xs={'a':1,'b':2}
ys={'b':3,'c':4}
#常规
zs={}
zs.update(xs)
zs.update(ys)
#一次合并两个字典
zs_a=dict(xs,**ys)
#一次合并多个字典
zs_b={**xs,**ys}
第一种为最常见的字典合并形式,需要注意的是,xs中的键’b’的值与ys中的键’b’不同,在执行update过程中会得到update后的新值,后面两个就是拆包。
以上就是个人在阅读《深入理解Python特性》过程认为常见又非常经典的Python特色片段,如有兴趣的读者可以买来原书深入阅读。
本文来自博客园,作者:I'm_江河湖海,转载请注明原文链接:https://www.cnblogs.com/jhhh/p/16763560.html

浙公网安备 33010602011771号