最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Python中的10条冷门知识

    正文概述    2020-06-02   268

    Python中的10条冷门知识

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

    1、省略号也是对象

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

    >>> ...

    Ellipsis

    >>> type(...)

    <class 'ellipsis'>

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

    >>> Ellipsis

    Ellipsis

    >>> type(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 <module>

        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中的10条冷门知识

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元