最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Python中的三器一閉

 更新時間:2023年05月04日 11:09:53   作者:以山河作禮。  
這篇文章主要介紹了詳解Python中的三器一閉,Python中的三器一閉是指迭代器、裝飾器、生成器和閉包,需要的朋友可以參考下

迭代器

什么是迭代

迭代是重復反饋過程的活動,其目的通常是為了逼近所需目標或結果。每一次對過程的重復稱為一次“迭代”,而每一次迭代得到的結果會作為下一次迭代的初始值。

在python中,迭代是訪問集合元素的一種方式。對list、tuple、str等類型的數據使用for…in…的循環(huán)語法從其中依次拿到數據進行使用,我們把這樣的過程稱為遍歷,也叫迭代。

什么是可迭代對象

一個對象如果實現了__iter__方法(魔法方法),那么我們稱這個對象是可迭代對象。

或者可以這樣理解,只要是可以通過for…in…的形式進行遍歷的,那么這個數據類型就是可以迭代的。

判斷數據是否可迭代

python中要判斷一個對象是否是可迭代的,可以用collections模塊中的Iterable來進行判斷。isinstance函數會返回True或False來表明對象是(True)或者不是(False)可迭代對象。

from collections.abc import Iterable
print(isinstance(["abc"], Iterable))
print(isinstance([100], Iterable))

在這里插入圖片描述

什么是迭代器

迭代器的作用是用來訪問容器(用來保存元素的數據結構)中的元素,所以使用迭代器,我們就可以訪問容器中里面的元素。

迭代器是一個可以記住遍歷的位置的對象。迭代器對象從第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會后退。

迭代器的本質

我們可以通過iter()函數獲取這些可迭代對象的迭代器。然后我們可以對獲取到的迭代器不斷使用next()函數來獲取下一條數據。

使用迭代器取數據

from collections.abc import Iterator
nums = [3, 6, 8]  # 可迭代對象
nums = iter(nums)  # 創(chuàng)建了迭代器
print("nums", isinstance(nums, Iterator))  # 判斷是否是迭代器
# 取出迭代器的數據
num1 = next(nums)
print(num1)
num1 = next(nums)
print(num1)
num1 = next(nums)
print(num1)

在這里插入圖片描述

若迭代的次數超過了可迭代對象的長度, 就會報StopIteration異常。

自定義迭代器

使用__iter__和__next__方法自定義迭代器

只要在類中,定義__iter__方法,那么這個類創(chuàng)建出來的對象一定是可迭代對象

如果類中實現了__iter__方法和__next__方法的對象,就是迭代器。

當我們調用iter()函數提取一個可迭代對象的 迭代器時,實際上會自動調用這個對象的__iter__方法,并且這個方法返回迭代器。

# 使用迭代器完成學生管理系統(tǒng)
class StuSystem(object):
    """
    學生管理系統(tǒng)
    """
    def __init__(self):
        self.stus = []
        self.current_num = 0
    def add(self):
        """
        添加一個新的學生
        :return:
        """
        name = input("請輸入新學生的姓名:")
        tel = input("請輸入新學生的手機號:")
        address = input("請輸入新學生的住址:")
        new_stu = dict()
        new_stu["name"] = name
        new_stu["tel"] = tel
        new_stu["address"] = address
        self.stus.append(new_stu)
    def __iter__(self):
        return self
    def __next__(self):
        if self.current_num < len(self.stus):
            ret = self.stus[self.current_num]
            self.current_num += 1
            return ret
        else:
            self.current_num = 0
            raise StopIteration
# 創(chuàng)建對象
stu = StuSystem()
# 添加信息
stu.add()
stu.add()
stu.add()
stus = [x for x in stu]
print(stus)

在這里插入圖片描述

凡是可作用于for循環(huán)的對象都是Iterable 類型; 凡是可作用于 next() 函數的對象都是Iterator 類型; 集合數據類型如list 、dict、str等是 Iterable但不是Iterator,不過可以通過 iter()函數獲得一個Iterator對象。

生成器

