day12總結(jié)

"""author = 曹琦"""

迭代器

1.函數(shù)的調(diào)用過(guò)程

函數(shù)調(diào)用過(guò)程又叫壓棧的過(guò)程:每次調(diào)用函數(shù),系統(tǒng)都會(huì)在內(nèi)存的棧區(qū)間自動(dòng)開(kāi)辟一個(gè)臨時(shí)的內(nèi)存空間,
用來(lái)保存在函數(shù)中聲明的局部變量(其中形參也是保存在這個(gè)區(qū)域中的),
當(dāng)函數(shù)調(diào)用結(jié)束,這個(gè)內(nèi)存區(qū)域會(huì)自動(dòng)銷(xiāo)毀(這個(gè)內(nèi)存中儲(chǔ)存的數(shù)據(jù)也會(huì)銷(xiāo)毀)

2.迭代器(iter)

1)什么是迭代器
迭代器是python提供的容器型數(shù)據(jù)類(lèi)型,(可變,有序) -- 不關(guān)注
迭代器和之前的列表、字典、集合、元祖等容器不一樣,它只能查看元素,而且看一個(gè)對(duì)于迭代器來(lái)說(shuō),里面的元素就會(huì)少一個(gè)

迭代器的值:a.將其他的數(shù)據(jù)轉(zhuǎn)換成迭代器 b.生成器
迭代器中的元素:可以是任何類(lèi)型的數(shù)據(jù),可以重復(fù)

iter1 = iter('abc')
print(iter1)

iter2 = iter([12,34,'abc',[1,2],{'a': 10},(1,2),{1,3},lambda x: x])
print(iter2)

2)查 - 獲取元素的值
注意:不管以任何形式獲取了迭代器中某個(gè)元素的值,這個(gè)元素都會(huì)從迭代器中消失

# a.獲取單個(gè)元素
 next(迭代器)/迭代器.__next__(),返回容器中最上面的元素。
iter1 = iter('abc')
print(next(iter1))
print(next(iter1))
print(next(iter1))
# print(next(iter1))    #   StopIteration  取完了再取會(huì)報(bào)錯(cuò)

# b.遍歷取出迭代器的每一個(gè)元素
print('============')
iter3 = iter('abcdef')
next(iter3)
next(iter3)
for item in iter3:
    print(item)

print('============')

# print(next(iter3))   #  StopIteration

3)什么時(shí)候適用迭代器:大量數(shù)據(jù)中某個(gè)或者某些數(shù)據(jù)使用過(guò)了就不需要在保存了,這種數(shù)據(jù)就可以使用迭代器來(lái)保存。

生成器

1.什么是生成器

生成器就是迭代器, 但是迭代器不一定是生成器

1)怎么創(chuàng)建生成器
如果函數(shù)中有yield關(guān)鍵字,那么這個(gè)函數(shù)就不再是一個(gè)普通的函數(shù)。
調(diào)用函數(shù)不再是執(zhí)行函數(shù)體,獲取返回值。而是創(chuàng)建這個(gè)函數(shù)對(duì)應(yīng)的生成器對(duì)象

def nums():
    print('============')
    print(100)
    if False:
        yield
    return 100


gen1 = nums()      # 函數(shù)調(diào)用表達(dá)式nums()才是生成器

2)生成器怎么產(chǎn)生數(shù)據(jù)
一個(gè)生成器能夠產(chǎn)生多少個(gè)數(shù)據(jù),就看執(zhí)行完生成器對(duì)應(yīng)的函數(shù)體會(huì)遇到幾次yield關(guān)鍵字
生成器是在獲取數(shù)據(jù)的時(shí)候才會(huì)產(chǎn)生數(shù)據(jù),執(zhí)行生成器對(duì)應(yīng)的函數(shù)的函數(shù)體,直到遇到y(tǒng)ield為止,
將yield后面的數(shù)據(jù)作為生成器的元素返回,并且會(huì)記錄這次產(chǎn)生數(shù)據(jù)函數(shù)體結(jié)束的位置,下次再產(chǎn)生
數(shù)據(jù)的時(shí)候,會(huì)接著上次結(jié)束的位置接著往后執(zhí)行...如果從執(zhí)行開(kāi)始到函數(shù)結(jié)束,沒(méi)有遇到y(tǒng)ield,那么就不會(huì)產(chǎn)生數(shù)據(jù)。

