一,三元表达式
#语法: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}
网友评论