最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python全棧之推導式和生成器

 更新時間:2021年12月01日 15:59:47   作者:熬夜泡枸杞  
這篇文章主要為大家介紹了Python推導式和生成器,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1. 推導式

# ### 推導式 : 通過一行循環(huán)判斷遍歷出一些列數(shù)據(jù)的方法叫做推導式
"""
語法:
    val for val in iterable
"""
# 1.推導式基本語法
lst = []
for i in range(1,51):
    lst.append(i)
print(lst)
# 改寫推導式
lst = [  i for i in range(1,51)  ]
print(lst)
# 小練習
# 1.[1,2,3,4,5] => [2,4,6,8,10]
lst = [ i*2 for i in range(1,6) ]
print(lst)
# 2.帶有判斷條件的推導式
"""注意點:for后面緊跟的判斷條件只能是單項分支."""
"""[1,2,3,4,5,6,7,8,9,10] => [1,3,5,7,9 ... ]"""
lst = [1,2,3,4,5,6,7,8,9,10]
lst_new = []
for i in lst:
    if i % 2 == 1:
        lst_new.append(i)
print(lst_new)
# 改寫推導式
lst = [ i for i in lst if i % 2 == 1 ]
print(lst)
# 3.多循環(huán)推導式 # 誰????誰
lst1 = ["孫杰龍","陳露","曹靜怡"]
lst2 = ["王志國","鄧鵬","合理"]
lst_new = []
for i in lst1:
    for j in lst2:
        lst_new.append(i+"????"+j)
print(lst_new)
# 改寫推導式
lst = [ i+"????"+j for i in lst1 for j in lst2 ]
print(lst)
# 4.帶有判斷條件的多循環(huán)推導式
lst_new = []
for i in lst1:
    for j in lst2:
        if lst1.index(i) == lst2.index(j):
            lst_new.append(i+"????"+j)
print(lst_new)
# 改寫推導式
lst = [i+"????"+j for i in lst1 for j in lst2 if lst1.index(i) == lst2.index(j)]
print(lst)

2. 推導式練習

# ### 推導式練習題
# (1).{'x': 'A', 'y': 'B', 'z': 'C' } 把字典寫成x=A,y=B,z=C的列表推導式
dic = {'x': 'A', 'y': 'B', 'z': 'C' } 
lst = []
for k,v in dic.items():
    res = k + "=" + v
    lst.append(res)
print(lst)
# 推導式
lst = [  k + "=" + v for k,v in dic.items()  ]
print(lst)
# (2).把列表中所有字符變成小寫  ["ADDD","dddDD","DDaa","sss"]
lst = ["ADDD","dddDD","DDaa","sss"]
lst_new = []
for i in lst:
    lst_new.append(i.lower())
print(lst_new)
# 推導式
lst = [ i.lower() for i in lst ]
print(lst)
# (3).x是0-5之間的偶數(shù),y是0-5之間的奇數(shù) 把x,y組成一起變成元組,放到列表當中
# 方法一
lst = []
for x in range(6):
    for y in range(6):
        if x % 2 == 0 and y % 2 == 1:
            lst.append( (x,y) )
print(lst)
# 推導式
lst = [ (x,y) for x in range(6) for y in range(6) if x % 2 == 0 and y % 2 == 1 ]
print(lst)

# 方法二
lst = []
for x in range(6):
    if x % 2 == 0 :
        for y in range(6):
            if y % 2 == 1:
                lst.append( (x,y)  )
print(lst)
# 推導式
lst = [ (x,y) for x in range(6) if x % 2 == 0 for y in range(6) if y % 2 == 1 ]
print(lst)
# (4).使用列表推導式 制作所有99乘法表中的運算
for i in range(1,10):
    for j in range(1,i+1):
        print("{:d}*{:d}={:2d} ".format(i,j,i*j) , end="")
    print()
lst = ["{:d}*{:d}={:2d} ".format(i,j,i*j) for i in range(1,10) for j in range(1,i+1)]
print(lst)
# (5)求M,N中矩陣和元素的乘積
# M = [ [1,2,3], 
#       [4,5,6], 
#       [7,8,9]  ] 
# N = [ [2,2,2], 
#       [3,3,3], 
#       [4,4,4]  ] 
M = [ [1,2,3] ,[4,5,6] , [7,8,9] ]
N = [ [2,2,2] ,[3,3,3] , [4,4,4] ]
"""
M[0][0] * N[0][0] = 2
M[0][1] * N[0][1] = 4
M[0][2] * N[0][2] = 6
M[1][0] * N[1][0] = 12
M[1][1] * N[1][1] = 15
M[1][2] * N[1][2] = 18
M[2][0] * N[2][0] = 12
M[2][1] * N[2][1] = 15
M[2][2] * N[2][2] = 18
"""
# =>實現(xiàn)效果1   [2, 4, 6, 12, 15, 18, 28, 32, 36]
"""雙層循環(huán),外層循環(huán)動的慢,內層循環(huán)動的快,正好符號M N 矩陣的下標"""
lst = []
for i in range(3):
    for j in range(3):
        lst.append(  M[i][j] * N[i][j]   )
