Day03-Python基础函数

一 数学定义的函数与python中的函数

初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因变量,y是x的函数。自变量x的取值范围叫做这个函数的定义域

例如y=2*x

python中函数定义:函数是逻辑结构化和过程化的一种编程方法。

python中函数定义方法:
 
def foo(x):
    "The function definitions"
    x+=1
    return x
     
def:定义函数的关键字
foo:函数名
():内可定义形参
"":文档描述(非必要,但是强烈建议为你的函数添加描述信息)
x+=1:泛指代码块或程序处理逻辑
return:定义返回值


调用运行:可以带参数也可以不带
函数名()

 

二.没有函数会有什么问题

1.无组织无结构,代码冗余

2.可读性差

3.无法实现统一管理,且维护成本

三.python中函数分为俩类:内置函数,自定义函数

内置函数:求和:sum()  求最大值: max()  求幂: min()  计算长度:len()

示例:

a = len([1,2,3,4])
print(a)

b = max([1,2,6,4,])
print(b)  

自定义函数

def print_start():    #def定义函数关键字   #print_start函数名
    print('*'*6)      #:冒号写子代码块
print_start()         #调用函数直接输出
def print_msg(): print('hello world')

 四.为什么要定义函数

总结使用函数的好处:

1.代码重用

2.保持一致性,易维护

3.可扩展性

函数要先定义后使用,如果没有定义而直接使用,就相当于引用了不存在的变量名

4.函数的使用包括两个阶段:定义函数阶段和使用阶段

语法:

 

#语法:
def 函数名(参数1,参数2,):
    """文档注释 代码功能,参数,结果,返回值是什么"""
    函数体
    return 返回值,

 

五.定义函数的三种形式

1.无参函数:如果函数的功能仅仅只是执行一些操作而已,就定义成无参函数,

def foo():
    print('*'*6)

2.定义有参函数:函数的功能的执行依赖于外部传入的参数,有参函数通常都有返回值

def my_max(x,y):
    res=x if x > y else y
    return res
res=my_max(1,2)  #调用函数的表达式形式

 3.空函数

# def auth():
#     """认证功能"""
#     pass
# auth()
def insert():
    """插入功能"""
    pass
def select():
    """查询功能"""
    pass
def delete():
    """删除功能"""
    pass
def update():
    """更新功能"""
    pass

三元表达式

x=10
y=2
res=x if x > y else y  #条件成立写左边,条件不成立写右边  x可以换成任意其他,换成什么返回值是什么

六.调用函数

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

def bar(name):
    print('bar===>',name)

#按照有参和无参可以将函数调用分俩种
foo() #定义时无参,调用时也无需传入参数  

bar('egon') #定义时有参,调用时也必须有参数

按照函数的调用形式和出现的位置,分三种

1.表达式形式

def my_max(x,y):
    res=x if x > y else y
    return res
res=my_max(10,20)*1000 #调用函数的表达式形式  
print(res)

2.调用语句形式

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

foo()  #调用函数的语句形式

3.把函数 调用当做另外一个函数的参数

def my_max(x,y):
    res=x if x > y else y
    return res

my_max(my_max(10,20),30)  #把函数 调用当做另外一个函数的参数

 七.函数的返回值

def foo():
    print('from foo')
    return None
res=foo()
print(res)
"""
以下三种情况返回值都为None
#没有return
return 什么都不写
return None
"""

def foo():
    print('from foo')
    x=1
    return x
res=foo()
print(res)

#return 一个值,函数调用返回的结果就是这个值


def foo():
    print('from foo')
    x=1
    return 1,[1,2,3,],(4,5),{}
res=foo()
print(res) #打印结果1,[1,2,3,],(4,5),{}

#return 值1,值2,值3,...返回结果(值1,值2,值3)

补充的内容:序列的解压和return结合使用

# 序列的解压
t = (1,2,3)
a,b,c = t
print(a)
print(b)
print(c)
# 序列的解压和return结合
def foo():
    print('from foo')
    return 1,[2,3],(4,5),{}
a,b,c,d = foo()
print(d)
# return里面有几个值就需要几个值接收

t = (1,2,3,4,5,6,7,8)
a,*_,c = t
print(a)
print(c)# 支取开头和结尾的值

 八.函数参数

#从大的角度去看,函数的参数分为两种:形参(变量名),实参(值)

#定义阶段
def foo(x,y):  #x=1,y=2
    print(x)
    print(y)

#调用阶段
foo(10,20)

补充:函数定义阶段到底干了什么事情:只检测函数体的语法,并不会执行

def bar():
    x
    if 1 >2 :
        print('===>')
详细的区分函数的参数分为五种:
1.位置参数
def foo(x,y,z):#位置形参:必须被传值的参数
    print(x,y,z)
foo(1,2,3)   #位置实参数:与形参一一对应
2.关键字参数
def foo(x,y,z):
    print(x,y,z)
foo(z=3,x=1,y=2)
#关键字需要注意的问题:
#1:关键字实参必须在位置实参后面
#foo(1,z=2,y=3)  #正常
#foo(x=1,2.z=3)  #错误

#foo(1,x=1,z=2,y3) #2:不能重复对一个形参数传值
3.默认参数
def register(name,age,sex='male'): #形参:默认参数
    print(name,age,sex)

register('asb',10,)
register('a1sb',15,)
register('a2sb',18,)
register('a3sb',39,)

register('钢蛋',20,'female')
#默认参数需要注意问题:
#1:默认参数必须跟在非默认参数后
8argsdef register(sex='male',name,age):#在定义阶段就会报错
    print(name,age,sex)
#2:了解,默认参数在定义阶段就已经赋值了,而且只在定义阶段赋值一次
a=100000
def foo(x,y=a):
    print(x,y)
a=0
foo(1)
4.可变长参数(*args **kwargs)
*args
def foo(*args): #*会把溢出的按位置定义的实参都接收,以元组的形式赋值给args
    res=0
    for i in args:
        res+=i
    return res
print(foo(1,2,2,5))

**kwargs

def foo(x,y, **kwargs): #**会把溢出的按关键字定义的实参都接收,以字典的形式赋值给kwargs
    print(x,y)
    print(kwargs)
foo(1,2,a=1,name='long',age=18)
5.命名关键字参数
def foo(name,age,*,sex,height):  #*后定义的参数为命名关键字参数,这类参数,必须被传值,而且必须以关键字实参形式去传值
    print(name,age)
    print(sex)
    print(height)
foo('long',24,height='male',sex='190')

 

posted @ 2017-07-07 13:20  人生苦短,别学py  阅读(260)  评论(0编辑  收藏  举报