函数

函数

为什么要有函数:

提高代码的可读性,避免重复代码,提高代码复用性

函数的本质:

  函数就是一个变量,保存了函数所在的内存地址

写函数的时候,要尽量以功能为导向,结果最好不要直接在函数中打印(比如len(list),我只想要长度,不需要打印输出)

def len_1(para): # 同样,函数名不能是关键字,函数名命名规则等同变量的命名规则就行了
    count = 0
    for i in para:
        count += 1
    return count  # return 终止函数,并返回一个值 (如果没有return,默认返回None  (等同return None))
a = 'dfdf'
print(len_1(a))

没有返回值:

  不写return == return None

  写1个return == return None 但是,写个return 代表终止函数

返回一个值:

  可以返回任意的数据类型。返回什么 就接受什么

  当然,我们目的是返回一个相关的参数

返回多个值:

  用一个变量接收,接收到的是一个元组

  用多个变量接收,返回值和接收返回值的变量数目要一致  

参数

形参和实参

传参数可以传任意的数据类型,并且传什么,接收什么

而站在传参数的角度上看问题:两种传参方式:

  第一种:按照位置

  第二种:按照关键字

如果两种混用,按照先传位置,后传关键字的传参顺序(一般不推荐)

def len_1(para):    # para:参数:形式参数,形参    接收参数
    if len(para) > 2:
        return True
    else:return False
a = 'ab'
len_1(a)      # a:参数:实际参数,实参     传参数、传参
print(len_1(a))

默认参数:

def replace_1(name,age = 18)
    pass
replace_1('zhou')     # 不传年龄参数,就默认18  (默认参数是18)
replace_1(‘zhou’,age = 80)      # 传年龄参数80,   age = 80 

函数默认参数魔性的用法

def lst(li = []):
    li.append(1)
    return li
a = []
print(lst(a))
print(lst(a))
print(lst(a))
print(lst(a))
#[1]
#[1, 1]
#[1, 1, 1]
#[1, 1, 1, 1]

# 类似于列表在函数外面
l = []
def lst(li = l):
    li.append(1)
    return li
a = []                    # a = []  会累加
print(lst(a))
print(lst(a))
print(lst(a))
print(lst(a))

# 实参是列表[],就正常了
def lst(li = []):
    li.append(1)
    return li
print(lst([]))     
print(lst([]))
print(lst([]))          # 每次都让新的[]添加
print(lst([]))
#[1]
#[1]
#[1]
#[1]
# so,魔性的用法:默认参数 尽量避免使用可变数据类型
View Code

函数的参数:
  形参:(定义阶段)
    位置参数
    默认参数
    动态参数
  实参:(调用阶段)
    位置传参
    关键字传参

动态参数:

def func(*args):   # 参数前面加*,这个参数就变成动态参数
    print(args)      # 如果打印,会发现 接收过来的参数是元组形式
func(1,2,3,4)
#(1,2,3,4)
# 或者:迭代添加参数,迭代参数   *变量名称
li = ‘dfdf’
func(*li)
#('d','f','d','f')   元组
---

def func(a,b,c,*args):   
    print(a,b,c)
    print(args)
    print(*args)
    
func(1,3,2,4,5,6)
#1,3,2                           #位置参数接收完后,剩下的都被*args以元组的方式接收
#(4,5,6)   元组
#4, 5, 6

如果有默认参数,那就放到*args后面

def func(a,b,c,*args):   
    print(a,b,c)
    print(*args)
    
func(1,3,2,4,5,6)
#1,3,2     #位置参数接收完后,剩下的都被*args以元组的方式接收
#(4,5,6)
-------

def func(a,b,c,*args,key = 100):   
    print(a,b,c)
    print(*args)
    print(key)    
func(1,3,2,4,5,6)
#1,3,2
#456
#100
func(1,3,2,4,5,key = 9)
#1,3,2
#4,5
#9

形参的顺序:

            位置   剩余位置    默认(关键字)        关键字(除了默认关键字,剩下的关键字)
def func(a,b,     *args,         key = '11'               **kwargs)

def func(a,b,c,*args,key = 100,**kwargs):
    print(a,b,c)       #1 3 2
    print(args)        #(4, 'a')
    print(key)          #18
    print(kwargs)   #{'m': 6, 'n': 'y'}

func(1,3,2,4,'a',key=18,m = 6,n = 'y')

万能参数:

def func(*args,**kwargs):
    print(args)
    print(kwargs)

func()

li = ‘abcd’
func(*li)            #'a','b','c','d'
dic = {'name':'kitty','age':18}
func(**dic)     #

li = 'abcd'
def func(*args):
    print(args)
func(*li)                              *变量打散
#('a', 'b', 'c', 'd')


def func(**kwargs):      #**kwargs 只接收关键字,所以调用函数时,括号不能放变量
    print(kwargs)
dic = {'name':'kitty','age':18}
func(name='kitty',age=18)    #只能是关键字参数
func(**dic)  #如果不想重新输入字典的键值对,可以用**dic,把字典打散
#字典打散:'name'='kitty','age'=18

 

posted @ 2017-10-18 12:01  静静别跑  阅读(141)  评论(0编辑  收藏  举报