week3 day4函数收尾

week3 day4函数收尾

    • 一. 三元表达式
    • 二. 生成式
    • 2.1 列表生成式
    • 2.2 字典生成式
    • 2.3 生成器表达式
    • 三. 函数的递归调用
    • 四. 匿名函数
    • 五. 面向过程编程

一. 三元表达式

对于我们平时所写的行数较少的代码,可以把他改写成三元表达式的形式。

x=11
y=12
if x>y:
	print(x)
eles:
	print(y)

可以用一行解决。
res=x if x>y else y
print(res)

即条件一元,条件成立的返回值一元,条件不成立的返回值一元。

二. 生成式

2.1 列表生成式

案例一:
需求:生成一个有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']

2.2 字典生成式

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}

2.3 生成器表达式

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)) # 由大到小

五. 面向过程编程

我们之前所学的全部都是面向过程编程。一步一步走向想要实现的功能。面向过程编程的核心是过程二字,过程是解决问题的步骤,即先干什么后干什么。所以基于面向过程编程写的程序就好比于设计一条条流水线。

优点:复杂的问题流程化,进而简单化。

缺点:程序的可扩展性差。

你可能感兴趣的:(python学习,python)