day-12 generator,module

1.函數(shù)調(diào)用過程:

函數(shù)調(diào)用過程又叫壓棧的過程:每次調(diào)用函數(shù)榆芦,系統(tǒng)都會在內(nèi)存的棧區(qū)間自動開辟一個臨時的內(nèi)存空間窒悔,

用來保存在函數(shù)中聲明的局部變量(其中形參是也保存在這個區(qū)域中的)僧界,

當函數(shù)調(diào)用結束迅矛,這個內(nèi)存區(qū)域會自動銷毀(這個內(nèi)存中存儲的數(shù)據(jù)也會銷毀)

2.迭代器(iter)

1) 什么是迭代器

迭代器是python提供的容器型數(shù)據(jù)類型。 (可變燕差,有序的)-- 不關注

迭代器和之前的列表遭笋、字典、集合徒探、元祖等容器不一樣瓦呼,它只能查看元素,而且看一個對于迭代器來說测暗,里面的元素就會少一個

迭代器的值:a.將其他的數(shù)據(jù)轉換成迭代器 b.生成器

迭代器的元素: 任何類型的數(shù)據(jù)都可以央串,可以重復

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

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

2) 查 - 獲取元素的值

注意: 不管以任何形式獲取了迭代器中某個元素的值磨澡,這個元素都會從迭代器中消失

a.獲取單個元素

next(迭代器)/ 迭代器.next() - 返回容器中最上面的元素

print(next(iter1))
print(next(iter1))
print(next(iter1))
# print(next(iter1))     #  StopIteration

b.遍歷取出迭代器中的每個元素

print('=============')
iter3 = iter('abcdef')
next(iter3)
next(iter3)
for item in iter3:
    print(item)

print('=============')
# print(next(iter3))   # StopIteration

3) 什么時候使用迭代器:多個數(shù)據(jù)中,某個或者某些數(shù)據(jù)使用過了就不需要再保存了质和,這種數(shù)據(jù)就可以使用迭代器來保存稳摄。

1.什么是生成器

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

1)怎么創(chuàng)建生成器

如果函數(shù)中有yield關鍵字饲宿,那么這個函數(shù)就不再是一個普通的函數(shù)秩命。

調(diào)用函數(shù)不再是執(zhí)行函數(shù)體,獲取返回值褒傅。而是創(chuàng)建這個函數(shù)對應的生成器對象

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


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

2)生成器怎么產(chǎn)生數(shù)據(jù)

一個生成器能夠產(chǎn)生多少個數(shù)據(jù)弃锐,就看執(zhí)行完生成器對應的函數(shù)體會遇到幾次yield關鍵字

生成器是在獲取數(shù)據(jù)的時候才會產(chǎn)生數(shù)據(jù),執(zhí)行生成器對應的函數(shù)的函數(shù)體殿托,直到遇到y(tǒng)ield為止霹菊,

將yield后面的數(shù)據(jù)作為生成器的元素返回,并且會記錄這次產(chǎn)生數(shù)據(jù)函數(shù)體結束的位置支竹,下次再產(chǎn)生

數(shù)據(jù)的時候旋廷,會接著上次結束的位置接著往后執(zhí)行...如果從執(zhí)行開始到函數(shù)結束,沒有遇到y(tǒng)ield礼搁,那么就不會產(chǎn)生數(shù)據(jù)饶碘。

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


# 創(chuàng)建一個生成器gen2
gen2 = nums()
print('取第一個值')
print(next(gen2))
print('取第二個值')
print(next(gen2))
print('取第三個值')
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))

練習: 寫一個生產(chǎn)器,能夠產(chǎn)生'stuXXXX'的學號馒吴, stu0000 ~ stu9999

def stu_num_creater(count, width=0):
    for num in range(count):
        if width == 0:
            width = len(str(count))
        num_str = 'stu' + str(num).zfill(width)
        yield num_str


creater = stu_num_creater(100, 4)
print(next(creater))
for num in creater:
    print(num)

1.生成式

生產(chǎn)式是生成器的另外一種寫法(簡寫)

"""
a.語法1:
生成器變量 = (表達式 for 變量 in 序列) -- 結果是生成器
列表變量 = [表達式 for 變量 in 序列] -- 結果是列表

b.說明: 表達式 - 可以是值扎运、變量、運算表達式饮戳、函數(shù)調(diào)用表達式等豪治,只要不是賦值語句都可以

c.展開
def 函數(shù)名():
for 變量 in 序列:
yield 表達式
"""

