摘要:先不讲数据结构了,这次来说说中一些不被注意的功能。直接交换第二个功能。对的长度使用生成一个序列,然后遍历或者这样第三个功能。其实还接受第二个参数,它的作用是在迭代的过程中如果碰到第二个参数则停止。
先不讲数据结构了,这次来说说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)," "): pass
上面的代码中,从f中循环读入,如果碰到 则结束读取。
其他的技巧像使用生成器表达式,利用拆包方法等等,之前都有说过,这里不再赘述。
本人才疏学浅,上文中难免有些错误,还请各位品评指正。如果觉得写的还行,欢迎关注我的公众号MLGroup,带你走进机器学习的世界。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/41036.html
摘要:可见装饰器改变了函数的功能。装饰器除了改变函数功能之外还有一个特性是,函数装饰器在导入模块时立即执行,而被装饰的函数只在明确调用时运行。 什么是装饰器 装饰器是什么,简单来说,装饰器可以改变一个函数的行为,比如原本有一个函数用来计算菲波那切数列,我们给这个函数加个计算执行时间的装饰器,这样原来的函数不仅能够计算菲波那切数列,而且还可以输出计算花费了多少时间。 在Python中,有几个很...
摘要:来说说迭代器和生成器,还有可迭代对象和生成器表达式。有点绕是不是,其实,一般只要知道可迭代对象以及它是如何实现的就行了,中常常用生成器来代替迭代器,可以说,生成器就是迭代器。 来说说迭代器和生成器,还有可迭代对象和生成器表达式。 之前简单的提到过,一个对象是可迭代的可以理解为能够使用for循环。这样说其实不太准确,某个对象可迭代是因为它内部实现了$__iter__$这个特殊方法。比如在...
摘要:找出列表中小于的数据除了列表推导式,还有字典推导式,集合推导式,用法都一样。如果你的数据量很大的话,考虑使用生成器表达式。切片不仅对列表有用,同样适用于元组和字符串。切片命名使用方法,内部参数与切片一样。对剩余的的数据,使用星号代替即可。 上次我们讲了几个不常见的数据类型,每个都有自己特殊的用途,虽然不经常用到,了解一下也好。比如我们提到的数组类型,如果在数据量很大的时候同时要效率,就...
摘要:字典和集合都是基于散列表实现的,散列表也就是表,了解过数据结构的应该知道。而使用另一种办法,任何键在找不到的情况下都会用中的值数据类型比如替换。在设计时就可以使用创建你的数据接口。 这次主要说说字典和集合这两种数据类型。 字典和集合都是基于散列表实现的,散列表也就是hash表,了解过数据结构的应该知道。与散列表相关的一个概念叫做可散列,什么是可散列?在python官方定义中是这样说的:...
摘要:挤掉了堆中实现了堆排序。你可以用堆排序来查找一个序列中最大的或者最小的几个元素。除了使用堆排序,中还有排序和,这两个排序最终生成以列表表示的排序结果,堆排序也是。 这次我们来说说python中的数据结构。当然了,不会讲很基础的内容。 用过python的都知道,python有着与其他语言很不一样的数据类型,像什么列表、元组、集合、字典之类。这些数据类型造就了python简单易用同时又很强...
阅读 900·2021-10-13 09:48
阅读 3816·2021-09-22 10:53
阅读 3082·2021-08-30 09:41
阅读 1927·2019-08-30 15:55
阅读 2905·2019-08-30 15:55
阅读 1811·2019-08-30 14:11
阅读 2154·2019-08-29 13:44
阅读 742·2019-08-26 12:23