python那点技术

Python 函数之妙

2018-09-06  本文已影响23人  不爱去冒险的少年y

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.

上一篇下一篇

猜你喜欢

热点阅读