美文网首页
三元表达式 / 生成器

三元表达式 / 生成器

作者: 慕知 | 来源:发表于2021-08-18 18:25 被阅读0次

一,三元表达式

#语法:res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值
#示例1:
name=input('输入名字:')
res='beauty' if name =='zx' else 'ugly man'
print(res)
# 输入名字:zx
# beauty

#示例2:下列场景用三元表达式
def max2(x,y):
    if x > y:
        return x
    else:
        return y
m=max2(3,4)
print(m)
# 4

x=3
y=4
res=x if x > y else y
print(res)
# 4


示例


示例1:
# 算出文件最长的长度值(注意:换行符也算一个长度;print要在with open里面,不染会报错,因为文件已经关闭)
 with open('a.txt','r',encoding='utf-8') as f:
     g=(len(line) for line in f)
     #print(max(g))
     print(max(len(line) for line in f))




#示例2:
#1)求一共花了多少钱;
#2)打印出所有商品格式为[{'name':'xxx','price':333,'count':3},...]
#3)求大于10000商品的信息


#1)求一共花了多少钱
# with open('a.txt',encoding='utf-8') as f:
#     info=[line.split(',') for line in f]
#     cost=sum(float(unit_price)*int(count) for _,unit_price,count in info)
#     print(cost)
# 10090200.0   以上float也可以换成int,因为a.txt没有浮点数


#2)打印出所有商品格式
with open('a.txt',encoding='utf-8') as f:
    info=[{
        'name': line.split(',')[0],
        'price': float(line.split(',')[1]),
        'count': int(line.split(',')[2])
    } for line in f]
    print(info)
#[{'name': 'mac', 'price': 20000.0, 'count': 3}, {'name': 'lenovo', 'price': 3000.0, 'count': 10}, {'name': 'tesla', 'price': 1000000.0, 'count': 10}, {'name': 'chicken', 'price': 200.0, 'count': 1}]


#3)求大于10000商品的信息
with open('a.txt',encoding='utf-8') as f:
    info=[{
        'name': line.split(',')[0],
        'price': float(line.split(',')[1]),
        'count': int(line.split(',')[2]),
    } for line in f if float(line.split(',')[1]) > 10000]
    print(info)
#[{'name': 'mac', 'price': 20000.0, 'count': 3}, {'name': 'tesla', 'price': 1000000.0, 'count': 10}]







a.txt内容如下:

mac,20000,3
lenovo,3000,10
tesla,1000000,10
chicken,200,1

二,列表推导式:

# for循环取出egg0到egg4
l=[]
for i in range(0,5):
    res='egg'+str(i)
    l.append(res)
print(l)
# ['egg0', 'egg1', 'egg2', 'egg3', 'egg4']

egg=[]
for i in range(0,5):
    egg.append('egg'+str(i))
print(egg)
# ['egg0', 'egg1', 'egg2', 'egg3', 'egg4']




# 列表推导式:
l=['egg'+str(i) for i in range(0,5)]
print(l)
# ['egg0', 'egg1', 'egg2', 'egg3', 'egg4']


# 可以再加if判断(不建议加多个if,列表生成器求简洁)
l=['egg'+str(i) for i in range(0,5) if i >2]
print(l)
# ['egg3', 'egg4']

三, 生成器表达式

#列表推倒式
#l=['egg'+str(i) for i in range(0,5)]


#生成器表达式(只需要把推倒式的中括号,变为括号)
l=('egg'+str(i) for i in range(0,5))
print(l)
# <generator object <genexpr> at 0x104a0b9e0>

print(next(l))
# egg0

print(next(l))
# egg0
# egg1

print(next(l))
# egg0
# egg1
# egg2

示例

#示例1:名字全部变成大写
names=['aa','ba','ca','dd']
names=[name.upper() for name in names]
print(names)
# ['AA', 'BA', 'CA', 'DD']


names=['aa','ba','ca','dd']
l=[]
for name in names:
    name=name.upper()
    l.append(name)
print(l)
# ['AA', 'BA', 'CA', 'DD']



# 示例2:取出不以a为结尾的
she=[name for name in names if not name.endswith('a')]
print(she)
# ['dd']




示例3:把,名字不以a为结尾的忽略,并保存剩下名字的长度
names=['aa','ba','ca','dd']
names=[len(name) for name in names if not name.endswith('a')]
print(names)
# [2]


四,递归

#直接调用本身
def f1():
    print('from f1')
    f1()
f1()  #会无限循环并报错
# RecursionError: maximum recursion depth exceeded while calling a Python object
#原因:Python默认递归调用深度为1000(即最多递归调用1000次),而程序在运行过程中超过最大的递归深度

PS:
# 去设定该值,但仍受限于主机操作系统栈大小的限制
import sys
print(sys.getrecursionlimit())
# 1000 python默认递归1000层



# 自定义递归层数
sys.setrecursionlimit(10)

def f1(n):
    print('----->',n)
    f1(n+1)
f1(0)



# 间接调用本身
def f1():
    print('from f1')
    f2()

def f2():
    print('from f2')
    f1()
f1()
# 以上同样会报错