print(lst)

# =>實現(xiàn)效果2   [  [2, 4, 6], [12, 15, 18], [28, 32, 36]   ]
# 遍歷出三個空的列表
lst = [ [] for i in range(3)]
print(lst)
lst = [    [  M[i][j] * N[i][j] for j in range(3)  ]    for i in range(3)]
print(lst)
"""
[  M[i][j] * N[i][j] for j in range(3)  ] 
[ [2, 4, 6]  [12, 15, 18]  [28, 32, 36] ]
"""

3. 集合_字典推導式

# ### 集合推導式
"""
案例:
	滿足年齡在18到21,存款大于等于5000 小于等于5500的人,
	開卡格式為:尊貴VIP卡老x(姓氏),否則開卡格式為:摳腳大漢卡老x(姓氏)	
	把開卡的種類統(tǒng)計出來
"""
lst = [
    {"name":"趙沈陽","age":18,"money":3000},
    {"name":"趙萬里","age":19,"money":5200},
    {"name":"趙蜂擁","age":20,"money":100000},
    {"name":"趙世超","age":21,"money":1000},
    {"name":"王志國","age":18,"money":5500},
    {"name":"王永飛","age":99,"money":5500}
]
setvar = set()
for i in lst:
    print(i) # {'name': '趙沈陽', 'age': 18, 'money': 3000}
    if 18 <= i["age"] <= 21 and 5000 <= i["money"] <= 5500:
        res = "尊貴VIP卡老{}".format(i["name"][0])
    else:
        res = "摳腳大漢卡老{}".format(i["name"][0])
    # 添加到集合中
    setvar.add(res)
print(setvar)
# { 三元運算符 + 推導式 }
#                                                                                                                                     三運運算符 + 推導式
setvar = { "尊貴VIP卡老{}".format(i["name"][0]) if 18 <= i["age"] <= 21 and 5000 <= i["money"] <= 5500 else "摳腳大漢卡老{}".format(i["name"][0]) for i in lst }
print(setvar)
# ### 字典推導式
### 一.enumerate
"""
enumerate(iterable,[start=0])
功能:枚舉 ; 將索引號和iterable中的值,一個一個拿出來配對組成元組,通過迭代器返回
參數(shù):
    iterable: 可迭代性數(shù)據(jù) (常用:迭代器,容器類型數(shù)據(jù),可迭代對象range) 
    start:  可以選擇開始的索引號(默認從0開始索引)
返回值:迭代器
"""
# 基本語法
from collections import Iterator,Iterable
lst =["王文","呂洞賓","何仙姑","鐵拐李","張國老","曹國舅","藍采和","韓湘子"]
it = enumerate(lst)
it = enumerate(lst,start=100)
print(isinstance(it,Iterator))
# next 
print( next(it) )
# for + next (推薦,數(shù)據(jù)較大時使用)
for i in range(3):
    print(next(it))
# for
for i in it:
    print(i)
# list 強轉迭代器
print(list(it))
# (1) 字典推導式 配合 enumerate 來實現(xiàn)
dic = {k:v for k,v in enumerate(lst,start=100)}
print(dic)
"""
(100, '王文')
(101, '呂洞賓')
(102, '何仙姑')
(103, '鐵拐李')
(104, '張國老')
(105, '曹國舅')
(106, '藍采和')
(107, '韓湘子')
"""
# (2) 使用dict強轉迭代器,瞬間得到字典
dic = dict( enumerate(lst,start=100) )
print(dic)
### 二.zip
"""
特點:按照索引配對
zip(iterable, ... ...)
    功能: 將多個iterable中的值,一個一個拿出來配對組成元組,通過迭代器返回
    iterable: 可迭代性數(shù)據(jù) (常用:迭代器,容器類型數(shù)據(jù),可迭代對象range) 
返回: 迭代器
"""
# 基本語法
# lst1 = ["孫開啟","王永飛","于朝志"]
# lst2 = ["薛宇健","韓瑞曉","上朝氣"]
# lst3 = ["劉文博","歷史園","張光旭"]
# 在索引下標同時存在時,才會進行配對,否則舍棄.
lst1 = ["孫開啟","王永飛","于朝志"]
lst2 = ["薛宇健","韓瑞曉"]
lst3 = ["劉文博"]
it = zip(lst1,lst2,lst3)
print(list(it))
# (1) 字典推導式 配合 zip 來實現(xiàn)
lst_key = ["ww","axd","yyt"]
lst_val = ["王維","安曉東","楊元濤"]
# ('ww', '王維'), ('axd', '安曉東'), ('yyt', '楊元濤')
dic = {k:v   for k,v in zip(lst_key , lst_val) }
print(dic)
# (2) 使用dict強轉迭代器,瞬間得到字典
dic = dict( zip(lst_key , lst_val) )
print(dic)

