Python之函数初识

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数的基本语法:

def 函数名(参数列表):
    函数体

实例:

#定义函数
def get_len():
    lis = [1, 2, 3, 4, 5, 6]
    count = 0
    for i in lis:
        count += 1

get_len()  #函数名()-->执行此函数

注:函数是以功能为导向,函数内部尽量不要有print()函数

 一、函数的返回值

return
  1、遇到return 此函数结束,不在向下进行
  2、return 返回值
    不写return 返回 None
    return None 返回 None
    return 单个值 返回此单个值
    return 多个值 将多个值包在元组中,返回给调用此元组
 
2.1、return 程序结束
def my_test():
    print(1111)
    return      #程序结束
    print(2222) #没有输出

my_test()
#输出结果:
1111

2.2、return 返回单个值

def get_len():
    lis = [1, 2, 3, 4, 5, 6]
    return len(lis)
ret = get_len() print(ret) #输出结果: 6

2.3、return 返回多个值

def get_values():
    return 1,2,[111,222]

ret1,ret2,ret3 = get_values()
print(ret1,ret2,ret3)
#输出结果
1 2 [111, 222]

二、函数传参

def get_sum(x):     #形参:形式参数
    count = 10 + x
    return count
ret = get_sum(10)   #实参:实际参数
print(ret)          #20

1.1、从实参的角度:

  1)、按位置传参
def mysum(x,y):
    #此时x=10,y=20
    return x + y

num = mysum(10,20)  #位置参数
print(num)          #30
  2)、按关键字传参
def mymax(x,y):
    #此时x = 20,y = 10
    the_max = x if x > y else y
    return the_max

maxN = mymax(y=10, x=20)     #关键字传参
print(maxN)                  #20
  3)、混合传参--关键字参数永远在位置参数后面
def mymax(x, y):
    #此时x = 10,y = 20
    the_max = x if x > y else y
    return the_max

maxN = mymax(10, y=20)  #10--位置参数,y=20--关键字参数
print(maxN)             #20

1.2、从形参的角度:

  1)、位置参数必须传值

def mymax(x, y):
    the_max = x if x > y else y
    return the_max

maxN = mymax()  #此处不传参数
print(maxN)     
#直接报错:
TypeError: mymax() missing 2 required positional arguments: 'x' and 'y'

  2)、默认参数(若不传递,会显示设置的默认值)

def stu_info(name, sex = "男"):
    print(name,sex)

stu_info('alex')        #alex 男
stu_info('eva','女')    #eva  女

1.3、动态传参

  动态参数,也叫不定长传参,就是你需要传给函数的参数很多,不定个数,那这种情况下,你就用*args,**kwargs接收,args是元祖形式,接收除去键值对以外的所有参数,kwargs接收的只是键值对的参数,并保存在字典中。

1)、*args-->接收不定长的所有位置参数

#args可以接收不确定个数的参数
def func(*args):
    print(args,type(args))  #(1, 2, 'alex') <class 'tuple'>
func(1,2,'alex')
#输出结果
(1, 2, 'alex') <class 'tuple'>

 

#若将*args放在最前边,它会接收全部参数,a,b就没有对应的实参了
def func(*args,a,b):
    print(a)
    print(b)
    print(args,type(args))
func(1,2,'alex',3,4)  #直接出错:func() missing 2 required keyword-only arguments: 'a' and 'b'

 

#*args放在最后,是正确的写法
def func(a,b,*args):
    print(a)
    print(b)
    print(args,type(args))
func(1,2,'alex')
#输出结果
1   2   ('alex',) <class 'tuple'>

 

#有默认参数的时候,要放在*args后边
def func(a, b, *args, sex = '男'):
    print(a)
    print(b)
    print(sex)
    print(args,type(args))
func(1,2,'alex','wusir','ritian')
#输出结果
1   2   男   ('alex', 'wusir', 'ritian') <class 'tuple'>

 

#错误实例
def func(sex='男', *args):
    print(sex)          #1 直接把sex的默认值给覆盖了
    print(args)         #(2, 'alex')
func(1,2,'alex')
#输出结果
1   (2, 'alex')

 2)、**kwargs-->接收所有的关键字参数

#接收关键字参数
def func(**kwargs):
    print(kwargs)           #{'a': 1, 'b': 4, 'c': 3}
func(a = 1, b = 4, c = 3)
#输出结果:
{'a': 1, 'b': 4, 'c': 3}

 

#位置参数、*args、默认参数、**kwargs
def func(a,*args,sex = '男', **kwargs):
    print(a)                        #1
    print(sex)                      #女
    print(args,type(args))          #('alex', 'wusir', 'ritian ') <class 'tuple'>    
    print(kwargs, type(kwargs))     #{'name': 'taibai', 'age': 21} <class 'dict'>
func(1,'alex','wusir','ritian ',sex = '女',name = 'taibai',age = 21)
#输出结果
1
女
('alex', 'wusir', 'ritian ') <class 'tuple'>
{'name': 'taibai', 'age': 21} <class 'dict'>

 

#万能参数
def func(*args, **kwargs):
    print(args)         #(1,)
    print(kwargs)       #{'name': 'alex'}
func(1,name="alex")
#输出结果
(1,)
{'name': 'alex'}

总结

#参数摆放顺序:位置参数-->*args-->默认参数-->**kwargs

3)、魔法运算:打散后操作

#*魔法运算(列表):打散-->将列表里的每一个元素打散迭代添加到元组中
#求和
def func(*args):
    print(args)         #(1, 2, 3, 4, 5)
    sumN = 0
    for i in args:
        sumN += i
    return sumN
l1 = [1,2,3]
l2 = [4,5]
sumN = func(*l1,*l2)
print(sumN)             #15

#错误实例
l1 = [1,2,3]
def func(*args):
    print(args)     #([1, 2, 3],)
func(l1)            #不加*会将整个列表作为一个元素添加到元组中

 

#魔法元素(字典)
#将多个字典的键值对合并到一个字典中
def func(**kwargs):
    print(kwargs)         #{'name1': 'alex', 'name2': 'wusir'}
    return kwargs
dic1 = {'name1':'alex'}
dic2 = {'name2':'wusir'}
func(**dic1, **dic2)
#输出结果
{'name1': 'alex', 'name2': 'wusir'}

 

posted @ 2018-01-31 15:52  lioushell  阅读(141)  评论(0编辑  收藏  举报