1.函数分类
(1)内置函数:python解释器已经定义好的函数,如len(),sum()等等
(2)自定义函数:根据自己的需求来定义的函数,在有需要的应用场景时可调用,定义函数语法为:
def 函数名(参数1,参数2,参数3......)
'''注释'''
函数体
return 返回值
注:函数名要能反映其意义
2.函数的使用原则:先定义,再调用,函数定义阶段可以检测语法错误,但是代码的逻辑错误只有在执行的时候才会知道
eg:
def foo():
print('from foo')
bar()
foo()
File "C:/Users/18811/PycharmProjects/19期作业/day3/exercise.py", line 3, in foo
bar()
NameError: name 'bar' is not defined
def bar():
print('from bar')
def foo():
print('from foo')
bar() foo()
from foo
from bar
3.定义函数的三种形式:
(1)无参函数:应用场景仅是执行一些操作,比如用户交互,打印等
(2)有参函数:需要根据外部传进来的参数才能执行相应的逻辑,不如统计长度,求最大值和最小值
(3)空函数:设计代码结构(pass)
4.调用函数:函数名(),
(1)先找到名字
(2)根据名字调用代码
5.函数返回值
(1)无,return None
(2)return 一个值,返回一个值
(3)return 逗号分隔多个值,返回元祖
6.函数调用的三种形式
(1)语句形式:foo()
(2)表达式形式:3*len()
(3)当作个函数的参数:range(len('hello'))
7.函数的参数
(1)形参与实参:形参即变量名,实参即变量值,函数调用时,将值绑定到变量名上,函数调用结束,解除绑定
(2)形参与实参具体应用:
#1.位置参数:按照从左到右的顺序定义的参数
位置形参:必选参数
位置实参:按照位置给形参传值
#2.关键字参数:按照Key=value的形式定义的实参,无需按照位置给形参传值
注:(1)关键字参数必须在位置参数的右面
(2)对同一个形参不能重复传值
#3.默认参数:形参在定义时就已经为其赋值,可以传值也可以不传值,通常,变化较大的参数定义成位置形参,变化较小的参数定义成默认参数
注:(1)只在定义时赋值一次
(2)默认参数的定义应该在位置形参右面
(3)默认参数通常应该定义成不可变类型
#4.可变长参数:实参值的个数不固定,而实参有按位置和按关键字两种定义形式,针对这两种形式的可变长参数,
形参对应有两种解决方案来完整的存放他们,分别时*args和**kwargs
# def foo(x,y,*args):
# print(x,y)
# print(args)
# # foo(1,2,3,4,5)
# 1 2
# (3, 4, 5)
# def foo(x,y,*args):
# print(x,y)
# print(args)
# foo(1,2,*[3,4,5])
# 1 2 # (3, 4, 5)
# def foo(x,y,z):
# print(x,y,z)
# foo(*[1,2,3])
# 1 2 3
# def foo(x,y,**kwargs):
# print(x,y)
# print(kwargs)
# # foo(1,y=2,a=1,b=2,c=3)
# 1 2
# {'a': 1, 'b': 2, 'c': 3}
# def foo(x,y,**kwargs):
# print(x,y)
# print(kwargs)
# foo(1,y=2,**{'a':1,'b':2,'c':3})
# 1 2
# {'a': 1, 'b': 2, 'c': 3}
# def foo(x,y,**kwargs):
# print(x,y)
# print(kwargs)
#命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参传递
可以保证,传入的参数中一定包含某些关键字
# 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)
1 2
(3, 4, 5)
1
3
{'c': 4, 'd': 5}
练习:
#练习1,写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改操作
# def modify_file(filename,old,new):
#
# import shutil
# import os
# with open(filename,'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(filename)
# os.rename('.bak.swap',filename)
# modify_file('aaa','crazy','excited')
#练习2:写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数
# def count(msg):
# res={'num':0,'string':0,'space':0,'other':0}
# for s in msg:
# if s.isdigit():
# res['num']+=1
# elif s.isalpha():
# res['string']+=1
# elif s.isspace():
# res['space']+=1
# else:
# res['other']+=1
# return res
# print(count('crazy 1 2 3 4 2 5是的###'))
# {'num': 6, 'string': 7, 'space': 7, 'other': 3}
#练习3:写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5
# def judge(msg):
# for s in msg:
# if len(msg[s])>5:
# print('%s is long,'%s)
# else:
# print('%s is short,'%s)
# # print(judge({'S': 'This is a bug', 'list': [1, 2, 'you', 'me'], 'tuple': (1, 2, 3, 4, 5, 'she')}))
# S is long,
# list is short,
# tuple is long,
# None
#练习4:写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者
# def check_l(list):
# if len(list)>2:
# list=list[0:2]
# return list
# print(check_l([1,2,3,4,5,6,7]))
# print(check_l([1]))
# [1, 2]
# [1]
浙公网安备 33010602011771号