4. 生成器

4.1 生成器表達式

# ### 生成器
"""
#生成器本質是迭代器,允許自定義邏輯的迭代器
#迭代器和生成器區(qū)別:
	迭代器本身是系統(tǒng)內置的.重寫不了.
    而生成器是用戶自定義的,可以重寫迭代邏輯
#生成器可以用兩種方式創(chuàng)建:
    (1)生成器表達式  (里面是推導式,外面用圓括號)
    (2)生成器函數(shù)    (用def定義,里面含有yield)
"""
# (1) 生成器表達式 (里面是推導式,外面用圓括號)
gen = ( i for i in range(10) )
print(gen)
# 判斷類型
from collections import Iterator,Iterable
print(isinstance(gen,Iterator))
# 1.next 調用生成器
print(next(gen))
print(next(gen))
# 2.for + next 調用生成器
for i in range(3):
    print(next(gen))
# 3.for 調用生成器所有數(shù)據(jù)
for i in gen:
    print(i)
# 4.list強轉生成器,瞬間得到所有數(shù)據(jù)
gen = ( i for i in range(10) )
print(list(gen))
# print(next(gen)) error  # StopIteration

4.2 生成器函數(shù)

# ### 生成器函數(shù)
"""
# yield 類似于 return
共同點在于:執(zhí)行到這句話都會把值返回出去
不同點在于:yield每次返回時,會記住上次離開時執(zhí)行的位置 , 下次在調用生成器 , 會從上次執(zhí)行的位置往下走
		   而return直接終止函數(shù),每次重頭調用.
yield 6 和 yield(6) 2種寫法都可以 yield 6 更像 return 6 的寫法 推薦使用
"""
# (1) 基本語法
def mygen():
    print("111")
    yield 1
    print("222")
    yield 2
    print("333")
    yield 3
# 初始化生成器函數(shù)  => 返回生成器對象 => 簡稱生成器
gen = mygen()
# 第一次調用
res = next(gen)
print(res)
# 第二次調用
res = next(gen)
print(res)
# 第三次調用
res = next(gen)
print(res)
# 第四次調用
"""
StopIteration error 
res = next(gen)
print(res)
"""
"""
# 第一次調用
print("111")  yield 1 保存當前第13行代碼的狀態(tài),把1返回,并且等待下一次調用
# 第二次調用
從上一次保存的位置13行往下走, print("222") yield 2 保存當前第16行代碼的狀態(tài),把2返回,并且等待下一次調用
# 第三次調用
從上一次保存的位置16行往下走, print("333") yield 3 保存當前第19行代碼的狀態(tài),把3返回,并且等待下一次調用
# 第四次調用
因為沒有更多的yield 返回數(shù)據(jù),所有停止迭代.出現(xiàn)報錯異常.
"""
# (2) 優(yōu)化生成器代碼
"""生成器應用的場景是在大數(shù)據(jù)的范圍中使用,切記不可直接用for遍歷所有,可能無法短時間內獲取所有數(shù)據(jù)"""
def mygen():
    for i in range(1,101):
        yield i
# 初始化生成器函數(shù) => 生成器
gen = mygen()
print("<=====>")
for i in range(30):
    num = next(gen)
    print("我的球衣號碼是{}".format(num))
print("<=====>")
for i in range(40):
    num = next(gen)
    print("我的球衣號碼是{}".format(num))

# (3) send的使用方式 (給上一個yield發(fā)送數(shù)據(jù))
"""
# next和send區(qū)別:
	next 只能取值
	send 不但能取值,還能發(fā)送值
# send注意點:
	第一個 send 不能給 yield 傳值 默認只能寫None
	最后一個yield 接受不到send的發(fā)送值
"""
def mygen():
    print("start")
    res = yield "內部1"
    print(res,"<==內部==>")
    res = yield "內部2"
    print(res,"<==內部==>")
    res = yield "內部3"
    print(res,"<==內部==>")
    print("end")
