漫步人生路之Python旅途(九)百日築基

来源:https://www.cnblogs.com/caesar-id/archive/2019/01/23/10311931.html
-Advertisement-
Play Games

函數名的使用: 函數名可以作為值,賦值給變數 函數名可以作為參數傳參給函數. 函數名可以作為返回值 函數名可以作為元素存儲在容器里 閉包:在嵌套函數內,使用外層局部變數(非全局變數)就是一個閉包,閉包可以多層嵌套.閉包的優點: 避免局部變數不被外界修改 函數生命周期延長 節省開闢空間,銷毀空間的時間 ...


函數名的使用:

  • 函數名可以作為值,賦值給變數
  • 函數名可以作為參數傳參給函數.
  • 函數名可以作為返回值
  • 函數名可以作為元素存儲在容器里

閉包:
在嵌套函數內,使用外層局部變數(非全局變數)就是一個閉包,閉包可以多層嵌套.
閉包的優點:

  • 避免局部變數不被外界修改
  • 函數生命周期延長
  • 節省開闢空間,銷毀空間的時間

閉包的作用:就是使一個局部變數常駐記憶體,方便後面程式調用
如何查看一個函數是否是一個閉包
__closure__:查看一個函數是否是閉包

def func1():
    str_ = "閉包" # 局部變數
    def func2():
        print(str_) # 使用局部變數,閉包
    func2()
    print("fun2",func2.__closure__) # 列印func2是否是閉包
func1()
print("fun1",func1.__closure__)

#列印內容如下:
閉包 
fun2 (<cell at 0x000000000222D7C8: str object at 0x000000000224E0E0>,)
fun1 None     

通過列印可以看出fun2是閉包,
閉包的調用:

def func1():
    str_ = "閉包" # 局部變數
    def func2():
        print(str_) # 使用局部變數,閉包
    print(func2.__closure__) # 列印func2是否是閉包
    return func2
func1()() # 調用閉包func2()

# 列印內容如下:
(<cell at 0x00000000022ED7C8: str object at 0x0000000002431030>,)
閉包     

迭代器:
iterable表示可迭代的對象.遵守可迭代協議 使用dir(對象)可以查看數據類型是否符合可迭代協議.dir(對象)可以獲取對象所有的方法,如果方法中有__iter__說明對象遵守可迭代協議,是可迭代類型數據.如下:

s = "Hello World"
print(dir(s))

#列印內容如下:
'__init_subclass__', '__iter__', '__le__', ' # 這裡只列印部分內容

還可以通過isinstance(對象,參數)來檢測是可迭代對象還是迭代器.如果返回結果為True是可迭代對象,如果False不是可迭代對象.下麵是對常見數據類型的列印:

num = 10
bool_t = True
str_1 = "Hello World"
list_1 = [1,2,3]
tuple_1 = (1,2,3)
dict_1 = {"電影":"黃飛鴻","電視劇":"上海灘"}
set_1 = {1,2,3,4}
from collections.abc import Iterable
print("int:",isinstance(num,Iterable))
print("str:",isinstance(str_1,Iterable))
print("bool:",isinstance(bool_t,Iterable))
print("list:",isinstance(list_1,Iterable))
print("tuple:",isinstance(tuple_1,Iterable))
print("dict:",isinstance(dict_1,Iterable))
print("set:",isinstance(set_1,Iterable)) 
print("range:",isinstance(range(10),Iterable)) 

#列印結果如下
int: False 
str: True 
bool: False 
list: True 
tuple: True 
dict: True 
set: True 
range: True 

由此可以得出,可迭代對象:有str,list,dict,set,tuple,range()
迭代器:如果可迭代對象中有__iter__函數就可以理解為是遵守可迭代協議的,那麼這個可迭代對象就可使用__iter__以創建一個迭代器對象.在迭代器中可以使用__next__方法來獲取所有迭代器中的元素.如下:

str_1 = "Hello World"
from collections.abc import Iterable,Iterator
print(isinstance(str_1,Iterator)) # 查看是否是迭代器
str_iter = str_1.__iter__() # 創建迭代器
print(isinstance(str_iter,Iterator)) # 查看是否是迭代器

#列印結果如下:
False 
True 

