一、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

 

posted on 2018-05-22 18:21  忻冉然  阅读(262)  评论(0编辑  收藏  举报