Python 函数之妙

作者: 不爱去冒险的少年y | 来源:发表于2018-09-06 09:39 被阅读23次

    1:eval()函数

    eval() 官方文档里面给出来的功能解释是:将字符串string对象转化为有效的表达式参与求值运算返回计算结果。

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    # author:ChenJH
    # datetime:2018/9/6 9:07
    # software: PyCharm
    
    def eval_test():
        a = '1+2'
        l = '[1,2,3,4,[5,6,7,8,9]]'
        d = "{'a':123,'b':456,'c':789}"
        t = '([1,3,5],[5,6,7,8,9],[123,456,789])'
        print('--------------------------转化开始--------------------------------')
        b = eval(a)
        print(b)
        print(type(l), type(eval(l)))
        print(type(d), type(eval(d)))
        print(type(t), type(eval(t)))
    
    
    if __name__ == "__main__":
        eval_test()
    
    
    
    结果:
    --------------------------转化开始--------------------------------
    3
    <class 'str'> <class 'list'>
    <class 'str'> <class 'dict'>
    <class 'str'> <class 'tuple'>
    

    上面展示了eval()函数对字符串进行计算,类型转化的操作;可谓该函数的功能是多么的强大,但是在功能强大的同时,可能会有非法之徒用其做坏事。
    在接口获取用户传输数据的时候,用户恶意传输了
    __import__('os').system('dir')
    那么eval()之后,你会发现,当前目录文件都会展现在用户前面。
    那么继续输入:
    open('文件名').read()
    代码都给人看了。获取完毕,一条删除命令,文件消失。哭吧!

    怎么避免安全问题?
    1.自行编写解析函数
    2.如果是类型转换可以使用ast.literal_eval()

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    # author:ChenJH
    # datetime:2018/9/6 9:07
    # software: PyCharm
    import ast
    def eval_test():
        c = "__import__('os').system('dir')"
        a = '1+2'
        l = '[1,2,3,4,[5,6,7,8,9]]'
        d = "{'a':123,'b':456,'c':789}"
        t = '([1,3,5],[5,6,7,8,9],[123,456,789])'
        print('--------------------------转化开始--------------------------------')
    
        # print(ast.literal_eval(a))    #报错
        # print(ast.literal_eval(c))    #报错
        print(ast.literal_eval(l))
        print(ast.literal_eval(d))
        print(ast.literal_eval(t))
        b = eval(a)
        c = eval(c)
    
        print(b)
        print(c)
        print(type(l), type(eval(l)))
        print(type(d), type(eval(d)))
        print(type(t), type(eval(t)))
    
    
    if __name__ == "__main__":
        eval_test()
    
    结果:
    
    --------------------------转化开始--------------------------------
    [1, 2, 3, 4, [5, 6, 7, 8, 9]]
    {'a': 123, 'b': 456, 'c': 789}
    ([1, 3, 5], [5, 6, 7, 8, 9], [123, 456, 789])
     ������ E �еľ��� �ĵ�
     �������� 57AA-6012
    
     E:\tensorflow\tf_7_18 ��Ŀ¼
    
    2018/09/06  09:33    <DIR>          .
    2018/09/06  09:33    <DIR>          ..
    2018/09/06  09:33    <DIR>          .idea
    2018/09/06  09:33               789 evalTest.py
    2018/07/18  16:13    <DIR>          gragh
    2018/07/18  14:06    <DIR>          graghs
    2018/07/18  21:04             1,941 tx_01.py
                   2 ���ļ�          2,730 �ֽ�
                   5 ��Ŀ¼ 136,710,369,280 �����ֽ�
    3
    0
    <class 'str'> <class 'list'>
    <class 'str'> <class 'dict'>
    <class 'str'> <class 'tuple'>
    
    

    2:is 与 == 的区别

    Python中有很多运算符,今天我们就来讲讲is和==两种运算符在应用上的本质区别是什么。

    在讲is和==这两种运算符区别之前,首先要知道Python中对象包含的三个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。

    is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来看看具体区别在哪。

    ==比较操作符和is同一性运算符区别

    ==是python标准操作符中的比较操作符,用来比较判断两个对象的value(值)是否相等,例如下面两个字符串间的比较:

    例1.
    
    >>> a = 'cheesezh'
    >>> b = 'cheesezh'
    >>> a == b
    True
    
    值相同:只有数值型和字符串型的情况下,a is b才为True,当a和b是tuple,list,dict或set型时,a is b为False。
    所有数据类型 a==b 都为True

    3:python字符串其实是一个固定长度的字符数组,所以不用结束标志了。修改字符串其实是另外生成一个新的。

    4:python 中的and从左到右计算表达式,若所有值均为真,则返回最后一个值,若存在假,返回第一个假值。or返回第一个True的值

    5:from sys import argv的作用:

    sys为python的内置模块,提供了很多函数和变量来处理Python运行时环境的不同部分。

    argv为“参数变量”,是一个参数列表,且第一个参数为脚本名称。

    sys.argv为sys模块的参数变量,同样可以视为参数列表,通过sys.argv[ ]来提取。sys.argv[0]表示参数列表中的第一个参数,即脚本本身名称;sys.argv[1]表示第二参数,如下图3,对应ex14.py,a,b,c中的第二参数,a.

    相关文章

      网友评论

        本文标题:Python 函数之妙

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