1.max函数可以接收任意多个参数,并返回最大的那个
2.函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个别名:
3.在python中,定义一个函数要用def语句,依次写出函数名、括号、括号中的参数和冒号,然后在缩进块中编写函数体,函数的返回值用return语句返回,例如:
4.如果想多次利用自己定义的函数,可以把函数保存到.py文件中,可以在该文件当前目录下启动python解释器,用“from 文件名 import 函数名” 来导入相应的函数,其中文件名不含.py扩展名
5.如果想定义一个什么事也不做的空函数,可以用pass语句:
6.pass语句可以用来作为占位符,比如还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来,也可以用在其它语句中,比如if:
7.python函数可以返回多个值:
8.但是其实这只是个假象,python返回的仍然是个单一值,返回值是个tuple:
也就是说同时返回多个值时,其实返回的就是一个tuple
9.函数执行完毕也没有return语句时,自动return None
练习:
请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程:
ax2 + bx + c = 0
的两个解。
提示:计算平方根可以调用math.sqrt()函数:
>>> import math
>>> math.sqrt(2)
1.4142135623730951
提示:计算m的n次方可用m**n指令
import math
def quadratic(a,b,c):
d=b**2-4*a*c
e=math.sqrt(d)
f=-(b+e)/2*a
g=-(b-e)/(2*a)
h=-(b+e)/(2*a)
return g,h
函数的参数
1.python函数除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义除来的接口,不但能处理复杂的参数,还可以简化调用者的代码。
2.位置参数:正常定义的参数都叫位置参数,如下面代码中的x,n都是位置参数:
>>> def power(x,n):
... s=1
... while n:
... s*=x
... n-=1
... return s
3.默认参数:我们可以把第二个参数n的默认值设定为2:
def power(x,n=2):
s=1
while n:
n=n-1
s*=x
return s
这样,我们写power(5)时,默认第二个参数为2,而如果要计算其它次方,则应该明确地传入n.
4.设置默认参数时,有几点要注意:
- 必选参数在前,默认参数在后
- 如何设置默认参数,如果函数有多个参数,把变化大参数放在前面,变化小的放在后面,变化小的参数可以作为默认参数
5.默认参数可以降低函数调用的难度,只有个别例子才需要传入更多参数。比如录入学生信息这些。如果大部分学生的一些信息相同,就可以把这些信息当作默认参数,个别特殊信息的学生再另行输入特殊信息。
6.有多个默认参数时,调用的时候可以按顺序提供默认参数,也可以不按顺序提供部分默认参数,但要把参数名写上,意思是这个默认参数用传进去的值,其它默认参数继续使用默认值。
8.可变参数:
示例:
>>> def cal(*numbers):
... sum=0
... for n in numbers:
... sum+=n*n
... return sum
这样我们就可以在实际调用中随便传入参数了
9.而如果把一个已有的list或tuple内的元素变成可变参数传进去,可以直接把函数的参数写成 *list/tuple 名,如:
>>> nums=[1,2,3]
>>> cal(*nums)
14
关键字参数
1.可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,然后这些关键字在函数内部自动组装为一个dict。如:
>>> def person(name,age,**kw):
... print('name:',name, 'age:',age, 'other:',kw)
>>> person('mike',30,gender='m',job='actor')
name: mike age: 30 other: {'gender': 'm', 'job': 'actor'}
2.关键字参数有什么用?它可以扩展函数的功能。比如,在person函数里,我们保证能接收到name和age这两个参数,但是,如果调用者愿意提供更多的参数,我们也能收到。试想你正在做一个用户注册的功能,除了用户名和年龄是必填项外,其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求。
3.它和可变参数类似,也可以先组装出一个dict,然后把该dict转换为关键字参数传进去:
>>> extra={'gender':'m','job':'actor'}
>>> person('john',20)
name: john age: 20 other: {}
>>> person('john',20,**extra)
name: john age: 20 other: {'gender': 'm', 'job': 'actor'}
命名关键字参数
1.如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接受city和job作为关键字参数,定义的函数如下: ```python def person(name,age,*,city,job): print(name,age,city,job) ```
2.命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错。
3.对于任意函数,都可以通过类似func(*args,**kw)的形式调用它,无论它的参数是如何定义的。
小结
1.要注意定义可变参数和关键字参数的语法: *args是可变参数,接收的是一个tuple; **kw是关键字参数,kw接收的是一个dict。
练习
就是用python实现汉诺塔而已:
def move(n,a,b,c):
if(n==1):
print(a,'-->',c)
else:
move(n-1,a,c,b)
print(a,'-->',c)
move(n-1,b,a,c)