补充:

在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作
func_dic={}
def make_dic(key):
def deco(func):
func_dic[key] = func
def wrapper(*args, **kwargs):
res = func(*args, **kwargs)
return res
return wrapper
return deco @make_dic('index') # @deco #f1=deco(f1)
def f1():
print('from f1') @make_dic('home')
def f2():
print('from f2') @make_dic('auth')
def f3():
print('from f3') print(func_dic)
while True:
cmd = input('>>: ').strip()
if cmd in func_dic:
func_dic[cmd]()
结果:
>>: index
from f1
>>: home
from f2
>>: auth
from f3

列表解析

先来两个栗子:

s = 'hello'

l = []
for i in s:
res = i.upper()
l.append(res) print(l)
结果:
['H', 'E', 'L', 'L', 'O']
l = [, , , ]
l_new = []
for i in l:
res = i**
l_new.append(res)
print(l_new)
结果:
[, , , ]

接下来就是我们的列表解析:

s = 'hello'
res = [i.upper() for i in s]
print(res)
结果:
['H', 'E', 'L', 'L', 'O']
l = [, , , , , ]
res = [i for i in l if i > ]
print(res)
结果:
[, , ]

列表解析的形式:

for i in obj1:
if 条件1:
for i in obj2:
if 条件2:
for i in obj3:
if 条件3:
...

生成器表达式

g = (i for i in range())

print(g)
print(next(g)) #next(g) == g.__next__()
print(next(g)) #next(g) == g.__next__()
print(next(g)) #next(g) == g.__next__()
print(next(g)) #next(g) == g.__next__()
print(next(g)) #next(g) == g.__next__()
结果:
<generator object <genexpr> at 0x0000000002734990>

注意:和[i for i in range(1000000000000000000000000000000000000000000)]的区别,有兴趣可以尝试运行此命令。。

len('hello') #'hello'.__len__()

print(len('hello'))
print('hello'.__len__())
结果:

注意:

相似的原理:iter(g)     #g.__iter__()

三元表达式

x =
y = if x > y:
print(x)
else:
print(y) res = 'aaaaa' if x > y else 'bbbbbbb' print(res)
结果: bbbbbbb
def max2(x, y):
# if x > y:
# return x
# else:
# return y return x if x > y else y print(max2(, ))
结果:

生成器函数

函数体内包含有yield关键字,该函数执行的结果是生成器

def foo():
print('first------>')
yield
print('second----->')
yield
print('third----->')
yield
print('fourth----->') g = foo()
print(g) from collections import Iterator
print(isinstance(g, Iterator))
结果:
<generator object foo at 0x0000000001E14990>
True

所以我们得到的结果:生成器就是迭代器

def foo():
print('first------>')
yield
print('second----->')
yield
print('third----->')
yield
print('fourth----->') g = foo() print(g.__next__())
print(g.__next__())
print(g.__next__())
# print(g.__next__()) #StopInteration
结果:
first------> second-----> third----->
def foo():
print('first------>')
yield
print('second----->')
yield
print('third----->')
yield
print('fourth----->') g = foo() for i in g: #obj=g.__iter__() #obj.__next__()
print(i)
结果:
first------> second-----> third-----> fourth----->

上两例对比,我们可以看到for 自动捕捉到了StopInteration

总结:

'''
yield的功能:
    1.与return类似,都可以返回值,但不一样的地方在于yield返回多次值,而return只能返回一次值
    2.为函数封装好了__iter__和__next__方法,把函数的执行结果做成了迭代器
    3.遵循迭代器的取值方式obj.__next__(),触发的函数的执行,函数暂停与再继续的状态都是由yield保存的
'''

def countdown(n):
print('starting countdown') while n > :
yield n
n -=
print('stop countdown')
g = countdown()
print(g)
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
# print(g.__next__()) #StopInteration
结果:
<generator object countdown at 0x0000000001DF4990>
starting countdown

同样地,用for可以捕捉StopInteration。

