1.今日內容
- 迭代器(3*)
- 生成器(4*)
- 裝飾器(5*)
- 專案結構
- logging模塊
2.內容回顧 & 作業
2.1 內容回顧
2.1.1 函式(內置/自定義)
-
基本函式結構
def func(a1,a2): pass- 引數
- 回傳值
- 執行函式
-
函式小高級
- 函式做變數
- 函式做引數
-
函式中高級
- 函式做回傳值
- 函式的嵌套
-
裝飾器 & 閉包
-
遞回
-
匿名函式
-
內置函式
2.1.2 模塊(內置/第三方/自定義)
-
定義模塊
- 內置:time/json/datetime/os/sys ... 【re模塊】
- 第三方:
- 安裝:
- pip包管理工具: pip install xlrd
- 原始碼安裝:
- 下載原始碼包:壓縮檔案,
- 解壓檔案
- 打開cmd視窗,并進入此目錄:cd C:\Python36\Lib\site-packages
- 執行:python36 setup.py build
- 執行:python36 setup.py install
- 安裝路徑:C:\Python36\Lib\site-packages
- 你了解的第三方模塊:
- xlrd,xlwd#excel的讀寫
- requests
- 安裝:
- 自定義
- py檔案
- 檔案夾
__init__.py#py2中必須要有
-
呼叫模塊
-
import
- import 模塊1 模塊1.函式()
- import 模塊1.模塊2.模塊3 模塊1.模塊2.模塊3.函式()
-
from xx import xxx
- from 模塊.模塊 import 函式 函式()
- from 模塊.模塊 import 函式 as f f()
- from 模塊.模塊 import * 函式1() 函式2()
- from 模塊 import 模塊 模塊.函式()
- from 模塊 import 模塊 as m m.函式()
-
特殊情況:
-
import 檔案夾 默認加載
__init__.py
呼叫的是--init--.py檔案中內容, -
from 檔案 import *
可以直接使用檔案中函式,
-
-
2.1.3 其他
- 兩個值資料交換
- 推導式
- 串列(*)
- 字典
- 集合
3.今日內容
類和物件
3.1 迭代器
自己不會寫迭代器,只用,
任務:請展示串列中所有的資料,
-
while + 索引 + 計數器
-
迭代器,對 某種物件(str/list/tuple/dict/set類創建的物件)-可迭代物件 中的元素進行逐一獲取,表象:具有
__next__方法且每次呼叫都獲取可迭代物件中的元素(從前到后一個一個獲取),-
串列轉換成迭代器:
- v1 = iter([11,22,33,44])
v1 = [11,22,33,44].__iter__()
-
迭代器想要獲取每個值:反復呼叫
val = v1.__next__()v1 = [11,22,33,44] # 串列轉換成迭代器 v2 = iter(v1) result1 = v2.__next__() print(result1) result2 = v2.__next__() print(result2) result3 = v2.__next__() print(result3) result4 = v2.__next__() print(result4) result5 = v2.__next__() print(result5) """ # v1 = "alex" # v2 = iter(v1) # while True: # try: # val = v2.__next__() # print(val) # except Exception as e: # break -
迭代至最后,直到報錯:StopIteration錯誤,表示已經迭代完畢,
-
如何判別一個物件是否是迭代器:內部是否有
__next__方法,
-
-
for回圈
v1 = [11,22,33,44] # 1.內部會將v1轉換成迭代器 # 2.內部反復執行 迭代器.__next__() # 3.取完不報錯 for item in v1: print(item)
3.2 可迭代物件
-
內部具有
__iter__()方法且回傳一個迭代器,(*)v1 = [11,22,33,44] result = v1.__iter__() -
可以被for回圈
3.3 生成器(函式的變異)
# 函式
def func():
return 123
func()
# 生成器函式(內部是否包含yield)
def func():
print('F1')
yield 1
print('F2')
yield 2
print('F3')
yield 100
print('F4')
# 函式內部代碼不會執行,回傳一個 生成器物件 ,
v1 = func()
# 生成器是可以被for回圈,一旦開始回圈那么函式內部代碼就會開始執行,
for item in v1:
print(item)
def func():
count = 1
while True:
yield count
count += 1
val = func()
for item in val:
print(item)
總結:函式中如果存在yield,那么該函式就是一個生成器函式,呼叫生成器函式會回傳一個生成器,生成器只有被for回圈時,生成器函式內部的代碼才會執行,每次回圈都會獲取yield回傳的值,不慣for回圈是否可以讀到yield(如:yield在return前),
def func():
count = 1
while True:
yield count
count += 1
if count == 100:#終止條件設定
return
val = func()
for item in val:#item只取yield中的值,
print(item)
示例:讀檔案(以下按頁讀取檔案,每頁10行)
def func():
"""
分批去讀取檔案中的內容,將檔案的內容回傳給呼叫者,
:return:
"""
cursor = 0
while True:
f = open('db', 'r', encoding='utf-8')# 通過網路連接上redis
# 代指 redis[0:10]
f.seek(cursor)
data_list =[]
for i in range(10):
line = f.readline()
if not line:
return
data_list.append(line)
cursor = f.tell()
f.close() # 關閉與redis的連接
for row in data_list:
yield row
for item in func():
print(item)
其他知識:
- yeild from關鍵字【欠】
- 生成器推導式【欠】
總結
-
迭代器,對可迭代物件中的元素進行逐一獲取,迭代器物件的內部都有一個 __next__方法,用于以一個個獲取資料,
-
可迭代物件,可以被for回圈且此類物件中都有 __iter__方法且要回傳一個迭代器(生成器),
-
生成器,函式內部有yield則就是生成器函式,呼叫函式則回傳一個生成器,回圈生成器時,則函式內部代碼才會執行,
特殊的迭代器(**):
def func(): yield 1 yield 2 yield 3 v = func() result = v.__next__() print(result) result = v.__next__() print(result) result = v.__next__() print(result) result = v.__next__() print(result)特殊的可迭代物件:
def func(): yield 1 v = func() result = v.__iter__() print(result)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/196564.html
標籤:Python