递归越多,占内存越大,python里没有递归优化
递归的使用:
1,必须有明确的结束条件
2,每进入一次递归,问题递归要比上一次少
3,递归效率不高







递归示例:

f=[1,[2,[3,[4,[5,]]]]]
def func(f):
    for i in f:
        if type(i) is list:
            func(i)
        else:
            print(i)
func(f)
# 1
# 2
# 3
# 4
# 5

items=[[1,2],3,[4,[5,[6,7]]]]
def foo(items):
    for i in items:
        if isinstance(i,list): #满足未遍历完items以及if判断成立的条件时,一直进行递归调用
            foo(i)
        else:
            print(i,end=' ')

foo(items)
# 1 2 3 4 5 6 7

五,二分法

#二分法

#示例:从小到大排列的数字,判断x是否在列表中
l=[1,2,10,31,200,301,311,1000] #从小到大排列的数字列表


# for循环效率会低(可能找到列表的最后一个才找到)
for i in l:
    if 301 == i:
        print('find it')
#find it



#递归方式
def search(l,num):
    print(l)
    if len(l) == 0:
        return
    mid_index=len(l) // 2    # 中间索引
    if num > l[mid_index]:     # 索引对应的值
        # 往右找
        search(l[mid_index+1:],num)
    elif num < l[mid_index]:
        search(l[0:mid_index],num)
    else:
        print('find it')

#search(l,301)   # 4次找到值
# [1, 2, 10, 31, 200, 301, 311, 1000]
# [301, 311, 1000]
# [301]
# find it

search(l,555)    #最后返回空列表
# [1, 2, 10, 31, 200, 301, 311, 1000]
# [301, 311, 1000]
# [1000]
# []


如果只想看结果,不看过程经过几次,去掉print(l),输出结果为find it或者空(啥也没)


六,匿名函数

# 函数
def func(x,y):
    return x+y
res=func(3,4)
print(res)
#7





#匿名函数
lambda x,y:x+y

print(lambda x,y:x+y)
# <function <lambda> at 0x10158b700>

# 匿名函数调用
print((lambda x,y:x+y)(3,4))
# 7

1)匿名函数应用

# 求出工资最多的人名
salaries={
    'lili':3000,
    'ping':4000,
    'zhang':7000,
    'mz':900000
}
# # 直接使用max会比较字典的key值(按照字母的顺序)
# print(max(salaries))
# # zhang


# 方式一:使用"拉链"zip,一一对应,颠倒key和value的值,比较value
g=zip(salaries.values(),salaries.keys())
print(g)
# <zip object at 0x102f7c040>


print(max(g))
# (900000, 'mz')


# 方式二:
def func(k):
   return salaries[k]

print(max(salaries,key=func))
#mz


# 方式三:
print(max(salaries,key=lambda k:salaries[k]))
# mz

print(min(salaries,key=lambda k:salaries[k]))






# 排序工资从最多到最少的人名
res=sorted(salaries,key=lambda k:salaries[k],reverse=True)
print(res)

2) 匿名函数应用

1, map(映射) 结合无名函数
# 对l的每个原色做平方处理
# map函数可以接收两个参数,一个是函数,另外一个是可迭代对象
l=[1,2,3,4,5]
res=map(lambda x:x**2,l)

# map依次迭代l,结果仍然是迭代器
print(res)
# <map object at 0x10047a3d0>

#使用list可以依次迭代res,取得的值作为列表元素
print(list(res))
# [1, 4, 9, 16, 25]




2, reduce(合并)结合无名函数(需要导入才能使用)
#reduce函数可以接收三个参数,一个是函数,第二个是可迭代对象,第三个是初始值

#没有初始值的情况下
l=[1,2,3,4,5]
from functools import reduce
res=reduce(lambda x,y:x+y,l)
print(res)
# 15



# 有初始值的情况下
l=[1,2,3,4,5]
from functools import reduce
res=reduce(lambda x,y:x+y,l,100)
print(res)
# 115


3, filter(过滤)结合无名函数
l=[1,2,3,4,5]

# filter函数得到的结果仍然是迭代器
res=filter(lambda x:x>3,l)
print(list(res))
# [4, 5]


# 整除,余数(分页)
print(divmod(10000,4))



# enumerate  取出列表的值和对应的索引
l=['a','b','v']
for i in l:
    print(l.index(i),i)
# 0 a
# 1 b
# 2 v


for iterm in enumerate(l):
    print(iterm)
# (0, 'a')
# (1, 'b')
# (2, 'v')


for a,b in enumerate(l):
    print(a,b)
# 0 a
# 1 b
# 2 v


# frozenset 不可变集合
s=frozenset({1,2,3})


# round 四舍五入
print(round(4.6))
# 5



#eval 取元素
res=eval('[1,2,3]')
print(res,type(res))
# [1, 2, 3] <class 'list'>




# set 可变集合
s=set({1,2,3})
s.add(4)
print(s)
# {1, 2, 3, 4}


相关文章

网友评论

      本文标题:三元表达式 / 生成器

      本文链接:https://www.haomeiwen.com/subject/mvambltx.html