#1、代码的组织结构不清晰,可读性差#2、遇到重复的功能只能重复编写实现代码,代码冗余#3、功能需要扩展时,需要找出所有实现该功能的地方修改之,无法统一管理且维护难度极大2、函数是什么
针对二中的问题,想象生活中的例子,修理工需要实现准备好工具箱里面放好锤子,扳手,钳子等工具,然后遇到锤钉子的场景,拿来锤子用就可以,而无需临时再制造一把锤子。修理工===>程序员具备某一功能的工具===>函数要想使用工具,需要事先准备好,然后拿来就用且可以重复使用要想用函数,需要先定义,再使用3、函数分类
#1、内置函数为了方便我们的开发,针对一些简单的功能,python解释器已经为我们定义好了的函数即内置函数。对于内置函数,我们可以拿来就用而无需事先定义,如len(),sum(),max()ps:我们将会在最后详细介绍常用的内置函数。#2、自定义函数很明显内置函数所能提供的功能是有限的,这就需要我们自己根据需求,事先定制好我们自己的函数来实现某种功能,以后,在遇到应用场景时,调用自定义的函数即可。例如
二定义函数
1、如何自定义函数?
#语法def函数名(参数1,参数2,参数3,...):'''注释'''函数体return返回的值#函数名要能反映其意义
defauth(user:str,password:str)->int:'''authfunction:paramuser:用户名:parampassword:密码:return:认证结果'''ifuser=='egon'andpassword=='123':return1#print(auth.__annotations__)#{'user':
函数即“变量”,“变量”必须先定义后引用。未定义而直接引用函数,就相当于在引用一个不存在的变量名#测试一deffoo():print('fromfoo')bar()foo()#报错#测试二defbar():print('frombar')deffoo():print('fromfoo')bar()foo()#正常#测试三deffoo():print('fromfoo')bar()defbar():print('frombar')foo()#会报错吗#结论:函数的使用,必须遵循原则:先定义,后调用#我们在使用函数时,一定要明确地区分定义阶段和调用阶段#定义阶段deffoo():print('fromfoo')bar()defbar():print('frombar')#调用阶段foo()3、函数在定义阶段都干了哪些事?
#只检测语法,不执行代码也就说,语法错误在函数定义阶段就会检测出来,而代码的逻辑错误只有在执行时才会知道4、定义函数的三种形式
#1、无参:应用场景仅仅只是执行一些操作,比如与用户交互,打印#2、有参:需要根据外部传进来的参数,才能执行相应的逻辑,比如统计长度,求最大值最小值#3、空函数:设计代码结构
三调用函数
1、调用函数
函数的调用:函数名加括号1先找到名字2根据名字调用代码
2、函数返回值
无return->Nonereturn1个值->返回1个值return逗号分隔多个值->元组
什么时候该有返回值?调用函数,经过一系列的操作,最后要拿到一个明确的结果,则必须要有返回值通常有参函数需要有返回值,输入参数,经过计算,得到一个最终的结果什么时候不需要有返回值?调用函数,仅仅只是执行一系列的操作,最后不需要得到什么结果,则无需有返回值通常无参函数不需要有返回值3、函数调用的三种形式
1语句形式:foo()2表达式形式:3*len('hello')3当中另外一个函数的参数:range(len('hello'))
四函数的参数
1、形参与实参
#形参即变量名,实参即变量值,函数调用时,将值绑定到变量名上,函数调用结束,解除绑定2、具体应用【重点知识!!!】
五练习题
1、写函数,,用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改操作2、写函数,计算传入字符串中【数字】、【字母】、【空格]以及【其他】的个数3、写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。4、写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。5、写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。6、写函数,检查字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。dic={"k1":"v1v1","k2":[11,22,33,44]}PS:字典中的value只能是字符串或列表
#题目一defmodify_file(filename,old,new):importoswithopen(filename,'r',encoding='utf-8')asread_f,\open('.bak.swap','w',encoding='utf-8')aswrite_f:forlineinread_f:ifoldinline:line=line.replace(old,new)write_f.write(line)os.remove(filename)os.rename('.bak.swap',filename)modify_file('/Users/jieli/PycharmProjects/爬虫/a.txt','alex','SB')#题目二defcheck_str(msg):res={'num':0,'string':0,'space':0,'other':0,}forsinmsg:ifs.isdigit():res['num']+=1elifs.isalpha():res['string']+=1elifs.isspace():res['space']+=1else:res['other']+=1returnresres=check_str('helloname:aSBpassowrd:alex3714')print(res)#题目三:略#题目四deffunc1(seq):iflen(seq)>2:seq=seq[0:2]returnseqprint(func1([1,2,3,4]))#题目五deffunc2(seq):returnseq[::2]print(func2([1,2,3,4,5,6,7]))#题目六deffunc3(dic):d={}fork,vindic.items():iflen(v)>2:d[k]=v[0:2]returndprint(func3({'k1':'abcdef','k2':[1,2,3,4],'k3':('a','b','c')}))