1. 程式人生 > 其它 >python模組入門(1)

python模組入門(1)

目錄

生成器物件

# 本質還是迭代器 只不過是通過我們自己寫程式碼而生成
 也有__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__後面列舉的名字