下面时Python中一些不常见的冷门知识,感兴趣的小伙伴不妨来学习一下。

1、省略号也是对象

… 这是省略号,在Python中,一切皆对象。它也不例外。在 Python 中,它叫做 Ellipsis 。在 Python 3 中你可以直接写…来得到这玩意。

>>> ...

Ellipsis

>>> type(...)

而在 Python2 中没有…这个语法,只能直接写Ellipsis来获取。

>>> Ellipsis

Ellipsis

>>> type(Ellipsis)

它转为布尔值时为真

>>> bool(...)

True

最后,这东西是一个单例。

>>> id(...)

4362672336

>>> id(...)

4362672336

这东西有啥用呢?据说它是Numpy的语法糖,不玩 Numpy 的人,可以说是没啥用的。

在网上只看到这个 用 … 代替 pass ,稍微有点用,但又不是必须使用的。

try:

1/0

except ZeroDivisionError:

...

2、增量赋值的性能更好

诸如 += 和 *= 这些运算符,叫做 增量赋值运算符。这里使用用 += 举例,以下两种写法,在效果上是等价的。

# 第一种

a = 1 ; a += 1

# 第二种

a = 1; a = a + 1

+= 其背后使用的魔法方法是 iadd,如果没有实现这个方法则会退而求其次,使用 add 。

这两种写法有什么区别呢?

用列表举例 a += b,使用 add 的话就像是使用了a.extend(b),如果使用 add 的话,则是 a = a+b,前者是直接在原列表上进行扩展,而后者是先从原列表中取出值,在一个新的列表中进行扩展,然后再将新的列表对象返回给变量,显然后者的消耗要大些。

所以在能使用增量赋值的时候尽量使用它。

3、and 和or 的取值顺序

and 和 or 是我们再熟悉不过的两个逻辑运算符。而我们通常只用它来做判断,很少用它来取值。

如果一个or表达式中所有值都为真,Python会选择第一个值,而and表达式则会选择第二个。

>>>(2 or 3) * (5 and 7)

14  # 2*7

4、修改解释器提示符

>>> import sys

>>> sys.ps1

'>>> '

>>> sys.ps2

'... '

>>>

>>> sys.ps2 = '---------------- '

>>> sys.ps1 = 'Python编程时光>>>'

Python编程时光>>>for i in range(2):

----------------    print (i)

----------------

5、默认参数最好不为可变对象

函数的参数分三种

可变参数

默认参数

关键字参数

今天要说的是,传递默认参数时,新手很容易踩雷的一个坑。

先来看一个示例:

def func(item, item_list=[]):

item_list.append(item)

print(item_list)

func('iphone')

func('xiaomi', item_list=['oppo','vivo'])

func('huawei')

在这里,你可以暂停一下,思考一下会输出什么?

思考过后,你的答案是否和下面的一致呢

['iphone']

['oppo', 'vivo', 'xiaomi']

['iphone', 'huawei']

如果是,那你可以跳过这部分内容,如果不是,请接着往下看,这里来分析一下。

Python 中的 def 语句在每次执行的时候都初始化一个函数对象,这个函数对象就是我们要调用的函数,可以把它当成一个一般的对象,只不过这个对象拥有一个可执行的方法和部分属性。

对于参数中提供了初始值的参数,由于 Python 中的函数参数传递的是对象,也可以认为是传地址,在第一次初始化 def 的时候,会先生成这个可变对象的内存地址,然后将这个默认参数 item_list 会与这个内存地址绑定。在后面的函数调用中,如果调用方指定了新的默认值,就会将原来的默认值覆盖。如果调用方没有指定新的默认值,那就会使用原来的默认值。

在这里插入图片描述

6、访问类中的私有方法

大家都知道,类中可供直接调用的方法,只有公有方法(protected类型的方法也可以,但是不建议)。也就是说,类的私有方法是无法直接调用的。

这里先看一下例子

class Kls():

def public(self):

print('Hello public world!')

def __private(self):

print('Hello private world!')

def call_private(self):

self.__private()

ins = Kls()

# 调用公有方法,没问题

ins.public()

# 直接调用私有方法,不行

ins.__private()

# 但你可以通过内部公有方法,进行代理

ins.call_private()

既然都是方法,那我们真的没有方法可以直接调用吗?

当然有啦,只是建议你千万不要这样弄,这里只是普及,让你了解一下。

