19.yield的表达式+三元表达式+生成式+函数递归

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值