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

    正文概述    2020-07-04   159

    一些不为人知的Python冷知识

    省略号也是对象

    ... 这是省略号,在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 的人,可以说是没啥用的。

    类首字母不一定大写

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

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

    比如 bool 是类名,而 True,False 是其实例;

    比如 ellipsis 是类名,Ellipsis是实例;

    还有 int,string,float,list,tuple,dict 等一系列数据类型都是类名,它们都是小写。

    增量赋值的性能更好

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

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

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

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

    and和or的取值顺序

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

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

    如何修改解释器提示符

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

    正常情况下,我们在 终端下 执行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

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

    函数的参数分三种

    可变参数

    默认参数

    关键字参数

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

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

    先来看一个示例

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

    访问类中的私有方法

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

    时有时无的切片异常

    这是个简单例子

    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:])

    哪些情况不需要换行符

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

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

    >>> 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

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

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

    类,和函数的定义。

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


    起源地下载网 » 一些不为人知的Python冷知识

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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