# 调用私有方法,以下两种等价

ins._Kls__private()

ins.call_private()

7、时有时无的切片异常

这是个简单例子

my_list = [1, 2, 3, 4, 5]

print(my_list[5])

Traceback (most recent call last):

File "F:/Python Script/test.py", line 2, in

print(my_list[5])

IndexError: list index out of range

来看看,如下这种写法就不会报索引异常,执行my_list[5:],会返回一个新list:[]。

my_list = [1, 2, 3]

print(my_list[5:])

8、for 死循环

for 循环可以说是 基础得不能再基础的知识点了。但是如果让你用 for 写一个死循环,你会写吗?(问题来自群友 陈**)

这是个开放性的问题,在往下看之前,建议你先尝试自己思考,你会如何解答。

好了,如果你还没有思路,那就来看一下 一个海外 MIT 群友的回答:

for i in iter(int, 1):pass

是不是懵逼了。iter 还有这种用法?这为啥是个死循环?

这真的是个冷知识,关于这个知识点,你如果看中文网站,可能找不到相关资料。

还好你可以通过 IDE 看py源码里的注释内容,介绍了很详细的使用方法。

原来iter有两种使用方法,通常我们的认知是第一种,将一个列表转化为一个迭代器。

而第二种方法,他接收一个 callable对象,和一个sentinel 参数。第一个对象会一直运行,直到它返回 sentinel 值才结束。

在这里插入图片描述

那int 呢,这又是一个知识点,int 是一个内建方法。通过看注释,可以看出它是有默认值0的。你可以在终端上输入 int() 看看是不是返回0。

在这里插入图片描述

由于int() 永远返回0,永远返回不了1,所以这个 for 循环会没有终点。一直运行下去。

9、奇怪的字符串

字符串类型作为 Python 中最常用的数据类型之一,Python解释器为了提高字符串使用的效率和使用性能,做了很多优化。

例如:Python 解释器中使用了 intern(字符串驻留)的技术来提高字符串效率。

什么是 intern 机制?就是同样的字符串对象仅仅会保存一份,放在一个字符串储蓄池中,是共用的,当然,肯定不能改变,这也决定了字符串必须是不可变对象。

示例一

# Python2.7

>>> a = "Hello_Python"

>>> id(a)

32045616

>>> id("Hello" + "_" + "Python")

32045616

# Python3.7

>>> a = "Hello_Python"

>>> id(a)

38764272

>>> id("Hello" + "_" + "Python")

32045616

示例二

>>> a = "MING"

>>> b = "MING"

>>> a is b

True

# Python2.7

>>> a, b = "MING!", "MING!"

>>> a is b

True

# Python3.7

>>> a, b = "MING!", "MING!"

>>> a is b

False

示例三

# Python2.7

>>> 'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa'

True

>>> 'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa'

False

# Python3.7

>>> 'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa'

True

>>> 'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa'

True

示例四

>>> s1="hello"

>>> s2="hello"

>>> s1 is s2

True

# 如果有空格,默认不启用intern机制

>>> s1="hell o"

>>> s2="hell o"

>>> s1 is s2

False

# 如果一个字符串长度超过20个字符,不启动intern机制

>>> s1 = "a" * 20

>>> s2 = "a" * 20

>>> s1 is s2

True

>>> s1 = "a" * 21

>>> s2 = "a" * 21

>>> s1 is s2

False

>>> s1 = "ab" * 10

>>> s2 = "ab" * 10

>>> s1 is s2

True

>>> s1 = "ab" * 11

>>> s2 = "ab" * 11

>>> s1 is s2

False

10、两次return

我们都知道,try…finally… 语句的用法,不管 try 里面是正常执行还是报异常,最终都能保证finally能够执行。

同时,我们又知道,一个函数里只要遇到 return 函数就会立马结束。

基于以上这两点,我们来看看这个例子,到底运行过程是怎么样的?

>>> def func():

...     try:

...         return 'try'

...     finally:

...         return 'finally'

...

>>> func()

'finally'

惊奇的发现,在try里的return居然不起作用。

原因是,在try…finally…语句中,try中的return会被直接忽视,因为要保证finally能够执行。

