Python 函数之妙
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.