gen1 = (x*2 for x in range(5))
print(gen1)
for num in gen1:
    print(num)
print('==')

"""
a.語法2:
生成器變量 = (表達式 for 變量 in 序列 if 條件語句)

b.展開
def 函數(shù)名():
for 變量 in 序列:
if 條件語句:
yield 表達式
"""

gen2 = (x for x in range(10) if x % 2)
# 5個  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)

# next(gen2)


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

python中一個py文件就是一個模塊

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

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

1.模塊的導入

a.import 模塊名 / import 模塊名 as 新的模塊名 --- 可以通過'模塊名.'的方式去使用這個模塊中所有的全局變量

b.from 模塊名 import 全局變量1 as 新名1,全局變量2 as 新名2,... --- 帶入指定模塊中指定的全局變量秸歧,導入后直接使用全局變量

注意: 重命名后厨姚,原名不能使用

===========導入方式1===========

import keyword

import random

import math

import test

print(test.test1_a * 3)

test.test1_a = 200

print(test.test1_a)

test.test1_func1()

============導入方式2==========

from random import randint

print(randint(10, 30))

from test import test1_func1, test1_a

test1_func1()

print(test1_a)

============導入模塊并重命名==========

import test as TS

print(TS.test1_a)

TS.test1_func1()

b = 'python'

from test import b as t_b, test1_a as t_a

print(b, t_b, t_a)

3.導入模塊的原理:當代碼執(zhí)行到import或者from - import的時候,會自動將對應的模塊中的代碼全部執(zhí)行一遍

同一個模塊導入多次不會執(zhí)行多次(放心的導入!)

print('++++++++++++++')

import test

import test

from test import test1_a

import test2

print(test1_a, test.test1_func1())

print('++++++++++++++')

print('mudule:', __name__)
from test2 import yt_sum
print(yt_sum(1, 1))

import PIL
import requests

4.阻止導入: 將需要阻止被別的模塊導入的代碼放到以下if語句中

"""
if name == 'main':
需要阻止導入的代碼段

原理: 每個模塊都有一個屬于自己的name屬性寥茫,用來保存當前模塊的模塊名遣蚀。默認情況下name的值就模塊對應的py文件
的文件名。當我們直接運行某個模塊的時候,對應的模塊的name會自動變成'main',其他模塊是默認值芭梯。
"""

1.異常 : 程序錯誤险耀、程序崩潰。程序中某條語句出現(xiàn)異常玖喘,那么從這條語句開始甩牺,后面的代碼不會執(zhí)行,程序直接結束

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

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

"""
a.語法
try:
代碼段1
except:
代碼段2
finally:
代碼段N

其他語句

b.說明:先執(zhí)行代碼段1贬派,如果代碼段1不出現(xiàn)異常,直接執(zhí)行后面的其他語句澎媒;
如果出現(xiàn)異常不崩潰直接執(zhí)行代碼段2搞乏,然后再接著其他語句
"""

list1 = [1, 2, 3]

try:
    print(list1[10])
    print({'a': 10}['b'])
    print('~~~~')
except:
    print('出現(xiàn)異常')

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

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

"""
try:
代碼段1
except 異常類型:
代碼段2
finally:
代碼段N

其他語句

try:
代碼段1
except (異常類型1,異常類型2,...):
代碼段2
finally:
代碼段N

其他語句

先執(zhí)行代碼段1戒努,如果代碼1沒有出現(xiàn)異常请敦,直接執(zhí)行后面的其他語句;
如果代碼段1出現(xiàn)異常储玫,如果這個異常的類型和需要捕獲的異常類型一致侍筛,程序不崩潰,直接執(zhí)行代碼段2撒穷,然后再執(zhí)行其他語句匣椰;
如果代碼段出現(xiàn)異常,異常類型和需要捕獲的異常類型不一致端礼,程序直接崩潰

注意:異常類型要求必須是直接或者間接繼承Exception類的子類
"""
print('==============方式二===============')

try:
    # print({'a': 10}['n'])
    # print([1, 2, 3][10])
    print('======')
    print(int('abc'))
except (KeyError, IndexError):
    print('出現(xiàn)異常!')
