python_裝飾器——迭代器——生成器

Carter_qx發表於2019-01-21

一、裝飾器

1、什麼是裝飾器?
    器=》工具,裝飾=》增加功能


    1、不修改原始碼
    2、不修改呼叫方式
    裝飾器是在遵循1和2原則的基礎上為被裝飾物件增加功能的工具

2、實現無參裝飾器
    1、無參裝飾器的模板
    def outter(func):
        def wrapper(*args,**kwargs):
            res=func(*args,**kwargs)
            return res
        return wrapper

    2、使用:在被裝飾物件正上方單獨一行
    @無參裝飾器名
    def foo():
        pass


3、實現有參裝飾器

    1、有參裝飾器的模板
    def outter2(x,y,z):
        def outter(func):
            def wrapper(*args,**kwargs):
                res=func(*args,**kwargs)
                return res
            return wrapper
        return outter
    2、使用:在被裝飾物件正上方單獨一行
    @有參裝飾器名(1,2,3)
    def foo():
        pass

二、迭代器

#1、什麼是迭代?:迭代是一個重複的過程,並且每次重複都是基於上一次的結果而來
# while True:
#     print(`=------->`)

# l={`x`:1,`y`:2}
# n=0
# while n < len(l):
#     print(l[n])
#     n+=1



#2、要想了解迭代器到底是什麼?必須先了解一個概念,即什麼是可迭代的物件?
#可迭代的物件:在python中,但凡內建有__iter__方法的物件,都是可迭代的物件
num=1

#以下都是可迭代的物件
# str1=`hello`
# list1=[1,2,3]
# tup1=(1,2,3)
# dic={`x`:1}
# s1={`a`,`b`,`c`}
# f=open(`a.txt`,`w`,encoding=`utf-8`)

三、生成器

#生成器:
# 函式內包含有yield關鍵字,
# 再呼叫函式,就不會執行函式體程式碼,拿到的返回值就是一個生成器物件
def chicken():
    print(`=====>first`)
    yield 1
    print(`=====>sencond`)
    yield 2
    print(`=====>third`)
    yield 3


obj=chicken()
# print(obj)
# 生成器本質就是迭代器,也就是說生成器的玩法其實就是迭代器的玩法
# print(obj.__iter__() is obj)
# res=obj.__next__()
# print(res)
#
# res1=obj.__next__()
# print(res1)
#
# res2=obj.__next__()
# print(res2)
#
# obj.__next__()


# 1、iter_obj=obj.__iter__(),拿到迭代器
#2、出發iter_obj.__next__(),拿到該方法的返回值,賦值給item
#3、周而復始,直到函式內不在有yield,即取值完畢
#4、for會檢測到StopIteration異常,結束迴圈
# for item in obj:
#     print(item)


#總結yield:
#1、為我們提供了一種自定義迭代器的方式,
#    可以在函式內用yield關鍵字,呼叫函式拿到的結果就是一個生成器,生成器就是迭代器
#2、yield可以像return一樣用於返回值,區別是return只能返回一次值,而yield可返回多次
#    因為yield可以儲存函式執行的狀態

# def my_range():
#     print(`start........`)
#     n=0
#     while True:
#         yield n
#         n+=1

# obj=my_range()
# print(obj)

# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__())

# for i in my_range():
#     print(i)


def my_range(start,stop,step=1):
    n=start
    while n < stop:
        yield n #yield 4
        n+=step #5


# obj=my_range(3,7,2) #3,5,
# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__())


for item in my_range(5,10,2):
    print(item)

四、程式導向程式設計

1、什麼是程式導向程式設計:
核心是”過程“二字,過程指的是解決問題的步驟
即先幹什麼,再幹什麼
基於該思想編寫程式就好比在設計一條流水線,是一種
機械式的思維方式
2、優點:
複雜的問題流程化、進而簡單化

3、缺點:
擴充套件性差

xxxx

#1、步驟一:拿到使用者輸入的合法的資訊:使用者名稱、密碼、餘額、年齡
db_path=`db.txt`

def get_uname():
    while True:
        uname=input(`使用者名稱>>:`).strip()
        if not uname.isalpha():
            print(` 33[45m使用者名稱必須為英文字母... 33[0m`)
            continue
        with open(r`%s` %db_path,`r`,encoding=`utf-8`) as f:
            for line in f:
                uinfo=line.strip(`
`).split(`,`)
                if uname == uinfo[0]:
                    print(` 33[45m使用者名稱已存在... 33[0m`)
                    break
            else:
                return uname

def get_pwd():
    while True:
        pwd1=input(`請輸入密碼>>: `).strip()
        pwd2=input(`再次輸入密碼>>: `).strip()
        if pwd1 == pwd2:
            return pwd1
        else:
            print(` 33[45m兩次輸入的密碼不一致,請重新輸入... 33[0m`)

def get_bal():
    while True:
        bal=input(`請輸入餘額: `).strip()
        if bal.isdigit():
            # bal=int(bal)
            return bal
        else:
            print(` 33[45m錢必須是數字,傻叉... 33[0m`)

def get_age():
    pass

#2、步驟二:寫入檔案
def file_hanle(uname,pwd,bal,age):
    with open(r`%s` %db_path,`a`,encoding=`utf-8`) as f:
        f.write(`%s,%s,%s,%s
` %(uname,pwd,bal,age))

# 註冊功能
def register():
    #步驟1:
    uname=get_uname() #拿到合法的使用者名稱
    pwd=get_pwd() #拿到合法的密碼
    bal=get_bal() #拿到合法的餘額
    #步驟2:
    file_hanle(uname,pwd,bal) #寫入檔案

  

相關文章