# 初始化生成器函數(shù) => 生成器
gen = mygen()
# 第一次調用生成器
"""
第一次調用生成器時,因為沒有遇到y(tǒng)ield保存的代碼位置,
無法發(fā)送數(shù)據(jù),默認第一次只能發(fā)送None
"""
res = gen.send(None)
print(res,"<==外部==>")
# 第二次調用生成器
res = gen.send("100")
print(res,"<==外部==>")
# 第三次調用生成器
res = gen.send("200")
print(res,"<==外部==>")
# 第四次調用生成器
"""
error
res = gen.send("300")
print(res,"<==外部==>")
"""
"""
使用send調用生成器,第一次發(fā)送時必須是None,因為還沒有遇到y(tǒng)ield保存的代碼位置
res = gen.send(None)  走到mygen生成器函數(shù)中
print("start") 
res = yield "內部1"  執(zhí)行第80行 ,保存退出,記錄當前代碼位置,將 "內部1" 返回
在98行接受數(shù)據(jù)  res = "內部1"  print(內部1,"<==外部==>")
第二次調用生成器
res = gen.send("100") 把100這個數(shù)據(jù)發(fā)送給上一次代碼保存的位置80行進行接受. => 導致 80行 res = 100
打印81行  print(100 ,"<==內部==>")
執(zhí)行83行  res = yield "內部2"  保存退出,記錄當前代碼位置,將 "內部2" 返回
執(zhí)行102行 res = gen.send("100") => "內部2" print("內部2","<==外部==>")
....
依次類推 ... 
到第四次調用時, 因為沒有更多的yield 返回數(shù)據(jù),gen.send(300)無法接受到返回值,所以出現(xiàn)停止迭代 StopIteration的報錯,程序終止;
"""
# (4) yield from 的使用
"""將一個可迭代對象變成一個迭代器返回	"""
def mygen():
    lst = ["張磊","李亞峰","劉一峰","王同培"]
    yield from lst
# 初始化生成器函數(shù)
gen = mygen()
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
# print(next(gen)) # StopIteration
# (5) 斐波那契數(shù)列
"""使用生成器分段獲取所有內容,而不是一股腦的把所有數(shù)據(jù)全部打印"""
"""1 1 2 3 5 8 13 21 34 .... """
def mygen(maxval):
    a,b = 0,1
    i = 0
    while i < maxval:
        # print(b) 
        yield b
        a,b = b,a+b
        i += 1
# mygen(10)
gen = mygen(10)
# 第一次獲取
for i in range(3):
    print(next(gen))
# 第二次獲取
for i in range(5):
    print(next(gen))


5. 小練習

# 1.用推導式寫如下程序
# (1)構建如下列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
lst = [i * 2 for i in range(10)]
lst = [i for i in range(0,19,2) ]
print(lst)
# (2)lst = ['alex', 'WuSir', '老男孩', '神秘男孩'] 將lst構建如下列表:['alex0', 'WuSir1', '老男孩2', '神秘男孩3']
lst = ['alex', 'WuSir', '老男孩', '神秘男孩'] 
# 方法一
# lst = [i + str(lst.index(i)) for i in lst]
# 方法二
lst = [lst[i] + str(i) for i in range(len(lst)) ]
print(lst)
# (3)構建如下列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
lst = [ (j,i) for j in range(0,6) for i in range(1,7) if i-j == 1]
print(lst)
lst = [(i,i+1) for i in range(6)]
print(lst)
# (4)求出50以內能被3整除的數(shù)的平方,并放入到一個列表中。
lst = [i ** 2 for i in range(51) if i % 3 == 0]
print(lst)
# (5)M = [[1,2,3],[4,5,6],[7,8,9]], 把M中3,6,9組成新列表
M = [[1,2,3],[4,5,6],[7,8,9]]
lst = [ i[-1] for i in M  ]
print(lst)

# (6)構建如下列表:['python1期', 'python2期', 'python3期', 'python4期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']
lst = [ "python{}期".format(i) for i in range(1,11) if i != 5 ]
print(lst)
# (7)過濾掉長度小于3的字符串列表 , 并轉換成大寫字母
lst = ["sdfsdfsdfsdf","234","你說的符號是","a","ab"]
lst = [ i.upper() for i in lst if len(i) >=3 ]
print(lst)
# (8)除了大小王,里面有52項,每一項是一個元組,請返回如下?lián)淇伺屏斜韀('紅心','2'),('草花','J'), …('黑桃','A')] 
lst1 = ["紅心","草花","黑桃","方片"]
lst2 = ["A","2","3","4","5","6","7","8","9","10","J","Q","K"]
lst = [(i,j) for i in lst1 for j in lst2]
print(lst)
# 2.用推導式寫如下程序
lst1 = {
		'name':'alex',
		'Values':[
			{'timestamp': 1517991992.94,'values':100,},			 
			{'timestamp': 1517992000.94,'values': 200,},			
			{'timestamp': 1517992014.94,'values': 300,},			 
			{'timestamp': 1517992744.94,'values': 350},			 
			{'timestamp': 1517992800.94,'values': 280}			 
		]
	}
