一,三元表達(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}