python 冷门知识点_Python中的10条冷门知识相关推荐

  1. 浅析:演讲中的10条禁忌

    浅析:演讲中的10条禁忌 (中国电子商务研究中心讯)人们上台进行演讲时,往往会犯同样的错误并且会畏畏缩缩,或者只是犯一些低级错误. 在演讲最开始的时候犯错,最容易失去观众,而且这时候出现错误的频率也最 ...

  2. 人们对Python在企业级开发中的10大误解

    From : 人们对Python在企业级开发中的10大误解 在PayPal的编程文化中存在着大量的语言多元化.除了长期流行的C++和Java,越来越多的团队选择JavaScript和Scala,Bra ...

  3. python 不安全的包或方法_Python中的10个常见安全漏洞及修复方法

    写安全的代码很困难,当你学习一门编程语言.一个模块或框架时,你会学习其使用方法.在考虑安全性时,你需要考虑如何避免代码被滥用,Python也不例外,即使在标准库中,也存在着许多糟糕的实例.然而,许多 ...

  4. python 小说数据挖掘_Python 中的实用数据挖掘

    第三步:数据转换为向量 现在,我们将每条消息(词干列表)转换成机器学习模型可以理解的向量. 用词袋模型完成这项工作需要三个步骤: 1. 对每个词在每条信息中出现的次数进行计数(词频): 2. 对计数进 ...

  5. mysql 取出20条数据_“取出数据表中第10条到第20条记录”的sql语句+select top 使用方法...

    1.首先.select top使用方法: select * from table --  取全部数据.返回无序集合 select top n * from table -- 依据表内数据存储顺序取前n ...

  6. python基本统计量_Python中简单统计量的计算

    本篇文章给大家带来的内容是关于Python中简单统计量的计算,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.这些操作都要确保已经在电脑中安装好了Anaconda集成库,如果安装好 ...

  7. list python 访问 键值对_基础|Python常用知识点汇总(中)

    字符串字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串.1.创建字符串 str1 = 'Hello World!' str2 = "Hello W ...

  8. mysql查询第10到第20条记录_“取出数据表中第10条到第20条记录”的sql语句+selecttop用法...

    1.首先,select top用法: 参考问题 select top n * from和select * from的区别 select * from table -- 取所有数据,返回无序集合 sel ...

  9. python怎么判断真假_Python不超过10行代码就可实现人脸识别,教你辨别真假

    [[爱编程的南风]Python不超过10行代码就可实现人脸识别,教你辨别真假]http://toutiao.com/group/6518157903055045127/?iid=15906422033 ...

最新文章

  1. Linux下显示硬盘空间的两个命令
  2. irobot扫地机器人 电压_【专利技术分析报告】“iRobot扫地机器人”核心专利
  3. 正则表达式的知识普及
  4. phpStorm重构快捷键(mac系统、持续更新)
  5. ElasticSearch-5.3.1集群环境搭建,安装ElasticSearch-head插件,安装错误解决
  6. odbc驱动程序配置失败_如何使用ODBC驱动程序配置链接服务器
  7. [转载] 20个常用Python库及200个第三方库
  8. hdu 1695GCD容斥
  9. android listview删除刷新,如何刷新Android ListView?
  10. 【金融科技前沿】金融实人认证+基于百度AI的身份证图片批量OCR识别
  11. 通过Modbus转EtherNetIP网关连接AB PLC的配置案例
  12. 深度学习----HOI人物交互算法:ICAN
  13. 【ESP32之旅】ESP32C3 Arduino库使用方法
  14. vue 打开一个iframe_vue嵌套iframe一系列问题
  15. 为什么使用html5播放器电脑会卡顿,电脑看视频卡顿是什么原因_电脑播放视频卡顿的处理办法-系统城...
  16. win7出现问题事件名称APPCRASH的解决方法
  17. JVM系列之深入理解JVM(三)
  18. AHB到标准握手时序桥 - 逻辑设计部分
  19. 缓冲区溢出的基本原理
  20. 王换招计算机组成与设计课件,计算机基础知识(课件)..ppt

热门文章

  1. 做柜员还是程序员_程序员放弃互联网选择去银行,但想到同学工资高好几倍心里不平衡...
  2. HTML特效代码大全【有备无患】
  3. 厉害了,Github标星113K的前端学习路线图有中文版了
  4. 软件项目管理的流程控制分析
  5. angularjs承诺
  6. python股票自动选股+止损止盈
  7. python-函数模块基础语法复习
  8. java 日期类Date插入mysql数据库时间总是比参数时间少一天
  9. HDU-2085核反应堆
  10. P3799 妖梦拼木棒——枚举+组合数学