生成器 內建函式I 12

2022-09-08 04:21:11 字數 4549 閱讀 6514

生成器

生成器函式獲得生成器:

函式

def func():

print(111)

print(222)

return 3

ret = func()

print(ret)

生成器函式:

def func():

print(111)

print(222)

yield 3

a = 1

b = 2

c =a +b

print(c)

yield 4

ret =func()

print(next(ret))

print(next(ret))

print(next(ret))

乙個next 對應乙個yield

yield return

return :函式中只存在乙個return 結束函式,並且給函式的執行者返回值。yield:函式中只要有yield那麼它就是生成器函式而不是函式了。生成器函式中可以存在多個yield ,yield不會結束生成器函式,乙個yield對應乙個next。

吃包子練習題:

def func():

l1 =

for i in range(1,5001):

return l1

ret = func()

print(ret)

def gen_func():

for i in range(1,5001):

yield f'號包子'

ret =gen_func()

for i in range(200):

print(next(ret))

for i in range(200):

print(next(ret))

yield from

def func():

l1 = [1, 2, 3, 4, 5]

yield l1

ret = func()

print(next(ret))

def func():

l1 = [1,2,3,4]

yield from l1

'''yield 1

yield 2

yield 3

yield 4

yield 5

'''將l1 這個列表變成了迭代器返回。

ret = func()

print(next(ret))

print(next(ret))

print(next(ret))

print(next(ret))

生成器表示式,列表推導式

# l1 = [i**2 for i in range(1,11)]

# print(l1)

# l1 = [i for i in range(2,101) if i %2 == 0]

# print(l1)

# l1 = [f'python期 ' for i in range(1,101)]

# print(l1)

# l1 = ['barry','holting','ab','xo']

# l = [i.upper() for i in l1 if len(i) <3 ]

# print(l)

l1 = [i for i in range(2,11)] + list('jqka')

print(l1)

# 含有兩個'e'的所有的人名全部大寫留下來

names = [['tom', 'billy', 'jefferson', 'andrew', 'wesley', 'steven', 'joe'],

['alice', 'jill', 'ana', 'wendy', 'jennifer', 'sherry', 'eva']]

l1 =

for i in names:

for name in i:

if name.count('e') == 2:

print(l1)

print([name.upper() for i in names for name in i if name.count('e') == 2])

生成器表示式

# 生成器表示式:

# 與列表推導式的寫法幾乎一模一樣,也有篩選模式,迴圈模式,多層迴圈構建。寫法上只有乙個不同:

# 換成 ().

# print([i for i in range(1,11)])

# print((i for i in range(1,11)))

# obj = (i for i in range(1,11))

# print(next(obj))

# print(next(obj))

# print(next(obj))

# print(next(obj))

# print(next(obj))

# for i in obj:

# print(i)

迴圈模式講解

練習題:

總結:

列表推導式:

# 缺點:

# 1,有毒。列表推導式只能構建比較複雜並且有規律的列表。 不要太著迷。

# 2,超過三層迴圈才能構建成功的,就不建議用列表推導式。

# 3,查詢錯誤(debug模式)不行。

# 優點:

# 一行構建,簡單。

# 裝逼。

# 構建乙個列表: [2,3,4,5,6,7,8,9,10,'j','q','k','a']

# l1 = [i for i in range(2,11)] + list('jqka')

# print(l1)

列表推導式與生成器表示式區別。

寫法上: ( )

iterable iterator

字典推導式:(了解)

lst1 = ['jay', 'jj', 'meet']

lst2 = ['周杰倫','林俊傑','元寶']

dic =

print(dic)

集合推導式(了解)

print()

內建函式 i (此處了解)

# python 提供了68個內建函式。

# 今天講的這部分大部分了解即可。

# eval 剝去字串的外衣運算裡面的**,有返回值。

bin:將十進位制轉換成二進位制並返回。

oct:將十進位制轉化成八進位制字串並返回。

hex:將十進位制轉化成十六進製制字串並返回。

s1 = '1 + 3'

# print(s1)

# print(eval(s1)) **

# s = ''

# print(s,type(s))

# print(dict(s)) # 不行

# print(eval(s),type(eval(s)))

# 網路傳輸的str input 輸入的時候,sql注入等等絕對不能使用eval。

# exec 與eval幾乎一樣, **流。

msg = """

for i in range(10):

print(i)

"""# print(msg)

# exec(msg)

# hash 雜湊值

# print(hash('fsjkdafsda'))

# help 幫助

# s1 = 'fjdsls'

# print(help(str))

# print(help(str.upper))

# s1 = 'sfsda'

# s1.upper()

s1 = 'fdsklfa'

# s1()

def func():

pass

# func

# # callable 判斷乙個物件是否可被呼叫 ***

# print(callable(s1))

# print(callable(func))

16.看**求結果:(面試題)

def demo():

for i in range(4):

yield i

g=demo()

g1=(i for i in g)

g2=(i for i in g1)

print(list(g1))

print(list(g2))

17.看**求結果:(面試題)

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)

print(list(g))

生成器 內建函式

本質就是迭代器,手動寫的迭代器 生成器函式def func print 123 yield 生成器 func 執行結果 沒有結果 ret func 這個過程相當於 例項化物件 print ret 生成器物件 想執行這個 要用next 和迭代器一樣 或者遍歷它 next ret 123 print n...

day 12 函式生成器

一 1.迭代器 iter next 生成器 本質就是迭代器,兩種方式寫生成器 1 生成器函式 2 生成器表示式 2.生成器函式 函式內部由yield.yield返回 return yield可以把函式分段執行,生成器函式被呼叫的時候,返回生成器。def func yield g func 得到生成器...

python 迭代器 生成器 內建函式

迭代器是迭代取值的工具,迭代是乙個重複的過程,每一次重複都是基於上一次的結果而來的.為什麼要用迭代器呢?1.可以不依賴索引取值 2.同一時刻在記憶體中只有乙個值,不會過多的占用記憶體 如何用迭代器?可迭代的物件 但凡內建有 iter 方法的物件都是可迭代的物件,列如str,list,dict,tup...