由此可以證明上面的結論,可迭代對象通過__iter__方法創建迭代器.
for迴圈的工作原理就是通過迭代器來實現的.
下麵來看個簡單的迭代器

str_1 = "Hello" 
str_iter = str_1.__iter__()
print(str_iter.__next__())
print(str_iter.__next__())
print(str_iter.__next__())
print(str_iter.__next__())
print(str_iter.__next__())

#列印內容如下:
H 
e 
l 
l 
o 

由上面的輸出可以看出與for迴圈的輸出類似.並且迭代器是不可回退的.但是當我們的迭代器超過字元串的長度後會報錯StopIteration,那在使用for迴圈時for是怎麼知道對象的長度,並且不會報錯的呢?
下麵我們用while迴圈和迭代器模擬for迴圈的內部機制.

str_1 = "Hello"
str_iter = str_1.__iter__()
while True:
try: # 捕獲異常
print(str_iter.__next__()) # 列印迭代器內容
except StopIteration: # 處理異常
break

#列印內容如下:
H 
e 
l 
l 
o 

註意:迭代器只能向下執行是不能回退的.
總結:
Iterable: 可迭代對象. 內部包含__iter__()函數
Iterator: 迭代器. 內部包含__iter__() 同時包含__next__().
迭代器的特點:

  • 節省記憶體.
  • 惰性機制
  • 不能反覆, 只能向下執行.

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一個分散式服務集群管理通常需要一個協調服務,提供服務註冊、服務發現、配置管理、組服務等功能,而協調服務自身應是一個高可用的服務集群,ZooKeeper是廣泛應用且眾所周知的協調服務。協調服務自身的高可用需要選舉演算法來支撐,本文將講述選舉原理並以分散式服務集群NebulaBootstrap的協調服務N ...
  • 其旨在打造一個集應用開發、大數據存儲、處理、分散式計算、自動化部署的無節點微服務集中開發與運行平臺,以響應業務的快速變更,滿足系統對大數據,大併發與開發效率的需求; 平臺設計以數據為核,以groovy腳本為基礎,通過提供api、非同步消息處理、調度等基礎構件來支持應用的快速開發; 核心是通過整合現有開 ...
  • 對象實例化過程: 1.看類是否已載入,未載入的話先初始化類。 2.在堆記憶體中分配空間。 3.初始化父類的屬性 4.初始化父類的構造方法 5.初始化子類的屬性 6.初始化子類的構造方法 實例: package com.xm.load; public class Animal { static Stri ...
  • 我相信對於很多愛好和習慣寫博客的人來說,如果自己的博客有很多人閱讀和評論的話,自己會非常開心,但是你發現自己用心寫的博客卻沒什麼人看,多多少少會覺得有些傷心吧?我們今天就來看一下為什麼你的博客沒人看呢? 一、頁面分析 首先進入博客園首頁,可以看到一頁有20篇博客簡介,然後有200頁,也就是說總共有2 ...
  • 使用static關鍵字修飾的變數和方法為靜態變數、靜態方法。 非靜態方法可以訪問靜態變數/方法和非靜態變數/方法,但靜態方法只能訪問靜態變數/方法。 可以看到在靜態方法中調用非靜態變數和非靜態方法時,Java會報錯。 所謂的靜態是指變數或方法可以不依賴對象而直接使用類名來調用,這也是static的意 ...
  • 第74節:第74節:Java中的Cookie和Session : 什麼是 ,有什麼用哦,怎麼用呢? 啟動伺服器後,會給每個應用程式創建一個 ,並且這個 對象只有一個。可以用於獲取全局參數,工程下的資源,和存取數據,共用數據。 例子,如何獲取全局參數,如何獲取工程下的資源,如何進行存取數據,用例子代碼 ...
  • 今天在寫條件語句時,一老出錯 自認為程式上是沒什麼問題的,所以將逗號去掉試試看 得出了正確的值,很意外,然後多試了幾次之後,逗號也可以輸入了 原來我誤把中文輸入法的逗號輸入到scanf中,而運行時又用英文輸入法 然後得出來的總結就是,scanf函數中必須用自己制定的格式,輸入,輸出。 ...
  • If I had only one hour to save the worlds,I would spend fifty five minutes defining the problem,and only five minutes finding the solution. 如果我只有1小時拯救 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...