三元表達(dá)式 / 生成器

一,三元表達(dá)式

#語法:res = 條件成立時(shí)返回的值 if 條件 else 條件不成立時(shí)返回的值
#示例1:
name=input('輸入名字:')
res='beauty' if name =='zx' else 'ugly man'
print(res)
# 輸入名字:zx
# beauty

#示例2:下列場(chǎng)景用三元表達(dá)式
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:
# 算出文件最長的長度值(注意:換行符也算一個(gè)長度;print要在with open里面,不染會(huì)報(bào)錯(cuò),因?yàn)槲募呀?jīng)關(guān)閉)
 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,因?yàn)閍.txt沒有浮點(diǎn)數(shù)


#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內(nèi)容如下:

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

二,列表推導(dǎo)式:

# for循環(huán)取出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']




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


# 可以再加if判斷(不建議加多個(gè)if,列表生成器求簡(jiǎn)潔)
l=['egg'+str(i) for i in range(0,5) if i >2]
print(l)
# ['egg3', 'egg4']

三, 生成器表達(dá)式

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


#生成器表達(dá)式(只需要把推倒式的中括號(hào),變?yōu)槔ㄌ?hào))
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為結(jié)尾的
she=[name for name in names if not name.endswith('a')]
print(she)
# ['dd']




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


四,遞歸

#直接調(diào)用本身
def f1():
    print('from f1')
    f1()
f1()  #會(huì)無限循環(huán)并報(bào)錯(cuò)
# RecursionError: maximum recursion depth exceeded while calling a Python object
#原因:Python默認(rèn)遞歸調(diào)用深度為1000(即最多遞歸調(diào)用1000次),而程序在運(yùn)行過程中超過最大的遞歸深度

PS:
# 去設(shè)定該值,但仍受限于主機(jī)操作系統(tǒng)棧大小的限制
import sys
print(sys.getrecursionlimit())
# 1000 python默認(rèn)遞歸1000層



# 自定義遞歸層數(shù)
sys.setrecursionlimit(10)

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



# 間接調(diào)用本身
def f1():
    print('from f1')
    f2()

def f2():
    print('from f2')
    f1()
f1()
# 以上同樣會(huì)報(bào)錯(cuò)







遞歸越多,占內(nèi)存越大,python里沒有遞歸優(yōu)化
遞歸的使用:
1,必須有明確的結(jié)束條件
2,每進(jìn)入一次遞歸,問題遞歸要比上一次少
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判斷成立的條件時(shí),一直進(jìn)行遞歸調(diào)用
            foo(i)
        else:
            print(i,end=' ')

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

五,二分法

#二分法

#示例:從小到大排列的數(shù)字,判斷x是否在列表中
l=[1,2,10,31,200,301,311,1000] #從小到大排列的數(shù)字列表


# for循環(huán)效率會(huì)低(可能找到列表的最后一個(gè)才找到)
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]:     # 索引對(duì)應(yīng)的值
        # 往右找
        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]
# []


如果只想看結(jié)果,不看過程經(jīng)過幾次,去掉print(l),輸出結(jié)果為find it或者空(啥也沒)


六,匿名函數(shù)

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





#匿名函數(shù)
lambda x,y:x+y

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

# 匿名函數(shù)調(diào)用
print((lambda x,y:x+y)(3,4))
# 7

1)匿名函數(shù)應(yīng)用

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


# 方式一:使用"拉鏈"zip,一一對(duì)應(yīng),顛倒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) 匿名函數(shù)應(yīng)用

1, map(映射) 結(jié)合無名函數(shù)
# 對(duì)l的每個(gè)原色做平方處理
# map函數(shù)可以接收兩個(gè)參數(shù),一個(gè)是函數(shù),另外一個(gè)是可迭代對(duì)象
l=[1,2,3,4,5]
res=map(lambda x:x**2,l)

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

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




2, reduce(合并)結(jié)合無名函數(shù)(需要導(dǎo)入才能使用)
#reduce函數(shù)可以接收三個(gè)參數(shù),一個(gè)是函數(shù),第二個(gè)是可迭代對(duì)象,第三個(gè)是初始值

#沒有初始值的情況下
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(過濾)結(jié)合無名函數(shù)
l=[1,2,3,4,5]

# filter函數(shù)得到的結(jié)果仍然是迭代器
res=filter(lambda x:x>3,l)
print(list(res))
# [4, 5]


# 整除,余數(shù)(分頁)
print(divmod(10000,4))



# enumerate  取出列表的值和對(duì)應(yīng)的索引
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}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容