(Episode 6) Functions

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

函数可以当作数据传递:
可以被引用
可以当作参数传递
返回值可以是函数
可以当作容器类型的元素
优雅的取代多分支的ifdef foo():
    print('foo')
def bar():
    print('bar')
dic={
    'foo':foo,
    'bar':bar,
}
while True:
    choice=input('>>: ').strip()
    if choice in dic:
        dic[choice]()

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324762149&siteId=291194637