1.max函数可以接收任意多个参数,并返回最大的那个



2.函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个别名:

python 廖晓峰 廖雪峰python基础教程_python 廖晓峰




3.在python中,定义一个函数要用def语句,依次写出函数名、括号、括号中的参数和冒号,然后在缩进块中编写函数体,函数的返回值用return语句返回,例如:

python 廖晓峰 廖雪峰python基础教程_可变参数_02




4.如果想多次利用自己定义的函数,可以把函数保存到.py文件中,可以在该文件当前目录下启动python解释器,用“from 文件名 import 函数名” 来导入相应的函数,其中文件名不含.py扩展名


5.如果想定义一个什么事也不做的空函数,可以用pass语句:

python 廖晓峰 廖雪峰python基础教程_可变参数_03


6.pass语句可以用来作为占位符,比如还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来,也可以用在其它语句中,比如if:

python 廖晓峰 廖雪峰python基础教程_python_04




7.python函数可以返回多个值:

python 廖晓峰 廖雪峰python基础教程_默认参数_05


python 廖晓峰 廖雪峰python基础教程_可变参数_06




8.但是其实这只是个假象,python返回的仍然是个单一值,返回值是个tuple:

python 廖晓峰 廖雪峰python基础教程_可变参数_07


也就是说同时返回多个值时,其实返回的就是一个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)