日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

day 13

發(fā)布時(shí)間:2025/7/25 编程问答 212 豆豆
生活随笔 收集整理的這篇文章主要介紹了 day 13 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

迭代器:

作用:可以不依賴索引進(jìn)行取值。

可迭代對(duì)象:

必須內(nèi)置有__iter__方法

__iter__讀法:雙下+方法名

需要迭代取值的數(shù)據(jù)類型:

字符串、列表、元祖、字典、集合(均為可迭代對(duì)象)

文件對(duì)象:(迭代器對(duì)象)執(zhí)行內(nèi)置__iter__之后還是它本身。

f1 = open('xxx.txt','w',encoding='utf-8')

print(f1)

可迭代對(duì)象執(zhí)行內(nèi)置的__iter__方法之后就變成了迭代器對(duì)象。

迭代器對(duì)象:

1.有內(nèi)置方法__iter__、__next__方法

l = [1,2,3,4]

__iter__l = l.__iter__()#生成迭代器對(duì)象

迭代器取值 需要調(diào)用__next__方法

print(__iter__l.__next__())

......

當(dāng)取空時(shí)會(huì)直接報(bào)錯(cuò)(StopIteration)

迭代器對(duì)象無論執(zhí)行多少次__iter__()方法得到的還是迭代器本身。

f1=open('a.txt','r',encoding='utf-8')

print(f1? is? f1.__iter__().__iter__().__iter__().__iter__())

問:__iter__方法就是用來幫我們生成迭代器對(duì)象而文件對(duì)象本身就是迭代器對(duì)象,為什么還內(nèi)置有__iter__方法???

因?yàn)槿绻麤]有這個(gè)內(nèi)置方法的話文件對(duì)象調(diào)用__iter__()時(shí),就會(huì)報(bào)錯(cuò)。

異常處理:

try:

.....

except StopIteration(錯(cuò)誤類型):

“錯(cuò)誤類型匹配時(shí)執(zhí)行此處的代碼!”

迭代器的取值特點(diǎn):只能依次的往后去,不能后退。

for循環(huán)的本質(zhì):

for? ...? ?in? ?...

關(guān)鍵字in的后面:可迭代對(duì)象。

for循環(huán)的內(nèi)部本質(zhì):

1.將in后面的對(duì)象調(diào)用__iter__轉(zhuǎn)換成迭代器對(duì)象。

2.調(diào)用__next__迭代取值

3.內(nèi)部有異常處理機(jī)制,用來捕獲錯(cuò)誤類型StopIteration,當(dāng)__next__出現(xiàn)這種錯(cuò)誤類型時(shí),自動(dòng)調(diào)用break來結(jié)束本次循環(huán)。

迭代取值的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):

1.不用依賴傳統(tǒng)的索引取值。

2.在內(nèi)存中永遠(yuǎn)只占一份空間,需要的時(shí)候再取出,不會(huì)導(dǎo)致內(nèi)存溢出。

缺點(diǎn):

1.不能夠只取出指定元素,只能依次取出。

2.當(dāng)?shù)髦械闹当蝗⊥陼r(shí)會(huì)報(bào)錯(cuò)。(StopIteration)

生成器:即用戶通過自定義的迭代器。

一般形式:

def? ? func():

? ? ? ?print('first')

? ? ? ? yield? ? 666? ? ? ?#函數(shù)體內(nèi)有yield關(guān)鍵字時(shí),加括號(hào)并不會(huì)取執(zhí)行函數(shù)

? ? ? ? #yield? ? 1,2,3,4

#yield后面的值就是當(dāng)你調(diào)用迭代器__next__方法時(shí),你可以得到的值。

同時(shí)yield可以返回多個(gè)值,并且多個(gè)值也是按照元祖的形式返回的

g = func()? ? ? #生成器初始化:將函數(shù)變成迭代器

print(g.__next__())

自己手寫一個(gè)range(1,10,2)函數(shù)

def my_range(n,k,j):
while n<k:
yield n
n+=j
res = my_range(1,10,2)
print(res)
print(res.__next__())
yield表達(dá)式形式(了解內(nèi)容)

def dog(name):
print('%s 準(zhǔn)備開吃'%name)
while True:
food = yield
print('%s 吃了 %s'%(name,food))
# def index():
# pass

yield支持外界為其傳參(send())

當(dāng)函數(shù)體內(nèi)有yield關(guān)鍵字的時(shí)候,調(diào)用該函數(shù)不會(huì)執(zhí)行函數(shù)體代碼,而是將函數(shù)變成一個(gè)生成器。

通過send()方法為yield傳值的時(shí)候,必須將代碼運(yùn)行到y(tǒng)ield才能夠?yàn)槠鋫髦?#xff08;運(yùn)行至yield是會(huì)自動(dòng)停止運(yùn)行),通過send傳值是也會(huì)自動(dòng)觸發(fā)__next__方法,進(jìn)行輸出一次。

與return的異同點(diǎn):

相同點(diǎn):都可以返回多個(gè)值。

