十七.生成器,面向过程的编程思想,三元表达式,生成式,内置函数

一.生成器

生成器就是一种自定义的迭代器,是用来返回多次值
自定义迭代器的好处:节省内存

如何得到生成器(自定义的迭代器):

函数内但凡存在yield关键字,调用函数不会执行函数体代码,会得到一个返回值,该返回值就是我们自定义的生成器

return 只能返回一次值,函数就立即结束了
yield

1.可以挂起函数,保存函数的运行状态
2.可以用来返回多次值
def func():
	print('1111111')#触发函数执行直到遇到yield则停止,将yield后的值返回,并在当前位置挂起函数
	yield 1,2
	print('2222222')# 再次调用next(g),函数从上次暂停的位置继续执行,直到重新遇到yield...
	yield
	print('33333333') # ...
	yield 3
	print('44444444') # 触发函数执行没有遇到yield则无值返回,即取值完毕抛出异常结束迭代

#函数内但凡存在yield关键字,调用函数不会执行函数体代码,会得到一个返回值
# 该返回值就是我们自定义的生成器
g = func()
# print(g)  #打印的是函数func的内存地址
# g.__iter__() # 调用g的iter方法
# g.__next__()

res1 = next(g)
print(res1)

res2 = next(g)
print(res2)

res3 = next(g)
print(res3)

# next(g)  报错 StopIteration

自定义一个range

def my_range(start,stop,step=1):
	while start < stop:
		yield start
		start += step
g = my_range(1,5)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
# print(next(g))  #==>报错,值已经取完了


for i in my_range(1,500):
	print(i)

二.面向过程的编程思想

编程思想就是编写程序的套路,与具体的技术点无关

面向过程:

核心是过程2字,过程就是解决问题的步骤,即先干啥,再干啥,后干啥
基于面向过程编程就好比在设计一条条的流水线

优点:将复杂的问题流程化,进而简单化
缺点:所有环境耦合到一起,环环相扣,如果要修改某个环境,有可能会牵一发而动全身,
扩展性差

应用场景:

面向过程的程序设计一般用于那些功能一旦实现之后就很少需要改变的场景,

写一些简单的脚本,去做一些一次性任务,就可以用面向过程去实现

三.三元表达式(简化代码)

语法:

res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值
def max2(x,y):
	if x > y:
		return x
	else:
		return y
res = max(1,2)

x = 1
y = 2
res = x if x > y else y
print(res)

四.生成式

1.列表生成式

l = []
for i in range(11):
	if i > 3:
		l.append("x")
# 列表生成式
l = [i for i in range(11) if i > 3]
print(l)

示范1:

names = ['lily_s','mary_s','jack_s','coco_d']

l = []
for name in names:
	if name.endswith('s'):
		l.append(name)

l = [name for name in names if name.endswith('s')]
print(l)

示范2:

names = ['lisi','jack','rose']
print([name + 's' for name in names])

2.字典生成式

dic = {'name':'egon','age':18,'gender':'male','level':10}
new_dic = {k.upper():v for k,v in dic.items() if k != 'level'}
new_dic = {k+'_':str(v) for k,v in dic.items() if k != 'level'}
print(new_dic)

3.集合生成式

s = {i for i in 'hello' if i != 'l'}
print(s)

4.生成器表达式

res = (i for i in range(5))
print(res)  # <generator object <genexpr> at 0x00000223D2E96F20>
# 元组没有生成式,元组相当于不可变的列表,已有列表生成式,所以没有元组生成式
# 此时res内部是没有值的,需要用next调用
print(next(res))
print(next(res))
print(next(res))
print(next(res))
print(next(res))
# print(next(res))   # 报错

五.内置函数

1.abs():求绝对值

print(abs(-1))  # 1
print(abs(1))   # 1

2.all():判断传入的可迭代对象

1.传入的可迭代对象取出的值,全真则真,一假则假
2.如果传入的可迭代对象取不出任何值,默认返回None
print(all([1,2,3,True,'abc']))    #True
print(all([1,'',1,True,'abc']))   #False
print(all([]))   #True

3.any():判断传入的可迭代对象

1.传入的可迭代对象取出的值,一真则真,全假才假
2.如果传入的可迭代对象取不出任何值,默认返回False
print(any([0,None,False,'',1]))  #True
print(any([])) # False

4.callable():用于检查一个对象是否是可调用的

可调用返回 True,否则返回 False

def func():
	pass
print(callable(func))   # True
print(callable(len))    # True
print(callable(10))     # False

5.bin与oct,hex:

bin():返回括号内数字的二进制表示
oct():返回括号内数字的八进制表示
hex():返回括号内数字的十六进制表示

扫描二维码关注公众号,回复: 11514292 查看本文章
print(bin(11))  # 0b1011
print(oct(11))  # 0o13
print(hex(11))  # 0xb

6.chr与ord:

chr:返回括号内数字对应的字母(依据ASCII表)
ord:返回括号内字母对应的数字(依据ASCII表)

print(ord('a'))   # 97
print(chr(97))    # a

7.divmod():取括号内2个数的商,以及余数

返回值:元组(商,余数) 相当于做了地板除以及取余

print(divmod(10,3))  # (3,1)

8.enumerate():

将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中

l = [111,222,333]
for i,item in enumerate(l):
	print(i,item)
# 输出结果为:
# 0 111
# 1 222
# 2 333

# 字典是无序的,所以给出的不算是索引,字典没有索引
for i,item in enumerate({'k1':111,'k2':222}):
	print(i,item)
# 输出结果为:
# 0 k1
# 1 k2

猜你喜欢

转载自blog.csdn.net/yikenaoguazi/article/details/106922111