分享6个隐藏的python功能


Posted in Python onDecember 07, 2017

小编在以前给大家介绍过python一些很少用到的功能,这次我们给大家分享了6个隐藏的python功能,学习下。

在python的设计哲学中,有这么一条内容:“Simple is better than complex”,简单的代码比复杂的要好,这也是为什么python被推荐为初学者必学的语言。很多人初学python,往往会受到其他语言的影响,比如之前学过java的,把python代码写的像java一样。举个例子,在java中设计一个类时,我们常常会为内部变量定义get和set方法,这是保证封装性的重要手段,但是在python中却不建议这样做,python中的内部变量使用单下划线表示(比如self.__name),不过这样定义了还是可以访问到私有变量。怎么说?python中使用约定,我不会强制说这个变量你不能访问,但是你最好不要这样做。如果需要对变量进行其他操作,使用@parameter装饰器进行get和set封装,这样直接访问内部变量会出错。讲偏了,关于类和对象这方面的内容以后再说。

你如果打开python交互环境,输入import this可以看到以下内容:

The Zen of Python, by Tim Peters
Beautiful is better than ugly. 优美胜于丑陋
Explicit is better than implicit. 明了胜于晦涩
Simple is better than complex. 简单胜过复杂
Complex is better than complicated. 复杂胜过凌乱
Flat is better than nested.扁平胜于嵌套
Sparse is better than dense.  间隔胜于紧凑

这些是python的设计哲学,后面还有一些没列出来,在写python代码时最好遵从这些设计哲学。

第一个功能。

如果让你写一段代码表示a大于2且小于10,大多数人都会用a > 2 && a < 10对吧,在python中你可以直接使用2 < a < 10。

a = 5
# 可以这样
print(2 < a < 10)
# 也可以这样
print(10 > a <= 9)
True
True

还有一个很多人可能都知道的技巧,就地交换值,而不需要中间变量。

a = 2
b = 3
print(a, b)
# 直接交换
a, b = b, a
print(a, b)
2 3
3 2

第二个功能。

我们常常会需要用for循环来遍历序列中的值,然后进行某些操作。在其他语言中你可能这么写:

a = ['a', 'b', 'c', 'd', 'e']
for(int i = 0; i < len(a); i++):
print(a[i])

在python中很多人会这么写,对a的长度使用range生成一个序列,然后遍历。

a = ['a', 'b', 'c', 'd', 'e']
# 对a的长度使用range生成一个序列,然后遍历
for i in range(len(a)):
print(a[i])
a
b
c
d
e

其实你可以这样写,直接使用enumerate方法,它会返回序列的下标和值。

a = ['a', 'b', 'c', 'd', 'e']
# 对a的长度使用range生成一个序列,然后遍历
for i in enumerate(a):
print(i)
# 或者这样
for index, value in enumerate(a):
print(index, value)
(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
(4, 'e')
0 a
1 b
2 c
3 d
4 e

第三个功能。

一般情况下,循环语句和条件判断语句是互不相干的,if后面就是else,for之后是in。其实循环语句后面也可以跟着else。for之后跟着else的意思是,运行这个循环,然后执行else中的语句。

for i in foo:
  if i == 0:
    break
else:
  print("i was never 0")

除了for循环后面可以跟着else,while和try/except之后也可以跟着else。

第四个功能。

用过字典的都知道,如果我们需要字典中某个键的值,可以使用d['key']来获取,如果key不存在的话会抛出异常,这样肯定不好了,如果使用d.get('key'),在key值不存在时会默认返回None,这样就不用关心是否会有异常发生。其实还可以这样,d.get('key', 0),第二个参数指定key不存在时用来代替的值。

第五个功能。

正则表达式是个很让人头疼的东西,如果能加上注释该多好,这样我就知道自己写的是什么了。在Python中你可以这样。

# 对每一个规则使用引号括起来
pattern = (
 "^"         # beginning of string
"M{0,4}"      # thousands - 0 to 4 M's
"(CM|CD|D?C{0,3})" # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
          #      or 500-800 (D, followed by 0 to 3 C's)
"(XC|XL|L?X{0,3})" # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
          #    or 50-80 (L, followed by 0 to 3 X's)
"(IX|IV|V?I{0,3})" # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
          #    or 5-8 (V, followed by 0 to 3 I's)
"$"         # end of string
 )
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})$

第六个功能。

在上一篇迭代器和生成器中说过,iter()函数可以生成一个迭代器,之后你就能使用循环或者next方法来产出值。其实iter还接受第二个参数,它的作用是在迭代的过程中如果碰到第二个参数则停止。看个例子:

def seek_next_line(f):
for c in iter(lambda: f.read(1),'\n'):
pass

上面的代码中,从f中循环读入,如果碰到\n则结束读取。

其他的技巧像使用生成器表达式,利用拆包方法等等,之前都有说过,这里不再赘述。

Python 相关文章推荐
python使用新浪微博api上传图片到微博示例
Jan 10 Python
python图像处理之反色实现方法
May 30 Python
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
May 25 Python
Python+Socket实现基于UDP协议的局域网广播功能示例
Aug 31 Python
对Python之gzip文件读写的方法详解
Feb 08 Python
python监控进程状态,记录重启时间及进程号的实例
Jul 15 Python
用Anaconda安装本地python包的方法及路径问题(图文)
Jul 16 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
Aug 09 Python
Python中用pyinstaller打包时的图标问题及解决方法
Feb 17 Python
pycharm新建Vue项目的方法步骤(图文)
Mar 04 Python
pycharm2020.1.2永久破解激活教程,实测有效
Oct 29 Python
Python线程池与GIL全局锁实现抽奖小案例
Apr 13 Python
Python中pygal绘制雷达图代码分享
Dec 07 #Python
Python学习之用pygal画世界地图实例
Dec 07 #Python
用Pygal绘制直方图代码示例
Dec 07 #Python
[原创]pip和pygal的安装实例教程
Dec 07 #Python
利用Python进行异常值分析实例代码
Dec 07 #Python
Python3解决棋盘覆盖问题的方法示例
Dec 07 #Python
python实现对excel进行数据剔除操作实例
Dec 07 #Python
You might like
php调用c接口无错版介绍
2014/03/11 PHP
php与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
PHP之预定义接口详解
2015/07/29 PHP
php简单构造json多维数组的方法示例
2017/06/08 PHP
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
Jquery Ajax学习实例6 向WebService发出请求,返回DataSet(XML) 异步调用
2010/03/18 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
解决ExtJS在chrome或火狐中正常显示在ie中不显示的浏览器兼容问题
2013/01/11 Javascript
js 判断计算字符串长度/判断空的简单方法
2013/08/05 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
js 调用百度地图api并在地图上进行打点添加标注
2014/05/13 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
2018/08/29 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
vue中js判断长时间不操作界面自动退出登录(推荐)
2020/01/22 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
Python3基础之基本运算符概述
2014/08/13 Python
Python中操作文件之write()方法的使用教程
2015/05/25 Python
Python模块搜索概念介绍及模块安装方法介绍
2015/06/03 Python
在python中安装basemap的教程
2018/09/20 Python
Python3 执行Linux Bash命令的方法
2019/07/12 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
python怎么删除缓存文件
2020/07/19 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
阿迪达斯越南官网:adidas越南
2020/07/19 全球购物
C#里面如何倒序排列一个数组的元素?
2013/06/21 面试题
运动会通讯稿300字
2014/02/02 职场文书
求职信格式要求
2014/05/23 职场文书
出生公证书
2015/01/23 职场文书
学习保证书100字
2015/02/26 职场文书
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