不同點(diǎn):yield可以返回多次值,而return一次函數(shù)就結(jié)束了;yield還可以接受外部傳入的值。

生成器表達(dá)式:

# res = (i for i in range(1,10) if i != 4) # 生成器表達(dá)式
# print(res)
# """
# 生成器不會(huì)主動(dòng)執(zhí)行任何一行代碼
# 必須通過__next__觸發(fā)代碼的運(yùn)行

生成器表達(dá)式的應(yīng)用:

# with open('xxx.txt','r',encoding='utf-8') as f:

#(傳統(tǒng)的for循環(huán)方法)
# # n = 0
# # for line in f:
# # n += len(line)
# # print(n)

#(利用生成器表達(dá)式方法)
g = (len(line) for line in f)
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
?print(sum(g))

面試題:

def add(n,i):
return n+i
def test():
for i in range(4):
yield i
g=test()

for n in [1,10]:
g=(add(n,i) for i in g)
# 第一次for循環(huán)g=(add(n,i) for i in test())

# 第二次for循環(huán)g=(add(n,i) for i in (add(n,i) for i in test()))
print(n)
res=list(g)

"""
for i in (add(10,i) for i in test()): 會(huì)執(zhí)行所有的生成器內(nèi)部的代碼
add(n,i)
"""
#A. res=[10,11,12,13]
#B. res=[11,12,13,14]
#C. res=[20,21,22,23] 答案
#D. res=[21,22,23,24]

常用的內(nèi)置方法:

abs():求絕對(duì)值

print(abs(-11))#11

l = [1,2,3]

all(l)#只要有一個(gè)元素返回值為false,就返回false

any(l)#只要有一個(gè)元素返回值為True就返回true

globals():#查看全局名稱空間的變量名

二進(jìn)制:bin()

八進(jìn)制:oct()

十六進(jìn)制:hex()

chr(97)#將數(shù)字轉(zhuǎn)換成ASCII碼表對(duì)應(yīng)的字符。

order(‘a(chǎn)’)#將字符按照ASCII表轉(zhuǎn)換成對(duì)應(yīng)的數(shù)字。

"""
面向?qū)ο笮枰獙W(xué)習(xí)的方法
classmethod
delattr
getattr
hasattr
issubclass
property
repr
setattr
super
staticmethod
"""

dir()#獲取當(dāng)前對(duì)象的名稱空間里面的名字

l=[1,2,3]

print(dir(l))

divmod()#分頁器

print(divmod(101,10))#(10, 1)
enumerate #枚舉
l = ['a','b','c']
for i,j in enumerate(l):
print(i,j)
#結(jié)果:

0 a
1 b
2 c

eval(s):(提取字符串中的Python代碼并進(jìn)行運(yùn)算)不支持代碼邏輯只支持一些簡單的Python代碼

s='

print(1+2)

for i in range(10):

? ? ? ? print(i)

'

eveal(s1)#(報(bào)錯(cuò))

exec(s1)#(可以運(yùn)行)

exec(s):(提取字符串中的Python代碼并進(jìn)行運(yùn)算)支持代碼邏輯,比eveal高級(jí)

# isinstance 后面統(tǒng)一改方法判斷對(duì)象是否屬于某個(gè)數(shù)據(jù)類型

# n = 1
# print(type(n))
# print(isinstance(n,list)) # 判斷對(duì)象是否屬于某個(gè)數(shù)據(jù)類型
round():#四舍五入
面向過程編程:

好處:
將復(fù)雜的問題流程化 從而簡單化
壞處:
可擴(kuò)展性較差 一旦需要修改 整體都會(huì)受到影響

1 # 注冊(cè)功能 2 # 1.獲取用戶輸入 3 def get_info(): 4 while True: 5 username = input(">>>:").strip() 6 if not username.isalpha(): # 判斷字符串不能包含數(shù)字 7 print('不能包含數(shù)字') 8 continue 9 password = input('>>>:').strip() 10 confirm_password = input("confirm>>>:").strip() 11 if password == confirm_password: 12 d = { 13 '1':'user', 14 '2':'admin' 15 } 16 while True: 17 print(""" 18 1 普通用戶 19 2 管理員 20 """) 21 choice = input('please choice user type to register>>>:').strip() 22 if choice not in d:continue 23 user_type = d.get(choice) 24 operate_data(username,password,user_type) 25 break 26 else: 27 print('兩次密碼不一致') 28 29 # 2.處理用戶信息 30 def operate_data(username,password,user_type): 31 # jason|123 32 res = '%s|%s|%s\n'%(username,password,user_type) 33 save_data(res,'userinfo.txt') 34 35 # 3.存儲(chǔ)到文件中 36 def save_data(res,file_name): 37 with open(file_name,'a',encoding='utf-8') as f: 38 f.write(res) 39 40 def register(): 41 get_info() 42 43 register() View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/yangjiaoshou/p/11190269.html

總結(jié)

以上是生活随笔為你收集整理的day 13的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。