python模組入門(1)
阿新 • • 發佈:2022-03-24
目錄
生成器物件
# 本質還是迭代器 只不過是通過我們自己寫程式碼而生成 也有__iter__方法和__next__方法 def index(): print('hello') yield 123 print('jason') yield # 生成器物件也是節省儲存空間的,特性與迭代器物件一致 ''' 當函式體程式碼中含有yield關鍵字的時候,第一次呼叫並不會執行函式體程式碼,而是將函式變成生成器 ''' print(index) # <function index at 0x000002B564DF1F28> 不進行呼叫就是普通的函式 print(index()) # <generator object index at 0x000002B5654C0A98> 呼叫後就會變成生成器 # 當函式變成生成器之後,可以通過呼叫__next__()來執行函式體程式碼 # 先呼叫函式 res = index() next(res) # 'hello' next(res) # 'jason' next(res) # 報錯 '''當函式體程式碼中含有多個yield關鍵字的時候 執行一次__next__()yield上面的程式碼就會被執行,並停留在yield 再次執行__next__()就會基於上此停止的位置繼續往後執行到下一個yield,如果下面沒有yield就會報錯'''
自定義range方法
# range方法是一個可迭代物件
通過生成器模擬range方法
def my_range(start,end=False,step=1):
if not end:
end = start
start = 0
while start < end:
yield start
start += step
for i in my_range(5):
print(i)
yield關鍵字的作用
# 1.在函式體程式碼中出現 可以將函式變成生成器 # 2.在執行過程中可以將後面的值返回出去 類似return # 3.還可以暫停程式碼的執行 # 4.還可以接收外界的傳值 def eat(name): print('hello') while True: name = yield print(name) res = eat('jason') next(res) # hello next(res) # None res.send('drink') # drink send可以給yield傳值,並自動呼叫一次__next__
生成器表示式
# 也是為例節省儲存空間 後期進行程式碼的優化的時候可以考慮使用 res = (i for in 'jason') # res 就是生成器物件 '''生成器內部的程式碼只有在呼叫__next__迭代取值的時候才會執行''' #題目實戰 def add(n, i): return n + 1 def test(): for i in range(4): yield i g = test() for n in [1, 10] g = (add(n, i) for i in g) res = list(g) print(res) res = [20,21,22,23]
模組
'''
很多大佬寫了很多很厲害的模組 供python工程師直接使用,因此當我們遇到一個非常複雜的功能需要實現的時候,第一時間相對應該是取網上能不能找到想應的模組
'''
# 什麼是模組
模組就是一系列功能的結合體,可以直接使用
# 為什麼要用模組
極大的提升開發的效率
# 模組的三種來源
1.內建的模組
無需下載 直譯器自帶 直接匯入即可
2.自定義模組
自己寫的程式碼封裝成模組自己使用或者釋出到網上供別人使用
3.第三方模組
別人寫的釋出到網上的 可以下載使用的模組
# 模組的四種表現形式
1.使用python程式碼編寫py檔案
2.多個py檔案組成的資料夾
3.已被編譯為共享庫或DLL的C或C++擴充套件
4.使用c編寫並連結到python直譯器的內建模組
模組的兩種匯入方式
# 使用模組前,必須先進行匯入,而匯入的方法有兩種
# 方式1>>>:import 包名
比如匯入time模組
import time
'''
一定要分清誰是執行檔案,誰是匯入檔案(模組)
匯入模組內部發生了什麼
1.執行當前檔案 產生一個當前檔案的名稱空間
2.執行import句式 匯入模組檔案(即執行模組檔案程式碼模組檔案的名稱空間)
3.在當前檔案的名稱空間中生成一個模組的名字,指向模組的名稱空間
4.通過在執行檔案中生成的名字可以使用模組名稱空間中的所有資料
'''
# import句式的特點
1.相同模組重複匯入只會被執行一次
2.可以通過import後面的模組點名的方式,使用模組中所有的名字
3.模組當中的名字不會和執行檔案中的名字衝突
# 方式2:from 模組名 import 方法名
from time import time,tzset
'''
1.執行當前檔案產生一個名稱空間
2.執行匯入語句 執行模組檔案產生名稱空間,存放執行中產生的所有名字
3.將import後面的名字直接拿到執行問價中
'''
# 該方式的特點
1.重複匯入只會執行一次
2.使用模組名稱空間中的名字不需要加模組名字首,直接使用即可
3.匯入的名稱會與執行檔案中的名稱產生衝突。因為他是直接將模組中的方法存放到執行檔案的名稱空間
4.使用from...import...的句式,只能使用import中出現的名字
匯入補充
# 1.可以給模組起別名,比如當模組名稱非常複雜的時候可以用簡單的別名代替
import time as t
就是將time模組的名稱替換成t 呼叫方法的時候直接t.就行
# 2.連續匯入多個模組或者變數名
import time, sys, md
from md import name, read1, read2
"""
連續匯入多個模組 這多個模組最好有相似的功能部分 如果沒有建議分開匯入
如果是同一個模組下的多個變數名無所謂!!!
"""
# 3.通用匯入
from md import *
*表示md裡面所有的名字
但是 如果模組中使用了__all__限制可以使用的名字 那麼*就會失效 依據的是__all__後面列舉的名字