# 將lst1 轉化成如下 lst2:
lst2 = [
	[1517991992.94, 100], 
	[1517992000.94, 200], 
	[1517992014.94, 300], 
	[1517992744.94, 350], 
	[1517992800.94, 280]
]
# 方法一
lst2 = [ [i["timestamp"] , i["values"]] for i in lst1["Values"] ]
print(lst2)
# 方法二
lst2 = [ list(i.values()) for i in lst1["Values"]]
print(lst2)

# 3.讀取一個文件所有內容,通過生成器調用一次獲取一行數(shù)據(jù).
def mygen(filename):
	with open(filename,mode="r+",encoding="utf-8") as fp:
		for i in fp:
			yield i 
gen = mygen("ceshi111.txt")
for i in range(3):
	print(next(gen))
for i in range(6):
	print(next(gen))
# 4.將普通求和函數(shù)改寫成yield寫法
print("<====>")
def add(a,b):
	yield a + b
mygen  = add(34,5)
for i in mygen:
	print(i)
	

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!

相關文章

  • keras中的History對象用法

    keras中的History對象用法

    這篇文章主要介紹了keras中的History對象用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python struct.unpack

    Python struct.unpack

    Python中按一定的格式取出某字符串中的子字符串,使用struck.unpack是非常高效的。
    2008-09-09
  • Python環(huán)境搭建過程從安裝到Hello World

    Python環(huán)境搭建過程從安裝到Hello World

    這篇文章主要介紹了Python環(huán)境搭建過程從安裝到Hello World,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • 如何通過命令行進入python

    如何通過命令行進入python

    在本篇文章中小編給各位分享的是一篇關于命令行進入python的方法,有需要的朋友們學習一下。
    2020-07-07
  • django admin 自定義替換change頁面模板的方法

    django admin 自定義替換change頁面模板的方法

    今天小編就為大家分享一篇django admin 自定義替換change頁面模板的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python的time模塊中的常用方法整理

    Python的time模塊中的常用方法整理

    這篇文章主要介紹了Python的time模塊中的常用方法整理,time模塊是專門用于處理日期時間的模塊,需要的朋友可以參考下
    2015-06-06
  • python登錄豆瓣并發(fā)帖的方法

    python登錄豆瓣并發(fā)帖的方法

    這篇文章主要介紹了python登錄豆瓣并發(fā)帖的方法,涉及URL模擬登陸及cookie的相關使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • python把ipynb文件轉換成pdf文件過程詳解

    python把ipynb文件轉換成pdf文件過程詳解

    這篇文章主要介紹了用python把ipynb文件轉換成pdf文件過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • 零基礎寫python爬蟲之打包生成exe文件

    零基礎寫python爬蟲之打包生成exe文件

    本文介紹了通過pyinstaller和pywin32兩個插件在windows環(huán)境下,將py文件打包成exe文件,有需要的朋友可以參考下
    2014-11-11
  • 玩數(shù)據(jù)必備Python庫之numpy使用詳解

    玩數(shù)據(jù)必備Python庫之numpy使用詳解

    NumPy提供了許多高級的數(shù)值編程工具,如矩陣數(shù)據(jù)類型、矢量處理,以及精密的運算庫,下面這篇文章主要給大家介紹了關于玩數(shù)據(jù)必備Python庫之numpy使用的相關資料,需要的朋友可以參考下
    2022-02-02

最新評論

淄博市| 高碑店市| 满城县| 即墨市| 大新县| 平顶山市| 金秀| 稻城县| 阿克陶县| 敦煌市| 宜章县| 沁阳市| 改则县| 余姚市| 娄烦县| 东乡县| 广南县| 衢州市| 弥渡县| 洛南县| 香港 | 山东| 南丰县| 茌平县| 武冈市| 遂宁市| 博兴县| 都兰县| 阆中市| 营口市| 裕民县| 即墨市| 满城县| 临海市| 香港 | 石阡县| 霍林郭勒市| 西畴县| 龙江县| 永新县| 昭苏县|