Python 全栈开发:python函数基础

python函数

一、函数是什么?

定义:函数是将一组语句的集合通过一个名字(函数名)封装起来,要执行这个函数,只需要调用函数名即可。

特性:

1.减少重复代码

2.使程序变的易扩展

3.是程序变得易维护

二、函数的定义(语法)

def:定义函数的关键字

函数名:用来调用函数的(函数名的定义需具有一定描述性的含义,让人家大概能知道函数的作用是什么)

文档描述:函数的使用说明

代码块:实现功能的代码

return:函数的返回值

eg:

def 函数名(参数1,参数2......):
      
     ‘’‘
     文档描述
     ’‘’     
代码块1 代码块2 ......
return

 

计算两个数(a,b)的和

eg:

def my_sum(a,b):
    sum = a+b
    return sum

三、函数的调用

1.调用方式

res  =  函数名(实参,实参)

根据函数名找到函数的内存地址,然后执行函数体代码

eg:调用上面定义的没有my_sum(a,b) 函数

# 计算x,y 的和
x = 10
y = 20
res = my_sum(x, y)
print(res)

 

2.遵循的规则

先定义,后调用的原则

没事先定义函数直接调用,相当于在引用一个不存在的变量(报错:xxx is not define)

def foo():
    print('调用了函数 foo()')
    bar()
def bar():
    print('调用了函数 bar()')
# 调用函数
foo()


结果:
调用了函数 foo()
调用了函数 bar()

 

下面的这种调用方式:违反了先定义,后调用的原则,出现错误

def foo():
    print('调用了函数 foo()')
    bar()
# 调用函数
foo()
def bar():
    print('调用了函数 bar()')

错误:

NameError: name 'bar' is not defined

 

四、函数的返回值(return)

作用:退出函数,选择性的向调用方返回结果(即:返回值,默认返回值为 None)

返回值基本三种形式:

1.没有return,返回值 None

def func1():
    print('这个函数的返回值为None')

2.return 一个值,返回该值本身

def func2():
    print('这个函数的返回值为:你好啊')
    return '你好啊'

3.return 多个值,逗号分割,返回一个元组

def func3():
    print('这个函数的返回值为(1,2,3,5,6)')
    return 1, 2, 3, 5, 6

 

 

五、函数的参数

1.形参和实参

形参(形式参数):在函数定义时,括号内定义的参数

实参(实际参数):在调用函数时,括号内传入的参数

注意:实参与形参只有在函数调用的时候才会绑定(即讲值传入函数内),在函数调用结束后就会立刻解除绑定

2.参数类型

位置参数,关键字参数,默认参数,可变参数  

位置参数

什么是位置参数:就是根据顺序依次定义的函数

哪些是位置函数

1.位置形参:函数定义时,括号内按照位置依次定义的参数

2.位置实参:函数调用时,括号内按照位置依次传入的参数

def foo(x,y,z):
    print(x,y,z)

需要注意的是:调用函数时,位置实参要与位置形参一一对应

 

关键字参数

什么是关键字参数:在函数调用时,按照 key-value 形式定义的实参,称为关键字参数

eg:

def foo(x, y, z):
    print(x, y, z)


foo(1, 2, 3)        # 位置参数的调用方式
foo(x=1, y=2, z=3)  # 关键字参数
foo(y=2, x=1, z=3)  # 关键字参数

注意点:

通俗一点的说,就是指名道姓的给形式参数传值,即使不按照顺序定义实参,也能给形参传值

 

关键字参数与位置参数一起使用:

遵循的规则:

1.必须遵循形参的规则

2.不能为同一形参重复传值

3.位置参数必须放在关键字参数的前面

 

默认参数

什么是默认函数:在函数定义时,已经被赋值的形参,叫做默认参数

注意点:

1.在函数调用的时候,有默认值的形参,可以不给其传值

def register(name, age, sex='male'):    # sex是默认参数
    print(name, age, sex)

register('fixd', 18, )          # 默认参数 没有传值
register('mike', 20, 'female')  # 默认参数 传入一个新值

# 结果
# fixd 18 male     # 没有传值,会使用默认值     
# mike 20 female    # 传入新值,会覆盖掉默认值

2.位置形参必须在默认参数的前面

eg: 下面这种是错误

def register(sex='male',name, age, sex='male'):  #错误,在pycharmdgdsfgasdf
    print(name, age, sex), 

3.默认参数的值只在定义阶段赋值一次,也就是说默认参数的值再定义阶段就固定死了

m = 10
def foo(x, y=m):    #函数定义时,默认赋值   
    print(x, y)

m = '20'        #测试 是否会影响函数的默认值
foo(1)
foo(1, 11)

# 结果
# 1 10
# 1 11

4.默认参数的值应该设置为不可变类型

可变长参数

在实际函数调用时,我们经常会遇到,传入实参个数不确定的情况

应对这种情况,定义形参需要时用 *args,**kwargs 以用来接溢出的函数
(args 与 kwargs  是起的名字,本身没有什么特殊含义,也可以定义为其他 的名字)形参里包含*与**

*  会将溢出的位置实参全部接收,然后保存成元组的形式赋值给args

def foo(x,y,z,*args): #args=(4,5,6,7,8)
    print(x,y,z)
    print(args)

foo(1,2,3,4,5,6,7,8,)

#结果:
1 2 3
(4, 5, 6, 7, 8)

** 会将溢出的关键字实参全部接收,然后保存成字典的形式赋值给kwargs

def foo(x,y,z,**kwargs): # kwargs={'c':3,'a':1,'b':2}
    print(x,y,z)
    print(kwargs)

foo(x=1,y=2,z=3,a=1,b=2,c=3)

#结果:

1 2 3
{'a': 1, 'b': 2, 'c': 3}

 

posted @ 2018-03-26 15:45  Fixdq  阅读(247)  评论(0编辑  收藏  举报