1. 省略号也是对象

... 这是省略号,在Python中,一切皆对象。它也不例外。

在 Python 中,它叫做 Ellipsis 。

在 Python 3 中你可以直接写…来得到这玩意。

>>> ...
Ellipsis
>>> type(...)
<class  ellipsis >

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

>>> Ellipsis
Ellipsis
>>> type(Ellipsis)
<type  ellipsis >
>>>

它转为布尔值时为真

>>> bool(...)
True

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

>>> id(...)
4362672336
>>> id(...)
4362672336

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

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

try:
    1/0
except ZeroDivisionError:
    ...

2. 类首字母不一定是大写

在正常情况下,我们所编写的所见到的代码,好像都默许了类名首字母大写,而实例用小写的这一准则。但这并不是强制性的,即使你反过来的也没有关系。

但有一些内置的类,首字母都是小写,而实例都是大写。

比如 bool 是类名,而 True,False 是其实例;
比如 ellipsis 是类名,Ellipsis是实例;
还有 int,string,float,list,tuple,dict 等一系列数据类型都是类名,它们都是小写。

3. 增量赋值的性能更好

诸如 += 和 *= 这些运算符,叫做 增量赋值运算符。

这里使用用 += 举例,以下两种写法,在效果上是等价的。

# 第一种
a = 1 ; a += 1

# 第二种
a = 1; a = a + 1

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

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

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

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

4. and 和 or 的取值顺序

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

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

5. 如何修改解释器提示符

这个当做今天的一个小彩蛋吧。应该算是比较冷门的,估计知道的人很少了吧。

正常情况下,我们在 终端下 执行Python 命令是这样的。

>>> for i in range(2):
...     print (i)
...
0
1

你是否想过 >>> 和 ... 这两个提示符也是可以修改的呢?

>>> import sys                      
>>> sys.ps1                         
>>>                                
>>> sys.ps2                         
...                                
>>>                                 
>>> sys.ps2 =  ................                  
>>> sys.ps1 =  Python编程时光>>>        
Python编程时光>>>for i in range(2):     
................    print (i)                    
................                                 
0                                   
1

06. 默认参数最好不为可变对象

函数的参数分三种

  • 可变参数

  • 默认参数

  • 关键字参数

这三者的具体区别,和使用方法在 廖雪峰的教程 里会详细的解释。这里就不搬运了。

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

先来看一个示例

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 会与这个内存地址绑定。在后面的函数调用中,如果调用方指定了新的默认值,就会将原来的默认值覆盖。如果调用方没有指定新的默认值,那就会使用原来的默认值。

07. 访问类中的私有方法