finally:
    print('寫遺書禽笑!')

方式3:捕獲不同類型的異常,并且可以對不同的異常做不同的處理

"""
try:
代碼段1
except 異常類型1:
代碼段2
except 異常類型2:
代碼段3
finally:
代碼段N

...
"""
print('==============方式3===============')

try:
    print({'a': 10}['b'])
    print([1, 2, 3][10])
except IndexError:
    print('下標越界')
except KeyError:
    print('key不存在')

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

作業(yè): 輸入年齡并且將年齡值轉換成整數(shù),如果輸入錯誤程序不崩潰喻括,讓其重新輸入,直到輸入無誤為止...

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贫奠,一起剝皮案震驚了整個濱河市唬血,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唤崭,老刑警劉巖拷恨,帶你破解...
    沈念sama閱讀 212,657評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谢肾,居然都是意外死亡腕侄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,662評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冕杠,“玉大人微姊,你說我怎么就攤上這事》衷ぃ” “怎么了兢交?”我有些...
    開封第一講書人閱讀 158,143評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長笼痹。 經(jīng)常有香客問我配喳,道長,這世上最難降的妖魔是什么凳干? 我笑而不...
    開封第一講書人閱讀 56,732評論 1 284
  • 正文 為了忘掉前任晴裹,我火速辦了婚禮,結果婚禮上救赐,老公的妹妹穿的比我還像新娘息拜。我一直安慰自己,他們只是感情好净响,可當我...
    茶點故事閱讀 65,837評論 6 386
  • 文/花漫 我一把揭開白布少欺。 她就那樣靜靜地躺著,像睡著了一般馋贤。 火紅的嫁衣襯著肌膚如雪赞别。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,036評論 1 291
  • 那天配乓,我揣著相機與錄音仿滔,去河邊找鬼。 笑死犹芹,一個胖子當著我的面吹牛崎页,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腰埂,決...
    沈念sama閱讀 39,126評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼飒焦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屿笼?” 一聲冷哼從身側響起牺荠,我...
    開封第一講書人閱讀 37,868評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎驴一,沒想到半個月后休雌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,315評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡肝断,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,641評論 2 327
  • 正文 我和宋清朗相戀三年杈曲,在試婚紗的時候發(fā)現(xiàn)自己被綠了驰凛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,773評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡担扑,死狀恐怖恰响,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情魁亦,我是刑警寧澤渔隶,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站洁奈,受9級特大地震影響间唉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜利术,卻給世界環(huán)境...
    茶點故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一呈野、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧印叁,春花似錦被冒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,859評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至跃洛,卻和暖如春率触,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背汇竭。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工葱蝗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人细燎。 一個月前我還...
    沈念sama閱讀 46,584評論 2 362
  • 正文 我出身青樓两曼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親玻驻。 傳聞我的和親對象是個殘疾皇子悼凑,可洞房花燭夜當晚...
    茶點故事閱讀 43,676評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 包(lib)、模塊(module) 在Python中击狮,存在包和模塊兩個常見概念佛析。 模塊:編寫Python代碼的py...
    清清子衿木子水心閱讀 3,801評論 0 27
  • 一 1.函數(shù)調(diào)用過程: 函數(shù)調(diào)用過程又叫壓棧的過程:每次調(diào)用函數(shù),系統(tǒng)都會在內(nèi)存的棧區(qū)間自動開辟一個臨時的內(nèi)存空間...
    程序里的小仙女閱讀 133評論 0 1
  • 寫在前面的話 代碼中的# > 表示的是輸出結果 輸入 使用input()函數(shù) 用法 注意input函數(shù)輸出的均是字...
    FlyingLittlePG閱讀 2,743評論 0 8
  • 桑椹被大家稱為“天然富硒水果皇后”彪蓬,在人體內(nèi)維生素和硒協(xié)同,能夠有效的保護細胞膜捺萌,預防不飽和脂肪酸的氧化档冬,桑葚還被...
    酒的時光機閱讀 847評論 0 0
  • 來源:旅游學院 作者:劉倩 窗外雨聲連綿膘茎,依舊是一滴一滴的雨珠滴落在窗臺上,屋頂上酷誓,嘀嗒披坏,嘀嗒,恍...
    旅16酒管本閱讀 163評論 0 0