Fork me on GitHub

函数的定义与基本使用

1.什么是函数?

具备某一功能的工具===》函数

工具的使用:
    为了实现目的准备好的工具======》函数的定义
    遇到应用场景拿来就用====》函数的调用

2.为何要有函数

1.程序的组织结构不清晰,可读性差
2.如果要用到重复的功能,只能拷贝空难呢过的实现代码==》代码冗余
3.可扩展性差

3.如何用函数

函数的使用原则:先定义,后调用

定义函数:
    def 函数名(参数1,参数2,参数3,...):
    """文档注释"""
    代码1
    代码2
    代码3
    ...
    return 返回值

调用函数:
    函数名(值1,值2,值3,...)

4.函数的基本使用

1.定义函数:申请内存空间把函数体代码保存下来,然后把内存地址绑定给函数名->函数名=函数的内存地址

def sayhi():
    print('*'*10)
    print('hello')
    print('*'*10)

print(sayhi)

2.调用函数:函数名()->函数的内存地址(),会触发函数体代码的运行
注意:用print(函数名)的方式只能打印出函数名的内存地址
而变量名()这样的形式是不能打印出来,因为相当于内存空间的值没有变量绑定,所以无法打印。

定义函数的三种格式
2.1:无参函数
即是触发函数体代码执行时,不需要传入参数

def login():
    inp_name=input("your name: ").strip()
    inp_pwd=input("your pwd: ").strip()
    if inp_name == "egon" and inp_pwd == "123":
        print('login successful')
    else:
        print('login error')

login()

def sayhi():
    print('='*100)
    print('hello')
    print('='*100)

sayhi()

2.2:有参函数
在调用函数时传入实参,函数体的虚参接受到后,执行函数体代码

def sayhi(m,n):
    print(m*n)
    print('hello')
    print(m*n)
sayhi('A',50)

def max2(x,y):
    if x>y:
        return x
    elif x==y:
        return '大小相等'
    else:
        return y
print(max2(11,11)*12)

2.3:空函数
通常用于架构,便于思考编程逻辑

def func():
    pass

3.函数的调用
return
函数体内可以有多个return,但只要执行一次函数就立刻结束
并且把return后的值当做本次调用的结果返回

函数可以有三种形式的返回值
1.return 值:返回的就是该值本身
2.return 值1,值2,值3:返回一个元组
3.没有return:默认返回None

def max2(x,y):
    if x>y:
        return x
    elif x==y:
        return '大小相等'
    else:
        return y
print(max2(11,11)*12)

def func():
    return
print(func()) #None

def func():
    return 11,222,333
print(func())
#(11, 222, 333)

def func():
    print('from func')
print(func())
#返回None,且函数体内必须有相应代码

4 函数调用的三种格式
4.1 语句形式:单纯地调用一下函数就完了

def sayhi(s,n):
    # s = '-'
    # n = 20
    print(s*n)
    print('hello')
    print(s*n)

sayhi('*',30)

4.2 表达式形式:

def max2(x,y):
    if x > y:
        return x
    else:
        return y

res=max2(11,22) * 12
print(res)

4.3 可以把函数的调用当作值传给另外一个函数

print(max2(11,22))

总结:
函数的使用一定要分为两个阶段去看:
1.定义阶段:只检测语法,不执行代码,有逻辑错误检测不出。
2.调用阶段:执行函数体代码,执行到有逻辑错误的位置报错。语法错误则直接报错不会执行。

如果发生的是语法错误,定义阶段就会立马检测出来

def func():
    print('hello'

如果发生的不是语法错误,而是逻辑错误,只能在调用阶段检测到

def func():
    xxx   #此时这个变量名当做取值操作,没有语法错误
          #当执行时,会发现没有被定义变量的逻辑错误
func()

示范1:

def foo():
    print('from foo')


def bar():
    print('from bar')
    foo()
bar()

示范2:

def foo():
    print('from foo')
    bar()


def bar():
    print('from bar')


foo()

从上到下开始定义函数体代码后,触发了bar(),然后在执行bar函数体代码时,
触发了foo(),由于func在定义阶段已经定义了foo的函数体代码,所以被执行。

def func(name,age,salary):
    print(name)
    print(age)
    print(salary)

func('egon',age=18,salary=3.1)
func('egon',age=18,3.1)
#语法错误,位置实参必须要在关键字实参前面
func(age=18,name='egon',salary=3.1)
#位置实参可以打乱顺序,然后指名道姓的赋值给形参
func('egon',salary=3.1,age=18)

egon位置实参赋值后,后两个可以用关键字实参指名道姓的赋值
因为关键字实参可以打乱顺序赋值,所以跟位置实参的联用必须放在位置实参后面,
如果位置实参后面全是关键字实参,那么在这个局部关键字实参是可以打乱顺序赋值的

posted @ 2020-09-01 10:29  artherwan  阅读(363)  评论(0编辑  收藏  举报