def nums():
    print('++++++')
    yield 'abc'
    print('-------')
    yield 100
    print('********')
    for x in range(5):
        yield x


# 創(chuàng)建一個(gè)生成器gen2
gen2 = nums()
print('取第一個(gè)值')
print(next(gen2))
print('取第二個(gè)值')
print(next(gen2))
print('取第三個(gè)值')
print(next(gen2))


def nums2():
    index = 0
    while True:
        yield index
        index += 2


gen3 = nums2()
for _ in range(10):
    print(next(gen3))


print(next(gen3))
print(next(gen3))

生成式

1.生成式

生成式是生成器的另外一種寫(xiě)法(簡(jiǎn)寫(xiě))

"""
a.語(yǔ)法1
生成器變量 =(表達(dá)式 for 變量 in 序列) -- 結(jié)果是生成器
列表變量 = [表達(dá)式 for 變量 in 序列] -- 結(jié)果是列表
b.說(shuō)明:表達(dá)式 -- 可以是值、變量、運(yùn)算表達(dá)式、函數(shù)調(diào)用表達(dá)式等,只要不是賦值語(yǔ)句都可以
c.展開(kāi)
def 函數(shù)名():
for 變量 in 序列:
yield 表達(dá)式

gen1 = (x*2 for x in range(5))
print(gen1)
print(next(gen1))
print(next(gen1))
print(next(gen1))
print(next(gen1))
print(next(gen1))

a.語(yǔ)法2:
生成器變量 =(表達(dá)式 for 變量 in 序列 if 條件語(yǔ)句)
b.展開(kāi)
def 函數(shù)名():
for 變量 in 序列:
if 條件語(yǔ)句:
yield 表達(dá)式

gen2 = (x for x in range(10) if x % 2)
# 5個(gè)   1,3,5,7,9
for num in gen2:
    print(num)


gen2 = ((x,x*2) for x in range(10) if x % 2)

for num in gen2:
    print(num)

gen2 = ((x,x*2) for x in range(10) if x % 2)
list2 = list(gen2)
print(list2)

gen2 = ('num%d' % x for x in range(10) if x % 2)
print(next(gen2))

"""author = 曹琦"""

python中一個(gè)py文件就是一個(gè)模塊

"""
從封裝的角度看:
函數(shù)是對(duì)功能的封裝
模塊可以通過(guò)多個(gè)函數(shù)對(duì)不同的功能進(jìn)行封裝,還可以通過(guò)全局變量對(duì)數(shù)據(jù)進(jìn)行封裝

模塊

0.模塊的分類(lèi):系統(tǒng)模塊(內(nèi)置模塊)、第三方庫(kù)(別人寫(xiě)的)、自定義模塊

1.模塊的導(dǎo)入

a.import 模塊名 ------- 可以通過(guò)'模塊名.'的方式去使用這個(gè)模塊中所有的全局變量
b.from 模塊名 import 全局變量1,全局變量2..... ---- 帶入指定模塊中指定的全局變量,導(dǎo)入后直接使用全局變量
注意:import 模塊名 as 新模塊名 ---- 導(dǎo)入模塊并重命名,重命名后,原名不能使用
from 模塊名 import 全局變量1 as 新名1,全局變量2 as 新名2.........

import random
import keyword

2.導(dǎo)入方式

=============導(dǎo)入方式1========

# import test
#
# print(test.test1_a*3)
# test.test1_a = 200


#============導(dǎo)入方式2===========
# from random import randint
# print(random(10,30))

# from test import test1_func1,test1_a
# test1_func1()


