一、if __name__ == '__main__'
Pyhton不同于C/C++,程序并不需要执行主程序main()这样的程序入口,而是文件自上而下的编译执行。在很多python程序中都会有下面这样的语句。
if __name__ == '__main__': pass
这段代码的作用主要是让python文件可以独立运行,也可以当做模块导入到其他文件。
当a.py文件被直接运行时,__name__就是__main__,if __name__ == '__main__'之下的代码块将被运行;当a.py文件以模块形式被导入时,__name__是导入模块的名字,及a.py,if __name__ == '__main__'之下的代码块不被运行。
二、ulr编码、解码
导入标准模块urllib中的parse方法
from urllib import parse url='www.baidu.com?query=学习' url_encode = parse.quote_plus(url)#url编码 baidu_url= 'https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=idx=1&E5%9F%BA%E7%A1' url_decode =parse.unquote_plus(baidu_url)#url解码
三、例子
需求:用面向对象实现签名生成
1、请求数据:vendorId=100&ip=127.0.0.1&Version=2.0&mac=D4-81-D7-CA
2、商家编码:100
3、计算规则:
(1) 将商家编码进行2次md5,得到astr
(2) 再将请求数据进行一次urldecode,urlstr
(3) astr+urlstr MD5一次获得最终的签名
实现:encryption.py
import hashlib from urllib import parse class Sign(object): def __init__(self,req_data): self.req_data = req_data#这样写,在其他的函数里面可以直接用self.req_data def MD5(self,s): md = hashlib.md5()# 实例化 md.update(s.encode())# 调用实例方法 return md.hexdigest() def get_verid(self):#获取vendorId data_d = {} data_l = self.req_data.split('&') for i in data_l: # k = i.split('=')[0] # v = i.split('=')[1] k,v = i.split('=')#数组只有两个数字,可以这样顺序赋值 data_d.setdefault(k,v) return data_d.get('vendorId') def get_sign(self):#获取签名 astr = self.MD5(self.MD5(self.get_verid())) urlstr = parse.unquote_plus(self.req_data)#url解码 res = self.MD5(astr+urlstr) return res print(__name__) if __name__ == '__main__':#pycharm里敲:main,可以直接打印出这行 s = 'vendorId=100&ip=127.0.0.1&Version=2.0&mac=D4-81-D7-CA' s_sign = Sign(s) print(s_sign.get_sign())
此时,直接运行encryption.py时,将会打印出
__main__ 1a799d77b36f792b120aa073b1752639
若将encryption.py以模块形式导入,运行
import encryption #将encryption从头到尾执行一遍
得到的结果是
encryption