def countdown(n):
print('starting countdown') while n > :
yield n
n -=
print('stop countdown')
g = countdown()
print(g) for i in g:
print(i)
结果:
<generator object countdown at 0x0000000002144990>
starting countdown stop countdown

应用:tail -f a.txt

import time
def tail(filepath, encoding='utf-8'):
with open(filepath, encoding=encoding) as f:
f.seek(, )
while True:
# f.seek(, ) #不行
line = f.readline()
if line:
# print(line,end='')
yield line
else:
time.sleep(0.5) g = tail('a.txt')
print(g)
print(g.__next__())
结果:
<generator object tail at 0x0000000001E04AF0>

或者可以应用for:

for i in g:
     print(i)

应用:tail -f a.txt | grep 'error'


import time
def tail(filepath, encoding='utf-8'):
with open(filepath, encoding=encoding) as f:
f.seek(, )
while True:
# f.seek(, ) #不行
line = f.readline()
if line:
# print(line,end='')
yield line
else:
time.sleep(0.5) def grep(lines, pattern):
for line in lines:
if pattern in line:
# print(line)
yield line
tail_g = tail('a.txt')
print(tail_g) grep_g = grep(tail_g, 'error') print(grep_g) print(grep_g.__next__())
结果:
<generator object tail at 0x0000000001E24A98>
<generator object grep at 0x0000000001E24AF0>
qweerror

或者可以应用for:

for i in grep_g:

print(i)

作业:
编写 tail -f a.txt |grep 'error' |grep ''命令,周一默写
文件a.txt内容
apple
tesla
mac
lenovo
chicken 要求使用列表解析,从文件a.txt中取出每一行,做成下述格式
[{‘name’:'apple','price':,'count':},{...},{...},...] 格式与2一样,但只保留价格大于1000的商品信息 周末大作业(见图):
只实现作业要求的查询功能
增加,删除,修改功能为选做题
答案:
# 编写 tail -f a.txt |grep 'error' |grep ''命令,周一默写 import time
file_path = r'C:\Users\Administrator\PycharmProjects\untitled\a.txt'
def tail(file_path):
with open(file_path, encoding='utf-8') as f:
f.seek(, )
while True:
line = f.readline()
if line:
yield line
else:
time.sleep(0.5) def grep(lines, pattern):
for line in lines:
if pattern in line:
yield line g1 = tail('a.txt')
g2 = grep(g1, 'error')
g3 = grep(g2, '')
for i in g3:
print(i) # 文件a.txt内容
# apple
# tesla
# mac
# lenovo
# chicken
#
# 要求使用列表解析,从文件a.txt中取出每一行,做成下述格式
# [{‘name’:'apple','price':,'count':},{...},{...},...]
#
# print([{'name': i.split()[], 'price': i.split()[], 'count': i.split()[]} for i in
# open('a.txt')])
print([{'name': i.strip().split()[], 'price': i.strip().split()[], 'count': i.strip().split()[]} for i in
open('a.txt')]) # 格式与2一样,但只保留价格大于1000的商品信息
#
print([{'name': i.strip().split()[], 'price': i.strip().split()[], 'count': i.strip().split()[]}for i in
open('a.txt') if i.strip().split()[] > '']) # 周末大作业(见图):
# 只实现作业要求的查询功能
# # 增加,删除,修改功能为选做题

