zoukankan      html  css  js  c++  java
  • python冷知识

    省略号也是对象

    在python中一切皆对象,省略号(...)也是一个对象注意:只能是三个点的省略号

    在python中叫做Ellipsis

    在python3中能直接得到它

    print(...)
    print(type(...))
    

    Ellipsis
    <class 'ellipsis'>

    而在python2中没有这个,只能通过Ellipsis来获取

    print Ellipsis
    print type(Ellipsis)
    

    它转成布尔值为真

    print(bool(...))
    

    True

    它还是一个单例

    print(id(...))
    print(id(...))
    print(id(...))
    print(id(...))
    

    1435611440
    1435611440
    1435611440
    1435611440

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

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

    img

    奇怪的字符串

    示例一

    img

    示例二

    img

    示例三

    img

    and 和 or 的取值顺序

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

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

    print(2 or 3)
    print(2 and 3)
    

    2
    3

    访问类中的私有方法

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

    class People:
        def __speak(self):
            print('hello')
        def call_speak(self):
            self.__speak()
    tim=People()
    tim.call_speak()
    tim._People__speak()
    

    hello
    hello

    时有时无的切片异常

    这是个简单例子

    lis=[1,2,3]
    print(lis[5])
    

    执行一下,和我们预期的一样,会抛出索引异常。

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

    来看看,如下这种写法就不会报索引异常,它会返回一个空列表:

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

    []

    两次 return

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

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

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

    def text():
        try:
            return 1
        finally:
            return 0
    
    print(text())
    

    0

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

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

    for 死循环

    for 循环可以说是 基础得不能再基础的知识点了。

    但是如果让你用 for 写一个死循环,你会写吗?

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

    好了,如果你还没有思路,那就来看一下这个解法:

    for i in iter(int,1):
        print('1')
    

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

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

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

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

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

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

    由于int() 永远返回0,永远返回不了1

    所以这个 for 循环会没有终点。一直运行下去。

    intern机制

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

    例如:Python解释器中使用了 intern(字符串驻留)的技术来提高字符串效率,什么是intern机制?就是同样的字符串对象仅仅会保存一份,放在一个字符串储蓄池中,是共用的,当然,肯定不能改变,这也决定了字符串必须是不可变对象。

    img

  • 相关阅读:
    BZOJ 1191 HNOI2006 超级英雄hero
    BZOJ 2442 Usaco2011 Open 修建草坪
    BZOJ 1812 IOI 2005 riv
    OJ 1159 holiday
    BZOJ 1491 NOI 2007 社交网络
    NOIP2014 D1 T3
    BZOJ 2423 HAOI 2010 最长公共子序列
    LCA模板
    NOIP 2015 D1T2信息传递
    数据结构
  • 原文地址:https://www.cnblogs.com/MrYang161/p/11549987.html
Copyright © 2011-2022 走看看