第三章 Python函数
函数
如果在开发程序时,需要某块代码多次,但是为了提⾼编写的效率以及代码的重⽤,所以把具有独⽴功能的代码块组织为⼀个⼩模块,这就是函数
函数的定义
函数定义的三种方式:无参函数,有参函数,空函数
#无参函数 def demo_print(): print('hello') #有参函数 def add(x,y): print(x+y) #空函数 def foo(x,y): pass
函数调用
调⽤函数很简单的,通过函数名() 即可完成调⽤:demo_print()
函数使用的原则是:先定义,再调用
函数的注释
def demo_ano(): ''' 注释 ''' print('-------')
使用help(demo_ano)可以看到函数的相关说明
函数参数
形参与实参:形参即变量名,实参即变量值,函数调用时将实参赋值给形参
def add(a,b): s=a+b return s add(1,2)
#(a,b)为形参,(1,2)为实参
位置参数:按照从左到右的顺序定义的参数
def add(num1,num2): s=num1+num2 return s add(5,6) (num1,num2)为位置形参,(5,6)为位置实参
关键字参数:按照key=value的形式定义的参数
def login(name,pwd): if name=='luoli' and pwd=='123456': print('Login Sucess') else: print('Login failed') login(pwd='123456',name='luoli')
默认参数:形参在定义时就已经为其赋值
def add(a,b=3): s=a+b print(s) add(3) add(5,10) 默认参数只在定义时赋值一次,可以传值,也可以不传值,默认参数的定义应该在位置参数的右边,默认参数通常定义成不可变类型
可变长参数:可变长指的是实参值得个数不固定,实参位置实参和关键字实参两种,针对这两种形式的可变长参数,形参有对应的两种方式来存放它们,即*args和**kwargs
*args
def foo(x,y,*args): print(x,y) print(args) foo(1,2,3,4,5) def foo(x,y,z): print(x,y,z) foo(*[1,2,3])
**kwargs:必须按照key=value的方式赋值
def foo(x,y,**kwargs): print(x,y) print(kwargs) foo(1,2,z=3,p=4,q=5) def foo(x,y,**kwargs): print(x,y) print(kwargs) foo(**{'z':1,'x':2,'y':4})
*args,**kwargs:对于任意函数,都可以通过类似func(*args, **kw)
的形式调用它,无论它的参数是如何定义的
命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递
def foo(x,y,*args,a=1,b,**kwargs): print(x,y) print(args) print(a) print(b) print(kwargs) foo(1,2,3,4,5,b=3,c=4,d=5)
函数返回值
所谓“返回值”,就是函数中程序完成后,最后给调⽤者返回的结果,如果想要使用这个结果,那么就需要保存该返回值
def add(a,b): return a+b res=add(1,2) print(res)
函数类型
无参数,无返回值
def demo_print(): print('test') demo_print()
无参数,有返回值
import time def get_time(): current_time=time.time() return current_time res=get_time() print(res)
有参数,无返回值
此类函数,能接收参数,但不可以返回数据,⼀般情况下,对某些变量设置数据⽽不需结果时,⽤此类函数
有参数,有返回值
def add(a,b): return a+b res=add(100,200) print(res)
练习
(1)写函数,,用户传入修改的文件名,与要修改的内容,执行函数,完成批量修改操作
def modify_file(source_file,old,new): import os with open(source_file,'r',encoding='utf-8') as read_f,\ open('.bak.swap','w',encoding='utf-8') as write_f: for line in read_f: if old in line: line=line.replace(old,new) write_f.write(line) os.remove(source_file) os.rename('.bak.swap',source_file)
(2)写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数
def count(charac): d={ 'num':0, 'str':0, 'space':0, 'others':0, } for i in charac: if i.isdigit(): d['num']+=1 elif i.isalpha(): d['str']+=1 elif i.isspace(): d['space']+= 1 else: d['others']+=1 return d #res=count('hello123 hh ****') #print(res)
(3)写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5
def my_len(model): i=len(model) if i > 5: print('%s长度大于5'%model) else: print('%s长度小于5'%model) # my_len([1,2,3,4,5,6]) # my_len('sdf')
(4)写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者
def li_len(li): if len(li)>2: li=li[0:2] return li res=li_len([1,2,3,4]) print(res)
(5)写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者
def mod_odd(mod): mod=mod[::2] return mod res=mod_odd([1,2,3,4,5]) print(res)
(6)写函数,检查字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者
def di_len(di): for k,v in di.items(): if len(v) > 2: di[k]=v[0:2] return di dic = {"k1": "v1v1", "k2": [11,22,33,44]} res=di_len(dic) print(res)