Function Basics
Function advantage
#1、代码的组织结构不清晰,可读性差
#2、遇到重复的功能只能重复编写实现代码,代码冗余
#3、功能需要扩展时,需要找出所有实现该功能的地方修改之,无法统一管理且维护难度极大
function classification
Built-in functions: No need to define in advance, can be used directly. Such as len(), sum(), max().
Custom function: According to the requirements, it can be customized in advance to achieve a certain function.
define function
#语法
def 函数名(参数1,参数2,参数3,...):
'''注释'''
函数体
return 返回的值
#函数名要能反映其意义
The principle of function use: define first, then call
#测试一
def foo():
print('from foo')
bar()
foo() #报错
#测试二
def bar():
print('from bar')
def foo():
print('from foo')
bar()
foo() #正常
Three forms of defining functions
#1、无参:应用场景仅仅只是执行一些操作,比如与用户交互,打印
#2、有参:需要根据外部传进来的参数,才能执行相应的逻辑,比如统计长度,求最大值最小值
#3、空函数:设计代码结构
#定义阶段
def tell_tag(tag,n): #有参数
print(tag*n)
def tell_msg(): #无参数
print('hello world')
#调用阶段
tell_tag('*',12)
tell_msg()
tell_tag('*',12)
empty function
def auth(user,password):
'''
auth function
:param user: 用户名
:param password: 密码
:return: 认证结果
'''
pass
Call functions
- Call functions
函数名加括号
1 先找到名字
2 根据名字调用代码
- function return value
无return->None
return 1个值->返回1个值
return 逗号分隔多个值->元组
通常有参函数需要有返回值。
通常无参函数不需要有返回值。
- There are three forms of function calls:
1 语句形式:foo()
2 表达式形式:3*len('hello')
3 当中另外一个函数的参数:range(len('hello'))
- Function parameters (formal and actual parameters)
#形参即变量名,实参即变量值,函数调用时,将值绑定到变量名上,函数调用结束,解除绑定。
位置参数:按照从左到右的顺序定义的参数。
关键字参数:按照key=value的形式定义的实参:
无需按照位置为形参传值
1. 关键字实参必须在位置实参右面
2. 对同一个形参不能重复传值
默认参数:形参在定义时就已经为其赋值。
可以传值也可以不传值:
1. 只在定义时赋值一次
2. 默认参数的定义应该在位置形参右面
3. 默认参数通常应该定义成不可变类型
可变长参数:可变长指的是实参值的个数不固定:分别是*args(位置参数),**kwargs(关键字参数)
#5、命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递,可以保证,传入的参数中一定包含某些关键字:
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}
function object + scope + decorator
function object
函数可以当作数据传递:
可以被引用
可以当作参数传递
返回值可以是函数
可以当作容器类型的元素
优雅的取代多分支的if:
def foo():
print('foo')
def bar():
print('bar')
dic={
'foo':foo,
'bar':bar,
}
while True:
choice=input('>>: ').strip()
if choice in dic:
dic[choice]()