一邊循環(huán)一邊計算的機制,稱為生成器(generator)

在Python中,使用了yield的函數被稱為生成器。跟普通函數不同的是,生成器是一個返回迭代器的函數,只能用于迭代操作。生成器函數一般是通過for循環(huán)調用,for循環(huán)自帶next方法。

創(chuàng)建生產器的方法

1.將列表推導式的[]改為()
2.在函數中使用yield關鍵字,函數就變成了一個generator

使用生成器完成斐波那契數列

def fib_generator():
    num1 = 1
    num2 = 1
    while True:
        temp_num = num1
        num1, num2 = num2, num1+num2
        # return temp_num  # 方式1代碼
        yield temp_num
# 方式1代碼(方式1不能夠生成1,1,2,3,5...斐波那契數列)
# print(fib_generator())
# print(fib_generator())
# print(fib_generator())
# print(fib_generator())
# 方式2代碼(可以生成斐波那契數列)
fib = fib_generator()
print(next(fib))
print(next(fib))
print(next(fib))
print(next(fib))

在這里插入圖片描述

關鍵字yield

yield是一個類似return的關鍵字。當我們調用這個函數的時候并不是返回計算的結果。而是返回一個生成器。只有迭代這個生成器的時候才會計算結果。

next和send

next()方法: 在調用生成器運行的過程中,每次遇到 yield ,函數返回當前的值,并且會暫停并保存當前所有的運行信息, 并在下一次執(zhí)行 next() 方法時從當前位置繼續(xù)運行。

send()方法: 先理解個概念【休眠】:意思就是暫時保留先不進行,等待需要時再進行。作用與next()作用相似 區(qū)別:
1.send(value)可以傳遞value給yield,即:我們可以指定yield返回啥就返回啥,
2.next()不能傳遞特定的值,只能傳遞None進去。

def genterator_test():
    while True:
        print("--1-")
        num = yield 100
        print("--2--", "num=", num)
g = genterator_test()
print(g.send(None))
print(g.send(11))
print(g.send(22))

在這里插入圖片描述

生成器的特點: 存儲的是生成數據的方式(即算法),而不是存儲生成的數據,因此節(jié)約內存。

裝飾器

裝飾器是給現有的模塊增添新的小功能,可以對原函數進行功能擴展,而且還不需要修改原函數的內容,也不需要修改原函數的調用。

裝飾器的功能

裝飾器的實現是由閉包支撐的; 裝飾器本質上是?個python函數,它可以在讓其他函數在不需要做任何代碼的變動的前提下增加額外的功能; 裝飾器的返回值也是?個函數的對象,它經常用于有切面需求的場景,實現路由傳參,flask的路由傳參依賴于裝飾器,瀏覽器通過url訪問到裝飾器的路由,從而訪問視圖函數獲得返回的HTML頁面;

定義裝飾器

def check_login(func):
    def inner():
        # 驗證1
        # 驗證2
        # 驗證3
        func()
    return inner
@check_login
def f1():
    print('f1')
def check_login(func):
    def inner():
        # 驗證1
        if "admin" != input("請輸入用戶名:"):
            return "用戶名不正確"
        # 驗證2
        if "123456" != input("請輸入密碼:"):
            return "密碼不正確"
        # 驗證3
        if "7788" != input("請輸入手機短信驗證碼:"):
            return "驗證碼不正確"
        func()
    return inner
@check_login
def f1():
    print('f1')
f1()  # 調用f1函數

閉包

什么是閉包

如果在一個內部函數里,對在外部作用域(但不是在全局作用域)的變量進行引用,那么內部函數就被認為是閉包(closure).

# 定義函數可以理解為:
# 定義了一個全局變量,其變量名字是函數的名字,即test
# 這個test變量指向了一個代碼塊,這個代碼塊是函數
# 其實就是說test保存了一個代碼塊的地址,即引用
def test():
    print("--- in test func----")
test()  # 這是調用函數
ret = test # 用另外一個變量 復制了 test這個引用,導致ret變量也指向那個 函數代碼塊
# 下面輸出的2個地址信息是相同的
print(id(ret))
print(id(test))
# 通過引用調用函數
ret()