大家都知道,类中可供直接调用的方法,只有公有方法(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()

08. 时有时无的切片异常

这是个简单例子

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 <module>
    print(my_list[5])
IndexError: list index out of range

但是今天要说的肯定不是这个,而是一个你可能会不知道的冷知识。

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

my_list = [1, 2, 3]
print(my_list[5:])

09. 哪些情况下不需要续行符

在写代码时,为了代码的可读性,代码的排版是尤为重要的。

为了实现高可读性的代码,我们常常使用到的就是续行符 

>>> a =  talk is cheap,
...      show me the code.
>>>
>>> print(a)
talk is cheap,show me the code.

那有些情况下,是不需要写续行符的呢?

经过总结,在这些符号中间的代码换行可以省略掉续行符:[],(),{}

>>> my_list=[1,2,3,
...          4,5,6]

>>> my_tuple=(1,2,3,
...           4,5,6)

>>> my_dict={"name": "MING",
...          "gender": "male"}

另外还有,在多行文本注释中   ,续行符也是可以不写的。

>>> text =  talk is cheap,
...           show me the code

上面只举了一些简单的例子。

但你要学会举一反三。一样的,在以下这些场景也同样适用

  • 类,和函数的定义。

  • 列表推导式,字典推导式,集合推导式,生成器表达式

10. Py2 也可以使用 print()

我相信应该有不少人,思维定式,觉得只有 Py3 才可以使用 print(),而 Py2 只能使用print   。

今天,小明要为 Py2 正名一次。

在Python 2.6之前,只支持

print "hello"

在Python 2.6和2.7中,可以支持如下三种

print "hello"
print("hello")
print ("hello")

在Python3.x中,可以支持如下两种

print("hello")
print ("hello")

10 个不为人知的Python冷知识的更多相关文章

  1. 10个不为人知的 Python 冷知识

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

  2. python 冷知识(装13 指南)

    python 冷知识(装13 指南) list1 += list2 和 list1 = list1 + list2 的区别 alpha = [1, 2, 3] beta = alpha # alpha ...

  3. python冷知识(续)

    python 冷知识 1.交互式中修改最大递归深度 大家都知道使用递归是有风险的,递归深度过深容易导致堆栈的溢出. 那到底,默认递归次数限制是多少呢? 可以使用sys这个库来查看 >>&g ...

  4. python冷知识

    目录 省略号也是对象 奇怪的字符串 and 和 or 的取值顺序 访问类中的私有方法 时有时无的切片异常 两次 return for 死循环 intern机制 省略号也是对象 在python中一切皆对 ...

  5. python 冷知识

    nohup python robot.py nohup python -u robot.py > robot.log 2>&1 & -u 就是指定实时的日志输出目录,而 & ...

  6. 盘点 Python 中的那些冷知识(二)

    上一篇文章分享了 Python中的那些冷知识,地址在这里 盘点 Python 中的那些冷知识(一) 今天将接着分享!! 06. 默认参数最好不为可变对象 函数的参数分三种 可变参数 默认参数 关键字参 ...

  7. 前端不为人知的一面--前端冷知识集锦 前端已经被玩儿坏了!像console.log()可以向控制台输出图片

    前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前 ...

  8. 前端不为人知的一面–前端冷知识集锦 原文地址(http://web.jobbole.com/83473/);

    前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前 ...

  9. Python 浮点数的冷知识

    本周的PyCoder's Weekly 上分享了一篇小文章,它里面提到的冷知识很有意思,我稍作补充,分享给大家. 它提到的部分问题,读者们可以先思考下: 若两个元组相等,即 a==b 且 a is b ...

随机推荐

  1. Longhorn,Kubernetes 云原生分布式块存储

    Longhorn 是用于 Kubernetes 的轻量级.可靠且功能强大的分布式块存储系统. Longhorn 使用容器(containers)和微服务(microservices)实现分布式块存储. ...

  2. IDEA Maven快速创建JavaWeb项目

    鉴于这是基本功,而且发现自己经常犯类似的错误,因此详细记录一下这个问题. 1.准备 以笔者的测试软件以及版本为准 IDEA 2020.3 Maven3.6.5 Tomcat 8.5 JDK1.8 2. ...

  3. Guava入门第一章(Joiner)

    Guava是什么? Guava是一种基于开源的Java库,Google Guava源于2007年的"Google Collections Library".这个库是为了方便编码,并 ...

  4. MySQL数据库优化(2)

    MySQL优化 大批量插入数据优化 1.将数据按照id有序排列 2.使用load关键字(100万条:有序20s,无序1分50秒) 3.插入之前,关闭唯一性校验(SET UNIQUE_CHECKS=0) ...

  5. 在VMware中安装Centos6值得注意的几点

    关于在VMware上安装centos6.9时遇到的几个值得说的点 0x01关于分区 分区时候可以选择默认分区,也可以选择自定义布局,这里选择自定义布局 点击sda,选择创建,再选标准分区->创建 ...

  6. 从零开始实现简单 RPC 框架 3:配置总线 URL

    URL 的定义 URL 对于大部分程序猿来说都是很熟悉的,其全称是 Uniform Resource Locator (统一资源定位器).它是互联网的统一资源定位标志,也就是指网络地址. 一个标准的 ...

  7. innodb是如何存数据的?yyds

    前言 如果你使用过mysql数据库,对它的存储引擎:innodb,一定不会感到陌生. 众所周知,在mysql8以前,默认的存储引擎是:myslam.但mysql8之后,默认的存储引擎已经变成了:inn ...

  8. 从一次netty 内存泄露问题来看netty对POST请求的解析

    背景 最近生产环境一个基于 netty 的网关服务频繁 full gc 观察内存占用,并把时间维度拉的比较长,可以看到可用内存有明显的下降趋势 出现这种情况,按往常的经验,多半是内存泄露了 问题定位 ...

  9. Python小白的数学建模课-19.网络流优化问题

    流在生活中十分常见,例如交通系统中的人流.车流.物流,供水管网中的水流,金融系统中的现金流,网络中的信息流.网络流优化问题是基本的网络优化问题,应用非常广泛. 网络流优化问题最重要的指标是边的成本和容 ...

  10. kubebuilder实战之四:operator需求说明和设计

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...