函数

一、函数的定义与调用

定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":"。

   def 是固定的,不能变,必须是连续的def三个字母,不能分开

   空格 为了将def关键字和函数名分开,必须空(四声),当然你可以空2格、3格或者你想空多少都行,但正常人还是空1格。

   函数名:函数名只能包含字符串、下划线和数字且不能以数字开头。虽然函数名可以随便起,但我们给函数起名字还是要尽量简短,并能表达函数功能

   括号:是必须加的,先别问为啥要有括号,总之加上括号就对了!

注释:每一个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行。以增强代码的可读性。

调用:就是 函数名() 要记得加上括号

二、函数的返回值

def 函数():
    return

ret = 函数()
print(ret)

没有返回值:
不写return == return None
只写一个return == return None
return的作用:1.返回一个值2.终止一个函数的继续

返回一个值:

可以返回任意的数据类型,返回什么就接收什么

返回多个值:
用一个变量接收返回值,接收到的是一个元组
返回值用多个变量接收,那么返回值的个数应该和接收变量的个数完全一致

三、函数的参数

def my_len(lst):  # 参数:接收参数,形式参数,形参
    count = 0
    for i in lst:
        count += 1
    return count


len_count = my_len([1,2,3])  # 参数:传参数/传参,实际参数,实参
print(len_count)

写一个函数,接收参数一个列表或者字符串
如果这个列表或者字符串的长度大于2就返回True否则返回False

def foo(x):
    if len(x) > 2:
        return True
    else:
        return False
print(foo([1,2,3]))

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

站在传参数的角度上看问题:一共有两种传参的方式
第一种:按照位置传参数
第二种:按照关键字传参数

def f(para):
    print(para)
f(1)

传多个参数:多个参数分别可以使用任意数据类型

def f2(arg1,arg2):  # 站在接收、形参的角度上:位置参数
    print(arg1)
    print(arg2)
f2(arg2=1,arg1='abc')  # 按照关键字传参数
f2('abc',arg2=[1,2])

按照关键字传参数和按照位置传参数是可以混用的
但是,首先传按位置的,再传按关键字的
按照位置传完该接收的参数只能接收一个值,不接收或者重复接收都不行

 

形参
位置参数
数量必须与实参数量一致 ==> 必须传的参数

def classmate(name,sex=''):
    print('姓名:%s,性别:%s' %(name,sex))
classmate('尤悦')
classmate('曹超')
classmate('张建超')
classmate('晓梅','')

默认参数:
默认参数是可以不传的参数
在不传参数的情况下可以使用默认的值
如果传了,就会使用传的值

魔性的用法:默认参数尽量避免使用可变数据类型

def func(l = []):
    l.append(1)
    print(l)
func()  # [1]
func()  # [1,1]
func()  # [1,1,1]

 动态参数

*args:接收所有按照位置传的参数,接收到的是参数组成的元组
**kwargs:接收所有按照关键字传的参数,接收到的是参数组成的字典

所有的参数的顺序:位置参数,*args,默认参数,**kwargs

def func(a,b,c,*args,key = 'key'):  # 在参数前面加个*,这个参数就变成动态参数了
    print(a,b,c)
    print(key)
    print(args)  # 使用时,所有接收过来的参数都被组织成一个元组的形式
func(2,4,4,5,'abc',[1,3],key='qqxing')

def func(a,*args,key='qqxing',**kwargs):
    print('a:',a)
    print('args:',args)
    print('key:',key)
    print('kwargs:',kwargs)
# func(5)
func(5,6,7,key='xiaoxiaosu',b='hahaha',c='hehehe')

def my_sum(*args):
    sum_2 = 0
    for i in args:
        sum_2 += i
    return sum_2
print(my_sum(1,2,3,2))

魔性的用法

在调用函数的时候,可以打散:*l、**dic

def func(*args):
    print(args)  # (1, 2, 3)
l = [1,2,3]
func(*l)  # 按顺序打散
def func(**kwargs):
    print(kwargs)  # {'b': 2, 'a': 1}
dic = {'a':1,'b':2}
func(**dic)
在调用函数的时候,可以打散:*l、**dic

 四、函数的名字

第一类对象的概念:
函数名可以赋值
可以作为一个数据结构的元素
可以作为一个函数的参数
可以作为一个函数的返回值

def func():
    print('in func')
    return 10
def func2():
    print('in func2')
    return 20
print(func)
f = func
print(f)
f()
l = [func,func2]
for i in l:
    i()

def func():
    print('in func')
    return 10
def func2(arg):
    print(arg)
    return arg
func2(func)
f = func2(func)
print(f)
f()

 

posted on 2017-10-31 15:05  杨小天  阅读(106)  评论(0编辑  收藏  举报