# =============導(dǎo)入模塊并重命名==========
# import test as Ts

3.導(dǎo)入模塊的原理:當(dāng)代碼執(zhí)行到import或者from - import的時(shí)候,會(huì)自動(dòng)將對(duì)應(yīng)的模塊中的代碼全部執(zhí)行一遍

             同一個(gè)模塊導(dǎo)入多次不會(huì)重復(fù)執(zhí)行,放心的導(dǎo)入
# print('=============')
# import test
# import test

4.阻止導(dǎo)入:將需要阻止被別的模塊導(dǎo)入的代碼放到一下if語(yǔ)句中

"""
if name == 'main':
需要阻止導(dǎo)入的代碼段
原理:每個(gè)模塊都有一個(gè)屬于自己的name屬性,用來(lái)保存當(dāng)前模塊的模塊名。默認(rèn)情況下name的值
就是模塊對(duì)應(yīng)的py文件的文件名。當(dāng)我們直接運(yùn)行某個(gè)模塊的時(shí)候,對(duì)應(yīng)的模塊的name會(huì)自動(dòng)變成'main'
其他模塊是默認(rèn)值。
"""

異常處理

1.異常:程序錯(cuò)誤、程序崩潰。程序中某條語(yǔ)句出現(xiàn)異常,那么從這條語(yǔ)句開(kāi)始,后面的代碼不會(huì)執(zhí)行,程序直接結(jié)束

2.異常捕獲:程序出現(xiàn)異常的時(shí)候,程序不崩潰。

1)方式一:捕獲所有異常

try:
代碼段1
except:
代碼段2
其他語(yǔ)句

說(shuō)明:先執(zhí)行代碼段1,如果代碼段1不出現(xiàn)異常,直接執(zhí)行后面的其他語(yǔ)句;
如果出現(xiàn)異常不崩潰直接執(zhí)行代碼段2,然后再執(zhí)行其他語(yǔ)句

list1 = [1,2,3]
try:
    print(list1[10])
    print('~~~~')
except:
    print('出現(xiàn)異常')

print('===========')

2)方式二:捕獲指定的一個(gè)或者多個(gè)異常,做相同的處理

try:
代碼段1
except 異常類(lèi)型:
代碼段2

其他語(yǔ)句

try:
代碼段1
except (異常類(lèi)型1,異常類(lèi)型2,.....):
代碼段2
其他語(yǔ)句

先執(zhí)行代碼段1,如果代碼段1沒(méi)出現(xiàn)異常,直接執(zhí)行后面的其他語(yǔ)句;
如果代碼段1出現(xiàn)異常,如果這個(gè)異常的類(lèi)型和需要捕獲的異常類(lèi)型一致,程序不崩潰,直接執(zhí)行代碼段2,然后再執(zhí)行其他語(yǔ)句;
如果代碼段1出現(xiàn)異常,如果這個(gè)異常的類(lèi)型和需要捕獲的異常類(lèi)型不一致,程序直接崩潰。

注意:異常類(lèi)型要求必須是直接或者間接繼承自Exception類(lèi)的子類(lèi)

print('=====方法2=====')
try:
    print([1,2,3][10])
    print({'a': 10}['b'])
except(KeyError,IndexError):
    print('出現(xiàn)異常')
finally:
    print('寫(xiě)遺書(shū)')

3)方式三:捕獲不懂類(lèi)型的異常,并且對(duì)不同的異常做不同的處理

try:
代碼段1
except 異常類(lèi)型1:
代碼段2
except 異常類(lèi)型2:
代碼段3
...

print('=====方法3=====')
try:
    print([1,2,3][10])
    print({'a: 10'}['b'])
except IndexError:
    print('下標(biāo)越界')
except KeyError:
    print('key不存在')
finally:
    print('寫(xiě)遺書(shū)')

3.finally后面的代碼段,不管try中的代碼發(fā)生了什么,都會(huì)執(zhí)行

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容