调用函数
abs()
max()
min()
hex() 整数转换成十六进制
数据类型转换
int()
float()
str()
bool()
定义函数
定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。
def my_abs(x):
if not isinstance(x,(int,float)):
raise TypeError('bad operand type')
if x>=0:
return x
else:
return -x
return None 可以写为return
空函数
def nop():
pass
pass语句可以用作占位符。
参数检查
isinstance()
返回多个值
import math
def move(x, y, step, angle=0):
nx = x + step *math.cos(angle)
ny = y - step *math.sin(angle)
return nx, ny
返回的实际上还是一个单一值,返回的一个tuple
函数的参数
位置参数
函数的形参
默认参数
def power(x=2):
pass
默认是2,可以不填,与默认参数不一样就填参数
默认参数必须指向不可变对象
def add_end(L=None):
if(L==None):
L=[]
L.append('END')
return L
可变参数
1.把一个list或tuple传进来
defcalc(numbers):
sum=0
for n in numbers:
sum=sum+n*n
return sum
calc([1,2,3])
2.参数前加一个* 函数内部接受到一个tuple,使用时可以传递任意数量的参数
defcalc(*numbers):
sum=0
for n in numbers:
sum=sum+n*n
return sum
calc(1,2,3)
关键字参数
可变参数允许传递0个或任意个参数,这些参数在函数内部自动组装成tuple,而关键字参数允许传递0个或任意个含参数名的参数,这些关键字参数在函数内部会自动组装成dict
def person(name, age, **kw):
print('name:', name,'age:', age, 'other:', kw)
命名关键字参数
要限制关键字参数的名字,就可以使用命名关键字。
使用一个特殊分隔符*,*后的参数被视作命名关键字参数
def person(name,age,*,city,job):
print('name:',name,'age:',age,'city:',city,'job:',job)
如果函数定义中已经有一个可变参数,后面的关键字参数就不需要一个特殊分隔符了
命名关键字参数必须要传入参数名,否则就会报错
参数组合
Python中定义函数,可以使用多种参数组合使用,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
递归函数
递归函数代替循环,但要注意防止栈溢出
def fact(n):
if(n==1):
return 1
return n*fact(n-1)
尾递归,函数返回时调用自身,并且return不能包含表达式
尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导致栈溢出。
遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化
def fact(n):
return fact_iter(n,1)
def fact_iter(num,product):
if(num==1):
return 1
return fact_iter(num-1,num*product)
汉诺塔
defmove(n,a,b,c):
if(n==1):
print(a,'-->',c)
else:
move(n-1,a,c,b)
move(1,a,b,c)
move(n-1,b,a,c)
可将B柱视作A柱到C柱的缓冲区(Buffer)
- 将A柱上的n-1个盘子通过C柱挪到B柱上
- 将A柱最下面的盘子通过B柱挪到C柱上
- 将之前的n-1盘子从B柱通过A柱挪到C柱上