python--生成器、三元表达式、列表解析、生成器表达式的更多相关文章

  1. python迭代器 生成器 三元运算 列表解析

    1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优 ...

  2. day13 生成器 三元运算 列表解析

    本质上来说生成器迭代器都是一种数据类型,如果你直接打印生成器是无法得出值的,会得到一串内存地址,即一个对象想要得到生成器的值必须要用for或者next,list等来获取 生成器生成器就是一个可迭代对象 ...

  3. Python基础:08列表解析与生成器表达式

    一:列表解析 列表解析(List comprehensions)来自函数式编程语言Haskell .它可以用来动态地创建列表.它在 Python 2.0 中被加入. 列表解析的语法:     [exp ...

  4. python利用or在列表解析中调用多个函数.py

    python利用or在列表解析中调用多个函数.py """ python利用or在列表解析中调用多个函数.py 2016年3月15日 05:08:42 codegay & ...

  5. Python之旅Day5 列表生成式 生成器 迭代器 装饰器

    装饰器 器即函数,装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 装饰器涉及的知识点= 高阶函数+函数嵌套+闭包 在遵循下面两个原则的前提下为被装饰者新功能 ...

  6. Python入门笔记(13):列表解析

    一.列表解析 列表解析来自函数式编程语言(haskell),语法如下: [expr for iter_var in iterable] [expr for iter_var in iterable i ...

  7. python学习-迭代器,列表解析和列表生成式

    迭代器为类序列对象提供了一个类序列的接口.Python 的迭代无缝的支持序列对象,而且还允许程序猿迭代非序列类型,包括用户定义的对象. 迭代器是一个next()方法的对象,而不是通过索引计数.当需要下 ...

  8. Python 进阶_迭代器 & 列表解析

    目录 目录 迭代器 iter 内建的迭代器生成函数 迭代器在 for 循环中 迭代器与字典 迭代器与文件 创建迭代器对象 创建迭代对象并实现委托迭代 迭代器的多次迭代 列表解析 列表解析的样例 列表解 ...

  9. Day 21 三元表达式、生成器函数、列表解析

    知识点程序: #! /usr/bin/env python # -*- coding: utf-8 -*- # __author__ = "DaChao" # Date: 2017 ...

  10. Python解包参数列表及 Lambda 表达式

    解包参数列表 当参数已经在python列表或元组中但需要为需要单独位置参数的函数调用解包时,会发生相反的情况.例如,内置的 range() 函数需要单独的 start 和 stop 参数.如果它们不能 ...

随机推荐

  1. SpringMvc返回JSON的工作原理。

    一:导入jar包.然后在springmvc.xml中配置上这么一句话 <!-- 能支持springmvc更高级的一些功能,JSR303校验,快捷的ajax,处理JSON数据.映射动态请求 --& ...

  2. 网络体系之TCP/IP模型

    TCP/IP参考模型是因特网使用的参考模型,这个体系结构在它的两个主要协议出现以后,被称为TCP/IP参考模型.该模型将网络协议分为四层:网络接口层.网络层.运输层.应用层. TCP/IP协议不是TC ...

  3. MacOS Catalina 导致bash命令失效的一些总结

    欢天喜地的升级了最新的OS后,第一个发现bash失效的是使用pod命令出现: -bash: pod: command not found 这个不会导致cocoapods无法正常使用,可以使用绝对路径里 ...

  4. xshell链接linux出现SSH服务器拒绝了密码 的解决方案

    参考文章:https://blog.csdn.net/weixin_38554662/article/details/80589852 但是需要注意的是,ssh_config文件本来是没有权限修改的, ...

  5. HDU 1709 The Balance( DP )

    The Balance Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. UVALive 4992 Jungle Outpost(半平面交判存)

    Jungle Outpost Time limit: 15.000 seconds Description There is a military base lost deep in the jung ...

  7. nowcoder A hard problem /// 数位DP

    题目大意: 称一个数x的各个数位之和为f(x) 求区间L R之间 有多少个数x%f(x)==0 #include <bits/stdc++.h> using namespace std; ...

  8. zoj 3777 Problem Arrangement(壮压+背包)

    Problem Arrangement Time Limit: 2 Seconds      Memory Limit: 65536 KB The 11th Zhejiang Provincial C ...

  9. Skimap_ros 利用RGBD创建Octomap(一)

    1. 奥比中光astra RGBD相机安装 1.1 安装依赖 $ sudo apt-get install build-essential freeglut3 freeglut3-dev 1.2 检查 ...

  10. go语言从例子开始之Example24.通道同步

    我们可以使用通道来同步 Go 协程间的执行状态.这里是一个使用阻塞的接受方式来等待一个 Go 协程的运行结束. Example: package main import "fmt" ...