python高級編程一(生成器與高級編程)

@TOC

生成器

生成器使用
          通過列表?成式,我們可以直接創建?個列表。但是,受到內存限制,列表容量肯定是有限的。?且,創建?個包

含100萬個元素的列表,不僅占?很?的存儲空間,如果我們僅僅需要訪問前??個元素,那后?絕?多數元素占
?的空間都??浪費了。所以,如果列表元素可以按照某種算法推算出來,那我們是否可以在循環的過程中不斷推
算出后續的元素呢?這樣就不必創建完整的list,從?節省?量的空間。在Python中,這種?邊循環?邊計算的機
制,稱為?成器:generator。
創建生成器,列表生成式,我們知道,只要將最外一層的中括號,改為小括號,?成器保存的是算法,每次調? next(g) ,就計算出 g 的下?個元素的值,直到計算到最后?個元素,沒有更多的元素時,拋出 StopIteration 的異常。當然,這種不斷調? next() 實在是太繁瑣了,雖然是點一次出現一次,但正確的?法是使? for 循環,因為?成器也是可迭代對象。所以,我們創建了?個?成器后,基本上永遠不會調?next() ,?是通過 for 循環來迭代它,并且不需要關心StopIteration 異常。

list1 = [x for x in range(1,10)]
print(list1)
# 如何不讓內存溢出 引入生成器(按照一個生成式來創建元素)
g = (x for x in range(1,10))
print(g)
print(next(g))

在這里插入圖片描述

通過函數來創建生成器(yield)

通過斐波那契數列來實現
普通實現:

def test1(times):#初始化a,b=0,1n=0while n<times:print(b) #  yield b #yield用于創建一個生成器,工作返回后面變量值給生成器a,b=b,(a+b)n+=1return "done"print(test1(6))

生成器方式實現:

#引出生成器:對象,保存了產生元素的算法,同時會記錄游標的位置
# 創建一個生成器: 1、通過列表生成式來創建
#                 2、通過函數來創建生成器(yield)
# 遍歷生成器中元素內容:
#       1、通過next(g) ,當已經遍歷到生成器的結尾拋異常 :StopIteration
#       2、通過for來遍歷
#       3、object內置的__next__ :當已經遍歷到生成器的結尾拋異常 :StopIteration
#       4、send 函數  ,但是生成器的第一個值必須使用send(None),后面的值就沒有限制(不推薦使用)
def test2():#初始化a,b=0,1while True:temp = yield b #yield用于創建一個生成器,工作返回后面變量值給生成器,無返回值a,b=b,a+bprint(temp)
g4 =test2()
print(g4)
print(next(g4))
print(next(g4))
print(next(g4))print(g4.send(None))
print(g4.send(''))
print(g4.send(''))
print(g4.send(''))
print(g4.send(''))

?成器是這樣?個函數,它記住上?次返回時在函數體中的位置。對?成器函數的第?次(或第 n 次)調?跳轉?
該函數中間,?上次調?的所有局部變量都保持不變。?成器不僅“記住”了它數據狀態;?成器還“記住”了它在流
控制構造(在命令式編程中,這種構造不只是數據值)中的位置。?成器的特點:

  1. 節約內存
  2. 迭代到下?次的調?時,所使?的參數都是第?次所保留下的,在整個所有函數調?的參數都是第?次所調?時保
    留的,?不是新創建的

迭代器

迭代是訪問集合元素的?種?式。迭代器是?個可以記住遍歷的位置的對象。迭代器對象從集合的第?個元素開始
訪問,直到所有的元素被訪問完結束。迭代器只能往前不會后退。
我們已經知道,可以直接作用于 for 循環的數據類型有以下幾種:
一類是集合數據類型,如 list 、 tuple 、 dict 、 set 、 str 等;
一類是 generator ,包括生成器和帶 yield 的generator function。
這些可以直接作用于 for 循環的對象統稱為可迭代對象: Iterable 。
那我們怎么判斷一組數據或是一組數據對象是不是 Iterable 對象尼?
可以使? isinstance() 判斷?個對象是否是 Iterable 對象

