分享6个隐藏的python功能
小编在以前给大家介绍过python一些很少用到的功能,这次我们给大家分享了6个隐藏的python功能,学习下。
在python的设计哲学中,有这么一条内容:“Simpleisbetterthancomplex”,简单的代码比复杂的要好,这也是为什么python被推荐为初学者必学的语言。很多人初学python,往往会受到其他语言的影响,比如之前学过java的,把python代码写的像java一样。举个例子,在java中设计一个类时,我们常常会为内部变量定义get和set方法,这是保证封装性的重要手段,但是在python中却不建议这样做,python中的内部变量使用单下划线表示(比如self.__name),不过这样定义了还是可以访问到私有变量。怎么说?python中使用约定,我不会强制说这个变量你不能访问,但是你最好不要这样做。如果需要对变量进行其他操作,使用@parameter装饰器进行get和set封装,这样直接访问内部变量会出错。讲偏了,关于类和对象这方面的内容以后再说。
你如果打开python交互环境,输入importthis可以看到以下内容:
TheZenofPython,byTimPeters Beautifulisbetterthanugly.优美胜于丑陋 Explicitisbetterthanimplicit.明了胜于晦涩 Simpleisbetterthancomplex.简单胜过复杂 Complexisbetterthancomplicated.复杂胜过凌乱 Flatisbetterthannested.扁平胜于嵌套 Sparseisbetterthandense.间隔胜于紧凑
这些是python的设计哲学,后面还有一些没列出来,在写python代码时最好遵从这些设计哲学。
第一个功能。
如果让你写一段代码表示a大于2且小于10,大多数人都会用a>2&&a<10对吧,在python中你可以直接使用2
还有一个很多人可能都知道的技巧,就地交换值,而不需要中间变量。 第二个功能。 我们常常会需要用for循环来遍历序列中的值,然后进行某些操作。在其他语言中你可能这么写: 在python中很多人会这么写,对a的长度使用range生成一个序列,然后遍历。 其实你可以这样写,直接使用enumerate方法,它会返回序列的下标和值。 第三个功能。 一般情况下,循环语句和条件判断语句是互不相干的,if后面就是else,for之后是in。其实循环语句后面也可以跟着else。for之后跟着else的意思是,运行这个循环,然后执行else中的语句。 除了for循环后面可以跟着else,while和try/except之后也可以跟着else。 第四个功能。 用过字典的都知道,如果我们需要字典中某个键的值,可以使用d['key']来获取,如果key不存在的话会抛出异常,这样肯定不好了,如果使用d.get('key'),在key值不存在时会默认返回None,这样就不用关心是否会有异常发生。其实还可以这样,d.get('key',0),第二个参数指定key不存在时用来代替的值。 第五个功能。 正则表达式是个很让人头疼的东西,如果能加上注释该多好,这样我就知道自己写的是什么了。在Python中你可以这样。 第六个功能。 在上一篇迭代器和生成器中说过,iter()函数可以生成一个迭代器,之后你就能使用循环或者next方法来产出值。其实iter还接受第二个参数,它的作用是在迭代的过程中如果碰到第二个参数则停止。看个例子: 上面的代码中,从f中循环读入,如果碰到\n则结束读取。 其他的技巧像使用生成器表达式,利用拆包方法等等,之前都有说过,这里不再赘述。
a=5
#可以这样
print(2a<=9)
True
True
a=2
b=3
print(a,b)
#直接交换
a,b=b,a
print(a,b)
23
32
a=['a','b','c','d','e']
for(inti=0;i
a=['a','b','c','d','e']
#对a的长度使用range生成一个序列,然后遍历
foriinrange(len(a)):
print(a[i])
a
b
c
d
e
a=['a','b','c','d','e']
#对a的长度使用range生成一个序列,然后遍历
foriinenumerate(a):
print(i)
#或者这样
forindex,valueinenumerate(a):
print(index,value)
(0,'a')
(1,'b')
(2,'c')
(3,'d')
(4,'e')
0a
1b
2c
3d
4e
foriinfoo:
ifi==0:
break
else:
print("iwasnever0")
#对每一个规则使用引号括起来
pattern=(
"^"#beginningofstring
"M{0,4}"#thousands-0to4M's
"(CM|CD|D?C{0,3})"#hundreds-900(CM),400(CD),0-300(0to3C's),
#or500-800(D,followedby0to3C's)
"(XC|XL|L?X{0,3})"#tens-90(XC),40(XL),0-30(0to3X's),
#or50-80(L,followedby0to3X's)
"(IX|IV|V?I{0,3})"#ones-9(IX),4(IV),0-3(0to3I's),
#or5-8(V,followedby0to3I's)
"$"#endofstring
)
print(pattern)
#然后bapattern放入对应的re匹配方法中。
^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$
defseek_next_line(f):
forciniter(lambda:f.read(1),'\n'):
pass