1.yield的表达式:x=yield 值
1.yield的表达式形式
def dog(name):
print('道哥%s准备吃东西啦。'%name)
while True:
#如果有send操作,x拿到的是yield从send接收到的值
x=yield None
print('道哥%s吃了%s。' % (name,x))
g=dog('bob')
g.send(None)#等同于next(g)
g.send('一根骨头')
g.send('一块肉')
g.send('一根鸡腿')
# 道哥bob准备吃东西啦。
# 道哥bob吃了一根骨头。
# 道哥bob吃了一块肉。
# 道哥bob吃了一根鸡腿。
g.close()
g.send('包装盒')#StopIteration 报错,关掉以后就无法传值了
2.yield的表达式
def dog(name):
food_list=[]
print('道哥%s准备吃东西啦。'%name)
while True:
#如果有send操作,x拿到的是yield从send接收到的值
x=yield food_list
print('道哥%s吃了%s。' % (name,x))
food_list.append(x)
g=dog('bob')
res=g.send(None)#等同于next(g)
print(res)#[]
res=g.send('肉包子')
print(res)#['肉包子']
res=g.send('一根骨头')
print(res)#['肉包子', '一根骨头']
2.三元表达式
#针对以下需求,用一行代码代替
def func(x,y):
if x>y:
return x
else:
return y
res=func(1,2)
print(res)#2
语法格式:条件成立时要返回的值 if条件 else 条件不成立的值
res='a' if True else 'b'
print(res)#a
x=1
y=2
res=x if x>y else y
print(res)#2
3.生成式(一目了然的简洁写法操作可迭代类型)
1.列表生成式
#需求:将老列表导入新列表,一句话实现以下代码等同效果
l=['bob','pop','lala','haha']
new_l=[]
for name in l:
new_l.append(name)
print(new_l)#['bob', 'pop', 'lala', 'haha']
#用列表生成式写
l=['bob','pop','lala','haha']
new_l=[i for i in l]
print(new_l)#['bob', 'pop', 'lala', 'haha']
#扩展1:将所有元素都变成大写
new_l=[i.upper() for i in l]
print(new_l)#['BOB', 'POP', 'LALA', 'HAHA']
2.字典生成式
keys=['name','age','gender']
dic={key:None for key in keys}
print(dic)#{'name': None, 'age': None, 'gender': None}
items=[('name','bob'),('age','18'),('gender','male')]
res={k:v for k,v in items}
print(res)#{'name': 'bob', 'age': '18', 'gender': 'male'}
#需求:将('gender','male')剔除
res={k:v for k,v in items if k!='gender'}
print(res)#{'name': 'bob', 'age': '18'}
3.集合生成式
keys = ['name', 'age', 'gender']
set1 = {key for key in keys}
print(set1) # {'gender', 'age', 'name'}
4.生成器表达式
g = (i for i in range(10) if i > 3)
#强调,此刻g内部一个值也没有
print(next(g))
print(next(g))
print(next(g))
# 4
# 5
# 6
5.统计文件有多少字符
with open(r'笔记.txt',mode='r',encoding='utf-8') as f:
#方式一:
# res=0
# for line in f:
# res+=len(line)
# print(res)
#方式二:行数太多容易占内存
# res=sum([len(line) for line in f])
# print(res)
#方式三:效率最高
#res=sum((len(line) for line in f))
#简写
res = sum(len(line) for line in f)
print(res)
4.函数递归
1.函数递归的定义
是函数的嵌套调用的一种特殊形式,具体是指,在调用一个函数的过程中又直接或间接的调用到本身
#直接调用本身
def f1():
print('直接调用本身')
f1()
f1()
#间接调用本身
def f1():
print('间接调用本身')
f2()
def f2():
print('间接调用本身')
f1()
f1()
2.需要强调的一点:
递归是一种循环,不应该无限递归下去,必须在满足某种条件下结束递归
def f1(n):
print(n)
n+=1
if n==10:
return
f1(n)
f1(1)
3.递归的两个阶段
回溯:一层一层的调用下去
递归:满足某种结束条件,结束递归调用,然后一层一层返回
4.递归的应用案例:将套层中的元素取出来,并打印
l = [1, 2, [3, 4],[5,[6,7]]]
def f1(list1):
for x in list1:
if type(x) is list:
# 如果是列表,应该再循环
f1(x)
else:
print(x)
f1(l)
# 1
# 2
# 3
# 4
# 5
# 6
# 7