前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python中有趣的特性

Python中有趣的特性

作者头像
不断折腾
发布2019-09-23 11:27:38
6240
发布2019-09-23 11:27:38
举报
文章被收录于专栏:折腾折腾再折腾
以下实例均来自wtfpython。这里写了前几个例子,让你了解具体写的是什么。阅读原版:后台回复 wtfpython 即可。

奇妙的字符串

代码语言:javascript
复制
# 1、
In [1]: a = "some_string"
In [2]: id(a)
Out[2]: 1741734895024
In [3]: id("some"+"_"+"string")
Out[3]: 1741734895024
# id是相同的
# 2、
In [4]: a = "wtf"
In [5]: b = "wtf"
In [6]: a is b
Out[6]: True
In [7]: a = "wtf!"
In [8]: b = "wtf!"
In [9]: a is b
Out[9]: False
'''
这里涉及到python 的字符串驻留机制(为了节省内存)。
python的字符串驻留机制,并不是对所有的数字,字符串,他只对“  [0-9] [a-z] [A-Z]和"_"(下划线)  ”有效,
当字符串中由其他字符比如“!@ # ¥ % -”时字符驻留机制是不起作用的。
我们都知道is比较的是对象,而==比较的是值,当字符串中含有!@ # ¥ % -”的是否,字符驻留机制不起作用,此时就会是
两个不同的引用。就会看到如上效果。
'''
# 3、
In [10]: 'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa'
Out[10]: True
In [11]: 'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa'
Out[11]: False
'''
出现这样的现象是因为常量折叠,是编译器的优化,当长度小于20,会被替换成'aaaaaaaaaaaaaaaaaaaa',
来减少运行的周期,只有长度小于20才会发生常量折叠。
'''
# 4、
In [12]: some_dict = {}
In [13]: some_dict[6] = "Java"
In [14]: some_dict[5.0] = "Python"
In [15]: some_dict[5] = "C#"
In [16]: some_dict[6]
Out[16]: 'Java'
In [17]: some_dict[5.0]
Out[17]: 'C#'
In [18]: some_dict[5]
Out[18]: 'C#'
In [19]: some_dict
Out[19]: {6: 'Java', 5.0: 'C#'}
'''
可以看到some_dict[5.0]被some_dict[5]覆盖掉了,在python字典中是通过比较键值是否相同和比较哈希值是否相等
来确定key是否相同。
由于
In [20]: 5 == 5.0
Out[20]: True
In [21]: hash(5) == hash(5.0)
Out[21]: True
所以前者就会被后者替换。
'''

返回值

代码语言:javascript
复制
In [22]: def some_func():
    ...:     try:
    ...:         return "from_try"
    ...:     finally:
    ...:         return "from_finally"
In [23]: some_func()
Out[23]: 'from_finally'
# 返回的是finally中的值。

评估时间的差异

代码语言:javascript
复制
# 1、
In [33]: array = [1,2,3]
In [34]: g = (x for x in array if array.count(x) > 0)
In [35]: array = [1,5,6]
In [36]: list(g)
Out[36]: [1]
'''
原因:in语句是在声明的时候执行,而if语句是运行时执行。
也就是说in后面的array是[1,2,3]而if后的array是[1,5,6]
'''
# 2、赋值方式带来的不同
In [37]: array_1 = [1,2,3]
In [38]: g1 = (x for x in array_1)
In [39]: array_1 = [1,2,3,4]
In [40]: list(g1)
Out[40]: [1, 2, 3]
In [41]: array_2 = [1,2,3]
In [42]: g2 = (x for x in array_2)
In [43]: array_2[:] = [1,2,3,4]
In [44]: list(g2)
Out[44]: [1, 2, 3, 4]
'''
切片操作更新了array_2的值,所以有所不同。
'''
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python入门到放弃 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档