1. 程式人生 > >python生成器、迭代器、__call__、閉包簡單說明

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)