Day10 棒球和球棒與水晶火爐和五彩寶箱
棒球和球棒來到了足球場,要打棒球!但是球場工作人員不同意。棒球和球棒表示不服。球場工作人員說,這樣吧,你按我們的規則完成任務,我們就讓你們在這裡玩。這裡有兩個長筒,一個豎桶(棧:滿足特點 ---> 先進後出)
,一個直桶。
(隊列:滿足特點 ---> 先進先出。
調用collections模塊中的deque()函數就可以獲取一個隊列對象操作步驟:
步驟一:導入collections模塊
步驟二:collections.deque() --> 得到一個列表對象
步驟三:使用隊列對象調用存(append)和取(popleft)的函數,完成需求)
你們把5個球投進直筒裡,然後從上往下依次打開球,取出裡面的部件,組裝起來。然後再把另5個球裝進直筒裡,從桶的另一端把球取出來,同樣取出裡面部件組裝起來。
import collections
'''
演示隊列存取數據的特點:先進先出
'''
#獲取隊列對象:queue
queue = collections.deque()
print(queue,type(queue))
#向隊列中添加數據(模擬進隊、入隊現象)
queue.append('A'))
棒球和球棒順利完成了任務,將部件取出,組建了一個藍色的小獅子(lambda [變量參數]:表達式)
。這個小獅子頭上並沒有小駱駝的標志,它的名字叫lambda(匿名函數(沒有名字的函數))
。它嘴裡同樣可以含球也可以不含球(匿名函數同樣可以定義有返回值沒有返回值,有參數沒有參數的情況)
,可以含各式各樣的球,
(分類匿名函數 --> 以參數進行
1).1個參數
2).多個參數
3).默認參數
4).可變參數)
也可以返回東西或不返回東西。小獅子還可以在轉籠中進行工作,
匿名函數配合列表對象使用lt = [lambda x:x ** 2,lambda x:x ** 3,lambda x:x ** 4]
在字典中工作。
匿名函數配合字典對象使用
key = 'C'
dic1 = {
'A':lambda :2*2,
'B':lambda :3*3,
'C':lambda :4*4
}
print(dic1[key]())
棒球和球棒非常喜歡這只藍獅子,就和他一起玩起棒球來。但一只棒球不夠用,所以他們要管理員給他們多拿幾個棒球。管理員從操縱室按下開關,一個透明度火爐子一樣的東西從天而降到球場中央。爐子上刻著佛印的頭像,爐內是好幾個疊在一起的水晶球。
生成器中是沒有真實數據存在的,所以我們是不能直接使用len()函數來嘗試得到其長度;
如果我們這麼做了,錯誤提示:no len()
爐子的底部是個能打開的開關,每打開一次只能出來一個水晶球。
它內部封裝了一套公式/算法,只有等到需要調用/執行數據的時候 --》執行next()函數
才會將公司計算得到的數據結果返回給程序#使用next()函數來得到每一次generator中的內容
當然,佛印師傅能一次性全把水晶球拿出來。
方式二:使用循環處理,這種方式不會過量的調用內部表達式執行,不會報錯,比較友好
gen = (x for x in range(5))
for g in gen:
print(g)。
當球被全部拿出後,就沒有球可以拿了(#generator對象中的數據內容只能被解析使用一次,不可逆;一旦調用多了,直接報錯了)
。棒球不開心了,說那我要是在其他地方就沒有球玩了,這不行啊。這時,管理員笑嘻嘻的拿出了一個紅色的大海螺,並對棒球說,你把這個大海螺放到獅子肚子上的出口處,獅子就會變成和透明火爐一樣的容器。就能吐出一樣的水晶球啦。
(定義函數,在函數內部需要使用關鍵字yield來記錄返回的generator對象的數據公式;
執行還是通過next()函數來實現了
def func(n):
lt = []
for i in range(1,n + 1):
if i % 2 == 0:
lt.append(i)
yield i
棒球和球棒謝過管理員,但同時也產生了疑問?這水晶球和普通的一盒球有什麼區別呢?管理員告訴棒球,凡是能被佛印師傅一個一個數球的容器都屬於迭代對象(凡是可作用於for循環的對象都是Iterable(可迭代對象)類型)
,像什麼牛肉丸串,大列表、字典、大餅、橙小車還有水晶火爐等。但是只有那些有控制出口開關的才能成為迭代器。
1).必須是一個可迭代對象
2).可以被next()函數所調用的
凡是可以作用於next()函數的對象都是Iterator類型,它們表示一個惰性計算的序列
如果要判斷是不是迭代對象,可以用采蘑菇的小姑娘籮筐中的一個寶盒(collections.Iterable(類型)配合內置函數isinstance())
,寶盒裡有個變色蝴蝶,它能分辨出這個容器是不是迭代對象。
使用collections模塊中的Iterable類型配合isinstance(obj,type)內置函數來判斷isinstance(obj,collections.Iterable)
寶盒裡還有個變色小龍,它能分辨出這個容器是不是迭代器對象。
使用collections模塊中的Iterator類型配合isinstance(obj,type)內置函數來判斷isinstance(obj,collections.Iterator)
如果迭代對象想變成迭代器對象,就是想加上一個開關的話,就得請雙蛇洞中的小白龍了。
將可迭代對象轉換為迭代器對象
內置函數:
iter(iterable)
it1 = iter(lt)
棒球越聽越發感興趣!於是就去找采蘑菇的小姑娘的神奇籮筐。管理員告訴他神奇籮筐在雙蛇洞裡。棒球和球棒來到了雙蛇洞門前。發現門前有很多五彩斑斓的寶箱排列在洞門兩側(模塊(model):概念:在python中.py結尾的文件,我們稱為模塊;作用:將類、函數、屬性...內容定義其中)
。五彩斑斓的寶物分三種,一種是雙蛇洞內本來就有的(.標准庫模塊:安裝完python環境之後就存在的模塊,這些模塊我們如果想要使用,導入即可)
,如五彩魔方(random)
,五彩鐘表(time)
,五彩機器人(os)
,采蘑菇的小姑娘的五彩籮筐(collections)
,五彩蘋果樹(math)
。門口的五彩寶箱是人為造出來的(在項目開發過程中,整個團隊中程序員自己定義,可以給自己、別人進行調用)
,還有一些是從國外進口的寶物,首先要經過聰明的管家機器人的同意(打開cmd --> 輸入pip -V(此操作查看是否安裝完成pip))
,然後讓轎夫將該寶物抬進洞裡(安裝某個第三方模塊:pip install 模塊名)
。轎夫有寶物的詳細說明(查看某個第三方模塊的詳細信息:pip show 模塊名)
,並且轎夫還有張所有抬進的寶物的完整清單(查看當前安裝的所有第三方模塊:pip list)
,當然,如果不想要某個寶物了可以讓轎夫將其抬走(刪除某個第三方模塊:pip uninstall 模塊名)
。如果要用寶物或者寶物裡的東西,可以直接將寶物,或者寶物裡的一些部件拿到你的封閉的工作室。
1).精確導入:
舉例:
import time
from random import randint
from math import pi,
也可以直接全部導入
2).模糊導入:
舉例:
from math import *
from os import *
在導入的時候,你還可以給寶物或者裡面的東西起名字,只要你把之前的名字覆蓋住就可以了。
給導入的模塊或者函數、屬性起別名:
使用as關鍵字來實現
【注意】:如果一旦給模塊、函數、屬性起了別名,原本的名字就不可用了。
如果一旦給模塊、函數、屬性起了別名,原本的名字就不可用了;
from random import randint as r
有的自己做的寶箱裡的寶物不想別別人調用,就用一條四節鐵鏈將其鎖住。
代碼:
if __name__ == '__main__': 此代碼的作用是將不想被導入加載的代碼定義其中
棒球還在洞門前的廣場正中央見到一個懸在半空的布口袋,裡面裝的是有關聯的寶物的名字清單。
"包"的概念:package
創建一個python package,創建成功就是一個所謂的python的包;
它的作用:將多個有關聯的模塊定義在其中,方便之後的維護和管理