美文网首页大数据,机器学习,人工智能大数据 爬虫Python AI Sql玩转大数据
简单好玩的10个python知识点,你知道几个呢?初学者建议收藏

简单好玩的10个python知识点,你知道几个呢?初学者建议收藏

作者: 木易_1541 | 来源:发表于2019-10-29 09:58 被阅读0次

    ... 这是省略号,在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:

    ...

    在这里相信有许多想要学习Python的同学,大家可以+下Python学习分享裙:五二八 三九七 六一七,即可免费领取一整套系统的 Python学习教程!

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

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

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

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

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

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

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

    # 第一种

    a = 1 ; a += 1

    # 第二种

    a = 1; a = a + 1

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

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

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

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

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

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

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

    14 # 2*7

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

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

    >>> for i in range(2):

    ... print (i)

    ...

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

    >>> import sys

    >>> sys.ps1

    '>>> '

    >>> sys.ps2

    '... '

    >>>

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

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

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

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

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

    对于 _ ,我想很多人都非常熟悉。

    给变量取名好艰难,用 _;

    懒得长长的变量名,用 _;

    无用的垃圾变量,用 _;

    以上,我们都很熟悉了,今天要介绍的是他在交互式中使用。

    >>> 3 + 4

    >>> _

    >>> name='ming'

    >>> name

    'ming'

    >>> _

    'ming'

    它可以返回上一次的运行结果。

    但是,如果是print函数打印出来的就不行了。

    >>> 3 + 4

    >>> _

    >>> print("ming")

    ming

    >>> _

    我自己写了个例子,验证了下,用__repr__输出的内容可以被获取到的。

    首先,在我们的目录下,写一个文件 ming.py。内容如下

    # ming.py

    class mytest():

    def __str__(self):

    return "hello"

    def __repr__(self):

    return "world"

    然后在这个目录下进入交互式环境。

    >>> import ming

    >>> mt=ming.mytest()

    >>> mt

    world

    >>> print(mt)

    hello

    >>> _

    world

    知道这两个魔法方法的人,一看就明白了。

    七、优雅的反转字符串/列表

    反转序列并不难,但是如何做到最优雅呢?

    先来看看,正常是如何反转的。

    最简单的方法是使用列表自带的reverse()方法。

    >>> ml = [1,2,3,4,5]

    >>> ml.reverse()

    >>> ml

    [5, 4, 3, 2, 1]

    但如果你要处理的是字符串,reverse就无能为力了。你可以尝试将其转化成list,再reverse,然后再转化成str。转来转去,也太麻烦了吧?需要这么多行代码(后面三行是不能合并成一行的),一点都Pythonic。

    mstr1 = 'abc'

    ml1 = list(mstr1)

    ml1.reverse()

    mstr2 = str(ml1)

    对于字符串还有一种稍微复杂一点的,是自定义递归函数来实现。

    def my_reverse(str):

    if str == "":

    return str

    else:

    return my_reverse(str[1:]) + str[0]

    在这里,介绍一种最优雅的反转方式,使用切片,不管你是字符串,还是列表,简直通杀。

    >>> mstr = 'abc'

    >>> ml = [1,2,3]

    >>> mstr[::-1]

    'cba'

    >>> ml[::-1]

    [3, 2, 1]

    上面才提到递归,大家都知道使用递归是有风险的,递归深度过深容易导致堆栈的溢出。如果你这字符串太长啦,使用递归方式反转,就会出现问题。

    那到底,默认递归次数限制是多少呢?

    可以使用sys这个库来查看

    >>> import sys

    >>> sys.getrecursionlimit()

    1000

    可以查,当然也可以自定义修改次数,退出即失效。不过友情提醒,这玩意还是不要轻易去碰,万一导致系统崩溃了小明可不背锅。

    >>> sys.setrecursionlimit(2000)

    >>> sys.getrecursionlimit()

    2000

    搭建FTP,或者是搭建网络文件系统,这些方法都能够实现Linux的目录共享。但是FTP和网络文件系统的功能都过于强大,因此它们都有一些不够方便的地方。比如你想快速共享Linux系统的某个目录给整个项目团队,还想在一分钟内做到,怎么办?很简单,使用Python中的SimpleHTTPServer。

    SimpleHTTPServer是Python 2自带的一个模块,是Python的Web服务器。它在Python 3已经合并到http.server模块中。具体例子如下,如不指定端口,则默认是8000端口。

    # python2

    python -m SimpleHTTPServer 8888

    # python3

    python3 -m http.server 8888

    直接在浏览器访问即可。

    SimpleHTTPServer有一个特性,如果待共享的目录下有index.html,那么index.html文件会被视为默认主页;如果不存在index.html文件,那么就会显示整个目录列表。

    if else 用法可以说最基础的语法表达式之一,但是今天不是讲这个的,一定要讲点不一样的。

    if else 早已烂大街,但可能有很多人都不曾见过 for else 和 try else 的用法。为什么说它曾让我晕头转向,因为它不像 if else 那么直白,非黑即白,脑子经常要想一下才能才反应过来代码怎么走。反正我是这样的。

    先来说说,for else

    def check_item(source_list, target):

    for item in source_list:

    if item == target:

    print("Exists!")

    break

    else:

    print("Does not exist")

    在往下看之前,你可以思考一下,什么情况下才会走 else。是循环被 break,还是没有break?

    给几个例子,你体会一下。

    check_item(["apple", "huawei", "oppo"], "oppo")

    # Exists!

    check_item(["apple", "huawei", "oppo"], "vivo")

    # Does not exist

    可以看出,没有被 break 的程序才会正常走else流程。

    再来看看,try else 用法。

    def test_try_else(attr1 = None):

    try:

    if attr1:

    pass

    else:

    raise

    except:

    print("Exception occurred...")

    else:

    print("No Exception occurred...")

    同样来几个例子。当不传参数时,就抛出异常。

    test_try_else()

    # Exception occurred...

    test_try_else("ming")

    # No Exception occurred...

    可以看出,没有 try 里面的代码块没有抛出异常的,会正常走else。

    总结一下,for else 和 try else 相同,只要代码正常走下去,不被 break,不抛出异常,就可以走else。

    有想学习python或者是正在学习中的小伙伴,小编这里给你准备好了全套的python视频教程+电子书籍,全部免费给你!

    相关文章

      网友评论

        本文标题:简单好玩的10个python知识点,你知道几个呢?初学者建议收藏

        本文链接:https://www.haomeiwen.com/subject/brfbvctx.html