对于我们平时所写的行数较少的代码,可以把他改写成三元表达式的形式。
x=11
y=12
if x>y:
print(x)
eles:
print(y)
可以用一行解决。
res=x if x>y else y
print(res)
即条件一元,条件成立的返回值一元,条件不成立的返回值一元。
案例一:
需求:生成一个有10个值的列表。
原写法:
list1=[]
for i in range(10):
list1.append(i)
print(list1)----->[0,1,2,3,4,5,6,7,8,9]
列表生成式写法:
list1=[i for i in range(10)]
print(list1)----->[0,1,2,3,4,5,6,7,8,9]
案例二:
需求:只把需求一里面大于5的值添加到列表里面。
原写法:
list1=[]
for i in range(10):
if i >5:
list1.append(i)
print(list1)----->[6,7,8,9]
列表生成式写法:
list1=[i for i in range(10) if i > 5]----->[6,7,8,9]
案例三:
需求:完成单个元素的修改。
names=['lxx','hxx','wxx','lll']
names1=[i+'_sb' for i in names]
print(names1)----->['lxx_sb','hxx_sb','wxx_sb','lll_sb']
案例四:
需求:把没有sb的元素拿出来。
names=['lxx_sb','hxx_sb','wxx_sb','lll_sb']
names1=[i for i in names if '_sb' not in i]
print(names1)----->['lxx','hxx','wxx','lll']
dict={
i:None for i in range(5)}
print(dict)----->{
0:None,1:None,2:None,3:None,4:None}
items=[('k1',111),('k2',222),('k3',333)]
dict={
k,v for k,v in items}
print(dict)----->{
'k1':111,'k2':222,'k3':333}
res=(i for i in range(5))
print(res)----->generator object得到了一只老母鸡,拍老母鸡才能下蛋
print(next(res))----->0
print(next(res))----->1
print(next(res))----->2
print(next(res))----->3
print(next(res))----->4
如果想计算文件里面的字数:
with open(文件路径,mode='rt',encoding='utf-8') as f:
res1=sum([len(line) for line in f]) # 把每行的字数添加到一个列表中,然后对列表元素求和
res2=sum((len(line) for line in f)) # 拿到一只老母鸡,sum执行了不断拍老母鸡的操作
res2=sum(len(line) for line in f) # 两个res2功能相同,第二个是pycharm的优化,只写一个括号就可以了
函数的递归调用:再调用一个函数的内部又调用自己,所以递归调用的本质就是一个循环的过程。
大前提:递归调用一定要在某一层结束。
递归的两个阶段:回溯(过去)和递推(回来)。
age(5)=age(4)+10
age(4)=age(3)+10
age(3)=age(2)+10
age(2)=age(1)+10
age(1)=5
def age(n):
if n==1:
return 10
n-=1
return age(n)+10
age(5)
案例:套娃取值
nums=[1,[2,[3,[4,[5,[6]]]]]]
def find_item(container):
for i in container:
if type(i) is list:
return find_item(i)
else:
print(i)
find_nums(nums)
二分法:
nums=[-3,1,3,5,7,9,11,13,15,17,19,21]
def find_num(list1,setnum):
if len(list1)==0:
print('您要找的数不在列表中')
mid_index=len(list1)//2
if list1[mid_index]>setnum:
print('猜大了')
list1=[0:mid_index]
return find_num(list1,setnum)
elif list1[mid_index]<setnum:
print('猜小了')
list1=[mid_index+1:]
return find_num(list1,setnum)
else:
print('正确!')
我们通过def定义的函数都是有名函数,而无名函数是不用def所定义的,即没有名字的函数。隐藏了return。特点:临时用一次。
lambda x,y:x+y
案例:找到薪水最高的人的名字。
salaries={
'egon':3000,
'tom':100000,
'zzz':1000
}
如果直接用max内置函数,拿出来的是按照字典key排序的最大值。
print(max([11,22,33]))----->33
print(max(salaries))----->'zzz'
但实际上max有两只手,第一只手抓产生的结果,第二只手抓排序的依据,当我们不设定key时,默认左右手抓的东西一样。
原本解决问题的方法:
def func(k):
return salaries[k]
print(max(salaries,key=func))
匿名函数解法:
print(max(salaries,key=lambda k:salaries[k]))
同理,最小值和排序也都可以通过匿名函数用一行来完成。
print(min(salaries,key=lambda k:salaries[k]))
print(sorted(salaries,key=lambda k:salaries[k])) # 由小到大
print(sorted(salaries,key=lambda k:salaries[k],reverse=True)) # 由大到小
我们之前所学的全部都是面向过程编程。一步一步走向想要实现的功能。面向过程编程的核心是过程二字,过程是解决问题的步骤,即先干什么后干什么。所以基于面向过程编程写的程序就好比于设计一条条流水线。
优点:复杂的问题流程化,进而简单化。
缺点:程序的可扩展性差。