python生成器、迭代器、__call__、闭包简单说明
1.生成器
这种一边循环一边计算的机制,称为生成器:generator,最简单的方法是把生成式的[]改为().
>>> l=(x * x for x in range(1, 11) if x % 2 == 0) >>> l <generator object <genexpr> at 0x7fb6ca32fca8> 定义生成器的另一种方法:如果一个函数定义中包含yield关键字, 那么这个函数就不再是一个普通函数,而是一个生成器: def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a+b n += 1 return 'done' 任何一个循环都得有一个结束条件,n在这个函数中就是结束条件, b是主角a是配角,循环一次生成器就改变一次.
2.迭代器
凡是可作用于for循环的对象都是Iterable类型(可迭代对象); 凡是可作用于next()函数的对象都是Iterator类型;它们表示一个惰性计算的序列; 集合数据类型如list、dict、str等是Iterable但不是Iterator, 不过可以通过iter()函数获得一个Iterator对象; Python的for循环本质上就是通过不断调用next()函数实现的.
3.在页脚html代码添加如下内容,会增加打赏功能:
<script> window.tctipConfig = { staticPrefix: "http://static.tctip.com", buttonImageId: 5, buttonTip: "zanzhu", list:{ alipay: { qrimg: "https://files.cnblogs.com/files/fawaikuangtu123/weichat.bmp"}, //修改1 weixin: { qrimg: "https://files.cnblogs.com/files/fawaikuangtu123/zfb.bmp"}, //修改2 } }; </script>
4.在页首html代码添加如下代码,右上角会出现藏着github地址的a标签图片:
<a href="https://github.com/LiXiang-LiXiang" title="Fork me on GitHub" target="_blank"> <img style="position: absolute; top: 72px; right: 1px; border: 0" alt="Fork me on GitHub" src="http://images.cnblogs.com/cnblogs_com/fawaikuangtu123/1343168/o_Fuck-me-on-GitHub.png"></a>
5.Python __call__ 方法
实现了__call__方法的对象,相当于重载了(),可以实现调用功能.
class A(): def __call__(self,name): print("%s is running!" % name) >>> a = A() >>> a("people") people is running!
实现斐波纳契数列的类:
class Fib(object): def __call__(self, *args, **kwargs): ret = [1,1] num = int(args[0]) if num == 1: return [1, ] else: while len(ret) < num: ret.append(ret[-1] + ret[-2]) return ret hehe = Fib() print(hehe(5))
6.部署完一个网站后,想统计用户总访问量、日访问量、用户ip地址和该ip地址的访问次数,
定义一个函数,也可以是装饰器,在视图中调用,
这种做法只适合简单页面访问量统计,不适合统计高并发页面访问量,而且会降低性能,
等以后水平高了再来想这个问题.
参考地址:https://blog.csdn.net/Duke10/article/details/81273741
Django2.0整合markdown编辑器并实现代码高亮
参考地址:https://blog.csdn.net/Duke10/article/details/81033686
7.闭包
闭包:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,
并且外函数的返回值是内函数的引用,这样就构成了一个闭包.
def test(number): print("--1--") def test_in(number2): print("--2--") print(number + number2) print("--3--") return test_in ret = test(100) ret(1)