1. 程式人生 > 實用技巧 >02Python-生成器函式-列表推導式-生成器表示式-匿名函式-內建函式

02Python-生成器函式-列表推導式-生成器表示式-匿名函式-內建函式

目錄


Day12

生成器函式

迭代器:Python中內建的一種節省空間的工具
生成器的本質就是一個迭代器
迭代器和生成器的區別: 一個是python自帶的,一個是程式設計師自己寫的

生成器產生方式,yield與return的區別

1.生成器函式

2.生成器表示式

3.python提供的一些內建函式,返回一個生成器

yield與return的區別:

return 結束函式;給函式的執行者返回一個值;(多個值通過元組的形式返回)。

yield 不結束函式;對應著給next返回值;(多個值通過元組的形式返回)。

生成器函式

def func():
    print(111)
    return 2
ret = func()
print(ret)
# 執行此函式,遇到return結束函式;
# 將數字2返回給ret

def func():
    print(111)
    yield 2
ret = func()       # 生成器物件
print(ret)      # <generator object func at 0x000001D13B582D00>
# 只要函式中出現了yield,那麼它就不是函數了,它是生成器函式。
# 一個next對應一個yield
print(next(ret))    # 111 2

生成器的舉例

def shuyang():
    list1 = []
    for i in range(1, 2001):
        list1.append(f'{i}只羊')
    return list1
print(shuyang())

def shuyang_v1():
    for i in range(1, 2001):
        yield f'{i}只羊'
ret = shuyang_v1()
# print(ret.__next__()) # 1只羊
# print(next(ret))      # 2只羊
for i in range(200):
    print(next(ret))

for i in range(200):
    print(next(ret))

yield與yiled from

yield:對應next給next返回值;

yield from:將一個可迭代物件的每一個元素返回給next;節省程式碼,提升效率(代替了for迴圈);

def func():
    l1 = [1,2,3]
    yield from l1
    '''
    yield 1
    yield 2
    yield 3
    '''
ret = func()
print(next(ret))
print(next(ret))
print(next(ret))

列表推導式,生成器表示式(字典推導式,集合推導式)

列表推導式

列表推導式:一行程式碼構建一個有規律比較複雜的列表。

列表推導式構建方式:
1.迴圈模式:[變數(加工後的變數) for 變數 in iterable]
2.篩選模式:[變數(加工後的變數) for 變數 in iterable if 條件]

列表推導式優缺點:

​ 優點:簡單,快捷;

​ 缺點:可讀性不高,不好拍錯;

迴圈模式
# lst = []
# for i in range(1,101):
#     lst.append(i)
# print(lst)

l1 = [ i for i in range(1,101)]
print(l1)

將10以內所有整數的平方寫入列表:
print([i ** 2 for i in range(1,11)])

100以內所有的偶數寫入列表:
print([i for i in range(1,101,2)])

寫入1只羊到100只羊到列表:
print([f'{i}只羊' for i in range(1,101)])



篩選模式
lst = []
for i in range(20):
    if i % 2 == 0:
        lst.append(i)
print(lst)

print([i for i in range(20) if i % 2 == 0])

三十以內可以被4整除的數
print([i for i in range(1,31) if i % 4 == 0])

過濾長度小於3的字串列表,剩下的轉換成大寫字母
l1 = ['xiaoming', 'xiaohong', 'xx', 'dagouzi', 'ai']
print([i.upper() for i in l1 if len(i) > 3])

找到巢狀列表中名字包含有兩個'e'的所有名字
names = [['Tom', 'billy', 'jeff', 'adnre', 'weet', 'see', 'jill', 'timee','aege'],
         ['wang', 'tetate', 'aaaa','bbbb','ccc','edddae']]
l2 = []
for i in names:
    for j in i:
        if j.count('e') == 2:
            l2.append(j)
print(l2)

# 推導式
print([j for i in names for j in i if j.count('e') == 2])

生成器表示式,節省記憶體

與列表推導式幾乎一模一樣:

迴圈模式,篩選模式

st = (i for i in range(1,10))

如何觸發生成器(迭代器)取值
	1.next(st)
		print(next(st))
	2.for 迴圈
		for i in st:
			print(i)
	3.資料轉化
		print(list(st))

字典推導式

字典推導式和集合推導式也是有迴圈模式和篩選模式兩種

# 字典推導式
l1 = ['xiaoming', 'xiaohong', 'xiaogang','zhangsan', 'lisi']
# {0:'xiaoming", 1:'xiaohong', 2:'xiaogang', 3:'zhangsan', 4:'lisi'}
dic = {}
for i in range(len(l1)):
    dic[i] = l1[i]
print(dic)

print({i:l1[i] for i in range(len(l1))})

集合推導式

print({i for i in range(10)})

print({i for i in range(10) if i % 2 == 0})

匿名函式

匿名函式:沒有名字的函式;

匿名函式只能構建簡單的函式,一句話函式;

def func(x,y):
    return x + y
print(func(1,2))

# 匿名函式構建:lambda 關鍵字:定義一個匿名函式
func2 = lambda x,y: x + y
print(func2(1,2))

# 匿名函式經常用法:與內建函式結合使用
# 寫匿名函式:接受一個可切片的資料,返回索引為0與2對應的元素(元組形式)
lst = [1,2,3,4,5]
func = lambda x: (x[0],x[2])
print(func(lst))

# 寫匿名函式:接收兩個int引數,將較大的資料返回
func1 = lambda x, y: x if x > y else y
print(func1(2,4))

內建函式

內建函式:內建的函式;python內建函式68種;

str()	dir()	range()	len()	print()
max()	min()	open()	input()	type()
int()	enumerate()	list()	id()	set()
dict()	iter()	next()	tuple()	bool()
globals()	locals()	frozenset()	

eval exce -- 慎用

# eval 剝去字串的外衣,返回裡面的本質
s = "{1: 'xiaoming'}"
ret = eval(s)
print(ret,type(ret))

s2 = '1 + 3'
print(s2)
print(eval(s2))

# exec 程式碼流,過程,沒有返回值
s3 = """
for i in range(3):
    print(i)
"""
exec(s3)