本周学习了递归,递归的本质就是让函数自己调用自己。
例如斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368
从规律上观察,我们发现这个数列其实就是第一个数和第二个数相加的之和产生第三个数字。然后以刚才的第二个数和第三个数相加之和产生第四个数,以此类推下去。那么转换成代码也就是
def func(arg1,arg2): if arg1 == 0: print arg1, arg2 arg3 = arg1 + arg2 print arg3 func(arg2, arg3) func(0,1)
这样函数就一直不停的循环下去,直到超出内存寻址范围。
但是要注意,如果想要循环到某一个数字值的时候停止,例如当arg3的值超过1000的就不在循环了
def func(arg1,arg2): if arg1 == 0: print arg1, arg2 arg3 = arg1 + arg2 print arg3 if arg3 <1000 return arg3 func(arg2, arg3) print func(0,1)
这个样子不行的,这样打印出来的结果会是None,因为递归函数是自己调用自己,一层一层的循环下去。
假设这个循环值循环3次,那么第三次的时候 return arg3 其实是传给第二次循环,但是第二次循环并没有将结果在传给第一次循环。可我们print时候 其实是要print 最外层的结果。所以导致print出来的是None,那么修改的结果就应该是这样
def func(arg1,arg2): if arg1 == 0: print arg1, arg2 arg3 = arg1 + arg2 print arg3 if arg3 <1000 return arg3 return func(arg2, arg3)
这样的在最后再return fun()一下,把原来的内容下一层函数的结果逐级return回来,最后就可以得到想要的值了
模块
假设我们有一个pyhton文件名字是wgw.py里面有2个函数
def a(x): return x+1 def b(y): retrun y*y
现在有另外一个文件名称是test.py,在这文件里我们需要用到a()和b()两个函数,这时候我们就需要导入wgw.py模块到test.py中,这样我们就可以使用这两函数的功能了
import wgw print wgw.a(1) print wgw.b(3)
2 9
如果wgw.py里面的函数有超级多,但是我其实只想使用里面的一个函数而已。并且我觉得输入wgw.a()这个写法好麻烦,那么就换个方式导入.这种方式的导入就可以直接使用函数名而不需要前面再带着模块名称了
from wgw import a print a(1)
2
当然如果我真的想使用wgw.py中成千上万的函数,但又不想带着wgw.这个模块名称,那我就这样写
from wgw import *
如果我正巧在test.py函数里也有个叫a()的函数并且函数名称不能乱改,但也想使用wgw.a()这个函数
那就用临时修改别名的方式处理
from wgw import a as fake_a def a(x): return x+10 print fake_a(2) print a(2)
3 12
如果我把自己开发的模块都存放在一个叫libs的目录,那么我让别的函数调用我这个大的模块里面的内容的时候就必须要在libs目录下创建一个叫__init__.py的文件,这个文件可以空的。如果没有这个文件别人的是无法import到libs下面的函数的。
现在可以用,index.py文件可以用过如下方法使用libs包里的方法了
import libs libs.backend.a()
第三模块
python有强大的第三方模块,也就是别人开发好了咱们拿过直接用就可以了。
比如加密模块
# ######## md5 ######## hash = hashlib.md5() hash.update('admin') print hash.hexdigest() # ######## sha1 ######## hash = hashlib.sha1() hash.update('admin') print hash.hexdigest() # ######## sha256 ######## hash = hashlib.sha256() hash.update('admin') print hash.hexdigest() # ######## sha384 ######## hash = hashlib.sha384() hash.update('admin') print hash.hexdigest() # ######## sha512 ######## hash = hashlib.sha512() hash.update('admin') print hash.hexdigest()
以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。
import hashlib # ######## md5 ######## hash = hashlib.md5('898oaFs09f') hash.update('admin') print hash.hexdigest()
还不够吊?python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密
import hmac h = hmac.new('wueiqi') h.update('hellowo') print h.hexdigest()