Python 三目运算,列表解析,装饰器,迭代器和生成器


操作系统:Windows
Python:3.5
欢迎加入学习交流QQ群:657341423


三目运算

a=False
x=1+33  if a else 10-1
#a,b=1,10 if 10>1 else None
#多个变量赋值
print(x)

三目运算基本上都是用于if else方式,如果有elif的话,只能嵌套在else里面。
例如

a=3
x=1+33  if a==1 else (10 if a==2 else 20)
print(x)

运行结果:
这里写图片描述


列表解析
列表解析方法基本用于for循环出来每个元素之后,然后加入一个新的列表。

res=[i for i in range(1,100)]
print(res)

结果:
这里写图片描述

for i in range(1,100)是将i从1到100的,数据类型是int的。
如果变成[i for i in range(1,100)]就是将i加入到一个新的列表去。这就是列表解析。

这里可以加入判断条件

res=[i for i in range(1,100) if i > 50]
print(res)

运行结果
这里写图片描述


装饰器
装饰器分带参数和不带参数。
不带参数

def Mydecorate(func):
	def decorates(*args,**kwargs):
	#可将func带参数或不带参数
		if mybool:
			myfunc=func(*args,**kwargs)
			
		else:
			print("aa")
			myfunc='Fail'
		return myfunc
		#这个return可以去掉
	return decorates
	
mybool=False

@Mydecorate
def mydef(value):
	name='Evan'
	all=value+name
	print(all)

#mydef('my name is ','Evan')
mydef('my name is ')

看到定义的Mydecorate,首先是return自身里面的一个函数。再看里面自身的一个函数decorates,这里return的是需要装饰器的函数。也就是说代码中的运行mydef。装饰器中的func其实就是将函数mydef的名字传入,然后进行判断等,符合条件就将执行函数。
装饰器运行顺序
这里写图片描述

运行结果:
这里写图片描述

这里写图片描述

带参数

def Mydecoratearg(arg):
#带参数装饰器
	if arg:
		def Mydecorate(func):
			def decorates(*args,**kwargs):
				func(*args,**kwargs)
			return decorates
		return Mydecorate

@Mydecoratearg("aa")
def mydef(value):
	print("my name is "+value)
	
mydef('EvanGG')

运行顺序:
这里写图片描述

运行结果:
这里写图片描述


迭代器
迭代器的优点
迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合
总的来说,对于长度太大列表或者字典等来说,使用迭代器访问能节省内存。
比如,for i in list:会将list(列表)全部元素以内存载入方式实现循环,如果list元素太多,这样就很耗内存。运行速度太慢。
用法:

def mydef():
	print("aa")
class myclass():
	def __init__(self,star,end):
		self.star=star
		self.end=end
	def __iter__(self):#迭代器
		return self
	def __next__(self):#迭代器
		if self.star<self.end:
			self.star+=1
			mydef()#引入自定义函数
			return self.star
		else:
			raise StopIteration()
			
c=myclass(0,5)
for i in c:#迭代器的糖衣
	print(i)

运行结果:
这里写图片描述
这个用法是在自定义类中实现迭代器的。不过在实际开发中,如果每次都定义类的话,代码就会显得很长。
再看下面:

a=[x for x in range(3) if x<7]
b={"a":5,"b":6,"c":7}
ita=iter(a)#对列表进行迭代
#itb=iter(b)
#itb=iter(b.items())
itb=iter(b.values())#对字典进行迭代
while 1:
	try:
		var=next(ita)
		varb=next(itb)
		print(var)
		print(varb)
	except Exception as e:
		break

运行结果:
这里写图片描述


生成器
生成器的特点:
生成器是一个函数,而且函数的参数都会保留。
迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的
有利于节省内存空间

更多优点请点击

简单生成器

res=(i for i in range(1,100) if i > 50)
print(type(res))

运行结果:
这里写图片描述

带yield 语句的生成器
在网上找一个例子

def fib(max):
	a,b=1,1
	while a<max:
		yield a
		a,b=b,a+b

f=fib(10)	
print(next(f))
print(next(f))
print(next(f))

首先看到一个函数while的一个循环。yield是返回一个值,但会保留上一次函数里面参数的值。这是与普通函数区别。普通函数是不会保留函数内的参数值的。
可以看到print(next(f)),这和迭代器的next一样的用法。
迭代器和生成器在某个程度上是相似的。

更简单的解释:

def fib(a):
	b=1
	a=a+b
	yield a
	a=a+b
	yield a

f=fib(10)	
print(next(f))
print(next(f))
print(next(f))
# for i in fib(10):
	# print(i)

运行结果:
这里写图片描述

可看到,这有3个next,但是函数里面只有2个yield,所以到第三个next出现stop的错误。而上面输出11和12分别对于图上的yield。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xy-Huang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值