(1)对函数名的理解-函数名是什么?
函数名的定义和变量的定义几乎一致,在变量的角度,函数名其实就是一个变量,具有变量的功能:可以赋值;但是作为函数名他也有特殊的功能就是加上()就会执行对应的函数,所以我们可以把函数名当做一个特殊的变量
1.1)函数的内存
#函数的内存
>>> def func(): print('python') >>> print(func) <function func at 0x038E5DB0> >>>
通过上面代码可以我们知道,函数名指向的是这个函数的内存地址,其实深一步理解可得知,与其说函数名()可以执行这个函数,不如说是函数的内存地址()才是执行这个函数的关键
1.2)函数名赋值给其他变量
#函数名可以赋值给其他变量 def func(): print('python') print(func)#打印函数地址 a=func#把函数当成一个变量复制给另一个变量 a()#函数调用func()
运行结果:
<function func at 0x013EC588>
python
总结:
通过变量的赋值,变量a,和变量func都指向的这个函数的内存地址,那么a() 当然可以执行这个函数了。
1.3)函数名可以作为容器类的元素
#eg1:变量可以当中容器类类型的元素 a=1 b='2' c='a' ll=[a,b,c] for i in ll: print(i) 运行结果: 1 2 a #eg2:函数名可当做容器类元素 def func1(): print("in func1: 嘻嘻") def func2(): print("in func2: 哈哈") def func3(): print("in func3: 咯咯") def func4(): print("in func4: 吱吱") lst = [func1, func2, func3, func4] for i in lst: i() 运行结果: in func1: 嘻嘻 in func2: 哈哈 in func3: 咯咯 in func4: 吱吱
1.4)函数名可作为函数的参数
def func1(): print('in func1') def func2(f): print('in func2') f() func2(func1)
运行结果
in func2 in func1
1.5)函数名可以作为函数的返回值
def func1(): print('in func1') def func2(f): print('in func2') return f ret = func2(func1) ret() # ret, f, func1 都是指向的func1这个函数的内存地址
运行结果:
in func2 in func1
怎样定义函数?
def 函数名():
函数体
>>> def date(): //定义函数,函数名只能包含字符串、下划线和数字且不能以数字开头 print("拿出电脑") print("开机") print('运行代码')
>>> date() //调用,只有解释器读到函数名() 时,才会执行此函数,如果没有这条指令,函数里面即使有10万行代码也是不执行的。 拿出电脑 开机 运行代码
函数的返回值:return
那么这个返回值如何设置呢?这就得用到python中的一个关键字:return
>>> def date(): print("拿出电脑") print("开机") print('运行代码') return print("ok,运行成功") >>> date() 拿出电脑 开机 运行代码 //ok,运行成功未打印 >>>
总结一下:
1.遇到return,函数结束,return下面的(函数内)的代码不会执行。
2.return 会给函数的执行者返回值。
如果return后面什么都不写,或者函数中没有return,则返回的结果是None
如果return后面写了一个值,返回给调用者这个值;return 'a' 结果:a
如果return后面写了多个结果,,返回给调用者一个tuple(元组),调用者可以直接使用元组的解构获取多个变量。eg:return 'a','b','c' 运行结果:('a','b','c')
函数参数:形参,实参:
1.形参
写在函数声明的位置的变量叫形参,形式上的一个完整.表示这个函数需要xxx
2.实参
在函数调用的时候给函数传递的值.加实参,实际执行的时候给函数传递的信息.表示给函数xxx
函数的传参就是函数将实际参数交给形式参数的过程.
>>> def date(mode): //函数定义时(参数),形参 print("拿出电脑:%s"%mode) print("开机") print('运行代码') print("ok 走起") >>> date('dell') //函数执行时(参数),实参 拿出电脑:dell 开机 运行代码 ok 走起 >>>
代码运行到date('dell')开始执行此函数同时将字符串'dell'这个数据传递给变量mode,然后执行函数中的代 码。
实参:分三种:位置参数、关键字参数、混合参数
#关键字参数与位置参数混合使用,关键字参数要位于位置参数后
def date(name, mode, sale): print("拿出电脑") print("电脑型号") print('设置筛选条件:商品: %s,型号:%s,价格:%s' %(name, mode, sale)) date('电脑',mode='dell',sale='2000',)
形参:分两种:位置参数、默认值参数
注意:必须先声明在位置参数,才能声明关键字参数
>>> def stu_info(name,age,sex='男'): print('录入学生信息') print(name,age,sex) print('录入完成') >>> stu_info('张强',18) SyntaxError: invalid character in identifier >>> stu_info('张强',18) 录入学生信息 张强 18 男 录入完成
位置参数主要是实参与形参从左至右一一对应,默认值参数,如果实参不传参,则形参使用默认参数。那么无论是位置参数,还是默认参数,函数调用时传入多少实参,我必须写等数量的形参去对应接收, 如果不这样,那么就会报错:
def eat(a,b,c,): print('我请你吃:',a,b,c) eat('蒸羊羔','蒸熊掌','蒸鹿尾儿','烧花鸭') # 报错
形参的第三个关键参数:关键字参数*args、**kwargs
(1)*args,形参会将实参所有的位置参数接收,放置在一个元组中,并将这个元组赋值给args这个形参 >>> def study(*args): print('学习内容:',args) >>> study('python','shell','mysql') 学习内容: ('python', 'shell', 'mysql') >>>(2)**kwargs,接受所有的关键字参数然后将其转换成一个字典赋值给kwargs这个形参 >>> def study(**args): print('学习内容:',args) >>> study(study1='python',study2='shell') 学习内容: {'study1': 'python', 'study2': 'shell'} >>>
*args一定要在位置参数与默认值参数中间:位置参数,*args,默认参数。
>>> def func(a,b,*args,class_name='python'): print(a,b) print(args) print(class_name) >>> func(1,2,3,4,5) 1 2 (3, 4, 5) python >>>
形参的顺序为:位置参数,*args,默认参数,**kwargs。
>>> def func(a,b,*args,sex='男',**kwargs): print(args) print(sex) print(a,b) print(kwargs) >>> func(1, 2, 3, 4, 5,name='a') (3, 4, 5) 男 1 2 {'name': 'a'} >>>
形参角度的所有形参的最终顺序为:位置参数,*args,默认参数,仅限关键字参数,**kwargs。
>>> def foo(a,b,*args,c,sex=None,**kwargs): print(a,b) //位置参数 print(args) //args参数 print(c) //默认参数 print(sex) //关键字参数 print(kwargs) //**kwargs参数 >>> foo(1,2,3,4,c=6,name='alex',sex='男') 1 2 (3, 4) 6 男 {'name': 'alex'} >>>