函數、匿名函數、閉包、對象 當做實參時的區(qū)別

匿名函數能夠完成基本的簡單功能,,,傳遞是這個函數的引用 只有功能
普通函數能夠完成較為復雜的功能,,,傳遞是這個函數的引用 只有功能
閉包能夠將較為復雜的功能,,,傳遞是這個閉包中的函數以及數據,因此傳遞是功能+數據
對象能夠完成最為復雜的功能,,,傳遞是很多數據+很多功能,因此傳遞是功能+數據

到此這篇關于詳解Python中的三器一閉的文章就介紹到這了,更多相關Python三器一閉內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 一文搞懂Python中Pandas數據合并

    一文搞懂Python中Pandas數據合并

    pandas是基于NumPy的一種工具,該工具是為了解決數據分析任務而創(chuàng)建的。Pandas納入了大量庫和一些標準的數據模型,提供了高效操作大型數據集的工具。pandas提供大量快速便捷地處理數據的函數和方法。你很快就會發(fā)現,它是使Python強大而高效的數據分析環(huán)境的重要因素之一
    2021-11-11
  • 詳解Selenium如何實現獲取cookies并保存

    詳解Selenium如何實現獲取cookies并保存

    這篇文章主要為大家詳細介紹了Selenium如何實現獲取cookies保存起來用于下次訪問,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-05-05
  • Python基于文本內容實現隱私信息提取與評估

    Python基于文本內容實現隱私信息提取與評估

    這篇文章主要為大家介紹了Python如何實現基于文本內容的用戶隱私泄露風險評估系統(tǒng),文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2025-03-03
  • Pytorch之Variable的用法

    Pytorch之Variable的用法

    今天小編就為大家分享一篇Pytorch之Variable的用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python實現自定義順序、排列寫入數據到Excel的方法

    Python實現自定義順序、排列寫入數據到Excel的方法

    這篇文章主要介紹了Python實現自定義順序、排列寫入數據到Excel的方法,涉及Python針對Excel文件的數據處理及讀寫相關操作技巧,需要的朋友可以參考下
    2018-04-04
  • python如何讀寫json數據

    python如何讀寫json數據

    這篇文章主要為大家詳細介紹了python如何讀寫json數據,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Python pygame實現中國象棋單機版源碼

    Python pygame實現中國象棋單機版源碼

    今天給大家?guī)淼氖顷P于Python實戰(zhàn)的相關知識,文章圍繞著用Python pygame實現中國象棋單機版展開,文中有非常詳細的代碼示例,需要的朋友可以參考下
    2021-06-06
  • Python學習筆記之For循環(huán)用法詳解

    Python學習筆記之For循環(huán)用法詳解

    這篇文章主要介紹了Python學習筆記之For循環(huán)用法,結合實例形式詳細分析了Python for循環(huán)的功能、原理、用法及相關操作注意事項,需要的朋友可以參考下
    2019-08-08
  • 解決python存數據庫速度太慢的問題

    解決python存數據庫速度太慢的問題

    這篇文章主要介紹了解決python存數據庫速度太慢的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 復習Python中的字符串知識點

    復習Python中的字符串知識點

    這篇文章主要介紹了Python中字符串的一些知識點,來自于IBM官方網站技術文檔,需要的朋友可以參考下
    2015-04-04

最新評論

石家庄市| 临澧县| 汕头市| 达孜县| 马公市| 白沙| 南郑县| 织金县| 弥勒县| 霍城县| 六枝特区| 襄城县| 和政县| 登封市| 伊金霍洛旗| 松阳县| 朝阳区| 宜州市| 东光县| 峨眉山市| 石首市| 三台县| 甘谷县| 高碑店市| 通许县| 利津县| 宜宾县| 富顺县| 涟源市| 边坝县| 北川| 江孜县| 孟村| 光山县| 含山县| 五台县| 潞西市| 新丰县| 屏东县| 安岳县| 明星|