from collections.abc import Iterable
# Iterable:可迭代對象,能夠通過for循環來遍歷
a=(1,)
b=[1,2]
c={}
def test1(args):if isinstance(args,Iterable):print("args是可迭代對象")else:print('args對象不是可迭代對象')
test1(a)
test1(b)
test1(c)
test1(10)

可以被next()函數調?并不斷返回下?個值的對象稱為迭代器

def test2(arg):if isinstance(arg, Iterator):print("args是迭代器")else:print('args對象不是迭代器')
test2(a)
test2(b)
test2(c)
test2(x for x in 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/78878.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/78878.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/78878.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

智能指針之設計模式2

前面介紹了工廠模式控制了智能指針和資源對象的創建過程&#xff0c;現在介紹一下智能指針是如何利用代理模式來實現“類指針&#xff08;like-pointer&#xff09;”的功能&#xff0c;并控制資源對象的銷毀過程的。 2、代理模式 代理模式是為其它對象提供一種代理以控制對這…

探索R語言:在線學習資源匯總

一、收集關于特定R主題的問題和答案&#xff08;Q&A&#xff09; 1. Stack overflow Empowering the world to develop technology through collective knowledge – Stack Overflowhttps://stackoverflow.co/ 二、Rstudio工具欄help Rstudio中有個Cheat sheet&#xf…

《C語言中以數組作為參數的探討》

&#x1f680;個人主頁&#xff1a;BabyZZの秘密日記 &#x1f4d6;收入專欄&#xff1a;C語言 &#x1f30d;文章目入 一、數組作為參數的傳遞機制二、數組參數的聲明方式&#xff08;一&#xff09;省略數組大小&#xff08;二&#xff09;指定數組大小&#xff08;三&#x…

深入解析區塊鏈技術:原理、應用與未來展望

1 區塊鏈技術原理 1.1 基本概念 區塊鏈本質上是一個分布式賬本&#xff0c;它由一系列按照時間順序排列的數據塊組成&#xff0c;每個數據塊包含了一定時間內的交易信息。這些數據塊通過密碼學技術相互鏈接&#xff0c;形成一個不可篡改的鏈條。其核心特點包括去中心化、不可篡…

selenium快速入門

一、操作瀏覽器 from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By# 設置選項 q1 Options() q1.add_argument("--no-sandbo…

面試如何應用大模型

在面試中,如果被問及如何應用大模型,尤其是面向政務、國有企業或大型傳統企業的數字化轉型場景,你可以從以下幾個角度進行思考和回答: 1. 確定應用大模型的目標與痛點 首先,明確應用大模型的業務目標,并結合企業的實際需求分析可能面臨的痛點。這些企業通常會關注如何提…

嵌入式常見概念的介紹

目錄 一、MCU、MPU、ARM &#xff08;一&#xff09;MCU&#xff08;微控制器&#xff09; &#xff08;二&#xff09;MPU&#xff08;微處理器&#xff09; &#xff08;三&#xff09;ARM&#xff08;架構&#xff09; 二、DSP &#xff08;一&#xff09;數字信號處理…

深度強化學習(DRL)框架與多目標調度優化詳解

深度強化學習&#xff08;DRL&#xff09;框架與多目標調度優化詳解 &#xff08;截至2025年4月&#xff0c;結合最新研究進展&#xff09; 一、DRL主流框架及核心算法 通用DRL框架 Ray RLlib&#xff1a;支持分布式訓練&#xff0c;集成PPO、A3C、DQN等算法&#xff0c;適用于…

centos 安裝python3.9.9

這里寫自定義目錄標題 安裝編譯依賴 sudo yum -y groupinstall "Development Tools" sudo yum -y install openssl-devel bzip2-devel libffi-devel wget zlib-devel yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel …

【動態規劃】深入動態規劃:背包問題

文章目錄 前言01背包例題一、01背包二、分割等和子集三、目標和四、最后一塊石頭的重量|| 完全背包例題一、完全背包二、 零錢兌換三、零錢兌換||四、完全平方數 前言 什么是背包問題&#xff0c;怎么解決算法中的背包問題呢&#xff1f; 背包問題 (Knapsack problem) 是?種組…

Vue 接口請求 Nginx配置實時壓縮 速度起飛

生效之前 nginx配置如下 gzip on; gzip_min_length 1k; gzip_buffers 16 256k; gzip_http_version 1.1; gzip_comp_level 6; gzip_types application/json application/javascript text/javascript text/css text/plain; gzip_vary on; 生效之后 #user…

Mitosis:跨框架的UI組件解決方案

Mitosis 是一個開源工具&#xff0c;可以將 JSX 組件轉換為 Angular、React、Qwik、Vue、Svelte、Solid 和 React Native 等框架的功能齊全的組件。 Stars 數13019Forks 數593 主要特點 跨框架兼容性&#xff1a;Mitosis 允許開發者編寫一次組件&#xff0c;然后編譯成多個主流…

齊次坐標系統:什么是齊次坐標?為什么要引入齊次坐標?

齊次坐標系統&#xff1a;計算機圖形學的基礎 在計算機圖形學、計算機視覺、相機標定、三維建模等領域&#xff0c;齊次坐標是一個非常重要的數學工具。本文將介紹&#xff1a;齊次坐標的基本概念、數學原理、我們為什么要引入齊次坐標、及其在實際應用中的價值。 文章目錄 齊…

JS的大數運算(注意:原生的只支持整數計算!!!)

JS的大數運算&#xff08;注意&#xff1a;原生的只支持整數計算&#xff01;&#xff01;&#xff01;&#xff09; 一、JS的大數運算&#xff08;注意&#xff1a;原生的只支持整數計算&#xff01;&#xff01;&#xff01;&#xff09;1. 數字精度限制2. 大數解決方案2.1. …

Android 之美國關稅問題導致 GitHub 403 無法正常訪問,責任在誰?

這幾天各國關稅問題導致世界動蕩不安&#xff0c;如今GitHub又無法正常訪問&#xff0c;是不是Google到時候也無法正常使用了。

JAVA中正則表達式的入門與使用

JAVA中正則表達式的入門與使用 一&#xff0c;基礎概念 正則表達式&#xff08;Regex&#xff09; 用于匹配字符串中的特定模式&#xff0c;Java 中通過 java.util.regex 包實現&#xff0c;核心類為&#xff1a; Pattern&#xff1a;編譯后的正則表達式對象。 Matcher&#…

Prompt_Engineering提示詞工程(一)

一、Prompt&#xff08;提示詞&#xff09; Prompt&#xff08;提示詞&#xff09;是給AI模型交互文本片段&#xff0c;用于指導模型生成符合預期輸出結果&#xff0c;提示詞的目的是為模型提供一個上下文的任務&#xff0c;以便模型能夠更準確地理解用戶的意圖&#xff0c;并…

【設計模式】面向對象開發學習OOPC

PLOOC-裸機思維 PLOOC-git OOPC精要——撩開“對象”的神秘面紗 C/C面向對象編程之封裝-KK 面向過程&#xff0c;本質是“順序&#xff0c;循環&#xff0c;分支”面向對象&#xff0c;本質是“繼承&#xff0c;封裝&#xff0c;多態”參考的書籍&#xff1a;《UMLOOPC嵌入式…

軟考高級--案例分析

架構風格 重點 交互方式數據結構控制結構擴展方法 分類 管道-過濾器風格 數據流 數據倉儲風格 星型結構以數據為中心&#xff0c;其他構件圍繞數據進行交互 企業服務總線esb 定義 以一個服務總線充當中間件的角色&#xff0c;把各方服務對接起來&#xff0c;所有服務…

01_背包問題

package org.josh; import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner new Scanner(System.in); int n scanner.nextInt(); // 物品數量 long w scanner.nextLong(); // 背包容量&#xff0c;使用long防止溢出 int[] v …