Day24 列表和生成器表示式

2021-07-31 08:06:36 字數 2611 閱讀 7675

1 協程函式的應用

寫乙個裝飾器用於讓協程函式不需要輸入再執行一次next()函式

分析: 在裝飾器中生成該協程函式的生成器, 並且執行一次next()函式

具體描述如下

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

__author__ = 'weihuchao'

def firstnext(func):

g = func(*args, **kwargs)

next(g)

return g

@firstnext

def eater(name):

print("{} start to eat".format(name))

food_list =

while true:

food = yield food_list

print("{} eat {}".format(name, food))

g = eater("egon")

print(g.send("包子"))

print(g.send("炸醬麵"))

實現 grep -rl 'python' c:/test 的功能

乙個函式實現

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

__author__ = 'weihuchao'

import os

def search(dir_name, partten):

g = os.walk(dir_name)

res =

for i in g:

for j in i[-1]:

file_path = i[0] + "\\" +j

with open(file_path) as f:

for line in f:

if partten in line:

res.add(file_path)

for line in res:

if line:

print(line)

search("c:\\test", "python")

利用生成器來處理

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

__author__ = 'weihuchao'

import os

def firstnext(func):

g = func(*args, **kwargs)

next(g)

return g

@firstnext

def search(target):

while true:

dir_name = yield

g = os.walk(dir_name)

for i in g:

for j in i[-1]:

file_path = i[0] + "\\" +j

target.send(file_path)

@firstnext

def opener(target):

while true:

file_path = yield

with open(file_path) as f:

target.send((file_path, f))

@firstnext

def cat(target):

while true:

file_path, f = yield

for line in f:

target.send((file_path, line))

@firstnext

def grep(partten, target):

while true:

file_path, line = yield

if partten in line:

target.send(file_path)

@firstnext

def printer():

while true:

file_path = yield

print(file_path)

g = search(opener(cat(grep("python",printer()))))

g.send("c:\\test")

列表生成式的具體形式

列表 = [處理變數形成列表元素 for迴圈 if判斷 for迴圈2]

等同於

for迴圈

if判斷

for迴圈

元素=表示式

生成器表示式是 列表生成式的中括號程式設計圓括號

其中獲得的是乙個生成器

可以通過 list(獲得的生成器) 來快速生成乙個列表

宣告式程式設計主要是注重於定義, 不具體去了解實現

python中有很多封裝好的方法, 如reduce和map等

2 2 列表推導和生成器表示式

標準的列表推導寫法 symbols codes ord symbol for symbol in symbols codes 36,162,163,165,8364,164 通常的原則是,只用列表推導來建立新的列表,並且盡量保持簡短。如果列表推導的 超過了兩行,你可能就要考慮是不是得用 for 迴圈...

列表生成式和生成器表示式

列表生成式和生成器表示式,體現了宣告式程式設計的思想,把一大堆 變成宣告式的方式 list,for,sum等都是把可迭代物件變為迭代器然後依次next 取值,還會處理異常 一 列表生成式 列表生成式即list comprehensions,是python內建的非常簡單卻強大的可以用來建立list的生...

列表生成式和生成器表示式

egg list for i in range 100 print egg list l egg s i for i in range 100 if i 50 print l 三元表示式 name alex name linhaifeng res sb if name alex else shuai...